arcane-cli 0.29.1 → 0.29.3

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.
@@ -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
 
@@ -64,16 +64,16 @@ superseded_by: path/to/replacement.md
64
64
 
65
65
  Rules:
66
66
 
67
- - `superseded_by` is required. A tombstone that does not say what replaced it is
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**, so the relationship is
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
@@ -21,22 +21,26 @@ wiki-link** (corrected 2026-08-31, BC-06) — this file ships to consumer repos,
21
21
  `DECISIONS.md` does not: `src/assets/DECISIONS.md` (what consumers actually receive via
22
22
  `spell init`) is an empty starter template for the *consumer's own* decisions, so a
23
23
  same-repo wiki-link to a specific ARC id would resolve to the wrong document once
24
- installed, not simply fail to resolve.
24
+ installed, not simply fail to resolve. **Enforcement: explicitly advisory prose (ARC-023)
25
+ — depends on editorial judgment; no mechanical check verifies citation style in this file.**
25
26
 
26
27
  ## The Spell Quality Rubric
27
28
 
28
29
  Eight dimensions. Each is scored **Bronze (1) / Silver (2) / Gold (3)**. A spell's **overall score is
29
30
  its weakest dimension** (same weakest-link rule as the PRD scorecard) — a Gold workflow with a Bronze
30
- safety rail is a Bronze spell.
31
+ safety rail is a Bronze spell. **Enforcement: explicitly advisory prose (ARC-023) — self-graded during
32
+ spell audit; no coded scorer computes or verifies this aggregation.**
31
33
 
32
34
  Two dimensions are **hard gates**: **D2 Distributability** and **D7 Safety** must be **≥ Silver** for a
33
- spell to ship, regardless of overall target.
35
+ spell to ship, regardless of overall target. **Enforcement: explicitly advisory prose (ARC-023) — self-graded
36
+ during spell audit; only D2's Bronze floor (literal org-name detection) is mechanically checked today, so
37
+ this broader ≥ Silver gate is not fully verified by any coded scorer or workflow gate.**
34
38
 
35
39
  ### D1 — Front-matter & invocation contract
36
40
 
37
41
  | Tier | Bar |
38
42
  | --- | --- |
39
- | Bronze | Front-matter complete: `name`, `description`, `argument-hint`, `agent`. |
43
+ | Bronze | Front-matter complete: `name`, `description`, `argument-hint`, `agent`. Enforcement: explicitly advisory prose (ARC-023) — self-graded during spell audit; a CI check (`npm run check:spell-catalog`, running `scripts/spell-catalog.ts`) incidentally validates only the `name`/`description` fields as a side effect of catalog generation, not the full front-matter set this bar requires. |
40
44
  | Silver | + an accurate **Executive Summary** stating purpose, when to use it, and what it produces. |
41
45
  | Gold | + explicitly disambiguates itself from sibling spells a user might confuse it with. |
42
46
 
@@ -44,17 +48,17 @@ spell to ship, regardless of overall target.
44
48
 
45
49
  | Tier | Bar |
46
50
  | --- | --- |
47
- | Bronze | No real organization, person, venture, or machine names. Org-specific values use `{UPPER_SNAKE}` placeholders. |
48
- | Silver | + every placeholder has an inline resolution note: *"resolve from `.arcane.json` / frontmatter; ask if unset."* |
51
+ | Bronze | No real organization, person, venture, or machine names. Org-specific values use `{UPPER_SNAKE}` placeholders. Enforcement: executable check (ARC-023) — `scripts/org-token-lint.ts` scans `.github/prompts/*.prompt.md` against the `ARCANE_ORG_TOKENS` denylist and runs automatically as part of `npm run build`, failing the build on a match; `spell ward --gate` (`src/commands/ward.ts`) runs the same denylist-scanning engine standalone but is not currently wired into CI as its own gate. |
52
+ | Silver | + every placeholder has an inline resolution note: *"resolve from `.arcane.json` / frontmatter; ask if unset."* Enforcement: explicitly advisory prose (ARC-023) — part of the D2 hard gate by name, but this specific bar is self-graded; no check verifies a placeholder carries an inline resolution note. |
49
53
  | Gold | + no hard assumption of a specific tracker, agent roster, or directory layout — the spell works in a vanilla consuming repo with no Arcane context files present. |
50
54
 
