arcane-cli 0.29.0 → 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.
@@ -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
 
@@ -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.
@@ -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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "arcane-cli",
3
- "version": "0.29.0",
3
+ "version": "0.29.1",
4
4
  "description": "Arcane framework CLI — scaffold and manage governance files in consuming repositories",
5
5
  "keywords": [
6
6
  "arcane",