diff --git a/TODOS.md b/TODOS.md index a5246b162..595e117e4 100644 --- a/TODOS.md +++ b/TODOS.md @@ -2,6 +2,12 @@ ## NEXT PRIORITY +### P3: GST-421 and GST-412 follow-ups (filed 2026-10-31, from the PR B /ship review) + +- **Partial `gstack-post pr-body` posts drop the intro.** Since GST-412, any body file with a `## ` section replaces the text above the current body's first heading, so a lane that posts only `## Screenshots` deletes a human intro or a `Review-loop exception:` line written there (stderr names it; GitHub's edit history keeps it). Decide whether the preamble should be managed only when the file brings its own lead text or a receipt, or have /ship put the exception line under a named section. **Priority:** P3. +- **Check the Approvals table's own cells.** `--check-prose` skips the whole rendered Approvals block, including the Asked, Covers and Still pending cells the lane types. Narrow the skip to the Exact words column. **Priority:** P3. +- **The root `.bun/` blind spot.** `gstack-wtree` leaves every untracked file under a root `.bun/` out of the fingerprint, so an edit there never makes evidence STALE. Narrow the exclusion to Bun's cache subfolder if anything starts loading code from it. **Priority:** P3. + ### P1: review-depth receipt follow-ups (filed 2026-10-28, from the #3567 /ship plan audit) - **Derive `carry.covers` from depth.** A carried receipt's `covers` is the fixed `CARRY_COVERS` list (lib/ship-receipt.ts); derive it from the recorded `review_depth` so a light review's carry does not claim the checks a full review ran (plan item 5, deferred at /ship). **Effort:** S. **Priority:** P1. diff --git a/changelog.d/gsta195-evidence-prose.md b/changelog.d/gsta195-evidence-prose.md index 05aaa2f33..f6984a493 100644 --- a/changelog.d/gsta195-evidence-prose.md +++ b/changelog.d/gsta195-evidence-prose.md @@ -2,11 +2,11 @@ ### Fixed - **GST-421: `gstack-wtree` leaves an untracked `.bun/` folder at the repo root out of the fingerprint.** A test that created it made `gstack-evidence` treat the run as a mid-run edit, so `check` graded the lane STALE with "record has no content fingerprint" and named no file. Tracked files under `.bun/` still count, and a tree without that folder hashes exactly as before. -- **GST-421: `gstack-evidence` names what changed during a run.** When the fingerprint before and after a run differ, the record stores up to five changed paths as `wtree_changed`, the stderr warning lists them, and `check` grades STALE with `content changed during the run: `. A record without them still says "record has no content fingerprint". -- **GST-412: `gstack-ship-receipt read --check-prose` skips the `## Approvals` block `gstack-approvals` renders** (the heading, the table and its `Source: gstack-approvals record` line), so "one Step 11 pass" in the owner's quoted words is no longer read as `gate..pass body=11`. Text after that block, a hand-written Approvals list and an example inside a code fence are still checked, and CRLF bodies work. +- **GST-421: `gstack-evidence` names what changed during a run.** When the fingerprint before and after a run differ, the record stores up to five changed paths as `wtree_changed`, the stderr warning lists them, and `check` grades STALE with `content changed during the run: `. A record without them (or with entries that are not plain paths) still says "record has no content fingerprint". +- **GST-412: `gstack-ship-receipt read --check-prose` skips the `## Approvals` block `gstack-approvals` renders** (the heading, the table and its `Source: gstack-approvals record` line), so "one Step 11 pass" in the owner's quoted words is no longer read as `gate..pass body=11`. Text after that block, a row the renderer would not write, a hand-written Approvals list and an example inside a code fence are still checked, the text on either side of the block never joins into a new claim, and CRLF bodies work. ### Changed -- **GST-412: `gstack-post pr-body` manages the text above the first heading when the file has a `## ` section.** The current body's opening text, any text between the receipt and the first heading, or a whole body with no `## ` heading, is replaced by the file's own text above its first heading, or dropped when the file has none. The stderr line names each dropped piece with its first line (`; dropped leading text ("…")`). A receipt-only or text-only file merges as before, and reposting the same body gives the same bytes. +- **GST-412: `gstack-post pr-body` manages the text above the first heading when the file has a `## ` section.** The current body's opening text, any text between the receipt and the first heading, or a whole body with no `## ` heading, is replaced by the file's own text above its first heading, or dropped when the file has none. The stderr line names each dropped piece with its first line (`; dropped leading text ("…")`), or withholds that line when the redaction scan flags it, so a removed secret never reaches the terminal. A receipt-only or text-only file merges as before, and reposting the same body gives the same bytes. ### Tests - `test/evidence.test.ts`: a lane that writes `.bun/x` grades FRESH; one that writes `src/new.ts` grades STALE naming it; a tracked file under `.bun/` still moves the fingerprint; a tree without `.bun/` hashes like a plain `git add -A`. diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md index 98fb793b3..26a218429 100644 --- a/docs/troubleshooting.md +++ b/docs/troubleshooting.md @@ -2517,7 +2517,8 @@ and the first heading, or the whole body when it has no `## ` heading) is replaced by the file's own text above its first heading, or dropped when the file has none. A file with no `## ` section (a receipt-only or text-only post) leaves that text alone. One stderr line names what was replaced, kept, added -and dropped, a dropped piece with its first line (`gstack-post: pr-body merged +and dropped, a dropped piece with its first line, or with that line withheld +when the redaction scan flags it (`gstack-post: pr-body merged by section: replaced What changed; kept ship receipt, Why, Approvals; added Tests; dropped leading text ("Draft from gh pr create")`). A body file holding only its first section therefore no longer wipes the rest of the PR, and an