pi-gauntlet 8.2.0 → 8.2.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,9 @@
1
1
  # Changelog
2
2
 
3
+ ## v8.2.1 - 2026-11-06
4
+
5
+ - Shape-ticket's AC integrity gate drops workflow-stage proof after splitting bundled observations, retains retired proof in the Reporter note, and routes an emptied AC list to recovery or park.
6
+
3
7
  ## v8.2.0 - 2026-11-05
4
8
 
5
9
  - Check-delivery accepts explicit ticket sets in pi: fresh `delivery-checker` children verify in parallel after one parent fetch, then the parent gates and writes each ticket in turn. Single-ref behavior stays in-session. Per-ticket consent replaces the single-ticket refusal in Item 3 of the check-delivery consumer-feedback spec.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-gauntlet",
3
- "version": "8.2.0",
3
+ "version": "8.2.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",
@@ -1,6 +1,6 @@
1
1
  # Ticket Handling
2
2
 
3
- A ticket is guidance, not sole truth. Fetch it; propose scope, approach, or acceptance changes when code disagrees, and record deviations in the spec. Carry implied requirements and terms from the ticket body (Context, Problem, Idea) and every `Reporter note:` comment section into the spec as any other requirement; keep the ticket body's explicit acceptance criteria verbatim in the section below. Retain concrete details from a requirement-carrying note (paths, source measurements, preserved entry points) within that requirement in Design, not only in a context or premise note. Preserve a source measurement as a description of the input, not a new target or limit. Extract ACs from the body only, never comments. With no fetch path or a whole-ticket fetch failure, list the unfetched ref and use `none - ticket not fetched (<reason>)` in `## Acceptance criteria`; show that existing `none` line at the gate so the user can paste rows. On body success with comments marked `comments not fetched (<reason>)` or `comments incomplete after page <k> (<reason>)`, retain the fetched AC rows and carry an adjacent gate-summary line: `Implied requirements came from the body only - <comment status>; paste missing comment text.` Continue to the gate without a new stop.
3
+ A ticket is guidance, not sole truth. Fetch it; propose scope, approach, or acceptance changes when code disagrees, and record deviations in the spec. Carry implied requirements and terms from the ticket body (Context, Problem, Idea) and every `Reporter note:` comment section into the spec as any other requirement; keep the ticket body's explicit acceptance criteria verbatim in the section below. Retain concrete details from a requirement-carrying note (paths, source measurements, preserved entry points) within that requirement in Design, not only in a context or premise note. Preserve a source measurement as a description of the input, not a new target or limit. Extract ACs from the body only, never comments. A Reporter note line marked `retired workflow-stage proof:` is provenance of a proof shape-ticket's AC integrity gate dropped, never a Design requirement; every other note requirement carries as above. With no fetch path or a whole-ticket fetch failure, list the unfetched ref and use `none - ticket not fetched (<reason>)` in `## Acceptance criteria`; show that existing `none` line at the gate so the user can paste rows. On body success with comments marked `comments not fetched (<reason>)` or `comments incomplete after page <k> (<reason>)`, retain the fetched AC rows and carry an adjacent gate-summary line: `Implied requirements came from the body only - <comment status>; paste missing comment text.` Continue to the gate without a new stop.
4
4
 
5
5
  **Extract the ticket's ACs.** When the ticket body has a heading matching `/acceptance criteria/i`, every list item under it is an AC (numbered, bullet, or checkbox) until the next heading of that heading's level or higher, and no other list in the body is; a heading one level deeper inside the section is a repo group - it names the repo whose part delivers the rows under it and does not end extraction. When there is no such heading, every top-level checkbox row in the body is an AC, except rows under a `Post-deployment housekeeping`, `Out of scope`, or `Follow-up` heading. Otherwise the ticket has no ACs. A nested list under an AC row rides with its parent as one row; an AC heading holding prose and no list makes each paragraph one row. Carry checked and unchecked rows alike, all written `- [ ]`. Take the rows and their repo-group headings from the gather draft's `## Ticket acceptance criteria (verbatim)` heading; when the ticket was not fetched, the gate summary shows the `none` line so the user can paste the rows, which then become rows.
6
6
 
@@ -21,7 +21,13 @@ Under `Ticket <ref>, <heading or "checkbox list">, rows verbatim:`, the section
21
21
 
22
22
  **Cut question.**
23
23
 
