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.
- 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/.github/prompts/spell-address-review.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/package.json +1 -1
|
@@ -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
|
|
|
@@ -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: [
|
|
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.
|