arcane-cli 1.7.0 → 1.8.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.
@@ -213,6 +213,38 @@ Arcane's own repository, a test (`test/up02-d-runtime-placeholders.test.ts`) fai
213
213
  `status: active` governance document uses a token that is not in this list. Whether an agent actually
214
214
  resolves a listed token from the named source is explicitly advisory prose: no check exercises it.**
215
215
 
216
+ ## Required operator actions: the `Needs you` block
217
+
218
+ Some runs end with an action only the operator can take: approving or merging a pull request,
219
+ accepting a decision record, answering a question the work is waiting on, confirming a `guarded`
220
+ push, running an interactive command such as `spell unblock-push`, or a step on an external platform
221
+ the agent cannot reach. Listed among optional next steps, such an action gets skimmed past. A spell
222
+ whose output can carry one reports it in one fixed block instead:
223
+
224
+ - **One fixed heading,** `## ⚠ Needs you`, at the very top of the final report, before every other
225
+ section and before any optional next step.
226
+ - **One line per action:** exactly what to do, then why the agent cannot do it itself.
227
+ - **Never only among optional steps:** an action required for correctness may be repeated under next
228
+ steps or suggestions, but it always appears in the block.
229
+ - **Omitted when empty:** when nothing needs the operator, the block is left out entirely, never
230
+ printed as an empty heading or a "None" line.
231
+
232
+ The block's wording lives in one shared prose fragment (ARC-039), `needs-you`, kept in Arcane's
233
+ source under `.arcane/spells/_fragments/` and never shipped on its own. A spell carries it as a
234
+ `<!-- fragment:needs-you:start -->` / `<!-- fragment:needs-you:end -->` marker pair placed where the
235
+ spell describes its final output or report, and `npm run fix:self-host-parity` expands the fragment
236
+ between the markers. Edit the fragment, never an expanded copy, and never restate its rules by hand
237
+ in a spell body. Required actions also survive the end of a session: `spell-close-session` writes
238
+ the open items into the handoff's `Needs you` field, and `spell-open-session` surfaces that field
239
+ first, above the rest of the handoff, and does not mark the handoff consumed until it has.
240
+
241
+ **Enforcement: executable check (ARC-023) for the wording — in Arcane's own repository,
242
+ `npm run check:self-host-parity` fails CI when a spell's expanded span differs from the fragment, and
243
+ a test (`test/up04-b-needs-you.test.ts`) fails when the fragment loses its heading, placement or
244
+ omit-when-empty rule, or when a spell in the chosen set loses its span. Which spells carry the span
245
+ is decided by an author's judgment, and whether an agent actually emits the block is explicitly
246
+ advisory prose: no check reads a spell's output.**
247
+
216
248
  ## How to audit a spell
217
249
 
218
250
  For each dimension, score Bronze/Silver/Gold with one line of evidence. Record the overall (weakest)
@@ -0,0 +1,14 @@
1
+ **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:
2
+
3
+ ```markdown
4
+ ## ⚠ Needs you
5
+
6
+ - <exactly what to do: the command, the link, or the question> — <why the agent cannot do it itself>
7
+ ```
8
+
9
+ - **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.
10
+ - **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".
11
+ - **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.
12
+ - **Omit it when empty.** When nothing needs the operator, leave the block out entirely: no heading and no "None" line.
13
+ - **Every final report.** The block belongs in whatever report ends the run, including a report written when the spell stops early.
14
+ - Enforcement: explicitly advisory prose (ARC-023) — no check reads a spell's actual output for this block; it holds by these instructions alone.
@@ -114,6 +114,24 @@ Resolve threads via the provider:
114
114
 
115
115
  3. `git push` all commits.
116
116
  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).
117
+
118
+ <!-- fragment:needs-you:start -->
119
+ **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:
120
+
121
+ ```markdown
122
+ ## ⚠ Needs you
123
+
124
+ - <exactly what to do: the command, the link, or the question> — <why the agent cannot do it itself>
125
+ ```
126
+
127
+ - **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.
128
+ - **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".
129
+ - **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.
130
+ - **Omit it when empty.** When nothing needs the operator, leave the block out entirely: no heading and no "None" line.
131
+ - **Every final report.** The block belongs in whatever report ends the run, including a report written when the spell stops early.
132
+ - Enforcement: explicitly advisory prose (ARC-023) — no check reads a spell's actual output for this block; it holds by these instructions alone.
133
+ <!-- fragment:needs-you:end -->
134
+
117
135
  5. Optionally post the summary back to the PR as a top-level comment for a durable record.
118
136
 
119
137
  ## Rules
@@ -134,6 +134,23 @@ Hard rules for this phase:
134
134
 
135
135
  ## Phase 4 — Report
136
136
 
137
+ <!-- fragment:needs-you:start -->
138
+ **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:
139
+
140
+ ```markdown
141
+ ## ⚠ Needs you
142
+
143
+ - <exactly what to do: the command, the link, or the question> — <why the agent cannot do it itself>
144
+ ```
145
+
146
+ - **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.
147
+ - **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".
148
+ - **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.
149
+ - **Omit it when empty.** When nothing needs the operator, leave the block out entirely: no heading and no "None" line.
150
+ - **Every final report.** The block belongs in whatever report ends the run, including a report written when the spell stops early.
151
+ - Enforcement: explicitly advisory prose (ARC-023) — no check reads a spell's actual output for this block; it holds by these instructions alone.
152
+ <!-- fragment:needs-you:end -->
153
+
137
154
  Output:
138
155
 
139
156
  ```
@@ -110,6 +110,23 @@ Workflow:
110
110
 
111
111
  8. **Present for review** — show the architecture and story breakdown to the user.
112
112
 
113
+ <!-- fragment:needs-you:start -->
114
+ **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:
115
+
116
+ ```markdown
117
+ ## ⚠ Needs you
118
+
119
+ - <exactly what to do: the command, the link, or the question> — <why the agent cannot do it itself>
120
+ ```
121
+
122
+ - **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.
123
+ - **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".
124
+ - **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.
125
+ - **Omit it when empty.** When nothing needs the operator, leave the block out entirely: no heading and no "None" line.
126
+ - **Every final report.** The block belongs in whatever report ends the run, including a report written when the spell stops early.
127
+ - Enforcement: explicitly advisory prose (ARC-023) — no check reads a spell's actual output for this block; it holds by these instructions alone.
128
+ <!-- fragment:needs-you:end -->
129
+
113
130
  Rules:
114
131
  - Stories must be right-sized per the methodology doc (not "build the entire dashboard").
115
132
  - Architecture decisions must reference existing ADRs when relevant.
@@ -120,6 +120,7 @@ In `ai-context/system-prompt-context.md`, replace the existing `## Next Session
120
120
  - **Branch:** Output of `git branch --show-current`.
121
121
  - **Blockers:** Known unresolved blockers or dependencies. Write "None" if clear.
122
122
  - **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.
123
+ - **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.
123
124
  - **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.
124
125
  ```
125
126
 
@@ -175,7 +176,7 @@ Rules:
175
176
  - Timeout, cancellation, fallback, or delegated response is not approval. Print the visible authorization downgrade and halt without committing.
176
177
 
177
178
  c. **Push and open a PR through `spell-commit-work` step 9, including its separate merge gate:**
178
- - 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.
179
+ - 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.
179
180
 
180
181
  <!-- fragment:push-policy-check:start -->
181
182
  **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>`).
@@ -225,6 +226,23 @@ Rules:
225
226
 
226
227
  Output format:
227
228
 
229
+ <!-- fragment:needs-you:start -->
230
+ **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:
231
+
232
+ ```markdown
233
+ ## ⚠ Needs you
234
+
235
+ - <exactly what to do: the command, the link, or the question> — <why the agent cannot do it itself>
236
+ ```
237
+
238
+ - **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.
239
+ - **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".
240
+ - **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.
241
+ - **Omit it when empty.** When nothing needs the operator, leave the block out entirely: no heading and no "None" line.
242
+ - **Every final report.** The block belongs in whatever report ends the run, including a report written when the spell stops early.
243
+ - Enforcement: explicitly advisory prose (ARC-023) — no check reads a spell's actual output for this block; it holds by these instructions alone.
244
+ <!-- fragment:needs-you:end -->
245
+
228
246
  ## Session Closure