51
- > A **Bronze on D2 is OSS-blocking** and must be fixed before release. See **Distributability conventions** below.
55
+ > A **Bronze on D2 is OSS-blocking** and must be fixed before release. **Enforcement: executable check (ARC-023) — same mechanism as the D2 Bronze bar above: the `org-token-lint` build gate fails `npm run build` automatically; `spell ward --gate` provides the same scan standalone but is not yet wired into CI.** See **Distributability conventions** below.
52
56
 
53
57
  ### D3 — Context-file robustness
54
58
 
55
59
  | Tier | Bar |
56
60
  | --- | --- |
57
- | Bronze | Context files the spell reads are listed. |
61
+ | Bronze | Context files the spell reads are listed. Enforcement: explicitly advisory prose (ARC-023) — self-graded during spell audit; no coded scorer verifies this dimension. |
58
62
  | Silver | + each optional file has a fallback: *"if missing, proceed with X."* |
59
63
  | Gold | + the spell degrades gracefully end-to-end when **no** context files exist. |
60
64
 
@@ -62,7 +66,7 @@ spell to ship, regardless of overall target.
62
66
 
63
67
  | Tier | Bar |
64
68
  | --- | --- |
65
- | Bronze | The happy path is fully specified with clear, ordered steps. |
69
+ | Bronze | The happy path is fully specified with clear, ordered steps. Enforcement: explicitly advisory prose (ARC-023) — self-graded during spell audit; no coded scorer verifies this dimension. |
66
70
  | Silver | + edge and failure cases handled: missing/invalid input, a required tool unavailable, an empty result. |
67
71
  | Gold | + re-run safety (idempotency) and recovery from partial failure. |
68
72
 
@@ -70,7 +74,7 @@ spell to ship, regardless of overall target.
70
74
 
71
75
  | Tier | Bar |
72
76
  | --- | --- |
73
- | Bronze | The output is named. |
77
+ | Bronze | The output is named. Enforcement: explicitly advisory prose (ARC-023) — self-graded during spell audit; no coded scorer verifies this dimension. |
74
78
  | Silver | + the output's structure or a template is given. |
75
79
  | Gold | + a user-verifiable **acceptance checklist** — how to know the spell did its job. |
76
80
 
@@ -78,7 +82,7 @@ spell to ship, regardless of overall target.
78
82
 
79
83
  | Tier | Bar |
80
84
  | --- | --- |
81
- | Bronze | Related spells are mentioned. |
85
+ | Bronze | Related spells are mentioned. Enforcement: explicitly advisory prose (ARC-023) — self-graded during spell audit; no coded scorer verifies this dimension. |
82
86
  | Silver | + correct hand-off direction (consumes-from X, feeds-into Y). |
83
87
  | Gold | + bidirectional and consistent with the flow in [[development-methodology]]. |
84
88
 
@@ -86,25 +90,29 @@ spell to ship, regardless of overall target.
86
90
 
87
91
  | Tier | Bar |
88
92
  | --- | --- |
89
- | Bronze | A `Rules` section exists. |
90
- | Silver | + required arguments are validated or requested; the spell refuses to proceed on clearly invalid input. |
93
+ | Bronze | A `Rules` section exists. Enforcement: explicitly advisory prose (ARC-023) — part of the D7 hard gate by name, but this specific bar is self-graded; no check verifies a spell prompt contains a `Rules` section. |
94
+ | Silver | + required arguments are validated or requested; the spell refuses to proceed on clearly invalid input. Enforcement: explicitly advisory prose (ARC-023) — part of the D7 hard gate by name, but this specific bar is self-graded; no check verifies input-validation behavior across spell prompts. |
91
95
  | Gold | + every destructive or outward-facing action (delete, force-push, publish, external post) is explicitly gated behind confirmation. |
92
96
 
93
97
  ### D8 — Conciseness & non-duplication
94
98
 
95
99
  | Tier | Bar |
96
100
  | --- | --- |
97
- | Bronze | No dead or contradictory text. |
101
+ | Bronze | No dead or contradictory text. Enforcement: explicitly advisory prose (ARC-023) — self-graded during spell audit; no coded scorer verifies this dimension. |
98
102
  | Silver | + shared logic is **referenced**, not copy-pasted (e.g. point to a governance doc rather than inlining it). |
99
103
  | Gold | + tight and single-responsibility — the spell does one job well. |
100
104
 
101
105
  ## Scoring & target
102
106
 
