pi-gauntlet 7.10.0 → 7.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## v7.10.1 - 2026-10-13
4
+
5
+ ### Changed
6
+
7
+ - `gauntlet-resume` repairs plan citation drift on a `plan_check` failure instead of stopping: moved anchors, missing literals, `Modify:` rows that completed tasks deleted, and renamed `Test:` paths are fixed in place through a new `## Plan repair` section of the brief contract, re-checked up to three rounds, committed alone when the plan was tracked and clean, and reported on a `Repaired plan:` receipt line; the restore then continues with the task list verbatim. A finding that needs a task renamed, reordered, added, or removed stops before any write with a `Repair stopped:` line. Reconstruction reads task evidence from the union of the working-copy and plan-commit `Files:` paths. New eval target `eval/gauntlet-resume`.
8
+
3
9
  ## v7.10.0 - 2026-10-11
4
10
 
5
11
  ### Changed
package/README.md CHANGED
@@ -87,7 +87,7 @@ pi-gauntlet is **opinionated**: it recommends this pipeline for non-trivial chan
87
87
 
88
88
  ## Handoff and resume
89
89
 
90
- `/skill:gauntlet-handoff` and `/skill:gauntlet-resume` are a pair: cohort's `handoff` skill writes the six flow-agnostic headings, gauntlet-handoff appends `## Process state`, and gauntlet-resume reads the whole brief back. Both gauntlet skills read one grammar file, `skills/gauntlet-resume/reference/brief-contract.md`; the repo validator (`scripts/ci.mjs`) fails if a grammar line appears anywhere else under `skills/`. Requires pi-cohort >= 7.1.0 (the `handoff` skill, [pi-cohort #18](https://github.com/jjuraszek/pi-cohort/issues/18)); on an older pi-cohort, gauntlet-handoff stops before writing. A resume also reads the spec's `**Amend-grant:**` header line and prints `Standing grant active: <sentence>` or `No standing grant.` on the line after its closing line; the brief itself carries no grant.
90
+ `/skill:gauntlet-handoff` and `/skill:gauntlet-resume` are a pair: cohort's `handoff` skill writes the six flow-agnostic headings, gauntlet-handoff appends `## Process state`, and gauntlet-resume reads the whole brief back. Both gauntlet skills read one grammar file, `skills/gauntlet-resume/reference/brief-contract.md`; the repo validator (`scripts/ci.mjs`) fails if a grammar line appears anywhere else under `skills/`. Requires pi-cohort >= 7.1.0 (the `handoff` skill, [pi-cohort #18](https://github.com/jjuraszek/pi-cohort/issues/18)); on an older pi-cohort, gauntlet-handoff stops before writing. A resume also reads the spec's `**Amend-grant:**` header line and prints `Standing grant active: <sentence>` or `No standing grant.` on the line after its closing line; the brief itself carries no grant. On a `plan_check` failure, resume repairs plan citation drift itself (moved anchors, changed literals, file rows that completed tasks deleted) and stops only when a task must change.
91
91
 
92
92
  ### Smoke walkthrough (release-gated)
93
93
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-gauntlet",
3
- "version": "7.10.0",
3
+ "version": "7.10.1",
4
4
  "description": "Opinionated, gated workflow skills, subagent personas, and runtime extensions for the pi coding agent.",
5
5
  "author": "Jacek Juraszek",
6
6
  "type": "module",
@@ -23,7 +23,8 @@ before any tracker mutation; every stop names the offending path, field, or line
23
23
 
24
24
  - Reads: anything.
25
25
  - Writes: `phase_tracker` / `plan_tracker` state after every check passes and every
26
- human question is answered; on the seed route, what `/skill:using-git-worktrees`
26
+ human question is answered; the plan file, only through `reference/brief-contract.md`
27
+ `## Plan repair`; on the seed route, what `/skill:using-git-worktrees`
27
28
  writes. Never a spec copy, rename, or marker commit.
28
29
  - Never: `git worktree add` directly; worktree creation by resume itself only on
29
30
  the seed route, only through `/skill:using-git-worktrees`; infer approval from
@@ -130,7 +130,7 @@ announcement without re-resolving it.
130
130
  |---|---|
131
131
  | brainstorm | `start brainstorm`; `substep` if the brief shows one |