24
- Start the message with `gauntlet: question` alone at column zero on the first physical line, followed by a newline, before premise correction or framing. Never append a colon to the marker. Follow the [first-line rule](menu-layout.md). `deviates:` and `deferred:` come only from the user's answer to this question; never propose one. Ask it, in the questionary format, when the user's prompt or an answer raises dropping or changing a row, or when code, a cited contract, or the user shows a row is wrong or impossible: `A) in-scope - <reading> B) deviates: <why> C) deferred: <where> D) repair the ticket - /skill:shape-ticket <ref> <row and evidence>`, `Recommendation:` A or D with the reason the row ships in this gauntlet; B and C are never recommended. On D, run `/skill:shape-ticket <ref> <row and evidence>` (repair mode per `shape-ticket/SKILL.md:43`, its own confirm gate), then re-fetch the ticket, replace the gather draft's `## Ticket acceptance criteria (verbatim)` block, and re-extract; a cancel at that gate returns to this question with the row unchanged. Carry the full question and the user's answer of every question that offered a disposition into the council's `Human input` block. The gate lists every `deferred:`, `deviates:`, and `venue:` row on its `Scope cuts:` line (`spec-finalization.md`). A disposition changes in any later phase - a reviewer finding `recommended: rescope` at the finish gate, a wrong row noticed mid-implementation, or a ticket edited after approval when the user asks - through [Amending an approved spec](../SKILL.md#amending-an-approved-spec) (`amendment-surface.md`); the row text still never changes. For ticket rows, preserve the ticket contract: Never author acceptance criteria on the ticket's behalf; that is `/skill:shape-ticket`'s job.
24
+ Start the message with `gauntlet: question` alone at column zero on the first physical line, followed by a newline, before premise correction or framing. Never append a colon to the marker. Follow the [first-line rule](menu-layout.md). `deviates:` and `deferred:` come only from the user's answer to this question; never propose one. Ask it, in the questionary format, on any trigger in the table below, with the options `A) in-scope - <reading> B) deviates: <why> C) deferred: <where> D) repair the ticket - /skill:shape-ticket <ref> <row and evidence>` and the table's `Recommendation:`; B and C are never recommended. On D, run `/skill:shape-ticket <ref> <row and evidence>` (repair mode per `shape-ticket/SKILL.md:43`, its own confirm gate), then re-fetch the ticket, replace the gather draft's `## Ticket acceptance criteria (verbatim)` block, and re-extract; on a cancel at that gate or an initial ticket-read abort, return to this question with the row unchanged and report no repair. Carry the full question and the user's answer of every question that offered a disposition into the council's `Human input` block. The gate lists every `deferred:`, `deviates:`, and `venue:` row on its `Scope cuts:` line (`spec-finalization.md`). A disposition changes in any later phase - a reviewer finding `recommended: rescope` at the finish gate, a wrong row noticed mid-implementation, or a ticket edited after approval when the user asks - through [Amending an approved spec](../SKILL.md#amending-an-approved-spec) (`amendment-surface.md`); the row text still never changes. For ticket rows, preserve the ticket contract: Never author acceptance criteria on the ticket's behalf; that is `/skill:shape-ticket`'s job.
25
+
26
+ | Trigger | Screened | Recommendation |
27
+ |---|---|---|
28
+ | The user's prompt or an answer raises dropping or changing a row | When raised | A or D with the reason the row ships in this gauntlet |
29
+ | Code, a cited contract, or the user shows a row is wrong or impossible | When shown | A or D with the reason the row ships in this gauntlet |
30
+ | An observation in a ticket row is a workflow-stage proof under `shape-ticket/SKILL.md` `## AC integrity gate` (read that table at first use; a read, never a `/skill:shape-ticket` invocation) - the row as a whole or a stage-only clause beside a behavior; a row whose CI or suite result is itself the behavior under change is not one | The draft's verbatim block at checklist step 4, before question one, after the framing check; pasted rows when they land at the gate. Ask as the first ordinary question - after the framing question when a concern exists, else after the holds-statement. Never edit or split the ticket row; the intact row goes to the question | D - a stage proof is not an outcome |
25
31
 
26
32
  ## Row production at spec-writing
27
33
 
@@ -48,6 +54,7 @@ Apply these integrity classes inline without invoking ticket shaping. Preserve e
48
54
  | Unspecified-but-binding | Resolve the value from Design and record the resolution there; ask the user for a missing value |
49
55
  | External-input | Ask the user for the external yardstick before writing |
50
56
  | Post-deployment | Rewrite to a pre-production observation when available, retaining `venue:`; move production-only observations to a tracked, non-blocking `Post-deployment housekeeping` Design clause, never an AC row |
57
+ | Workflow-stage proof | Before drafting, read `shape-ticket/SKILL.md` `## AC integrity gate` at first use and leave stage-only validation material (a suite command, a CI or workflow result, a PR state, a merge) out of the row set - it is proof, not an outcome, so no row is drafted and no scope decision is involved. For a row already drafted with that proof, keep its committed outcome and rewrite the proof to the Design behavior; delete the row only after its Design commitment is cut through the user's scope-decision procedure |
51
58
 