229
247
 
230
248
  - Summary of what was completed.
@@ -256,6 +256,23 @@ Workflow:
256
256
 
257
257
  Output format after execution:
258
258
 
259
+ <!-- fragment:needs-you:start -->
260
+ **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:
261
+
262
+ ```markdown
263
+ ## ⚠ Needs you
264
+
265
+ - <exactly what to do: the command, the link, or the question> — <why the agent cannot do it itself>
266
+ ```
267
+
268
+ - **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.
269
+ - **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".
270
+ - **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.
271
+ - **Omit it when empty.** When nothing needs the operator, leave the block out entirely: no heading and no "None" line.
272
+ - **Every final report.** The block belongs in whatever report ends the run, including a report written when the spell stops early.
273
+ - Enforcement: explicitly advisory prose (ARC-023) — no check reads a spell's actual output for this block; it holds by these instructions alone.
274
+ <!-- fragment:needs-you:end -->
275
+
259
276
  ## Commit Complete
260
277
 
261
278
  ```
@@ -200,6 +200,23 @@ so they need no edit.
200
200
 
201
201
  ## Step 6 — Report
202
202
 
203
+ <!-- fragment:needs-you:start -->
204
+ **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:
205
+
206
+ ```markdown
207
+ ## ⚠ Needs you
208
+
209
+ - <exactly what to do: the command, the link, or the question> — <why the agent cannot do it itself>
210
+ ```
211
+
212
+ - **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.
213
+ - **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".
214
+ - **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.
215
+ - **Omit it when empty.** When nothing needs the operator, leave the block out entirely: no heading and no "None" line.
216
+ - **Every final report.** The block belongs in whatever report ends the run, including a report written when the spell stops early.
217
+ - Enforcement: explicitly advisory prose (ARC-023) — no check reads a spell's actual output for this block; it holds by these instructions alone.
218
+ <!-- fragment:needs-you:end -->
219
+
203
220
  ```
204
221
  ✓ PR created: <URL>
205
222
  Title: <title>
@@ -234,6 +234,29 @@ console error stating otherwise (`EV-06`).
234
234
  - **Locale lists differ between the stores.** Release notes are per-language; resolve locale coverage
235
235
  against each store's own catalogue rather than copying the other store's list (`MR-06`).
236
236
 
237
+ ### Reporting the release
238
+
239
+ End every release run with a short report. The store-console steps the agent cannot reach — sending
240
+ staged Google Play changes for review, answering an App Store review question, confirming a manual
241
+ release — are required operator actions:
242
+
243
+ <!-- fragment:needs-you:start -->
244
+ **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:
245
+
246
+ ```markdown
247
+ ## ⚠ Needs you
248
+
249
+ - <exactly what to do: the command, the link, or the question> — <why the agent cannot do it itself>
250
+ ```
251
+
252
+ - **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.
253
+ - **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".
254
+ - **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.
255
+ - **Omit it when empty.** When nothing needs the operator, leave the block out entirely: no heading and no "None" line.
256
+ - **Every final report.** The block belongs in whatever report ends the run, including a report written when the spell stops early.
257
+ - Enforcement: explicitly advisory prose (ARC-023) — no check reads a spell's actual output for this block; it holds by these instructions alone.
258
+ <!-- fragment:needs-you:end -->
259
+
237
260
  ---
238
261
 
239
262
  ## Rules
@@ -184,6 +184,24 @@ Execute the `spell-ship` workflow:
184
184
  applies (state "Nothing withheld" in that case). Fold it into the consumer repo's own QA checklist
185
185
  so a human reviewer sees exactly what still needs a human look, not just what passed (2026-07-22
186
186
  dogfooding finding: honest disclosure of sandbox limits, not just of failures).
187
+
188
+ <!-- fragment:needs-you:start -->
189
+ **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:
190
+
191
+ ```markdown
192
+ ## ⚠ Needs you
193
+
194
+ - <exactly what to do: the command, the link, or the question> — <why the agent cannot do it itself>
195
+ ```
196
+
197
+ - **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.
198
+ - **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".
199
+ - **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.
200
+ - **Omit it when empty.** When nothing needs the operator, leave the block out entirely: no heading and no "None" line.
201
+ - **Every final report.** The block belongs in whatever report ends the run, including a report written when the spell stops early.
202
+ - Enforcement: explicitly advisory prose (ARC-023) — no check reads a spell's actual output for this block; it holds by these instructions alone.
203
+ <!-- fragment:needs-you:end -->
204
+
187
205
  4. Create the PR:
188
206
  - `external/ado` mode: `az repos pr create --repository {repo} --source-branch {branch} --target-branch main --title "{feature}" --work-items {adoWorkItemId}`
189
207
  - `internal` mode (or provider TODO mode): create PR without `--work-items`.
@@ -250,6 +250,23 @@ just because nothing threw an error.
250
250
 
251
251
  ## Phase 6 — Report
252
252
 
253
+ <!-- fragment:needs-you:start -->
254
+ **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:
255
+
256
+ ```markdown
257
+ ## ⚠ Needs you
258
+
259
+ - <exactly what to do: the command, the link, or the question> — <why the agent cannot do it itself>
260
+ ```
261
+
262
+ - **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.
263
+ - **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".
264
+ - **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.
265
+ - **Omit it when empty.** When nothing needs the operator, leave the block out entirely: no heading and no "None" line.
266
+ - **Every final report.** The block belongs in whatever report ends the run, including a report written when the spell stops early.
267
+ - Enforcement: explicitly advisory prose (ARC-023) — no check reads a spell's actual output for this block; it holds by these instructions alone.
268
+ <!-- fragment:needs-you:end -->
269
+
253
270
  Summarize what changed, what's still open, and close with a plain-language,
254
271
  user-verifiable acceptance checklist:
255
272
 
@@ -36,6 +36,7 @@ Use these files first:
36
36
  Check `ai-context/system-prompt-context.md` for a `## Next Session Handoff` section.
37
37
 
38
38
  - If present and **not yet marked consumed** (no `> ✓ Consumed:` line): surface it immediately as `## Picking Up From Last Session` at the very top of your output, before all other sections — include `Last completed step`, `Blockers`, and `Notes` verbatim alongside the rest (session handoff durability: these three are written by close-session but were previously never read back). Use the `Next concrete action` field as the first item in `## Next Session Plan`. Use the `Active task`, `Active files`, and `Branch` fields to pre-populate the State Snapshot.
39
+ - **The handoff's `Needs you` field comes first.** If it lists anything other than "None", surface every item in the `## ⚠ Needs you` block (see the output structure below) **above** `## Picking Up From Last Session`, the one exception to "before all other sections" in the bullet above. Where you can check an item (a pull request's merge state, whether a branch was pushed), check it: an item the operator has already done leaves the block and is noted as done under `## Picking Up From Last Session` (that counts as surfaced); keep every item you cannot check. A handoff written before this field existed has no `Needs you` line; treat it as "None". Do not mark the handoff consumed until every listed item has been surfaced: a handoff whose `Needs you` items were not surfaced stays unconsumed, so the next open-session surfaces them again.
39
40
  - **If the handoff's `Pending Verification` field lists anything other than "None" (EF-21):** surface each listed item explicitly, then actively re-check its current status (per the item's stated verification action) rather than treating the state recorded at close-session time as still current — a `dispatched`/`pending` item may have since succeeded, failed, or still be running, and carrying it forward as inert text would repeat the exact failure mode this field exists to prevent. Report what you found (resolved succeeded / resolved failed / still pending / still unverifiable) before relying on anything downstream that depended on it.
40
41
  - After surfacing it, apply the Mutation Guard below, then run the **Durability check** (session handoff durability, ARC-040): confirm that an incomplete `Active task`, the `Next concrete action`, and any task-bearing `Notes` content each name a durable location that genuinely exists (the cited `TODO.md` item — by stable locator, not a line number that may have already drifted — or tracker work item). If a named location is missing, or close-session's own step 4b was skipped when it shouldn't have been, register the missing content now — on this session's own branch — before proceeding. Only then append `> ✓ Consumed: YYYY-MM-DD` (today's date); the marker write is a repository mutation. If the Durability check cannot complete, leave the handoff unconsumed so the next open-session retries the same check idempotently, rather than silently losing the gap.
