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.
Files changed (31) hide show
  1. package/README.md +2 -2
  2. package/dist/assets/.arcane/governance/spell-authoring-standards.md +34 -22
  3. package/dist/assets/.arcane/governance/threat-model.md +4 -4
  4. package/dist/assets/.arcane/spells/_fragments/action-required.md +27 -0
  5. package/dist/assets/.arcane/spells/_fragments/presence-report.md +1 -1
  6. package/dist/assets/.arcane/spells/spell-address-review.md +21 -9
  7. package/dist/assets/.arcane/spells/spell-adopt-docs.md +21 -9
  8. package/dist/assets/.arcane/spells/spell-app-store-accounts.md +22 -10
  9. package/dist/assets/.arcane/spells/spell-architect.md +21 -9
  10. package/dist/assets/.arcane/spells/spell-close-session.md +26 -14
  11. package/dist/assets/.arcane/spells/spell-commit-work.md +22 -10
  12. package/dist/assets/.arcane/spells/spell-create-pull-request.md +22 -10
  13. package/dist/assets/.arcane/spells/spell-eas-store-deploy.md +21 -9
  14. package/dist/assets/.arcane/spells/spell-full-cycle.md +21 -9
  15. package/dist/assets/.arcane/spells/spell-implement.md +1 -1
  16. package/dist/assets/.arcane/spells/spell-make-discoverable.md +21 -9
  17. package/dist/assets/.arcane/spells/spell-open-session.md +23 -11
  18. package/dist/assets/.arcane/spells/spell-parallel-workers.md +23 -11
  19. package/dist/assets/.arcane/spells/spell-plan.md +21 -9
  20. package/dist/assets/.arcane/spells/spell-review-batch.md +21 -9
  21. package/dist/assets/.arcane/spells/spell-review.md +22 -10
  22. package/dist/assets/.arcane/spells/spell-scope.md +21 -9
  23. package/dist/assets/.arcane/spells/spell-ship.md +21 -9
  24. package/dist/assets/.arcane/spells/spell-sync-pull-request.md +22 -10
  25. package/dist/assets/ai-context/system-prompt-context.md +1 -1
  26. package/dist/assets/report/show-report.template.html +31 -14
  27. package/dist/assets/schemas/presence.schema.json +28 -9
  28. package/dist/index.js +34 -28
  29. package/dist/index.js.map +1 -1
  30. package/package.json +1 -1
  31. package/dist/assets/.arcane/spells/_fragments/needs-you.md +0 -15