52
59
  Preserve behavioral binary outcomes with setup, action, and expected result; require no invented numeric baseline. Use only design-sourced values; never invent a baseline, target, measurement, or enumerated set. Ask for missing inputs before writing; never silently remove an outcome. Let an outcome leave in-scope only through an explicit scope decision by the user (the cut question or a clarification answer); record `deviates:`/`deferred:` and an `## Out of scope` entry so `Scope cuts:` discloses it. With no valid row remaining, stop for clarification or an explicit scope decision before writing; never emit a `none` fallback.
53
60
 
@@ -104,7 +104,7 @@ Exempt one deletion-safe rule-7 pointer per failure, rule-5 one-sentence/one-num
104
104
 
105
105
  For ordinary repair only, if the body already conforms AND the metadata audit is clean AND no comment is proposed AND the audit carries no obsolete line: report "conforms, no changes proposed" and stop. No write, no confirmation prompt, no roast. A conforming ticket without an obsolete line never pays for a roast dispatch; the gather audit already ran and its Audit lines ride on the no-op report. Treat the obsolete line and other draft-changing audit findings under `reference/repo-audit.md` as non-conforming; quiet findings alone keep the no-op. A conforming body with pending overflow still reaches the gate.
106
106
 
107
- "Conforms" includes the ticket wording contract (`reference/ticket-wording.md`, resolved against this skill's own directory), applied inline as a short checklist over Context/Problem/Idea: strip test passes (rule 2)? plain-words lead per asserted failure (rule 4)? example or `none (<reason>)` per failure (rule 5)? repo-native terms defined or dropped and requester-used terms left undefined under rule 6's attribution test? Idea within one attributed sketch line? Context/Problem free of step-5 closed-list matches? references parenthetical and deletion-safe (rule 7)? links summarized, no spiderman hops (rule 8, with the named example serving as a source footer's summary)? every gathered URL, attachment, or pasted screenshot is carried in a source: footer under its example (Evidence gate carry rule)? every non-discovery Problem example has a source: footer (Evidence gate gap rule)? Any "no" makes the body non-conforming: repair proposes a rewrite through the normal draft -> gates -> roast -> gate path instead of reporting "conforms" - the contract-briefed roast backstops this inline judgment. Route each failure through draft -> step 5 -> roast -> old/new gate, with a new comment for newly displaced detail. For a conformance-only rewrite with no audit or uniqueness change to AC text, rows, or groups, touch Context/Problem/Idea prose only: copy the original bytes under the AC heading unchanged and compare bytes before presenting the gate; any mismatch stops that ticket. Any AC text, row, or group change from audit or uniqueness instead takes substantive full-replacement repair with `- [ ]` normalization; retain displaced text verbatim in the Reporter note. Check source carrying for every title; check source gaps only for non-discovery bodies. Preserve existing `source:` lines verbatim. For missing-footer-only repair, add only the footer under step 8 and leave existing prose and AC bytes unchanged; never report "conforms, no changes proposed".
107
+ "Conforms" includes the ticket wording contract (`reference/ticket-wording.md`, resolved against this skill's own directory), applied inline as a short checklist over Context/Problem/Idea: strip test passes (rule 2)? plain-words lead per asserted failure (rule 4)? example or `none (<reason>)` per failure (rule 5)? repo-native terms defined or dropped and requester-used terms left undefined under rule 6's attribution test? Idea within one attributed sketch line? Context/Problem free of step-5 closed-list matches? references parenthetical and deletion-safe (rule 7)? links summarized, no spiderman hops (rule 8, with the named example serving as a source footer's summary)? every gathered URL, attachment, or pasted screenshot is carried in a source: footer under its example (Evidence gate carry rule)? every non-discovery Problem example has a source: footer (Evidence gate gap rule)? Any "no" makes the body non-conforming: repair proposes a rewrite through the normal draft -> gates -> roast -> gate path instead of reporting "conforms" - the contract-briefed roast backstops this inline judgment. Route each failure through draft -> step 5 -> roast -> old/new gate, with a new comment for newly displaced detail. For a conformance-only rewrite with no audit or uniqueness change to AC text, rows, or groups, touch Context/Problem/Idea prose only: copy the original bytes under the AC heading unchanged and compare bytes before presenting the gate; any mismatch stops that ticket. Any AC text, row, or group change from audit, uniqueness, or the AC integrity gate (a drop or a relocation) instead takes substantive full-replacement repair with `- [ ]` normalization; retain displaced text verbatim in the Reporter note. Check source carrying for every title; check source gaps only for non-discovery bodies. Preserve existing `source:` lines verbatim. For missing-footer-only repair, add only the footer under step 8 and leave existing prose and AC bytes unchanged; never report "conforms, no changes proposed".
108
108
 
109
109
  ### 7 - Roast
110
110
 
@@ -168,12 +168,13 @@ The test is structural, not keyword-based:
168
168
  | Unspecified-but-binding | closure-gating word with no value ("acceptable latency") | file allowed, **park** in the tracker's not-ready state, missing value named |
169
169
  | External-input dependency | yardstick another party must hand over first | **park**, blocker named; if resolving it is the assignee's own work, stays ready (over-fire guard) |
170
170
  | Post-deployment | observable only with the change live in production | **relocate** to Post-deployment housekeeping, non-blocking; never an AC |
171
+ | Workflow-stage proof | sole observable is a delivery-pipeline stage - a CI or workflow run result, a pull request's state or review, a merge, or a full verification-suite run - not a behavior of the change | **drop**; retain the row's text in the Reporter note as `retired workflow-stage proof: <row text>`. Label every retained original containing a dropped stage clause, including AC uniqueness's split-row copy, with `retired workflow-stage proof:`; leave no unmarked duplicate. Remove only stage-proof rows or clauses. For this drop, copy surviving behavior text and untouched rows byte-for-byte even in substantive full-replacement repair; normalize checkbox syntax, not wording or setup/action framing |
171
172
 
172
- Precedence when one AC has multiple defects: wishful/tautological first (hard stop); then unspecified/external-input (park); a clean condition that is merely prod-only relocates. Hard-stop output quotes the offending AC, names the class, and gives concrete ways out.
173
+ Precedence when one AC has multiple defects: wishful/tautological first (hard stop); then unspecified/external-input (park); a clean condition that is merely prod-only relocates; one that is only a stage proof drops. Hard-stop output quotes the offending AC, names the class, and gives concrete ways out.
173
174
 
174
175
  **Hard-stop run semantics:** apply the gathered overlap reference's independent alternative gates for overlap only. Apply ordinary repair hard-stop locality only across tickets in a batch: within one ticket, any surviving wishful/tautological AC stops that whole ticket's body and comment writes, with no approval option; for a singleton this stops the entire run. A source-ticket split remains all-or-nothing across its N bodies. Present the stopped draft and report in its turn without an approval option. Values supplied in-session recover only that ticket: re-draft, re-gate, and re-present its own exact diff for approval, never attach it to prior approval. Never silently write minus offending ACs.
175
176
 
176
- **Deploy-window rule.** Every AC must be fulfillable **before production deployment**. Local, UAT, staging, and experimental proofs with representative data are equal; an AC row names setup, action, and observable result and never names an environment - the spec picks the venue. Prod-only observations (backfills, post-release monitoring, prod smoke checks) go to `Post-deployment housekeeping` - tracked, explicitly non-blocking, never ACs. If relocation empties the AC list, that is the no-AC failure: recover a real pre-prod AC or park the ticket.
177
+ **Deploy-window rule.** Every AC must be fulfillable **before production deployment**. Local, UAT, staging, and experimental proofs with representative data are equal; an AC row names setup, action, and observable result and never names an environment - the spec picks the venue. Prod-only observations (backfills, post-release monitoring, prod smoke checks) go to `Post-deployment housekeeping` - tracked, explicitly non-blocking, never ACs. If relocation or a stage-proof drop empties the AC list, that is the no-AC failure: recover a real pre-prod AC or park the ticket.
177
178
 
178
179
  **Guards:** never invent a number, list, label, or URL to pass a gate - `none (<reason>)` is a valid explicit outcome. Speculative items go to `Out of scope / Follow-up`, offered as separate linked tickets. Implicit constraints surfaced during gather are **proposed** as ACs at the gate, never silently auto-written.
179
180
 
@@ -19,6 +19,11 @@ Read this when applying the AC integrity gate (drafting, repairing, or adjudicat
19
19
  - Bad: `- [ ] Import completes in acceptable time`
20
20
  - Good: `- [ ] Importing a 10k-row CSV completes in under 60s`
21
21
 
22
+ **Workflow-stage proof**
23
+
24
+ - Bad: `- [ ] The importer rejects a row without an id and CI is green on the PR head`
25
+ - Good: `- [ ] The importer rejects a row without an id` (the CI result is the PR gate's observation, not an outcome)
26
+
22
27
  **Discovery pair** (bad ticket -> good ticket, not just a bad->good AC)
23
28
 
24
29
  - Bad ticket: `Investigate checkout performance` - unbounded, no artifact.