pi-gauntlet 4.6.0 → 4.6.2
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 +22 -0
- package/extensions/phase-tracker.ts +3 -9
- package/package.json +1 -1
- package/skills/finishing-a-development-branch/SKILL.md +2 -41
- package/skills/finishing-a-development-branch/reference/disposition-protocol.md +46 -0
- package/skills/verification-before-completion/reference/conformance-check.md +19 -12
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## v4.6.2 - 2026-08-07
|
|
4
|
+
|
|
5
|
+
Trim the always-shipped tool descriptions of the gauntlet-internal tools to
|
|
6
|
+
one-liners: `gauntlet_setting` -> "Resolve merged piGauntlet.* settings (repo
|
|
7
|
+
over preset); for skill use only.", `phase_tracker` -> phase arrow + "ad-hoc
|
|
8
|
+
calls do not arm gates. Not for ad-hoc use." Every call site is a skill body
|
|
9
|
+
already in context, so the cut prose was pure duplication (~120-200
|
|
10
|
+
tokens/request). Parameter schemas/descriptions and `plan_tracker` (whose long
|
|
11
|
+
description deters ambient TODO-list misuse) are untouched.
|
|
12
|
+
|
|
13
|
+
## v4.6.1 - 2026-08-04
|
|
14
|
+
|
|
15
|
+
Lazy-load the conformance disposition protocol (#5). The carried-open disposition
|
|
16
|
+
grammar (dense render, response grammar, execute order) moves out of
|
|
17
|
+
`finishing-a-development-branch/SKILL.md` Step 3.5 into a new GAPS-only
|
|
18
|
+
`reference/disposition-protocol.md`, so the common CONFORMS fast path no longer
|
|
19
|
+
pays that grammar's token cost. The human decision menu and the CONFORMS/summary
|
|
20
|
+
render stay inline. Byte-for-byte relocation, behavior unchanged. Also
|
|
21
|
+
single-sources the `maxFixRounds: 0` / precondition-unavailable carry-OPEN rule
|
|
22
|
+
in `conformance-check.md` (one authoritative statement plus four
|
|
23
|
+
back-references), retaining every distinct contract.
|
|
24
|
+
|
|
3
25
|
## v4.6.0 - 2026-07-30
|
|
4
26
|
|
|
5
27
|
Default supersession marking (#4). When a new spec replaces a known predecessor,
|
|
@@ -561,11 +561,7 @@ export default function (pi: ExtensionAPI) {
|
|
|
561
561
|
pi.registerTool({
|
|
562
562
|
name: "gauntlet_setting",
|
|
563
563
|
label: "Gauntlet Setting",
|
|
564
|
-
description:
|
|
565
|
-
"Gauntlet-internal, invoked by skills: resolve a merged piGauntlet.* setting " +
|
|
566
|
-
"(repo .pi/settings.json over the agent preset). Returns the resolved value as a " +
|
|
567
|
-
"JSON block in the result content - specCouncil yields the council-vs-worker verdict, " +
|
|
568
|
-
"closureReview yields the conformance-gate model/enforce/maxFixRounds. Not for ad-hoc use.",
|
|
564
|
+
description: "Resolve merged piGauntlet.* settings (repo over preset); for skill use only.",
|
|
569
565
|
parameters: GauntletSettingParams,
|
|
570
566
|
async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
|
|
571
567
|
const { gauntlet, errors } = loadGauntletSettings(ctx.cwd);
|
|
@@ -584,10 +580,8 @@ export default function (pi: ExtensionAPI) {
|
|
|
584
580
|
name: "phase_tracker",
|
|
585
581
|
label: "Phase Tracker",
|
|
586
582
|
description:
|
|
587
|
-
"Track workflow phase progress (brainstorm → plan → implement → verify → ship)
|
|
588
|
-
"
|
|
589
|
-
"skip (mark phase skipped with reason), status (show all phases), reset (clear all phases), substep (set/clear a substep label on an in_progress phase). " +
|
|
590
|
-
"Drives gauntlet-flow enforcement entered via brainstorming; the closure gate, closure-model guard, and flow guards arm only when brainstorming started the flow. Ad-hoc start verify/start implement calls do not arm the gates. Not for ad-hoc use.",
|
|
583
|
+
"Track workflow phase progress (brainstorm → plan → implement → verify → ship); " +
|
|
584
|
+
"ad-hoc calls do not arm gates. Not for ad-hoc use.",
|
|
591
585
|
parameters: PhaseTrackerParams,
|
|
592
586
|
|
|
593
587
|
async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
|
package/package.json
CHANGED
|
@@ -88,17 +88,7 @@ Closure / conformance: CONFORMS
|
|
|
88
88
|
|
|
89
89
|
then continue directly to Step 4. No approval prompt, no menu, no shared options line, no sign-off. If the run auto-applied fixes, surface the flat `auto-applied fix commits: <Gn: SHA>, ...` index from the durable block as **one informational, non-blocking line** with a one-line revert offer (see "Revert semantics") - a gap that auto-converged mid-verify has no bullet, so this index is the only place its fix commit stays revertable. Do not wait for acknowledgment.
|
|
90
90
|
|
|
91
|
-
**Carried-open
|
|
92
|
-
|
|
93
|
-
Each bullet:
|
|
94
|
-
|
|
95
|
-
`* <handle> - <plain title>: <what's unresolved, one clause>. <short question> Recommended: <choice> (<one-clause why>).`
|
|
96
|
-
|
|
97
|
-
- `<handle>` leads the bullet and is a short unique human word derived from the title (`Cache coverage` -> `cache`); on collision append a digit. It is the token option 2 targets. When a gap split and no clean word fits, use the bare `Gn/Cn`; a single-concern gap uses its gap ID `Gn`.
|
|
98
|
-
- The shared options line sits below the bullets: `Other options per item: fix-now / accept / rescope / follow-up / custom`, listing the options **generally available across items**. When a specific item's availability deviates - an option unavailable for it, or an `UNAUTHORIZED` item whose `rescope` is unavailable and whose `fix-now` means removal - note that deviation as a short parenthetical on **that item's bullet** (one clause, not a block), e.g. `(rescope N/A: scope creep)`. The shared line appears **only in the carried-open render**, never in the zero-gap path. Full per-option effects only on request, or when option 2 targets an unclear choice.
|
|
99
|
-
- Group items under one recommended line only when they share a disposition and rationale; each grouped handle repeats its title.
|
|
100
|
-
- Availability per concern comes from the reference's single availability table - apply it against current context (worktree state, `maxFixRounds`, ownership, resource accessibility), do not restate it. `UNAUTHORIZED` bullets ask the reference's question verbatim (`Should this unrequested behavior become part of the current workflow?`); `rescope-into-spec` is shown **unavailable** (not dropped) and `fix-now` means **removal** of the unrequested code.
|
|
101
|
-
- `revert conformance fix Gn`, when the gap has an auto-applied fix, renders on the shared options line as a **separate one-off action** - never inside a bullet's recommendation and never in the option-2 list. Name the parent gap and warn that revert undoes the entire gap-level commit (see "Revert semantics").
|
|
91
|
+
**Carried-open (`status: GAPS (N open)`).** Read `reference/disposition-protocol.md` and follow it for the carried-open render (dense) grammar, the response grammar, and the 9-step execute order. Render the human decision menu in the shape below, drive the dispositions per that reference, then print the summary render and continue to Step 4. If that reference file cannot be read, stop and surface a blocking error — do **not** improvise the grammar from memory.
|
|
102
92
|
|
|
103
93
|
Representative carried-open render (multi-concern gap split to `e2e`; single-concern gap `cache`; `UNAUTHORIZED` gap `auth`):
|
|
104
94
|
|
|
@@ -119,36 +109,7 @@ Other options per item: fix-now / accept / rescope / follow-up / custom.
|
|
|
119
109
|
|
|
120
110
|
A single-concern render is identical minus the split: one bullet whose handle is the gap ID or word, no sibling.
|
|
121
111
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
```
|
|
125
|
-
1 -> apply every recommendation
|
|
126
|
-
2: cache=follow-up
|
|
127
|
-
2: e2e=custom(open ticket after image lands), cache=follow-up
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
- `1` (or `apply recommended`) applies all recommendations.
|
|
131
|
-
- `2:` takes a comma-separated override list, each `<handle>=<choice>`; omitted items keep their recommendation. A handle may appear at most once (repeat = invalid).
|
|
132
|
-
- `custom(<concrete effect>)` supplies an inline effect. Manual fix-in-place is expressed only as `custom(...)` where isolated `fix-now` is unavailable.
|
|
133
|
-
- `recommended: none` items follow the reference's preflight (linked, not restated): the item needs a `<handle>=custom(...)` decision, and option 1 is withheld until every open item has an executable recommendation; after the custom decision the menu re-renders for the remainder.
|
|
134
|
-
- `revert conformance fix Gn` is a valid standalone reply, mutually exclusive with `1` and `2:`; it never appears inside a `2:` override list.
|
|
135
|
-
- Invalid handle or choice -> focused reprompt naming only that item, retaining every valid pick and never reopening the gate. Unknown token: list the valid titled handles. Known item, bad choice: repeat its title + its available choices.
|
|
136
|
-
|
|
137
|
-
#### Execute order
|
|
138
|
-
|
|
139
|
-
Take **no** disposition action before the reply. Then, once, in order:
|
|
140
|
-
|
|
141
|
-
1. **Normalize** every `custom(...)` into explicit operations; classify state-changing (edits code or spec) vs not. Clarify only an ambiguous or unexecutable effect.
|
|
142
|
-
2. **Commit spec edits** (`accept-into-spec`, `rescope-into-spec`, state-changing spec `custom`) - the main session edits the spec directly, before any fix dispatch (a dirty tree rejects `worktree: true`, and the re-audit must read the amended spec).
|
|
143
|
-
3. **Re-audit if step 2 changed the spec**; regenerate the inventory and re-render if it changed. Project `fix-now` only from the refreshed inventory.
|
|
144
|
-
4. **fix-now + code-changing custom:** project the selected concerns per gap into the reference's concern-scoped fix contract (excluding accepted/rescoped/followed-up siblings); run the reference "Fix loop" (unchanged - do not re-describe it). A code-changing `custom` runs the project's tests + `code-reviewer` on its delta before proceeding. Re-run Step 1's canonical tests.
|
|
145
|
-
5. **Re-audit after all state-changing work;** obtain fresh decisions **only if** the refreshed inventory differs from the approved one, else proceed.
|
|
146
|
-
6. **follow-up** from the current inventory: create the item via the project's issue-tracker convention (`.pi/gauntlet-overrides.md`), record the ticket ID/URL; on failure keep the concern open.
|
|
147
|
-
7. **Non-state-changing custom:** execute and record the result.
|
|
148
|
-
8. **revert** (`revert conformance fix Gn`): light-revert the indexed commit, re-run Step 1's canonical tests; on failure stop; on pass re-audit and regenerate.
|
|
149
|
-
9. Re-enter Step 3.5 with the re-audited block if any concern remains open.
|
|
150
|
-
|
|
151
|
-
Record every final disposition with its **stable ID** as `Gn/Cn - <title>: <disposition>` (or `Gn - <title>: <disposition>` for a single-concern gap) - ticket ID/URL for `follow-up`, result for `custom`; never relabel a `custom` result as a recommendation. This durable record is the machine/audit surface; the interactive render stays handle-based. Then continue to Step 4:
|
|
112
|
+
Execute the chosen dispositions per `reference/disposition-protocol.md` (Execute order), then print the closure summary and continue to Step 4:
|
|
152
113
|
|
|
153
114
|
```
|
|
154
115
|
Closure / conformance: CONFORMS
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Carried-open disposition protocol
|
|
2
|
+
|
|
3
|
+
Consumed by `finishing-a-development-branch` Step 3.5 on the **GAPS branch only** — the CONFORMS fast path never reads this file. Antecedent map for the relocated grammar below: "the reference" = `../../verification-before-completion/reference/conformance-check.md` (canonical for the availability table, the `UNAUTHORIZED` question, the `recommended: none` preflight, the freshness rule, and the concern-scoped fix projection); "Revert semantics", "the zero-gap path", and every `Step N` (`Step 1`, `Step 3.5`, `Step 4`) reference = `../SKILL.md`.
|
|
4
|
+
|
|
5
|
+
**Carried-open render (dense).** Read the `## Closure / conformance` block. Render a header with the decision count, one bullet per decision unit (a gap by default; a `Gn/Cn` concern only where the reference split it), then the shared options line, then the recommended-set reply. Never show durable-card internals (ownership, evidence tokens, identity, hashes) in the render.
|
|
6
|
+
|
|
7
|
+
Each bullet:
|
|
8
|
+
|
|
9
|
+
`* <handle> - <plain title>: <what's unresolved, one clause>. <short question> Recommended: <choice> (<one-clause why>).`
|
|
10
|
+
|
|
11
|
+
- `<handle>` leads the bullet and is a short unique human word derived from the title (`Cache coverage` -> `cache`); on collision append a digit. It is the token option 2 targets. When a gap split and no clean word fits, use the bare `Gn/Cn`; a single-concern gap uses its gap ID `Gn`.
|
|
12
|
+
- The shared options line sits below the bullets: `Other options per item: fix-now / accept / rescope / follow-up / custom`, listing the options **generally available across items**. When a specific item's availability deviates - an option unavailable for it, or an `UNAUTHORIZED` item whose `rescope` is unavailable and whose `fix-now` means removal - note that deviation as a short parenthetical on **that item's bullet** (one clause, not a block), e.g. `(rescope N/A: scope creep)`. The shared line appears **only in the carried-open render**, never in the zero-gap path. Full per-option effects only on request, or when option 2 targets an unclear choice.
|
|
13
|
+
- Group items under one recommended line only when they share a disposition and rationale; each grouped handle repeats its title.
|
|
14
|
+
- Availability per concern comes from the reference's single availability table - apply it against current context (worktree state, `maxFixRounds`, ownership, resource accessibility), do not restate it. `UNAUTHORIZED` bullets ask the reference's question verbatim (`Should this unrequested behavior become part of the current workflow?`); `rescope-into-spec` is shown **unavailable** (not dropped) and `fix-now` means **removal** of the unrequested code.
|
|
15
|
+
- `revert conformance fix Gn`, when the gap has an auto-applied fix, renders on the shared options line as a **separate one-off action** - never inside a bullet's recommendation and never in the option-2 list. Name the parent gap and warn that revert undoes the entire gap-level commit (see "Revert semantics").
|
|
16
|
+
|
|
17
|
+
#### Response grammar
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
1 -> apply every recommendation
|
|
21
|
+
2: cache=follow-up
|
|
22
|
+
2: e2e=custom(open ticket after image lands), cache=follow-up
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
- `1` (or `apply recommended`) applies all recommendations.
|
|
26
|
+
- `2:` takes a comma-separated override list, each `<handle>=<choice>`; omitted items keep their recommendation. A handle may appear at most once (repeat = invalid).
|
|
27
|
+
- `custom(<concrete effect>)` supplies an inline effect. Manual fix-in-place is expressed only as `custom(...)` where isolated `fix-now` is unavailable.
|
|
28
|
+
- `recommended: none` items follow the reference's preflight (linked, not restated): the item needs a `<handle>=custom(...)` decision, and option 1 is withheld until every open item has an executable recommendation; after the custom decision the menu re-renders for the remainder.
|
|
29
|
+
- `revert conformance fix Gn` is a valid standalone reply, mutually exclusive with `1` and `2:`; it never appears inside a `2:` override list.
|
|
30
|
+
- Invalid handle or choice -> focused reprompt naming only that item, retaining every valid pick and never reopening the gate. Unknown token: list the valid titled handles. Known item, bad choice: repeat its title + its available choices.
|
|
31
|
+
|
|
32
|
+
#### Execute order
|
|
33
|
+
|
|
34
|
+
Take **no** disposition action before the reply. Then, once, in order:
|
|
35
|
+
|
|
36
|
+
1. **Normalize** every `custom(...)` into explicit operations; classify state-changing (edits code or spec) vs not. Clarify only an ambiguous or unexecutable effect.
|
|
37
|
+
2. **Commit spec edits** (`accept-into-spec`, `rescope-into-spec`, state-changing spec `custom`) - the main session edits the spec directly, before any fix dispatch (a dirty tree rejects `worktree: true`, and the re-audit must read the amended spec).
|
|
38
|
+
3. **Re-audit if step 2 changed the spec**; regenerate the inventory and re-render if it changed. Project `fix-now` only from the refreshed inventory.
|
|
39
|
+
4. **fix-now + code-changing custom:** project the selected concerns per gap into the reference's concern-scoped fix contract (excluding accepted/rescoped/followed-up siblings); run the reference "Fix loop" (unchanged - do not re-describe it). A code-changing `custom` runs the project's tests + `code-reviewer` on its delta before proceeding. Re-run Step 1's canonical tests.
|
|
40
|
+
5. **Re-audit after all state-changing work;** obtain fresh decisions **only if** the refreshed inventory differs from the approved one, else proceed.
|
|
41
|
+
6. **follow-up** from the current inventory: create the item via the project's issue-tracker convention (`.pi/gauntlet-overrides.md`), record the ticket ID/URL; on failure keep the concern open.
|
|
42
|
+
7. **Non-state-changing custom:** execute and record the result.
|
|
43
|
+
8. **revert** (`revert conformance fix Gn`): light-revert the indexed commit, re-run Step 1's canonical tests; on failure stop; on pass re-audit and regenerate.
|
|
44
|
+
9. Re-enter Step 3.5 with the re-audited block if any concern remains open.
|
|
45
|
+
|
|
46
|
+
Record every final disposition with its **stable ID** as `Gn/Cn - <title>: <disposition>` (or `Gn - <title>: <disposition>` for a single-concern gap) - ticket ID/URL for `follow-up`, result for `custom`; never relabel a `custom` result as a recommendation. This durable record is the machine/audit surface; the interactive render stays handle-based. Then continue to Step 4:
|
|
@@ -103,8 +103,11 @@ No prompt, no menu: this partition is deterministic and exhaustive.
|
|
|
103
103
|
3. **Every remaining `PARTIAL`/`MISSING`/`DRIFTED` gap**:
|
|
104
104
|
- `recommended: fix` → auto-run the fix loop below — **unless a declared
|
|
105
105
|
fix-loop precondition is unavailable** (`maxFixRounds: 0`, or no eligible
|
|
106
|
-
named-branch worktree), in which case carry the gap **OPEN**
|
|
107
|
-
|
|
106
|
+
named-branch worktree), in which case carry the gap **OPEN** and defer it
|
|
107
|
+
to the finish gate. This is the authoritative statement of the
|
|
108
|
+
precondition-unavailable carry-OPEN rule; the fix-loop precondition, the
|
|
109
|
+
`maxFixRounds: 0` note, the availability table, and the closure section
|
|
110
|
+
below all reference it.
|
|
108
111
|
- `recommended: accept` or `recommended: rescope` → carry the gap **OPEN**,
|
|
109
112
|
deferred to the finish gate. Do not apply a spec edit here — the finish
|
|
110
113
|
gate owns disposition of deferred gaps.
|
|
@@ -131,7 +134,8 @@ Only the fan-out/integrate/review shape and `plan_tracker` are reused.
|
|
|
131
134
|
**Precondition — worktree required.** The loop needs a worktree HEAD to branch
|
|
132
135
|
fixes from. On the ad-hoc `finishing-a-development-branch` paths that run in a
|
|
133
136
|
normal repo (`GIT_DIR == GIT_COMMON`) or detached HEAD, there is no such HEAD:
|
|
134
|
-
skip this loop
|
|
137
|
+
skip this loop and carry every `fix` gap OPEN per the precondition-unavailable
|
|
138
|
+
carry-OPEN rule in the partition step above, resolving it at finish via the
|
|
135
139
|
canonical Disposition catalog and availability table below. `fix-now` is
|
|
136
140
|
unavailable there; any other disposition is offered only when its table
|
|
137
141
|
prerequisites hold.
|
|
@@ -184,11 +188,13 @@ Commit each per-gap fix with the message **`conformance fix Gn`** (durable,
|
|
|
184
188
|
`git log`-readable pre-squash) so the finish gate and any revert can identify
|
|
185
189
|
auto-applied fixes.
|
|
186
190
|
|
|
187
|
-
**`maxFixRounds: 0`**: skip this loop entirely
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
191
|
+
**`maxFixRounds: 0`**: skip this loop entirely; every `recommended: fix` gap is
|
|
192
|
+
carried OPEN to the finish gate per the precondition-unavailable
|
|
193
|
+
carry-OPEN rule in the partition step above. The load-bearing distinction here
|
|
194
|
+
is opted-out vs. exhausted: `maxFixRounds: 0` means the user opted out of
|
|
195
|
+
auto-fix, so treat `fix` gaps like any other deferred gap — unlike a cap > 0
|
|
196
|
+
that is *exhausted*, which escalates mid-verify because the loop tried and
|
|
197
|
+
could not converge.
|
|
192
198
|
|
|
193
199
|
### `spec-reviewer` gap-block reference contract
|
|
194
200
|
|
|
@@ -284,7 +290,9 @@ prerequisite. `touched-files: unknown` makes `fix-now` unavailable until
|
|
|
284
290
|
ownership is established. A normal checkout (`GIT_DIR == GIT_COMMON`) or detached
|
|
285
291
|
HEAD cannot dispatch the isolated fix loop at all - it has no named-branch
|
|
286
292
|
worktree to branch fixes from - so `fix-now` stays unavailable there regardless
|
|
287
|
-
of ownership;
|
|
293
|
+
of ownership; those `fix` gaps are carried OPEN per the precondition-unavailable
|
|
294
|
+
carry-OPEN rule in the partition step above and resolved manually at finish.
|
|
295
|
+
`maxFixRounds: 0`
|
|
288
296
|
(audit-only) likewise leaves `fix-now` visible but unavailable — the user
|
|
289
297
|
configured no auto-fix loop, and finish-time selection never bypasses or resets
|
|
290
298
|
that cap; a concrete `custom`/manual-fix disposition remains possible. `UNAUTHORIZED` cards
|
|
@@ -340,9 +348,8 @@ Emit this block in the verify completion summary. It is the durable handoff
|
|
|
340
348
|
`finishing-a-development-branch` Step 3.5 consumes — parseable even if session
|
|
341
349
|
context was pruned. Verify completes when every gap is either fixed
|
|
342
350
|
(`CONFORMS`) or carried OPEN as a deferred gap - `accept`/`rescope`/`UNAUTHORIZED`,
|
|
343
|
-
or a `recommended: fix` gap carried
|
|
344
|
-
|
|
345
|
-
named-branch worktree - normal checkout / detached HEAD). Escalation - a started
|
|
351
|
+
or a `recommended: fix` gap carried OPEN per the precondition-unavailable
|
|
352
|
+
carry-OPEN rule in the partition step above (the loop never started). Escalation - a started
|
|
346
353
|
positive-cap loop that exhausted its rounds or blocked/failed with an open `fix`
|
|
347
354
|
gap - is the one non-completing terminal state; the precondition-unavailable
|
|
348
355
|
carried-open `fix` state is valid closure inventory, not escalation.
|