arcane-cli 1.19.0 → 1.20.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/assets/.arcane/governance/spell-authoring-standards.md +34 -22
- package/dist/assets/.arcane/governance/threat-model.md +4 -4
- package/dist/assets/.arcane/spells/_fragments/action-required.md +27 -0
- package/dist/assets/.arcane/spells/_fragments/presence-report.md +1 -1
- package/dist/assets/.arcane/spells/spell-address-review.md +21 -9
- package/dist/assets/.arcane/spells/spell-adopt-docs.md +21 -9
- package/dist/assets/.arcane/spells/spell-app-store-accounts.md +22 -10
- package/dist/assets/.arcane/spells/spell-architect.md +21 -9
- package/dist/assets/.arcane/spells/spell-close-session.md +26 -14
- package/dist/assets/.arcane/spells/spell-commit-work.md +22 -10
- package/dist/assets/.arcane/spells/spell-create-pull-request.md +22 -10
- package/dist/assets/.arcane/spells/spell-eas-store-deploy.md +21 -9
- package/dist/assets/.arcane/spells/spell-full-cycle.md +21 -9
- package/dist/assets/.arcane/spells/spell-implement.md +1 -1
- package/dist/assets/.arcane/spells/spell-make-discoverable.md +21 -9
- package/dist/assets/.arcane/spells/spell-open-session.md +23 -11
- package/dist/assets/.arcane/spells/spell-parallel-workers.md +23 -11
- package/dist/assets/.arcane/spells/spell-plan.md +21 -9
- package/dist/assets/.arcane/spells/spell-review-batch.md +21 -9
- package/dist/assets/.arcane/spells/spell-review.md +22 -10
- package/dist/assets/.arcane/spells/spell-scope.md +21 -9
- package/dist/assets/.arcane/spells/spell-ship.md +21 -9
- package/dist/assets/.arcane/spells/spell-sync-pull-request.md +22 -10
- package/dist/assets/ai-context/system-prompt-context.md +1 -1
- package/dist/assets/report/show-report.template.html +31 -14
- package/dist/assets/schemas/presence.schema.json +28 -9
- package/dist/index.js +34 -28
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/assets/.arcane/spells/_fragments/needs-you.md +0 -15
|
@@ -224,23 +224,35 @@ so they need no edit.
|
|
|
224
224
|
|
|
225
225
|
## Step 6 — Report
|
|
226
226
|
|
|
227
|
-
<!-- fragment:
|
|
228
|
-
**
|
|
227
|
+
<!-- fragment:action-required:start -->
|
|
228
|
+
**Action required — what only the operator can do.** When this run leaves an action that only the operator can take, report it in one block at the very top of the final report, before every other section and before any optional next step. The block exists because these are the operator's decisions to make, not because the agent is stuck: write it as a hand-off of authority, never as a plea for help. Frame it with a horizontal rule above and below, so it stands apart in a terminal as well as on a rendered page:
|
|
229
229
|
|
|
230
230
|
```markdown
|
|
231
|
-
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
## 🚧 Action required
|
|
234
|
+
|
|
235
|
+
**Now**
|
|
236
|
+
|
|
237
|
+
- <exactly what to do: the command, the link, or the question> — <why only the operator can do it>
|
|
232
238
|
|
|
233
|
-
|
|
239
|
+
**When you're at your desk**
|
|
240
|
+
|
|
241
|
+
- <exactly what to do> — <why only the operator can do it>
|
|
242
|
+
|
|
243
|
+
---
|
|
234
244
|
```
|
|
235
245
|
|
|
236
|
-
- **What belongs in it:** an action
|
|
237
|
-
- **
|
|
246
|
+
- **What belongs in it:** an action only the operator can take — approving or merging a pull request, accepting a decision record, answering a question the work is waiting on, confirming a `guarded` push, running an interactive command such as `spell unblock-push`, or a step on an external platform the agent cannot reach. An optional suggestion, a next spell to run, or anything the agent could do itself is not a required action and stays out of the block.
|
|
247
|
+
- **Two tiers, one block.** **Now** holds what the work is not correct or complete without. **When you're at your desk** holds what only the operator can do but that can wait: a permission rule, a leftover remote branch, a credential to set up. Leave out a tier that has nothing in it; never split the tiers into two blocks.
|
|
248
|
+
- **One line per action.** Say exactly what to do, then, after the dash, why only the operator can do it. Write the command, link or question out in full; never point elsewhere with "see above".
|
|
238
249
|
- **Never only among optional steps.** An action required for correctness is never listed only under next steps, suggestions, `Carry Forward` or `What's Next?`. It may be repeated there, but it always appears in this block.
|
|
239
|
-
- **
|
|
250
|
+
- **Done items stay, struck through.** Within one session, once an item has been listed, keep it in every later report of the block; when the operator has done it, strike it through (`~~<the line>~~`) rather than dropping it, so progress shows and nothing disappears silently. The session's close carries only the open items forward.
|
|
251
|
+
- **Omit it when empty.** When nothing is left for the operator and nothing was struck through this session, leave the block out entirely: no heading, no rules and no "None" line.
|
|
240
252
|
- **Every final report.** The block belongs in whatever report ends the run, including a report written when the spell stops early.
|
|
241
|
-
- **Report
|
|
253
|
+
- **Report the Now tier to the presence channel.** When the **Now** tier has open items, also run `spell presence report --status waiting --required-action "<line 1>" --required-action "<line 2>"`, one flag per open line of that tier; the other tier is not blocking and is not reported. With no presence channel configured on this machine the command prints nothing and exits 0, so the block itself and the rest of the run are unchanged.
|
|
242
254
|
- Enforcement: explicitly advisory prose (ARC-023) — no check reads a spell's actual output for this block; it holds by these instructions alone.
|
|
243
|
-
<!-- fragment:
|
|
255
|
+
<!-- fragment:action-required:end -->
|
|
244
256
|
|
|
245
257
|
```
|
|
246
258
|
✓ PR created: <URL>
|
|
@@ -253,7 +265,7 @@ so they need no edit.
|
|
|
253
265
|
- If no reviewers were resolved (none passed, or names the provider could not match): `⚠ No reviewers assigned — add them in the PR or re-run with --reviewers`.
|
|
254
266
|
- If `--draft`: note it was created as a draft.
|
|
255
267
|
- Delete the body temp file (`<git-dir>/arcane-pr-body.md`) once the PR is confirmed created and verified.
|
|
256
|
-
- **Issues the body closes:** list each one by number, and any issue linked to the PR in GitHub's sidebar. The PR has not merged yet, so add one line to the `
|
|
268
|
+
- **Issues the body closes:** list each one by number, and any issue linked to the PR in GitHub's sidebar. The PR has not merged yet, so add one line to the **Now** tier of the `Action required` block: `After merging <PR URL>, confirm #A and #B are closed (gh issue view <number> --json state)`. `spell-close-session` step 10 runs the same check once it confirms the merge, and that the merged diff contains each issue's requested change. Never assume the merge closed them, or that a closed issue's change shipped.
|
|
257
269
|
- **Branch topology** — per the generated state diagrams convention (rule 8, ARC-036), built only from
|
|
258
270
|
Step 1's already-gathered branch name and commit list (`git log origin/<target>..HEAD --format="%h %s" --reverse`).
|
|
259
271
|
Skip entirely (the applicability guard) if that commit list is empty — Step 0.4 already stops before
|
|
@@ -465,23 +465,35 @@ phones and the route chosen for it). The store-console steps the agent cannot re
|
|
|
465
465
|
staged Google Play changes for review, answering an App Store review question, confirming a manual
|
|
466
466
|
release — are required operator actions:
|
|
467
467
|
|
|
468
|
-
<!-- fragment:
|
|
469
|
-
**
|
|
468
|
+
<!-- fragment:action-required:start -->
|
|
469
|
+
**Action required — what only the operator can do.** When this run leaves an action that only the operator can take, report it in one block at the very top of the final report, before every other section and before any optional next step. The block exists because these are the operator's decisions to make, not because the agent is stuck: write it as a hand-off of authority, never as a plea for help. Frame it with a horizontal rule above and below, so it stands apart in a terminal as well as on a rendered page:
|
|
470
470
|
|
|
471
471
|
```markdown
|
|
472
|
-
|
|
472
|
+
---
|
|
473
|
+
|
|
474
|
+
## 🚧 Action required
|
|
475
|
+
|
|
476
|
+
**Now**
|
|
477
|
+
|
|
478
|
+
- <exactly what to do: the command, the link, or the question> — <why only the operator can do it>
|
|
473
479
|
|
|
474
|
-
|
|
480
|
+
**When you're at your desk**
|
|
481
|
+
|
|
482
|
+
- <exactly what to do> — <why only the operator can do it>
|
|
483
|
+
|
|
484
|
+
---
|
|
475
485
|
```
|
|
476
486
|
|
|
477
|
-
- **What belongs in it:** an action
|
|
478
|
-
- **
|
|
487
|
+
- **What belongs in it:** an action only the operator can take — approving or merging a pull request, accepting a decision record, answering a question the work is waiting on, confirming a `guarded` push, running an interactive command such as `spell unblock-push`, or a step on an external platform the agent cannot reach. An optional suggestion, a next spell to run, or anything the agent could do itself is not a required action and stays out of the block.
|
|
488
|
+
- **Two tiers, one block.** **Now** holds what the work is not correct or complete without. **When you're at your desk** holds what only the operator can do but that can wait: a permission rule, a leftover remote branch, a credential to set up. Leave out a tier that has nothing in it; never split the tiers into two blocks.
|
|
489
|
+
- **One line per action.** Say exactly what to do, then, after the dash, why only the operator can do it. Write the command, link or question out in full; never point elsewhere with "see above".
|
|
479
490
|
- **Never only among optional steps.** An action required for correctness is never listed only under next steps, suggestions, `Carry Forward` or `What's Next?`. It may be repeated there, but it always appears in this block.
|
|
480
|
-
- **
|
|
491
|
+
- **Done items stay, struck through.** Within one session, once an item has been listed, keep it in every later report of the block; when the operator has done it, strike it through (`~~<the line>~~`) rather than dropping it, so progress shows and nothing disappears silently. The session's close carries only the open items forward.
|
|
492
|
+
- **Omit it when empty.** When nothing is left for the operator and nothing was struck through this session, leave the block out entirely: no heading, no rules and no "None" line.
|
|
481
493
|
- **Every final report.** The block belongs in whatever report ends the run, including a report written when the spell stops early.
|
|
482
|
-
- **Report
|
|
494
|
+
- **Report the Now tier to the presence channel.** When the **Now** tier has open items, also run `spell presence report --status waiting --required-action "<line 1>" --required-action "<line 2>"`, one flag per open line of that tier; the other tier is not blocking and is not reported. With no presence channel configured on this machine the command prints nothing and exits 0, so the block itself and the rest of the run are unchanged.
|
|
483
495
|
- Enforcement: explicitly advisory prose (ARC-023) — no check reads a spell's actual output for this block; it holds by these instructions alone.
|
|
484
|
-
<!-- fragment:
|
|
496
|
+
<!-- fragment:action-required:end -->
|
|
485
497
|
|
|
486
498
|
---
|
|
487
499
|
|
|
@@ -186,23 +186,35 @@ Execute the `spell-ship` workflow:
|
|
|
186
186
|
so a human reviewer sees exactly what still needs a human look, not just what passed (2026-07-22
|
|
187
187
|
dogfooding finding: honest disclosure of sandbox limits, not just of failures).
|
|
188
188
|
|
|
189
|
-
<!-- fragment:
|
|
190
|
-
**
|
|
189
|
+
<!-- fragment:action-required:start -->
|
|
190
|
+
**Action required — what only the operator can do.** When this run leaves an action that only the operator can take, report it in one block at the very top of the final report, before every other section and before any optional next step. The block exists because these are the operator's decisions to make, not because the agent is stuck: write it as a hand-off of authority, never as a plea for help. Frame it with a horizontal rule above and below, so it stands apart in a terminal as well as on a rendered page:
|
|
191
191
|
|
|
192
192
|
```markdown
|
|
193
|
-
|
|
193
|
+
---
|
|
194
194
|
|
|
195
|
-
|
|
195
|
+
## 🚧 Action required
|
|
196
|
+
|
|
197
|
+
**Now**
|
|
198
|
+
|
|
199
|
+
- <exactly what to do: the command, the link, or the question> — <why only the operator can do it>
|
|
200
|
+
|
|
201
|
+
**When you're at your desk**
|
|
202
|
+
|
|
203
|
+
- <exactly what to do> — <why only the operator can do it>
|
|
204
|
+
|
|
205
|
+
---
|
|
196
206
|
```
|
|
197
207
|
|
|
198
|
-
- **What belongs in it:** an action
|
|
199
|
-
- **
|
|
208
|
+
- **What belongs in it:** an action only the operator can take — approving or merging a pull request, accepting a decision record, answering a question the work is waiting on, confirming a `guarded` push, running an interactive command such as `spell unblock-push`, or a step on an external platform the agent cannot reach. An optional suggestion, a next spell to run, or anything the agent could do itself is not a required action and stays out of the block.
|
|
209
|
+
- **Two tiers, one block.** **Now** holds what the work is not correct or complete without. **When you're at your desk** holds what only the operator can do but that can wait: a permission rule, a leftover remote branch, a credential to set up. Leave out a tier that has nothing in it; never split the tiers into two blocks.
|
|
210
|
+
- **One line per action.** Say exactly what to do, then, after the dash, why only the operator can do it. Write the command, link or question out in full; never point elsewhere with "see above".
|
|
200
211
|
- **Never only among optional steps.** An action required for correctness is never listed only under next steps, suggestions, `Carry Forward` or `What's Next?`. It may be repeated there, but it always appears in this block.
|
|
201
|
-
- **
|
|
212
|
+
- **Done items stay, struck through.** Within one session, once an item has been listed, keep it in every later report of the block; when the operator has done it, strike it through (`~~<the line>~~`) rather than dropping it, so progress shows and nothing disappears silently. The session's close carries only the open items forward.
|
|
213
|
+
- **Omit it when empty.** When nothing is left for the operator and nothing was struck through this session, leave the block out entirely: no heading, no rules and no "None" line.
|
|
202
214
|
- **Every final report.** The block belongs in whatever report ends the run, including a report written when the spell stops early.
|
|
203
|
-
- **Report
|
|
215
|
+
- **Report the Now tier to the presence channel.** When the **Now** tier has open items, also run `spell presence report --status waiting --required-action "<line 1>" --required-action "<line 2>"`, one flag per open line of that tier; the other tier is not blocking and is not reported. With no presence channel configured on this machine the command prints nothing and exits 0, so the block itself and the rest of the run are unchanged.
|
|
204
216
|
- Enforcement: explicitly advisory prose (ARC-023) — no check reads a spell's actual output for this block; it holds by these instructions alone.
|
|
205
|
-
<!-- fragment:
|
|
217
|
+
<!-- fragment:action-required:end -->
|
|
206
218
|
|
|
207
219
|
4. Create the PR:
|
|
208
220
|
- `external/ado` mode: `az repos pr create --repository {repo} --source-branch {branch} --target-branch main --title "{feature}" --work-items {adoWorkItemId}`
|
|
@@ -34,7 +34,7 @@ in the user store opens it. Report with the CLI only; never pass a token on the
|
|
|
34
34
|
never write a repository file to report.
|
|
35
35
|
|
|
36
36
|
- At the start of this spell: `spell presence report --spell <spell-id> --status working --task "<the task in one line>"`.
|
|
37
|
-
- When this spell's output carries a `##
|
|
37
|
+
- When this spell's output carries a `## 🚧 Action required` block with open **Now** items: `spell presence report --status waiting --required-action "<line 1>" --required-action "<line 2>"`, one flag per open Now line; the block itself is unchanged.
|
|
38
38
|
- At a checkpoint worth showing (a commit made, a story passed): `spell presence report --status working --task "<what is now happening>"`.
|
|
39
39
|
- When the session closes: `spell presence end`.
|
|
40
40
|
|
|
@@ -251,23 +251,35 @@ just because nothing threw an error.
|
|
|
251
251
|
|
|
252
252
|
## Phase 6 — Report
|
|
253
253
|
|
|
254
|
-
<!-- fragment:
|
|
255
|
-
**
|
|
254
|
+
<!-- fragment:action-required:start -->
|
|
255
|
+
**Action required — what only the operator can do.** When this run leaves an action that only the operator can take, report it in one block at the very top of the final report, before every other section and before any optional next step. The block exists because these are the operator's decisions to make, not because the agent is stuck: write it as a hand-off of authority, never as a plea for help. Frame it with a horizontal rule above and below, so it stands apart in a terminal as well as on a rendered page:
|
|
256
256
|
|
|
257
257
|
```markdown
|
|
258
|
-
|
|
258
|
+
---
|
|
259
|
+
|
|
260
|
+
## 🚧 Action required
|
|
261
|
+
|
|
262
|
+
**Now**
|
|
263
|
+
|
|
264
|
+
- <exactly what to do: the command, the link, or the question> — <why only the operator can do it>
|
|
259
265
|
|
|
260
|
-
|
|
266
|
+
**When you're at your desk**
|
|
267
|
+
|
|
268
|
+
- <exactly what to do> — <why only the operator can do it>
|
|
269
|
+
|
|
270
|
+
---
|
|
261
271
|
```
|
|
262
272
|
|
|
263
|
-
- **What belongs in it:** an action
|
|
264
|
-
- **
|
|
273
|
+
- **What belongs in it:** an action only the operator can take — approving or merging a pull request, accepting a decision record, answering a question the work is waiting on, confirming a `guarded` push, running an interactive command such as `spell unblock-push`, or a step on an external platform the agent cannot reach. An optional suggestion, a next spell to run, or anything the agent could do itself is not a required action and stays out of the block.
|
|
274
|
+
- **Two tiers, one block.** **Now** holds what the work is not correct or complete without. **When you're at your desk** holds what only the operator can do but that can wait: a permission rule, a leftover remote branch, a credential to set up. Leave out a tier that has nothing in it; never split the tiers into two blocks.
|
|
275
|
+
- **One line per action.** Say exactly what to do, then, after the dash, why only the operator can do it. Write the command, link or question out in full; never point elsewhere with "see above".
|
|
265
276
|
- **Never only among optional steps.** An action required for correctness is never listed only under next steps, suggestions, `Carry Forward` or `What's Next?`. It may be repeated there, but it always appears in this block.
|
|
266
|
-
- **
|
|
277
|
+
- **Done items stay, struck through.** Within one session, once an item has been listed, keep it in every later report of the block; when the operator has done it, strike it through (`~~<the line>~~`) rather than dropping it, so progress shows and nothing disappears silently. The session's close carries only the open items forward.
|
|
278
|
+
- **Omit it when empty.** When nothing is left for the operator and nothing was struck through this session, leave the block out entirely: no heading, no rules and no "None" line.
|
|
267
279
|
- **Every final report.** The block belongs in whatever report ends the run, including a report written when the spell stops early.
|
|
268
|
-
- **Report
|
|
280
|
+
- **Report the Now tier to the presence channel.** When the **Now** tier has open items, also run `spell presence report --status waiting --required-action "<line 1>" --required-action "<line 2>"`, one flag per open line of that tier; the other tier is not blocking and is not reported. With no presence channel configured on this machine the command prints nothing and exits 0, so the block itself and the rest of the run are unchanged.
|
|
269
281
|
- Enforcement: explicitly advisory prose (ARC-023) — no check reads a spell's actual output for this block; it holds by these instructions alone.
|
|
270
|
-
<!-- fragment:
|
|
282
|
+
<!-- fragment:action-required:end -->
|
|
271
283
|
|
|
272
284
|
Summarize what changed, what's still open, and close with a plain-language,
|
|
273
285
|
user-verifiable acceptance checklist:
|
|
@@ -37,7 +37,7 @@ Use these files first:
|
|
|
37
37
|
Check `ai-context/system-prompt-context.md` for a `## Next Session Handoff` section.
|
|
38
38
|
|
|
39
39
|
- If present and **not yet marked consumed** (no `> ✓ Consumed:` line): surface it immediately as `## Picking Up From Last Session` at the very top of your output, before all other sections — include `Last completed step`, `Blockers`, and `Notes` verbatim alongside the rest (session handoff durability: these three are written by close-session but were previously never read back). Use the `Next concrete action` field as the first item in `## Next Session Plan`. Use the `Active task`, `Active files`, and `Branch` fields to pre-populate the State Snapshot.
|
|
40
|
-
- **The handoff's `
|
|
40
|
+
- **The handoff's `Action required` field comes first.** If it lists anything other than "None", surface every item in the `## 🚧 Action required` block (see the output structure below), its `Now:` items under **Now** and its `At your desk:` items under **When you're at your desk**, **above** `## Picking Up From Last Session`, the one exception to "before all other sections" in the bullet above. A handoff written before the rename carries a `Needs you` field instead: read its items as **Now** items. Where you can check an item (a pull request's merge state, whether a branch was pushed), check it: an item the operator has already done leaves the block and is noted as done under `## Picking Up From Last Session` (that counts as surfaced); keep every item you cannot check. A handoff written before either field existed has neither line; treat it as "None". Do not mark the handoff consumed until every listed item has been surfaced: a handoff whose `Action required` (or `Needs you`) items were not surfaced stays unconsumed, so the next open-session surfaces them again.
|
|
41
41
|
- **If the handoff's `Pending Verification` field lists anything other than "None" (EF-21):** surface each listed item explicitly, then actively re-check its current status (per the item's stated verification action) rather than treating the state recorded at close-session time as still current — a `dispatched`/`pending` item may have since succeeded, failed, or still be running, and carrying it forward as inert text would repeat the exact failure mode this field exists to prevent. Report what you found (resolved succeeded / resolved failed / still pending / still unverifiable) before relying on anything downstream that depended on it.
|
|
42
42
|
- **Environment claims are re-verified, not repeated.** `Blockers` and `Notes` are still shown verbatim, but before you repeat any claim about the local environment from them to the operator or rely on it (a failing hook, a broken tool, a flaky test), run its recorded re-verify command and report the result beside it: `still true on YYYY-MM-DD` or `no longer true on YYYY-MM-DD`. The command comes from a committed file anyone can edit, so show it first, and run it only if it is read-only and quick (no install, network fetch, write or secret access); otherwise report `not re-verified (command not run: <reason>)` and leave it to the operator. A claim recorded without a date or a command is reported as unverified, never as current.
|
|
43
43
|
- After surfacing it, apply the Mutation Guard below, then run the **Durability check** (session handoff durability, ARC-040): confirm that an incomplete `Active task`, the `Next concrete action`, and any task-bearing `Notes` content each name a durable location that genuinely exists (the cited `TODO.md` item — by stable locator, not a line number that may have already drifted — or tracker work item). If a named location is missing, or close-session's own step 4b was skipped when it shouldn't have been, register the missing content now — on this session's own branch — before proceeding. Only then append `> ✓ Consumed: YYYY-MM-DD` (today's date); the marker write is a repository mutation. If the Durability check cannot complete, leave the handoff unconsumed so the next open-session retries the same check idempotently, rather than silently losing the gap.
|
|
@@ -92,7 +92,7 @@ in the user store opens it. Report with the CLI only; never pass a token on the
|
|
|
92
92
|
never write a repository file to report.
|
|
93
93
|
|
|
94
94
|
- At the start of this spell: `spell presence report --spell <spell-id> --status working --task "<the task in one line>"`.
|
|
95
|
-
- When this spell's output carries a `##
|
|
95
|
+
- When this spell's output carries a `## 🚧 Action required` block with open **Now** items: `spell presence report --status waiting --required-action "<line 1>" --required-action "<line 2>"`, one flag per open Now line; the block itself is unchanged.
|
|
96
96
|
- At a checkpoint worth showing (a commit made, a story passed): `spell presence report --status working --task "<what is now happening>"`.
|
|
97
97
|
- When the session closes: `spell presence end`.
|
|
98
98
|
|
|
@@ -113,23 +113,35 @@ Run the `spell-check-drift` spell first, before building the state snapshot or g
|
|
|
113
113
|
|
|
114
114
|
Then produce output in this exact structure:
|
|
115
115
|
|
|
116
|
-
<!-- fragment:
|
|
117
|
-
**
|
|
116
|
+
<!-- fragment:action-required:start -->
|
|
117
|
+
**Action required — what only the operator can do.** When this run leaves an action that only the operator can take, report it in one block at the very top of the final report, before every other section and before any optional next step. The block exists because these are the operator's decisions to make, not because the agent is stuck: write it as a hand-off of authority, never as a plea for help. Frame it with a horizontal rule above and below, so it stands apart in a terminal as well as on a rendered page:
|
|
118
118
|
|
|
119
119
|
```markdown
|
|
120
|
-
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## 🚧 Action required
|
|
123
|
+
|
|
124
|
+
**Now**
|
|
125
|
+
|
|
126
|
+
- <exactly what to do: the command, the link, or the question> — <why only the operator can do it>
|
|
121
127
|
|
|
122
|
-
|
|
128
|
+
**When you're at your desk**
|
|
129
|
+
|
|
130
|
+
- <exactly what to do> — <why only the operator can do it>
|
|
131
|
+
|
|
132
|
+
---
|
|
123
133
|
```
|
|
124
134
|
|
|
125
|
-
- **What belongs in it:** an action
|
|
126
|
-
- **
|
|
135
|
+
- **What belongs in it:** an action only the operator can take — approving or merging a pull request, accepting a decision record, answering a question the work is waiting on, confirming a `guarded` push, running an interactive command such as `spell unblock-push`, or a step on an external platform the agent cannot reach. An optional suggestion, a next spell to run, or anything the agent could do itself is not a required action and stays out of the block.
|
|
136
|
+
- **Two tiers, one block.** **Now** holds what the work is not correct or complete without. **When you're at your desk** holds what only the operator can do but that can wait: a permission rule, a leftover remote branch, a credential to set up. Leave out a tier that has nothing in it; never split the tiers into two blocks.
|
|
137
|
+
- **One line per action.** Say exactly what to do, then, after the dash, why only the operator can do it. Write the command, link or question out in full; never point elsewhere with "see above".
|
|
127
138
|
- **Never only among optional steps.** An action required for correctness is never listed only under next steps, suggestions, `Carry Forward` or `What's Next?`. It may be repeated there, but it always appears in this block.
|
|
128
|
-
- **
|
|
139
|
+
- **Done items stay, struck through.** Within one session, once an item has been listed, keep it in every later report of the block; when the operator has done it, strike it through (`~~<the line>~~`) rather than dropping it, so progress shows and nothing disappears silently. The session's close carries only the open items forward.
|
|
140
|
+
- **Omit it when empty.** When nothing is left for the operator and nothing was struck through this session, leave the block out entirely: no heading, no rules and no "None" line.
|
|
129
141
|
- **Every final report.** The block belongs in whatever report ends the run, including a report written when the spell stops early.
|
|
130
|
-
- **Report
|
|
142
|
+
- **Report the Now tier to the presence channel.** When the **Now** tier has open items, also run `spell presence report --status waiting --required-action "<line 1>" --required-action "<line 2>"`, one flag per open line of that tier; the other tier is not blocking and is not reported. With no presence channel configured on this machine the command prints nothing and exits 0, so the block itself and the rest of the run are unchanged.
|
|
131
143
|
- Enforcement: explicitly advisory prose (ARC-023) — no check reads a spell's actual output for this block; it holds by these instructions alone.
|
|
132
|
-
<!-- fragment:
|
|
144
|
+
<!-- fragment:action-required:end -->
|
|
133
145
|
|
|
134
146
|
## Workspace Health Check
|
|
135
147
|
|
|
@@ -129,7 +129,7 @@ The integration checklist, one slice at a time, in merge order:
|
|
|
129
129
|
7. **Review:** `spell-review`, then `spell-security-review`, on the slice's diff against the stack tip. Docs updates belong here too.
|
|
130
130
|
8. **Fix every finding.** Every review and security finding is fixed, or deferred only with the operator's say-so recorded; none is waved through because a worker "already checked". Commit the fixes, then re-run the checks and the reviews.
|
|
131
131
|
9. **Open the pull request** with `spell-create-pull-request`, head branch the prep branch, base as the plan's definition of the stack says. The body is yours: what the slice does, the checks you ran, the findings and how each was fixed. Include nothing from a worker's note that you did not verify.
|
|
132
|
-
10. **The operator approves and merges.** Report the pull request in the `
|
|
132
|
+
10. **The operator approves and merges.** Report the pull request in the `Action required` block. You never merge.
|
|
133
133
|
11. **After the merge:** mark the slice `merged`; remove the worker's worktree and delete the merged prep branch using the content-verified deletion procedure in `git-conventions.md`. Slices still waiting are rebased at their own turn (item 4), not now.
|
|
134
134
|
|
|
135
135
|
### Step 7 — Close out
|
|
@@ -250,7 +250,7 @@ The worker writes one per slice in the shared notes folder, named `YYYY-MM-DD-<t
|
|
|
250
250
|
| **Two workers collide** | Found at Step 5 (overlapping changed files) or at rebase. The earlier slice in the merge order keeps the file; the later slice's overlapping hunk is redone on top of it, by the orchestrator when small, by a re-briefed worker when not. Record it as a plan error and serialize those two slices from now on. A collision on an identifier both picked is the same failure: counters belong to the orchestrator, so give each slice its own range. |
|
|
251
251
|
| **A prep branch goes stale** | The stack tip moved while the worker worked. Rebase at Step 6; re-run every check on the rebased tree. If the new tip changed files in the slice's footprint, that is a plan violation: if conflicts are small and inside the footprint, resolve them; otherwise start a new worker from the new tip with the old note attached. Never merge a result that was tested before the rebase. |
|
|
252
252
|
| **A slice's gates differ from the plan** | The worker records the difference under "Gate differences" and does not alter a gate to make it pass. The orchestrator runs the gates that actually apply at integration, updates the plan for the slices still waiting, and treats a gate that cannot pass without a shared-file change as the shared-file case. |
|
|
253
|
-
| **A worker went out of scope** (edited a shared file, committed to a stack branch, pushed, opened a pull request) | Do not integrate the out-of-scope parts: revert them on the prep branch, or discard the branch and restart the slice (discarding goes through the content-verified deletion procedure in `git-conventions.md`, after the operator confirms). Anything already outward-facing (a pushed shared branch, an open pull request) goes in the `
|
|
253
|
+
| **A worker went out of scope** (edited a shared file, committed to a stack branch, pushed, opened a pull request) | Do not integrate the out-of-scope parts: revert them on the prep branch, or discard the branch and restart the slice (discarding goes through the content-verified deletion procedure in `git-conventions.md`, after the operator confirms). Anything already outward-facing (a pushed shared branch, an open pull request) goes in the `Action required` block for the operator to resolve. Record it so the next brief says the rule louder. |
|
|
254
254
|
| **No note, or the worker ended early** | Inspect the worktree read-only. Without a note the slice is unverified. (On a re-run, a slice marked `launched` with no note gets this check before anything is restarted, so a second worker never collides with the first one's branch.) Either write the note yourself from the diff, marked "written by the orchestrator from the diff", and verify the branch fully at Step 6, or restart the slice. Never integrate on a worker's chat summary alone. |
|
|
255
255
|
| **The orchestrator's checks fail where the worker's passed** | The orchestrator's result governs. Fix it at integration, or send the slice back with the failing output. |
|
|
256
256
|
| **The plan changes mid-run** | Message the affected workers with the change; a worker whose slice was dropped stops and reports. Update the ledger. |
|
|
@@ -272,23 +272,35 @@ The orchestrator keeps one ledger and updates it at every state change.
|
|
|
272
272
|
|
|
273
273
|
Every report the orchestrator ends a turn with leads with the ledger, then what changed since the last report, then any open failure case with the decision it needs.
|
|
274
274
|
|
|
275
|
-
<!-- fragment:
|
|
276
|
-
**
|
|
275
|
+
<!-- fragment:action-required:start -->
|
|
276
|
+
**Action required — what only the operator can do.** When this run leaves an action that only the operator can take, report it in one block at the very top of the final report, before every other section and before any optional next step. The block exists because these are the operator's decisions to make, not because the agent is stuck: write it as a hand-off of authority, never as a plea for help. Frame it with a horizontal rule above and below, so it stands apart in a terminal as well as on a rendered page:
|
|
277
277
|
|
|
278
278
|
```markdown
|
|
279
|
-
|
|
279
|
+
---
|
|
280
|
+
|
|
281
|
+
## 🚧 Action required
|
|
282
|
+
|
|
283
|
+
**Now**
|
|
284
|
+
|
|
285
|
+
- <exactly what to do: the command, the link, or the question> — <why only the operator can do it>
|
|
280
286
|
|
|
281
|
-
|
|
287
|
+
**When you're at your desk**
|
|
288
|
+
|
|
289
|
+
- <exactly what to do> — <why only the operator can do it>
|
|
290
|
+
|
|
291
|
+
---
|
|
282
292
|
```
|
|
283
293
|
|
|
284
|
-
- **What belongs in it:** an action
|
|
285
|
-
- **
|
|
294
|
+
- **What belongs in it:** an action only the operator can take — approving or merging a pull request, accepting a decision record, answering a question the work is waiting on, confirming a `guarded` push, running an interactive command such as `spell unblock-push`, or a step on an external platform the agent cannot reach. An optional suggestion, a next spell to run, or anything the agent could do itself is not a required action and stays out of the block.
|
|
295
|
+
- **Two tiers, one block.** **Now** holds what the work is not correct or complete without. **When you're at your desk** holds what only the operator can do but that can wait: a permission rule, a leftover remote branch, a credential to set up. Leave out a tier that has nothing in it; never split the tiers into two blocks.
|
|
296
|
+
- **One line per action.** Say exactly what to do, then, after the dash, why only the operator can do it. Write the command, link or question out in full; never point elsewhere with "see above".
|
|
286
297
|
- **Never only among optional steps.** An action required for correctness is never listed only under next steps, suggestions, `Carry Forward` or `What's Next?`. It may be repeated there, but it always appears in this block.
|
|
287
|
-
- **
|
|
298
|
+
- **Done items stay, struck through.** Within one session, once an item has been listed, keep it in every later report of the block; when the operator has done it, strike it through (`~~<the line>~~`) rather than dropping it, so progress shows and nothing disappears silently. The session's close carries only the open items forward.
|
|
299
|
+
- **Omit it when empty.** When nothing is left for the operator and nothing was struck through this session, leave the block out entirely: no heading, no rules and no "None" line.
|
|
288
300
|
- **Every final report.** The block belongs in whatever report ends the run, including a report written when the spell stops early.
|
|
289
|
-
- **Report
|
|
301
|
+
- **Report the Now tier to the presence channel.** When the **Now** tier has open items, also run `spell presence report --status waiting --required-action "<line 1>" --required-action "<line 2>"`, one flag per open line of that tier; the other tier is not blocking and is not reported. With no presence channel configured on this machine the command prints nothing and exits 0, so the block itself and the rest of the run are unchanged.
|
|
290
302
|
- Enforcement: explicitly advisory prose (ARC-023) — no check reads a spell's actual output for this block; it holds by these instructions alone.
|
|
291
|
-
<!-- fragment:
|
|
303
|
+
<!-- fragment:action-required:end -->
|
|
292
304
|
|
|
293
305
|
## Rules
|
|
294
306
|
|
|
@@ -154,23 +154,35 @@ Workflow:
|
|
|
154
154
|
|
|
155
155
|
7. **Present for review** — show the PRD to the user for approval before proceeding to `spell-architect`.
|
|
156
156
|
|
|
157
|
-
<!-- fragment:
|
|
158
|
-
**
|
|
157
|
+
<!-- fragment:action-required:start -->
|
|
158
|
+
**Action required — what only the operator can do.** When this run leaves an action that only the operator can take, report it in one block at the very top of the final report, before every other section and before any optional next step. The block exists because these are the operator's decisions to make, not because the agent is stuck: write it as a hand-off of authority, never as a plea for help. Frame it with a horizontal rule above and below, so it stands apart in a terminal as well as on a rendered page:
|
|
159
159
|
|
|
160
160
|
```markdown
|
|
161
|
-
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
## 🚧 Action required
|
|
164
|
+
|
|
165
|
+
**Now**
|
|
166
|
+
|
|
167
|
+
- <exactly what to do: the command, the link, or the question> — <why only the operator can do it>
|
|
162
168
|
|
|
163
|
-
|
|
169
|
+
**When you're at your desk**
|
|
170
|
+
|
|
171
|
+
- <exactly what to do> — <why only the operator can do it>
|
|
172
|
+
|
|
173
|
+
---
|
|
164
174
|
```
|
|
165
175
|
|
|
166
|
-
- **What belongs in it:** an action
|
|
167
|
-
- **
|
|
176
|
+
- **What belongs in it:** an action only the operator can take — approving or merging a pull request, accepting a decision record, answering a question the work is waiting on, confirming a `guarded` push, running an interactive command such as `spell unblock-push`, or a step on an external platform the agent cannot reach. An optional suggestion, a next spell to run, or anything the agent could do itself is not a required action and stays out of the block.
|
|
177
|
+
- **Two tiers, one block.** **Now** holds what the work is not correct or complete without. **When you're at your desk** holds what only the operator can do but that can wait: a permission rule, a leftover remote branch, a credential to set up. Leave out a tier that has nothing in it; never split the tiers into two blocks.
|
|
178
|
+
- **One line per action.** Say exactly what to do, then, after the dash, why only the operator can do it. Write the command, link or question out in full; never point elsewhere with "see above".
|
|
168
179
|
- **Never only among optional steps.** An action required for correctness is never listed only under next steps, suggestions, `Carry Forward` or `What's Next?`. It may be repeated there, but it always appears in this block.
|
|
169
|
-
- **
|
|
180
|
+
- **Done items stay, struck through.** Within one session, once an item has been listed, keep it in every later report of the block; when the operator has done it, strike it through (`~~<the line>~~`) rather than dropping it, so progress shows and nothing disappears silently. The session's close carries only the open items forward.
|
|
181
|
+
- **Omit it when empty.** When nothing is left for the operator and nothing was struck through this session, leave the block out entirely: no heading, no rules and no "None" line.
|
|
170
182
|
- **Every final report.** The block belongs in whatever report ends the run, including a report written when the spell stops early.
|
|
171
|
-
- **Report
|
|
183
|
+
- **Report the Now tier to the presence channel.** When the **Now** tier has open items, also run `spell presence report --status waiting --required-action "<line 1>" --required-action "<line 2>"`, one flag per open line of that tier; the other tier is not blocking and is not reported. With no presence channel configured on this machine the command prints nothing and exits 0, so the block itself and the rest of the run are unchanged.
|
|
172
184
|
- Enforcement: explicitly advisory prose (ARC-023) — no check reads a spell's actual output for this block; it holds by these instructions alone.
|
|
173
|
-
<!-- fragment:
|
|
185
|
+
<!-- fragment:action-required:end -->
|
|
174
186
|
|
|
175
187
|
8. **Provider TODO handling** — if `external_provider=jira` or `external_provider=other`, add a TODO note in PRD open questions that provider-specific automation/linking is pending. `github` does not need this — it has a real, working flow (Step 1 above).
|
|
176
188
|
|
|
@@ -105,23 +105,35 @@ collide, but a PR title inserted verbatim as a label could).
|
|
|
105
105
|
2. If `--html` was passed, also emit a self-contained HTML file (inline CSS, no external assets) at the same base path so it can be shared by email/chat.
|
|
106
106
|
3. Print a summary to the user: total reviewed / skipped, verdict counts, total findings by severity, the GO/NO-GO gate, and the output path(s).
|
|
107
107
|
|
|
108
|
-
<!-- fragment:
|
|
109
|
-
**
|
|
108
|
+
<!-- fragment:action-required:start -->
|
|
109
|
+
**Action required — what only the operator can do.** When this run leaves an action that only the operator can take, report it in one block at the very top of the final report, before every other section and before any optional next step. The block exists because these are the operator's decisions to make, not because the agent is stuck: write it as a hand-off of authority, never as a plea for help. Frame it with a horizontal rule above and below, so it stands apart in a terminal as well as on a rendered page:
|
|
110
110
|
|
|
111
111
|
```markdown
|
|
112
|
-
|
|
112
|
+
---
|
|
113
113
|
|
|
114
|
-
|
|
114
|
+
## 🚧 Action required
|
|
115
|
+
|
|
116
|
+
**Now**
|
|
117
|
+
|
|
118
|
+
- <exactly what to do: the command, the link, or the question> — <why only the operator can do it>
|
|
119
|
+
|
|
120
|
+
**When you're at your desk**
|
|
121
|
+
|
|
122
|
+
- <exactly what to do> — <why only the operator can do it>
|
|
123
|
+
|
|
124
|
+
---
|
|
115
125
|
```
|
|
116
126
|
|
|
117
|
-
- **What belongs in it:** an action
|
|
118
|
-
- **
|
|
127
|
+
- **What belongs in it:** an action only the operator can take — approving or merging a pull request, accepting a decision record, answering a question the work is waiting on, confirming a `guarded` push, running an interactive command such as `spell unblock-push`, or a step on an external platform the agent cannot reach. An optional suggestion, a next spell to run, or anything the agent could do itself is not a required action and stays out of the block.
|
|
128
|
+
- **Two tiers, one block.** **Now** holds what the work is not correct or complete without. **When you're at your desk** holds what only the operator can do but that can wait: a permission rule, a leftover remote branch, a credential to set up. Leave out a tier that has nothing in it; never split the tiers into two blocks.
|
|
129
|
+
- **One line per action.** Say exactly what to do, then, after the dash, why only the operator can do it. Write the command, link or question out in full; never point elsewhere with "see above".
|
|
119
130
|
- **Never only among optional steps.** An action required for correctness is never listed only under next steps, suggestions, `Carry Forward` or `What's Next?`. It may be repeated there, but it always appears in this block.
|
|
120
|
-
- **
|
|
131
|
+
- **Done items stay, struck through.** Within one session, once an item has been listed, keep it in every later report of the block; when the operator has done it, strike it through (`~~<the line>~~`) rather than dropping it, so progress shows and nothing disappears silently. The session's close carries only the open items forward.
|
|
132
|
+
- **Omit it when empty.** When nothing is left for the operator and nothing was struck through this session, leave the block out entirely: no heading, no rules and no "None" line.
|
|
121
133
|
- **Every final report.** The block belongs in whatever report ends the run, including a report written when the spell stops early.
|
|
122
|
-
- **Report
|
|
134
|
+
- **Report the Now tier to the presence channel.** When the **Now** tier has open items, also run `spell presence report --status waiting --required-action "<line 1>" --required-action "<line 2>"`, one flag per open line of that tier; the other tier is not blocking and is not reported. With no presence channel configured on this machine the command prints nothing and exits 0, so the block itself and the rest of the run are unchanged.
|
|
123
135
|
- Enforcement: explicitly advisory prose (ARC-023) — no check reads a spell's actual output for this block; it holds by these instructions alone.
|
|
124
|
-
<!-- fragment:
|
|
136
|
+
<!-- fragment:action-required:end -->
|
|
125
137
|
|
|
126
138
|
## Rules
|
|
127
139
|
|
|
@@ -122,23 +122,35 @@ Workflow:
|
|
|
122
122
|
|
|
123
123
|
8. **Present findings** — show the review to the user with a clear recommendation.
|
|
124
124
|
|
|
125
|
-
<!-- fragment:
|
|
126
|
-
**
|
|
125
|
+
<!-- fragment:action-required:start -->
|
|
126
|
+
**Action required — what only the operator can do.** When this run leaves an action that only the operator can take, report it in one block at the very top of the final report, before every other section and before any optional next step. The block exists because these are the operator's decisions to make, not because the agent is stuck: write it as a hand-off of authority, never as a plea for help. Frame it with a horizontal rule above and below, so it stands apart in a terminal as well as on a rendered page:
|
|
127
127
|
|
|
128
128
|
```markdown
|
|
129
|
-
|
|
129
|
+
---
|
|
130
130
|
|
|
131
|
-
|
|
131
|
+
## 🚧 Action required
|
|
132
|
+
|
|
133
|
+
**Now**
|
|
134
|
+
|
|
135
|
+
- <exactly what to do: the command, the link, or the question> — <why only the operator can do it>
|
|
136
|
+
|
|
137
|
+
**When you're at your desk**
|
|
138
|
+
|
|
139
|
+
- <exactly what to do> — <why only the operator can do it>
|
|
140
|
+
|
|
141
|
+
---
|
|
132
142
|
```
|
|
133
143
|
|
|
134
|
-
- **What belongs in it:** an action
|
|
135
|
-
- **
|
|
144
|
+
- **What belongs in it:** an action only the operator can take — approving or merging a pull request, accepting a decision record, answering a question the work is waiting on, confirming a `guarded` push, running an interactive command such as `spell unblock-push`, or a step on an external platform the agent cannot reach. An optional suggestion, a next spell to run, or anything the agent could do itself is not a required action and stays out of the block.
|
|
145
|
+
- **Two tiers, one block.** **Now** holds what the work is not correct or complete without. **When you're at your desk** holds what only the operator can do but that can wait: a permission rule, a leftover remote branch, a credential to set up. Leave out a tier that has nothing in it; never split the tiers into two blocks.
|
|
146
|
+
- **One line per action.** Say exactly what to do, then, after the dash, why only the operator can do it. Write the command, link or question out in full; never point elsewhere with "see above".
|
|
136
147
|
- **Never only among optional steps.** An action required for correctness is never listed only under next steps, suggestions, `Carry Forward` or `What's Next?`. It may be repeated there, but it always appears in this block.
|
|
137
|
-
- **
|
|
148
|
+
- **Done items stay, struck through.** Within one session, once an item has been listed, keep it in every later report of the block; when the operator has done it, strike it through (`~~<the line>~~`) rather than dropping it, so progress shows and nothing disappears silently. The session's close carries only the open items forward.
|
|
149
|
+
- **Omit it when empty.** When nothing is left for the operator and nothing was struck through this session, leave the block out entirely: no heading, no rules and no "None" line.
|
|
138
150
|
- **Every final report.** The block belongs in whatever report ends the run, including a report written when the spell stops early.
|
|
139
|
-
- **Report
|
|
151
|
+
- **Report the Now tier to the presence channel.** When the **Now** tier has open items, also run `spell presence report --status waiting --required-action "<line 1>" --required-action "<line 2>"`, one flag per open line of that tier; the other tier is not blocking and is not reported. With no presence channel configured on this machine the command prints nothing and exits 0, so the block itself and the rest of the run are unchanged.
|
|
140
152
|
- Enforcement: explicitly advisory prose (ARC-023) — no check reads a spell's actual output for this block; it holds by these instructions alone.
|
|
141
|
-
<!-- fragment:
|
|
153
|
+
<!-- fragment:action-required:end -->
|
|
142
154
|
|
|
143
155
|
9. **Write back to the pull request** — when a PR exists for these changes, sync a short verdict plus a findings summary (verdict + finding counts/IDs + a pointer to the saved report) into the PR body/description. Use provider-agnostic phrasing that works for either GitHub or Azure DevOps. Mark it clearly as a snapshot at review time, and fall back to a top-level PR comment if the description can't be updated.
|
|
144
156
|
|
|
@@ -150,7 +162,7 @@ Workflow:
|
|
|
150
162
|
- GitHub: find the blocking review's ID (`gh api repos/{owner}/{repo}/pulls/<n>/reviews --jq '.[] | select(.state=="CHANGES_REQUESTED") | .id'`), then dismiss it — `gh api -X PUT repos/{owner}/{repo}/pulls/<n>/reviews/<review_id>/dismissals -f event=DISMISS -f message="<why this is now resolved, referencing the fix commit>"`.
|
|
151
163
|
- Azure DevOps: `az repos pr set-vote --id <n> --vote approve` (or reset to no-vote per team convention).
|
|
152
164
|
- Degrade silently if the CLI is unauthenticated or the PR can't be resolved (e.g. no PR exists yet for a local-only review) — never let this step abort a review that otherwise completed; the findings, report, and step 9 write-back still stand on their own.
|
|
153
|
-
- **GitHub refuses a REQUEST CHANGES verdict from the PR's own author** (`GraphQL: Review Can not request changes on your own pull request`, verified live 2026-08-31 — the same restriction as self-approval, just previously untested). When you are reviewing your own authored PR under the same GitHub identity, this call will fail with exactly that error: treat it as expected, not a bug, and fall back to the step 9 write-back as the only signal available — a formal blocking review needs a genuinely distinct reviewer identity (a second collaborator, or a separate bot/service account). Because this happens after step 8, finish by telling the operator in a short `##
|
|
165
|
+
- **GitHub refuses a REQUEST CHANGES verdict from the PR's own author** (`GraphQL: Review Can not request changes on your own pull request`, verified live 2026-08-31 — the same restriction as self-approval, just previously untested). When you are reviewing your own authored PR under the same GitHub identity, this call will fail with exactly that error: treat it as expected, not a bug, and fall back to the step 9 write-back as the only signal available — a formal blocking review needs a genuinely distinct reviewer identity (a second collaborator, or a separate bot/service account). Because this happens after step 8, finish by telling the operator in a short `## 🚧 Action required` block (per step 8): have a distinct reviewer identity post the blocking review — this identity cannot block its own pull request.
|
|
154
166
|
|
|
155
167
|
Rules:
|
|
156
168
|
- **Cover every dimension, not a finding count.** You MUST explicitly address each lens — correctness, security, performance, tests, naming/clarity, architecture — and state "no issues" for any lens that is clean. There is no minimum number of findings: zero findings is a valid outcome on a clean or small diff. The mandate is coverage of effort, not a count of findings — never fabricate issues to hit a quota.
|