132
132
  | plan | `start brainstorm`; `skip brainstorm S`; `start plan`; `substep` if shown |
133
- | implement | `start brainstorm`; `skip brainstorm S`; `start plan`; `plan_check({ planPath })`; on FAIL print findings and stop with plan in_progress, no init; on PASS `skip plan R`; `start implement`; `substep` if shown; `plan_tracker init` |
133
+ | implement | `start brainstorm`; `skip brainstorm S`; `start plan`; `plan_check({ planPath })`; on FAIL run `## Plan repair`; on PASS `skip plan R`; `start implement`; `substep` if shown; `plan_tracker init` |
134
134
  | verify | as implement through `skip plan R`, then `skip implement R`; `start verify`; `substep` if shown; `plan_tracker init` |
135
135
  | ship | as verify. Restoration stops at verify in_progress: `complete verify` needs a fresh conformance dispatch and `skip verify` would bypass a real gate. Announce that the closure review re-runs before ship |
136
136
 
@@ -141,6 +141,42 @@ spec was added after base or tracked from base (`reconstruction.md` "Candidates"
141
141
  resolve the selected plan to an absolute path under the worktree before `plan_check`.
142
142
  Zero pairs -> stop; more than one -> human picks.
143
143
 
144
+ ## Plan repair
145
+
146
+ Entered from the call table's `implement` row and from `reconstruction.md` "Spec with plan" step 2 when `plan_check` returns FAIL. Inputs: the findings, and the task list with statuses (the brief's, or the confirmed reconstruction snapshot) - read it for evidence, never rewrite it.
147
+
148
+ Record the plan's state before any write: tracked and clean when `git -C <worktree> ls-files --error-unmatch -- <plan path>` exits 0 and `git -C <worktree> status --porcelain -- <plan path>` prints nothing (index and working copy both match HEAD; a staged edit alone makes it dirty); otherwise copy the file to a temp path outside the worktree.
149
+
150
+ Classify every finding against the table by its `check` and `reason`, gathering the row's evidence first. One finding with no row -> stop (below) before any write.
151
+
152
+ | Finding (`check`, `reason`) | Evidence | Edit |
153
+ |---|---|---|
154
+ | `anchor-resolution`, range outside section or line shift | the anchor's heading string matches exactly one current spec heading | set the `**Spec:**` `L<n>-L<m>` range to the current span of that section that holds the task body's existing literals |
155
+ | `quote-integrity`, task-owned row | the row's anchor already resolves (repair anchors first) | add the missing backtick literal to the owning task's body; never replace or remove task text |
156
+ | `quote-integrity`, `Verification`-owned row | as above | add the missing literal to the header `**Verification:**` line |
157
+ | `table-closure`, row anchor not in the owner's `**Spec:**` set | the owner cell names an existing task whose body does the row's requirement | move the row's anchor together with that same owner's `**Spec:**` anchor; the owner cell never changes |
158
+ | `paths-exist`, `Modify: path "<p>" does not exist` | the owning task is `complete` or `skipped` in the task list, and `git -C <worktree> log --diff-filter=D --format=%h -1 -- <p>` is non-empty | drop that `Modify:` row |
159
+ | `paths-exist` or `tests-block`, a `Test:` path that does not exist or a `Tests:` segment not anchored | `git -C <worktree> log --diff-filter=R --format= --name-status -M -1 -- <old> <new>` shows the rename `<old>` -> `<new>` | substitute `<new>` for `<old>` in the `Test:` line and in the `Tests:` command; nothing else in the command changes |
160
+
161
+ Every other `check` (`input`, `placeholder-scan`, `header-entrypoint`, `header-happy-path`, `waiver-literal`, `wave-file-disjointness`, `solo-line`, `internal`) and every reason not listed (a missing `Files:` block, an invalid or empty glob, a missing or ambiguous heading, a `pending`/`in_progress` owner of a dead `Modify:` row, a command broadening) has no row. Task names, count, order, wave membership, `Solo:` lines, the owner column, and task text beyond an added literal or a substituted path never change.
162
+
163
+ Loop: write every classified edit, re-run `plan_check({ planPath })`, classify any new finding the same way; at most 3 rounds.
164
+
165
+ PASS with the plan tracked and clean before the loop -> commit the plan alone:
166
+
167
+ ```bash
168
+ git -C <worktree> add -- <plan path> && git -C <worktree> commit -q -m "resume: plan citation repair - <n> findings" -- <plan path>
169
+ ```
170
+
171
+ The subject is not `amend:`, so `finishing-a-development-branch` Step 4's digest ignores it; a failed commit stops with git's output. PASS with the plan untracked or dirty before the loop -> leave the repair in the working copy; it lands with the next task commit. Then continue the originating route: the call table from `skip plan R`, or reconstruction step 3.
172
+
173
+ Stop (a finding with no row, or a finding surviving the third round): when a round wrote the plan, restore its pre-loop bytes (`git -C <worktree> checkout -- <plan path>` when tracked and clean, else the saved copy) - a stop before the first write runs no git command; print the findings (a dead `Modify:` row prefixed with its owning task, e.g. `Task 5:`), leave `plan` in_progress with no `init`, and print one line:
174
+
175
+ - no row: `Repair stopped: <check> - <reason> is outside citation repair; the plan file is unchanged. Edit the plan (task changes allowed), then re-run /skill:gauntlet-resume.`
176
+ - third round: `Repair stopped: <check> - <reason> survived 3 rounds. Edit the plan, then re-run /skill:gauntlet-resume.`
177
+
178
+ Resume never edits the spec; no Open Question is written.
179
+
144
180
  "Exact" restoration binds: the active phase identity and substep, and the plan task list