41
42
  - If the section is absent or already marked consumed: skip this step and proceed with the normal workspace scan.
@@ -67,6 +68,23 @@ Run the `spell-check-drift` spell first, before building the state snapshot or g
67
68
 
68
69
  Then produce output in this exact structure:
69
70
 
71
+ <!-- fragment:needs-you:start -->
72
+ **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:
73
+
74
+ ```markdown
75
+ ## ⚠ Needs you
76
+
77
+ - <exactly what to do: the command, the link, or the question> — <why the agent cannot do it itself>
78
+ ```
79
+
80
+ - **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.
81
+ - **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".
82
+ - **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.
83
+ - **Omit it when empty.** When nothing needs the operator, leave the block out entirely: no heading and no "None" line.
84
+ - **Every final report.** The block belongs in whatever report ends the run, including a report written when the spell stops early.
85
+ - Enforcement: explicitly advisory prose (ARC-023) — no check reads a spell's actual output for this block; it holds by these instructions alone.
86
+ <!-- fragment:needs-you:end -->
87
+
70
88
  ## Workspace Health Check
71
89
 
72
90
  Before anything else, check:
@@ -151,6 +151,23 @@ Workflow:
151
151
 
152
152
  7. **Present for review** — show the PRD to the user for approval before proceeding to `spell-architect`.
153
153
 
154
+ <!-- fragment:needs-you:start -->
155
+ **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:
156
+
157
+ ```markdown
158
+ ## ⚠ Needs you
159
+
160
+ - <exactly what to do: the command, the link, or the question> — <why the agent cannot do it itself>
161
+ ```
162
+
163
+ - **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.
164
+ - **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".
165
+ - **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.
166
+ - **Omit it when empty.** When nothing needs the operator, leave the block out entirely: no heading and no "None" line.
167
+ - **Every final report.** The block belongs in whatever report ends the run, including a report written when the spell stops early.
168
+ - Enforcement: explicitly advisory prose (ARC-023) — no check reads a spell's actual output for this block; it holds by these instructions alone.
169
+ <!-- fragment:needs-you:end -->
170
+
154
171
  8. **Provider TODO handling** — if `external_provider=jira` or `external_provider=other`, add a TODO note in PRD open questions that provider-specific automation/linking is pending. `github` does not need this — it has a real, working flow (Step 1 above).
155
172
 
156
173
  Rules:
@@ -104,6 +104,23 @@ collide, but a PR title inserted verbatim as a label could).
104
104
  2. If `--html` was passed, also emit a self-contained HTML file (inline CSS, no external assets) at the same base path so it can be shared by email/chat.
105
105
  3. Print a summary to the user: total reviewed / skipped, verdict counts, total findings by severity, the GO/NO-GO gate, and the output path(s).
106
106
 
107
+ <!-- fragment:needs-you:start -->
108
+ **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:
109
+
110
+ ```markdown
111
+ ## ⚠ Needs you
112
+
113
+ - <exactly what to do: the command, the link, or the question> — <why the agent cannot do it itself>
114
+ ```
115
+
116
+ - **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.
117
+ - **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".
118
+ - **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.
119
+ - **Omit it when empty.** When nothing needs the operator, leave the block out entirely: no heading and no "None" line.
120
+ - **Every final report.** The block belongs in whatever report ends the run, including a report written when the spell stops early.
121
+ - Enforcement: explicitly advisory prose (ARC-023) — no check reads a spell's actual output for this block; it holds by these instructions alone.
122
+ <!-- fragment:needs-you:end -->
123
+
107
124
  ## Rules
108
125
 
109
126
  - Reuse the `spell-review` engine per PR — do not invent a parallel, weaker rubric.
@@ -121,6 +121,23 @@ Workflow:
121
121
 
122
122
  8. **Present findings** — show the review to the user with a clear recommendation.
123
123
 
124
+ <!-- fragment:needs-you:start -->
125
+ **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:
126
+
127
+ ```markdown
128
+ ## ⚠ Needs you
129
+
130
+ - <exactly what to do: the command, the link, or the question> — <why the agent cannot do it itself>
131
+ ```
132
+
133
+ - **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.
134
+ - **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".
135
+ - **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.
136
+ - **Omit it when empty.** When nothing needs the operator, leave the block out entirely: no heading and no "None" line.
137
+ - **Every final report.** The block belongs in whatever report ends the run, including a report written when the spell stops early.
138
+ - Enforcement: explicitly advisory prose (ARC-023) — no check reads a spell's actual output for this block; it holds by these instructions alone.
139
+ <!-- fragment:needs-you:end -->
140
+
124
141
  9. **Write back to the pull request** — when a PR exists for these changes, sync a short verdict plus a findings summary (verdict + finding counts/IDs + a pointer to the saved report) into the PR body/description. Use provider-agnostic phrasing that works for either GitHub or Azure DevOps. Mark it clearly as a snapshot at review time, and fall back to a top-level PR comment if the description can't be updated.
125
142
 
