499 lines
16 KiB
Markdown
499 lines
16 KiB
Markdown
|
|
<gsd-version v="1.12.4" />
|
||
|
|
|
||
|
|
<gsd-arguments>
|
||
|
|
<settings><keep-extra-args /></settings>
|
||
|
|
</gsd-arguments>
|
||
|
|
|
||
|
|
<gsd-execute>
|
||
|
|
<shell command="pi-gsd-tools">
|
||
|
|
<args>
|
||
|
|
<arg string="scan-sessions" />
|
||
|
|
<arg string="--json" />
|
||
|
|
</args>
|
||
|
|
<outs>
|
||
|
|
<suppress-errors />
|
||
|
|
<out type="string" name="scan-result" />
|
||
|
|
</outs>
|
||
|
|
</shell>
|
||
|
|
<shell command="pi-gsd-tools">
|
||
|
|
<args>
|
||
|
|
<arg string="profile-sample" />
|
||
|
|
<arg string="--json" />
|
||
|
|
</args>
|
||
|
|
<outs>
|
||
|
|
<suppress-errors />
|
||
|
|
<out type="string" name="sample-result" />
|
||
|
|
</outs>
|
||
|
|
</shell>
|
||
|
|
<shell command="pi-gsd-tools">
|
||
|
|
<args>
|
||
|
|
<arg string="state" />
|
||
|
|
<arg string="json" />
|
||
|
|
<arg string="--raw" />
|
||
|
|
</args>
|
||
|
|
<outs>
|
||
|
|
<suppress-errors />
|
||
|
|
<out type="string" name="state" />
|
||
|
|
</outs>
|
||
|
|
</shell>
|
||
|
|
</gsd-execute>
|
||
|
|
|
||
|
|
## Context (pre-injected)
|
||
|
|
|
||
|
|
**Scan Result:**
|
||
|
|
<gsd-paste name="scan-result" />
|
||
|
|
|
||
|
|
**State:**
|
||
|
|
<gsd-paste name="state" />
|
||
|
|
|
||
|
|
<purpose>
|
||
|
|
Orchestrate the full developer profiling flow: consent, session analysis (or questionnaire fallback), profile generation, result display, and artifact creation.
|
||
|
|
|
||
|
|
This workflow wires Phase 1 (session pipeline) and Phase 2 (profiling engine) into a cohesive user-facing experience. All heavy lifting is done by existing pi-gsd-tools subcommands and the gsd-user-profiler agent -- this workflow orchestrates the sequence, handles branching, and provides the UX.
|
||
|
|
</purpose>
|
||
|
|
|
||
|
|
<required_reading>
|
||
|
|
Read all files referenced by the invoking prompt's execution_context before starting.
|
||
|
|
|
||
|
|
Key references:
|
||
|
|
- @.pi/gsd/references/ui-brand.md (display patterns)
|
||
|
|
- @.pi/gsd/agents/gsd-user-profiler.md (profiler agent definition)
|
||
|
|
- @.pi/gsd/references/user-profiling.md (profiling reference doc)
|
||
|
|
</required_reading>
|
||
|
|
|
||
|
|
<process>
|
||
|
|
|
||
|
|
## 1. Initialize
|
||
|
|
|
||
|
|
Parse flags from $ARGUMENTS:
|
||
|
|
- Detect `--questionnaire` flag (skip session analysis, questionnaire-only)
|
||
|
|
- Detect `--refresh` flag (rebuild profile even when one exists)
|
||
|
|
|
||
|
|
Check for existing profile:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
PROFILE_PATH=".pi/gsd/USER-PROFILE.md"
|
||
|
|
[ -f "$PROFILE_PATH" ] && echo "EXISTS" || echo "NOT_FOUND"
|
||
|
|
```
|
||
|
|
|
||
|
|
**If profile exists AND --refresh NOT set AND --questionnaire NOT set:**
|
||
|
|
|
||
|
|
Use AskUserQuestion:
|
||
|
|
- header: "Existing Profile"
|
||
|
|
- question: "You already have a profile. What would you like to do?"
|
||
|
|
- options:
|
||
|
|
- "View it" -- Display summary card from existing profile data, then exit
|
||
|
|
- "Refresh it" -- Continue with --refresh behavior
|
||
|
|
- "Cancel" -- Exit workflow
|
||
|
|
|
||
|
|
If "View it": Read USER-PROFILE.md, display its content formatted as a summary card, then exit.
|
||
|
|
If "Refresh it": Set --refresh behavior and continue.
|
||
|
|
If "Cancel": Display "No changes made." and exit.
|
||
|
|
|
||
|
|
**If profile exists AND --refresh IS set:**
|
||
|
|
|
||
|
|
Backup existing profile:
|
||
|
|
```bash
|
||
|
|
cp ".pi/gsd/USER-PROFILE.md" ".pi/gsd/USER-PROFILE.backup.md"
|
||
|
|
```
|
||
|
|
|
||
|
|
Display: "Re-analyzing your sessions to update your profile."
|
||
|
|
Continue to step 2.
|
||
|
|
|
||
|
|
**If no profile exists:** Continue to step 2.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 2. Consent Gate (ACTV-06)
|
||
|
|
|
||
|
|
**Skip if** `--questionnaire` flag is set (no JSONL reading occurs -- jump directly to step 4b).
|
||
|
|
|
||
|
|
Display consent screen:
|
||
|
|
|
||
|
|
```
|
||
|
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
|
|
GSD > PROFILE YOUR CODING STYLE
|
||
|
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
|
|
|
||
|
|
the agent starts every conversation generic. A profile teaches the agent
|
||
|
|
how YOU actually work -- not how you think you work.
|
||
|
|
|
||
|
|
## What We'll Analyze
|
||
|
|
|
||
|
|
Your recent Claude Code sessions, looking for patterns in these
|
||
|
|
8 behavioral dimensions:
|
||
|
|
|
||
|
|
| Dimension | What It Measures |
|
||
|
|
|----------------------|---------------------------------------------|
|
||
|
|
| Communication Style | How you phrase requests (terse vs. detailed) |
|
||
|
|
| Decision Speed | How you choose between options |
|
||
|
|
| Explanation Depth | How much explanation you want with code |
|
||
|
|
| Debugging Approach | How you tackle errors and bugs |
|
||
|
|
| UX Philosophy | How much you care about design vs. function |
|
||
|
|
| Vendor Philosophy | How you evaluate libraries and tools |
|
||
|
|
| Frustration Triggers | What makes you correct the agent |
|
||
|
|
| Learning Style | How you prefer to learn new things |
|
||
|
|
|
||
|
|
## Data Handling
|
||
|
|
|
||
|
|
✓ Reads session files locally (read-only, nothing modified)
|
||
|
|
✓ Analyzes message patterns (not content meaning)
|
||
|
|
✓ Stores profile at .pi/gsd/USER-PROFILE.md
|
||
|
|
✗ Nothing is sent to external services
|
||
|
|
✗ Sensitive content (API keys, passwords) is automatically excluded
|
||
|
|
```
|
||
|
|
|
||
|
|
**If --refresh path:**
|
||
|
|
Show abbreviated consent instead:
|
||
|
|
|
||
|
|
```
|
||
|
|
Re-analyzing your sessions to update your profile.
|
||
|
|
Your existing profile has been backed up to USER-PROFILE.backup.md.
|
||
|
|
```
|
||
|
|
|
||
|
|
Use AskUserQuestion:
|
||
|
|
- header: "Refresh"
|
||
|
|
- question: "Continue with profile refresh?"
|
||
|
|
- options:
|
||
|
|
- "Continue" -- Proceed to step 3
|
||
|
|
- "Cancel" -- Exit workflow
|
||
|
|
|
||
|
|
**If default (no --refresh) path:**
|
||
|
|
|
||
|
|
Use AskUserQuestion:
|
||
|
|
- header: "Ready?"
|
||
|
|
- question: "Ready to analyze your sessions?"
|
||
|
|
- options:
|
||
|
|
- "Let's go" -- Proceed to step 3 (session analysis)
|
||
|
|
- "Use questionnaire instead" -- Jump to step 4b (questionnaire path)
|
||
|
|
- "Not now" -- Display "No worries. Run /gsd-profile-user when ready." and exit
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 3. Session Scan
|
||
|
|
|
||
|
|
Display: "◆ Scanning sessions..."
|
||
|
|
|
||
|
|
Run session scan:
|
||
|
|
```bash
|
||
|
|
SCAN_RESULT=$(pi-gsd-tools scan-sessions --json 2>/dev/null)
|
||
|
|
```
|
||
|
|
|
||
|
|
Parse the JSON output to get session count and project count.
|
||
|
|
|
||
|
|
Display: "✓ Found N sessions across M projects"
|
||
|
|
|
||
|
|
**Determine data sufficiency:**
|
||
|
|
- Count total messages available from the scan result (sum sessions across projects)
|
||
|
|
- If 0 sessions found: Display "No sessions found. Switching to questionnaire." and jump to step 4b
|
||
|
|
- If sessions found: Continue to step 4a
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 4a. Session Analysis Path
|
||
|
|
|
||
|
|
Display: "◆ Sampling messages..."
|
||
|
|
|
||
|
|
Run profile sampling:
|
||
|
|
```bash
|
||
|
|
SAMPLE_RESULT=$(pi-gsd-tools profile-sample --json 2>/dev/null)
|
||
|
|
```
|
||
|
|
|
||
|
|
Parse the JSON output to get the temp directory path and message count.
|
||
|
|
|
||
|
|
Display: "✓ Sampled N messages from M projects"
|
||
|
|
|
||
|
|
Display: "◆ Analyzing patterns..."
|
||
|
|
|
||
|
|
**Spawn gsd-user-profiler agent using Task tool:**
|
||
|
|
|
||
|
|
Use the Task tool to spawn the `gsd-user-profiler` agent. Provide it with:
|
||
|
|
- The sampled JSONL file path from profile-sample output
|
||
|
|
- The user-profiling reference doc at `.pi/gsd/references/user-profiling.md`
|
||
|
|
|
||
|
|
The agent prompt should follow this structure:
|
||
|
|
```
|
||
|
|
Read the profiling reference document and the sampled session messages, then analyze the developer's behavioral patterns across all 8 dimensions.
|
||
|
|
|
||
|
|
Reference: @.pi/gsd/references/user-profiling.md
|
||
|
|
Session data: @{temp_dir}/profile-sample.jsonl
|
||
|
|
|
||
|
|
Analyze these messages and return your analysis in the <analysis> JSON format specified in the reference document.
|
||
|
|
```
|
||
|
|
|
||
|
|
**Parse the agent's output:**
|
||
|
|
- Extract the `<analysis>` JSON block from the agent's response
|
||
|
|
- Save analysis JSON to a temp file (in the same temp directory created by profile-sample)
|
||
|
|
|
||
|
|
```bash
|
||
|
|
ANALYSIS_PATH="{temp_dir}/analysis.json"
|
||
|
|
```
|
||
|
|
|
||
|
|
Write the analysis JSON to `$ANALYSIS_PATH`.
|
||
|
|
|
||
|
|
Display: "✓ Analysis complete (N dimensions scored)"
|
||
|
|
|
||
|
|
**Check for thin data:**
|
||
|
|
- Read the analysis JSON and check the total message count
|
||
|
|
- If < 50 messages were analyzed: Note that a questionnaire supplement could improve accuracy. Display: "Note: Limited session data (N messages). Results may have lower confidence."
|
||
|
|
|
||
|
|
Continue to step 5.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 4b. Questionnaire Path
|
||
|
|
|
||
|
|
Display: "Using questionnaire to build your profile."
|
||
|
|
|
||
|
|
**Get questions:**
|
||
|
|
```bash
|
||
|
|
QUESTIONS=$(pi-gsd-tools profile-questionnaire --json 2>/dev/null)
|
||
|
|
```
|
||
|
|
|
||
|
|
Parse the questions JSON. It contains 8 questions, one per dimension.
|
||
|
|
|
||
|
|
**Present each question to the user via AskUserQuestion:**
|
||
|
|
|
||
|
|
For each question in the questions array:
|
||
|
|
- header: The dimension name (e.g., "Communication Style")
|
||
|
|
- question: The question text
|
||
|
|
- options: The answer options from the question definition
|
||
|
|
|
||
|
|
Collect all answers into an answers JSON object mapping dimension keys to selected answer values.
|
||
|
|
|
||
|
|
**Save answers to temp file:**
|
||
|
|
```bash
|
||
|
|
ANSWERS_PATH=$(mktemp /tmp/gsd-profile-answers-XXXXXX.json)
|
||
|
|
```
|
||
|
|
|
||
|
|
Write the answers JSON to `$ANSWERS_PATH`.
|
||
|
|
|
||
|
|
**Convert answers to analysis:**
|
||
|
|
```bash
|
||
|
|
ANALYSIS_RESULT=$(pi-gsd-tools profile-questionnaire --answers "$ANSWERS_PATH" --json 2>/dev/null)
|
||
|
|
```
|
||
|
|
|
||
|
|
Parse the analysis JSON from the result.
|
||
|
|
|
||
|
|
Save analysis JSON to a temp file:
|
||
|
|
```bash
|
||
|
|
ANALYSIS_PATH=$(mktemp /tmp/gsd-profile-analysis-XXXXXX.json)
|
||
|
|
```
|
||
|
|
|
||
|
|
Write the analysis JSON to `$ANALYSIS_PATH`.
|
||
|
|
|
||
|
|
Continue to step 5 (skip split resolution since questionnaire handles ambiguity internally).
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 5. Split Resolution
|
||
|
|
|
||
|
|
**Skip if** questionnaire-only path (splits already handled internally).
|
||
|
|
|
||
|
|
Read the analysis JSON from `$ANALYSIS_PATH`.
|
||
|
|
|
||
|
|
Check each dimension for `cross_project_consistent: false`.
|
||
|
|
|
||
|
|
**For each split detected:**
|
||
|
|
|
||
|
|
Use AskUserQuestion:
|
||
|
|
- header: The dimension name (e.g., "Communication Style")
|
||
|
|
- question: "Your sessions show different patterns:" followed by the split context (e.g., "CLI/backend projects -> terse-direct, Frontend/UI projects -> detailed-structured")
|
||
|
|
- options:
|
||
|
|
- Rating option A (e.g., "terse-direct")
|
||
|
|
- Rating option B (e.g., "detailed-structured")
|
||
|
|
- "Context-dependent (keep both)"
|
||
|
|
|
||
|
|
**If user picks a specific rating:** Update the dimension's `rating` field in the analysis JSON to the selected value.
|
||
|
|
|
||
|
|
**If user picks "Context-dependent":** Keep the dominant rating in the `rating` field. Add a `context_note` to the dimension's summary describing the split (e.g., "Context-dependent: terse in CLI projects, detailed in frontend projects").
|
||
|
|
|
||
|
|
Write updated analysis JSON back to `$ANALYSIS_PATH`.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 6. Profile Write
|
||
|
|
|
||
|
|
Display: "◆ Writing profile..."
|
||
|
|
|
||
|
|
```bash
|
||
|
|
pi-gsd-tools write-profile --input "$ANALYSIS_PATH" --json 2>/dev/null
|
||
|
|
```
|
||
|
|
|
||
|
|
Display: "✓ Profile written to .pi/gsd/USER-PROFILE.md"
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 7. Result Display
|
||
|
|
|
||
|
|
Read the analysis JSON from `$ANALYSIS_PATH` to build the display.
|
||
|
|
|
||
|
|
**Show report card table:**
|
||
|
|
|
||
|
|
```
|
||
|
|
## Your Profile
|
||
|
|
|
||
|
|
| Dimension | Rating | Confidence |
|
||
|
|
|----------------------|----------------------|------------|
|
||
|
|
| Communication Style | detailed-structured | HIGH |
|
||
|
|
| Decision Speed | deliberate-informed | MEDIUM |
|
||
|
|
| Explanation Depth | concise | HIGH |
|
||
|
|
| Debugging Approach | hypothesis-driven | MEDIUM |
|
||
|
|
| UX Philosophy | pragmatic | LOW |
|
||
|
|
| Vendor Philosophy | thorough-evaluator | HIGH |
|
||
|
|
| Frustration Triggers | scope-creep | MEDIUM |
|
||
|
|
| Learning Style | self-directed | HIGH |
|
||
|
|
```
|
||
|
|
|
||
|
|
(Populate with actual values from the analysis JSON.)
|
||
|
|
|
||
|
|
**Show highlight reel:**
|
||
|
|
|
||
|
|
Pick 3-4 dimensions with the highest confidence and most evidence signals. Format as:
|
||
|
|
|
||
|
|
```
|
||
|
|
## Highlights
|
||
|
|
|
||
|
|
- **Communication (HIGH):** You consistently provide structured context with
|
||
|
|
headers and problem statements before making requests
|
||
|
|
- **Vendor Choices (HIGH):** You research alternatives thoroughly -- comparing
|
||
|
|
docs, GitHub activity, and bundle sizes before committing
|
||
|
|
- **Frustrations (MEDIUM):** You correct the agent most often for doing things
|
||
|
|
you didn't ask for -- scope creep is your primary trigger
|
||
|
|
```
|
||
|
|
|
||
|
|
Build highlights from the `evidence` array and `summary` fields in the analysis JSON. Use the most compelling evidence quotes. Format each as "You tend to..." or "You consistently..." with evidence attribution.
|
||
|
|
|
||
|
|
**Offer full profile view:**
|
||
|
|
|
||
|
|
Use AskUserQuestion:
|
||
|
|
- header: "Profile"
|
||
|
|
- question: "Want to see the full profile?"
|
||
|
|
- options:
|
||
|
|
- "Yes" -- Read and display the full USER-PROFILE.md content, then continue to step 8
|
||
|
|
- "Continue to artifacts" -- Proceed directly to step 8
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 8. Artifact Selection (ACTV-05)
|
||
|
|
|
||
|
|
Use AskUserQuestion with multiSelect:
|
||
|
|
- header: "Artifacts"
|
||
|
|
- question: "Which artifacts should I generate?"
|
||
|
|
- options (ALL pre-selected by default):
|
||
|
|
- "/gsd-dev-preferences command file" -- "Load your preferences in any session"
|
||
|
|
- "GEMINI.md profile section" -- "Add profile to this project's GEMINI.md"
|
||
|
|
- "Global GEMINI.md" -- "Add profile to .agent/GEMINI.md for all projects"
|
||
|
|
|
||
|
|
**If no artifacts selected:** Display "No artifacts generated. Your profile is saved at .pi/gsd/USER-PROFILE.md" and jump to step 10.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 9. Artifact Generation
|
||
|
|
|
||
|
|
Generate selected artifacts sequentially (file I/O is fast, no benefit from parallel agents):
|
||
|
|
|
||
|
|
**For /gsd-dev-preferences (if selected):**
|
||
|
|
|
||
|
|
```bash
|
||
|
|
pi-gsd-tools generate-dev-preferences --analysis "$ANALYSIS_PATH" --json 2>/dev/null
|
||
|
|
```
|
||
|
|
|
||
|
|
Display: "✓ Generated /gsd-dev-preferences at .agent/commands/gsd/dev-preferences.md"
|
||
|
|
|
||
|
|
**For GEMINI.md profile section (if selected):**
|
||
|
|
|
||
|
|
```bash
|
||
|
|
pi-gsd-tools generate-claude-profile --analysis "$ANALYSIS_PATH" --json 2>/dev/null
|
||
|
|
```
|
||
|
|
|
||
|
|
Display: "✓ Added profile section to GEMINI.md"
|
||
|
|
|
||
|
|
**For Global GEMINI.md (if selected):**
|
||
|
|
|
||
|
|
```bash
|
||
|
|
pi-gsd-tools generate-claude-profile --analysis "$ANALYSIS_PATH" --global --json 2>/dev/null
|
||
|
|
```
|
||
|
|
|
||
|
|
Display: "✓ Added profile section to .agent/GEMINI.md"
|
||
|
|
|
||
|
|
**Error handling:** If any pi-gsd-tools call fails, display the error message and use AskUserQuestion to offer "Retry" or "Skip this artifact". On retry, re-run the command. On skip, continue to next artifact.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 10. Summary & Refresh Diff
|
||
|
|
|
||
|
|
**If --refresh path:**
|
||
|
|
|
||
|
|
Read both old backup and new analysis to compare dimension ratings/confidence.
|
||
|
|
|
||
|
|
Read the backed-up profile:
|
||
|
|
```bash
|
||
|
|
BACKUP_PATH=".pi/gsd/USER-PROFILE.backup.md"
|
||
|
|
```
|
||
|
|
|
||
|
|
Compare each dimension's rating and confidence between old and new. Display diff table showing only changed dimensions:
|
||
|
|
|
||
|
|
```
|
||
|
|
## Changes
|
||
|
|
|
||
|
|
| Dimension | Before | After |
|
||
|
|
|-----------------|-----------------------------|-----------------------------|
|
||
|
|
| Communication | terse-direct (LOW) | detailed-structured (HIGH) |
|
||
|
|
| Debugging | fix-first (MEDIUM) | hypothesis-driven (MEDIUM) |
|
||
|
|
```
|
||
|
|
|
||
|
|
If nothing changed: Display "No changes detected -- your profile is already up to date."
|
||
|
|
|
||
|
|
**Display final summary:**
|
||
|
|
|
||
|
|
```
|
||
|
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
|
|
GSD > PROFILE COMPLETE ✓
|
||
|
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
|
|
|
||
|
|
Your profile: .pi/gsd/USER-PROFILE.md
|
||
|
|
```
|
||
|
|
|
||
|
|
Then list paths for each generated artifact:
|
||
|
|
```
|
||
|
|
Artifacts:
|
||
|
|
✓ /gsd-dev-preferences .agent/commands/gsd/dev-preferences.md
|
||
|
|
✓ GEMINI.md section ./GEMINI.md
|
||
|
|
✓ Global GEMINI.md .agent/GEMINI.md
|
||
|
|
```
|
||
|
|
|
||
|
|
(Only show artifacts that were actually generated.)
|
||
|
|
|
||
|
|
**Clean up temp files:**
|
||
|
|
|
||
|
|
Remove the temp directory created by profile-sample (contains sample JSONL and analysis JSON):
|
||
|
|
```bash
|
||
|
|
rm -rf "$TEMP_DIR"
|
||
|
|
```
|
||
|
|
|
||
|
|
Also remove any standalone temp files created for questionnaire answers:
|
||
|
|
```bash
|
||
|
|
rm -f "$ANSWERS_PATH" 2>/dev/null
|
||
|
|
rm -f "$ANALYSIS_PATH" 2>/dev/null
|
||
|
|
```
|
||
|
|
|
||
|
|
(Only clean up temp paths that were actually created during this workflow run.)
|
||
|
|
|
||
|
|
</process>
|
||
|
|
|
||
|
|
<success_criteria>
|
||
|
|
- [ ] Initialization detects existing profile and handles all three responses (view/refresh/cancel)
|
||
|
|
- [ ] Consent gate shown for session analysis path, skipped for questionnaire path
|
||
|
|
- [ ] Session scan discovers sessions and reports statistics
|
||
|
|
- [ ] Session analysis path: samples messages, spawns profiler agent, extracts analysis JSON
|
||
|
|
- [ ] Questionnaire path: presents 8 questions, collects answers, converts to analysis JSON
|
||
|
|
- [ ] Split resolution presents context-dependent splits with user resolution options
|
||
|
|
- [ ] Profile written to USER-PROFILE.md via write-profile subcommand
|
||
|
|
- [ ] Result display shows report card table and highlight reel with evidence
|
||
|
|
- [ ] Artifact selection uses multiSelect with all options pre-selected
|
||
|
|
- [ ] Artifacts generated sequentially via pi-gsd-tools subcommands
|
||
|
|
- [ ] Refresh diff shows changed dimensions when --refresh was used
|
||
|
|
- [ ] Temp files cleaned up on completion
|
||
|
|
</success_criteria>
|