103
- - **Overall = lowest dimension score.**
104
- - **Hard gates:** D2 and D7 must each be **≥ Silver**.
107
+ - **Overall = lowest dimension score.** Enforcement: explicitly advisory prose (ARC-023) — self-graded
108
+ during spell audit; no coded scorer computes or verifies this aggregation.
109
+ - **Hard gates:** D2 and D7 must each be **≥ Silver**. Enforcement: explicitly advisory prose (ARC-023) —
110
+ self-graded during spell audit; only D2's Bronze floor is mechanically checked today, so this broader
111
+ gate is not fully verified by any coded scorer or workflow gate.
105
112
  - **Authoring target:** every shipped spell reaches **Silver overall, Gold on D2.** Gold-everywhere is
106
113
  aspirational, not required — chasing it on a mature spell usually adds bloat, not value. A short spell
107
- that meets every gate at Silver is **done**; do not pad it.
114
+ that meets every gate at Silver is **done**; do not pad it. Enforcement: explicitly advisory prose
115
+ (ARC-023) — self-graded during spell audit; no coded scorer verifies overall attainment.
108
116
 
109
117
  ## Distributability conventions (D2)
110
118
 
@@ -112,20 +120,33 @@ Arcane spells ship to other repositories and, eventually, open source. Keep them
112
120
 
113
121
  - **Never hard-code** an org name, person, venture, product, or machine name. Use a documented
114
122
  `{UPPER_SNAKE}` placeholder: `{ADO_ORG}`, `{ADO_PROJECT}`, `{BUSINESS_NAME}`, `{OPERATOR_NAME}`.
123
+ Enforcement: executable check (ARC-023) — same mechanism as D2 Bronze above: the `org-token-lint`
124
+ build gate (`scripts/org-token-lint.ts`) fails `npm run build` automatically; `spell ward --gate`
125
+ (`src/commands/ward.ts`) runs the same scan standalone but is not yet wired into CI.
115
126
  - **Resolution rule:** a placeholder resolves from `.arcane.json` or the feature/PRD frontmatter; if it
116
- is unset, the spell **asks** rather than assuming a default.
127
+ is unset, the spell **asks** rather than assuming a default. Enforcement: explicitly advisory prose
128
+ (ARC-023) — depends on each spell's own runtime judgment; no check exercises a spell's unset-placeholder
129
+ behavior.
117
130
  - **Roster by reference, not by name:** when a spell needs the concept of an agent role, reference
118
131
  [[agent-policies]] / [[naming-conventions]] as context (with a fallback) instead of naming personas
119
- inline.
132
+ inline. Enforcement: explicitly advisory prose (ARC-023) — self-graded during spell audit; no coded
133
+ scorer verifies this convention.
120
134
  - **Trackers are optional:** never assume Azure DevOps (or any single provider). Respect
121
135
  `tracking_mode` (internal/external) and detect the provider; the shared rules live in
122
- [[development-methodology]] — point to them rather than re-inlining ADO logic.
136
+ [[development-methodology]] — point to them rather than re-inlining ADO logic. Enforcement: explicitly
137
+ advisory prose (ARC-023) — self-graded during spell audit; no lint scans spell prompts for a
138
+ hard-coded tracker assumption.
123
139
 
124
140
  > **Maintainer-internal exemption.** A few spells operate *on the Arcane framework itself*
125
141
  > (e.g. `spell-bump`, `spell-arcane-version`) and legitimately reference repo internals like
126
142
  > `registry.ts`, `src/assets/`, or the `arcane-cli` package name. Such
127
143
  > **framework-self-referential** references do **not** count as a D2 violation. The exemption covers
128
144
  > only the framework's own internals — never a consuming org's venture, person, machine, or tracker names.
145
+ > **Enforcement: explicitly advisory prose (ARC-023) — depends on an auditor's judgment about what
146
+ > counts as framework-self-reference; `org-token-lint`'s denylist is derived only from package
147
+ > author/repository identity plus the operator-supplied `ARCANE_ORG_TOKENS` list, so these terms were
148
+ > never candidates for that scan regardless of this clause, and no check specifically verifies the
149
+ > carve-out itself.**
129
150
 
130
151
  ## How to audit a spell
131
152
 
@@ -133,3 +154,6 @@ For each dimension, score Bronze/Silver/Gold with one line of evidence. Record t
133
154
  score and flag any D2/D7 below Silver as **must-fix**. When elevating, prefer **additive** changes
134
155
  (add a fallback, an edge case, an acceptance line, a cross-reference); preserve the spell's intent and
135
156
  working prose, and treat any change to *behavior* (not just coverage) as requiring explicit sign-off.
