pi-gauntlet 5.0.8 → 5.2.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 +11 -0
- package/README.md +21 -6
- package/extensions/lib/plan-check.test.ts +485 -0
- package/extensions/lib/plan-check.ts +829 -0
- package/extensions/phase-tracker.test.ts +469 -2
- package/extensions/phase-tracker.ts +142 -3
- package/package.json +1 -1
- package/skills/brainstorming/gatherer.md +4 -1
- package/skills/chase-bug/SKILL.md +16 -2
- package/skills/check-delivery/SKILL.md +18 -7
- package/skills/dispatching-parallel-agents/SKILL.md +8 -1
- package/skills/linear/SKILL.md +188 -0
- package/skills/requesting-code-review/SKILL.md +1 -1
- package/skills/shape-ticket/SKILL.md +9 -9
- package/skills/subagent-driven-development/SKILL.md +1 -1
- package/skills/writing-plans/SKILL.md +6 -9
|
@@ -68,7 +68,10 @@ contains any of:
|
|
|
68
68
|
|
|
69
69
|
- an `http(s)://` URL;
|
|
70
70
|
- a tracker-style ID matching `[A-Z][A-Z0-9]+-\d+` (Linear/Jira form) **when a fetch
|
|
71
|
-
path exists** (a tracker tool/MCP, or a URL pattern in the gauntlet overrides file,
|
|
71
|
+
path exists** (a tracker tool/MCP, or a URL pattern in the gauntlet overrides file,
|
|
72
|
+
see Project overrides). A tracker excluded by an overrides `## Issue tracker`
|
|
73
|
+
`tracker:` key has no fetch path regardless of installed tools; its IDs are listed
|
|
74
|
+
as unfetched refs;
|
|
72
75
|
- a GitHub-style ref `owner/repo#N`, or a bare `#N` when the repo's tracker is
|
|
73
76
|
GitHub Issues.
|
|
74
77
|
|
|
@@ -89,6 +89,12 @@ Search both **open and closed** issues for the same symptom before deep
|
|
|
89
89
|
discovery. This has its own resolution ladder, separate from the response-channel
|
|
90
90
|
ladder in step 5 (the reply destination and the search target can differ):
|
|
91
91
|
|
|
92
|
+
0. If the overrides `## Issue tracker` section has a `tracker:` key
|
|
93
|
+
(case-insensitive), that tracker is exclusive - no probing for others, no
|
|
94
|
+
ask, others never mentioned. `tracker: none` -> prior-report search declared
|
|
95
|
+
**not completed** (the existing rung-4 convention). Unknown value ->
|
|
96
|
+
exclusive; use free-form command mappings in the same section if present,
|
|
97
|
+
else ask. Unparseable `tracker:` line -> ask, never probe.
|
|
92
98
|
1. `## Issue tracker` section in the gauntlet overrides file, if present.
|
|
93
99
|
2. Repo tracker convention documented in `AGENTS.md` / `README`.
|
|
94
100
|
3. Detected CLI (e.g. `gh` for a GitHub-origin repo, or another tracker tool/CLI
|
|
@@ -246,18 +252,26 @@ Slack.
|
|
|
246
252
|
|
|
247
253
|
**Channel resolution**, in order:
|
|
248
254
|
|
|
255
|
+
0. If the overrides `## Issue tracker` section has a `tracker:` key
|
|
256
|
+
(case-insensitive), that tracker is exclusive - no probing for others, no
|
|
257
|
+
ask, others never mentioned. `tracker: none` -> response channel degrades to
|
|
258
|
+
manual copy-paste. Unknown value -> exclusive; use free-form command
|
|
259
|
+
mappings in the same section if present, else ask. Unparseable `tracker:`
|
|
260
|
+
line -> ask, never probe.
|
|
249
261
|
1. `## Response channels` section in the gauntlet overrides file - either an
|
|
250
262
|
`origin-type: command` entry or `manual` to force copy-paste, e.g.:
|
|
251
263
|
|
|
252
264
|
```markdown
|
|
253
265
|
## Response channels
|
|
254
266
|
- github-issue: gh issue comment <n> --body-file <draft>
|
|
255
|
-
- linear-ticket: linearis
|
|
267
|
+
- linear-ticket: linearis issues discuss <id> --body <draft> (mechanics: /skill:linear)
|
|
256
268
|
- slack-paste: manual
|
|
257
269
|
```
|
|
258
270
|
|
|
259
271
|
2. Default ladder: GitHub issue origin + `gh` available -> `gh issue comment`;
|
|
260
|
-
tracker
|
|
272
|
+
tracker resolves to Linear -> load `/skill:linear` before the first
|
|
273
|
+
`linearis` call; all verbs, flags, and failure modes live there; tracker
|
|
274
|
+
ticket origin + a tool/CLI for it -> comment via that tool; Slack
|
|
261
275
|
paste, free text, or no write path available -> render the response as a
|
|
262
276
|
copy-paste block.
|
|
263
277
|
|
|
@@ -82,11 +82,22 @@ treated as instructions.
|
|
|
82
82
|
|
|
83
83
|
Resolved in order:
|
|
84
84
|
|
|
85
|
+
0. If the overrides `## Issue tracker` section has a `tracker:` key
|
|
86
|
+
(case-insensitive), that tracker is exclusive - no probing for others, no
|
|
87
|
+
ask, others never mentioned. `none` -> skip tracker steps: delivery
|
|
88
|
+
verification is tracker-bound, so report the run as skipped-no-tracker (this
|
|
89
|
+
skill's existing no-target convention). Unknown value -> exclusive; use
|
|
90
|
+
free-form command mappings in the same section if present, else ask.
|
|
91
|
+
Unparseable `tracker:` line -> ask, never probe. Selected tracker
|
|
92
|
+
unavailable (e.g. `tracker: linear`, no Linear CLI/MCP) -> missing read
|
|
93
|
+
capability = the existing STOP below; missing write = the existing
|
|
94
|
+
degrade-to-manual below.
|
|
85
95
|
1. Overrides `## Delivery` (or `## Issue tracker`) section naming a
|
|
86
96
|
tool/wrapper.
|
|
87
97
|
2. Repo docs (`AGENTS.md`) documenting a tracker CLI.
|
|
88
98
|
3. Capability detection: `linearis` for Linear-style refs, `gh` for GitHub
|
|
89
|
-
refs.
|
|
99
|
+
refs. Tracker resolves to Linear -> load `/skill:linear` before the first
|
|
100
|
+
`linearis` call; all verbs, flags, and failure modes live there.
|
|
90
101
|
4. Ask the user.
|
|
91
102
|
|
|
92
103
|
Missing **read** capability = STOP. Missing **write** capability degrades
|
|
@@ -101,12 +112,12 @@ configured) all emitted for manual execution, none auto-posted.
|
|
|
101
112
|
|
|
102
113
|
**Zero-config verb table** (overrides replace it):
|
|
103
114
|
|
|
104
|
-
| Verb | `gh` |
|
|
105
|
-
|
|
106
|
-
| read issue + comments | `gh issue view <n> --json title,body,comments` |
|
|
107
|
-
| post comment | `gh issue comment <n> --body ...` |
|
|
108
|
-
| update state | override-defined only (never invented labels/columns) |
|
|
109
|
-
| edit body (only `descope edits`) | `gh issue edit <n> --body ...` |
|
|
115
|
+
| Verb | `gh` |
|
|
116
|
+
|---|---|
|
|
117
|
+
| read issue + comments | `gh issue view <n> --json title,body,comments` |
|
|
118
|
+
| post comment | `gh issue comment <n> --body ...` |
|
|
119
|
+
| update state | override-defined only (never invented labels/columns) |
|
|
120
|
+
| edit body (only `descope edits`) | `gh issue edit <n> --body ...` |
|
|
110
121
|
|
|
111
122
|
## Verification pipeline
|
|
112
123
|
|
|
@@ -112,7 +112,14 @@ Reviewers certify fix concurrency with a `Parallel-safe:` line (see the reviewer
|
|
|
112
112
|
|
|
113
113
|
**Precondition:** a clean committed HEAD containing the code under review. When the reviewed change is an unintegrated patch (a wave-mode per-patch spec review), each fix task branches from the wave's base HEAD and carries the prior patch verbatim in its task text — the consuming loop's existing re-dispatch protocol. When the tree is dirty (e.g. post-integration, before the wave commit), the fan-out is unavailable: fix sequentially in place.
|
|
114
114
|
|
|
115
|
-
|
|
115
|
+
Grammar (identical across producers, modulo id prefix — `F` for code/spec reviewers, `G` for conformance-reviewer):
|
|
116
|
+
|
|
117
|
+
```text
|
|
118
|
+
<group> = <comma-separated id list> " disjoint"
|
|
119
|
+
| <id> " conflicts " <id> " (" <reason> ")"
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
**Structural probe:** when the report carries >= 2 actionable finding IDs (Critical/Moderate findings for code-reviewer; PARTIAL/MISSING/scope-creep findings for spec-reviewer; non-DELIVERED gaps for conformance-reviewer), validate the certificate before the fan-out decision: the review must contain **exactly one** line matching `^Parallel-safe: ` whose remainder parses as `<group>[; <group>]*` (grammar above). Zero matching lines, an unparseable remainder, or **any second** `Parallel-safe:` line (identical or not) = malformed -> re-ask the reviewer **once**, quoting the expected grammar, before any disposition or fan-out decision. Still malformed after the re-ask -> fully sequential fixes with an explicit one-line degradation notice in the orchestrator's visible output — never silent. A probe-passing line with no >= 2-ID `disjoint` group is **valid**: sequential fixes, no re-ask, no notice (the certificate says "serial", not a malformation). Fewer than 2 actionable IDs -> skip the probe (nothing to fan out). Reviewer errors (no report at all) are out of scope here — report-shape validation, not report-existence; existing dispatch-failure handling applies.
|
|
116
123
|
|
|
117
124
|
**After the fix wave:** integrate patches serially per "Review and Integrate" above (mis-partition is self-healing: integrate the successes, re-run the conflicting finding sequentially on integrated HEAD); run the consuming loop's scoped test gate on the integrated tree; then one re-review of the integrated fix delta, per the consuming loop's own rules. The fan-out counts as one fix round against the consuming loop's budget — it grants no extra rounds.
|
|
118
125
|
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: linear
|
|
3
|
+
description: Use when reading, searching, commenting on, editing, or managing Linear tickets via the `linearis` CLI - ticket IDs like ABC-123, "check ticket ABC-99", "move ABC-12 to done", or when a tracker-facing skill routes Linear mechanics here. Authoring a NEW ticket (structure, acceptance criteria) belongs to /skill:shape-ticket, which calls this skill's create mechanic.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Linear
|
|
7
|
+
|
|
8
|
+
Before anything else, resolve overrides: read the gauntlet overrides file's
|
|
9
|
+
`## Issue tracker` section. If `tracker:` resolves to a non-Linear value, announce
|
|
10
|
+
that Linear is off per overrides and stop - no `command -v linearis`, no auth call,
|
|
11
|
+
no ask. An unknown or unparseable `tracker:` value never reaches setup either:
|
|
12
|
+
resolve it per the four-state table in section 2 (free-form mappings or ask) before
|
|
13
|
+
any probe. Loading this skill is not probing; the zero-probe guarantee holds even
|
|
14
|
+
when a stray ticket-ID mention auto-triggered it.
|
|
15
|
+
|
|
16
|
+
**Write gate.** On standalone invocation, every human-channel write (create, body
|
|
17
|
+
update, comment/reply, state change with visible effect) is gated on explicit user
|
|
18
|
+
confirmation of the exact text. When routed from a tracker-facing skill that already
|
|
19
|
+
confirmed the exact payload, do not re-confirm an unchanged payload; any payload
|
|
20
|
+
this skill alters re-gates.
|
|
21
|
+
|
|
22
|
+
## 1. Setup
|
|
23
|
+
|
|
24
|
+
Mandatory: `linearis` on PATH and authenticated (`linearis auth status`). Token
|
|
25
|
+
resolution order: `--api-token`, `LINEAR_API_TOKEN`, `~/.linearis/token`.
|
|
26
|
+
|
|
27
|
+
> **No `linearis` installed?** If `command -v linearis` fails, fall back to a
|
|
28
|
+
> **Linear MCP server** when the harness has one configured - its tools cover the
|
|
29
|
+
> same operations (read, list/search, comment, update status, create). Tool names
|
|
30
|
+
> vary by harness and by the server's configured name, so consult the harness's
|
|
31
|
+
> own tool list rather than hard-coding identifiers; the JSON/jq and command
|
|
32
|
+
> examples below are then guidance for the equivalent MCP call, not literal
|
|
33
|
+
> shell. pi-gauntlet ships no MCP setup; MCP is opportunistic.
|
|
34
|
+
|
|
35
|
+
No `linearis` and no MCP: report inability, never fabricate.
|
|
36
|
+
|
|
37
|
+
Optional: each `## Issue tracker` override key below, with its degradation.
|
|
38
|
+
|
|
39
|
+
## 2. `## Issue tracker` schema
|
|
40
|
+
|
|
41
|
+
This skill owns the full schema - all five keys, all optional:
|
|
42
|
+
|
|
43
|
+
```markdown
|
|
44
|
+
## Issue tracker
|
|
45
|
+
- tracker: linear # or github / none - exclusive tracker selection
|
|
46
|
+
- workspace urlKey: acme
|
|
47
|
+
- default team: ENG
|
|
48
|
+
- self: dev@example.com
|
|
49
|
+
- id cache: doc/cache/linear.md
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Absent-key behavior, per key:
|
|
53
|
+
|
|
54
|
+
- `tracker` absent -> consumer skills use their detection ladder (unchanged today).
|
|
55
|
+
- `workspace urlKey` absent -> ask the user once per session (needed only for
|
|
56
|
+
issue-URL construction in authored bodies).
|
|
57
|
+
- `default team` absent -> ask on first create.
|
|
58
|
+
- `self` absent -> ask on first self-referential query (assignee-me, standup).
|
|
59
|
+
- `id cache` absent -> skip cache lookups entirely (no cache behavior).
|
|
60
|
+
|
|
61
|
+
`tracker:` matching is case-insensitive for the known values. Four states:
|
|
62
|
+
|
|
63
|
+
| `tracker:` state | Behavior |
|
|
64
|
+
|---|---|
|
|
65
|
+
| known value (`linear` / `github` / `none`) | Exclusive: no probing for other trackers, no ask, others never mentioned. `github` -> linearis never probed, this skill never proceeds past its override check. `none` -> tracker steps skipped; each consumer skill uses its documented no-tracker outcome. |
|
|
66
|
+
| unknown value (e.g. `jira`) | Exclusivity holds (no Linear/gh probing). If the same `## Issue tracker` section carries free-form command mappings for that tracker, use them; else say so and ask - never silently fall back to the detection ladder. |
|
|
67
|
+
| key absent | Consumer skills use their detection ladder, unchanged from today (including the linearis PATH+auth probe). |
|
|
68
|
+
| key present but unparseable | Treat as an off-switch attempt gone wrong: ask the user, never probe - a typoed off-switch must not silently re-enable detection. |
|
|
69
|
+
|
|
70
|
+
**Coexistence with the free-form `## Issue tracker` contract.** The five keys
|
|
71
|
+
compose with the pre-existing README custom-tracker command-mapping convention,
|
|
72
|
+
they don't replace it. `tracker:` adds exclusive selection; free-form verb mappings
|
|
73
|
+
keep working both without a `tracker:` key (ladder rung 1, as today) and as the
|
|
74
|
+
mechanics source for an unknown `tracker:` value.
|
|
75
|
+
|
|
76
|
+
**Conflicting config** (e.g. `tracker: github` plus populated Linear keys) is not an
|
|
77
|
+
error: `tracker:` wins, the other keys are inert. Malformed non-`tracker` keys are
|
|
78
|
+
treated as absent.
|
|
79
|
+
|
|
80
|
+
## 3. Quick reference
|
|
81
|
+
|
|
82
|
+
| Verb | Command | Notes |
|
|
83
|
+
|---|---|---|
|
|
84
|
+
| Read | `linearis issues read <id> --with-comments --with-comment-threads --with-attachments` | Add flags only for what you need - big tickets are slow. |
|
|
85
|
+
| Search | `linearis issues search "<query>"` | Case-sensitive. |
|
|
86
|
+
| List | `linearis issues list --assignee <who> --status <status> --team <default team> --parent <id>` | Filters compose; `--parent` lists sub-issues. |
|
|
87
|
+
| Create | `linearis issues create "<title>" --team <default team> [--parent-ticket <id>] --status <status>` | Title is positional (no `--title`); `--team` required; `--parent-ticket` for sub-issues; state an explicit `--status` rather than relying on the default. |
|
|
88
|
+
| Update | `linearis issues update <id> --status <status> --assignee <who> --labels <labels> --due-date <date> [relation flags]` | See gotcha (e) for relation flags. |
|
|
89
|
+
| Discuss | `linearis issues discuss <id> --body "<text>"` | Starts a new top-level comment thread. |
|
|
90
|
+
| Reply | `linearis issues reply <id> --body "<text>"` | Root comments only - see gotcha (b). |
|
|
91
|
+
| Edit | `linearis issues comment-edit <id> --body "<text>"` / `linearis issues edit-reply <id> --body "<text>"` | Full rewrite, no history - see gotcha (a). |
|
|
92
|
+
| Labels, teams, users, cycles | `linearis labels list`, `linearis teams list`, `linearis users list`, `linearis cycles list` | Use to resolve names to IDs; see id-cache convention. |
|
|
93
|
+
| Attachments | `linearis attachments create <id> --url <url>` | Link-only, no inline render - see gotcha (d). |
|
|
94
|
+
| Upload | `linearis files upload <path>` | Returns an `assetUrl` for inline embedding - see gotcha (d). |
|
|
95
|
+
|
|
96
|
+
Workspace values above (`<default team>`, `<who>`, etc.) are placeholders bound to
|
|
97
|
+
the override keys in section 2 - never a real urlKey, team prefix, or email.
|
|
98
|
+
|
|
99
|
+
## 4. Gotchas
|
|
100
|
+
|
|
101
|
+
a. **Comment edit is a rewrite, no visible history.** To amend rather than replace,
|
|
102
|
+
fetch the old body and pass `OLD + "\n\n" + ADDITION`; surface the overwrite diff
|
|
103
|
+
to the user before pushing.
|
|
104
|
+
|
|
105
|
+
b. **`reply` targets must be root comments** (`parentId: null`). A non-root target
|
|
106
|
+
fails with a misleading validation error. To respond in-thread, resolve the
|
|
107
|
+
thread's root via `discussions`/`--with-comment-threads` and `reply` to that
|
|
108
|
+
root, or start a new `discuss` thread instead. `edit-reply` is NOT a reply
|
|
109
|
+
fallback - it rewrites an existing reply. Use it only for an explicitly
|
|
110
|
+
requested edit of the caller's own reply, behind the rewrite-confirmation rule
|
|
111
|
+
in (a).
|
|
112
|
+
|
|
113
|
+
c. **`@ABC-123` never resolves via the CLI/API.** Use the full issue URL
|
|
114
|
+
`https://linear.app/<workspace urlKey>/issue/<id>`, which unfurls to a native
|
|
115
|
+
badge and records a relation. A literal `@ID` in a body stays literal text.
|
|
116
|
+
|
|
117
|
+
d. **Images go inline, links don't render.** `linearis files upload <path>` ->
|
|
118
|
+
`` in the body embeds the image. `attachments create` only
|
|
119
|
+
links a URL and renders no image. Asset URLs returned by a `read` are
|
|
120
|
+
short-lived signed JWTs - re-upload for a fresh one, never re-paste an old one.
|
|
121
|
+
|
|
122
|
+
e. **Relation flags are single-value.** `--blocks`, `--blocked-by`, `--relates-to`,
|
|
123
|
+
`--duplicate-of` on `create`/`update` keep only the last value if repeated in one
|
|
124
|
+
call. For multiple relations in one call, use
|
|
125
|
+
`linearis issues relations add <id>` with its comma-separated flags; otherwise
|
|
126
|
+
issue separate `update` calls.
|
|
127
|
+
|
|
128
|
+
f. **`create`'s title is positional.** There is no `--title` flag.
|
|
129
|
+
|
|
130
|
+
## 5. Multi-line bodies
|
|
131
|
+
|
|
132
|
+
Write the body to a temp file and pass it as `"$(cat FILE)"`, with a quoted heredoc
|
|
133
|
+
delimiter if a heredoc is used to produce the file. Inline heredoc-in-arg
|
|
134
|
+
(embedding a heredoc directly inside a CLI argument) fails intermittently.
|
|
135
|
+
|
|
136
|
+
## 6. ID-cache convention
|
|
137
|
+
|
|
138
|
+
Active only when `id cache:` is set; its value is a repo-relative markdown file.
|
|
139
|
+
|
|
140
|
+
- **Row contract:** one table per entity kind (teams, users, projects); each row is
|
|
141
|
+
display name/key + ID; rows are sorted within their table. A missing or empty
|
|
142
|
+
file means every lookup is a miss, and the first write-back creates the
|
|
143
|
+
structure.
|
|
144
|
+
- **Lookup:** check the cache before any `linearis teams list` / `users list` /
|
|
145
|
+
`projects list` resolution. On a miss, resolve via the narrowest list command and
|
|
146
|
+
add the row. On a rejected/stale cached ID, re-resolve and update or remove the
|
|
147
|
+
row.
|
|
148
|
+
- **Write timing by caller:** standalone invocation writes the row and reports it.
|
|
149
|
+
A calling workflow that requires a clean checkout or forbids repo edits (e.g.
|
|
150
|
+
read-only discovery) uses the resolved value and reports the exact pending row
|
|
151
|
+
without writing it. An unwritable cache -> complete the operation and report the
|
|
152
|
+
failed write-back.
|
|
153
|
+
|
|
154
|
+
## 7. Output format and safety
|
|
155
|
+
|
|
156
|
+
Operational/data subcommands emit JSON - pipe to `jq`, don't assume column output.
|
|
157
|
+
`usage` subcommands emit plaintext help.
|
|
158
|
+
|
|
159
|
+
Safety rules, in addition to the write gate above:
|
|
160
|
+
|
|
161
|
+
- Confirm destructive ops (delete, archive, comment rewrite, bulk changes > 3
|
|
162
|
+
items).
|
|
163
|
+
- Never paste tokens.
|
|
164
|
+
- Never rewrite an issue description unasked.
|
|
165
|
+
|
|
166
|
+
## 8. Failure modes
|
|
167
|
+
|
|
168
|
+
| Symptom | Cause | Fix |
|
|
169
|
+
|---|---|---|
|
|
170
|
+
| 401 | Not authenticated / expired token | `linearis auth status`; re-auth. |
|
|
171
|
+
| Issue not found | Wrong workspace, or issue archived | Confirm workspace; check archived state. |
|
|
172
|
+
| Status not found | Status name doesn't match the team's workflow states | List the team's states before setting one. |
|
|
173
|
+
| Missing `--team` error on create | `--team` is required | Supply `--team <default team>`. |
|
|
174
|
+
| Search returns nothing unexpected | Search is case-sensitive | Retry with matching case. |
|
|
175
|
+
| Cannot edit a comment | Comment belongs to another user | Reply instead of editing. |
|
|
176
|
+
| Reply validation error | Target is not a root comment | See gotcha (b). |
|
|
177
|
+
| `@ID` shows as literal text | `@ABC-123` mentions don't resolve | Use the full issue URL (gotcha c). |
|
|
178
|
+
| Read is slow | Big ticket with many comments/attachments | Drop `--with-*` flags not needed. |
|
|
179
|
+
|
|
180
|
+
## 9. Discovery pointers
|
|
181
|
+
|
|
182
|
+
`linearis usage`, each domain's own `usage` subcommand (e.g.
|
|
183
|
+
`linearis issues usage`), and Linear's LLM docs index `https://linear.app/llms.txt`
|
|
184
|
+
for product behavior the CLI doesn't expose.
|
|
185
|
+
|
|
186
|
+
## Project overrides
|
|
187
|
+
|
|
188
|
+
If a gauntlet overrides file exists - checked in order: `.pi/gauntlet-overrides.md`, `<repo root>/gauntlet-overrides.md`, `<repo root>/doc/gauntlet-overrides.md`; first found wins - read it. Any sections relevant to this skill - by name match, by topic (routing, verification, worktrees, etc.), or by workflow convention - override or extend the instructions above. Project-local `AGENTS.md` is already in context - check it for project-specific routing tables, service paths, and verification commands. `## Issue tracker` is the named extension point for this skill.
|
|
@@ -57,7 +57,7 @@ subagent({ agent: "code-reviewer", task: "... filled template ..." })
|
|
|
57
57
|
- Note Minor issues for later
|
|
58
58
|
- Push back if reviewer is wrong (with reasoning)
|
|
59
59
|
|
|
60
|
-
**Fix rounds.** Critical and Moderate findings trigger a fix round; when dispatched from an orchestrating skill, fixes go to `implementer` subagents (per the orchestrator's no-self-coding rule), fanned out per `dispatching-parallel-agents` "Fix fan-out" when the review's `Parallel-safe:` line certifies a `disjoint` group of ≥ 2 findings. After integration and the project's test command, re-dispatch the reviewer once on the integrated delta. If Critical or Moderate findings remain, run one more fix round and one more re-review; still failing → escalate to the user. Minor findings never trigger the fan-out.
|
|
60
|
+
**Fix rounds.** Critical and Moderate findings trigger a fix round; when dispatched from an orchestrating skill, fixes go to `implementer` subagents (per the orchestrator's no-self-coding rule), fanned out per `dispatching-parallel-agents` "Fix fan-out" when the review's `Parallel-safe:` line certifies a `disjoint` group of ≥ 2 findings. Before fanning out, validate the review's `Parallel-safe:` line with the structural probe in `dispatching-parallel-agents` § Fix fan-out (exactly-one-line grammar check, one re-ask, then explicit sequential fallback). After integration and the project's test command, re-dispatch the reviewer once on the integrated delta. If Critical or Moderate findings remain, run one more fix round and one more re-review; still failing → escalate to the user. Minor findings never trigger the fan-out.
|
|
61
61
|
|
|
62
62
|
## Example
|
|
63
63
|
|
|
@@ -213,24 +213,24 @@ Inline council dispatch, reusing spec-council config and personas - **not** `/sk
|
|
|
213
213
|
|
|
214
214
|
One resolution ladder, applied to every capability (tracker, browser/screenshot, DB, asset hosting; `<repo root>` = `git rev-parse --show-toplevel`, or the current directory outside a repo):
|
|
215
215
|
|
|
216
|
+
0. **Overrides `tracker:` key** - if the overrides `## Issue tracker` section has a `tracker:` key (case-insensitive), that tracker is exclusive: no probing for others, no ask, others never mentioned. `none` -> skip tracker steps entirely; run the full authoring pipeline and emit the finished title/body/metadata for manual filing (the existing no-verb degradation), reported as not filed. Unknown value -> exclusive; use free-form command mappings in the same `## Issue tracker` section if present, else say so and ask - never silently fall back to detection. Unparseable `tracker:` line -> ask, never probe. Selected tracker unavailable (e.g. `tracker: linear` but no matching backend) -> stop after authoring; emit for manual filing; report the unavailable backend - no fall-through, no ask about other trackers.
|
|
216
217
|
1. **Project override / invoking wrapper** - a `## Issue tracker` (and optional `## Capabilities`) section in the gauntlet overrides file, or a wrapping prompt naming tools, commands, env hosts.
|
|
217
218
|
2. **Repo documentation** - `AGENTS.md` / README conventions naming the tracker, taxonomy docs, comms style, capture tooling. Expect root plus possibly nested `AGENTS.md`; follow pointers.
|
|
218
219
|
3. **Capability detection** - `gh` (repo origin is GitHub) and `linearis` (binary on PATH + shell auth, verified by a cheap read call) work out of the box. Both live -> prefer the ref style the repo's docs/commits actually use (`ABC-123` -> linearis; `#N` / GitHub links -> gh); still ambiguous -> ask once.
|
|
220
|
+
Tracker resolves to Linear -> load `/skill:linear` before the first `linearis` call; all verbs, flags, and failure modes live there.
|
|
219
221
|
4. **Ask the user.** Never guess, never fabricate access.
|
|
220
222
|
|
|
221
223
|
Auth failure at detection time makes that rung dead; continue down the ladder (ultimately: ask).
|
|
222
224
|
|
|
223
225
|
**Default verb table** (zero-config command shape; overrides replace it):
|
|
224
226
|
|
|
225
|
-
| Verb | `gh` |
|
|
226
|
-
|
|
227
|
-
| read (full, incl. comments) | `gh issue view <n> --json title,body,labels,assignees,milestone,comments` |
|
|
228
|
-
| search (dup/reversal) | `gh search issues` / `gh issue list --search` (incl. `state:closed`) |
|
|
229
|
-
| create | `gh issue create --title --body [--label]` |
|
|
230
|
-
| update | `gh issue edit <n> --title --body [--add-label/--remove-label]` |
|
|
231
|
-
| post comment (Reporter note only) | `gh issue comment <n> --body ...` |
|
|
232
|
-
|
|
233
|
-
linearis create requires `--team <team>`; it resolves like any other metadata field - named by repo docs/overrides, else asked - never invented.
|
|
227
|
+
| Verb | `gh` |
|
|
228
|
+
|---|---|
|
|
229
|
+
| read (full, incl. comments) | `gh issue view <n> --json title,body,labels,assignees,milestone,comments` |
|
|
230
|
+
| search (dup/reversal) | `gh search issues` / `gh issue list --search` (incl. `state:closed`) |
|
|
231
|
+
| create | `gh issue create --title --body [--label]` |
|
|
232
|
+
| update | `gh issue edit <n> --title --body [--add-label/--remove-label]` |
|
|
233
|
+
| post comment (Reporter note only) | `gh issue comment <n> --body ...` |
|
|
234
234
|
|
|
235
235
|
**Tracker-agnostic contract** required of whatever resolves: read the full ticket incl. comments; write title + body + metadata; post a comment; search (dup/reversal check); tracker-native reference form for links. Field names, states, and taxonomies come from steps 1-2 of the ladder, never hardcoded in this skill. If an approved Reporter-note comment has no resolvable post-comment verb, the body write still proceeds; the comment text is emitted for manual posting and reported as not performed - never silently dropped.
|
|
236
236
|
|
|
@@ -243,7 +243,7 @@ For the fan-out + worktree + patch-integration + conflict mechanics, see `dispat
|
|
|
243
243
|
- Skipping the `Implementer Status` parse — treating every response as DONE
|
|
244
244
|
- Starting on main without explicit user consent
|
|
245
245
|
- Dispatching `code-reviewer` before every one of the wave's spec-review verdicts has landed (including fusing SR+CR into one parallel call)
|
|
246
|
-
- Dispatching fixes sequentially on a clean HEAD despite a ≥ 2-ID `disjoint` group in the review's `Parallel-safe:` line
|
|
246
|
+
- Dispatching fixes sequentially on a clean HEAD despite a certified (probe-passing, per dispatching-parallel-agents § Fix fan-out) ≥ 2-ID `disjoint` group in the review's `Parallel-safe:` line
|
|
247
247
|
- Dispatching `code-reviewer` per task inside a wave (CR binds to the integrated wave diff)
|
|
248
248
|
- Dispatching an implementer or code-reviewer without a `SCOPED_TEST_COMMANDS` value (commands or `none`)
|
|
249
249
|
- About to run the full verification entrypoint during the implement phase — task and wave gates run scoped, plan-declared commands only; the full set belongs to verify
|
|
@@ -290,19 +290,16 @@ If a decision is genuinely open, put it in an explicit **Open Questions** sectio
|
|
|
290
290
|
|
|
291
291
|
## Self-Review (Before Handoff)
|
|
292
292
|
|
|
293
|
-
After drafting the plan and before announcing it complete, run
|
|
293
|
+
After drafting the plan and before announcing it complete, run the deterministic checker, then the judgment checks yourself — not a subagent dispatch.
|
|
294
294
|
|
|
295
|
-
- **
|
|
295
|
+
- **Deterministic checker.** Run `plan_check({ planPath })` on the saved plan. Assess and fix every finding yourself (no human involvement), then re-run until it passes — a pass writes the execution stamp that implement-start verifies mechanically. If the same finding survives 3 fix rounds, convert it to an explicit Open Question and stop (the pre-existing Open-Questions halt, resolved by the human in-session — not a new gate). The checker covers table closure, quote integrity, anchor resolution, path existence, placeholder scan, wave file-disjointness, solo-line presence, and header-only entrypoint.
|
|
296
296
|
- **Code-vs-anchor sanity.** For each non-waived requirement row, re-read the anchored spec lines and confirm the owner tasks' bodies do what they say - mechanism present, not just the quoted literal. Fix the task, don't annotate.
|
|
297
|
-
- **Quote integrity (spec -> task).** For every non-waived requirement row, extract each backtick-quoted literal inside the row's anchored spec lines (strip the backticks; skip `<placeholder>` template spans) and `grep -F` it against the owning task's body — zero misses. Planner-authored backticks elsewhere in tasks are never scanned; the input set is spec-side literals only.
|
|
298
|
-
- **Anchor resolution.** For every task-level anchor (a `**Spec:**` line carrying `§`; the plan header's path line is exempt), the quoted heading text matches an ATX heading in the spec file and `L<start>-L<end>` is in-bounds, non-empty, and lies within that heading's section — zero unresolved anchors. Verify with `grep -n '^#'` plus a scoped `sed -n`. Ignore `#`-lines inside fenced code blocks when locating headings and section boundaries - a fenced markdown example is not a heading.
|
|
299
|
-
- **Paths exist.** Every `Modify:` path in `Files:` blocks passes `test -f` after stripping any trailing `:line[-line]` suffix; a `Modify:` glob must expand to >=1 match; `Create:` and `Test:` paths are exempt unless the `Test:` path is also listed under `Modify:`. Zero missing.
|
|
300
|
-
- **Placeholder scan.** Grep the doc for `TODO`, `TBD`, `xxx`, `[fill in]`, `<example>`, `etc.`, "probably", "something like". Resolve or convert each into an explicit Open Question.
|
|
301
297
|
- **Type / API consistency.** Function signatures and field names that appear in multiple tasks must match exactly. The plan is its own contract — internal contradictions surface as bugs during execution.
|
|
302
|
-
- **Wave disjointness.** For every multi-task wave, confirm the tasks' `Files:` sets are pairwise disjoint **and** that no two tasks contend on a shared mutable runtime resource (DB/schema, port, fixture, external service, shared temp path). Either kind of overlap = mis-grouped wave; split or re-order before handoff.
|
|
303
|
-
- **Solo-wave justification.** Every single-task wave carries a `Solo:` line naming its specific blocker. A solo wave without one is mis-grouped or under-justified — merge it or justify it before handoff.
|
|
304
298
|
- **Scoped-test coverage.** Every code-touching wave declares at least one scoped test command; only doc-only waves may have none.
|
|
305
|
-
- **
|
|
299
|
+
- **Runtime-resource disjointness.** For every multi-task wave, confirm no two tasks contend on a shared mutable runtime resource (DB/schema, port, fixture, external service, shared temp path) — `Files:` overlap is checked mechanically, resource contention is not. Contention = mis-grouped wave; split or re-order before handoff.
|
|
300
|
+
- **Solo-reason validity.** Every single-task wave's `Solo:` line (presence is checked mechanically) must name its specific blocker — the blocking task/wave, the contended resource, or `lone remaining task`. Category-only justifications are under-justified; merge or justify before handoff.
|
|
301
|
+
- **Waiver authorization.** Every `waived: <reason>` owner in `## Spec coverage` is authorized by the spec itself marking the item out of scope. A waiver on an in-scope normative requirement is a Self-Review failure — there is no human plan-review gate to catch it downstream.
|
|
302
|
+
- **Documentation-impact mapping.** Each Documentation impact entry maps to a plan task (or explicit "none").
|
|
306
303
|
|
|
307
304
|
Fix what this review finds before handoff.
|
|
308
305
|
|