From 7911b7b974a1cef2794473a77ea93d0ac351b8c2 Mon Sep 17 00:00:00 2001 From: Garry Tan Date: Mon, 30 Mar 2026 03:42:58 -0600 Subject: [PATCH] fix: force comparison board as default variant chooser (v0.14.1.0) (#658) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: force comparison board as default variant chooser The comparison board ($D compare --serve) was being skipped in favor of showing variants inline + AskUserQuestion "which do you prefer?" — a degraded experience missing rating controls, comments, and remix buttons. Changes: - Replace "show inline" instruction with "do NOT show inline, proceed to comparison board" in plan-design-review/SKILL.md.tmpl - Add CRITICAL RULE: never use AskUserQuestion as the variant chooser - Change DESIGN_SHOTGUN_LOOP resolver to AskUserQuestion-first wait with polling fallback (affects all 3 consumer skills) - Fix board URL from /design-board.html (404) to / (correct) - Improve serve-failure fallback to show variants inline via Read tool * chore: bump version and changelog (v0.14.1.0) Co-Authored-By: Claude Opus 4.6 --------- Co-authored-by: Claude Opus 4.6 --- CHANGELOG.md | 14 ++++++ VERSION | 2 +- design-consultation/SKILL.md | 79 +++++++++++++++++------------ design-shotgun/SKILL.md | 79 +++++++++++++++++------------ plan-design-review/SKILL.md | 85 +++++++++++++++++++------------- plan-design-review/SKILL.md.tmpl | 10 ++-- scripts/resolvers/design.ts | 79 +++++++++++++++++------------ 7 files changed, 215 insertions(+), 133 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 853ac274b75b4ae0753aba34f5b1dda068f0a57f..a035a5ec8b3b489a53bc69eeacb3618e0ab1ce78 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # Changelog +## [0.14.1.0] - 2026-03-30 — Comparison Board is the Chooser + +The design comparison board now always opens automatically when reviewing variants. No more inline image + "which do you prefer?" — the board has rating controls, comments, remix/regenerate buttons, and structured feedback output. That's the experience. All 3 design skills (/plan-design-review, /design-shotgun, /design-consultation) get this fix. + +### Changed + +- **Comparison board is now mandatory.** After generating design variants, the agent creates a comparison board with `$D compare --serve` and sends you the URL via AskUserQuestion. You interact with the board, click Submit, and the agent reads your structured feedback from `feedback.json`. No more polling loops as the primary wait mechanism. +- **AskUserQuestion is the wait, not the chooser.** The agent uses AskUserQuestion to tell you the board is open and wait for you to finish, not to present variants inline and ask for preferences. The board URL is always included so you can click through if you lost the tab. +- **Serve-failure fallback improved.** If the comparison board server can't start, variants are shown inline via Read tool before asking for preferences — you're no longer choosing blind. + +### Fixed + +- **Board URL corrected.** The recovery URL now points to `http://127.0.0.1:/` (where the server actually serves) instead of `/design-board.html` (which would 404). + ## [0.14.0.0] - 2026-03-30 — Design to Code You can now go from an approved design mockup to production-quality HTML with one command. `/design-html` takes the winning design from `/design-shotgun` and generates Pretext-native HTML where text actually reflows on resize, heights adjust to content, and layouts are dynamic. No more hardcoded CSS heights or broken text overflow. diff --git a/VERSION b/VERSION index c00d24338c6e092b56abca52e31fc0047dbf539b..31ad1178aac3285dcf0f8c13a11d7c0a2c7f9279 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.14.0.0 +0.14.1.0 diff --git a/design-consultation/SKILL.md b/design-consultation/SKILL.md index 4017269334b493bd0989a538b718a2b27dc646de..d1b38a111633c4057db109627163e38d6da09b40 100644 --- a/design-consultation/SKILL.md +++ b/design-consultation/SKILL.md @@ -814,31 +814,42 @@ $D compare --images "$_DESIGN_DIR/variant-A.png,$_DESIGN_DIR/variant-B.png,$_DES This command generates the board HTML, starts an HTTP server on a random port, and opens it in the user's default browser. **Run it in the background** with `&` -because the agent needs to keep running while the user interacts with the board. +because the server needs to stay running while the user interacts with the board. -**IMPORTANT: Reading feedback via file polling (not stdout):** +Parse the port from stderr output: `SERVE_STARTED: port=XXXXX`. You need this +for the board URL and for reloading during regeneration cycles. -The server writes feedback to files next to the board HTML. The agent polls for these: +**PRIMARY WAIT: AskUserQuestion with board URL** + +After the board is serving, use AskUserQuestion to wait for the user. Include the +board URL so they can click it if they lost the browser tab: + +"I've opened a comparison board with the design variants: +http://127.0.0.1:/ — Rate them, leave comments, remix +elements you like, and click Submit when you're done. Let me know when you've +submitted your feedback (or paste your preferences here). If you clicked +Regenerate or Remix on the board, tell me and I'll generate new variants." + +**Do NOT use AskUserQuestion to ask which variant the user prefers.** The comparison +board IS the chooser. AskUserQuestion is just the blocking wait mechanism. + +**After the user responds to AskUserQuestion:** + +Check for feedback files next to the board HTML: - `$_DESIGN_DIR/feedback.json` — written when user clicks Submit (final choice) - `$_DESIGN_DIR/feedback-pending.json` — written when user clicks Regenerate/Remix/More Like This -**Polling loop** (run after launching `$D serve` in background): - ```bash -# Poll for feedback files every 5 seconds (up to 10 minutes) -for i in $(seq 1 120); do - if [ -f "$_DESIGN_DIR/feedback.json" ]; then - echo "SUBMIT_RECEIVED" - cat "$_DESIGN_DIR/feedback.json" - break - elif [ -f "$_DESIGN_DIR/feedback-pending.json" ]; then - echo "REGENERATE_RECEIVED" - cat "$_DESIGN_DIR/feedback-pending.json" - rm "$_DESIGN_DIR/feedback-pending.json" - break - fi - sleep 5 -done +if [ -f "$_DESIGN_DIR/feedback.json" ]; then + echo "SUBMIT_RECEIVED" + cat "$_DESIGN_DIR/feedback.json" +elif [ -f "$_DESIGN_DIR/feedback-pending.json" ]; then + echo "REGENERATE_RECEIVED" + cat "$_DESIGN_DIR/feedback-pending.json" + rm "$_DESIGN_DIR/feedback-pending.json" +else + echo "NO_FEEDBACK_FILE" +fi ``` The feedback JSON has this shape: @@ -852,24 +863,30 @@ The feedback JSON has this shape: } ``` -**If `feedback-pending.json` found (`"regenerated": true`):** +**If `feedback.json` found:** The user clicked Submit on the board. +Read `preferred`, `ratings`, `comments`, `overall` from the JSON. Proceed with +the approved variant. + +**If `feedback-pending.json` found:** The user clicked Regenerate/Remix on the board. 1. Read `regenerateAction` from the JSON (`"different"`, `"match"`, `"more_like_B"`, `"remix"`, or custom text) 2. If `regenerateAction` is `"remix"`, read `remixSpec` (e.g. `{"layout":"A","colors":"B"}`) 3. Generate new variants with `$D iterate` or `$D variants` using updated brief 4. Create new board: `$D compare --images "..." --output "$_DESIGN_DIR/design-board.html"` -5. Parse the port from the `$D serve` stderr output (`SERVE_STARTED: port=XXXXX`), - then reload the board in the user's browser (same tab): +5. Reload the board in the user's browser (same tab): `curl -s -X POST http://127.0.0.1:PORT/api/reload -H 'Content-Type: application/json' -d '{"html":"$_DESIGN_DIR/design-board.html"}'` -6. The board auto-refreshes. **Poll again** for the next feedback file. -7. Repeat until `feedback.json` appears (user clicked Submit). - -**If `feedback.json` found (`"regenerated": false`):** -1. Read `preferred`, `ratings`, `comments`, `overall` from the JSON -2. Proceed with the approved variant - -**If `$D serve` fails or no feedback within 10 minutes:** Fall back to AskUserQuestion: -"I've opened the design board. Which variant do you prefer? Any feedback?" +6. The board auto-refreshes. **AskUserQuestion again** with the same board URL to + wait for the next round of feedback. Repeat until `feedback.json` appears. + +**If `NO_FEEDBACK_FILE`:** The user typed their preferences directly in the +AskUserQuestion response instead of using the board. Use their text response +as the feedback. + +**POLLING FALLBACK:** Only use polling if `$D serve` fails (no port available). +In that case, show each variant inline using the Read tool (so the user can see them), +then use AskUserQuestion: +"The comparison board server failed to start. I've shown the variants above. +Which do you prefer? Any feedback?" **After receiving feedback (any path):** Output a clear summary confirming what was understood: diff --git a/design-shotgun/SKILL.md b/design-shotgun/SKILL.md index d6dd55c64f80f31cf1e29c330d2defae7097d892..3d3421f9a0181bc76841df02cf0183381f33d457 100644 --- a/design-shotgun/SKILL.md +++ b/design-shotgun/SKILL.md @@ -676,31 +676,42 @@ $D compare --images "$_DESIGN_DIR/variant-A.png,$_DESIGN_DIR/variant-B.png,$_DES This command generates the board HTML, starts an HTTP server on a random port, and opens it in the user's default browser. **Run it in the background** with `&` -because the agent needs to keep running while the user interacts with the board. +because the server needs to stay running while the user interacts with the board. -**IMPORTANT: Reading feedback via file polling (not stdout):** +Parse the port from stderr output: `SERVE_STARTED: port=XXXXX`. You need this +for the board URL and for reloading during regeneration cycles. -The server writes feedback to files next to the board HTML. The agent polls for these: +**PRIMARY WAIT: AskUserQuestion with board URL** + +After the board is serving, use AskUserQuestion to wait for the user. Include the +board URL so they can click it if they lost the browser tab: + +"I've opened a comparison board with the design variants: +http://127.0.0.1:/ — Rate them, leave comments, remix +elements you like, and click Submit when you're done. Let me know when you've +submitted your feedback (or paste your preferences here). If you clicked +Regenerate or Remix on the board, tell me and I'll generate new variants." + +**Do NOT use AskUserQuestion to ask which variant the user prefers.** The comparison +board IS the chooser. AskUserQuestion is just the blocking wait mechanism. + +**After the user responds to AskUserQuestion:** + +Check for feedback files next to the board HTML: - `$_DESIGN_DIR/feedback.json` — written when user clicks Submit (final choice) - `$_DESIGN_DIR/feedback-pending.json` — written when user clicks Regenerate/Remix/More Like This -**Polling loop** (run after launching `$D serve` in background): - ```bash -# Poll for feedback files every 5 seconds (up to 10 minutes) -for i in $(seq 1 120); do - if [ -f "$_DESIGN_DIR/feedback.json" ]; then - echo "SUBMIT_RECEIVED" - cat "$_DESIGN_DIR/feedback.json" - break - elif [ -f "$_DESIGN_DIR/feedback-pending.json" ]; then - echo "REGENERATE_RECEIVED" - cat "$_DESIGN_DIR/feedback-pending.json" - rm "$_DESIGN_DIR/feedback-pending.json" - break - fi - sleep 5 -done +if [ -f "$_DESIGN_DIR/feedback.json" ]; then + echo "SUBMIT_RECEIVED" + cat "$_DESIGN_DIR/feedback.json" +elif [ -f "$_DESIGN_DIR/feedback-pending.json" ]; then + echo "REGENERATE_RECEIVED" + cat "$_DESIGN_DIR/feedback-pending.json" + rm "$_DESIGN_DIR/feedback-pending.json" +else + echo "NO_FEEDBACK_FILE" +fi ``` The feedback JSON has this shape: @@ -714,24 +725,30 @@ The feedback JSON has this shape: } ``` -**If `feedback-pending.json` found (`"regenerated": true`):** +**If `feedback.json` found:** The user clicked Submit on the board. +Read `preferred`, `ratings`, `comments`, `overall` from the JSON. Proceed with +the approved variant. + +**If `feedback-pending.json` found:** The user clicked Regenerate/Remix on the board. 1. Read `regenerateAction` from the JSON (`"different"`, `"match"`, `"more_like_B"`, `"remix"`, or custom text) 2. If `regenerateAction` is `"remix"`, read `remixSpec` (e.g. `{"layout":"A","colors":"B"}`) 3. Generate new variants with `$D iterate` or `$D variants` using updated brief 4. Create new board: `$D compare --images "..." --output "$_DESIGN_DIR/design-board.html"` -5. Parse the port from the `$D serve` stderr output (`SERVE_STARTED: port=XXXXX`), - then reload the board in the user's browser (same tab): +5. Reload the board in the user's browser (same tab): `curl -s -X POST http://127.0.0.1:PORT/api/reload -H 'Content-Type: application/json' -d '{"html":"$_DESIGN_DIR/design-board.html"}'` -6. The board auto-refreshes. **Poll again** for the next feedback file. -7. Repeat until `feedback.json` appears (user clicked Submit). - -**If `feedback.json` found (`"regenerated": false`):** -1. Read `preferred`, `ratings`, `comments`, `overall` from the JSON -2. Proceed with the approved variant - -**If `$D serve` fails or no feedback within 10 minutes:** Fall back to AskUserQuestion: -"I've opened the design board. Which variant do you prefer? Any feedback?" +6. The board auto-refreshes. **AskUserQuestion again** with the same board URL to + wait for the next round of feedback. Repeat until `feedback.json` appears. + +**If `NO_FEEDBACK_FILE`:** The user typed their preferences directly in the +AskUserQuestion response instead of using the board. Use their text response +as the feedback. + +**POLLING FALLBACK:** Only use polling if `$D serve` fails (no port available). +In that case, show each variant inline using the Read tool (so the user can see them), +then use AskUserQuestion: +"The comparison board server failed to start. I've shown the variants above. +Which do you prefer? Any feedback?" **After receiving feedback (any path):** Output a clear summary confirming what was understood: diff --git a/plan-design-review/SKILL.md b/plan-design-review/SKILL.md index 1d188d0c25b1a86b2eee70bbf4d150496f115424..a8c7f26410244c0a67d0b3f171d1c05addf55697 100644 --- a/plan-design-review/SKILL.md +++ b/plan-design-review/SKILL.md @@ -675,11 +675,10 @@ $D check --image "$_DESIGN_DIR/variant-A.png" --brief "" Flag any variants that fail the quality check. Offer to regenerate failures. -Show each variant inline (Read tool on each PNG) so the user sees them immediately. - -Tell the user: "I've generated design directions. Take a look at the variants above, -then use the comparison board that just opened in your browser to pick your favorite, -rate the others, remix elements, and click Submit when you're done." +**Do NOT show variants inline via Read tool and ask for preferences.** Proceed +directly to the Comparison Board + Feedback Loop section below. The comparison board +IS the chooser — it has rating controls, comments, remix/regenerate, and structured +feedback output. Showing mockups inline is a degraded experience. ### Comparison Board + Feedback Loop @@ -691,31 +690,42 @@ $D compare --images "$_DESIGN_DIR/variant-A.png,$_DESIGN_DIR/variant-B.png,$_DES This command generates the board HTML, starts an HTTP server on a random port, and opens it in the user's default browser. **Run it in the background** with `&` -because the agent needs to keep running while the user interacts with the board. +because the server needs to stay running while the user interacts with the board. + +Parse the port from stderr output: `SERVE_STARTED: port=XXXXX`. You need this +for the board URL and for reloading during regeneration cycles. + +**PRIMARY WAIT: AskUserQuestion with board URL** + +After the board is serving, use AskUserQuestion to wait for the user. Include the +board URL so they can click it if they lost the browser tab: + +"I've opened a comparison board with the design variants: +http://127.0.0.1:/ — Rate them, leave comments, remix +elements you like, and click Submit when you're done. Let me know when you've +submitted your feedback (or paste your preferences here). If you clicked +Regenerate or Remix on the board, tell me and I'll generate new variants." + +**Do NOT use AskUserQuestion to ask which variant the user prefers.** The comparison +board IS the chooser. AskUserQuestion is just the blocking wait mechanism. -**IMPORTANT: Reading feedback via file polling (not stdout):** +**After the user responds to AskUserQuestion:** -The server writes feedback to files next to the board HTML. The agent polls for these: +Check for feedback files next to the board HTML: - `$_DESIGN_DIR/feedback.json` — written when user clicks Submit (final choice) - `$_DESIGN_DIR/feedback-pending.json` — written when user clicks Regenerate/Remix/More Like This -**Polling loop** (run after launching `$D serve` in background): - ```bash -# Poll for feedback files every 5 seconds (up to 10 minutes) -for i in $(seq 1 120); do - if [ -f "$_DESIGN_DIR/feedback.json" ]; then - echo "SUBMIT_RECEIVED" - cat "$_DESIGN_DIR/feedback.json" - break - elif [ -f "$_DESIGN_DIR/feedback-pending.json" ]; then - echo "REGENERATE_RECEIVED" - cat "$_DESIGN_DIR/feedback-pending.json" - rm "$_DESIGN_DIR/feedback-pending.json" - break - fi - sleep 5 -done +if [ -f "$_DESIGN_DIR/feedback.json" ]; then + echo "SUBMIT_RECEIVED" + cat "$_DESIGN_DIR/feedback.json" +elif [ -f "$_DESIGN_DIR/feedback-pending.json" ]; then + echo "REGENERATE_RECEIVED" + cat "$_DESIGN_DIR/feedback-pending.json" + rm "$_DESIGN_DIR/feedback-pending.json" +else + echo "NO_FEEDBACK_FILE" +fi ``` The feedback JSON has this shape: @@ -729,24 +739,30 @@ The feedback JSON has this shape: } ``` -**If `feedback-pending.json` found (`"regenerated": true`):** +**If `feedback.json` found:** The user clicked Submit on the board. +Read `preferred`, `ratings`, `comments`, `overall` from the JSON. Proceed with +the approved variant. + +**If `feedback-pending.json` found:** The user clicked Regenerate/Remix on the board. 1. Read `regenerateAction` from the JSON (`"different"`, `"match"`, `"more_like_B"`, `"remix"`, or custom text) 2. If `regenerateAction` is `"remix"`, read `remixSpec` (e.g. `{"layout":"A","colors":"B"}`) 3. Generate new variants with `$D iterate` or `$D variants` using updated brief 4. Create new board: `$D compare --images "..." --output "$_DESIGN_DIR/design-board.html"` -5. Parse the port from the `$D serve` stderr output (`SERVE_STARTED: port=XXXXX`), - then reload the board in the user's browser (same tab): +5. Reload the board in the user's browser (same tab): `curl -s -X POST http://127.0.0.1:PORT/api/reload -H 'Content-Type: application/json' -d '{"html":"$_DESIGN_DIR/design-board.html"}'` -6. The board auto-refreshes. **Poll again** for the next feedback file. -7. Repeat until `feedback.json` appears (user clicked Submit). +6. The board auto-refreshes. **AskUserQuestion again** with the same board URL to + wait for the next round of feedback. Repeat until `feedback.json` appears. -**If `feedback.json` found (`"regenerated": false`):** -1. Read `preferred`, `ratings`, `comments`, `overall` from the JSON -2. Proceed with the approved variant +**If `NO_FEEDBACK_FILE`:** The user typed their preferences directly in the +AskUserQuestion response instead of using the board. Use their text response +as the feedback. -**If `$D serve` fails or no feedback within 10 minutes:** Fall back to AskUserQuestion: -"I've opened the design board. Which variant do you prefer? Any feedback?" +**POLLING FALLBACK:** Only use polling if `$D serve` fails (no port available). +In that case, show each variant inline using the Read tool (so the user can see them), +then use AskUserQuestion: +"The comparison board server failed to start. I've shown the variants above. +Which do you prefer? Any feedback?" **After receiving feedback (any path):** Output a clear summary confirming what was understood: @@ -1060,6 +1076,7 @@ Follow the AskUserQuestion format from the Preamble above. Additional rules for * **Map to Design Principles above.** One sentence connecting your recommendation to a specific principle. * Label with issue NUMBER + option LETTER (e.g., "3A", "3B"). * **Escape hatch:** If a section has no issues, say so and move on. If a gap has an obvious fix, state what you'll add and move on — don't waste a question on it. Only use AskUserQuestion when there is a genuine design choice with meaningful tradeoffs. +* **NEVER use AskUserQuestion to ask which variant the user prefers.** Always create a comparison board first (`$D compare --serve`) and open it in the browser. The board has rating controls, comments, remix/regenerate buttons, and structured feedback output. Use AskUserQuestion ONLY to notify the user the board is open and wait for them to finish — not to present variants inline and ask "which do you prefer?" That is a degraded experience. ## Required Outputs diff --git a/plan-design-review/SKILL.md.tmpl b/plan-design-review/SKILL.md.tmpl index 0ef054b6e795804bc6278fb7ac6bc313d41dcbbb..3670f405b591988e0d43f4c7ebfe1c6a806999c6 100644 --- a/plan-design-review/SKILL.md.tmpl +++ b/plan-design-review/SKILL.md.tmpl @@ -208,11 +208,10 @@ $D check --image "$_DESIGN_DIR/variant-A.png" --brief "" Flag any variants that fail the quality check. Offer to regenerate failures. -Show each variant inline (Read tool on each PNG) so the user sees them immediately. - -Tell the user: "I've generated design directions. Take a look at the variants above, -then use the comparison board that just opened in your browser to pick your favorite, -rate the others, remix elements, and click Submit when you're done." +**Do NOT show variants inline via Read tool and ask for preferences.** Proceed +directly to the Comparison Board + Feedback Loop section below. The comparison board +IS the chooser — it has rating controls, comments, remix/regenerate, and structured +feedback output. Showing mockups inline is a degraded experience. {{DESIGN_SHOTGUN_LOOP}} @@ -337,6 +336,7 @@ Follow the AskUserQuestion format from the Preamble above. Additional rules for * **Map to Design Principles above.** One sentence connecting your recommendation to a specific principle. * Label with issue NUMBER + option LETTER (e.g., "3A", "3B"). * **Escape hatch:** If a section has no issues, say so and move on. If a gap has an obvious fix, state what you'll add and move on — don't waste a question on it. Only use AskUserQuestion when there is a genuine design choice with meaningful tradeoffs. +* **NEVER use AskUserQuestion to ask which variant the user prefers.** Always create a comparison board first (`$D compare --serve`) and open it in the browser. The board has rating controls, comments, remix/regenerate buttons, and structured feedback output. Use AskUserQuestion ONLY to notify the user the board is open and wait for them to finish — not to present variants inline and ask "which do you prefer?" That is a degraded experience. ## Required Outputs diff --git a/scripts/resolvers/design.ts b/scripts/resolvers/design.ts index 6f97e7921d1a1bea374369726995b9bbda7b3ba7..208b1db3ba86f4bb094697431a610e2c656f5f95 100644 --- a/scripts/resolvers/design.ts +++ b/scripts/resolvers/design.ts @@ -855,31 +855,42 @@ $D compare --images "$_DESIGN_DIR/variant-A.png,$_DESIGN_DIR/variant-B.png,$_DES This command generates the board HTML, starts an HTTP server on a random port, and opens it in the user's default browser. **Run it in the background** with \`&\` -because the agent needs to keep running while the user interacts with the board. +because the server needs to stay running while the user interacts with the board. -**IMPORTANT: Reading feedback via file polling (not stdout):** +Parse the port from stderr output: \`SERVE_STARTED: port=XXXXX\`. You need this +for the board URL and for reloading during regeneration cycles. -The server writes feedback to files next to the board HTML. The agent polls for these: +**PRIMARY WAIT: AskUserQuestion with board URL** + +After the board is serving, use AskUserQuestion to wait for the user. Include the +board URL so they can click it if they lost the browser tab: + +"I've opened a comparison board with the design variants: +http://127.0.0.1:/ — Rate them, leave comments, remix +elements you like, and click Submit when you're done. Let me know when you've +submitted your feedback (or paste your preferences here). If you clicked +Regenerate or Remix on the board, tell me and I'll generate new variants." + +**Do NOT use AskUserQuestion to ask which variant the user prefers.** The comparison +board IS the chooser. AskUserQuestion is just the blocking wait mechanism. + +**After the user responds to AskUserQuestion:** + +Check for feedback files next to the board HTML: - \`$_DESIGN_DIR/feedback.json\` — written when user clicks Submit (final choice) - \`$_DESIGN_DIR/feedback-pending.json\` — written when user clicks Regenerate/Remix/More Like This -**Polling loop** (run after launching \`$D serve\` in background): - \`\`\`bash -# Poll for feedback files every 5 seconds (up to 10 minutes) -for i in $(seq 1 120); do - if [ -f "$_DESIGN_DIR/feedback.json" ]; then - echo "SUBMIT_RECEIVED" - cat "$_DESIGN_DIR/feedback.json" - break - elif [ -f "$_DESIGN_DIR/feedback-pending.json" ]; then - echo "REGENERATE_RECEIVED" - cat "$_DESIGN_DIR/feedback-pending.json" - rm "$_DESIGN_DIR/feedback-pending.json" - break - fi - sleep 5 -done +if [ -f "$_DESIGN_DIR/feedback.json" ]; then + echo "SUBMIT_RECEIVED" + cat "$_DESIGN_DIR/feedback.json" +elif [ -f "$_DESIGN_DIR/feedback-pending.json" ]; then + echo "REGENERATE_RECEIVED" + cat "$_DESIGN_DIR/feedback-pending.json" + rm "$_DESIGN_DIR/feedback-pending.json" +else + echo "NO_FEEDBACK_FILE" +fi \`\`\` The feedback JSON has this shape: @@ -893,24 +904,30 @@ The feedback JSON has this shape: } \`\`\` -**If \`feedback-pending.json\` found (\`"regenerated": true\`):** +**If \`feedback.json\` found:** The user clicked Submit on the board. +Read \`preferred\`, \`ratings\`, \`comments\`, \`overall\` from the JSON. Proceed with +the approved variant. + +**If \`feedback-pending.json\` found:** The user clicked Regenerate/Remix on the board. 1. Read \`regenerateAction\` from the JSON (\`"different"\`, \`"match"\`, \`"more_like_B"\`, \`"remix"\`, or custom text) 2. If \`regenerateAction\` is \`"remix"\`, read \`remixSpec\` (e.g. \`{"layout":"A","colors":"B"}\`) 3. Generate new variants with \`$D iterate\` or \`$D variants\` using updated brief 4. Create new board: \`$D compare --images "..." --output "$_DESIGN_DIR/design-board.html"\` -5. Parse the port from the \`$D serve\` stderr output (\`SERVE_STARTED: port=XXXXX\`), - then reload the board in the user's browser (same tab): +5. Reload the board in the user's browser (same tab): \`curl -s -X POST http://127.0.0.1:PORT/api/reload -H 'Content-Type: application/json' -d '{"html":"$_DESIGN_DIR/design-board.html"}'\` -6. The board auto-refreshes. **Poll again** for the next feedback file. -7. Repeat until \`feedback.json\` appears (user clicked Submit). - -**If \`feedback.json\` found (\`"regenerated": false\`):** -1. Read \`preferred\`, \`ratings\`, \`comments\`, \`overall\` from the JSON -2. Proceed with the approved variant - -**If \`$D serve\` fails or no feedback within 10 minutes:** Fall back to AskUserQuestion: -"I've opened the design board. Which variant do you prefer? Any feedback?" +6. The board auto-refreshes. **AskUserQuestion again** with the same board URL to + wait for the next round of feedback. Repeat until \`feedback.json\` appears. + +**If \`NO_FEEDBACK_FILE\`:** The user typed their preferences directly in the +AskUserQuestion response instead of using the board. Use their text response +as the feedback. + +**POLLING FALLBACK:** Only use polling if \`$D serve\` fails (no port available). +In that case, show each variant inline using the Read tool (so the user can see them), +then use AskUserQuestion: +"The comparison board server failed to start. I've shown the variants above. +Which do you prefer? Any feedback?" **After receiving feedback (any path):** Output a clear summary confirming what was understood: