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 +2 -2
- package/dist/assets/.arcane/governance/git-conventions.md +45 -18
- package/dist/assets/.arcane/governance/new-business-setup.md +2 -1
- package/dist/assets/.arcane/governance/universal-agent-rules.md +1 -1
- package/dist/assets/.claude/commands/spell-verification-ledger.md +13 -0
- package/dist/assets/.github/prompts/spell-address-review.prompt.md +1 -1
- package/dist/assets/.github/prompts/spell-close-session.prompt.md +1 -1
- package/dist/assets/.github/prompts/spell-commit-work.prompt.md +5 -3
- package/dist/assets/.github/prompts/spell-full-cycle.prompt.md +2 -2
- package/dist/assets/.github/prompts/spell-verification-ledger.prompt.md +101 -0
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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 (
|
|
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
|
-
|
|
642
|
-
|
|
643
|
-
|
|
|
644
|
-
|
|
|
645
|
-
| `
|
|
646
|
-
| `
|
|
647
|
-
| `
|
|
648
|
-
| `
|
|
649
|
-
| `
|
|
650
|
-
| `
|
|
651
|
-
| `
|
|
652
|
-
| `
|
|
653
|
-
| `
|
|
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=
|
|
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
|
|
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=
|
|
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: [
|
|
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
|
|
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)");
|