arcane-cli 0.29.2 → 0.29.4
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/agent-approved-paths.md +10 -10
- package/dist/assets/.arcane/governance/agent-work-queue-model.md +2 -0
- package/dist/assets/.arcane/governance/authentication-strategy.md +13 -0
- package/dist/assets/.arcane/governance/decision-documentation-standard.md +14 -6
- package/dist/assets/.arcane/governance/development-methodology.md +10 -4
- package/dist/assets/.arcane/governance/hardening-checklist.md +2 -0
- package/dist/assets/.arcane/governance/naming-conventions.md +5 -4
- package/dist/assets/.arcane/governance/new-business-setup.md +12 -0
- package/dist/assets/.arcane/governance/poc-management-pattern.md +7 -7
- package/dist/assets/.arcane/governance/portable-bootstrap.md +7 -5
- package/dist/assets/.arcane/governance/product-excellence-standards.md +15 -1
- package/dist/assets/.arcane/governance/rca-process-standard.md +11 -7
- package/dist/assets/.arcane/governance/records-conventions.md +10 -10
- package/dist/assets/.arcane/governance/threat-model.md +6 -6
- package/package.json +1 -1
|
@@ -36,9 +36,9 @@ Define one block per agent. Each agent gets its own isolated workspace root, plu
|
|
|
36
36
|
|
|
37
37
|
**Conventions:**
|
|
38
38
|
|
|
39
|
-
- Each agent operates from its own `workspace-{agent}` root — never a shared tree — so concurrent agents don't collide.
|
|
40
|
-
- Grant the narrowest access that lets the agent do its job (research agents: `Read-only`; builders: `Read/Write`).
|
|
41
|
-
- The operator's primary working tree is never an approved agent path.
|
|
39
|
+
- **Each agent operates from its own `workspace-{agent}` root. Enforcement: explicitly advisory prose (ARC-023) — this describes a convention for the operator's own agent-fleet setup; no check in this repository verifies that any agent actually runs from an isolated workspace root.** — never a shared tree — so concurrent agents don't collide.
|
|
40
|
+
- **Grant the narrowest access that lets the agent do its job. Enforcement: explicitly advisory prose (ARC-023) — which access level counts as "narrowest" for a given agent is a judgment call; no check verifies the grant against actual job scope.** (research agents: `Read-only`; builders: `Read/Write`).
|
|
41
|
+
- **The operator's primary working tree is never an approved agent path. Enforcement: explicitly advisory prose (ARC-023) — no check cross-references this file's approved-path rows against the operator's actual working-tree path to catch a violation.**
|
|
42
42
|
|
|
43
43
|
---
|
|
44
44
|
|
|
@@ -46,15 +46,15 @@ Define one block per agent. Each agent gets its own isolated workspace root, plu
|
|
|
46
46
|
|
|
47
47
|
When a request targets a repo that is expected to be inside an approved root:
|
|
48
48
|
|
|
49
|
-
1. Perform read-only discovery first (list/find/read).
|
|
50
|
-
2. If path exists, continue task without asking for duplicate authorization.
|
|
51
|
-
3. If not found, request the exact path from the operator.
|
|
52
|
-
4. Do not search outside approved roots.
|
|
49
|
+
1. **Perform read-only discovery first. Enforcement: explicitly advisory prose (ARC-023) — the same behavior universal-agent-rules.md rule 20 covers; no check verifies that an agent actually performs read-only discovery before proceeding.** (list/find/read).
|
|
50
|
+
2. **If path exists, continue task without asking for duplicate authorization. Enforcement: explicitly advisory prose (ARC-023) — whether an agent treats prior discovery as sufficient and skips a redundant ask is a judgment call; no check verifies this occurred.**
|
|
51
|
+
3. **If not found, request the exact path from the operator. Enforcement: explicitly advisory prose (ARC-023) — the same "before claiming no access" behavior universal-agent-rules.md rule 20 covers; no check verifies an agent actually asks rather than assuming access is absent.**
|
|
52
|
+
4. **Do not search outside approved roots. Enforcement: explicitly advisory prose (ARC-023) — no check inspects an agent's actual filesystem access to confirm it stayed within approved roots.**
|
|
53
53
|
|
|
54
54
|
---
|
|
55
55
|
|
|
56
56
|
## Change Control
|
|
57
57
|
|
|
58
|
-
- Add/remove paths only through documentation update in this file.
|
|
59
|
-
- Reflect material scope changes in [[agents/agent-policies|agent-policies.md]].
|
|
60
|
-
- If access boundaries meaningfully change risk posture, record an ADR.
|
|
58
|
+
- **Add/remove paths only through documentation update in this file. Enforcement: explicitly advisory prose (ARC-023) — no check cross-references actual agent path grants against this document to catch an undocumented change.**
|
|
59
|
+
- **Reflect material scope changes in [[agents/agent-policies|agent-policies.md]]. Enforcement: explicitly advisory prose (ARC-023) — whether a scope change is "material" enough to require an update, and whether the update happens, both depend on agent judgment; no check cross-validates this file against agent-policies.md.**
|
|
60
|
+
- **If access boundaries meaningfully change risk posture, record an ADR. Enforcement: explicitly advisory prose (ARC-023) — `check:adr-references` verifies that ADR citations elsewhere resolve, not that a change to this file actually triggered a new ADR.**
|
|
@@ -18,6 +18,8 @@ Defines a single markdown-first queue for assigning work across businesses, whil
|
|
|
18
18
|
- Queue rows include execution host and approval gate so autonomy stays explicit.
|
|
19
19
|
- {BUSINESS_NAME} starts first; same structure extends to AcmeStore and other businesses.
|
|
20
20
|
|
|
21
|
+
**This document specifies a queue design that has not been implemented anywhere in this codebase — no queue instance exists yet, and this document's own frontmatter is still `status: draft` (see the `## Next Action` section below). Enforcement: explicitly advisory prose (ARC-023) — every principle, field, and rollout step that follows is advisory guidance only, since no code, spell, or platform check exists yet to enforce any of it.**
|
|
22
|
+
|
|
21
23
|
---
|
|
22
24
|
|
|
23
25
|
## Queue Principles
|
|
@@ -24,16 +24,19 @@ This document provides rationale for authentication decisions across an agent ru
|
|
|
24
24
|
- Bearer tokens (PATs, API keys) can be replayed if intercepted once
|
|
25
25
|
- Prefer challenge/response authentication (SSH, OAuth) when available
|
|
26
26
|
- When bearer tokens are required, store them as environment variables via a secret-reference pattern
|
|
27
|
+
- **Enforcement: explicitly advisory prose (ARC-023) — these two practices govern a downstream operator's own authentication mechanism and secret storage; no code or spell in this repository observes which mechanism or pattern is actually used.**
|
|
27
28
|
|
|
28
29
|
**2. Credential Isolation**
|
|
29
30
|
- Each service/agent uses separate credentials with minimal required scope
|
|
30
31
|
- Credentials stored outside version control (`.env`, system keychains, secret managers)
|
|
31
32
|
- Rotation/revocation must be straightforward without config file changes
|
|
33
|
+
- **Enforcement: explicitly advisory prose (ARC-023) — credential scoping, storage location, and rotation ease are properties of a downstream operator's own credential stores; no script in this repository inspects a consumer's `.env` files, keychains, or secret managers.**
|
|
32
34
|
|
|
33
35
|
**3. Defense in Depth**
|
|
34
36
|
- Authentication is one layer; combine with network isolation (loopback bind, VPN/tunnel)
|
|
35
37
|
- Audit logging for all credential operations
|
|
36
38
|
- Regular review of active credentials and permissions
|
|
39
|
+
- **Enforcement: explicitly advisory prose (ARC-023) — network isolation, audit logging, and credential review are carried out entirely in the operator's own infrastructure; this repository ships no gateway, log pipeline, or scheduled check that observes them.**
|
|
37
40
|
|
|
38
41
|
## Authentication Contexts
|
|
39
42
|
|
|
@@ -47,6 +50,8 @@ This document provides rationale for authentication decisions across an agent ru
|
|
|
47
50
|
- Private key remains local at `~/.ssh/id_*` (`600` permissions)
|
|
48
51
|
- Git remote configured to use the SSH URL
|
|
49
52
|
|
|
53
|
+
**Enforcement: explicitly advisory prose (ARC-023) — this decision and its mechanism and implementation-notes steps configure a downstream operator's own Git host account and local filesystem; Arcane ships no code that checks which credential type is registered with the Git host or that verifies key-file permissions.**
|
|
54
|
+
|
|
50
55
|
**Why SSH Over PAT:**
|
|
51
56
|
|
|
52
57
|
1. **Bearer Token Replay Risk**
|
|
@@ -95,6 +100,8 @@ This document provides rationale for authentication decisions across an agent ru
|
|
|
95
100
|
- Store the key as an environment variable (e.g. in a `.env` file)
|
|
96
101
|
- Reference it in config via a secret-reference rather than embedding the value
|
|
97
102
|
|
|
103
|
+
**Enforcement: explicitly advisory prose (ARC-023) — this decision and its mechanism and implementation-notes steps configure a downstream operator's own model-provider account and local secret storage; Arcane ships no code that verifies key scope, storage location, or file permissions.**
|
|
104
|
+
|
|
98
105
|
**Why Scoped Keys Over Personal Keys:**
|
|
99
106
|
|
|
100
107
|
1. **Organizational Boundary**
|
|
@@ -132,6 +139,8 @@ This document provides rationale for authentication decisions across an agent ru
|
|
|
132
139
|
- Reference it from config rather than embedding the literal value
|
|
133
140
|
- Require it in the HTTP header: `Authorization: Bearer <token>`
|
|
134
141
|
|
|
142
|
+
**Enforcement: explicitly advisory prose (ARC-023) — this decision and its mechanism and implementation-notes steps describe a gateway component operated outside this repository; Arcane's own codebase contains no gateway server to bind an address, validate a token, or enforce this header requirement.**
|
|
143
|
+
|
|
135
144
|
**Why Token Auth:**
|
|
136
145
|
|
|
137
146
|
1. **Stateless Authentication**
|
|
@@ -187,6 +196,8 @@ auth = { provider = "token", token = { source = "env", id = "SECRET_NAME" } }
|
|
|
187
196
|
SECRET_NAME=actual-secret-value-here
|
|
188
197
|
```
|
|
189
198
|
|
|
199
|
+
**Enforcement: explicitly advisory prose (ARC-023) — Arcane ships no config-schema validator or lint rule in this repository that checks a downstream repo's config for inline secrets versus this reference pattern; adoption depends on the operator's own discipline.**
|
|
200
|
+
|
|
190
201
|
**Benefits:**
|
|
191
202
|
- Config files are version-controlled without exposing secrets
|
|
192
203
|
- Secrets are rotated by editing the secret store only (no config changes)
|
|
@@ -212,6 +223,8 @@ Regular review (quarterly):
|
|
|
212
223
|
- [ ] Grep the codebase for hardcoded secrets (should find zero matches)
|
|
213
224
|
- [ ] Review the security audit log for any anomalous credential operations
|
|
214
225
|
|
|
226
|
+
**Enforcement: explicitly advisory prose (ARC-023) — this checklist runs on operator judgment and cadence; no scheduled task, spell gate, or CI check in this repository executes or verifies these items.**
|
|
227
|
+
|
|
215
228
|
---
|
|
216
229
|
|
|
217
230
|
## References
|
|
@@ -35,8 +35,8 @@ Arcane separates framework-level decisions from org-specific ones using two pref
|
|
|
35
35
|
|
|
36
36
|
- If the decision would apply to any organization using Arcane, it is `ARC-NNN`.
|
|
37
37
|
- If the decision is specific to how your organization operates, it is `ADR-NNN`.
|
|
38
|
-
- When uncertain, default to `ADR-NNN` in ops; promote to `ARC-NNN` later if the decision proves framework-generic.
|
|
39
|
-
- Never renumber existing entries in either sequence.
|
|
38
|
+
- When uncertain, default to `ADR-NNN` in ops; promote to `ARC-NNN` later if the decision proves framework-generic. **Enforcement: explicitly advisory prose (ARC-023) — whether a decision is framework-generic enough for `ARC-NNN` (this rule and the two prefix-scoping rules above) is a judgment call; no script evaluates a decision's content to confirm the chosen prefix.**
|
|
39
|
+
- Never renumber existing entries in either sequence. **Enforcement: explicitly advisory prose (ARC-023) — `scripts/check-distributed-adr-references.ts` only verifies that a bare `ADR-NNN` citation resolves to a heading declared in `framework-decisions.md` (and separately flags certain `ARC-NNN`/`EF-NNN` link forms as cross-repo hazards); it never checks that numbers are sequential, unique, or never reused.**
|
|
40
40
|
|
|
41
41
|
## Problem Statement
|
|
42
42
|
|
|
@@ -64,7 +64,7 @@ Arcane separates framework-level decisions from org-specific ones using two pref
|
|
|
64
64
|
- Rejected alternatives (2-3 bullets: what was considered but not chosen)
|
|
65
65
|
- **Deep dive link** (if companion doc exists): `[[path/to/detail-doc|Display Text]]`
|
|
66
66
|
|
|
67
|
-
**Keep ADRs under 20 lines** (excluding frontmatter). Longer means detail should move to companion doc.
|
|
67
|
+
**Keep ADRs under 20 lines** (excluding frontmatter). Longer means detail should move to companion doc. **Enforcement: explicitly advisory prose (ARC-023) — no script measures ADR entry length in DECISIONS.md; the Quarterly Review checklist below asks a human to check for long ADRs manually.**
|
|
68
68
|
|
|
69
69
|
**Naming Impact Check:** If the decision introduces, changes, or retires a name (repo, project, product, agent, service), the ADR **must** include a "Naming impact" section that:
|
|
70
70
|
|
|
@@ -72,7 +72,7 @@ Arcane separates framework-level decisions from org-specific ones using two pref
|
|
|
72
72
|
2. Confirms no collision with other entities
|
|
73
73
|
3. Identifies any docs, scripts, or prompts that reference the old name
|
|
74
74
|
|
|
75
|
-
This check was added after [[governance/rcas/RCA-001-naming-collision|RCA-001]] discovered that ADR-061 named a product without checking whether the ops repo already used that name.
|
|
75
|
+
This check was added after [[governance/rcas/RCA-001-naming-collision|RCA-001]] discovered that ADR-061 named a product without checking whether the ops repo already used that name. **Enforcement: explicitly advisory prose (ARC-023) — no script or spell gate verifies that an ADR introducing a new name actually contains a "Naming impact" section or performed its three checks; `spell-scry` can run the grep-and-collision check manually, but nothing requires it before such an ADR is written.**
|
|
76
76
|
|
|
77
77
|
### Tier 2: Companion Detail Docs
|
|
78
78
|
|
|
@@ -243,13 +243,13 @@ Create "Related ADRs" section at the top of every companion doc:
|
|
|
243
243
|
- [[DECISIONS#ADR-NNN|Git SSH Authentication decision]]
|
|
244
244
|
```
|
|
245
245
|
|
|
246
|
-
**Rationale:** Creates bidirectional graph edges in Obsidian visualization. Clicking an ADR shows its authentication strategy companion; the companion links back to each related ADR.
|
|
246
|
+
**Rationale:** Creates bidirectional graph edges in Obsidian visualization. Clicking an ADR shows its authentication strategy companion; the companion links back to each related ADR. **Enforcement: explicitly advisory prose (ARC-023) — no script verifies that a companion doc's "Related ADRs" section reciprocates an ADR's "Deep dive" link, or that every companion doc has one at all; the Anti-Patterns section below lists forgetting this link as a known failure mode with no automated catch.**
|
|
247
247
|
|
|
248
248
|
---
|
|
249
249
|
|
|
250
250
|
## Index-Free Discovery
|
|
251
251
|
|
|
252
|
-
**No DECISIONS-INDEX.md required.** Discovery happens via:
|
|
252
|
+
**No DECISIONS-INDEX.md required. Enforcement: explicitly advisory prose (ARC-023) — nothing prevents creating one, and no script verifies that the four discovery methods below actually surface a given decision.** Discovery happens via:
|
|
253
253
|
|
|
254
254
|
1. **Obsidian Graph View:** Visual clusters show related docs
|
|
255
255
|
2. **Wiki-link navigation:** Click ADR "Deep dive" link → companion doc → "Related ADRs" → back to other ADRs
|
|
@@ -287,6 +287,8 @@ Create "Related ADRs" section at the top of every companion doc:
|
|
|
287
287
|
- If new companion doc needed, create it first, then add "Deep dive" link in ADR
|
|
288
288
|
- If existing companion doc covers it, add new section to that doc + update "Related ADRs" list
|
|
289
289
|
|
|
290
|
+
**Enforcement: explicitly advisory prose (ARC-023) — none of the editorial steps above (bumping `last_updated`, extracting detail past 20 lines, adding or updating "Deep dive"/"Related ADRs" links) is checked by any script; each depends on the editor remembering to do it.**
|
|
291
|
+
|
|
290
292
|
### Quarterly Review
|
|
291
293
|
|
|
292
294
|
Every 3 months:
|
|
@@ -296,6 +298,8 @@ Every 3 months:
|
|
|
296
298
|
- [ ] Verify Obsidian graph shows connected clusters (no isolated decision nodes)
|
|
297
299
|
- [ ] Review "Future Considerations" sections in companion docs — any re-evaluation triggers?
|
|
298
300
|
|
|
301
|
+
**Enforcement: explicitly advisory prose (ARC-023) — this is a manual checklist; no script detects orphaned companion docs, measures ADR length, verifies Obsidian graph connectivity, or reminds anyone to revisit "Future Considerations" sections.**
|
|
302
|
+
|
|
299
303
|
---
|
|
300
304
|
|
|
301
305
|
## Anti-Patterns (Don't Do This)
|
|
@@ -312,6 +316,8 @@ Every 3 months:
|
|
|
312
316
|
|
|
313
317
|
❌ **Putting rationale in journals instead of companion docs** — Journals are chronological session logs (narrative). Companion docs are topic-indexed reference (structured). Rationale goes in companion docs, linked from journals.
|
|
314
318
|
|
|
319
|
+
**Enforcement: explicitly advisory prose (ARC-023) — no lint or script detects any of the six anti-patterns above (a stray `ADR-NNN-deep-dive.md` file, duplicated content, implementation steps in a companion doc, a companion doc for a simple decision, a missing bidirectional link, or rationale left in a journal); catching them depends on the writer's or a reviewer's judgment.**
|
|
320
|
+
|
|
315
321
|
---
|
|
316
322
|
|
|
317
323
|
## Evolution of This Standard
|
|
@@ -324,6 +330,8 @@ Every 3 months:
|
|
|
324
330
|
4. Add entry to DECISIONS.md if decision-making process itself changes
|
|
325
331
|
5. Announce in relevant channels (if the team expands beyond a single operator)
|
|
326
332
|
|
|
333
|
+
**Enforcement: explicitly advisory prose (ARC-023) — no script or spell gate enforces this five-step process when this standard itself changes; it depends on the editor following it by discipline.**
|
|
334
|
+
|
|
327
335
|
**Versioning note:** Per-business decisions follow this pattern — business-only decisions live in `ventures/{name}/DECISIONS.md` (unnumbered or business-prefixed); system/cross-business decisions stay in the root `DECISIONS.md`.
|
|
328
336
|
|
|
329
337
|
---
|
|
@@ -141,9 +141,11 @@ Child linkage rules:
|
|
|
141
141
|
3. If the selected fallback type combination cannot be linked as parent/child in that process template, use `Related` links and prefix titles with logical level tags (for example: `[EPIC]`, `[FEATURE]`) to preserve intent.
|
|
142
142
|
4. Never silently flatten hierarchy. Document fallback/link decisions in `execution-plan.md` notes.
|
|
143
143
|
|
|
144
|
+
**Enforcement: explicitly advisory prose (ARC-023) — no script verifies the fallback order was followed or that `execution-plan.md` documents a link decision; compliance depends entirely on the executing agent's judgment.**
|
|
145
|
+
|
|
144
146
|
### GitHub Issues Conventions
|
|
145
147
|
|
|
146
|
-
When `tracking_mode=external` and `external_provider=github`, resolve `{owner}/{repo}` from `git remote get-url origin` (or `.arcane.json`'s `github.repo` field if set) rather than assuming it matches the working directory name.
|
|
148
|
+
When `tracking_mode=external` and `external_provider=github`, **resolve `{owner}/{repo}` from `git remote get-url origin` (or `.arcane.json`'s `github.repo` field if set) rather than assuming it matches the working directory name. Enforcement: explicitly advisory prose (ARC-023) — no script gates this resolution before issue-tracking commands run; a same-principle utility (`parseGitHubRemote` in `src/modules/platform-policy.ts`) exists but serves `doctor`'s branch-policy check, not this workflow.**
|
|
147
149
|
|
|
148
150
|
GitHub Issues has no configurable work-item-type hierarchy the way Azure DevOps does — there is no process-template discovery step, and no equivalent to `az boards work-item-type list`. Use these substitutes instead:
|
|
149
151
|
|
|
@@ -194,6 +196,8 @@ Without this chain, agents make conflicting decisions across stories (e.g., one
|
|
|
194
196
|
3. Check for missing test coverage, architecture violations, security issues
|
|
195
197
|
4. Defer unrelated findings to a backlog (don't derail the current change)
|
|
196
198
|
|
|
199
|
+
**Enforcement: explicitly advisory prose (ARC-023) — no script counts or verifies findings, and `spell-review.prompt.md`'s current Rules section has superseded item 1's minimum with "no finding quota... zero findings is a valid outcome," so this minimum should be read as superseded framing, not current spell behavior.**
|
|
200
|
+
|
|
197
201
|
### Append-Only Progress
|
|
198
202
|
|
|
199
203
|
`progress.txt` is never edited, only appended. Each iteration adds:
|
|
@@ -248,6 +252,8 @@ The Arcane story schema for autonomous implementation:
|
|
|
248
252
|
|
|
249
253
|
If the output is missing required tracking fields, `passes`, `assignedTo`, `priority`, or `testEvidence`, it is malformed and must be regenerated.
|
|
250
254
|
|
|
255
|
+
**Enforcement: structured spell gate (ARC-023) — `spell-architect` step 5a self-checks every field and must regenerate before outputting if any is missing, and `spell-full-cycle` Phase 2 independently gates on the same schema completeness before proceeding to Phase 3; no external schema-validator script exists, so the check is agent-administered, not tool-verified.**
|
|
256
|
+
|
|
251
257
|
### Story Sizing
|
|
252
258
|
|
|
253
259
|
Each story must be small enough to complete in one context window:
|
|
@@ -275,7 +281,7 @@ For features that should run end-to-end with minimal human intervention, use `sp
|
|
|
275
281
|
spell-full-cycle = spell-plan → [spell-enchant] → spell-architect → [spell-implement → spell-test → spell-review]* → spell-ship
|
|
276
282
|
```
|
|
277
283
|
|
|
278
|
-
The entire pipeline runs autonomously with a single human gate at PR approval. Includes optional PRD enchantment between Plan and Architect (runs automatically if any quality dimension scores Bronze, or if `--enchant` is specified). Requires three inputs: feature description, tracking configuration (`tracking_mode` and optional `external_provider`), and target repo. In ADO mode, include the ADO work item ID; in GitHub mode, include the issue number if one already exists. Each phase has built-in quality gates that halt the pipeline on failure rather than producing garbage for downstream phases.
|
|
284
|
+
The entire pipeline runs autonomously with a single human gate at PR approval. Includes optional PRD enchantment between Plan and Architect (runs automatically if any quality dimension scores Bronze, or if `--enchant` is specified). Requires three inputs: feature description, tracking configuration (`tracking_mode` and optional `external_provider`), and target repo. In ADO mode, include the ADO work item ID; in GitHub mode, include the issue number if one already exists. **Each phase has built-in quality gates that halt the pipeline on failure rather than producing garbage for downstream phases. Enforcement: structured spell gate (ARC-023) — `spell-full-cycle.prompt.md` encodes explicit per-phase `Gate:` steps (e.g., Phase 4: "If coverage is below threshold or any acceptance criterion lacks a test, loop back to Phase 3... Maximum 2 coverage-fix loops before halting"; Phase 5: "If any HIGH severity finding exists, loop back to Phase 3... Maximum 2 review-fix loops before halting") plus a human/authority gate before merge.**
|
|
279
285
|
|
|
280
286
|
See [.github/prompts/spell-full-cycle.prompt.md](../.github/prompts/spell-full-cycle.prompt.md) for the complete prompt.
|
|
281
287
|
|
|
@@ -299,7 +305,7 @@ spell-plan → [spell-enchant] → spell-scope → [spell-architect → spell-im
|
|
|
299
305
|
|
|
300
306
|
Each epic then runs through its own Spell Loop cycle (architect → implement → test → review → ship).
|
|
301
307
|
|
|
302
|
-
Before starting the next epic after a major output checkpoint (execution plan, architecture + stories, full test evidence, or ship recommendation), run `spell-commit-work` to preserve progress and checkpoint branch state.
|
|
308
|
+
**Before starting the next epic after a major output checkpoint (execution plan, architecture + stories, full test evidence, or ship recommendation), run `spell-commit-work` to preserve progress and checkpoint branch state. Enforcement: explicitly advisory prose (ARC-023) — `spell-full-cycle.prompt.md`'s Rules section frames this as a recommendation ("recommend running `spell-commit-work` before starting the next epic"), and nothing blocks epic-start if it is skipped.**
|
|
303
309
|
|
|
304
310
|
See [.github/prompts/spell-scope.prompt.md](../.github/prompts/spell-scope.prompt.md) for the complete prompt.
|
|
305
311
|
|
|
@@ -323,7 +329,7 @@ When GitHub Copilot, Claude in VS Code, or any other interactive AI tool (not an
|
|
|
323
329
|
|
|
324
330
|
### Rule: Interactive tools cannot self-validate
|
|
325
331
|
|
|
326
|
-
A tool that writes code **must not
|
|
332
|
+
A tool that writes code **must not also run `spell-review` on that same code. Enforcement: explicitly advisory prose (ARC-023) — no mechanism in this repo can detect that the same agent or session both wrote and reviewed a diff (no session-identity tracking exists); GitHub's own block on self-authored `CHANGES_REQUESTED` reviews operates on GitHub account identity, not agent/session identity, and this repo routinely reuses one account for both.** This is the same constraint that prevents Lafayette from marking his own stories as passing. Specifically:
|
|
327
333
|
|
|
328
334
|
- Copilot sessions count as implementation (`spell-implement` equivalent)
|
|
329
335
|
- `spell-test` must be run to produce test evidence before review
|
|
@@ -20,6 +20,8 @@ Step-by-step hardening for a Linux host that will run an autonomous agent runtim
|
|
|
20
20
|
|
|
21
21
|
See also: [Threat Model](threat-model.md), [Authentication Strategy](authentication-strategy.md)
|
|
22
22
|
|
|
23
|
+
**Enforcement: explicitly advisory prose (ARC-023) — every item below configures a downstream operator's own Linux host, a target outside anything Arcane's own CI or spells can inspect; completion is tracked only in the operator's own security audit log, not by any Arcane mechanism.**
|
|
24
|
+
|
|
23
25
|
---
|
|
24
26
|
|
|
25
27
|
## Pre-Checklist: Know Your Environment
|
|
@@ -24,9 +24,9 @@ How machines, AI agents, and systems are named across your projects. This is a *
|
|
|
24
24
|
|
|
25
25
|
Two rules govern every name in the system.
|
|
26
26
|
|
|
27
|
-
**The Naming Test:** if an established industry term exists for the thing, use the real term — a universe name has to be *earned* by the absence of one. Two dialects result: magic grammar for the personas and vocabulary, plain functional payloads for everything technical. Corollary: the more autonomous the tool, the more boring its name should be.
|
|
27
|
+
**The Naming Test:** if an established industry term exists for the thing, use the real term — a universe name has to be *earned* by the absence of one. Two dialects result: magic grammar for the personas and vocabulary, plain functional payloads for everything technical. Corollary: the more autonomous the tool, the more boring its name should be. **Enforcement: explicitly advisory prose (ARC-023) — whether a real industry term already exists is a judgment call; no check screens a candidate name against this test.**
|
|
28
28
|
|
|
29
|
-
**The IP rule:** persona names must be **public domain or your own coinage**. No living people. No franchise-coined characters — a borrowed name is owned by whoever coined it, no matter how well it fits. Before any name ships, run the four checks: who coined it; does an estate still do business in it; do same-audience products already claim it (search live — don't trust memory); and what is its first association in each market you operate in, said aloud in every language your team speaks.
|
|
29
|
+
**The IP rule:** persona names must be **public domain or your own coinage**. No living people. No franchise-coined characters — a borrowed name is owned by whoever coined it, no matter how well it fits. Before any name ships, run the four checks: who coined it; does an estate still do business in it; do same-audience products already claim it (search live — don't trust memory); and what is its first association in each market you operate in, said aloud in every language your team speaks. **Enforcement: explicitly advisory prose (ARC-023) — the four checks depend on human judgment and live research; `spell-scry` can perform this exact check but nothing requires it before an agent name is assigned, and the naming step in `src/modules/naming.ts` validates only that a typed name is non-empty.**
|
|
30
30
|
|
|
31
31
|
Names should be memorable, distinctive, and never repeated across categories.
|
|
32
32
|
|
|
@@ -70,6 +70,7 @@ Agents get persona names paired with a role. The persona name is the primary ide
|
|
|
70
70
|
- An agent may serve multiple projects but keeps the same name and role everywhere.
|
|
71
71
|
- If an agent's role changes significantly, it gets a new name (don't reuse names for different roles).
|
|
72
72
|
- If you collaborate with other operators who run their own Arcane instances, reserve names across instances so they don't collide.
|
|
73
|
+
- **Enforcement: explicitly advisory prose (ARC-023) — no code checks persona-name uniqueness within a roster, across projects, or across Arcane instances; `agent-schema.ts`'s roster validation checks each entry's shape only.**
|
|
73
74
|
|
|
74
75
|
### Default Roster (Arcane personas)
|
|
75
76
|
|
|
@@ -107,9 +108,9 @@ The table above is the human-readable roster; agent definitions (`agents/*.yaml`
|
|
|
107
108
|
|
|
108
109
|
**Role consolidation (ADR-031):** Framework-specific dev roles (.NET, Blazor, React, Flutter, MAUI) are consolidated into generic roles (Full-Stack, Frontend, Mobile). The framework/stack is a prompt parameter, not an agent identity. This scales without needing a new agent for every technology.
|
|
109
110
|
|
|
110
|
-
**Naming policy:** All agent names should be positive characters — beings, not objects — with a clear thematic connection to their role.
|
|
111
|
+
**Naming policy:** All agent names should be positive characters — beings, not objects — with a clear thematic connection to their role. **Enforcement: explicitly advisory prose (ARC-023) — character and tone are a judgment call; `agent-schema.ts` validates that a name is a non-empty string, not its thematic content.**
|
|
111
112
|
|
|
112
|
-
**Canonical agent identity domain:** Use a single domain for all agent and tool Git identities — e.g., `merlin@{OPERATOR_DOMAIN}`. See [[DECISIONS#ADR-028|ADR-028]] for the full attribution model.
|
|
113
|
+
**Canonical agent identity domain:** Use a single domain for all agent and tool Git identities — e.g., `merlin@{OPERATOR_DOMAIN}`. See [[DECISIONS#ADR-028|ADR-028]] for the full attribution model. **Enforcement: explicitly advisory prose (ARC-023) — no commit-trailer or identity check verifies that every agent/tool email shares one domain; `git-conventions.md`'s Required Commit Trailers table validates trailer presence, not the author-email domain.**
|
|
113
114
|
|
|
114
115
|
### Power Levels (ADR-032)
|
|
115
116
|
|
|
@@ -38,6 +38,8 @@ Have the following ready:
|
|
|
38
38
|
|
|
39
39
|
## Phase 1 — Project & Repo Setup
|
|
40
40
|
|
|
41
|
+
**Every step in this phase is performed by hand in your version-control host's UI. Enforcement: explicitly advisory prose (ARC-023) — project, repo, and template creation happen entirely on the external VCS host, which no script or CI check in this repo observes or verifies.**
|
|
42
|
+
|
|
41
43
|
### Step 1.1 — Create the Project
|
|
42
44
|
|
|
43
45
|
1. Open your version-control host's project organization
|
|
@@ -82,6 +84,8 @@ In your docs/ops repo, copy `ventures/_template/` to `ventures/{venture}/` as a
|
|
|
82
84
|
|
|
83
85
|
## Phase 2 — Infrastructure & Security
|
|
84
86
|
|
|
87
|
+
**The security checklist and docs-repo clone in this phase are unverified operator actions. Enforcement: explicitly advisory prose (ARC-023) — no script or CI check in this repo confirms these steps were completed or completed correctly.**
|
|
88
|
+
|
|
85
89
|
### Step 2.1 — Confirm Security Baseline
|
|
86
90
|
|
|
87
91
|
Before running the agent runtime for any new business, verify:
|
|
@@ -101,6 +105,8 @@ git clone <docs-repo-url> ~/code/{repo}
|
|
|
101
105
|
|
|
102
106
|
## Phase 3 — Agent Runtime Configuration
|
|
103
107
|
|
|
108
|
+
**Steps 3.1, 3.2, and 3.4 (runtime install, configuration, and the dry-run test) are manual operator actions. Enforcement: explicitly advisory prose (ARC-023) — no script or CI check in this repo verifies the agent runtime was installed, configured, or dry-run tested before live use.**
|
|
109
|
+
|
|
104
110
|
### Step 3.1 — Install the Agent Runtime (if not already installed)
|
|
105
111
|
|
|
106
112
|
See [[agents/installation|Runtime Installation]].
|
|
@@ -113,6 +119,8 @@ See [[agents/installation|Runtime Installation]].
|
|
|
113
119
|
|
|
114
120
|
### Step 3.3 — Agent Git Identity Setup
|
|
115
121
|
|
|
122
|
+
**Registering an agent's persona, Git identity, and `.mailmap` entry, and running the verify command below, are self-administered. Enforcement: explicitly advisory prose (ARC-023) — no script or CI check validates `.mailmap` entries or roster registration; the verify command is a manual smoke test, distinct from `spell-commit-work`'s Step 8 gate, which governs the commit action itself, not agent registration.**
|
|
123
|
+
|
|
116
124
|
Every agent that will produce commits for this business must have a registered Git identity **before making its first commit**. See [[git-conventions#agent-attribution-model|Git Conventions — Agent Attribution]].
|
|
117
125
|
|
|
118
126
|
For each agent assigned to this business:
|
|
@@ -141,6 +149,8 @@ Run the agent runtime in dry-run / observation mode first. Do not let it execute
|
|
|
141
149
|
|
|
142
150
|
## Phase 4 — Legal Baseline
|
|
143
151
|
|
|
152
|
+
**Every step in this phase happens outside Arcane — entity structuring, tax registration, and ToS review. Enforcement: explicitly advisory prose (ARC-023) — these are legal and tax determinations on external systems that no script or CI check in this repo can observe or verify.**
|
|
153
|
+
|
|
144
154
|
### Step 4.1 — Business Entity
|
|
145
155
|
|
|
146
156
|
- Confirm operations run under {LLC_NAME}
|
|
@@ -161,6 +171,8 @@ Run the agent runtime in dry-run / observation mode first. Do not let it execute
|
|
|
161
171
|
|
|
162
172
|
## Phase 5 — First Launch Checklist
|
|
163
173
|
|
|
174
|
+
**This launch checklist is self-attested against external systems (the selling platform, the agent runtime's monitoring). Enforcement: explicitly advisory prose (ARC-023) — no script or CI check in this repo confirms any item below; the operator marks each complete by judgment.**
|
|
175
|
+
|
|
164
176
|
- [ ] At least 10 product listings live (or equivalent for non-e-commerce)
|
|
165
177
|
- [ ] Order/fulfillment workflow tested end-to-end
|
|
166
178
|
- [ ] The agent runtime running and monitored (see `agents/monitoring.md`)
|
|
@@ -34,7 +34,7 @@ ventures/ Prototypes features/ business repo
|
|
|
34
34
|
|
|
35
35
|
#### Concept (`ventures/<name>/`)
|
|
36
36
|
|
|
37
|
-
The permanent record of every idea — good, bad, or deferred. Ideas are **never deleted**. Frontmatter `status` tracks where each idea is in its lifecycle.
|
|
37
|
+
The permanent record of every idea — good, bad, or deferred. Ideas are **never deleted**. **Enforcement: explicitly advisory prose (ARC-023) — no code in this repo checks for or blocks deletion of files under `ventures/<name>/`; this depends on human/agent discipline.** Frontmatter `status` tracks where each idea is in its lifecycle.
|
|
38
38
|
|
|
39
39
|
**Required files:**
|
|
40
40
|
- `overview.md` — What is it? Why does it matter? Who is it for? (Minimum viable concept doc.)
|
|
@@ -45,7 +45,7 @@ The permanent record of every idea — good, bad, or deferred. Ideas are **never
|
|
|
45
45
|
- `stories.json` — If architecture produced story breakdown
|
|
46
46
|
- Screenshots in `assets/screenshots/YYYY-MM-DD/` (linked from docs)
|
|
47
47
|
|
|
48
|
-
**What does NOT belong here:** Code files (`.js`, `.ts`, `.py`, `.html`, `.css`, etc.). The docs repo is a documentation-only repository.
|
|
48
|
+
**What does NOT belong here:** Code files (`.js`, `.ts`, `.py`, `.html`, `.css`, etc.). The docs repo is a documentation-only repository. **Enforcement: explicitly advisory prose (ARC-023) — [[governance/agent-policies|Agent Policies]]'s repo-routing rule states the general version of this restriction; this file restates it for the docs repo specifically rather than asserting independent enforcement, and no lint/CI check here rejects code file extensions.**
|
|
49
49
|
|
|
50
50
|
#### Prototype (Prototypes repo)
|
|
51
51
|
|
|
@@ -57,7 +57,7 @@ Small, self-contained, throwaway code that demonstrates a concept. Prototypes ar
|
|
|
57
57
|
|
|
58
58
|
**Folder convention:** `<name>/` at repo root (e.g., `magic-prompt/`, `self-healing-poc/`)
|
|
59
59
|
|
|
60
|
-
**No governance overhead:** No PRs required, no work items, no branch policies. This is a sandbox. Commit directly to main.
|
|
60
|
+
**No governance overhead:** No PRs required, no work items, no branch policies. This is a sandbox. Commit directly to main. **Enforcement: explicitly advisory prose (ARC-023) — this is a deliberate low-ceremony policy choice, not a constraint with a pass/fail check to enforce.**
|
|
61
61
|
|
|
62
62
|
#### Feature (`features/{id}-{slug}/`)
|
|
63
63
|
|
|
@@ -116,7 +116,7 @@ Ideas evolve. Track iterations without complex versioning:
|
|
|
116
116
|
|
|
117
117
|
2. **Screenshots:** Save evidence of each meaningful state to `assets/screenshots/YYYY-MM-DD/` per [[assets/screenshots/README|screenshot conventions]]. Link from the changelog.
|
|
118
118
|
|
|
119
|
-
3. **Git history is the version control.** Don't create `v1/`, `v2/` folders. The idea folder is a living document — git tracks every change.
|
|
119
|
+
3. **Git history is the version control.** Don't create `v1/`, `v2/` folders. The idea folder is a living document — git tracks every change. **Enforcement: explicitly advisory prose (ARC-023) — no check inspects idea folders for `v1/`/`v2/`-style version directories; this depends on human/agent discipline.**
|
|
120
120
|
|
|
121
121
|
---
|
|
122
122
|
|
|
@@ -128,10 +128,10 @@ No formal gate. If someone (human or agent) wants to see the idea running, gener
|
|
|
128
128
|
|
|
129
129
|
### Concept/Prototype → Feature
|
|
130
130
|
|
|
131
|
-
All of these must be true:
|
|
131
|
+
All of these must be true: **Enforcement: explicitly advisory prose (ARC-023) — no spell checks these four criteria before a `status: promoted` transition; `spell-plan` satisfies only the fourth criterion (a PRD exists) and does not gate the others, and `spell-manifest`'s promotion flow uses a separate idea-book status marker, not this file's ventures frontmatter.**
|
|
132
132
|
- [ ] A tracker work item exists (User Story or Feature)
|
|
133
133
|
- [ ] A business track owns it (maps to a `ventures/<name>/` folder or a project)
|
|
134
|
-
- [ ] A target code repo exists (or needs to be created; repo creation is human-only)
|
|
134
|
+
- [ ] A target code repo exists (or needs to be created; repo creation is human-only) **Enforcement: explicitly advisory prose (ARC-023) — [[governance/agent-policies|Agent Policies]] is the canonical statement of this rule (Spectator-level, human-only); this restates it rather than asserting independent enforcement, and no code under `src/commands/` implements repo creation for a check to gate in the first place.**
|
|
135
135
|
- [ ] The idea has at least a PRD (`spell-plan` output)
|
|
136
136
|
|
|
137
137
|
When promoted: update the idea's frontmatter to `status: promoted` with `promoted_to` metadata. The idea folder stays in arcane forever as the historical record.
|
|
@@ -166,7 +166,7 @@ In the vibe coding era, a well-written spec can regenerate a prototype in minute
|
|
|
166
166
|
|---|---|
|
|
167
167
|
| [[governance/development-methodology\|Spell Loop]] | Ideas enter the loop at `spell-plan`. Concept stage is pre-loop exploration. |
|
|
168
168
|
| Repo routing | Code → code repos. Docs → the docs repo. Prototypes → Prototypes repo. |
|
|
169
|
-
| Repo governance | Repo creation is human-only. Prototypes repo is a single shared repo, not per-POC. |
|
|
169
|
+
| Repo governance | Repo creation is human-only. **Enforcement: explicitly advisory prose (ARC-023) — [[governance/agent-policies\|Agent Policies]] is the canonical statement of this rule; this table restates it rather than asserting independent enforcement.** Prototypes repo is a single shared repo, not per-POC. |
|
|
170
170
|
| Feature folders | Feature planning artifacts live in the target code repo under `features/`. |
|
|
171
171
|
| `ventures/<name>/` | Business-level docs for shipped products. Ideas that graduate here are fully promoted. |
|
|
172
172
|
|
|
@@ -15,7 +15,7 @@ Paste this entire file into any AI client (Claude web, ChatGPT, etc.) to give it
|
|
|
15
15
|
|
|
16
16
|
**Arcane** — Operational documentation for running AI-automated businesses under {LLC_NAME} (owner: {OPERATOR_NAME}). Uses an agent runtime to automate operations across one or more ventures.
|
|
17
17
|
|
|
18
|
-
**This is a documentation-only repository.** No build commands, test suites, or deployable code. Do not add automation without being asked.
|
|
18
|
+
**This is a documentation-only repository.** No build commands, test suites, or deployable code. **Do not add automation without being asked. Enforcement: explicitly advisory prose (ARC-023) — no check blocks adding scripts, build tooling, or automation to this repo; compliance depends on agent judgment.**
|
|
19
19
|
|
|
20
20
|
## Environment
|
|
21
21
|
|
|
@@ -26,6 +26,8 @@ Paste this entire file into any AI client (Claude web, ChatGPT, etc.) to give it
|
|
|
26
26
|
|
|
27
27
|
## Non-Negotiable Rules
|
|
28
28
|
|
|
29
|
+
**Enforcement note (ARC-023):** these 9 rules are a condensed restatement of `.arcane/governance/universal-agent-rules.md` rules 1-6, 10, 11, and 15 — see that file for each rule's full text and its authoritative enforcement-mode classification; this summary does not duplicate those classifications here, to avoid a second, driftable copy of the same information.
|
|
30
|
+
|
|
29
31
|
1. **Never access an encrypted or cross-OS volume you are not authorized to touch.** This rule stands as defense-in-depth regardless of encryption status.
|
|
30
32
|
2. **No root commands** unless explicitly scoped and justified.
|
|
31
33
|
3. **No secrets on the command line.** Use env vars and `read -s`.
|
|
@@ -49,20 +51,20 @@ Paste this entire file into any AI client (Claude web, ChatGPT, etc.) to give it
|
|
|
49
51
|
|
|
50
52
|
## Where Documents Live
|
|
51
53
|
|
|
52
|
-
- **Framework-managed standards:** `.arcane/governance/`. Spells reference this single installed layer; do not create a duplicate root `governance/` tree.
|
|
54
|
+
- **Framework-managed standards:** `.arcane/governance/`. Spells reference this single installed layer; **do not create a duplicate root `governance/` tree. Enforcement: explicitly advisory prose (ARC-023) — no check scans a repo for a duplicate root-level `governance/` directory.**
|
|
53
55
|
- **Project-owned orientation and continuity:** `README.md`, `project.md`, `TODO.md`, `DECISIONS.md`, `ai-context/`, and `journal/`. Arcane creates missing files once and preserves existing content.
|
|
54
56
|
- **Project/domain documents:** use explicit descriptive paths such as `docs/`, `security/`, `infrastructure/`, or a configured business root. These add project context alongside framework standards.
|
|
55
|
-
- **Overrides are not yet supported:** editing a managed `.arcane/governance/` standard can be replaced by `arcane update`. Additive project documents are safe; overriding a shipped standard requires the open customization/override model.
|
|
57
|
+
- **Overrides are not yet supported:** editing a managed `.arcane/governance/` standard can be replaced by `arcane update`. Additive project documents are safe; **overriding a shipped standard requires the open customization/override model. Enforcement: explicitly advisory prose (ARC-023) — that model is still an open backlog item (not yet built), so nothing currently blocks a direct edit; `arcane update` will just overwrite it silently on the next run.**
|
|
56
58
|
|
|
57
59
|
## Research Reports
|
|
58
60
|
|
|
59
61
|
Research findings (competitive analysis, technical spikes, feasibility studies — the output of the Research & Backlog Analyst role) live at `docs/research/<topic-slug>.md`, one file per report. No dedicated spell produces these: `spell-document` already proposes a target path from project structure and matches its destination directory's existing conventions — point it at `docs/research/` for investigative content, the same way it already proposes `docs/` or `.arcane/governance/` for other document types. The directory is created on first real report, not pre-seeded on `spell init`.
|
|
60
62
|
|
|
61
|
-
Use this repo's standard frontmatter (below) plus one addition: `sources` — a list of what was consulted. Every claim in the body traces back to one of these or is explicitly marked speculative. Structure the body summary-first: a short **Summary** with the key findings, then **Findings** with full detail and inline citations, then an optional **Follow-ups** for anything that should become a TODO item — route those via `spell-todo`, which cross-references the report path. Throughout, distinguish **verified facts**, **reasonable inferences**, and **speculation** explicitly; don't let an inference read as a checked fact.
|
|
63
|
+
Use this repo's standard frontmatter (below) plus one addition: `sources` — a list of what was consulted. **Every claim in the body traces back to one of these or is explicitly marked speculative. Enforcement: explicitly advisory prose (ARC-023) — no mechanism reads research-report prose to verify citation coverage or speculation marking.** Structure the body summary-first: a short **Summary** with the key findings, then **Findings** with full detail and inline citations, then an optional **Follow-ups** for anything that should become a TODO item — route those via `spell-todo`, which cross-references the report path. Throughout, distinguish **verified facts**, **reasonable inferences**, and **speculation** explicitly; don't let an inference read as a checked fact.
|
|
62
64
|
|
|
63
65
|
## Documentation Format
|
|
64
66
|
|
|
65
|
-
Every doc uses YAML frontmatter: `title`, `audience` (human/ai/both), `last_updated`, `status` (draft/active/deprecated), `tags`. Use wiki-links (`[[filename]]`) for cross-references.
|
|
67
|
+
**Every doc uses YAML frontmatter: `title`, `audience` (human/ai/both), `last_updated`, `status` (draft/active/deprecated), `tags`. Enforcement: explicitly advisory prose (ARC-023) — no schema validates these frontmatter fields on arbitrary docs; `.arcane.json` manifest validation (`src/modules/manifest.ts`) covers only installation-config fields, not document frontmatter.** Use wiki-links (`[[filename]]`) for cross-references.
|
|
66
68
|
|
|
67
69
|
## Naming Tiers
|
|
68
70
|
|
|
@@ -25,6 +25,8 @@ Define what "the best version of an app" means across every dimension — UX, ac
|
|
|
25
25
|
| **Dependency identification** | External services, APIs, and decisions the feature depends on are listed |
|
|
26
26
|
| **Open questions documented** | Unresolved items are captured — not ignored or assumed |
|
|
27
27
|
|
|
28
|
+
**Enforcement: explicitly advisory prose (ARC-023) — `spell-enchant` scores this dimension and generates enhancement suggestions but never blocks (the user has final say per its Rules section); `spell-scope`'s Quality Quick-Check treats a Bronze score here as a recommendation, not a gate.**
|
|
29
|
+
|
|
28
30
|
### 2. User Experience (UX)
|
|
29
31
|
|
|
30
32
|
| Criterion | Description |
|
|
@@ -38,6 +40,8 @@ Define what "the best version of an app" means across every dimension — UX, ac
|
|
|
38
40
|
| **Consistency** | UI patterns, terminology, and behavior are consistent across features |
|
|
39
41
|
| **Micro-interactions** | Transitions, hover effects, and subtle animations provide polish without slowing users down |
|
|
40
42
|
|
|
43
|
+
**Enforcement: explicitly advisory prose (ARC-023) — `spell-enchant` scores this dimension and generates enhancement suggestions but never blocks (the user has final say per its Rules section); `spell-scope`'s Quality Quick-Check treats a Bronze score here as a recommendation, not a gate.**
|
|
44
|
+
|
|
41
45
|
### 3. Accessibility (WCAG 2.1 AA Baseline)
|
|
42
46
|
|
|
43
47
|
| Criterion | Description |
|
|
@@ -51,6 +55,8 @@ Define what "the best version of an app" means across every dimension — UX, ac
|
|
|
51
55
|
| **Motion sensitivity** | Animations respect `prefers-reduced-motion`; no content-critical motion |
|
|
52
56
|
| **Text resizing** | UI remains usable at 200% zoom |
|
|
53
57
|
|
|
58
|
+
**Enforcement: explicitly advisory prose (ARC-023) — `spell-enchant` scores this dimension and generates enhancement suggestions but never blocks (the user has final say per its Rules section); `spell-scope`'s Quality Quick-Check treats a Bronze score here as a recommendation, not a gate.**
|
|
59
|
+
|
|
54
60
|
### 4. Performance
|
|
55
61
|
|
|
56
62
|
| Criterion | Description |
|
|
@@ -63,6 +69,8 @@ Define what "the best version of an app" means across every dimension — UX, ac
|
|
|
63
69
|
| **Offline / degraded** | Define behavior when network is slow or unavailable (if applicable) |
|
|
64
70
|
| **Concurrent users** | Target number documented; load testing plan defined for > 100 concurrent |
|
|
65
71
|
|
|
72
|
+
**Enforcement: explicitly advisory prose (ARC-023) — `spell-enchant` scores this dimension and generates enhancement suggestions but never blocks (the user has final say per its Rules section); `spell-scope`'s Quality Quick-Check treats a Bronze score here as a recommendation, not a gate.**
|
|
73
|
+
|
|
66
74
|
### 5. Security (Beyond OWASP Baseline)
|
|
67
75
|
|
|
68
76
|
| Criterion | Description |
|
|
@@ -76,6 +84,8 @@ Define what "the best version of an app" means across every dimension — UX, ac
|
|
|
76
84
|
| **Secret handling** | No hardcoded secrets; all credentials via environment variables or secret store |
|
|
77
85
|
| **Dependency scanning** | Third-party packages audited for known vulnerabilities |
|
|
78
86
|
|
|
87
|
+
**Enforcement: explicitly advisory prose (ARC-023) — `spell-enchant` scores this dimension and generates enhancement suggestions but never blocks (the user has final say per its Rules section); `spell-scope`'s Quality Quick-Check treats a Bronze score here as a recommendation, not a gate.**
|
|
88
|
+
|
|
79
89
|
### 6. Responsive Design
|
|
80
90
|
|
|
81
91
|
| Criterion | Description |
|
|
@@ -85,6 +95,8 @@ Define what "the best version of an app" means across every dimension — UX, ac
|
|
|
85
95
|
| **Layout adaptation** | Content reflows appropriately — no horizontal scrolling on mobile |
|
|
86
96
|
| **Navigation adaptation** | Desktop nav collapses to mobile pattern (hamburger, bottom nav, etc.) |
|
|
87
97
|
|
|
98
|
+
**Enforcement: explicitly advisory prose (ARC-023) — `spell-enchant` scores this dimension and generates enhancement suggestions but never blocks (the user has final say per its Rules section); `spell-scope`'s Quality Quick-Check treats a Bronze score here as a recommendation, not a gate.**
|
|
99
|
+
|
|
88
100
|
### 7. Competitive Differentiation
|
|
89
101
|
|
|
90
102
|
| Criterion | Description |
|
|
@@ -94,6 +106,8 @@ Define what "the best version of an app" means across every dimension — UX, ac
|
|
|
94
106
|
| **Table-stakes coverage** | Features that users expect as standard for this category are all present |
|
|
95
107
|
| **Experience premium** | At least one UX element that makes users think "this is well-made" |
|
|
96
108
|
|
|
109
|
+
**Enforcement: explicitly advisory prose (ARC-023) — `spell-enchant` scores this dimension and generates enhancement suggestions but never blocks (the user has final say per its Rules section); `spell-scope`'s Quality Quick-Check treats a Bronze score here as a recommendation, not a gate.**
|
|
110
|
+
|
|
97
111
|
---
|
|
98
112
|
|
|
99
113
|
## Quality Profiles
|
|
@@ -160,7 +174,7 @@ If the user does not specify a profile, **Public MVP** is the default. Rationale
|
|
|
160
174
|
| **Could-Add** | Current score already meets or exceeds target; enhancement is aspirational |
|
|
161
175
|
| **Won't-Add** | Explicitly excluded regardless of profile |
|
|
162
176
|
|
|
163
|
-
**Override:** Security and Accessibility gaps are always at least Should-Add regardless of profile. A Bronze Security score is always Must-Add.
|
|
177
|
+
**Override:** Security and Accessibility gaps are always at least Should-Add regardless of profile. A Bronze Security score is always Must-Add. **Enforcement: explicitly advisory prose (ARC-023) — `spell-enchant`'s own tier-assignment step and Rules section restate this override verbatim, so it is not purely aspirational text, but enforcement is still agent judgment during suggestion generation rather than a mechanical check; the user retains final approval over every addition, security and accessibility included.**
|
|
164
178
|
|
|
165
179
|
---
|
|
166
180
|
|
|
@@ -27,14 +27,18 @@ An RCA is **required** when any of these occur:
|
|
|
27
27
|
| **Implicit decision detected** | A drift check or session applied a change that had no governing ADR |
|
|
28
28
|
| **Integration failure from doc mismatch** | A playbook or script failed because docs disagreed with reality |
|
|
29
29
|
|
|
30
|
+
**Enforcement: explicitly advisory prose (ARC-023) — no script or drift check detects decision reversals, naming collisions, multi-file corrections, or the other trigger conditions above, or confirms an RCA was opened when one applies; recognizing a trigger and initiating an RCA depends on human or agent judgment.**
|
|
31
|
+
|
|
30
32
|
An RCA is **recommended** (but optional) for:
|
|
31
33
|
- Repeated confusion in sessions about the same topic
|
|
32
34
|
- A TODO item that was deferred and caused downstream problems
|
|
33
35
|
- Any incident where the operator says "how did we end up here?"
|
|
34
36
|
|
|
37
|
+
**Enforcement: explicitly advisory prose (ARC-023) — these are softer signals than the required triggers above; no script detects them, and opening an RCA here is left to human or agent judgment.**
|
|
38
|
+
|
|
35
39
|
## RCA Template
|
|
36
40
|
|
|
37
|
-
Every RCA follows this structure. Artifacts are stored in `governance/rcas/` with the filename `RCA-NNN-short-slug.md` (sequential numbering, matching the related ADR when applicable).
|
|
41
|
+
**Every RCA follows this structure. Artifacts are stored in `governance/rcas/` with the filename `RCA-NNN-short-slug.md` (sequential numbering, matching the related ADR when applicable). Enforcement: explicitly advisory prose (ARC-023) — no script validates RCA filenames, sequential numbering, or template structure.**
|
|
38
42
|
|
|
39
43
|
```markdown
|
|
40
44
|
---
|
|
@@ -117,7 +121,7 @@ When a trigger condition is met:
|
|
|
117
121
|
|
|
118
122
|
- **Corrective actions** fix the immediate problem (e.g., rename the files, revert the change)
|
|
119
123
|
- **Preventive actions** change the process so the problem can't recur (e.g., add a checklist item, amend a template, update a prompt)
|
|
120
|
-
- Every preventive action must reference the specific governance doc, template, or prompt it modifies
|
|
124
|
+
- **Every preventive action must reference the specific governance doc, template, or prompt it modifies. Enforcement: explicitly advisory prose (ARC-023) — no script verifies that a preventive action's Target Doc cites a real, specific governance path.**
|
|
121
125
|
|
|
122
126
|
### 4. Implement and Verify
|
|
123
127
|
|
|
@@ -126,8 +130,8 @@ When a trigger condition is met:
|
|
|
126
130
|
|
|
127
131
|
### 5. Close
|
|
128
132
|
|
|
129
|
-
- Set RCA status to `active` (RCAs remain active as reference — they are not "resolved" and deleted)
|
|
130
|
-
- Link the RCA from the related ADR using a "Deep dive" wiki-link
|
|
133
|
+
- **Set RCA status to `active` (RCAs remain active as reference — they are not "resolved" and deleted). Enforcement: explicitly advisory prose (ARC-023) — no script checks RCA status fields or blocks deleting an RCA file.**
|
|
134
|
+
- **Link the RCA from the related ADR using a "Deep dive" wiki-link. Enforcement: explicitly advisory prose (ARC-023) — `check-distributed-adr-references.ts` validates ADR-ID references and cross-repo link hazards but does not check for a "Deep dive" backlink from the ADR.**
|
|
131
135
|
- Record a note in the session journal
|
|
132
136
|
|
|
133
137
|
## Severity Levels
|
|
@@ -138,7 +142,7 @@ RCAs do not have formal severity levels. The trigger conditions above determine
|
|
|
138
142
|
|
|
139
143
|
- In interactive sessions: the human operator and AI agent collaborate on the RCA
|
|
140
144
|
- For autonomous agent work: the agent flags the trigger condition and drafts the RCA for human review
|
|
141
|
-
- RCAs are never auto-committed — they require human approval (same rule as all interactive commits per [[governance/git-conventions|Git Conventions]])
|
|
145
|
+
- **RCAs are never auto-committed — they require human approval (same rule as all interactive commits per [[governance/git-conventions|Git Conventions]]). Enforcement: structured spell gate (ARC-023) — this restates universal-agent-rules.md rule 10 ("Never auto-commit during interactive sessions"), enforced by `spell-commit-work`'s Step 8, which computes an approval fingerprint over the staged diff and message and halts until an authenticated operator response is tied to it before `git commit` runs.**
|
|
142
146
|
|
|
143
147
|
## Artifact Location
|
|
144
148
|
|
|
@@ -153,5 +157,5 @@ governance/
|
|
|
153
157
|
|
|
154
158
|
## Maintenance
|
|
155
159
|
|
|
156
|
-
- Review RCA preventive actions quarterly during `spell-check-drift` runs
|
|
157
|
-
- If a preventive action proves ineffective (same class of problem recurs), update the RCA with a "Recurrence" section and strengthen the preventive action
|
|
160
|
+
- **Review RCA preventive actions quarterly during `spell-check-drift` runs. Enforcement: explicitly advisory prose (ARC-023) — `spell-check-drift` has no RCA-specific detector; this cross-reference depends on the operator or agent remembering to do the review by hand.**
|
|
161
|
+
- **If a preventive action proves ineffective (same class of problem recurs), update the RCA with a "Recurrence" section and strengthen the preventive action. Enforcement: explicitly advisory prose (ARC-023) — no script detects recurrence of the same class of problem; recognizing it depends on human or agent judgment.**
|
|
@@ -64,16 +64,16 @@ superseded_by: path/to/replacement.md
|
|
|
64
64
|
|
|
65
65
|
Rules:
|
|
66
66
|
|
|
67
|
-
-
|
|
67
|
+
- **`superseded_by` is required. Enforcement: explicitly advisory prose (ARC-023) — no script checks a superseded document's frontmatter for this field.** A tombstone that does not say what replaced it is
|
|
68
68
|
worse than no tombstone: it tells the reader to stop without telling them
|
|
69
69
|
where to go.
|
|
70
|
-
- If a document was superseded by *several* documents, list all of them.
|
|
71
|
-
- If a document was retired without replacement, say so explicitly
|
|
72
|
-
(`superseded_by: none — <reason>`), rather than leaving the field off.
|
|
73
|
-
- Do not delete the original content. The tombstone is a header, not a
|
|
70
|
+
- **If a document was superseded by *several* documents, list all of them. Enforcement: explicitly advisory prose (ARC-023) — no script cross-checks the list against the document's actual replacements.**
|
|
71
|
+
- **If a document was retired without replacement, say so explicitly
|
|
72
|
+
(`superseded_by: none — <reason>`), rather than leaving the field off. Enforcement: explicitly advisory prose (ARC-023) — no script distinguishes this explicit form from an omitted field.**
|
|
73
|
+
- **Do not delete the original content. Enforcement: explicitly advisory prose (ARC-023) — no diff check runs when a tombstone is added, so nothing confirms the body underneath is untouched.** The tombstone is a header, not a
|
|
74
74
|
replacement for the body.
|
|
75
|
-
- **Add the reverse link on the replacement
|
|
76
|
-
discoverable from either end. A reader who finds only the current document
|
|
75
|
+
- **Add the reverse link on the replacement, so the relationship is
|
|
76
|
+
discoverable from either end. Enforcement: explicitly advisory prose (ARC-023) — no script checks that a `supersedes` field exists on the named replacement.** A reader who finds only the current document
|
|
77
77
|
should still be able to see what it replaced:
|
|
78
78
|
|
|
79
79
|
```yaml
|
|
@@ -91,7 +91,7 @@ Supersession and deletion are different decisions and must not be conflated.
|
|
|
91
91
|
Marking a document superseded is a routine editorial act. Deleting it is not.
|
|
92
92
|
|
|
93
93
|
**Deletion is prohibited without an explicit, recorded decision when any of the
|
|
94
|
-
following is true
|
|
94
|
+
following is true. Enforcement: explicitly advisory prose (ARC-023) — none of the four conditions below is checked by a script; `content_sensitivity`'s value is schema-validated, but nothing gates deletion on it.**
|
|
95
95
|
|
|
96
96
|
- The document records a decision, agreement, or obligation that other parties
|
|
97
97
|
relied on.
|
|
@@ -101,8 +101,8 @@ following is true:**
|
|
|
101
101
|
- The repository is marked `content_sensitivity: sensitive` and the document's
|
|
102
102
|
own existence is part of the record.
|
|
103
103
|
|
|
104
|
-
When deletion *is* approved, record it: what was deleted, when, on whose
|
|
105
|
-
authority, and why. A deletion nobody can account for later is indistinguishable
|
|
104
|
+
**When deletion *is* approved, record it: what was deleted, when, on whose
|
|
105
|
+
authority, and why. Enforcement: explicitly advisory prose (ARC-023) — no script checks that a deletion record exists after the fact.** A deletion nobody can account for later is indistinguishable
|
|
106
106
|
from data loss.
|
|
107
107
|
|
|
108
108
|
**Arcane does not ship a retention schedule.** Retention periods are
|
|
@@ -50,7 +50,7 @@ See also: [Hardening Checklist](hardening-checklist.md), [Authentication Strateg
|
|
|
50
50
|
| Supply chain (package installs) | **Mitigated** | Global package installs use a user-owned directory, not a system directory. No `sudo` during install. |
|
|
51
51
|
| Inter-machine communication | **Mitigated** | Encrypted mesh tunnel/VPN. No direct unencrypted LAN communication. |
|
|
52
52
|
| Token/credential exposure (at rest) | **Mitigated** | Token stored as an env var in a `.env` file. Config uses a secret reference, not plaintext. State directory is mode `700`. |
|
|
53
|
-
| Credential committed to version control | **Not mitigated** | Storage conventions are documented (secret references, `.gitignore` entries for `.env`/`*.pem`/`*.key`) but **no detection exists** — no scanner runs on the commit path, the push path, or in CI, and nothing verifies the conventions were followed. `spell-security-review`'s secrets step is an on-demand agent read, not a control. Treat every credential that reaches a commit as compromised and rotate it — history, existing clones, and remote backups all survive deleting the file (EF-35). |
|
|
53
|
+
| Credential committed to version control | **Not mitigated** | Storage conventions are documented (secret references, `.gitignore` entries for `.env`/`*.pem`/`*.key`) but **no detection exists** — no scanner runs on the commit path, the push path, or in CI, and nothing verifies the conventions were followed. `spell-security-review`'s secrets step is an on-demand agent read, not a control. **Treat every credential that reaches a commit as compromised and rotate it — history, existing clones, and remote backups all survive deleting the file (EF-35). Enforcement: explicitly advisory prose (ARC-023) — rotating a leaked credential happens at the third-party provider that issued it; no Arcane mechanism can perform or verify that a specific credential was actually rotated.** |
|
|
54
54
|
|
|
55
55
|
---
|
|
56
56
|
|
|
@@ -94,11 +94,11 @@ This policy defines which collaborators can access which project data. Enforce b
|
|
|
94
94
|
|
|
95
95
|
### Enforcement
|
|
96
96
|
|
|
97
|
-
- Project-level isolation is the primary boundary: each business is a separate project with its own access control.
|
|
98
|
-
- A partner's access is limited to a single business's project, through a dedicated org only.
|
|
99
|
-
- An operations co-owner receives access only to their business's project and relevant platform accounts — not to infrastructure configs.
|
|
100
|
-
- System-level and multi-business reference documentation stays private to the owner unless explicitly shared.
|
|
101
|
-
- New collaborator access requires an explicit entry in this table and an entry in the security audit log.
|
|
97
|
+
- **Project-level isolation is the primary boundary: each business is a separate project with its own access control. Enforcement: explicitly advisory prose (ARC-023) — isolation depends on the owner actually configuring separate platform projects/repos with distinct access control; `spell doctor`'s `checkPlatformBranchPolicy` (src/modules/platform-policy.ts) verifies only branch merge-method policy and `checkDelegations` (src/commands/doctor.ts) verifies only agent power-level delegations, so no Arcane check queries collaborator or team membership to verify a given business's project is actually isolated.**
|
|
98
|
+
- **A partner's access is limited to a single business's project, through a dedicated org only. Enforcement: explicitly advisory prose (ARC-023) — depends on the owner correctly scoping the partner's platform account to a single org; no Arcane check inspects collaborator or team membership to verify a partner's actual access is so limited.**
|
|
99
|
+
- **An operations co-owner receives access only to their business's project and relevant platform accounts — not to infrastructure configs. Enforcement: explicitly advisory prose (ARC-023) — depends on the owner correctly scoping platform-account grants; no Arcane check inspects collaborator permissions to verify infrastructure configs are actually excluded.**
|
|
100
|
+
- **System-level and multi-business reference documentation stays private to the owner unless explicitly shared. Enforcement: explicitly advisory prose (ARC-023) — depends on the owner's manual sharing decisions; no Arcane check inspects document visibility or sharing state to verify this boundary holds.**
|
|
101
|
+
- **New collaborator access requires an explicit entry in this table and an entry in the security audit log. Enforcement: explicitly advisory prose (ARC-023) — a manual documentation discipline; no Arcane check verifies this table was updated or that a corresponding security audit log entry exists, and the security audit log itself is a manual record referenced across governance docs, not a system Arcane reads or writes.**
|
|
102
102
|
|
|
103
103
|
---
|
|
104
104
|
|