arcane-cli 1.19.0 → 1.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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/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
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 "
|
|
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 ...] [--
|
|
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 `
|
|
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
|
-
|
|
243
|
-
|
|
244
|
-
|
|
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
|
-
- **
|
|
248
|
-
|
|
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), `
|
|
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:
|
|
253
|
-
spell describes its final output or report, and `npm run fix:self-host-parity` expands the
|
|
254
|
-
between the markers. Edit the fragment, never an expanded copy, and never restate its rules
|
|
255
|
-
in a spell body. Any shipped Markdown file can host a fragment the same way, not only a
|
|
256
|
-
`branch-naming` fragment is expanded into `git-conventions.md` and the Copilot instruction
|
|
257
|
-
well as into spells, and `spell agents sync` renders it into every client instruction file,
|
|
258
|
-
branch formats are written in exactly one place. Required actions also survive the end of a
|
|
259
|
-
the open items into the handoff's `
|
|
260
|
-
|
|
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/
|
|
265
|
-
omit-when-empty rule, or when a spell in the chosen set loses its span. Which spells
|
|
266
|
-
is decided by an author's judgment, and whether an agent actually emits the block is
|
|
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 "
|
|
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,
|
|
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
|
|
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,
|
|
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 `##
|
|
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:
|
|
120
|
-
**
|
|
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
|
-
|
|
123
|
+
---
|
|
124
124
|
|
|
125
|
-
|
|
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
|
|
129
|
-
- **
|
|
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
|
-
- **
|
|
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
|
|
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:
|
|
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:
|
|
139
|
-
**
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
148
|
-
- **
|
|
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
|
-
- **
|
|
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
|
|
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:
|
|
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
|
-
###
|
|
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:
|
|
391
|
-
**
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
400
|
-
- **
|
|
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
|
-
- **
|
|
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
|
|
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:
|
|
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:
|
|
115
|
-
**
|
|
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
|
-
|
|
118
|
+
---
|
|
119
119
|
|
|
120
|
-
|
|
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
|
|
124
|
-
- **
|
|
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
|
-
- **
|
|
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
|
|
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:
|
|
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 `##
|
|
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
|
-
- **
|
|
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 `##
|
|
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 `##
|
|
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 `##
|
|
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:
|
|
258
|
-
**
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
267
|
-
- **
|
|
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
|
-
- **
|
|
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
|
|
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:
|
|
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 `##
|
|
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:
|
|
287
|
-
**
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
296
|
-
- **
|
|
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
|
-
- **
|
|
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
|
|
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:
|
|
314
|
+
<!-- fragment:action-required:end -->
|
|
303
315
|
|
|
304
316
|
## Commit Complete
|
|
305
317
|
|