package/README.md CHANGED
@@ -275,7 +275,7 @@ The shape is the JSON Schema at [`src/assets/schemas/state.schema.json`](src/ass
275
275
 
276
276
  ### Presence
277
277
 
278
- `spell presence` is an optional, local presence channel: which session is working on what, right now, and whether it is waiting for you ([ARC-060](DECISIONS.md#arc-060--the-presence-channel-one-package-behind-spell-presence-a-loopback-contract-checkout-keyed-sessions-and-a-prompt-driven-reporting-convention); working name `arcane-mcp`). You start the service; nothing listens until you do. It binds `127.0.0.1` only, keeps sessions in memory only (stale after 90 s without a report, dropped after 24 h), writes nothing but its token and `server.json` under `~/.arcane/presence/`, and never writes a repository file. It is observation only: everything it holds is reconstructable from `spell state --json`, and no route, tool or event steers a session. Spells report through it with one fragment in `spell-open-session`, `spell-close-session`, `spell-commit-work` and `spell-implement`, and every spell's "Needs you" block reports `waiting` with its lines; with no service running they behave exactly as before. `spell-open-session` also lists the sessions reporting from the repository's other checkouts, and `spell doctor` has a "Presence service" row (`--fix` removes a `server.json` left by a service that is gone).
278
+ `spell presence` is an optional, local presence channel: which session is working on what, right now, and whether it is waiting for you ([ARC-060](DECISIONS.md#arc-060--the-presence-channel-one-package-behind-spell-presence-a-loopback-contract-checkout-keyed-sessions-and-a-prompt-driven-reporting-convention); working name `arcane-mcp`). You start the service; nothing listens until you do. It binds `127.0.0.1` only, keeps sessions in memory only (stale after 90 s without a report, dropped after 24 h), writes nothing but its token and `server.json` under `~/.arcane/presence/`, and never writes a repository file. It is observation only: everything it holds is reconstructable from `spell state --json`, and no route, tool or event steers a session. Spells report through it with one fragment in `spell-open-session`, `spell-close-session`, `spell-commit-work` and `spell-implement`, and every spell's "Action required" block reports `waiting` with its open **Now** lines; with no service running they behave exactly as before. `spell-open-session` also lists the sessions reporting from the repository's other checkouts, and `spell doctor` has a "Presence service" row (`--fix` removes a `server.json` left by a service that is gone).
279
279
 
280
280
  | Command | What it does |
281
281
  | --- | --- |
@@ -283,7 +283,7 @@ The shape is the JSON Schema at [`src/assets/schemas/state.schema.json`](src/ass
283
283
  | `spell presence status` | Exit 0 when the service answers this machine's token, 1 otherwise |
284
284
  | `spell presence sessions [--json]` | The sessions the service holds, as a table or as the `GET /v0/sessions` document; exit 1 when no channel answers |
285
285
  | `spell presence stop` | Stops the recorded service; exit 0 either way |
286
- | `spell presence report --status <s> [--task ...] [--needs-you ...]` | Reports this checkout's session; silent and exit 0 with no service, never blocks |
286
+ | `spell presence report --status <s> [--task ...] [--required-action ...]` | Reports this checkout's session; silent and exit 0 with no service, never blocks |
287
287
  | `spell presence end` | Ends this checkout's session |
288
288
  | `spell presence mcp` | The same channel as an MCP server over stdio: tools `presence_report` and `presence_end`, resources `arcane://presence/sessions` and `arcane://presence/capabilities`, with update notifications on the sessions resource (`subscriptions/listen` on MCP 2026-07-28, `resources/subscribe` on earlier revisions) |
289
289
 
@@ -231,40 +231,52 @@ Arcane's own repository, a test (`test/up02-d-runtime-placeholders.test.ts`) fai
231
231
  `status: active` governance document uses a token that is not in this list. Whether an agent actually
232
232
  resolves a listed token from the named source is explicitly advisory prose: no check exercises it.**
233
233
 
234
- ## Required operator actions: the `Needs you` block
234
+ ## Required operator actions: the `Action required` block
235
235
 
236
236
  Some runs end with an action only the operator can take: approving or merging a pull request,
237
237
  accepting a decision record, answering a question the work is waiting on, confirming a `guarded`
238
238
  push, running an interactive command such as `spell unblock-push`, or a step on an external platform
239
239
  the agent cannot reach. Listed among optional next steps, such an action gets skimmed past. A spell
240
- whose output can carry one reports it in one fixed block instead:
241
-
242
- - **One fixed heading,** `## ⚠ Needs you`, at the very top of the final report, before every other
243
- section and before any optional next step.
244
- - **One line per action:** exactly what to do, then why the agent cannot do it itself.
240
+ whose output can carry one reports it in one fixed block instead. The block hands over authority:
241
+ these are the operator's decisions, so it never reads as the agent asking for help.
242
+
243
+ - **One fixed heading,** `## 🚧 Action required`, at the very top of the final report, before every
244
+ other section and before any optional next step, framed by a horizontal rule above and below so it
245
+ stands apart in a terminal as well as on a rendered page.
246
+ - **Two tiers in one block:** **Now** for what the work is not correct or complete without, and
247
+ **When you're at your desk** for what only the operator can do but that can wait. An empty tier is
248
+ left out; the tiers are never split into two blocks.
249
+ - **One line per action:** exactly what to do, then why only the operator can do it.
245
250
  - **Never only among optional steps:** an action required for correctness may be repeated under next
246
251
  steps or suggestions, but it always appears in the block.
247
- - **Omitted when empty:** when nothing needs the operator, the block is left out entirely, never
248
- printed as an empty heading or a "None" line.
252
+ - **Done items stay, struck through:** within a session, a listed item stays in every later report of
253
+ the block, struck through once done, so progress shows and nothing disappears silently.
254
+ - **Omitted when empty:** when nothing is left for the operator and nothing was struck through, the
255
+ block is left out entirely, never printed as an empty heading or a "None" line.
249
256
 
250
- The block's wording lives in one shared prose fragment (ARC-039), `needs-you`, kept in Arcane's
257
+ The block's wording lives in one shared prose fragment (ARC-039), `action-required`, kept in Arcane's
251
258
  source under `.arcane/spells/_fragments/` and never shipped on its own. A spell carries it as a
252
- `<!-- fragment:needs-you:start -->` / `<!-- fragment:needs-you:end -->` marker pair placed where the
253
- spell describes its final output or report, and `npm run fix:self-host-parity` expands the fragment
254
- between the markers. Edit the fragment, never an expanded copy, and never restate its rules by hand
255
- in a spell body. Any shipped Markdown file can host a fragment the same way, not only a spell: the
256
- `branch-naming` fragment is expanded into `git-conventions.md` and the Copilot instruction file as
257
- well as into spells, and `spell agents sync` renders it into every client instruction file, so the
258
- branch formats are written in exactly one place. Required actions also survive the end of a session: `spell-close-session` writes
259
- the open items into the handoff's `Needs you` field, and `spell-open-session` surfaces that field
260
- first, above the rest of the handoff, and does not mark the handoff consumed until it has.
259
+ `<!-- fragment:action-required:start -->` / `<!-- fragment:action-required:end -->` marker pair placed
260
+ where the spell describes its final output or report, and `npm run fix:self-host-parity` expands the
261
+ fragment between the markers. Edit the fragment, never an expanded copy, and never restate its rules
262
+ by hand in a spell body. Any shipped Markdown file can host a fragment the same way, not only a
263
+ spell: the `branch-naming` fragment is expanded into `git-conventions.md` and the Copilot instruction
264
+ file as well as into spells, and `spell agents sync` renders it into every client instruction file,
265
+ so the branch formats are written in exactly one place. Required actions also survive the end of a
266
+ session: `spell-close-session` writes the open items into the handoff's `Action required` field, in
267
+ its `Now` and `At your desk` lines, and `spell-open-session` surfaces that field first, above the
268
+ rest of the handoff, and does not mark the handoff consumed until it has. A handoff written before
269
+ the rename carries a `Needs you` field instead; open-session reads its items as **Now** items.
270
+
271
+ When a presence channel is configured, the **Now** tier is also reported as `waiting`, one
272
+ `--required-action` line per open item; the other tier is never sent.
261
273
 
262
274
  **Enforcement: executable check (ARC-023) for the wording — in Arcane's own repository,
263
275
  `npm run check:self-host-parity` fails CI when a spell's expanded span differs from the fragment, and
264
- a test (`test/up04-b-needs-you.test.ts`) fails when the fragment loses its heading, placement or
265
- omit-when-empty rule, or when a spell in the chosen set loses its span. Which spells carry the span
266
- is decided by an author's judgment, and whether an agent actually emits the block is explicitly
267
- advisory prose: no check reads a spell's output.**
276
+ a test (`test/action-required.test.ts`) fails when the fragment loses its heading, frame, tiers,
277
+ placement or omit-when-empty rule, or when a spell in the chosen set loses its span. Which spells
278
+ carry the span is decided by an author's judgment, and whether an agent actually emits the block is
279
+ explicitly advisory prose: no check reads a spell's output.**
268
280
 
269
281
  ## How to audit a spell
270
282
 
@@ -76,11 +76,11 @@ See also: [Hardening Checklist](hardening-checklist.md), [Authentication Strateg
76
76
 
77
77
  > **Status:** every row is **Planned** until the operator verifies it against the installed build on each machine that runs the service, and records the result in the security audit log. Decision record: ARC-060 (the presence channel) in the Arcane framework repository.
78
78
 
79
- `spell presence serve` is an optional, operator-started foreground process that AI sessions report to (agent, task, repository, status and "needs you" lines) and that dashboards read. Nothing listens until the operator starts it. It adds one listening socket and one secret to the machine. It is **observation only by contract** (capability descriptor `{ observe: true, actions: [] }`) and **never authoritative**: everything it holds is reconstructable from `spell state --json` and the repository's files.
79
+ `spell presence serve` is an optional, operator-started foreground process that AI sessions report to (agent, task, repository, status and "action required" lines) and that dashboards read. Nothing listens until the operator starts it. It adds one listening socket and one secret to the machine. It is **observation only by contract** (capability descriptor `{ observe: true, actions: [] }`) and **never authoritative**: everything it holds is reconstructable from `spell state --json` and the repository's files.
80
80
 
81
81
  | Asset | Value | Location |
82
82
  |-------|-------|----------|
83
- | Presence state | Each session's agent, task, message, needs-you lines, repository name and remote, branch and checkout path. Business-private: it can name ventures, customers and machine paths | Process memory only; gone on restart, dropped after 24 h of silence |
83
+ | Presence state | Each session's agent, task, message, required-action lines, repository name and remote, branch and checkout path. Business-private: it can name ventures, customers and machine paths | Process memory only; gone on restart, dropped after 24 h of silence |
84
84
  | Presence token | Bearer capability for every route: read every live session, post or end any session | `~/.arcane/presence/token` (file `0600` in a `0700` directory; on Windows restricted to the current account) or the `ARCANE_PRESENCE_TOKEN` environment variable for a subscriber |
85
85
  | `server.json` | URL, process id, port, start time and version of the running service. Not a secret | `~/.arcane/presence/server.json`, removed on a clean exit |
86
86
 
@@ -101,9 +101,9 @@ See also: [Hardening Checklist](hardening-checklist.md), [Authentication Strateg
101
101
  | State persistence | **Planned** | Memory only; a session silent for 90 s is stale, for 24 h expired and dropped; a restart starts empty (decision 7) | Restart `serve`: `GET /v0/sessions` answers an empty list; a session silent for 90 s shows `stale: true` |
102
102
  | Forged or poisoned presence | **Accepted risk** | Any token holder can post or end any session. Bounded: presence is never authoritative and steers nothing (`actions: []`, decision 8); a forged report misleads a dashboard and changes no file, branch or decision | `tools/list` on `spell presence mcp` answers only `presence_report` and `presence_end`; the HTTP surface has six routes, none of which acts |
103
103
  | Disclosure to token holders | **Accepted risk** | Every token holder can read every session's task, message and path. A process of the operator's account can already read those repositories, so this adds no new data to that account; it is why the token is never shared beyond it | Review which agent runtimes run under the operator's account and what they may read |
104
- | Request limits | **Planned** | 64 KiB bodies, 256-character lines, at most 20 needs-you lines and 32 aliases (more is refused), 256 sessions, 32 subscribers, a subscriber that stops reading closed past a 1 MiB backlog, connection and header time limits checked every second (decision 3) | A 65 KiB body and a 21-line needs-you list are each refused; the service keeps answering |
104
+ | Request limits | **Planned** | 64 KiB bodies, 256-character lines, at most 20 required-action lines and 32 aliases (more is refused), 256 sessions, 32 subscribers, a subscriber that stops reading closed past a 1 MiB backlog, connection and header time limits checked every second (decision 3) | A 65 KiB body and a 21-line required-action list are each refused; the service keeps answering |
105
105
  | Execution and reads | **Planned** | The service runs no process and reads nothing but its own store; it makes no outbound request (decisions 9, 10) | Code review of the release; no outbound connection from the `serve` process during a run (`lsof -p <pid> -i` shows the listener only) |
106
- | Logging | **Planned** | The service logs an event name, a session reference and a status only; never a task, message, needs-you line, path or token (decision 9) | `serve`'s output across a run contains no task, message, path or token |
106
+ | Logging | **Planned** | The service logs an event name, a session reference and a status only; never a task, message, required-action line, path or token (decision 9) | `serve`'s output across a run contains no task, message, path or token |
107
107
  | Remote access | **Planned** | Nothing listens beyond loopback; the only remote path is a tunnel or VPN the operator places in front of the loopback port, with the token still required (decision 6) | Before exposing the port through a tunnel, review which devices the tunnel admits and record them |
108
108
  | Git hooks | **Planned** | The reporter is invoked by spell prompts, never by a git hook; `spell presence` is never installed into `.husky/` or `.arcane/hooks/` (decision 10) | A search for `presence` in `.husky/` and `.arcane/hooks/` of each repository after the update that ships it finds nothing |
109
109
  | Data leaving the machine | **Planned** | No outbound request; a pushed projection would be a later decision record and strips `repository.root` and `checkout.path` first (decision 9) | Same as the execution row |
@@ -0,0 +1,27 @@
1
+ **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:
2
+
3
+ ```markdown
4
+ ---
5
+
6
+ ## 🚧 Action required
7
+
8
+ **Now**
9
+
10
+ - <exactly what to do: the command, the link, or the question> — <why only the operator can do it>
11
+
12
+ **When you're at your desk**
13
+
14
+ - <exactly what to do> — <why only the operator can do it>
15
+
16
+ ---
17
+ ```
18
+
19
+ - **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.
20
+ - **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.
21
+ - **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".
22
+ - **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.
23
+ - **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.
24
+ - **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.
25
+ - **Every final report.** The block belongs in whatever report ends the run, including a report written when the spell stops early.
26
+ - **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.
27
+ - Enforcement: explicitly advisory prose (ARC-023) — no check reads a spell's actual output for this block; it holds by these instructions alone.
@@ -5,7 +5,7 @@ in the user store opens it. Report with the CLI only; never pass a token on the
5
5
  never write a repository file to report.
6
6
 
7
7
  - At the start of this spell: `spell presence report --spell <spell-id> --status working --task "<the task in one line>"`.
8
- - When this spell's output carries a `## ⚠ Needs you` block: `spell presence report --status waiting --needs-you "<line 1>" --needs-you "<line 2>"`, one flag per line; the block itself is unchanged.
8
+ - 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.
9
9
  - At a checkpoint worth showing (a commit made, a story passed): `spell presence report --status working --task "<what is now happening>"`.
10
10
  - When the session closes: `spell presence end`.
11
11
 
@@ -116,23 +116,35 @@ Resolve threads via the provider:
116
116
  3. `git push` all commits.
117
117
  4. Print a summary table of actions taken (category, file, action, commit), thread status (resolved / deferred-with-TODO / needs manual resolution), commits pushed, and next steps (CI, notify reviewer, ready for re-review).
118
118
 
119
- <!-- fragment:needs-you:start -->
120
- **Needs you — required operator actions.** When this run leaves an action that only the operator can take, and the work is not correct or complete until it is taken, report it in one block at the very top of the final report, before every other section and before any optional next step:
119
+ <!-- fragment:action-required:start -->
120
+ **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:
121
121
 
122
122
  ```markdown
123
- ## ⚠ Needs you
123
+ ---
124
124
 
125
- - <exactly what to do: the command, the link, or the question> — <why the agent cannot do it itself>
125
+ ## 🚧 Action required
126
+
127
+ **Now**
128
+
129
+ - <exactly what to do: the command, the link, or the question> — <why only the operator can do it>
130
+
131
+ **When you're at your desk**
132
+
133
+ - <exactly what to do> — <why only the operator can do it>
134
+
135
+ ---
126
136
  ```
127
137
 
128
- - **What belongs in it:** an action the work needs that 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.
129
- - **One line per action.** Say exactly what to do, then, after the dash, why the agent cannot do it. Write the command, link or question out in full; never point elsewhere with "see above".
138
+ - **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.
139
+ - **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.
140
+ - **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".
130
141
  - **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.
131
- - **Omit it when empty.** When nothing needs the operator, leave the block out entirely: no heading and no "None" line.
142
+ - **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.
143
+ - **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.
132
144
  - **Every final report.** The block belongs in whatever report ends the run, including a report written when the spell stops early.
133
- - **Report it to the presence channel.** When the block is not empty, also run `spell presence report --status waiting --needs-you "<line 1>" --needs-you "<line 2>"`, one flag per line of the block; 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.
145
+ - **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.
134
146
  - Enforcement: explicitly advisory prose (ARC-023) — no check reads a spell's actual output for this block; it holds by these instructions alone.
135
- <!-- fragment:needs-you:end -->
147
+ <!-- fragment:action-required:end -->
136
148
 
137
149
  5. Optionally post the summary back to the PR as a top-level comment for a durable record.
138
150
 
@@ -135,23 +135,35 @@ Hard rules for this phase:
135
135
 
136
136
  ## Phase 4 — Report
137
137
 
138
- <!-- fragment:needs-you:start -->
139
- **Needs you — required operator actions.** When this run leaves an action that only the operator can take, and the work is not correct or complete until it is taken, report it in one block at the very top of the final report, before every other section and before any optional next step:
138
+ <!-- fragment:action-required:start -->
139
+ **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:
140
140
 
141
141
  ```markdown
142
- ## ⚠ Needs you
142
+ ---
143
+
144
+ ## 🚧 Action required
145
+
146
+ **Now**
147
+
148
+ - <exactly what to do: the command, the link, or the question> — <why only the operator can do it>
143
149
 
144
- - <exactly what to do: the command, the link, or the question> — <why the agent cannot do it itself>
150
+ **When you're at your desk**
151
+
152
+ - <exactly what to do> — <why only the operator can do it>
153
+
154
+ ---
145
155
  ```
146
156
 
147
- - **What belongs in it:** an action the work needs that 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.
148
- - **One line per action.** Say exactly what to do, then, after the dash, why the agent cannot do it. Write the command, link or question out in full; never point elsewhere with "see above".
157
+ - **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.
158
+ - **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.
159
+ - **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".
149
160
  - **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.
150
- - **Omit it when empty.** When nothing needs the operator, leave the block out entirely: no heading and no "None" line.
161
+ - **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.
162
+ - **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.
151
163
  - **Every final report.** The block belongs in whatever report ends the run, including a report written when the spell stops early.
152
- - **Report it to the presence channel.** When the block is not empty, also run `spell presence report --status waiting --needs-you "<line 1>" --needs-you "<line 2>"`, one flag per line of the block; 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.
164
+ - **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.
153
165
  - Enforcement: explicitly advisory prose (ARC-023) — no check reads a spell's actual output for this block; it holds by these instructions alone.
154
- <!-- fragment:needs-you:end -->
166
+ <!-- fragment:action-required:end -->
155
167
 
156
168
  Output:
157
169
 
@@ -366,7 +366,7 @@ The spell produces one **enrollment tracker**, kept in the venture's private ope
366
366
  - [ ] Verification tasks: contact details / identity / organization / website / phone / payment method / device
367
367
  - [ ] Hardened (Step 6)
368
368
 
369
- ### Needs you
369
+ ### Action required
370
370
  - <the one operator action currently blocking either track>
371
371
  ```
372
372
 
@@ -387,23 +387,35 @@ The spell did its job when:
387
387
  End every run with a short report. The steps only the operator can take — filling in the D&B
388
388
  questionnaire, uploading documents, paying a fee, phoning Apple — are required operator actions:
389
389
 
390
- <!-- fragment:needs-you:start -->
391
- **Needs you — required operator actions.** When this run leaves an action that only the operator can take, and the work is not correct or complete until it is taken, report it in one block at the very top of the final report, before every other section and before any optional next step:
390
+ <!-- fragment:action-required:start -->
391
+ **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:
392
392
 
393
393
  ```markdown
394
- ## ⚠ Needs you
394
+ ---
395
+
396
+ ## 🚧 Action required
397
+
398
+ **Now**
399
+
400
+ - <exactly what to do: the command, the link, or the question> — <why only the operator can do it>
395
401
 
396
- - <exactly what to do: the command, the link, or the question> — <why the agent cannot do it itself>
402
+ **When you're at your desk**
403
+
404
+ - <exactly what to do> — <why only the operator can do it>
405
+
406
+ ---
397
407
  ```
398
408
 
399
- - **What belongs in it:** an action the work needs that 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.
400
- - **One line per action.** Say exactly what to do, then, after the dash, why the agent cannot do it. Write the command, link or question out in full; never point elsewhere with "see above".
409
+ - **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.
410
+ - **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.
411
+ - **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".
401
412
  - **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.
402
- - **Omit it when empty.** When nothing needs the operator, leave the block out entirely: no heading and no "None" line.
413
+ - **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.
414
+ - **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.
403
415
  - **Every final report.** The block belongs in whatever report ends the run, including a report written when the spell stops early.
404
- - **Report it to the presence channel.** When the block is not empty, also run `spell presence report --status waiting --needs-you "<line 1>" --needs-you "<line 2>"`, one flag per line of the block; 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.
416
+ - **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.
405
417
  - Enforcement: explicitly advisory prose (ARC-023) — no check reads a spell's actual output for this block; it holds by these instructions alone.
406
- <!-- fragment:needs-you:end -->
418
+ <!-- fragment:action-required:end -->
407
419
 
408
420
  ---
409
421
 
@@ -111,23 +111,35 @@ Workflow:
111
111
 
112
112
  8. **Present for review** — show the architecture and story breakdown to the user.
113
113
 
114
- <!-- fragment:needs-you:start -->
115
- **Needs you — required operator actions.** When this run leaves an action that only the operator can take, and the work is not correct or complete until it is taken, report it in one block at the very top of the final report, before every other section and before any optional next step:
114
+ <!-- fragment:action-required:start -->
115
+ **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:
116
116
 
117
117
  ```markdown
118
- ## ⚠ Needs you
118
+ ---
119
119
 
120
- - <exactly what to do: the command, the link, or the question> — <why the agent cannot do it itself>
120
+ ## 🚧 Action required
121
+
122
+ **Now**
123
+
124
+ - <exactly what to do: the command, the link, or the question> — <why only the operator can do it>
125
+
126
+ **When you're at your desk**
127
+
128
+ - <exactly what to do> — <why only the operator can do it>
129
+
130
+ ---
121
131
  ```
122
132
 
123
- - **What belongs in it:** an action the work needs that 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.
124
- - **One line per action.** Say exactly what to do, then, after the dash, why the agent cannot do it. Write the command, link or question out in full; never point elsewhere with "see above".
133
+ - **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.
134
+ - **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.
135
+ - **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".
125
136
  - **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.
126
- - **Omit it when empty.** When nothing needs the operator, leave the block out entirely: no heading and no "None" line.
137
+ - **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.
138
+ - **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.
127
139
  - **Every final report.** The block belongs in whatever report ends the run, including a report written when the spell stops early.
128
- - **Report it to the presence channel.** When the block is not empty, also run `spell presence report --status waiting --needs-you "<line 1>" --needs-you "<line 2>"`, one flag per line of the block; 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
+ - **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.
129
141
  - Enforcement: explicitly advisory prose (ARC-023) — no check reads a spell's actual output for this block; it holds by these instructions alone.
130
- <!-- fragment:needs-you:end -->
142
+ <!-- fragment:action-required:end -->
131
143
 
132
144
  Rules:
133
145
  - Stories must be right-sized per the methodology doc (not "build the entire dashboard").
@@ -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 `## ⚠ Needs you` block: `spell presence report --status waiting --needs-you "<line 1>" --needs-you "<line 2>"`, one flag per line; the block itself is unchanged.
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
 
@@ -140,7 +140,7 @@ In `ai-context/system-prompt-context.md`, replace the existing `## Next Session
140
140
  - **Branch:** Output of `git branch --show-current`.
141
141
  - **Blockers:** Known unresolved blockers or dependencies. Write "None" if clear. Write any claim about the local environment (a failing hook, a broken tool, a flaky test) with the date it was observed and a one-line, read-only command that re-verifies it (no install, network fetch, write or secret access): `<claim> — observed YYYY-MM-DD — re-verify: <command>`. An undated environment claim reads as a standing fact, and the next session repeats it after it stops being true.
142
142
  - **Pending Verification:** One line per non-`succeeded` item from step 1b: `<what> — <state> — <verification action>`. States: `dispatched`, `pending`, `failed`, `unverifiable` (never list a `succeeded` item here — it belongs in `Last completed step` / TODO.md / the journal instead, worded per the gating above). The verification action is required for `dispatched`, `pending`, and `unverifiable` — "N/A" is only valid for `failed`, where the state is already resolved and there is nothing left to check. Write "None" only if step 1b found every dispatched item resolved to `succeeded` or `failed` before this handoff was written.
143
- - **Needs you:** One line per action only the operator can take that this session leaves open: `<what to do> — <why the agent cannot do it>`. This block is committed before steps 9–10 run, so write it with them in view and name now the actions they will leave open: the pull request step 9c opens needs a human merge, and when `push_policy` (read it now, per step 9c's push-policy check) is `blocked`, or `guarded` in an autonomous run, the push itself waits on the operator. The closure report's `## ⚠ Needs you` block (step 11) lists the same items, plus any that arose after this handoff was committed. Write "None" when nothing needs the operator. Never leave such an action only in `Blockers`, `Notes` or `Carry Forward`; it may be repeated there, but it always appears here.
143
+ - **Action required:** The open items of this session's `## 🚧 Action required` block, on two sub-lines: `Now: <what to do> — <why only the operator can do it>` for what the work is not correct or complete without, and `At your desk: <what to do> — <why only the operator can do it>` for what can wait; separate several items in one tier with `; `, and leave out a tier that has none. Struck-through (done) items are not carried. This block is committed before steps 9–10 run, so write it with them in view and name now the actions they will leave open: the pull request step 9c opens needs a human merge, and when `push_policy` (read it now, per step 9c's push-policy check) is `blocked`, or `guarded` in an autonomous run, the push itself waits on the operator. The closure report's `## 🚧 Action required` block (step 11) lists the same items, plus any that arose after this handoff was committed. Write "None" when nothing is left for the operator. Never leave such an action only in `Blockers`, `Notes` or `Carry Forward`; it may be repeated there, but it always appears here.
144
144
  - **Notes:** Anything time-sensitive, fragile, or contextual that would be lost if not stated explicitly. Never the sole carrier of durable content (session handoff durability) — if it names unfinished work, that work must also be registered per step 4b; name its location here. An environment claim here follows the `Blockers` rule: date it and give its re-verify command.
145
145
  ```
146
146
 
@@ -196,7 +196,7 @@ Rules:
196
196
  - Timeout, cancellation, fallback, or delegated response is not approval. Print the visible authorization downgrade and halt without committing.
197
197
 
198
198
  c. **Push and open a PR through `spell-commit-work` step 9, including its separate merge gate:**
199
- - Run the push-policy check before the push. `spell-commit-work` step 9a runs the same check; run it once per push, not twice. It also governs step 10's remote branch deletions. If it stops the push, end the session with the commits local and report them in the PR Readiness section as not pushed, and in the step 11 report's `## ⚠ Needs you` block.
199
+ - Run the push-policy check before the push. `spell-commit-work` step 9a runs the same check; run it once per push, not twice. It also governs step 10's remote branch deletions. If it stops the push, end the session with the commits local and report them in the PR Readiness section as not pushed, and in the step 11 report's `## 🚧 Action required` block.
200
200
 
201
201
  <!-- fragment:push-policy-check:start -->
202
202
  **Push-policy check (ARC-049) — before any push.** Read `push_policy` from the repository's `.arcane.json` at the repository root (a self-hosted source repository with no root manifest keeps it in `src/assets/.arcane.json` when that file declares `selfHosted: true`). An absent file or an absent field means `open`. The check covers every push this spell makes: a branch push, a `--force-with-lease` push, and a remote branch deletion (`git push <remote> --delete <branch>`).
@@ -217,13 +217,13 @@ Rules:
217
217
  - Skip this entire step for local-only and read-only sessions.
218
218
  - Resolve `<remote>` and `<trunk>` from observed Git/provider state: use the usable authenticated remote selected in step 9 and the merged PR's target branch (falling back to that remote's default branch). Never assume `origin` or `main`.
219
219
  - Verify through the detected provider that the PR is merged before changing branches.
220
- - Then confirm each issue the PR closed is closed. That is every issue its body names after a closing keyword, every issue named after a closing keyword in its commit messages (`git log <base>..<merge-sha> --format=%B`), and every issue GitHub links to it (`gh pr view <number> --json closingIssuesReferences`). Check each one's state with `gh issue view <number> --json state,stateReason`. If GraphQL is unavailable, use REST: `gh api repos/<owner>/<repo>/issues/<number> --jq '.state,.state_reason'` for the state. Then treat as linked every issue that follows a closing keyword in the PR body (ignore any negation) and any issue the PR references whose `closed` event (`gh api repos/<owner>/<repo>/issues/<number>/events`) falls within a minute of the PR's `merged_at`. A merge closes every issue that directly follows a closing keyword, even inside a negation: "does not close #N" closes #N. List any issue still open under the closure report's `## ⚠ Needs you`, or, once the diff check below passes, close it with a comment naming the merged PR.
220
+ - Then confirm each issue the PR closed is closed. That is every issue its body names after a closing keyword, every issue named after a closing keyword in its commit messages (`git log <base>..<merge-sha> --format=%B`), and every issue GitHub links to it (`gh pr view <number> --json closingIssuesReferences`). Check each one's state with `gh issue view <number> --json state,stateReason`. If GraphQL is unavailable, use REST: `gh api repos/<owner>/<repo>/issues/<number> --jq '.state,.state_reason'` for the state. Then treat as linked every issue that follows a closing keyword in the PR body (ignore any negation) and any issue the PR references whose `closed` event (`gh api repos/<owner>/<repo>/issues/<number>/events`) falls within a minute of the PR's `merged_at`. A merge closes every issue that directly follows a closing keyword, even inside a negation: "does not close #N" closes #N. List any issue still open under the closure report's `## 🚧 Action required`, or, once the diff check below passes, close it with a comment naming the merged PR.
221
221
  - **A closed issue is not evidence its change shipped.** For each issue above, confirm the merged diff contains the change that issue asked for:
222
222
  - Read the issue (`gh issue view <number> --json title,body`, or REST), then the diff (`gh pr diff <number>`).
223
223
  - Name the file that carries the requested change. If you cannot name one, treat the change as missing.
224
224
  - A diff that touches only tracking files (`FEEDBACK.md`, the journal, the handoff, `CHANGELOG.md`, `.arcane/delegations.json`) never counts as the change.
225
225
  - Reopen the issue only when all of these hold: its `closed` event falls within a minute of this PR's merge; its state reason is `completed`; and the change is not already on `<trunk>` from an earlier PR (`git log <trunk> --grep '#<number>'`). When they hold, reopen the issue with a comment naming the merged PR and listing what is missing, or which part, if only part shipped.
226
- - When you cannot reopen it (permissions), list it under the closure report's `## ⚠ Needs you` instead.
226
+ - When you cannot reopen it (permissions), list it under the closure report's `## 🚧 Action required` instead.
227
227
  - Never report such an issue as done.
228
228
  - **Determine the isolation primitive first (ARC-028 R8).** Run both of these and compare:
229
229
  ```bash
@@ -254,23 +254,35 @@ Rules:
254
254
 
255
255
  Output format:
256
256
 
257
- <!-- fragment:needs-you:start -->
258
- **Needs you — required operator actions.** When this run leaves an action that only the operator can take, and the work is not correct or complete until it is taken, report it in one block at the very top of the final report, before every other section and before any optional next step:
257
+ <!-- fragment:action-required:start -->
258
+ **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:
259
259
 
260
260
  ```markdown
261
- ## ⚠ Needs you
261
+ ---
262
+
263
+ ## 🚧 Action required
264
+
265
+ **Now**
266
+
267
+ - <exactly what to do: the command, the link, or the question> — <why only the operator can do it>
262
268
 
263
- - <exactly what to do: the command, the link, or the question> — <why the agent cannot do it itself>
269
+ **When you're at your desk**
270
+
271
+ - <exactly what to do> — <why only the operator can do it>
272
+
273
+ ---
264
274
  ```
265
275
 
266
- - **What belongs in it:** an action the work needs that 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.
267
- - **One line per action.** Say exactly what to do, then, after the dash, why the agent cannot do it. Write the command, link or question out in full; never point elsewhere with "see above".
276
+ - **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.
277
+ - **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.
278
+ - **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".
268
279
  - **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.
269
- - **Omit it when empty.** When nothing needs the operator, leave the block out entirely: no heading and no "None" line.
280
+ - **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.
281
+ - **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.
270
282
  - **Every final report.** The block belongs in whatever report ends the run, including a report written when the spell stops early.
271
- - **Report it to the presence channel.** When the block is not empty, also run `spell presence report --status waiting --needs-you "<line 1>" --needs-you "<line 2>"`, one flag per line of the block; 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.
283
+ - **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.
272
284
  - Enforcement: explicitly advisory prose (ARC-023) — no check reads a spell's actual output for this block; it holds by these instructions alone.
273
- <!-- fragment:needs-you:end -->
285
+ <!-- fragment:action-required:end -->
274
286
 
275
287
  ## Session Closure
276
288
 
@@ -32,7 +32,7 @@ in the user store opens it. Report with the CLI only; never pass a token on the
32
32
  never write a repository file to report.
33
33
 
34
34
  - At the start of this spell: `spell presence report --spell <spell-id> --status working --task "<the task in one line>"`.
35
- - When this spell's output carries a `## ⚠ Needs you` block: `spell presence report --status waiting --needs-you "<line 1>" --needs-you "<line 2>"`, one flag per line; the block itself is unchanged.
35
+ - 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.
36
36
  - At a checkpoint worth showing (a commit made, a story passed): `spell presence report --status working --task "<what is now happening>"`.
37
37
  - When the session closes: `spell presence end`.
38
38
 
@@ -283,23 +283,35 @@ Workflow:
283
283
 
284
284
  Output format after execution:
285
285
 
286
- <!-- fragment:needs-you:start -->
287
- **Needs you — required operator actions.** When this run leaves an action that only the operator can take, and the work is not correct or complete until it is taken, report it in one block at the very top of the final report, before every other section and before any optional next step:
286
+ <!-- fragment:action-required:start -->
287
+ **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:
288
288
 
289
289
  ```markdown
290
- ## ⚠ Needs you
290
+ ---
291
+
292
+ ## 🚧 Action required
293
+
294
+ **Now**
295
+
296
+ - <exactly what to do: the command, the link, or the question> — <why only the operator can do it>
291
297
 
292
- - <exactly what to do: the command, the link, or the question> — <why the agent cannot do it itself>
298
+ **When you're at your desk**
299
+
300
+ - <exactly what to do> — <why only the operator can do it>
301
+
302
+ ---
293
303
  ```
294
304
 
295
- - **What belongs in it:** an action the work needs that 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.
296
- - **One line per action.** Say exactly what to do, then, after the dash, why the agent cannot do it. Write the command, link or question out in full; never point elsewhere with "see above".
305
+ - **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.
306
+ - **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.
307
+ - **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".
297
308
  - **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.
298
- - **Omit it when empty.** When nothing needs the operator, leave the block out entirely: no heading and no "None" line.
309
+ - **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.
310
+ - **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.
299
311
  - **Every final report.** The block belongs in whatever report ends the run, including a report written when the spell stops early.
300
- - **Report it to the presence channel.** When the block is not empty, also run `spell presence report --status waiting --needs-you "<line 1>" --needs-you "<line 2>"`, one flag per line of the block; 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.
312
+ - **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.
301
313
  - Enforcement: explicitly advisory prose (ARC-023) — no check reads a spell's actual output for this block; it holds by these instructions alone.
302
- <!-- fragment:needs-you:end -->
314
+ <!-- fragment:action-required:end -->
303
315
 
304
316
  ## Commit Complete
305
317