diff --git a/changelog.d/gst-1819-rec-hash-run-bound.md b/changelog.d/gst-1819-rec-hash-run-bound.md new file mode 100644 index 000000000..69d75defe --- /dev/null +++ b/changelog.d/gst-1819-rec-hash-run-bound.md @@ -0,0 +1 @@ +- **An autoplan `rec_hash` now names its run, so two unrelated gates no longer print the same one.** The hash a gate render prints, and `gstack-autoplan answer --rec-hash` checks, covered only the gate revision and the recommended letters, so any two runs with the same decision shape shared it (GST-1749's and GST-1811's gates both printed `f94689f795a5`), and a `rec` relayed for one run passed the check on the other. It now also covers the run id, the reviewed plan's sha256 and each item's title and option keys, and a hash from another run's gate is refused as `GATE_REC_STALE`. Gates written before this keep working. A `gate.json` without the new `rec_hash_v` marker still accepts the hash it printed then, and the answer records that hash. That old hash is not bound to its run, so re-render a gate still pending from before this change and answer with the new hash its render prints. Recorded approvals are untouched, since `gstack-approvals import --autoplan` and the plan record bind by run id and gate revision, never by `rec_hash`. See docs/troubleshooting.md#gate-rec-stale. (GST-1819) diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md index 753e29c55..bf145c534 100644 --- a/docs/troubleshooting.md +++ b/docs/troubleshooting.md @@ -4967,6 +4967,16 @@ recommended `b` pending, and `all` now takes them. and answer with `--rec-hash ` from that render. Explicit `