arcane-cli 0.28.1 โ†’ 0.29.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -120,10 +120,10 @@ Arcane isn't a prompt snippet โ€” it's a full framework. Everything installs int
120
120
 
121
121
  <!-- arcane:start -->
122
122
  <details>
123
- <summary><b>๐Ÿ“œ The full spell catalogue (40)</b></summary>
123
+ <summary><b>๐Ÿ“œ The full spell catalogue (41)</b></summary>
124
124
 
125
125
  **Session** โ€” `open-session` ยท `close-session` ยท `commit-work` ยท `status` ยท `arcane-version`
126
- **Capture** โ€” `save-idea` ยท `todo` ยท `feedback` ยท `suggest-feature` ยท `document` ยท `brainstorm` ยท `explain-concept`
126
+ **Capture** โ€” `save-idea` ยท `todo` ยท `feedback` ยท `suggest-feature` ยท `document` ยท `verification-ledger` ยท `brainstorm` ยท `explain-concept`
127
127
  **Delivery** โ€” `create-pull-request` ยท `sync-pull-request` ยท `address-review`
128
128
  **Review** โ€” `review` ยท `review-batch`
129
129
  **Planning** โ€” `plan` ยท `architect` ยท `scope` ยท `product-review`
@@ -638,19 +638,25 @@ New agents are registered during onboarding.
638
638
 
639
639
  Agent-authored commits MUST include trailers in the commit message footer. Human commits MAY include them.
640
640
 