145
181
  (names, order, statuses) verbatim. Prior phases show `⊘ (resume: ...)` regardless of the
146
182
  brief's glyph - skip-arming is the mechanism and completing priors would fabricate gated
@@ -161,3 +197,5 @@ Gate history not restored; re-validating `<task>` before any stage advance
161
197
  where `<task>` is the brief's `Active task`, else the first in-progress task, else `none`
162
198
  (whole-deliverable re-validation). Gate history, closure-review evidence, and fix rounds
163
199
  are never inferred or restored; a ship-stage brief resumes at verify.
200
+
201
+ A restore that ran `## Plan repair` prints `Repaired plan: <n> findings (<comma-separated check names, deduplicated>)` on its own line directly before the closing line; the `Standing grant` line (SKILL.md "Post-restore continuation") keeps its place after the closing line. A first-check PASS prints no receipt and makes no commit.
@@ -69,7 +69,11 @@ with this unapproved spec as the draft? Show the spec path (and the brief's
69
69
  Show, and ask the human to confirm or edit both in one reply:
70
70
 
71
71
  1. Per task, in plan order: the commits after the plan commit that touch any path in
72
- the task's declared `Files:` block. Strip a trailing `:digits[-digits]` range from
72
+ the task's declared `Files:` block, taking the union of the block in the working
73
+ copy and in `git -C <worktree> show <plan-commit>:<plan path relative to the worktree>`
74
+ (an object path inside the repository, never the absolute `planPath`; a `Modify:` row
75
+ dropped by `brief-contract.md` "Plan repair" still yields its `complete` evidence).
76
+ Strip a trailing `:digits[-digits]` range from
73
77
  each `Modify:` path before matching `git -C <worktree> log -- <path>`:
74
78
  `git -C <worktree> log --format=%h --oneline <plan-commit>..HEAD -- <path>`.
75
79
  Uncommitted plan (no
@@ -94,7 +98,8 @@ edits override proposals; never rewrite confirmed state silently.
94
98
  After confirmation:
95
99
 
96
100
  1. Run SKILL.md entry check 6 on `<spec path>` (a malformed `**Amend-grant:**` line stops here, no tracker call); then `start brainstorm`; `skip brainstorm resume: <spec path>`; `start plan`.
97
- 2. `plan_check` with `planPath` = the plan's absolute path. FAIL -> print the findings, stop with plan
101
+ 2. `plan_check` with `planPath` = the plan's absolute path. FAIL -> run `brief-contract.md`
102
+ `## Plan repair`; its PASS continues at step 3, its stop ends the restore with plan
98
103
  in_progress, no `init`.
99
104
  3. PASS -> `skip plan` with the same `resume:` reason; for stage verify also
100
105
  `skip implement`; `start <stage>`.