pi-gauntlet 7.23.0 → 7.25.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 +22 -0
- package/README.md +1 -1
- package/package.json +1 -1
- package/skills/brainstorming/gatherer.md +23 -5
- package/skills/brainstorming/reference/menu-layout.md +37 -0
- package/skills/brainstorming/reference/ticket-acceptance.md +1 -1
- package/skills/chase-bug/SKILL.md +10 -0
- package/skills/check-delivery/SKILL.md +12 -1
- package/skills/finishing-a-development-branch/SKILL.md +4 -0
- package/skills/gatekeep-pr/reference/decision-menu.md +2 -0
- package/skills/gatekeep-pr/reference/post-selection-loop.md +2 -0
- package/skills/gatekeep-pr/reference/report.md +2 -0
- package/skills/gauntlet-resume/SKILL.md +2 -0
- package/skills/shape-ticket/SKILL.md +20 -11
- package/skills/shape-ticket/reference/ticket-wording.md +5 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## v7.25.0 - 2026-10-21
|
|
4
|
+
|
|
5
|
+
### Changed
|
|
6
|
+
|
|
7
|
+
- **Decision menus render 1-N after a numbered list.** A numbered option menu placed directly below an ordered list, separated only by a blank line, rendered as `4.`-`6.` because CommonMark merged the two lists; a human replying `5` was then read against a three-option menu. One shared reference, `skills/brainstorming/reference/menu-layout.md`, owns the three permitted layouts (a prose line, a `---` rule, or bullets above the menu) and the reply mapping: a bare reply above the option count resolves to `R - L` when it lands in range, the agent echoes the resolved option in one sentence (`Taking 5 as option 2 - merge`) before acting, and any other out-of-range reply gets a clarifying question. Every menu site in shape-ticket, chase-bug, gatekeep-pr, check-delivery, finishing-a-development-branch, and gauntlet-resume cites it with one line; no site restates the rule. (#73)
|
|
8
|
+
- **check-delivery's confirmation gate is a two-option menu** (`1. approve the write` / `2. decline`); a typed `yes` still approves. (#73)
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- Eval target `check-delivery` and a `menu-after-numbered-findings` sample in six targets; `shape-ticket`, `gatekeep-pr`, and `check-delivery` load the shared reference through `target.json`. (#73)
|
|
13
|
+
|
|
14
|
+
## v7.24.0 - 2026-10-21
|
|
15
|
+
|
|
16
|
+
### Changed
|
|
17
|
+
|
|
18
|
+
- **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)
|
|
19
|
+
- **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)
|
|
20
|
+
|
|
21
|
+
### Added
|
|
22
|
+
|
|
23
|
+
- 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)
|
|
24
|
+
|
|
3
25
|
## v7.23.0 - 2026-10-20
|
|
4
26
|
|
|
5
27
|
### 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.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
## Exposure
|
|
2
|
+
A numbered option list directly after an ordered list with only a blank line merges under CommonMark, displaying `N+1.`-`N+k.` after `N` preceding items. This control renders the options as `4.`-`6.`:
|
|
3
|
+
```markdown
|
|
4
|
+
1. Finding A
|
|
5
|
+
2. Finding B
|
|
6
|
+
3. Finding C
|
|
7
|
+
|
|
8
|
+
1. Keep
|
|
9
|
+
2. Merge
|
|
10
|
+
3. Stop
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Permitted layouts
|
|
14
|
+
Separate numbered options from preceding ordered content. Default to a prose line (`Pick one:` or `Verdict:`); alternatively insert a `---` rule or write preceding content as bullets:
|
|
15
|
+
```markdown
|
|
16
|
+
1. Finding
|
|
17
|
+
|
|
18
|
+
Pick one:
|
|
19
|
+
1. Merge
|
|
20
|
+
```
|
|
21
|
+
```markdown
|
|
22
|
+
1. Finding
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
1. Merge
|
|
27
|
+
```
|
|
28
|
+
```markdown
|
|
29
|
+
- Finding
|
|
30
|
+
|
|
31
|
+
1. Merge
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Reply mapping
|
|
35
|
+
Apply only to bare numeric replies to numbered option menus. Leave #63 compound replies such as `1: cache=A` and its bare-`1` shortcut to [disposition-protocol.md](../../finishing-a-development-branch/reference/disposition-protocol.md).
|
|
36
|
+
Count `N` options and let `L` count every preceding item in the entire contiguous ordered run adjoining the options through blank lines alone. Stop at prose, a rule, or bullets; earlier separated lists contribute nothing. Set `L = 0` after a separator.
|
|
37
|
+
Take replies `1`-`N` unchanged, without echo, even when they also equal `L + k`. Only map `R > N` with `1 <= R - L <= N` to option `R - L`; echo the resolution before acting: `Taking 5 as option 2 - merge`. For every other out-of-range reply, ask a clarifying question naming the valid range `1`-`N`.
|
|
@@ -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
|
|
|
@@ -167,6 +167,8 @@ change request, not a menu row.
|
|
|
167
167
|
**Real bug** - four actions (all rendered unless noted), exactly one tagged
|
|
168
168
|
`[recommended]`. Untracked origin:
|
|
169
169
|
|
|
170
|
+
Read and apply [menu-layout](../brainstorming/reference/menu-layout.md) before presenting these options and before acting on a numeric reply.
|
|
171
|
+
|
|
170
172
|
```
|
|
171
173
|
1. [ ] File a ticket - /skill:shape-ticket, seeded with this evidence.
|
|
172
174
|
2. [ ] Brainstorm now - /skill:brainstorming with this evidence as the seed.
|
|
@@ -176,6 +178,8 @@ change request, not a menu row.
|
|
|
176
178
|
|
|
177
179
|
Tracker/GitHub origin (ticket row omitted as today, renumbered):
|
|
178
180
|
|
|
181
|
+
Read and apply [menu-layout](../brainstorming/reference/menu-layout.md) before presenting these options and before acting on a numeric reply.
|
|
182
|
+
|
|
179
183
|
```
|
|
180
184
|
1. [ ] Brainstorm now - /skill:brainstorming with this evidence as the seed.
|
|
181
185
|
2. [ ] Implement hotfix now - follow hotfix.md; add "as a PR" for a PR.
|
|
@@ -241,6 +245,8 @@ A verdict without its named citation is a red flag (see Red Flags - STOP).
|
|
|
241
245
|
For a negative verdict, render the verdict with its citation, then a short
|
|
242
246
|
numbered menu:
|
|
243
247
|
|
|
248
|
+
Read and apply [menu-layout](../brainstorming/reference/menu-layout.md) before presenting these options and before acting on a numeric reply.
|
|
249
|
+
|
|
244
250
|
```
|
|
245
251
|
Verdict: <verdict name> - <citation>
|
|
246
252
|
|
|
@@ -254,6 +260,8 @@ way; for `cannot-replicate`, renumber the discovery-ticket row to 2.
|
|
|
254
260
|
|
|
255
261
|
For `cannot-replicate` only, add a third row offering a discovery ticket:
|
|
256
262
|
|
|
263
|
+
Read and apply [menu-layout](../brainstorming/reference/menu-layout.md) before presenting these options and before acting on a numeric reply.
|
|
264
|
+
|
|
257
265
|
```
|
|
258
266
|
3. [ ] File a discovery ticket - /skill:shape-ticket, seeded with what's missing.
|
|
259
267
|
```
|
|
@@ -379,6 +387,8 @@ rendered is out of skill scope - the skill has ended.
|
|
|
379
387
|
|
|
380
388
|
**Real-bug example:**
|
|
381
389
|
|
|
390
|
+
Read and apply [menu-layout](../brainstorming/reference/menu-layout.md) before presenting these options and before acting on a numeric reply.
|
|
391
|
+
|
|
382
392
|
```
|
|
383
393
|
Fault story: user pastes a URL with a trailing slash -> the router's path
|
|
384
394
|
matcher does an exact string compare instead of normalizing -> the route
|
|
@@ -260,7 +260,18 @@ explicit yes-gate as the success path. Never posted unprompted.
|
|
|
260
260
|
All-clear path -> **one confirmation gate**: present the shipped SHA,
|
|
261
261
|
deliverable set, stage results (including any skip), the per-AC verdict
|
|
262
262
|
table with evidence, the reviewer script, and the exact write about to
|
|
263
|
-
happen.
|
|
263
|
+
happen.
|
|
264
|
+
|
|
265
|
+
Read and apply [menu-layout](../brainstorming/reference/menu-layout.md) before presenting these options and before acting on a numeric reply.
|
|
266
|
+
|
|
267
|
+
```text
|
|
268
|
+
1. approve the write
|
|
269
|
+
2. decline
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
Treat option `1` or typed `yes` as explicit approval; option `2` or any
|
|
273
|
+
unrecognized/non-approval reply means no write. On approval, one batched
|
|
274
|
+
write. The numbered steps below are the
|
|
264
275
|
ordinary-run shape; when a ratified descope strike is in play, the
|
|
265
276
|
body-edit half precedes step 1 - see the `descope edits` paragraph below
|
|
266
277
|
for its mechanics, not repeated here:
|
|
@@ -180,6 +180,8 @@ Omit the block when N = 0.
|
|
|
180
180
|
|
|
181
181
|
**Normal repo and named-branch worktree — present exactly these 5 options:**
|
|
182
182
|
|
|
183
|
+
Read and apply [menu-layout](../brainstorming/reference/menu-layout.md) before presenting these options and before acting on a numeric reply.
|
|
184
|
+
|
|
183
185
|
```
|
|
184
186
|
Implementation complete. What would you like to do?
|
|
185
187
|
|
|
@@ -194,6 +196,8 @@ Which option?
|
|
|
194
196
|
|
|
195
197
|
**Detached HEAD — present exactly these 4 options:**
|
|
196
198
|
|
|
199
|
+
Read and apply [menu-layout](../brainstorming/reference/menu-layout.md) before presenting these options and before acting on a numeric reply.
|
|
200
|
+
|
|
197
201
|
```
|
|
198
202
|
Implementation complete. You're on a detached HEAD (externally managed workspace).
|
|
199
203
|
|
|
@@ -8,6 +8,8 @@ Read from SKILL.md step 6. Input: the report's verdict and the PR state. Output:
|
|
|
8
8
|
|
|
9
9
|
Render fix consequences with the applicable lifetime from `post-selection-loop.md` `### Continuation record`. For named fixes, state that authority retains only the selected stable IDs for later independent reassessments, with the same lifetime as broad fixes; link active pre-push retries to `fix-wave.md` `## Review before push`. For clarification-only fixes, state one-shot authority for the exactly selected payload; keep nit consequences one-shot.
|
|
10
10
|
|
|
11
|
+
Read and apply [menu-layout](../../brainstorming/reference/menu-layout.md) before presenting these options and before acting on a numeric reply.
|
|
12
|
+
|
|
11
13
|
Rows are `<n>. <verb> - <consequence>`; every row, `stop` included, carries its consequence clause. `stop` is always last, before the compose hint. `show evidence` is always offered and never `[recommended]`. A row the actor cannot execute - by `## Availability` below, or because the forge would refuse it (branch protection, a withhold) - is omitted and named in the compose line's `Not offered:` sentence; it is never `[recommended]`. Exactly one row is `[recommended]`. A **terminal overlay** is `own merge`, `merge queued` (once its read returns `MERGED` it re-renders as `own merge`), `approved`, or `merged or closed PR`; every other menu is an ordinary open-PR menu. **Landed** means the PR's `state` is `MERGED`; under `approved` and under a closed-unmerged PR nothing has landed.
|
|
12
14
|
|
|
13
15
|
- `accept contract change` - invoke the concrete proposal's owning amendment process through `post-selection-loop.md` `### Contract decision`; settle the baseline only after completion
|
|
@@ -93,6 +93,8 @@ Apply per `fix-wave.md`: the local conflict check, one fresh implementer helper
|
|
|
93
93
|
|
|
94
94
|
After `gh pr merge` returns, read `gh pr view <N> --json state,mergeCommit`. `state: MERGED` -> write the returned `state` into `pr.state` and `mergeCommit.oid` into `pr.merge_commit` (the same two writes when a queued merge's `wait` re-read returns `MERGED`), render the `AC coverage` block once and re-render the menu under the `own merge` overlay (`decision-menu.md`); any other state (a merge queue) -> one `PR comments` line `The merge is queued, so coverage posts wait. (<state>)` and the menu `wait` (re-run the read) / `show evidence` / `stop`. The block, `<sha>` = `mergeCommit.oid`, one row per `scope.rows` entry in row order with its outcome (`covered`, `deferred per spec to <ref>`, `deviates per spec: <why>`, `elsewhere per spec: <repo>`, `venue: <env> - <observation>, checked before prod deploy`); with no rows (`source: pr`, or an empty `scope.rows`) the block has no row lines and `post coverage to ticket` is not offered. With `source: pr` the header line drops `, spec <path>`. An `in-scope` row whose observation half is `not judged here` renders `covered; observable half checked after merge`.
|
|
95
95
|
|
|
96
|
+
Read and apply [menu-layout](../../brainstorming/reference/menu-layout.md) before presenting these options and before acting on a numeric reply.
|
|
97
|
+
|
|
96
98
|
```markdown
|
|
97
99
|
## AC coverage
|
|
98
100
|
Informational - the ticket's rows are unchanged. PR <url>, merged <sha>, spec <path>
|
|
@@ -8,6 +8,8 @@ Render bottom-up for a terminal: least important first, verdict and menu last. E
|
|
|
8
8
|
|
|
9
9
|
Section order is fixed:
|
|
10
10
|
|
|
11
|
+
Read and apply [menu-layout](../../brainstorming/reference/menu-layout.md) before presenting these options and before acting on a numeric reply.
|
|
12
|
+
|
|
11
13
|
```
|
|
12
14
|
Delivers: <one sentence: what the PR does. With source: spec, a second sentence built from these clauses in
|
|
13
15
|
order, each present only when it applies, joined with semicolons: covered rows ("ACs 1, 2, 4";
|
|
@@ -39,6 +39,8 @@ optional pasted text after the command line. Count tokens first; then first matc
|
|
|
39
39
|
Spec dirs resolve per `reference/reconstruction.md` "Candidates" (`flowGuards.specDirs`
|
|
40
40
|
precedence).
|
|
41
41
|
|
|
42
|
+
Read and apply [menu-layout](../brainstorming/reference/menu-layout.md) before presenting these options and before acting on a numeric reply.
|
|
43
|
+
|
|
42
44
|
| Input | Route |
|
|
43
45
|
|---|---|
|
|
44
46
|
| no tokens, no pasted text | discovery: `<tmpdir>` via `node -p "require('os').tmpdir()"`; candidates are the regular files directly under `<tmpdir>/pi-handoff/` ending `.md` (non-recursive) whose line 1 starts `# Handoff:`; sorted by mtime, newest first; displayed one per line as `<n>. <title line> - <worktree: field value> - <mtime ISO-8601>` with `worktree: unavailable` when the field is absent; the human picks `<n>` (a single candidate is still confirmed); none -> STOP "no handoff briefs found under <tmpdir>/pi-handoff" |
|
|
@@ -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
|
|
|
@@ -111,6 +118,8 @@ Present, per proposed issue:
|
|
|
111
118
|
- Proposed comment and supported relations, verbatim, if any - one approval covers the exact title + body + metadata + comment + relation payload.
|
|
112
119
|
- For overlap, show mutually exclusive supported enrichment/create-anyway/no-write alternatives and coverage under the gathered reference; show failing alternatives unavailable. Selecting an option approves that displayed payload without another authorization prompt.
|
|
113
120
|
|
|
121
|
+
Read and apply [menu-layout](../brainstorming/reference/menu-layout.md) before presenting these options and before acting on a numeric reply.
|
|
122
|
+
|
|
114
123
|
Number the options. A split offers per-issue subset selection, e.g. "approve 1,3; decline 2". **No affirmative answer on the exact presented diff = no write.**
|
|
115
124
|
|
|
116
125
|
### 9 - Write
|
|
@@ -121,7 +130,7 @@ Immediately before any mutation, including comments - after approval, not at gat
|
|
|
121
130
|
|
|
122
131
|
Runs twice: during gather (recovery via targeted questions) and on the assembled draft.
|
|
123
132
|
|
|
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.
|
|
133
|
+
**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
134
|
|
|
126
135
|
The test is structural, not keyword-based:
|
|
127
136
|
|
|
@@ -179,10 +188,10 @@ No block, no split. A block failing the identity or outcome test, or naming a no
|
|
|
179
188
|
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
189
|
|
|
181
190
|
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.
|
|
191
|
+
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
192
|
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.
|
|
193
|
+
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.
|
|
194
|
+
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
195
|
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
196
|
7. **Usable outputs, targeted retry, and roast failure.** A member output
|
|
188
197
|
file is usable iff it is non-empty AND contains a
|
|
@@ -252,7 +261,7 @@ Claims about user-visible/UI behavior need evidence: screenshots/artifacts via r
|
|
|
252
261
|
|
|
253
262
|
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
263
|
|
|
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.
|
|
264
|
+
- **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
265
|
- Active voice, named actor; no filler ("comprehensive", "successfully", restated-goal paragraphs).
|
|
257
266
|
- 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
267
|
- 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
|
|