641
- | Trailer | Required | Example |
642
- | -------------- | ----------- | -------------------------------------- |
643
- | `Agent` | Yes | `kellar`, `copilot`, `claude` |
644
- | `Model` | Yes | `claude-opus-4-20250918`, `gpt-4o` |
645
- | `Provider` | Yes | `anthropic`, `openai` |
646
- | `Role` | Recommended | `product-ops`, `developer`, `cto` |
647
- | `Task-Type` | Optional | `docs`, `code`, `review`, `marketing` |
648
- | `Approval` | Optional | `interactive`, `batch`, `post-review` |
649
- | `Channel` | Optional | `chat`, `cli`, `editor` |
650
- | `Risk-Class` | Optional | `low`, `medium`, `high` |
651
- | `Request-ID` | Optional | `req-001` |
652
- | `Session` | Optional | `session-01` |
653
- | `Rollback-Ref` | Optional | path or commit to the pre-change state |
641
+ **`Agent` is the runtime/tool only โ€” never a persona name.** The prior single-field model let `kellar` (a persona) and `copilot`/`claude` (runtimes) sit in the same field's example list, which is exactly the conflation this split removes. `Persona` and `Role` are conditional on a roster (`.arcane/agents.yaml`) existing and one having been assigned โ€” omit both, do not guess, when no roster exists or none was assigned this session (this repo's own root has no roster today; the "Solo-Operator Delegation Records (No Roster)" pattern in [[agent-policies#solo-operator-delegation-records-no-roster|agent-policies.md]] is the same "mechanism doesn't apply, degrade gracefully" shape applied to delegation instead of attribution).
642
+
643
+ | Trailer | Required | Example | Notes |
644
+ | -------------- | ----------- | -------------------------------------- | ----- |
645
+ | `Agent` | Yes | `claude`, `copilot`, `codex` | The runtime that executed โ€” always resolvable from the tool itself. |
646
+ | `Persona` | Conditional | `kellar`, `merlin` | The roster identity operated as. Present only when a roster exists and one was assigned; omit entirely otherwise โ€” never guess. |
647
+ | `Role` | Conditional | `CTO / Architecture Lead` | Derived **only** from `Persona`'s roster entry (`AgentDefinition.role`, reached via the roster entry's `definition` pointer โ€” see `agent-loader.ts`), never typed by hand. Present only when `Persona` is present; a `Role` value not sourced from the actual roster file is a defect, not a stylistic choice โ€” see the grading-probe example below. |
648
+ | `Model` | Yes | `claude-opus-4-20250918`, `gpt-4o` | Self-reported by the runtime. |
649
+ | `Model-Source` | Yes | `self-reported` | Marks that `Model` (and `Agent`) is self-reported, not independently verified โ€” currently the only defined value. Exists because a fabricated `Model`/author trailer once survived eight PRs and human review undetected; the field makes that limitation visible instead of silently trusted. |
650
+ | `Provider` | Yes | `anthropic`, `openai` | |
651
+ | `Task-Type` | Optional | `docs`, `code`, `review`, `marketing` | |
652
+ | `Approval` | Optional | `interactive`, `batch`, `post-review` | |
653
+ | `Channel` | Optional | `chat`, `cli`, `editor` | |
654
+ | `Risk-Class` | Optional | `low`, `medium`, `high` | |
655
+ | `Request-ID` | Optional | `req-001` | |
656
+ | `Session` | Optional | `session-01` | |
657
+ | `Rollback-Ref` | Optional | path or commit to the pre-change state | |
658
+
659
+ **Grading probe for whether a session actually inherited this rule** (not a hypothetical โ€” this exact question surfaced a real gap before this split existed): *"What does `Role: developer` in a commit trailer resolve from?"* The wrong answer is "the agent roster" stated with confidence. The correct behavior is to check โ€” read `.arcane/agents.yaml` if it exists, resolve the acting persona's `AgentDefinition.role` โ€” and if no roster exists or the value can't be traced to a real entry, omit the `Role` trailer rather than typing a plausible-sounding guess.
654
660
 
655
661
  ### Vendored Framework Trailers
656
662
 
@@ -665,14 +671,30 @@ Never type or infer `Vendor-Version`. If the installed CLI cannot be resolved pr
665
671
 
666
672
  ### Complete Examples
667
673
 
668
- **Agent-authored commit ({AGENT_NAME}):**
674
+ **Agent-authored commit, with an assigned roster persona ({AGENT_NAME}):**
669
675
 
670
676
  ```bash
671
677
  git commit --author="{AGENT_NAME} <{AGENT_EMAIL}>" \
672
- --trailer="Agent=kellar" \
678
+ --trailer="Agent=claude" \
679
+ --trailer="Persona=kellar" \
680
+ --trailer="Role=Product Operations Manager" \
673
681
  --trailer="Model=<model-id>" \
682
+ --trailer="Model-Source=self-reported" \
683
+ --trailer="Provider=<provider>" \
684
+ --trailer="Channel=chat" \
685
+ -m "feat(inventory): generate initial product catalog
686
+
687
+ Created 47 SKUs from the inventory spreadsheet."
688
+ ```
689
+
690
+ **Agent-authored commit, no roster installed (this repo's own current state):**
691
+
692
+ ```bash
693
+ git commit --author="{AGENT_NAME} <{AGENT_EMAIL}>" \
694
+ --trailer="Agent=claude" \
695
+ --trailer="Model=<model-id>" \
696
+ --trailer="Model-Source=self-reported" \
674
697
  --trailer="Provider=<provider>" \
675
- --trailer="Role=product-ops" \
676
698
  --trailer="Channel=chat" \
677
699
  -m "feat(inventory): generate initial product catalog
678
700
 
@@ -685,6 +707,7 @@ Created 47 SKUs from the inventory spreadsheet."
685
707
  git commit --author="Copilot <copilot@{OPERATOR_DOMAIN}>" \
686
708
  --trailer="Agent=copilot" \
687
709
  --trailer="Model=<model-id>" \
710
+ --trailer="Model-Source=self-reported" \
688
711
  --trailer="Provider=<provider>" \
689
712
  --trailer="Channel=editor" \
690
713
  -m "docs(governance): add attribution model to git conventions"
@@ -709,10 +732,14 @@ git log --author="@{OPERATOR_DOMAIN}" --oneline
709
732
  git log --author="{OPERATOR_EMAIL}" --oneline
710
733
 
711
734
  # Extract trailers
712
- git log -10 --format='%H %s%n%(trailers:key=Agent,key=Model,key=Provider)%n'
735
+ git log -10 --format='%H %s%n%(trailers:key=Agent,key=Persona,key=Model,key=Provider)%n'
713
736
 
714
- # Count commits per agent
737
+ # Count commits per runtime/tool (Agent) -- coarse, always populated
715
738
  git log --all --format='%(trailers:key=Agent,valueonly)' | sort | uniq -c | sort -rn
739
+
740
+ # Count commits per persona -- the finer-grained count the old single-Agent-field
741
+ # query used to produce; empty where no roster was ever assigned
742
+ git log --all --format='%(trailers:key=Persona,valueonly)' | sort | uniq -c | sort -rn
716
743
  ```
717
744
 
718
745
  ---
@@ -126,7 +126,8 @@ For each agent assigned to this business:
126
126
  4. **Verify** you can commit with the agent's author:
127
127
  ```bash
128
128
  git commit --allow-empty --author="{AGENT_NAME} <{AGENT_EMAIL}>" \
129
- --trailer="Agent=kellar" --trailer="Model=test" --trailer="Provider=test" \
129
+ --trailer="Agent=claude" --trailer="Persona={AGENT_NAME}" --trailer="Model=test" \
130
+ --trailer="Model-Source=test" --trailer="Provider=test" \
130
131
  -m "test: verify agent git identity for {AGENT_NAME}"
131
132
  git log -1 # confirm author shows {AGENT_NAME}
132
133
  git reset HEAD~1 # clean up test commit
@@ -45,7 +45,7 @@ See also: [[README]], [[DECISIONS]], [[governance/git-conventions|Git Convention
45
45
 
46
46
  11. **Use Conventional Commits format** for all commit messages: `type(scope): description`. See [[governance/git-conventions|Git Conventions]] for types, scopes, and examples.
47
47
 
48
- 12. **Agent attribution trailers** are required on agent-authored commits (`Agent`, `Model`, `Provider`). See [[governance/git-conventions#agent-attribution-model|Attribution Model]].
48
+ 12. **Agent attribution trailers** are required on agent-authored commits (`Agent`, `Model`, `Model-Source`, `Provider`). `Persona`/`Role` are conditional โ€” present only when a roster exists and one was assigned, never guessed. See [[governance/git-conventions#agent-attribution-model|Attribution Model]].
49
49
 
50
50
  13. **For runtime config changes** (anything touching the agent runtime's config files or service restarts): do NOT commit supporting docs until the user has confirmed the change is working. Stage and present โ€” but wait for explicit approval after testing.
51
51
 
@@ -0,0 +1,13 @@
1
+ ---
2
+ description: Use PROACTIVELY when a session had real verification events worth a structured record โ€” especially a claim that didn't survive a check.
3
+ ---
4
+
5
+ # Verification Ledger
6
+
7
+ Invoke the Arcane `spell-verification-ledger` spell workflow.
8
+
9
+ See the full prompt at `.github/prompts/spell-verification-ledger.prompt.md` for the complete workflow definition.
10
+
11
+ ---
12
+
13
+ @.github/prompts/spell-verification-ledger.prompt.md
@@ -81,7 +81,7 @@ Show a table (`# | category | disposition | author | file:line | summary | plann
81
81
 
82
82
  ## Step 5 โ€” Execute
83
83
 
84
- Commits in this spell follow `.arcane/governance/git-conventions.md`: Conventional Commits format, agent attribution (`--author` + required `Agent`/`Model`/`Provider` trailers) when an agent authors the change, and โ€” because this is an **interactive session** โ€” present each proposed commit message and **wait for the human's approval before committing** (the Step 4 plan approval covers *what* to do, not the commit itself). Never squash.
84
+ Commits in this spell follow `.arcane/governance/git-conventions.md`: Conventional Commits format, agent attribution (`--author` + required `Agent`/`Model`/`Model-Source`/`Provider` trailers, plus `Persona`/`Role` when a roster exists and one was assigned) when an agent authors the change, and โ€” because this is an **interactive session** โ€” present each proposed commit message and **wait for the human's approval before committing** (the Step 4 plan approval covers *what* to do, not the commit itself). Never squash.
85
85
 
86
86
  For **must-fix** (one thread at a time): read the code โ†’ implement โ†’ run the relevant tests.
87
87
  - **If tests pass:** commit (e.g. `fix(scope): address review โ€” <desc>`) โ†’ reply `Fixed in <hash>. <what changed>` (cite the `R#` finding ID if one exists) โ†’ resolve the thread immediately.
@@ -31,7 +31,7 @@ Workflow:
31
31
  - Decisions made (even implicit ones like naming choices, tool preferences, or workflow patterns).
32
32
  - Problems encountered and how they were resolved (troubleshooting).
33
33
  - Lessons learned (anything that cost time, surprised the user, or should prevent future mistakes).
34
- - **Capture tie-in tip:** If this session produced durable analysis worth formalizing (a design, an investigation, a research finding, a reusable explanation), suggest running `spell-document` before closing so it lands in the right doc โ€” a research finding defaults to `docs/research/<topic-slug>.md` per `portable-bootstrap.md`'s Research Reports convention. For quick ideas worth keeping but not yet actionable, suggest `spell-save-idea`.
34
+ - **Capture tie-in tip:** If this session produced durable analysis worth formalizing (a design, an investigation, a research finding, a reusable explanation), suggest running `spell-document` before closing so it lands in the right doc โ€” a research finding defaults to `docs/research/<topic-slug>.md` per `portable-bootstrap.md`'s Research Reports convention. For quick ideas worth keeping but not yet actionable, suggest `spell-save-idea`. If this session had a real verification event worth a structured record โ€” especially a confidently stated claim that a check later contradicted โ€” suggest `spell-verification-ledger` separately; it is not part of this close-session flow itself.
35
35
 
36
36
  1b. **Verify in-flight async work before writing any output artifact (EF-21). Enforcement: structured spell gate (ARC-023) โ€” this workflow requires the observable state of every dispatched item before proceeding to step 2.** "I started it" is not "it worked." Before the journal, TODO.md, or the handoff are written, enumerate every piece of asynchronous work dispatched during this session that could still be running or could have failed after being kicked off โ€” CI/CD runs, deployments, package publishes, long-running background tasks, PR checks. For each, **actively check** its current status through whatever means is available (CI provider API/CLI, deployment dashboard, `gh run view`, `az pipelines runs show`, etc.) โ€” attempt the check before reaching for `unverifiable`; that state exists for genuine access limits (no CLI/API access, no credentials, provider outage), not for skipping a check that was merely inconvenient to run. Then classify into exactly one state:
37
37
 
@@ -116,12 +116,14 @@ Workflow:
116
116
  - References to ADRs or files
117
117
  - Context for why]
118
118
 
119
- Agent: [lowercase-persona or tool name]
119
+ Agent: [runtime/tool name only -- claude, copilot, codex -- never a persona name]
120
+ Persona: [roster identity operated as, ONLY if a roster exists (.arcane/agents.yaml) and one was assigned this session -- omit entirely otherwise, never guess]
121
+ Role: [Persona's own AgentDefinition.role value, resolved from the roster -- never typed by hand. Present only if Persona is present]
120
122
  Model: [model identifier, e.g., claude-opus-4-20250918]
123
+ Model-Source: [self-reported -- currently the only defined value; marks Model/Agent as self-reported, not independently verified]
121
124
  Provider: [anthropic or openai]
122
125
  Vendor: [arcane-cli, for vendored scaffold/update commits]
123
126
  Vendor-Version: [programmatically derived installed package version, when available]
124
- Role: [agent role slug, if applicable]
125
127
  Task-Type: [docs, code, review, marketing, infra]
126
128
  Channel: [vscode, cli, chat]
127
129
  ```
@@ -132,7 +134,7 @@ Workflow:
132
134
  - Body is optional but useful for complex changes
133
135
  - Reference ADRs if applicable (e.g., "Implements ADR-028")
134
136
  - Trailers go after a blank line following the body (standard Git footer position)
135
- - Required trailers for agent commits: `Agent`, `Model`, `Provider`
137
+ - Required trailers for agent commits: `Agent`, `Model`, `Model-Source`, `Provider`. `Persona`/`Role` are conditional -- see `.arcane/governance/git-conventions.md`'s Agent Attribution Model for the full rule and the grading-probe example of what happens when `Role` is guessed instead of sourced.
136
138
  - Required trailer for Arcane-vendored commits: `Vendor: arcane-cli`; include `Vendor-Version` only when derived from the installed CLI at commit time
137
139
  - Human-authored commits: trailers are optional
138
140
 
@@ -122,7 +122,7 @@ Execute the `spell-implement` workflow:
122
122
  b1. **DB migration guard.** If `architecture.md`/the PRD did not name a database migration as part of this feature's scope, but implementing this story is about to produce one anyway, **halt and flag it** โ€” do not write the migration file silently (2026-07-22 dogfooding finding: this is a scoped hard guard, not a blanket ban). If a migration genuinely is in scope, **re-derive its sequence number from a fresh `git pull --ff-only` of the target branch immediately before writing the file** โ€” not once at branch-creation time in step 0 โ€” so a concurrent epic that landed a migration in the meantime is reflected. This is the concrete fix for a real incident: two epics run in parallel worktrees each independently claimed the same migration sequence number, invisible until human merge review.
123
123
  c. Write tests per `governance/testing-standards.md`.
124
124
  d. Run tests. If passing:
125
- - In `external/ado` mode, commit with `#{adoWorkItemId} type(scope): description` and agent attribution trailers (`Agent`, `Model`, `Provider`).
125
+ - In `external/ado` mode, commit with `#{adoWorkItemId} type(scope): description` and agent attribution trailers (`Agent`, `Model`, `Model-Source`, `Provider`).
126
126
  - In `internal` mode, commit with standard Conventional Commits format (no ADO prefix) plus attribution trailers.
127
127
  e. Update `stories.json`: set `passes: true`, fill `testEvidence`.
128
128
  f. Append learnings to `progress.txt`.
@@ -240,7 +240,7 @@ exactly one phase carries it at a time, matching the status line's own `[Phase N
240
240
  - **One human gate only.** Everything before Phase 6 step 5 is autonomous. Do not ask for intermediate approvals unless a gate fails.
241
241
  - **No scope creep.** Only build what the feature description specifies.
242
242
  - **Fail fast.** If a phase cannot succeed, halt immediately rather than producing garbage for downstream phases.
243
- - **Attribution required.** Every commit must carry `Agent`, `Model`, and `Provider` trailers per ADR-028/ADR-029.
243
+ - **Attribution required.** Every commit must carry `Agent`, `Model`, `Model-Source`, and `Provider` trailers per ADR-028/ADR-029, plus `Persona`/`Role` when a roster exists and one was assigned.
244
244
  - **Branch discipline.** All work on topic branches, never on main โ€” see `.arcane/governance/git-conventions.md`'s Trunk-based development rule. (Corrected 2026-08-31, BC-14: previously cited "ADR-048," which does exist in the shipped `framework-decisions.md` reference but is actually about the Code-Versus-Docs Branch Policy's local-only-repo fallback, unrelated to this general rule โ€” a topical miscitation, the same class BC-06 found and fixed elsewhere. `git-conventions.md` states this rule directly with no ADR/ARC number attached, so there is nothing to cite beyond the file itself.)
245
245
  - **Fresh context per story.** Do not carry assumptions between stories during Phase 3.
246
246
  - **Epic checkpointing.** When this spell is run as one epic in a multi-epic plan, recommend running `spell-commit-work` before starting the next epic.
@@ -0,0 +1,101 @@
1
+ ---
2
+ name: Spell โ€” Verification Ledger
3
+ description: Extract a structured record of claims that were checked this session and what the check showed โ€” especially the ones that didn't survive. Separate from spell-close-session; run on demand, not every session.
4
+ argument-hint: Optional focus (e.g., "just the corrections", "since the last commit")
5
+ agent: agent
6
+ ---
7
+
8
+ ## Executive Summary
9
+
10
+ - The highest-value output of a working session is often the corrections โ€” claims that were checked and
11
+ did not survive. `spell-close-session` captures what happened and sanitized lessons learned; it does
12
+ not capture what was asserted, what was checked, what the check showed, or what changed as a result.
13
+ This spell extracts exactly that, separately.
14
+ - **Run on demand, not every session.** Most sessions have nothing worth a ledger entry; this spell says
15
+ so plainly and stops rather than manufacturing content to fill one (same discipline as
16
+ `spell-document`).
17
+ - **A `corrected` result is the point, not a failure to hide.** A ledger showing three confirmed claims
18
+ and one correction is more valuable than one showing four confirmed claims and nothing else โ€” the
19
+ correction is evidence the verification step actually did something, not theater.
20
+ - Appends to a single running file, [`docs/verification-ledger.md`](../../docs/verification-ledger.md),
21
+ so a calibration rate (how often a checked claim survives) is computable across sessions without
22
+ reading scattered journal entries.
23
+
24
+ ---
25
+
26
+ ## What counts as a ledger-worthy event
27
+
28
+ Only an assertion that was actually **checked against an independent source** counts โ€” not every
29
+ statement made during the session. The check has to have been capable of coming back either way:
30
+
31
+ - A confident claim, followed by a real verification step (a tool call, a live read, re-running
32
+ something, checking a second source), whose result **confirmed** the claim.
33
+ - A confident claim, followed by the same kind of check, whose result **contradicted** it โ€”
34
+ a **correction**.
35
+ - A check that was attempted but couldn't produce a definitive answer (no access, an ambiguous result)
36
+ โ€” **unverifiable**. Distinct from never having been checked at all, which isn't ledger-worthy at all.
37
+
38
+ Not ledger-worthy: a claim nobody checked, a preference or judgment call with no verifiable fact behind
39
+ it, or a check whose outcome was never in doubt (confirming something already directly observed moments
40
+ earlier is not a verification event).
41
+
42
+ ## Workflow
43
+
44
+ 1. **Scan the session for ledger-worthy events**, per the definition above. Look specifically for
45
+ moments where a check contradicted an initial assertion โ€” a count that was off, a file path that
46
+ didn't exist, a "should be done" that direct inspection showed wasn't, a citation that pointed at the
47
+ wrong content. These are usually more memorable than confirmations; do not let them get lost among
48
+ routine, expected-to-pass checks.
49
+
50
+ 2. **Stop here if nothing qualifies.** If the session had no real verification events โ€” no claim was
51
+ both asserted with confidence and independently checked โ€” say so plainly and do not proceed. A quiet,
52
+ uneventful session with nothing to report is a valid outcome, not a gap to paper over.
53
+
54
+ 3. **Classify each event:**
55
+
56
+ | Field | What it captures |
57
+ | --- | --- |
58
+ | Claim | The assertion as originally stated, in the speaker's own words at the time โ€” not softened in hindsight. |
59
+ | Verification method | What was actually done to check it (a specific command, a specific file read, a specific re-fetch) โ€” not "verified," which asserts nothing checkable itself. |
60
+ | Result | `confirmed` / `corrected` / `unverifiable`. |
61
+ | Correction | For `corrected` only: what the check actually showed, and what changed as a result (a claim retracted, a decision reversed, a fix applied). |
62
+
63
+ 4. **Present the extracted ledger for approval** before writing โ€” the same approval gate
64
+ `spell-document` uses, since this is also durable content leaving the conversation:
65
+
66
+ ```text
67
+ ## Verification Ledger Proposal โ€” [session topic]
68
+
69
+ | Claim | Verification method | Result | Correction |
70
+ | --- | --- | --- | --- |
71
+ | ... | ... | confirmed | โ€” |
72
+ | ... | ... | corrected | ... |
73
+
74
+ Approve? (yes / edit / skip)
75
+ ```
76
+
77
+ 5. **Append, don't rewrite.** After approval, append a new `## YYYY-MM-DD โ€” <session topic>` section
78
+ with the approved table to `docs/verification-ledger.md`. Get the real date from the system rather
79
+ than guessing. If the file doesn't exist yet, create it with a short header explaining its purpose
80
+ and schema, then the first section โ€” never insert a section anywhere but the end.
81
+
82
+ ## Rules
83
+
84
+ - Never fabricate a ledger-worthy event to fill a report โ€” an empty result from step 2 is a complete,
85
+ valid run of this spell.
86
+ - Quote the claim as it was actually stated, not a cleaned-up paraphrase that makes the miss look
87
+ smaller (or larger) than it was.
88
+ - Do not editorialize about fault or blame in the ledger itself โ€” the value is the calibration signal
89
+ (how often checks confirm vs. correct), not a record of who was wrong.
90
+ - Do not commit the changes โ€” that is `spell-commit-work`'s job.
91
+
92
+ ## Related
93
+
94
+ - **Complements, does not replace:** `spell-close-session`'s narrative record and sanitized lessons
95
+ learned. Run this spell separately when a session had real verification events worth a structured
96
+ record, not as a mandatory step of every close.
97
+ - `spell-document` โ€” the general-purpose formalization spell this one borrows its
98
+ extract-then-approve-then-write shape from, narrowed to one specific, structured record type.
99
+
100
+ > **Tip:** Run `spell-close-session` afterward to log the session, or `spell-commit-work` to commit the
101
+ > ledger update.
package/dist/index.js CHANGED
@@ -505,6 +505,8 @@ var COMPONENTS = [
505
505
  ".claude/commands/spell-suggest-feature.md",
506
506
  ".github/prompts/spell-document.prompt.md",
507
507
  ".claude/commands/spell-document.md",
508
+ ".github/prompts/spell-verification-ledger.prompt.md",
509
+ ".claude/commands/spell-verification-ledger.md",
508
510
  ".github/prompts/spell-brainstorm.prompt.md",
509
511
  ".claude/commands/spell-brainstorm.md",
510
512
  ".github/prompts/spell-explain-concept.prompt.md",
@@ -4640,7 +4642,10 @@ program.command("unblock-push").description("Lift this repository's push block (
4640
4642
  program.command("doctor").description("Check your environment for Arcane prerequisites").option("--fix", "Automatically create missing session continuity files").action(async (opts) => {
4641
4643
  await runDoctor(process.cwd(), { fix: opts.fix }, ASSETS_DIR);
4642
4644
  });
4643
- program.command("ward").description("Scan the repo for leaked third-party identifiers and trademarks (T18)").option("--terms <terms>", "Comma-separated denylist terms, in addition to the built-in vendor-identifier list").option("--gate", "Exit non-zero if any leak is found (for CI)").action(async (opts) => {
4645
+ program.command("ward").description("Scan the repo for leaked identifiers -- third-party trademarks and the operator's own personal identifiers alike (T18)").option(
4646
+ "--terms <terms>",
4647
+ "Comma-separated denylist terms, in addition to the built-in vendor-identifier list. Seed this from your OWN identity too, not just org/venture names -- usernames, machine names, and personal handles leak the same way a private venture name does (I1)"
4648
+ ).option("--gate", "Exit non-zero if any leak is found (for CI)").action(async (opts) => {
4644
4649
  await runWardCli(process.cwd(), opts);
4645
4650
  });
4646
4651
  var agentsCommand = program.command("agents").description("Manage the portable agent system (init, sync, list)");