diff --git a/CHANGELOG.md b/CHANGELOG.md index e70b8e951..8ebd7539c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,43 @@ # Changelog +## [1.91.17.0] - 2026-10-03 + +**Checkpoints say whether each next step was run, read or guessed, and `/context-restore` verifies the guesses first.** +**Paid design images are never overwritten, and design skills always show the round you just paid for.** + +This wave rebuilds three community PRs from @mvanhorn on current main. A checkpoint's Remaining Work used to read the same whether a step had been run or only inferred, so a resumed session could act on a guess and hit the wrong system (#3004, reported by @tomg65). Running `$D variants` twice into one folder replaced `variant-A.png`, `$D generate --retry` kept only the last image, and skills built boards from fixed `variant-A/B/C` names, so you could pay for images you never saw (#1529, reported by @SakenW). + +### What changes for you + +- **Remaining Work carries provenance.** Every item starts with `Open.` and ends with how the saving session knows it: `(path run)` with the outcome, `(path read)` or `(path assumed)` for commands, flags, config values and files; `(target state checked)`, `(code read)` or `(path assumed)` for writes. For example: + + 1. Open. Run the migration check with SWITCH_B=1 against staging. (path assumed) + 2. Open. Run bun test test/billing.test.ts. (path run) exit 0 + + `/context-restore` keeps the saved order but shows item 2 under **Next steps** and item 1 under **Verify first**, and "continue" starts by verifying item 1 read-only instead of jumping to item 2. Checkpoints saved before this release have no markers, so their command, path and write items land under Verify first, with a one-line banner saying so. +- **Nothing paid is lost.** A taken image name gets `-2`, `-3` and so on (`variant-A-2.png`); stderr says `note: exists; saved to (existing file kept)` and the JSON reports the real path. Every `--retry` attempt is its own saved image. If saving fails after the API returned the image, the bytes go to a private recovery copy in your temp directory and the message says where; a local write failure never buys a second image. +- **Every image command prints JSON, even on failure**: `requested`, `saved`, `selected`, `failures`, `recovered`. Exit 0 means the result is ready, 2 means nothing was saved, 3 means the run stopped after saving some images. +- **Boards show this round only.** Skills tell you how many of the requested images were saved, write the round's printed paths to `board-images.json`, build the board with `$D compare --images-file`, archive an old `feedback.json` first, and record `approved_path` in `approved.json`, so a later session opens exactly the image you approved. Old letter-only approvals still work. /design-shotgun subagents stage in a fresh temp directory and publish with `gstack-design-claim`, which never overwrites. +- **If you script `$D`,** read paths from the JSON instead of assuming the file name: + + out=$($D generate --brief "pricing page" --output designs/pricing.png); rc=$? + img=$(printf '%s' "$out" | jq -r .outputPath) + [ "$rc" -eq 0 ] && $D check --image "$img" --brief "pricing page" + + `variants` prints its list in `.paths`; `compare` takes it losslessly with `--images-file paths.json`. +- **Windows console flashes (#1784)** were confirmed fixed on main (v1.91.15.0) by @kaiwulff on a real Windows 11 desktop; this release ships no code for them. + +### Itemized changes + +#### Fixed +- `/context-save` Remaining Work did not record whether a step was run, read or assumed, and `/context-restore` offered the first item as the next action (#3004). Marker format from #3019 by @mvanhorn, field-tested by @tomg65. +- Design images were silently overwritten by later rounds and `--retry` attempts (#1529). Exclusive-create claim idea from #1737 by @mvanhorn. +- Comparison boards and quality checks read fixed `variant-A/B/C` names or a `variant-*.png` glob and mixed rounds; a stale `feedback.json` could approve a new round. + +#### Added +- `$D compare --images-file` and JSON-array `--images`, `bin/gstack-design-claim`, `bin/gstack-design-approved`, and `approved_path` in approval records. +- Periodic behavior eval `context-restore-provenance-order` (3-trial panel) and free contract tests for the provenance markers, `$D` persistence and the design-skill path rules. + ## [1.91.16.0] - 2026-10-03 **Installing or upgrading gstack never quietly changes another copy, and `./setup --status` shows every install.** diff --git a/TODOS.md b/TODOS.md index 7fbbaf3dd..83b18db0a 100644 --- a/TODOS.md +++ b/TODOS.md @@ -33,6 +33,31 @@ trials per case, apply the CASE_QUARANTINE entry rule instead of chasing one run at a time. Effort S. +### P2/P3: mvanhorn fix-wave deferrals (filed 2026-10-03, from the autoplan review of the wave) + +- **E6 (P2): behavior E2E for design round accounting** — stub `$D` so a + generating step reports `saved` shorter than `requested` (and exit 2 for zero + saved), run /plan-design-review or /design-shotgun against it, and assert the + skill tells the user how many paid images were saved, names the failures and + builds no board on zero saved. `test/design-printed-paths.test.ts` only pins + the marker order; whether the model reports the count is behavior. Context: + #1529. Effort M. +- **E7 (P3): prune or archive unapproved design rounds** — never-overwrite plus + `--retry` attempts and iterate outputs grow + `$GSTACK_STATE_ROOT/projects/$SLUG/designs/` without bound. Add a prune or + archive command for unapproved rounds and attempts (keep anything an + `approved.json` names) and show the design directory size in `$D gallery`. + Context: #1529, eng review. Effort S. +- **E5 (P3): restore verifies assumed items read-only** — `/context-restore` + could check `(path assumed)` and `(code read)` items itself with read-only + commands (file exists, flag is defined, table has a unique key) and report + what it found before offering option A. Context: #3004. Effort M. +- **E4 (P3): real-desktop Windows console smoke for spawn changes** — #1784 was + confirmed fixed on a real Windows 11 desktop by its reporter (v1.91.15.0); CI + can only check that spawns pass `windowsHide`. A smoke that starts browse from + a console-less parent and watches for new visible windows would catch a + regression the static sweep can't. Effort M. + ### P2/P3: parallel fix-wave follow-ups (filed 2026-10-02, from the approved fix-wave plan) - **Agent Skills distribution (#113)** — publish gstack in the Agent Skills diff --git a/VERSION b/VERSION index 448b3dfa7..456d26b01 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.91.16.0 +1.91.17.0 diff --git a/agents-digest/gstack-AGENTS.md b/agents-digest/gstack-AGENTS.md index b25d702b2..7afe1f5d7 100644 --- a/agents-digest/gstack-AGENTS.md +++ b/agents-digest/gstack-AGENTS.md @@ -1,4 +1,4 @@ -# gstack digest v1.91.16.0 — regenerate/re-copy after upgrading gstack +# gstack digest v1.91.17.0 — regenerate/re-copy after upgrading gstack Behavioral rules from gstack (https://github.com/garrytan/gstack), compressed for agent hosts without a full skill install. The full skills add workflows, diff --git a/package.json b/package.json index 1132252e6..8c7f0e4ef 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gstack", - "version": "1.91.16", + "version": "1.91.17", "description": "Garry's Stack — Claude Code skills + fast headless browser. One repo, one install, entire AI engineering workflow.", "license": "MIT", "type": "module",