157
+ **Enforcement: explicitly advisory prose (ARC-023) — this audit process, including the must-fix flag
158
+ and the sign-off convention, is self-graded during spell-enchant's review; no coded scorer or
159
+ workflow gate verifies it.**
@@ -12,10 +12,10 @@ Framework selection, coverage thresholds, and test evidence requirements across
12
12
 
13
13
  ## Executive Summary
14
14
 
15
- - Every tech stack has a designated test framework — no ambiguity.
15
+ - Every tech stack has a designated test framework — no ambiguity. **Enforcement: explicitly advisory prose (ARC-023) — no script or CI step verifies that code for a given stack was tested with its designated framework; the mapping is a team convention enforced only by code review.**
16
16
  - New code requires 80% unit test coverage; critical paths require 95%.
17
- - Lince (QA Lead) must sign off on test evidence before any ticket moves to "Resolved."
18
- - Test evidence is required in every PR: results, coverage report, known limitations.
17
+ - Lince (QA Lead) must sign off on test evidence before any ticket moves to "Resolved." **Enforcement: explicitly advisory prose (ARC-023) — a tracker-workflow convention Arcane's own tooling has no visibility into and cannot mechanically verify.**
18
+ - Test evidence is required in every PR: results, coverage report, known limitations. **Enforcement: explicitly advisory prose (ARC-023) — no CI step or PR template parses PR descriptions for these sections; `check:review-round` verifies review-approval state only, not test-evidence content.**
19
19
 
20
20
  ---
21
21
 
@@ -46,8 +46,8 @@ Framework selection, coverage thresholds, and test evidence requirements across
46
46
 
47
47
  | Category | Minimum Coverage | Examples |
48
48
  |----------|-----------------|----------|