126
143
  10. **Post the formal round state** (ARC-035 decision 3 — Arcane's own framework decision, cited as plain text, not linked, since this file ships; see `agent-output.instructions.md` → Doc-ID Link Format) — step 9's write-back is a human-readable summary; this is the separate, machine-readable signal the `Review round clear` required check actually reads. Only a confirmed blocker posts a formal review — an `APPROVE` or `DEFER` verdict posts nothing here, preserving the zero-friction path for PRs nobody formally blocks:
@@ -131,7 +148,7 @@ Workflow:
131
148
  - GitHub: find the blocking review's ID (`gh api repos/{owner}/{repo}/pulls/<n>/reviews --jq '.[] | select(.state=="CHANGES_REQUESTED") | .id'`), then dismiss it — `gh api -X PUT repos/{owner}/{repo}/pulls/<n>/reviews/<review_id>/dismissals -f event=DISMISS -f message="<why this is now resolved, referencing the fix commit>"`.
132
149
  - Azure DevOps: `az repos pr set-vote --id <n> --vote approve` (or reset to no-vote per team convention).
133
150
  - Degrade silently if the CLI is unauthenticated or the PR can't be resolved (e.g. no PR exists yet for a local-only review) — never let this step abort a review that otherwise completed; the findings, report, and step 9 write-back still stand on their own.
134
- - **GitHub refuses a REQUEST CHANGES verdict from the PR's own author** (`GraphQL: Review Can not request changes on your own pull request`, verified live 2026-08-31 — the same restriction as self-approval, just previously untested). When you are reviewing your own authored PR under the same GitHub identity, this call will fail with exactly that error: treat it as expected, not a bug, and fall back to the step 9 write-back as the only signal available — a formal blocking review needs a genuinely distinct reviewer identity (a second collaborator, or a separate bot/service account).
151
+ - **GitHub refuses a REQUEST CHANGES verdict from the PR's own author** (`GraphQL: Review Can not request changes on your own pull request`, verified live 2026-08-31 — the same restriction as self-approval, just previously untested). When you are reviewing your own authored PR under the same GitHub identity, this call will fail with exactly that error: treat it as expected, not a bug, and fall back to the step 9 write-back as the only signal available — a formal blocking review needs a genuinely distinct reviewer identity (a second collaborator, or a separate bot/service account). Because this happens after step 8, finish by telling the operator in a short `## ⚠ Needs you` block (per step 8): have a distinct reviewer identity post the blocking review — this identity cannot block its own pull request.
135
152
 
136
153
  Rules:
137
154
  - **Cover every dimension, not a finding count.** You MUST explicitly address each lens — correctness, security, performance, tests, naming/clarity, architecture — and state "no issues" for any lens that is clean. There is no minimum number of findings: zero findings is a valid outcome on a clean or small diff. The mandate is coverage of effort, not a count of findings — never fabricate issues to hit a quota.
@@ -249,6 +249,23 @@ If `external_provider=jira` or `external_provider=other`, add explicit TODOs in
249
249
 
250
250
  ### 9. Present and Confirm
251
251
 
252
+ <!-- fragment:needs-you:start -->
253
+ **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:
254
+
255
+ ```markdown
256
+ ## ⚠ Needs you
257
+
258
+ - <exactly what to do: the command, the link, or the question> — <why the agent cannot do it itself>
259
+ ```
260
+
261
+ - **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.
262
+ - **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".
263
+ - **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.
264
+ - **Omit it when empty.** When nothing needs the operator, leave the block out entirely: no heading and no "None" line.
265
+ - **Every final report.** The block belongs in whatever report ends the run, including a report written when the spell stops early.
266
+ - Enforcement: explicitly advisory prose (ARC-023) — no check reads a spell's actual output for this block; it holds by these instructions alone.
267
+ <!-- fragment:needs-you:end -->
268
+
252
269
  Present the execution plan to the user. Ask:
253
270
  1. Does the epic split make sense?
254
271
  2. Are the ADR candidates correct? Should any be decided now?
@@ -96,6 +96,23 @@ Workflow:
96
96
  - OR: BLOCK — [reason]
97
97
  ```
98
98
 
99
+ <!-- fragment:needs-you:start -->
100
+ **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:
101
+
102
+ ```markdown
103
+ ## ⚠ Needs you
104
+
105
+ - <exactly what to do: the command, the link, or the question> — <why the agent cannot do it itself>
106
+ ```
107
+
108
+ - **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.
109
+ - **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".
110
+ - **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.
111
+ - **Omit it when empty.** When nothing needs the operator, leave the block out entirely: no heading and no "None" line.
112
+ - **Every final report.** The block belongs in whatever report ends the run, including a report written when the spell stops early.
113
+ - Enforcement: explicitly advisory prose (ARC-023) — no check reads a spell's actual output for this block; it holds by these instructions alone.
114
+ <!-- fragment:needs-you:end -->
115
+
99
116
  7. **Request human approval** — present the ship report and wait for explicit approval.
100
117
 
101
118
  8. **Execute merge** (after approval):
@@ -88,6 +88,7 @@ then classify **each conflicted hunk independently** — a single file can conta
88
88
  that one side's content is a strict superset of the other's. **STOP.** Do not guess, do not pick a
89
89
  side, do not attempt a "reasonable-looking" merge of the two. Abort the in-progress rebase/merge
90
90
  (`git rebase --abort` / `git merge --abort`) so the branch is left exactly as it was, then report:
91
+ - First, the `## ⚠ Needs you` block described in Step 6, naming the manual resolution as the action.
91
92
  - The exact conflicting file(s) and hunk(s).
92
93
  - Both sides' conflicting content, verbatim.
93
94
  - That the recoverable ref from Step 1 still points at the pre-sync state.
@@ -149,6 +150,23 @@ report the discrepancy rather than declaring the sync done.
149
150
 
150
151
  ## Step 6 — Report
151
152
 
153
+ <!-- fragment:needs-you:start -->
154
+ **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:
155
+
156
+ ```markdown
157
+ ## ⚠ Needs you
158
+
159
+ - <exactly what to do: the command, the link, or the question> — <why the agent cannot do it itself>
160
+ ```
161
+
162
+ - **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.
163
+ - **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".
164
+ - **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.
165
+ - **Omit it when empty.** When nothing needs the operator, leave the block out entirely: no heading and no "None" line.
166
+ - **Every final report.** The block belongs in whatever report ends the run, including a report written when the spell stops early.
167
+ - Enforcement: explicitly advisory prose (ARC-023) — no check reads a spell's actual output for this block; it holds by these instructions alone.
168
+ <!-- fragment:needs-you:end -->
169
+
152
170
  ```
153
171
  ✓ PR synced: <URL>
154
172
  Branch: <branch> → <target>
@@ -33,6 +33,7 @@
33
33
  - **Branch:** main
34
34
  - **Blockers:** None.
35
35
  - **Pending Verification:** None.
36
+ - **Needs you:** None.
36
37
  - **Notes:** —
37
38
 
38
39
  > ✓ Consumed: YYYY-MM-DD — scaffold placeholder, not a real session; ships pre-consumed so the first
@@ -1,4 +1,4 @@
1
- <!-- @codemagician/arcane-ui v2.1.7 -- SEE LICENSE IN LICENSE. Generated by scripts/build-report-template.tsx. Do not edit by hand. -->
1
+ <!-- @codemagician/arcane-ui v2.2.1 -- SEE LICENSE IN LICENSE. Generated by scripts/build-report-template.tsx. Do not edit by hand. -->
2
2
  <!doctype html>
3
3
  <html lang="en">
4
4
  <head>
@@ -7,9 +7,9 @@
7
7
  <title>{{masthead.title}}</title>
8
8
  <link rel="preconnect" href="https://fonts.gstatic.com">
9
9
  <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Chakra+Petch:wght@500;600;700&family=Rajdhani:wght@400;500;600&family=JetBrains+Mono:wght@400;500&display=swap">
10
- <style>:root{--cat-platform:#7fdfff;--cat-docs:#aac0d6;--cat-process:#c3d97a;--cat-fix:#ff7a6b;--cat-decision:#ffb547;--cat-governance:#8ab4ff;--cat-feature:#5cf2a4;--cat-spell:#c9a2ff;--ink-50:#7c95b5;--f-mono:'JetBrains Mono', ui-monospace, monospace;--ink-70:#aac0d6;--ink-10:#1d2a3d;--ink-80:#c8d5e6;--ink-30:#4f6a8a;--ink-60:#9fb8d6;--f-ui:'Rajdhani', 'Chakra Petch', system-ui, sans-serif;--ink-90:#e4eaf0;--f-display:'Chakra Petch', 'Saira Condensed', system-ui, sans-serif;--bg:#000000;--r-corner:var(--r-chamfer);--r-chamfer:2px;--ink-15:#2a3e58;--signal-warn:#ffb547;--bg-1:#060708;--accent:#ffffff;--signal-ok:#5cf2a4;--ink-100:#ffffff}@media (prefers-color-scheme: light){:root{--cat-platform:#0d6179;--cat-docs:#3d5578;--cat-process:#50600f;--cat-fix:#a42f26;--cat-decision:#844c00;--cat-governance:#2856ad;--cat-feature:#136640;--cat-spell:#6b3fbf;--ink-50:#435b78;--ink-70:#2e4260;--ink-10:#cddae8;--ink-80:#1f2f46;--ink-30:#8aaac8;--ink-60:#3d5578;--ink-90:#141e2e;--bg:#f0f4f8;--ink-15:#bdd0e2;--signal-warn:#824d00;--bg-1:#e4eaef;--accent:#595959;--signal-ok:#086736;--ink-100:#070c14}}@media print{:root{--cat-platform:#0d6179;--cat-docs:#3d5578;--cat-process:#50600f;--cat-fix:#a42f26;--cat-decision:#844c00;--cat-governance:#2856ad;--cat-feature:#136640;--cat-spell:#6b3fbf;--ink-50:#435b78;--ink-70:#2e4260;--ink-10:#cddae8;--ink-80:#1f2f46;--ink-30:#8aaac8;--ink-60:#3d5578;--ink-90:#141e2e;--bg:#f0f4f8;--ink-15:#bdd0e2;--signal-warn:#824d00;--bg-1:#e4eaef;--accent:#595959;--signal-ok:#086736;--ink-100:#070c14}} body{margin:0;background:var(--bg);color:var(--ink-80);font-family:var(--f-ui),system-ui,sans-serif} a{text-decoration:none} a:hover{text-decoration:underline} code{font-family:var(--f-mono);font-size:.92em} .unwritten{color:var(--ink-50);font-style:italic}</style>
10
+ <style>:root{--cat-platform:#7fdfff;--cat-docs:#aac0d6;--cat-process:#c3d97a;--cat-fix:#ff7a6b;--cat-decision:#ffb547;--cat-governance:#8ab4ff;--cat-feature:#5cf2a4;--cat-spell:#c9a2ff;--ink-50:#7c95b5;--f-mono:'JetBrains Mono', ui-monospace, monospace;--ink-70:#aac0d6;--ink-10:#1d2a3d;--ink-80:#c8d5e6;--ink-30:#4f6a8a;--ink-60:#9fb8d6;--f-ui:'Rajdhani', 'Chakra Petch', system-ui, sans-serif;--ink-90:#e4eaf0;--f-display:'Chakra Petch', 'Saira Condensed', system-ui, sans-serif;--bg:#000000;--r-corner:var(--r-chamfer);--r-chamfer:2px;--ink-15:#2a3e58;--signal-warn:#ffb547;--bg-1:#060708;--accent:#ffffff;--signal-ok:#5cf2a4;--ink-100:#ffffff}@media (prefers-color-scheme: light){:root{--cat-platform:#0d6179;--cat-docs:#3d5578;--cat-process:#50600f;--cat-fix:#a42f26;--cat-decision:#844c00;--cat-governance:#2856ad;--cat-feature:#136640;--cat-spell:#6b3fbf;--ink-50:#435b78;--ink-70:#2e4260;--ink-10:#cddae8;--ink-80:#1f2f46;--ink-30:#8aaac8;--ink-60:#3d5578;--ink-90:#141e2e;--bg:#f0f4f8;--ink-15:#bdd0e2;--signal-warn:#824d00;--bg-1:#e4eaef;--accent:#595959;--signal-ok:#086736;--ink-100:#070c14}}@media print{:root{--cat-platform:#0d6179;--cat-docs:#3d5578;--cat-process:#50600f;--cat-fix:#a42f26;--cat-decision:#844c00;--cat-governance:#2856ad;--cat-feature:#136640;--cat-spell:#6b3fbf;--ink-50:#435b78;--ink-70:#2e4260;--ink-10:#cddae8;--ink-80:#1f2f46;--ink-30:#8aaac8;--ink-60:#3d5578;--ink-90:#141e2e;--bg:#f0f4f8;--ink-15:#bdd0e2;--signal-warn:#824d00;--bg-1:#e4eaef;--accent:#595959;--signal-ok:#086736;--ink-100:#070c14}}:root[data-theme="dark"]{--cat-platform:#7fdfff;--cat-docs:#aac0d6;--cat-process:#c3d97a;--cat-fix:#ff7a6b;--cat-decision:#ffb547;--cat-governance:#8ab4ff;--cat-feature:#5cf2a4;--cat-spell:#c9a2ff;--ink-50:#7c95b5;--ink-70:#aac0d6;--ink-10:#1d2a3d;--ink-80:#c8d5e6;--ink-30:#4f6a8a;--ink-60:#9fb8d6;--ink-90:#e4eaf0;--bg:#000000;--ink-15:#2a3e58;--signal-warn:#ffb547;--bg-1:#060708;--accent:#ffffff;--signal-ok:#5cf2a4;--ink-100:#ffffff}:root[data-theme="light"]{--cat-platform:#0d6179;--cat-docs:#3d5578;--cat-process:#50600f;--cat-fix:#a42f26;--cat-decision:#844c00;--cat-governance:#2856ad;--cat-feature:#136640;--cat-spell:#6b3fbf;--ink-50:#435b78;--ink-70:#2e4260;--ink-10:#cddae8;--ink-80:#1f2f46;--ink-30:#8aaac8;--ink-60:#3d5578;--ink-90:#141e2e;--bg:#f0f4f8;--ink-15:#bdd0e2;--signal-warn:#824d00;--bg-1:#e4eaef;--accent:#595959;--signal-ok:#086736;--ink-100:#070c14}:root:has(#arcane-report-theme-dark:checked){--cat-platform:#7fdfff;--cat-docs:#aac0d6;--cat-process:#c3d97a;--cat-fix:#ff7a6b;--cat-decision:#ffb547;--cat-governance:#8ab4ff;--cat-feature:#5cf2a4;--cat-spell:#c9a2ff;--ink-50:#7c95b5;--ink-70:#aac0d6;--ink-10:#1d2a3d;--ink-80:#c8d5e6;--ink-30:#4f6a8a;--ink-60:#9fb8d6;--ink-90:#e4eaf0;--bg:#000000;--ink-15:#2a3e58;--signal-warn:#ffb547;--bg-1:#060708;--accent:#ffffff;--signal-ok:#5cf2a4;--ink-100:#ffffff}:root:has(#arcane-report-theme-light:checked){--cat-platform:#0d6179;--cat-docs:#3d5578;--cat-process:#50600f;--cat-fix:#a42f26;--cat-decision:#844c00;--cat-governance:#2856ad;--cat-feature:#136640;--cat-spell:#6b3fbf;--ink-50:#435b78;--ink-70:#2e4260;--ink-10:#cddae8;--ink-80:#1f2f46;--ink-30:#8aaac8;--ink-60:#3d5578;--ink-90:#141e2e;--bg:#f0f4f8;--ink-15:#bdd0e2;--signal-warn:#824d00;--bg-1:#e4eaef;--accent:#595959;--signal-ok:#086736;--ink-100:#070c14}#arcane-report-theme-toggle-wrap input:checked+label{color:var(--ink-90);border-color:var(--ink-30)}#arcane-report-theme-toggle-wrap input:focus-visible+label{box-shadow:0 0 0 2px var(--ink-50)}@media print{#arcane-report-theme-toggle-wrap{display:none}} body{margin:0;background:var(--bg);color:var(--ink-80);font-family:var(--f-ui),system-ui,sans-serif} a{text-decoration:none} a:hover{text-decoration:underline} code{font-family:var(--f-mono);font-size:.92em} .unwritten{color:var(--ink-50);font-style:italic}</style>
11
11
  </head>
12
12
  <body>
13
- <svg width="0" height="0" style="position:absolute;width:0;height:0" aria-hidden="true" focusable="false"><symbol id="cat-spell" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M8 1.75v3.5M8 10.75v3.5M1.75 8h3.5M10.75 8h3.5M3.6 3.6l2.4 2.4M10 10l2.4 2.4M12.4 3.6 10 6M6 10l-2.4 2.4"></path></symbol><symbol id="cat-feature" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="2.25" y="2.25" width="11.5" height="11.5" rx="1"></rect><path d="M8 5.25v5.5M5.25 8h5.5"></path></symbol><symbol id="cat-governance" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M8 1.75 13.25 3.75v4.2c0 3.05-2.2 5.3-5.25 6.3-3.05-1-5.25-3.25-5.25-6.3v-4.2z"></path></symbol><symbol id="cat-decision" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M8 1.75 14.25 8 8 14.25 1.75 8z"></path></symbol><symbol id="cat-fix" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M8 1.75 13.4 4.9v6.2L8 14.25 2.6 11.1V4.9z"></path><circle cx="8" cy="8" r="2.25"></circle></symbol><symbol id="cat-process" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M13 8a5 5 0 0 1-8.65 3.45M3 8a5 5 0 0 1 8.65-3.45"></path><path d="M11.65 2.15v2.4h-2.4M4.35 13.85v-2.4h2.4"></path></symbol><symbol id="cat-docs" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3.75 1.75h5.75l2.75 2.75v9.75h-8.5z"></path><path d="M9.5 1.75v3h3M6 8h4M6 10.75h4"></path></symbol><symbol id="cat-platform" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="2.25" y="2.25" width="11.5" height="3.75" rx=".75"></rect><rect x="2.25" y="8.25" width="11.5" height="3.75" rx=".75"></rect><path d="M4.75 4.1h.01M4.75 10.1h.01"></path><path d="M8 12v2.25"></path></symbol></svg><main><div><div style="display:flex;align-items:baseline;gap:12px;margin-bottom:16px"><span style="font-family:var(--f-mono);font-size:10px;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-50)">{{masthead.eyebrow}}</span><span aria-hidden="true" style="flex-grow:1;height:1px;background:var(--ink-10)"></span><span style="font-family:var(--f-mono);font-size:10px;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-50)">{{program.slug}}</span></div><h1 style="font-family:var(--f-display);font-weight:600;font-size:30px;line-height:1.15;letter-spacing:.04em;text-transform:uppercase;color:var(--ink-90);margin:0 0 10px;max-width:24ch">{{masthead.title}}</h1><p style="font-family:var(--f-ui);font-size:15px;color:var(--ink-60);margin:0 0 14px;max-width:62ch">{{masthead.dek}}</p><div style="display:flex;flex-wrap:wrap;gap:6px 18px;font-family:var(--f-mono);font-size:11px;color:var(--ink-70);margin-bottom:26px"><span><span style="color:var(--ink-50)">status</span> <span style="color:var(--signal-ok)">{{program.status}}</span></span><span><span style="color:var(--ink-50)">started</span> {{program.started}}</span><span><span style="color:var(--ink-50)">completed</span> {{program.completed}}</span><span><span style="color:var(--ink-50)">baseline</span> {{program.baseline}}</span></div></div><div style="margin-bottom:20px"><dl style="display:grid;grid-auto-flow:column;grid-auto-columns:minmax(0, 1fr);gap:1px;background:var(--ink-10);border:1px solid var(--ink-30);border-radius:var(--r-corner);margin:0">{{#stats}}<div style="background:var(--bg);display:flex;flex-direction:column-reverse"><dt style="margin:4px 16px 14px;font-family:var(--f-display);font-size:10px;letter-spacing:.18em;text-transform:uppercase;color:var(--ink-60)">{{label}}</dt><dd style="margin:0"><div class="arc-stat-tile arc-stat-tile--sm" style="padding:14px 16px;padding-bottom:0"><div class="arc-num" style="font-size:26px;font-weight:700;line-height:1;color:var(--ink-100);font-variant-numeric:tabular-nums;letter-spacing:-.01em">{{value}}</div></div></dd></div>{{/stats}}</dl></div><div style="display:flex;gap:12px;align-items:stretch;margin-bottom:26px"><div style="flex-grow:1"><div style="margin-bottom:26px">{{#needsYouCount}}<div style="display:flex;align-items:baseline;gap:10px;margin-bottom:8px"><h2 style="font-family:var(--f-display);font-weight:600;font-size:12px;letter-spacing:.04em;text-transform:uppercase;color:var(--ink-90);margin:0">Needs you</h2><span style="font-family:var(--f-mono);font-size:11px;color:var(--ink-50)">{{needsYouCount}} open</span></div><ul style="list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px">{{#needsYou}}<li style="border:1px solid var(--ink-15);border-left:2px solid var(--signal-warn);border-radius:var(--r-corner);background:var(--bg-1);padding:12px 16px">{{#href}}<a href="{{href}}" style="color:var(--accent)">{{title}}</a>{{/href}}{{^href}}<span style="color:var(--ink-90)">{{title}}</span>{{/href}}</li>{{/needsYou}}</ul>{{/needsYouCount}}{{^needsYouCount}}<div style="border:1px solid var(--ink-15);border-left:2px solid var(--signal-ok);border-radius:var(--r-corner);background:var(--bg-1);padding:12px 16px;display:flex;align-items:center;gap:10px"><span aria-hidden="true" style="display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--signal-ok)"></span><span style="font-family:var(--f-display);font-size:13px;letter-spacing:.04em;text-transform:uppercase;color:var(--signal-ok)">Nothing needs you</span></div>{{/needsYouCount}}</div></div>{{#hasOutcome}}<div style="border:1px solid var(--ink-15);border-radius:var(--r-corner);background:var(--bg-1);padding:12px 16px;display:flex;align-items:center;font-family:var(--f-mono);font-size:11px;color:var(--ink-70)">{{outcome}}</div>{{/hasOutcome}}</div><div style="display:flex;flex-wrap:wrap;gap:8px 16px;padding:12px 0;border-top:1px solid var(--ink-10);border-bottom:1px solid var(--ink-10);margin-bottom:26px">{{#legend}}<span style="display:inline-flex;align-items:center;gap:6px;font-family:var(--f-mono);font-size:10px;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-50)"><span style="color:var(--cat-{{key}})"><svg width="12" height="12" aria-hidden="true" focusable="false"><use href="#cat-{{key}}"></use></svg></span>{{label}}</span>{{/legend}}</div>{{#sections}}<div style="border:1px solid var(--ink-30);border-radius:var(--r-corner);background:var(--bg);margin-bottom:18px"><div style="display:flex;align-items:center;gap:10px;padding:9px 14px;border-bottom:1px solid var(--ink-10);background:var(--bg-1)"><h2 style="font-family:var(--f-display);font-weight:600;font-size:12px;letter-spacing:.04em;text-transform:uppercase;color:var(--ink-90);margin:0">{{title}}</h2><span style="flex-grow:1"></span><span style="font-family:var(--f-mono);font-size:10px;color:var(--ink-50)">{{rowCount}}</span></div><ol style="list-style:none;margin:0;padding:0">{{#rows}}<li style="border-bottom:1px solid var(--ink-10)"><div style="display:grid;grid-template-columns:68px 1fr 128px;gap:14px;padding:13px 14px;align-items:start">{{#hasHref}}<a href="{{href}}" style="font-family:var(--f-mono);font-size:11px;color:var(--accent)">{{id}}</a>{{/hasHref}}{{^hasHref}}<span style="font-family:var(--f-mono);font-size:11px;color:var(--ink-50)">{{id}}</span>{{/hasHref}}<div><div style="font-family:var(--f-display);font-weight:600;font-size:13px;letter-spacing:.03em;text-transform:uppercase;color:var(--ink-90);margin-bottom:4px">{{title}}</div><div style="font-family:var(--f-ui);font-size:14px;line-height:1.45;color:var(--ink-60);font-style:normal;max-width:58ch">{{#isUnwritten}}<span class="unwritten">unwritten</span>{{/isUnwritten}}{{^isUnwritten}}{{{descriptionHtml}}}{{/isUnwritten}}</div></div><span class="arc-pill" style="color:var(--cat-{{category}});border-color:color-mix(in srgb, var(--cat-{{category}}) 50%, transparent);justify-self:end"><svg width="12" height="12" aria-hidden="true" focusable="false"><use href="#cat-{{category}}"></use></svg>{{categoryLabel}}</span></div></li>{{/rows}}</ol></div>{{/sections}}{{#hasCorrections}}{{#corrections}}<div style="border:1px solid var(--ink-15);border-radius:var(--r-corner);background:var(--bg-1);padding:14px 16px;margin-bottom:18px"><div style="display:flex;align-items:baseline;gap:10px;margin-bottom:8px"><h2 style="font-family:var(--f-display);font-weight:600;font-size:12px;letter-spacing:.04em;text-transform:uppercase;color:var(--ink-90);margin:0">Calibration</h2><span style="font-family:var(--f-mono);font-size:11px;color:var(--ink-50)">{{checked}} checked · {{corrected}} corrected · {{unverifiable}} unverifiable</span></div><div style="font-family:var(--f-ui);font-size:14px;line-height:1.45;color:var(--ink-60);max-width:62ch;margin-bottom:12px">{{scopeNote}}</div><div style="display:flex;flex-direction:column;gap:10px;border-top:1px solid var(--ink-10);padding-top:12px">{{#highlights}}<div style="display:grid;grid-template-columns:84px 1fr;gap:12px;align-items:baseline"><span style="font-family:var(--f-mono);font-size:10px;letter-spacing:.1em;text-transform:uppercase;color:var(--signal-warn)">{{categoryLabel}}</span><div><div style="font-family:var(--f-display);font-weight:600;font-size:12px;letter-spacing:.02em;color:var(--ink-90);margin-bottom:3px">{{title}}</div><div style="font-family:var(--f-ui);font-size:14px;line-height:1.45;color:var(--ink-60);font-style:normal;max-width:62ch">{{#isUnwritten}}<span class="unwritten">unwritten</span>{{/isUnwritten}}{{^isUnwritten}}{{{descriptionHtml}}}{{/isUnwritten}}</div></div></div>{{/highlights}}</div></div>{{/corrections}}{{/hasCorrections}}{{#hasParked}}<div style="border:1px solid var(--ink-15);border-radius:var(--r-corner);background:var(--bg);padding:14px 16px;margin-bottom:26px"><div style="display:flex;align-items:baseline;gap:10px;margin-bottom:10px"><h2 style="font-family:var(--f-display);font-weight:600;font-size:12px;letter-spacing:.04em;text-transform:uppercase;color:var(--ink-90);margin:0">Parked</h2><span style="font-family:var(--f-mono);font-size:11px;color:var(--ink-50)">{{parkedCount}} item{{^parkedIsSingular}}s{{/parkedIsSingular}} · deliberately not built</span></div><div style="display:grid;grid-template-columns:1fr 1fr;gap:8px 24px">{{#parked}}<div style="display:grid;grid-template-columns:8px 1fr;gap:10px;align-items:baseline;font-family:var(--f-ui);font-size:13px;line-height:1.4;color:var(--ink-60)"><span aria-hidden="true" style="width:8px;height:1px;background:var(--ink-30);align-self:center"></span><span><span style="color:var(--ink-80);font-weight:600">{{title}}</span> — {{reason}}</span></div>{{/parked}}</div></div>{{/hasParked}}</main><footer style="display:grid;grid-template-columns:1fr 1.4fr;gap:24px;padding-top:16px;border-top:1px solid var(--ink-10)">{{#hasCast}}<div><h2 style="font-family:var(--f-mono);font-size:10px;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-50);margin:0 0 8px">Cast</h2><div style="display:flex;flex-direction:column;gap:4px;font-family:var(--f-mono);font-size:11px;color:var(--ink-70)">{{#cast}}<div style="display:flex;justify-content:space-between;gap:12px;max-width:220px"><span>{{name}}</span><span style="color:var(--ink-50);font-variant-numeric:tabular-nums">{{commits}} commit{{^isSingular}}s{{/isSingular}}</span></div>{{/cast}}</div></div>{{/hasCast}}<div><h2 style="font-family:var(--f-mono);font-size:10px;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-50);margin:0 0 8px">Provenance</h2><div style="font-family:var(--f-mono);font-size:11px;line-height:1.7;color:var(--ink-50)">compiled from {{sourcesJoined}}<br/>as of {{compiledAtDate}} · template {{provenance.templateVersion}} · schema {{schemaVersion}} · no runtime scripts</div></div></footer>
13
+ <svg width="0" height="0" style="position:absolute;width:0;height:0" aria-hidden="true" focusable="false"><symbol id="cat-spell" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M8 1.75v3.5M8 10.75v3.5M1.75 8h3.5M10.75 8h3.5M3.6 3.6l2.4 2.4M10 10l2.4 2.4M12.4 3.6 10 6M6 10l-2.4 2.4"></path></symbol><symbol id="cat-feature" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="2.25" y="2.25" width="11.5" height="11.5" rx="1"></rect><path d="M8 5.25v5.5M5.25 8h5.5"></path></symbol><symbol id="cat-governance" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M8 1.75 13.25 3.75v4.2c0 3.05-2.2 5.3-5.25 6.3-3.05-1-5.25-3.25-5.25-6.3v-4.2z"></path></symbol><symbol id="cat-decision" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M8 1.75 14.25 8 8 14.25 1.75 8z"></path></symbol><symbol id="cat-fix" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M8 1.75 13.4 4.9v6.2L8 14.25 2.6 11.1V4.9z"></path><circle cx="8" cy="8" r="2.25"></circle></symbol><symbol id="cat-process" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M13 8a5 5 0 0 1-8.65 3.45M3 8a5 5 0 0 1 8.65-3.45"></path><path d="M11.65 2.15v2.4h-2.4M4.35 13.85v-2.4h2.4"></path></symbol><symbol id="cat-docs" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3.75 1.75h5.75l2.75 2.75v9.75h-8.5z"></path><path d="M9.5 1.75v3h3M6 8h4M6 10.75h4"></path></symbol><symbol id="cat-platform" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="2.25" y="2.25" width="11.5" height="3.75" rx=".75"></rect><rect x="2.25" y="8.25" width="11.5" height="3.75" rx=".75"></rect><path d="M4.75 4.1h.01M4.75 10.1h.01"></path><path d="M8 12v2.25"></path></symbol></svg><main><fieldset id="arcane-report-theme-toggle-wrap" role="radiogroup" style="display:flex;justify-content:flex-end;gap:4px;margin-bottom:8px;border:0;padding:0"><legend style="position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0">Report color theme</legend><input type="radio" id="arcane-report-theme-auto" style="position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0" name="arcane-report-theme" checked="" value="auto"/><label for="arcane-report-theme-auto" style="font-family:var(--f-mono);font-size:10px;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-50);background:var(--bg-1);border:1px solid var(--ink-15);border-radius:var(--r-corner);padding:6px 10px;cursor:pointer">Auto</label><input type="radio" id="arcane-report-theme-light" style="position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0" name="arcane-report-theme" value="light"/><label for="arcane-report-theme-light" style="font-family:var(--f-mono);font-size:10px;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-50);background:var(--bg-1);border:1px solid var(--ink-15);border-radius:var(--r-corner);padding:6px 10px;cursor:pointer">Light</label><input type="radio" id="arcane-report-theme-dark" style="position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0" name="arcane-report-theme" value="dark"/><label for="arcane-report-theme-dark" style="font-family:var(--f-mono);font-size:10px;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-50);background:var(--bg-1);border:1px solid var(--ink-15);border-radius:var(--r-corner);padding:6px 10px;cursor:pointer">Dark</label></fieldset><div><div style="display:flex;align-items:baseline;gap:12px;margin-bottom:16px"><span style="font-family:var(--f-mono);font-size:10px;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-50)">{{masthead.eyebrow}}</span><span aria-hidden="true" style="flex-grow:1;height:1px;background:var(--ink-10)"></span><span style="font-family:var(--f-mono);font-size:10px;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-50)">{{program.slug}}</span></div><h1 style="font-family:var(--f-display);font-weight:600;font-size:30px;line-height:1.15;letter-spacing:.04em;text-transform:uppercase;color:var(--ink-90);margin:0 0 10px;max-width:24ch">{{masthead.title}}</h1><p style="font-family:var(--f-ui);font-size:15px;color:var(--ink-60);margin:0 0 14px;max-width:62ch">{{masthead.dek}}</p><div style="display:flex;flex-wrap:wrap;gap:6px 18px;font-family:var(--f-mono);font-size:11px;color:var(--ink-70);margin-bottom:26px"><span><span style="color:var(--ink-50)">status</span> <span style="color:var(--signal-ok)">{{program.status}}</span></span><span><span style="color:var(--ink-50)">started</span> {{program.started}}</span><span><span style="color:var(--ink-50)">completed</span> {{program.completed}}</span><span><span style="color:var(--ink-50)">baseline</span> {{program.baseline}}</span></div></div><div style="margin-bottom:20px"><dl style="display:grid;grid-auto-flow:column;grid-auto-columns:minmax(0, 1fr);gap:1px;background:var(--ink-10);border:1px solid var(--ink-30);border-radius:var(--r-corner);margin:0">{{#stats}}<div style="background:var(--bg);display:flex;flex-direction:column-reverse"><dt style="margin:4px 16px 14px;font-family:var(--f-display);font-size:10px;letter-spacing:.18em;text-transform:uppercase;color:var(--ink-60)">{{label}}</dt><dd style="margin:0"><div class="arc-stat-tile arc-stat-tile--sm" style="padding:14px 16px;padding-bottom:0"><div class="arc-num" style="font-size:26px;font-weight:700;line-height:1;color:var(--ink-100);font-variant-numeric:tabular-nums;letter-spacing:-.01em">{{value}}</div></div></dd></div>{{/stats}}</dl></div><div style="display:flex;gap:12px;align-items:stretch;margin-bottom:26px"><div style="flex-grow:1"><div style="margin-bottom:26px">{{#needsYouCount}}<div style="display:flex;align-items:baseline;gap:10px;margin-bottom:8px"><h2 style="font-family:var(--f-display);font-weight:600;font-size:12px;letter-spacing:.04em;text-transform:uppercase;color:var(--ink-90);margin:0">Needs you</h2><span style="font-family:var(--f-mono);font-size:11px;color:var(--ink-50)">{{needsYouCount}} open</span></div><ul style="list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px">{{#needsYou}}<li style="border:1px solid var(--ink-15);border-left:2px solid var(--signal-warn);border-radius:var(--r-corner);background:var(--bg-1);padding:12px 16px">{{#href}}<a href="{{href}}" style="color:var(--accent)">{{title}}</a>{{/href}}{{^href}}<span style="color:var(--ink-90)">{{title}}</span>{{/href}}</li>{{/needsYou}}</ul>{{/needsYouCount}}{{^needsYouCount}}<div style="border:1px solid var(--ink-15);border-left:2px solid var(--signal-ok);border-radius:var(--r-corner);background:var(--bg-1);padding:12px 16px;display:flex;align-items:center;gap:10px"><span aria-hidden="true" style="display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--signal-ok)"></span><span style="font-family:var(--f-display);font-size:13px;letter-spacing:.04em;text-transform:uppercase;color:var(--signal-ok)">Nothing needs you</span></div>{{/needsYouCount}}</div></div>{{#hasOutcome}}<div style="border:1px solid var(--ink-15);border-radius:var(--r-corner);background:var(--bg-1);padding:12px 16px;display:flex;align-items:center;font-family:var(--f-mono);font-size:11px;color:var(--ink-70)">{{outcome}}</div>{{/hasOutcome}}</div><div style="display:flex;flex-wrap:wrap;gap:8px 16px;padding:12px 0;border-top:1px solid var(--ink-10);border-bottom:1px solid var(--ink-10);margin-bottom:26px">{{#legend}}<span style="display:inline-flex;align-items:center;gap:6px;font-family:var(--f-mono);font-size:10px;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-50)"><span style="color:var(--cat-{{key}})"><svg width="12" height="12" aria-hidden="true" focusable="false"><use href="#cat-{{key}}"></use></svg></span>{{label}}</span>{{/legend}}</div>{{#sections}}<div style="border:1px solid var(--ink-30);border-radius:var(--r-corner);background:var(--bg);margin-bottom:18px"><div style="display:flex;align-items:center;gap:10px;padding:9px 14px;border-bottom:1px solid var(--ink-10);background:var(--bg-1)"><h2 style="font-family:var(--f-display);font-weight:600;font-size:12px;letter-spacing:.04em;text-transform:uppercase;color:var(--ink-90);margin:0">{{title}}</h2><span style="flex-grow:1"></span><span style="font-family:var(--f-mono);font-size:10px;color:var(--ink-50)">{{rowCount}}</span></div><ol style="list-style:none;margin:0;padding:0">{{#rows}}<li style="border-bottom:1px solid var(--ink-10)"><div style="display:grid;grid-template-columns:68px 1fr 128px;gap:14px;padding:13px 14px;align-items:start">{{#hasHref}}<a href="{{href}}" style="font-family:var(--f-mono);font-size:11px;color:var(--accent)">{{id}}</a>{{/hasHref}}{{^hasHref}}<span style="font-family:var(--f-mono);font-size:11px;color:var(--ink-50)">{{id}}</span>{{/hasHref}}<div><div style="font-family:var(--f-display);font-weight:600;font-size:13px;letter-spacing:.03em;text-transform:uppercase;color:var(--ink-90);margin-bottom:4px">{{title}}</div><div style="font-family:var(--f-ui);font-size:14px;line-height:1.45;color:var(--ink-60);font-style:normal;max-width:58ch">{{#isUnwritten}}<span class="unwritten">unwritten</span>{{/isUnwritten}}{{^isUnwritten}}{{{descriptionHtml}}}{{/isUnwritten}}</div></div><span class="arc-pill" style="color:var(--cat-{{category}});border-color:color-mix(in srgb, var(--cat-{{category}}) 50%, transparent);justify-self:end"><svg width="12" height="12" aria-hidden="true" focusable="false"><use href="#cat-{{category}}"></use></svg>{{categoryLabel}}</span></div></li>{{/rows}}</ol></div>{{/sections}}{{#hasCorrections}}{{#corrections}}<div style="border:1px solid var(--ink-15);border-radius:var(--r-corner);background:var(--bg-1);padding:14px 16px;margin-bottom:18px"><div style="display:flex;align-items:baseline;gap:10px;margin-bottom:8px"><h2 style="font-family:var(--f-display);font-weight:600;font-size:12px;letter-spacing:.04em;text-transform:uppercase;color:var(--ink-90);margin:0">Calibration</h2><span style="font-family:var(--f-mono);font-size:11px;color:var(--ink-50)">{{checked}} checked · {{corrected}} corrected · {{unverifiable}} unverifiable</span></div><div style="font-family:var(--f-ui);font-size:14px;line-height:1.45;color:var(--ink-60);max-width:62ch;margin-bottom:12px">{{scopeNote}}</div><div style="display:flex;flex-direction:column;gap:10px;border-top:1px solid var(--ink-10);padding-top:12px">{{#highlights}}<div style="display:grid;grid-template-columns:84px 1fr;gap:12px;align-items:baseline"><span style="font-family:var(--f-mono);font-size:10px;letter-spacing:.1em;text-transform:uppercase;color:var(--signal-warn)">{{categoryLabel}}</span><div><div style="font-family:var(--f-display);font-weight:600;font-size:12px;letter-spacing:.02em;color:var(--ink-90);margin-bottom:3px">{{title}}</div><div style="font-family:var(--f-ui);font-size:14px;line-height:1.45;color:var(--ink-60);font-style:normal;max-width:62ch">{{#isUnwritten}}<span class="unwritten">unwritten</span>{{/isUnwritten}}{{^isUnwritten}}{{{descriptionHtml}}}{{/isUnwritten}}</div></div></div>{{/highlights}}</div></div>{{/corrections}}{{/hasCorrections}}{{#hasParked}}<div style="border:1px solid var(--ink-15);border-radius:var(--r-corner);background:var(--bg);padding:14px 16px;margin-bottom:26px"><div style="display:flex;align-items:baseline;gap:10px;margin-bottom:10px"><h2 style="font-family:var(--f-display);font-weight:600;font-size:12px;letter-spacing:.04em;text-transform:uppercase;color:var(--ink-90);margin:0">Parked</h2><span style="font-family:var(--f-mono);font-size:11px;color:var(--ink-50)">{{parkedCount}} item{{^parkedIsSingular}}s{{/parkedIsSingular}} · deliberately not built</span></div><div style="display:grid;grid-template-columns:1fr 1fr;gap:8px 24px">{{#parked}}<div style="display:grid;grid-template-columns:8px 1fr;gap:10px;align-items:baseline;font-family:var(--f-ui);font-size:13px;line-height:1.4;color:var(--ink-60)"><span aria-hidden="true" style="width:8px;height:1px;background:var(--ink-30);align-self:center"></span><span><span style="color:var(--ink-80);font-weight:600">{{title}}</span> — {{reason}}</span></div>{{/parked}}</div></div>{{/hasParked}}</main><footer style="display:grid;grid-template-columns:1fr 1.4fr;gap:24px;padding-top:16px;border-top:1px solid var(--ink-10)">{{#hasCast}}<div><h2 style="font-family:var(--f-mono);font-size:10px;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-50);margin:0 0 8px">Cast</h2><div style="display:flex;flex-direction:column;gap:4px;font-family:var(--f-mono);font-size:11px;color:var(--ink-70)">{{#cast}}<div style="display:flex;justify-content:space-between;gap:12px;max-width:220px"><span>{{name}}</span><span style="color:var(--ink-50);font-variant-numeric:tabular-nums">{{commits}} commit{{^isSingular}}s{{/isSingular}}</span></div>{{/cast}}</div></div>{{/hasCast}}<div><h2 style="font-family:var(--f-mono);font-size:10px;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-50);margin:0 0 8px">Provenance</h2><div style="font-family:var(--f-mono);font-size:11px;line-height:1.7;color:var(--ink-50)">compiled from {{sourcesJoined}}<br/>as of {{compiledAtDate}} · template {{provenance.templateVersion}} · schema {{schemaVersion}} · no runtime scripts</div></div></footer>
14
14
  </body>
15
15
  </html>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "arcane-cli",
3
- "version": "1.7.0",
3
+ "version": "1.8.1",
4
4
  "description": "Arcane framework CLI — scaffold and manage governance files in consuming repositories",
5
5
  "keywords": [
6
6
  "arcane",