pi-gauntlet 7.23.0 → 7.24.0
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,16 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## v7.24.0 - 2026-10-21
|
|
4
|
+
|
|
5
|
+
### Changed
|
|
6
|
+
|
|
7
|
+
- **shape-ticket bodies are written for a product owner, not an implementer.** The reader is someone who knows the product and its customers but has never opened the repo: examples are one sentence or one number per failure, Context carries only the trigger and what exists today, repo-native terms are defined at first use or dropped while requester terms stay undefined, and the Idea keeps one attributed sketch line. A closed-list step-5 gate moves paths, identifiers, sizes, line counts, lists, code blocks, and Idea overflow verbatim into the gated `Reporter note:` comment - never dropped, and never the plain-words cause-and-effect sentence a triager needs. Repair mode treats an overflowing Idea as non-conforming (body rewrite plus a new note, AC section byte-identical), and the roast brief names the bounds and protects the plain-words lead from being cut. (#75)
|
|
8
|
+
- **brainstorming reads the Reporter note.** The gatherer pages through every ticket comment and quotes each `Reporter note:` verbatim; `ticket-acceptance.md` names those notes beside Context/Problem/Idea as sources of implied requirements, so implementer detail moved out of the body still reaches the spec. (#75)
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- Eval samples `domain-reader`, `bounded-prose`, `displaced-detail`, `repair-overflow` (shape-ticket), `ticket-idea-overflow` (spec-council-member, bundling the shape-ticket brief), and `reporter-note`, `reporter-note-fetch` (brainstorming). (#75)
|
|
13
|
+
|
|
3
14
|
## v7.23.0 - 2026-10-20
|
|
4
15
|
|
|
5
16
|
### Changed
|
package/README.md
CHANGED
|
@@ -35,7 +35,7 @@ pi-gauntlet's only hard dependency is pi-cohort - every gate that dispatches a r
|
|
|
35
35
|
|
|
36
36
|
Concretely, one change through the gauntlet:
|
|
37
37
|
|
|
38
|
-
0. *(Optional)* Before there's even a spec, `/skill:shape-ticket` can create or repair a single tracker issue - shaping a raw ask into a Context/Problem/Idea/Acceptance Criteria ticket, gated by an AC integrity check, a cheap council roast, and one human-confirmed write that may include one optional gated comment for a Reporter note or overlap evidence. A failed roast is retried once, then surfaced inline at the gate if it fails again. It's a tool, not a phase: no worktree, no plan/phase tracker, runs from any repo state. The agent may start it on its own when the ask is "file a ticket" or another skill routes there; the write still waits for your yes on the presented diff. Similarly, `/skill:chase-bug` triages a raw bug report into an evidenced verdict - and can hand off to shape-ticket, brainstorming, or a bounded hotfix - before any spec exists.
|
|
38
|
+
0. *(Optional)* Before there's even a spec, `/skill:shape-ticket` can create or repair a single tracker issue - shaping a raw ask into a Context/Problem/Idea/Acceptance Criteria ticket, gated by an AC integrity check, a cheap council roast, and one human-confirmed write that may include one optional gated comment for a Reporter note or overlap evidence. Implementer detail moves into the gated Reporter note; brainstorming reads that note with the ticket so the spec retains the detail. A failed roast is retried once, then surfaced inline at the gate if it fails again. It's a tool, not a phase: no worktree, no plan/phase tracker, runs from any repo state. The agent may start it on its own when the ask is "file a ticket" or another skill routes there; the write still waits for your yes on the presented diff. Similarly, `/skill:chase-bug` triages a raw bug report into an evidenced verdict - and can hand off to shape-ticket, brainstorming, or a bounded hotfix - before any spec exists.
|
|
39
39
|
1. Opt in with `/skill:brainstorming` and describe the change. The command is the reliable discovery-and-entry path; explicit prose requesting brainstorming/the gauntlet also supplies consent when the skill is already loaded or an available instruction or route identifies it. An ordinary implementation request or an agent recommendation is not consent. **`brainstorming`** sets up an isolated worktree, explores the codebase, and turns your description into a written spec - when its recon finds a cited case that the ask is the wrong change (misdiagnosed, wrong-sized, already solved, a band-aid, or cutting across a sound pattern - including a repo convention that is itself debt) and can name the alternative, question one is a framing question (`as framed`, `pivot: <alternative>`, or `smaller or none`); otherwise it opens with one sentence naming what it checked, and every approach it proposes ends with a `Pattern:` line naming what it follows or cuts across; when the run starts from a ticket, the spec carries the ticket's acceptance criteria verbatim, each with a disposition (`in-scope`, `deviates:`, `deferred:`, `venue:`, `elsewhere:` for a row another repo's part delivers), scope cuts come only from your answer to a cut question and are listed at the gate, the conformance gate checks the in-scope ones, and `/skill:check-delivery` verifies `venue:` rows before the prod deploy. A multi-model critique runs on it automatically. If the spec replaces a known prior spec, brainstorming marks the predecessor with a `> **Superseded by:**` banner under its title (default format, syntax overridable via `.pi/gauntlet-overrides.md`; candidates come from brainstorming's scout recon, never a mechanical sweep). **You read and approve the spec - human gate 1.** No implementation code exists yet.
|
|
40
40
|
2. **`writing-plans`** decomposes the approved spec into atomic, independently-verifiable tasks, grouped into parallel waves where they don't touch the same files.
|
|
41
41
|
3. **`subagent-driven-development`** executes the plan one task at a time, each in a fresh subagent, behind spec-compliance review then code-quality review. TDD-locked: red, green, refactor. Independent implementation, review, and council batches remain parallel, but their dispatches are foreground: the orchestrator waits for terminal results before accepting work or advancing a phase.
|
package/package.json
CHANGED
|
@@ -64,8 +64,13 @@ Scout (always dispatched):
|
|
|
64
64
|
> instead; cite the old spec only for its unsuperseded sections (banner contract:
|
|
65
65
|
> `reference/superseding.md`). Predecessor check: compose a 5-15 term keyword query
|
|
66
66
|
> from the request (topic nouns, component names, file names - not stop words; if
|
|
67
|
-
> the request is only a ticket reference, take the terms from the ticket title
|
|
68
|
-
>
|
|
67
|
+
> the request is only a ticket reference, take the terms from the ticket title, body,
|
|
68
|
+
> and every `Reporter note:` labeled section in its comments via the resolved tracker
|
|
69
|
+
> CLI when a fetch path exists, otherwise use the fallback below). Fetch comments
|
|
70
|
+
> independently of context-builder, in pages of 50 until a short page. Match sections
|
|
71
|
+
> anywhere in each comment regardless of author; accept either ordering with
|
|
72
|
+
> `Overlap evidence:` and exclude that evidence part. Include every matched section's
|
|
73
|
+
> terms in the query. Run
|
|
69
74
|
> `node <SPEC_INDEX> --query '<keywords>' --limit 10` from the worktree root,
|
|
70
75
|
> keeping the keywords inside single quotes, and treat its rows as the candidate
|
|
71
76
|
> list; zero rows means the index found no evidence, not that no predecessor exists -
|
|
@@ -125,10 +130,23 @@ Context-builder (conditional):
|
|
|
125
130
|
> `<initial prompt verbatim>`. Fetch and distill these references:
|
|
126
131
|
> `<detected refs, one per line>`. For each: acceptance criteria, hard constraints,
|
|
127
132
|
> linked discussion that changes scope, and contradictions with the request as
|
|
128
|
-
> stated.
|
|
129
|
-
>
|
|
133
|
+
> stated. Fetch the ticket body and independently fetch its full comment history
|
|
134
|
+
> through the resolved tracker CLI in pages of 50 until a short page. Extract ACs
|
|
135
|
+
> from the body only; comments never contribute AC rows. Quote the ticket's
|
|
136
|
+
> acceptance-criteria rows, with any repo-group headings inside that section,
|
|
137
|
+
> verbatim under their own `## Ticket acceptance criteria (verbatim)` heading;
|
|
130
138
|
> brainstorming copies these rows unchanged into the spec and the council's
|
|
131
|
-
> `Human input` block.
|
|
139
|
+
> `Human input` block. After the AC rows, quote every `Reporter note:` labeled
|
|
140
|
+
> section verbatim in creation order under `## Reporter notes (verbatim)`, with
|
|
141
|
+
> `comments: N fetched, M pages`. Match sections anywhere in a comment regardless
|
|
142
|
+
> of author, accepting either ordering with `Overlap evidence:` and excluding that
|
|
143
|
+
> evidence part. Trim ordinary comments to the gather budget, never matched note
|
|
144
|
+
> sections. Report later notes contradicting earlier notes as contradictions without
|
|
145
|
+
> resolving them. On body success with comment failure, keep the AC rows and mark
|
|
146
|
+
> the note heading's status `comments not fetched (<reason>)` or
|
|
147
|
+
> `comments incomplete after page <k> (<reason>)` for a failed or budget-cut page;
|
|
148
|
+
> carry this status to ticket handling's gate warning without stopping.
|
|
149
|
+
> Write ONLY the context handoff to your output path; do NOT
|
|
132
150
|
> produce a meta-prompt file. End with an "Open questions that matter for the spec"
|
|
133
151
|
> section.
|
|
134
152
|
> If a ref is unreadable, say so explicitly and continue.
|
|
@@ -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.
|
|
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. 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.
|
|
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
|
|
|
@@ -73,26 +73,33 @@ Draft ordinary create/repair as a full replacement body; draft overlap alternati
|
|
|
73
73
|
The draft may propose **at most one comment per approved issue**, e.g.
|
|
74
74
|
`Reporter note: <demoted detail>`. Overflow test: the Idea section keeps
|
|
75
75
|
exactly one attributed sketch line; any demoted material left over after
|
|
76
|
-
that line is overflow, and the overflow is the comment body (long pasted
|
|
76
|
+
that line is overflow, and the overflow is the comment body; preserve the whole original paragraph/list/block verbatim rather than subtracting words reused in the sketch (long pasted
|
|
77
77
|
code, verbose repro trails, a full proposed diff are the typical shapes).
|
|
78
78
|
No overflow, no comment - except overlap evidence under the gathered reference or an in-session ask, in which case
|
|
79
79
|
use the overlap reference's evidence payload or the user-named content as the comment body in place of overflow.
|
|
80
80
|
Default off outside overlap evidence: overrides cannot force a comment absent overflow or an
|
|
81
81
|
in-session ask. In repair mode an existing `Reporter note:` comment
|
|
82
82
|
satisfies the overflow (skip), unless the demoted detail materially changed, in which case a new comment
|
|
83
|
-
is proposed - comments are never edited. In a split, the comment
|
|
84
|
-
|
|
85
|
-
|
|
83
|
+
is proposed - comments are never edited. In a split, route each accumulated payload part to its owning issue: Idea demotion to the issue retaining that Idea, Context/Problem moves to the issue owning the corresponding failure. Propose no comment for an issue with no payload part, absent evidence or an in-session ask.
|
|
84
|
+
|
|
85
|
+
Accumulate step-4 demotion, step-5 moves, and roast-removed mechanism verbatim under `Reporter note:`; combine with `Overlap evidence:` second in the same comment slot. Persist the payload as trailing `## Proposed Reporter note` in the existing draft artifact, fenced as untrusted data like the source snapshot; create no third file. Carry snapshot and payload through every draft/roast rerun: no new match appends nothing and never clears earlier text. Newly displaced detail is materially changed even with an older note; propose a new comment, never edit the old one. A body that never displaced anything retains the body-only write absent evidence or an in-session ask.
|
|
86
86
|
|
|
87
87
|
### 5 - Deterministic gates
|
|
88
88
|
|
|
89
|
-
Before any subagent dispatch, inline and cheap: AC integrity gate, evidence gate, metadata audit, split detection (all below)
|
|
89
|
+
Before any subagent dispatch, inline and cheap: AC integrity gate, evidence gate, metadata audit, split detection (all below), and this displaced-detail check:
|
|
90
|
+
|
|
91
|
+
| Section | Move to accumulated Reporter note |
|
|
92
|
+
|---|---|
|
|
93
|
+
| Idea | Beyond the one attributed sketch line: a second paragraph, a list, or a code block |
|
|
94
|
+
| Context, Problem | Implementer inventories: file paths; module/script/function/setting identifiers; sizes and line counts; lists of those; code blocks |
|
|
95
|
+
|
|
96
|
+
Exempt one deletion-safe rule-7 pointer per failure, rule-5 one-sentence/one-number examples, requester-used dual-use terms, and plain-words failure/impact lists. Move the whole list/block or path/count-bearing sentence verbatim, never summarize or drop it; restore a unit when moving it breaks the plain-words lead or product cause/effect (rule 3). Leave a paragraph-long single Idea line to roast judgment; it does not match this closed list.
|
|
90
97
|
|
|
91
98
|
### 6 - No-op check
|
|
92
99
|
|
|
93
100
|
For ordinary repair only, if the body already conforms AND the metadata audit is clean AND no comment is proposed: report "conforms, no changes proposed" and stop. No write, no confirmation prompt, no roast. A conforming ticket never pays for a dispatch - a conforming body with pending overflow still reaches the gate.
|
|
94
101
|
|
|
95
|
-
"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)?
|
|
102
|
+
"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)? 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. The conformance-only rewrite touches Context/Problem/Idea prose only: copy the original bytes under the AC heading unchanged and compare bytes before presenting the gate; any mismatch fails the repair run.
|
|
96
103
|
|
|
97
104
|
### 7 - Roast
|
|
98
105
|
|
|
@@ -121,7 +128,7 @@ Immediately before any mutation, including comments - after approval, not at gat
|
|
|
121
128
|
|
|
122
129
|
Runs twice: during gather (recovery via targeted questions) and on the assembled draft.
|
|
123
130
|
|
|
124
|
-
**Normalize first.** For additive overlap enrichment, preserve legacy rows verbatim and normalize only added/changed criteria under the gathered reference. In ordinary drafts and create-anyway, every criterion - numbered list, prose sentence, Given/When/Then, already-checked box - is extracted and rendered as a `- [ ]` item before gating.
|
|
131
|
+
**Normalize first.** For additive overlap enrichment, preserve legacy rows verbatim and normalize only added/changed criteria under the gathered reference. For conformance-only repair, parse checked, numbered, and prose criteria for validity without serializing them as `- [ ]`; preserve their raw bytes under step 6 while retaining every integrity outcome and hard stop. In other ordinary drafts and create-anyway, every criterion - numbered list, prose sentence, Given/When/Then, already-checked box - is extracted and rendered as a `- [ ]` item before gating. Those drafts emit ACs as `- [ ]` items, including repairs other than the conformance-only exception. No criterion evades the gate by syntax.
|
|
125
132
|
|
|
126
133
|
The test is structural, not keyword-based:
|
|
127
134
|
|
|
@@ -179,10 +186,10 @@ No block, no split. A block failing the identity or outcome test, or naming a no
|
|
|
179
186
|
Inline council dispatch, reusing spec-council config and personas - **not** `/skill:roasting-the-spec` (that skill's contract is spec-file apply mechanics; a tracker draft is not a spec file). No new agents.
|
|
180
187
|
|
|
181
188
|
1. Resolve `gauntlet_setting({ key: "specCouncil" })` when the tool exists. Verdict `council` -> dispatch `spec-council-member`s in parallel plus a `spec-council-synthesizer` chair. Verdict `worker` (or empty members) -> one fresh `worker` critique with the four-axis brief of item 4, its task text carrying the absolute path to `reference/ticket-wording.md` (resolved against this skill's own directory). Malformed config -> one warning line, then branch on verdict.
|
|
182
|
-
2. **Dispatch shape**, mirroring `/skill:roasting-the-spec`: write the draft body and the source snapshot (original ticket + comments, or the create-mode inputs) to absolute temp files under `mktemp -d`; delimit untrusted snapshots as data. The raw ask (create mode) or the original ticket body (repair mode) is also passed as the `Human input (verbatim; off-limits for over-spec)` block. For overlap, include all available mutually exclusive alternatives and the fenced read-only source; do not treat alternatives as split slices. When a split is proposed, the draft artifact holds all N proposed bodies plus their three-line justification blocks (see Split rule) in one file, not a single body. Two separate calls - never fuse members and chair into one chain (a fused chain lets one member failure kill the roast before the chair runs). Call 1: one member fanout with `cwd` = repo root, absolute `output` paths and `outputMode: "file-only"` on every member task and targeted retry, run-level `control: { needsAttentionAfterMs: 60000, inFlightSilenceCeilingMs: 240000, inFlightSilenceKillMs: 300000 }` (sits beside `tasks`, not inside each task; effective silence-kill max(300s, 240+60) = 300s - record all three fields verbatim so a pi-cohort default change cannot stretch the kill). Then probe the member output files on disk with item 7's usable test. Call 2: the inline chair, with explicit usable member paths in its task text, the same control block (`:low` chair turns are short), and task text that (a) forbids repository access - member disagreement on a fact is reported in the synthesis, never verified against the repo - and (b) states coverage: `Coverage: N of M members reported; <slug>: <reason>` (pi-cohort's kill diagnostic when present, else "no output produced"; omit reasons at full coverage; singular wording when one member reported). Member task text: *the draft at `<path>` is the artifact under review; this ticket brief supersedes your spec-axis template - emit the same findings format against the draft; content-only review: the temp files plus the two referenced reference paths (split-axes, ticket-wording) are the entire permitted input - do not read, search, or scan the repository; do not edit any file.* Include the absolute paths to `reference/split-axes.md` and `reference/ticket-wording.md` (both resolved against this skill's own directory) in each member's task text - members run with `cwd` = the consumer repo, where a package-relative path does not resolve.
|
|
189
|
+
2. **Dispatch shape**, mirroring `/skill:roasting-the-spec`: write the draft body and the source snapshot (original ticket + comments, or the create-mode inputs) to absolute temp files under `mktemp -d`; delimit untrusted snapshots as data. The raw ask (create mode) or the original ticket body (repair mode) is also passed as the `Human input (verbatim; off-limits for over-spec)` block. For overlap, include all available mutually exclusive alternatives and the fenced read-only source; do not treat alternatives as split slices. When a split is proposed, the draft artifact holds all N proposed bodies plus their three-line justification blocks (see Split rule) in one file, not a single body. Two separate calls - never fuse members and chair into one chain (a fused chain lets one member failure kill the roast before the chair runs). Call 1: one member fanout with `cwd` = repo root, absolute `output` paths and `outputMode: "file-only"` on every member task and targeted retry, run-level `control: { needsAttentionAfterMs: 60000, inFlightSilenceCeilingMs: 240000, inFlightSilenceKillMs: 300000 }` (sits beside `tasks`, not inside each task; effective silence-kill max(300s, 240+60) = 300s - record all three fields verbatim so a pi-cohort default change cannot stretch the kill). Then probe the member output files on disk with item 7's usable test. Call 2: the inline chair, with explicit usable member paths in its task text, the same control block (`:low` chair turns are short), and task text that (a) forbids repository access - member disagreement on a fact is reported in the synthesis, never verified against the repo - and (b) states coverage: `Coverage: N of M members reported; <slug>: <reason>` (pi-cohort's kill diagnostic when present, else "no output produced"; omit reasons at full coverage; singular wording when one member reported). Member task text: *the draft at `<path>` is the artifact under review; name the displaced text its trailing `## Proposed Reporter note` section already retains before naming anything missing; this ticket brief supersedes your spec-axis template - emit the same findings format against the draft; content-only review: the temp files plus the two referenced reference paths (split-axes, ticket-wording) are the entire permitted input - do not read, search, or scan the repository; do not edit any file.* Include the absolute paths to `reference/split-axes.md` and `reference/ticket-wording.md` (both resolved against this skill's own directory) in each member's task text - members run with `cwd` = the consumer repo, where a package-relative path does not resolve.
|
|
183
190
|
3. **Effort: cheap by default.** Append a `:low` thinking suffix to each member's model string at dispatch (this beats the persona's frontmatter `xhigh` pin). Same for the chair: a configured chair string gets any existing suffix replaced with `:low`; an unconfigured chair is dispatched with the main loop's own string, read from `$PI_PROVIDER`/`$PI_MODEL` with the bash tool, plus `:low`. The `worker` fallback carries no thinking pin - it runs at the preset's default. **Full-roast escape:** the user may request a full roast, dispatching all model strings bare/as-configured, restoring the xhigh pins; a full roast reuses the spec-roast control blocks (members `{ needsAttentionAfterMs: 300000, inFlightSilenceCeilingMs: 300000, inFlightSilenceKillMs: 600000 }`, chair `{ needsAttentionAfterMs: 300000, inFlightSilenceCeilingMs: 600000, inFlightSilenceKillMs: 900000 }`) - the 5-minute figures in item 2 are `:low`-only.
|
|
184
|
-
4. **Brief covers four axes**, absorbing the fidelity-review role without a new persona: *fidelity* - compare draft against source intent (original ticket + comments in repair; prompt + answers in create), flag `lost` / `added` / `gap` (unpacking existing claims to satisfy the ticket wording contract is not `added`; contract-conformance findings on Context/Problem/Idea outrank fidelity flags that only object to extra explanation of the same claims); and *quality* - problem framing, AC integrity beyond the deterministic gate, scope, wording, and conformance to the ticket wording contract (reference path provided in every roast brief); and *split soundness* - if the draft proposes a split, test each slice against the split-axes reference (path provided in the task text); an architecture-shaped boundary is reported as a finding line containing the marker `split-axis:` (members keep their existing spec-axis findings template; the marker is a substring flag within it, not a new findings kind), e.g. `- [major] split-axis: <slice> - <why> -> merge`. Members may argue toward one ticket, never propose or endorse a split. And *attribution* - when the Acceptance Criteria section carries `### <repo>` groups, every row sits under the repo that can observe it; a misplaced row is a finding naming the group it belongs to, applied like any other concrete fix; a repo group is never a `split-axis:` finding.
|
|
185
|
-
5. Disposition: unambiguous concrete fixes applied to the draft (one re-pass max); ambiguous findings surfaced at the confirmation gate.
|
|
191
|
+
4. **Brief covers four axes**, absorbing the fidelity-review role without a new persona: *fidelity* - compare draft against source intent (original ticket + comments in repair; prompt + answers in create), flag `lost` / `added` / `gap` (unpacking existing claims to satisfy the ticket wording contract is not `added`; contract-conformance findings on Context/Problem/Idea outrank fidelity flags that only object to extra explanation of the same claims); and *quality* - problem framing, AC integrity beyond the deterministic gate, scope, wording, and conformance to the ticket wording contract (reference path provided in every roast brief). Flag quality findings for the product-aware repo-stranger reader, one-sentence/one-number examples, trigger/current-state Context without mechanism, and Idea overflow including a paragraph-long single line; apply rule 3's comprehension precedence: never remove a plain-words Problem lead or a product-level cause-and-effect sentence through a cut, compression, or redundancy finding. And *split soundness* - if the draft proposes a split, test each slice against the split-axes reference (path provided in the task text); an architecture-shaped boundary is reported as a finding line containing the marker `split-axis:` (members keep their existing spec-axis findings template; the marker is a substring flag within it, not a new findings kind), e.g. `- [major] split-axis: <slice> - <why> -> merge`. Members may argue toward one ticket, never propose or endorse a split. And *attribution* - when the Acceptance Criteria section carries `### <repo>` groups, every row sits under the repo that can observe it; a misplaced row is a finding naming the group it belongs to, applied like any other concrete fix; a repo group is never a `split-axis:` finding.
|
|
192
|
+
5. Disposition: unambiguous concrete fixes applied to the draft (one re-pass max); ambiguous findings surfaced at the confirmation gate. Apply roast edits to the body draft pre-write and re-run step 5; append removed Context/Problem mechanism verbatim to the accumulated Reporter-note payload, never delete it. Roast findings themselves are never posted as a tracker comment. Additionally, the parent scans the **usable member output files (item 7's structural test) directly** for lines containing `split-axis:` (substring match), independent of the chair synthesis; any such finding on an actual split (never mutually exclusive overlap alternatives) auto-applies a merge - the split is withdrawn and the draft becomes one ticket with phased AC groups, inside the same one-re-pass budget, and the pre-merge N-body draft is kept alongside: a human re-request of the split at the gate re-presents those N bodies old->new as the approval diff (see the Split rule's sticky override). The chair keeps every other axis; clearing a `split-axis:` finding is not on its path. The same directional rule - toward one ticket, never toward a split - binds the `worker` fallback and the runtime conditional (item 6).
|
|
186
193
|
6. **Runtime conditional (the one allowed):** on a harness with no `gauntlet_setting`/`subagent()` (e.g. Claude Code), dispatch fresh general-purpose subagents via that harness's native facility at low effort, with the same four-axis brief (including the absolute `reference/ticket-wording.md` path) and temp-file artifacts - on such a harness this conditional IS the roast, so the contract path must ride along.
|
|
187
194
|
7. **Usable outputs, targeted retry, and roast failure.** A member output
|
|
188
195
|
file is usable iff it is non-empty AND contains a
|
|
@@ -252,7 +259,7 @@ Claims about user-visible/UI behavior need evidence: screenshots/artifacts via r
|
|
|
252
259
|
|
|
253
260
|
Read `reference/ticket-wording.md` (resolve the path against this skill's own directory) and apply it - the self-containment contract lives there; a link alone is not the contract in hand. Repo comms style (found via the ladder) still tunes tone and format - where tone and format explicitly exclude density and brevity - but the contract (its rules 2-8) yields only to an overrides-file section that explicitly addresses ticket wording (e.g. a `## Ticket wording` heading in the gauntlet overrides file). Do not let generic density/brevity norms from the capability ladder, AGENTS.md, or `## conventions` weaken the ticket-wording contract; apply a conventions override to it only when the rule explicitly addresses ticket wording. Remaining defaults:
|
|
254
261
|
|
|
255
|
-
- **Minimal-to-actionable, split scoping:** Context/Problem/Idea are the shortest prose that passes the contract's self-containment test - understandable and triagable by a reader who has never opened the repo; the ACs remain the part a stranger (human or LLM) can act on AND verify - implementer-facing per contract rule 1. Every sentence earns its place.
|
|
262
|
+
- **Minimal-to-actionable, split scoping:** Context/Problem/Idea are the shortest prose that passes the contract's self-containment test - understandable and triagable by a reader who knows the product and its customers but has never opened the repo; the ACs remain the part a stranger (human or LLM) can act on AND verify - implementer-facing per contract rule 1. Every sentence earns its place.
|
|
256
263
|
- Active voice, named actor; no filler ("comprehensive", "successfully", restated-goal paragraphs).
|
|
257
264
|
- No heading scaffolding beyond the four template sections plus the two named optional ones (`Out of scope / Follow-up`, `Post-deployment housekeeping`) and the `### <repo>` groups inside Acceptance Criteria - the only exceptions. ASCII punctuation.
|
|
258
265
|
- References use the tracker-native link/mention form, never bare identifiers; link the specific thing, not its container; never invent an id or URL.
|
|
@@ -4,7 +4,9 @@ Consumed by `shape-ticket`'s SKILL.md (draft step, no-op check, and every roast
|
|
|
4
4
|
|
|
5
5
|
## Reader and scope
|
|
6
6
|
|
|
7
|
-
1. **Reader definition.**
|
|
7
|
+
1. **Reader definition.** Write for a reader who knows the product and its customers but has never opened the repo. Acceptance Criteria are exempt throughout this contract - they address the implementer and may name files, symbols, and settings freely.
|
|
8
|
+
|
|
9
|
+
Bound Context to the trigger of the ask and what exists today; put needed mechanism in Problem's rule-7 parenthetical pointer. Treat mechanism as internal implementation explanation: which module, step, store, or call does the work and in what order. Move "the export job writes the CSV through the mail queue before the row count is known" to the pointer or note; retain product-level cause and effect such as "the export email arrives before the file is complete, so the first download is empty." Apply rule 3 beside these bounds: restore material when removing it breaks comprehension; shorten addresses and inventories, never the plain-words explanation.
|
|
8
10
|
|
|
9
11
|
Scope: Context/Problem/Idea prose only. ACs, split justification blocks, metadata rationale lines, and Reporter-note comments are out of this contract's scope.
|
|
10
12
|
|
|
@@ -13,8 +15,8 @@ Scope: Context/Problem/Idea prose only. ACs, split justification blocks, metadat
|
|
|
13
15
|
2. **Self-containment test.** Remove every code/doc reference from Context, Problem, and Idea; what remains must still make the problem and its impact understandable and triagable by that reader. Deleting the references may lose depth, never comprehension. The test is a reviewer judgment with a mechanical framing (strip, re-read, ask "triagable?"), not a keyword scan.
|
|
14
16
|
3. **Precedence.** Self-contained human comprehension wins over brevity and retrieval-density norms; compression applies only after the test passes. "Shortest body" survives as a constraint on what may be omitted, never a license to leave jargon undefined or mechanisms unexplained.
|
|
15
17
|
4. **Plain-words lead.** Each independently asserted failure or impact in Problem opens with a plain-words sentence of what goes wrong and what it costs, before any mechanism. (The lead and example rules bind Problem; Context and Idea are bound by the general self-containment test.)
|
|
16
|
-
5. **Example per failure.**
|
|
17
|
-
6. **Jargon.**
|
|
18
|
+
5. **Example per failure.** Give each independently asserted failure a concrete example limited to one sentence or one number: real numbers, a before/after, or a short transcript. One example may serve multiple sentences describing the same failure. `none (<reason>)` is permitted only when no observable exists yet (pure rename/removal, or discovery work whose deliverable is the observable); the reason is part of the draft and thus roast-reviewable. A disputed reason is an ordinary roast finding handled by the existing disposition machinery (applied if unambiguous, surfaced at the gate if not) - no new disposition class.
|
|
19
|
+
6. **Jargon.** Define repo-native terms (module, script, internal tool, extension, or setting names) at first use in plain words, or drop them. Leave product and domain terms the requester used undefined; requester usage wins for terms that are also internal names. Establish requester usage from the ask's own words, reporter-authored comments, a quoted ask, or explicit attribution ("the reporter calls this ..."), never from unattributed existing body prose. Keep an internal term's definition when its only usage evidence is the existing body. A link is not a definition when the term is load-bearing for triage.
|
|
18
20
|
7. **Pointer demotion.** Code/doc references in Context/Problem/Idea are demoted to parenthetical pointers whose deletion loses no meaning, e.g. "(Pointer for the implementer: detectChains, src/chain-detector.ts.)". Composition with the tracker-native-links rule in SKILL.md's `## Ticket wording`: that rule governs *how* a reference is written (native link/mention form, never bare identifiers); pointer demotion governs *where* it may sit (parenthetical, deletion-safe).
|
|
19
21
|
8. **Link-vs-inline (anti-spiderman).** Linking stays legitimate for targets impractical to inline - a whole design doc, a KB page, a long log - and for general-knowledge material; every such link carries a one-line plain-words statement of what the reader needs from it. What is forbidden is the spiderman shape: many small load-bearing hops, where the full picture must be assembled from N places even when each individual inline would be cheap. Discriminator: "is this definition load-bearing for triage?" - load-bearing small definitions get inlined; big chunks get linked with a summary line.
|
|
20
22
|
|