49
- | **Standard code** | 80% | Business logic, data access, UI components, API handlers |
50
- | **Critical paths** | 95% | Authentication, payment processing, IoT firmware commands, calibration protocols, encryption/signing |
49
+ | **Standard code** | 80% | Business logic, data access, UI components, API handlers. Enforcement: executable check (ARC-023) — vitest.config.ts configures a global 80% lines/branches/functions/statements threshold under `coverage.thresholds`, but ci.yml's build-test Test step runs `npm test` (bare `vitest run`), not `npm run test:coverage`, so it is never evaluated in CI. |
50
+ | **Critical paths** | 95% | Authentication, payment processing, IoT firmware commands, calibration protocols, encryption/signing. Enforcement: executable check (ARC-023) — vitest.config.ts overrides this to 95% for src/modules/copier.ts, manifest.ts, merger.ts, registry.ts, and src/config/profiles.ts (manifest.ts's branches override is 90%, not 95%), but the same CI gap applies: `npm test` runs bare `vitest run`, not `npm run test:coverage`, so these overrides are never evaluated in CI. |
51
51
 
52
52
  ### What Counts as "Critical"
53
53
 
@@ -101,6 +101,8 @@ Every PR must include:
101
101
 
102
102
  ### Unit Tests (Required)
103
103
 
104
+ **Enforcement: executable check (ARC-023) — ci.yml's build-test job's Test step runs `npm test` (`vitest run`), which fails the job on any failing unit test; `.husky/pre-commit` runs only `lint` and `typecheck`, not tests, so the "every commit" portion of this rule is not locally enforced.**
105
+
104
106
  - Test individual functions/methods in isolation
105
107
  - Mock external dependencies (DB, API, hardware)
106
108
  - Fast execution (< 1 second per test)
@@ -108,18 +110,24 @@ Every PR must include:
108
110
 
109
111
  ### Integration Tests (Recommended)
110
112
 
113
+ **Enforcement: explicitly advisory prose (ARC-023) — self-labeled Recommended rather than Required, and ci.yml runs a single `npm test` step with no distinct integration-test job or gate.**
114
+
111
115
  - Test component interactions (API → DB, mobile → backend)
112
116
  - Use real dependencies where practical (in-memory DB, test containers)
113
117
  - Run in CI on PR creation and merge
114
118
 
115
119
  ### End-to-End Tests (For UI Stories)
116
120
 
121
+ **Enforcement: explicitly advisory prose (ARC-023) — no Playwright or other end-to-end job exists in ci.yml, and Arcane's own repository is a CLI tool with no UI for this rule to apply to.**
122
+
117
123
  - Test complete user workflows
118
124
  - Use browser automation (Playwright for web, Flutter integration_test for mobile)
119
125
  - Run in CI on merge to main (not on every commit — too slow)
120
126
 
121
127
  ### Firmware Tests ({BUSINESS_NAME}-Specific)
122
128
 
129
+ **Enforcement: explicitly advisory prose (ARC-023) — Arcane's own repository has no firmware or hardware target; this is template guidance for consuming projects that Arcane's own tooling does not verify.**
130
+
123
131
  - Host-based unit tests via PlatformIO Unity (no hardware required)
124
132
  - Hardware-in-the-loop tests for calibration validation (requires physical device)
125
133
  - BLE protocol tests via mock transport
@@ -130,14 +138,14 @@ Every PR must include:
130
138
 
131
139
  Adapt the ticket lifecycle policy to your tracker:
132
140
 
133
- The **Code Review → QA** transition now requires:
141
+ The **Code Review → QA** transition now requires: **Enforcement: explicitly advisory prose (ARC-023) — a tracker-workflow gate Arcane's own tooling cannot observe or enforce; items 1 and 2 below (tests passing, coverage thresholds) are independently verified by CI, but the transition itself is not.**
134
142
 
135
143
  1. All unit tests pass (CI green)
136
144
  2. Coverage meets thresholds (80% standard / 95% critical)
137
145
  3. No HIGH-severity review findings unresolved
138
146
  4. Lince signs off with test evidence linked to the work item
139
147
 
140
- The **QA → Resolved** transition requires:
148
+ The **QA → Resolved** transition requires: **Enforcement: explicitly advisory prose (ARC-023) — a tracker-workflow gate Arcane's own tooling cannot observe or enforce, the same gap ARC-023 identifies for the Lince sign-off rule above.**
141
149
 
142
150
  1. Integration tests pass (if applicable)
143
151
  2. Manual verification for UI stories (screenshot or recording)
@@ -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
 
@@ -15,59 +15,59 @@ See also: [[README]], [[DECISIONS]], [[governance/git-conventions|Git Convention
15
15
 
16
16
  ## Non-Negotiable Safety Rules
17
17
 
18
- 1. **Never access an encrypted or cross-OS volume you are not authorized to touch.** Do not suggest, execute, or recommend any action that would mount, read, or probe a drive outside the agent's authorized environment. This rule stands as defense-in-depth regardless of encryption status.
18
+ 1. **Never access an encrypted or cross-OS volume you are not authorized to touch. Enforcement: explicitly advisory prose (ARC-023) — depends on agent judgment about authorization boundaries; no script scans proposed commands for drive or volume access before execution.** Do not suggest, execute, or recommend any action that would mount, read, or probe a drive outside the agent's authorized environment. This rule stands as defense-in-depth regardless of encryption status.
19
19
 
20
- 2. **No root commands without justification.** Do not generate or suggest commands that run as root unless explicitly scoped and justified. The agent runtime should run as a dedicated non-root user by design. See [[security/hardening-checklist|Hardening Checklist]].
20
+ 2. **No root commands without justification. Enforcement: explicitly advisory prose (ARC-023) — depends on judgment about what justifies root scope; no script inspects generated commands for root usage before they run.** Do not generate or suggest commands that run as root unless explicitly scoped and justified. The agent runtime should run as a dedicated non-root user by design. See [[security/hardening-checklist|Hardening Checklist]].
21
21
 
22
- 3. **No secrets on the command line.** Never pass API keys, tokens, or secrets on the command line, in chat, or in config files. Use SecretRef (env vars) and `read -s` for interactive input.
22
+ 3. **No secrets on the command line. Enforcement: explicitly advisory prose (ARC-023) — no secret-scanner exists in this repo yet (tracked as future work, BC-30), so no mechanical check catches a violation.** Never pass API keys, tokens, or secrets on the command line, in chat, or in config files. Use SecretRef (env vars) and `read -s` for interactive input.
23
23
 
24
- 4. **This is a production system.** No "fix it later" shortcuts. No experimental changes without rollback plans.
24
+ 4. **This is a production system. Enforcement: explicitly advisory prose (ARC-023) — the no-shortcuts and rollback-plan requirements depend on engineering judgment; no check evaluates whether a rollback plan exists.** No "fix it later" shortcuts. No experimental changes without rollback plans.
25
25
 
26
26
  ---
27
27
 
28
28
  ## Documentation Rules
29
29
 
30
- 5. **Update `last_updated` frontmatter** whenever you edit a document. Every document must have YAML frontmatter with `audience`, `status`, `last_updated`, and `tags`.
30
+ 5. **Update `last_updated` frontmatter. Enforcement: explicitly advisory prose (ARC-023) — no lint validates frontmatter fields or verifies `last_updated` was bumped when a document changes.** whenever you edit a document. Every document must have YAML frontmatter with `audience`, `status`, `last_updated`, and `tags`.
31
31
 
32
- 6. **Log significant decisions in [[DECISIONS]].** Use the next sequential ADR number. Format: Date, Status, Context, Decision, Reasoning, Rejected alternatives.
32
+ 6. **Log significant decisions in [[DECISIONS]]. Enforcement: explicitly advisory prose (ARC-023) — whether a decision is "significant" enough to log is a judgment call; `check:adr-references` verifies that ADR citations resolve, not that decisions get logged in the first place.** Use the next sequential ADR number. Format: Date, Status, Context, Decision, Reasoning, Rejected alternatives.
33
33
 
34
- 7. **Use wiki-links for cross-references** (e.g., `[[DECISIONS#ADR-NNN|Short Title]]`, `[[journal/YYYY-MM-DD-topic-slug|Session Label]]`). This enables knowledge graph visualization.
34
+ 7. **Use wiki-links for cross-references. Enforcement: explicitly advisory prose (ARC-023) — no link-checker validates wiki-link usage or resolution across this repo's docs.** (e.g., `[[DECISIONS#ADR-NNN|Short Title]]`, `[[journal/YYYY-MM-DD-topic-slug|Session Label]]`). This enables knowledge graph visualization.
35
35
 
36
- 8. **Use Mermaid for diagrams** (` ```mermaid ` blocks) for all flow charts, architecture diagrams, and sequence diagrams. Directory trees stay as plain code blocks. Spell output describing state the spell already computed — not authored, freehand explanatory content — additionally follows the **generated state diagrams** convention ([ARC-036](https://github.com/codemagicianhq/arcane/blob/main/DECISIONS.md#arc-036--generated-state-diagrams-deterministic-mermaid-for-computed-spell-state)): a deterministic, data-derived Mermaid diagram built only from values already in scope, never modeled or invented. Skip it for one-line outputs, speed-rule spells, or any state with only a single reading — the diagram exists to make relationships between multiple already-computed values legible, not to decorate simple output.
36
+ 8. **Use Mermaid for diagrams. Enforcement: explicitly advisory prose (ARC-023) — no lint validates diagram block type or the generated-state-diagrams determinism convention.** (` ```mermaid ` blocks) for all flow charts, architecture diagrams, and sequence diagrams. Directory trees stay as plain code blocks. Spell output describing state the spell already computed — not authored, freehand explanatory content — additionally follows the **generated state diagrams** convention ([ARC-036](https://github.com/codemagicianhq/arcane/blob/main/DECISIONS.md#arc-036--generated-state-diagrams-deterministic-mermaid-for-computed-spell-state)): a deterministic, data-derived Mermaid diagram built only from values already in scope, never modeled or invented. Skip it for one-line outputs, speed-rule spells, or any state with only a single reading — the diagram exists to make relationships between multiple already-computed values legible, not to decorate simple output.
37
37
 
38
- 9. **Journal files use date-prefix naming:** `journal/YYYY-MM-DD-topic-slug.md` for chronological sorting.
38
+ 9. **Journal files use date-prefix naming. Enforcement: explicitly advisory prose (ARC-023) — `checkSessionContinuity` only verifies `journal/.gitkeep` exists, not that individual journal filenames follow the date-prefix pattern.** `journal/YYYY-MM-DD-topic-slug.md` for chronological sorting.
39
39
 
40
40
  ---
41
41
 
42
42
  ## Git Rules
43
43
 
44
- 10. **Never auto-commit during interactive sessions.** Stage changes and present the proposed commit message for human approval before executing `git commit`. This applies to Copilot, Claude Code, Codex, and any other interactive AI tool. The human decides when to commit. Exception: autonomous agents at Magus+ power level may self-commit within approved scope.
44
+ 10. **Never auto-commit during interactive sessions. Enforcement: structured spell gate (ARC-023) — `spell-commit-work`'s Step 8 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.** Stage changes and present the proposed commit message for human approval before executing `git commit`. This applies to Copilot, Claude Code, Codex, and any other interactive AI tool. The human decides when to commit. Exception: autonomous agents at Magus+ power level may self-commit within approved scope.
45
45
 
46
- 11. **Use Conventional Commits format** for all commit messages: `type(scope): description`. See [[governance/git-conventions|Git Conventions]] for types, scopes, and examples.
46
+ 11. **Use Conventional Commits format. Enforcement: explicitly advisory prose (ARC-023) — no commitlint or equivalent hook validates commit message 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`, `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]].
48
+ 12. **Agent attribution trailers. Enforcement: explicitly advisory prose (ARC-023) — `spell-commit-work`'s Step 7 documents the required trailers, but no hook or CI check verifies they are actually present on a given commit.** 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
- 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.
50
+ 13. **For runtime config changes. Enforcement: structured spell gate (ARC-023), hedged — `spell-commit-work`'s Step 8 operator-approval gate covers this commit like any other before it can be made, though it verifies diff/message approval rather than a dedicated confirmation that testing occurred.** (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
 
52
- 14. **Never commit directly to main.** All work — human or agent — happens on topic branches. Humans use `type/short-description`; agents use `{agent-slug}/type/short-description`. Main receives changes only through PR completion, not local direct merges. See [[governance/git-conventions#branch-discipline|Branch Discipline]].
52
+ 14. **Never commit directly to main. Enforcement: explicitly advisory prose (ARC-023) — `spell doctor`'s `checkPlatformBranchPolicy` verifies only the platform's merge-method policy (squash disallowed), not that direct pushes/commits to main are blocked.** All work — human or agent — happens on topic branches. Humans use `type/short-description`; agents use `{agent-slug}/type/short-description`. Main receives changes only through PR completion, not local direct merges. See [[governance/git-conventions#branch-discipline|Branch Discipline]].
53
53
 
54
54
  ---
55
55
 
56
56
  ## Spell Lifecycle
57
57
 
58
- 22. **Lifecycle operations run through their spell when one is installed.** Committing, opening a PR, opening or closing a session, reviewing code, and shipping each have a dedicated spell (`spell-commit-work`, `spell-create-pull-request`, `spell-open-session`/`spell-close-session`, `spell-review`, `spell-ship`). When the installed component set includes the matching spell, invoke it for that operation rather than improvising the workflow from general knowledge — even when the user does not name the spell explicitly. The intent→spell routing table injected into each client's L1 instruction file (`CLAUDE.md`, `.github/copilot-instructions.md`, `AGENTS.md`) is normative for this mapping, not illustrative.
58
+ 22. **Lifecycle operations run through their spell when one is installed. Enforcement: explicitly advisory prose (ARC-023) — invoking the correct spell instead of improvising depends on agent judgment; no check verifies that a matching spell was actually invoked for a given operation.** Committing, opening a PR, opening or closing a session, reviewing code, and shipping each have a dedicated spell (`spell-commit-work`, `spell-create-pull-request`, `spell-open-session`/`spell-close-session`, `spell-review`, `spell-ship`). When the installed component set includes the matching spell, invoke it for that operation rather than improvising the workflow from general knowledge — even when the user does not name the spell explicitly. The intent→spell routing table injected into each client's L1 instruction file (`CLAUDE.md`, `.github/copilot-instructions.md`, `AGENTS.md`) is normative for this mapping, not illustrative.
59
59
 
60
60
  ---
61
61
 
62
62
  ## Recommendation Guardrails (ADR-034)
63
63
 
64
- 15. **Flag actionable recommendations.** Any recommendation that could lead to a purchase, subscription, account creation, or irreversible action must: (a) be flagged explicitly, (b) use verified current information — never assume or fabricate, (c) present free/no-cost alternatives when they exist, (d) state confidence level if based on general knowledge. For >$50 or contracts, require explicit confirmation. See [[agents/agent-policies#actionable-recommendation-policy-adr-034|Full Policy]].
64
+ 15. **Flag actionable recommendations. Enforcement: explicitly advisory prose (ARC-023) — whether a recommendation is flagged, sourced, and confidence-rated depends on judgment; no automated check evaluates response content against this policy.** Any recommendation that could lead to a purchase, subscription, account creation, or irreversible action must: (a) be flagged explicitly, (b) use verified current information — never assume or fabricate, (c) present free/no-cost alternatives when they exist, (d) state confidence level if based on general knowledge. For >$50 or contracts, require explicit confirmation. See [[agents/agent-policies#actionable-recommendation-policy-adr-034|Full Policy]].
65
65
 
66
66
  ---
67
67
 
68
68
  ## Screenshot Curation
69
69
 
70
- 15. **Curate screenshots — not every screenshot needs saving.** Use these heuristics:
70
+ 24. **Curate screenshots — not every screenshot needs saving. Enforcement: explicitly advisory prose (ARC-023) — which screenshots to keep is a judgment call; no check evaluates screenshot-retention decisions.** Use these heuristics:
71
71
  - **Save** when it shows a completed setup, config state, UI result, or evidence of a problem/fix.
72
72
  - **Save** when the user explicitly says "save this" or "add this to docs."
73
73
  - **Save key decision points and final states** in multi-step flows; skip intermediate steps.
@@ -80,7 +80,7 @@ See also: [[README]], [[DECISIONS]], [[governance/git-conventions|Git Convention
80
80
 
81
81
  ## Sensitive Repositories
82
82
 
83
- 21. **Reference, don't transcribe, when the repository is marked sensitive.** If
83
+ 21. **Reference, don't transcribe, when the repository is marked sensitive. Enforcement: explicitly advisory prose (ARC-023) — whether written output cites versus transcribes sensitive content depends on judgment; no check scans agent output for this distinction.** If
84
84
  `.arcane.json` has `content_sensitivity: "sensitive"`, the repository's own
85
85
  documents are the sensitive material — not just credentials inside them. In
86
86
  that mode:
@@ -106,7 +106,7 @@ See also: [[README]], [[DECISIONS]], [[governance/git-conventions|Git Convention
106
106
 
107
107
  ## Naming Conventions
108
108
 
109
- 16. **Three naming tiers — never mix them:**
109
+ 16. **Three naming tiers — never mix them. Enforcement: explicitly advisory prose (ARC-023) — `spell ward` and `org-token-lint` scan for denylisted org/venture/customer names, not for adherence to this tier taxonomy; no check verifies tier consistency.**
110
110
 
111
111
  | Tier | What | Style | Examples |
112
112
  |------|------|-------|---------|
@@ -114,19 +114,19 @@ See also: [[README]], [[DECISIONS]], [[governance/git-conventions|Git Convention
114
114
  | AI Agents | Autonomous agents | Persona name + role title | Merlin — CTO, Kellar — Product Ops |
115
115
  | Systems/Services | DBs, APIs, tools | Functional `[slug]-[function]` | `inventory-api`, `orders-worker` |
116
116
 
117
- 17. **Projects and repos follow a consistent naming convention.** Pick one (TitleCase or kebab-case) and apply it uniformly across your org.
117
+ 17. **Projects and repos follow a consistent naming convention. Enforcement: explicitly advisory prose (ARC-023) — no check verifies TitleCase/kebab-case consistency across projects and repos.** Pick one (TitleCase or kebab-case) and apply it uniformly across your org.
118
118
 
119
119
  ---
120
120
 
121
121
  ## Operational Rules
122
122
 
123
- 18. **TODO.md is a scratchpad.** Resolved items move to the relevant doc, then get deleted from TODO.md.
123
+ 18. **TODO.md is a scratchpad. Enforcement: explicitly advisory prose (ARC-023) — `checkSessionContinuity` verifies TODO.md exists, not that resolved items are removed from it.** Resolved items move to the relevant doc, then get deleted from TODO.md.
124
124
 
125
- 19. **After any onboarding or config wizard**, re-validate authentication and network-exposure settings — wizards can silently downgrade security settings.
125
+ 19. **After any onboarding or config wizard. Enforcement: explicitly advisory prose (ARC-023) — no wizard or check re-validates authentication and network-exposure settings after configuration changes.**, re-validate authentication and network-exposure settings — wizards can silently downgrade security settings.
126
126
 
127
- 20. **For repo path requests**, perform read-only discovery before claiming "no access." Use [[agents/agent-approved-paths|Agent Approved Paths Registry]].
127
+ 20. **For repo path requests. Enforcement: explicitly advisory prose (ARC-023) — performing read-only discovery before claiming no access depends on agent judgment; no check verifies this behavior occurred.**, perform read-only discovery before claiming "no access." Use [[agents/agent-approved-paths|Agent Approved Paths Registry]].
128
128
 
129
- 23. **Diff before deleting a "duplicate."** When housekeeping surfaces two blocks of content that look
129
+ 23. **Diff before deleting a "duplicate." Enforcement: explicitly advisory prose (ARC-023) — the branch-specific case this generalizes from has a structured procedure (git-conventions.md's Content-Verified Branch Deletion), but no equivalent structured check exists for arbitrary documents, configs, or data files.** When housekeeping surfaces two blocks of content that look
130
130
  like duplicates — in a document, a config, a data file — compare them in full before removing
131
131
  either. A near-identical pair is usually a **drifted copy carrying unique content in one and not the
132
132
  other**, not byte-identical redundancy; deleting on sight can destroy the unique content silently.