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.
@@ -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
@@ -12,7 +12,7 @@ Pipeline patterns, branch policies, and deployment gates for all your projects.
12
12
 
13
13
  ## Executive Summary
14
14
 
15
- - Every code repository must have a CI pipeline that runs on PR creation and merge to main.
15
+ - Every code repository must have a CI pipeline that runs on PR creation and merge to main. **Enforcement: explicitly advisory prose (ARC-023) — prescriptive guidance for repos Prospero provisions; Arcane's own tooling does not enumerate an organization's repositories to verify each one has a CI pipeline.**
16
16
  - Branch policies enforce PR requirements: build must pass, reviewer required, work item linked.
17
17
  - Terraform changes use plan-on-PR / apply-on-merge with manual approval gates.
18
18
  - Prospero owns pipeline creation and maintenance across all repos.
@@ -39,12 +39,12 @@ Applied to all code repositories (not docs-only repos per ADR-048):
39
39
 
40
40
  | Policy | Setting | Rationale |
41
41
  |--------|---------|-----------|
42
- | **Require PR** | All branches → main | No direct pushes to main |
43
- | **Minimum reviewers** | 1 (Lince for code, Merlin for architecture) | Quality gate |
44
- | **Build validation** | CI pipeline must pass | No merging broken code |
45
- | **Work item linking** | Required (when ticketing active) | Traceability |
46
- | **Comment resolution** | All comments must be resolved | No ignored feedback |
47
- | **Merge type** | Merge (no fast-forward) or Rebase and fast-forward — Squash disallowed | Preserves per-commit attribution trailers (ARC-009 §7); see [[git-conventions#Azure DevOps PR Merge Type]] |
42
+ | **Require PR** | All branches → main | No direct pushes to main. Enforcement: explicitly advisory prose (ARC-023) — prescriptive for consumer Azure DevOps repos; no Arcane check verifies a PR-required policy is configured. |
43
+ | **Minimum reviewers** | 1 (Lince for code, Merlin for architecture) | Quality gate. Enforcement: explicitly advisory prose (ARC-023) — prescriptive for consumer Azure DevOps repos; no Arcane check verifies configured reviewer counts. |
44
+ | **Build validation** | CI pipeline must pass | No merging broken code. Enforcement: explicitly advisory prose (ARC-023) — prescriptive for consumer Azure DevOps repos; no Arcane check verifies a build-validation policy is configured. |
45
+ | **Work item linking** | Required (when ticketing active) | Traceability. Enforcement: explicitly advisory prose (ARC-023) — prescriptive for consumer Azure DevOps repos; no Arcane check verifies it. |
46
+ | **Comment resolution** | All comments must be resolved | No ignored feedback. Enforcement: explicitly advisory prose (ARC-023) — prescriptive for consumer Azure DevOps repos; no Arcane check verifies a comment-resolution policy is configured. |
47
+ | **Merge type** | Merge (no fast-forward) or Rebase and fast-forward — Squash disallowed | Preserves per-commit attribution trailers (ARC-009 §7); see [[git-conventions#Azure DevOps PR Merge Type]]. Enforcement: verified external platform policy (ARC-023) — `spell doctor`'s `checkPlatformBranchPolicy` (src/commands/doctor.ts, backed by src/modules/platform-policy.ts's evaluateGitHubMergePolicy/evaluateAdoMergePolicy) queries live GitHub Rulesets or Azure DevOps branch policy and verifies the effective merge methods match this ladder — a local, on-demand CLI check the operator runs, not a check wired into CI itself. |
48
48
 
49
49
  For docs-only repos (Arcane):
50
50
  - PR not required (ADR-048 allows local ff-only merge for docs)
@@ -64,7 +64,7 @@ glob, and deliberately just one entry: `docs/**`/`journal/**`/`.arcane/governanc
64
64
  directory-wide excludes would ALSO exclude any non-Markdown file a consumer happens to place in
65
65
  those directories (a build script, a manifest, tooling config) — silently violating ARC-022's own
66
66
  unconditional requirement that scripts, manifests, lockfiles, migrations, containers, and
67
- infrastructure always remain triggering inputs, regardless of which directory they live in. Filetype-scoping to
67
+ infrastructure always remain triggering inputs, regardless of which directory they live in. **Enforcement: explicitly advisory prose (ARC-023) — prescriptive for the Azure DevOps template this repo ships to consumers; Arcane has no shipped `azure-pipelines.yml` file of its own to check parity against, and cannot verify a downstream repo kept the filter filetype-scoped.** Filetype-scoping to
68
68
  `**/*.md` closes that gap: only actual Markdown files are excluded, anywhere in the tree; anything
69
69
  else — including a `.md`-adjacent script — still triggers CI by default.
70
70
 
@@ -111,7 +111,7 @@ steps:
111
111
  Previously had no path filter at all — fail-safe (never misses a code change) but wasteful (a
112
112
  pure docs commit still burns a full pipeline run). Fail-safe path filter (ARC-022): the same
113
113
  filetype-scoped `**/*.md` **exclude** entry as the .NET template above — never a directory-wide
114
- exclude, and never an include list.
114
+ exclude, and never an include list. **Enforcement: explicitly advisory prose (ARC-023) — prescriptive for the Azure DevOps template this repo ships to consumers; Arcane has no shipped `azure-pipelines.yml` file of its own to check parity against, and cannot verify a downstream repo kept this filter filetype-scoped.**
115
115
 
116
116
  ```yaml
117
117
  trigger:
@@ -149,7 +149,7 @@ steps:
149
149
  ### Terraform Pipeline
150
150
 
151
151
  An **include** filter is correct here, not the ARC-022 anti-pattern — but only if it's a
152
- **filetype** glob, not a directory-prefix one. An earlier version of this template included only
152
+ **filetype** glob, not a directory-prefix one. **Enforcement: explicitly advisory prose (ARC-023) — prescriptive for the Azure DevOps template this repo ships to consumers; Arcane has no shipped `azure-pipelines.terraform.yml` file of its own to check parity against, and cannot verify a downstream repo kept the include filter filetype-scoped rather than directory-prefixed.** An earlier version of this template included only
153
153
  `infrastructure/terraform/**`: a directory-prefix pattern that silently misses any `.tf` file
154
154
  added *outside* that one named directory (a new `modules/**` root, a renamed infra folder) —
155
155
  exactly the "new code locations fail open" failure ARC-022 rejects, and exactly what EF-22's own
@@ -244,7 +244,7 @@ steps:
244
244
  CI skip/run decisions are based **only on changed paths** — never on commit message, author
245
245
  identity, or branch name. Do not add a *new* mechanism (a custom `docs(...)`-style commit-prefix
246
246
  convention, a bot rule, a pipeline-level check) that lets a commit opt itself out of validation by
247
- what it *says* rather than what it *changed*.
247
+ what it *says* rather than what it *changed*. **Enforcement: explicitly advisory prose (ARC-023) — prescriptive guidance for Azure DevOps consumer pipelines; this repo's own `.github/workflows/ci.yml` runs unconditionally on every push/PR to `main` with no path filter at all, so it neither implements nor is bound by this pattern, and no Arcane check inspects a downstream repo's CI configuration for compliance.**
248
248
 
249
249
  Commit messages, authorship, and branch names are attacker-controlled metadata — anyone who can
250
250
  push a commit controls all three. A CI-skip mechanism keyed on any of them is a bypass primitive:
@@ -253,7 +253,7 @@ actually touched. Path-based filtering (above) is the only trust signal this rep
253
253
  recognizes, because the pipeline itself independently observes the changed paths rather than
254
254
  trusting a claim embedded in the commit.
255
255
 
256
- **Know the platform default, don't assume this rule alone controls it.** Azure Pipelines honors
256
+ **Know the platform default, don't assume this rule alone controls it. Enforcement: explicitly advisory prose (ARC-023) — this paragraph discloses a residual platform-level gap; it is not a mechanism Arcane enforces.** Azure Pipelines honors
257
257
  `[skip ci]`, `[ci skip]`, `skip-checks: true`, `[skip azurepipelines]`, `[skip azpipelines]`,
258
258
  `[skip azp]`, and `***NO_CI***` in a pushed commit message **by default**, on `trigger:`-driven
259
259
  runs — this is platform behavior, not something a consumer opts into, and this governance rule
@@ -283,7 +283,7 @@ adopted exclude-based YAML triggers), a change to a new top-level code directory
283
283
  triggers the pipeline (YAML is fail-safe) but does **not** require it to pass before merge (branch
284
284
  policy is not) — the build can run, fail, and be ignored, or the PR can merge before it finishes.
285
285
  Whenever a pipeline's YAML trigger scope changes, the branch policy's own path filter (if it has
286
- one) must be reviewed and updated to match or be a strict superset — never left narrower.
286
+ one) must be reviewed and updated to match or be a strict superset — never left narrower. **Enforcement: explicitly advisory prose (ARC-023) — prescriptive for consumer Azure DevOps projects; Arcane has no visibility into a downstream repo's branch-policy path-filter configuration and cannot verify the two stay aligned.**
287
287
 
288
288
  ---
289
289
 
@@ -291,9 +291,9 @@ one) must be reviewed and updated to match or be a strict superset — never lef
291
291
 
292
292
  | Environment | Gate | Who Approves |
293
293
  |-------------|------|-------------|
294
- | **Staging** | CI passes + PR approved | Automatic on merge |
295
- | **Production** | Staging verified + manual approval | Human (operator) |
296
- | **Terraform apply** | Plan reviewed + Checkov clean | Human (operator) |
294
+ | **Staging** | CI passes + PR approved | Automatic on merge. Enforcement: explicitly advisory prose (ARC-023) — describes a consumer Azure DevOps pipeline's intended gating; Arcane does not verify a downstream repo's environment configuration. |
295
+ | **Production** | Staging verified + manual approval | Human (operator). Enforcement: explicitly advisory prose (ARC-023) — describes a consumer Azure DevOps environment's approval configuration; Arcane does not verify it is actually configured. |
296
+ | **Terraform apply** | Plan reviewed + Checkov clean | Human (operator). Enforcement: explicitly advisory prose (ARC-023) — describes a consumer Azure DevOps pipeline's manual-apply step; Arcane does not verify it is actually configured. |
297
297
 
298
298
  ---
299
299
 
@@ -67,8 +67,7 @@ with EU visitors signing up for a free product is a plausible trigger; a company
67
67
  not, but "zero" needs to be an actual verified fact about the user base, not an assumption based on
68
68
  where the company is headquartered.
69
69
 
70
- **Rule (CS-01):** Determine GDPR applicability from the actual or intended user base's location and
71
- what the processing does, never from the business's own location alone.
70
+ **Rule (CS-01): Determine GDPR applicability from the actual or intended user base's location and what the processing does, never from the business's own location alone. Enforcement: explicitly advisory prose (ARC-023) — GDPR applicability turns on real-world facts about a specific business's actual user base and processing, a legal/business judgment call no Arcane mechanism observes or verifies.**
72
71
 
73
72
  ### CS-02: A lawful basis and enforceable data-subject rights
74
73
 
@@ -80,8 +79,7 @@ Requests exercising these rights carry a response deadline (commonly one month,
80
79
  cases) — a rights-request process that has no defined owner or turnaround time is itself a gap, even
81
80
  before any request arrives.
82
81
 
83
- **Rule (CS-02):** Document a lawful basis per processing category, and maintain a working process — with
84
- a defined owner and turnaround time — for handling data-subject rights requests.
82
+ **Rule (CS-02): Document a lawful basis per processing category, and maintain a working process — with a defined owner and turnaround time — for handling data-subject rights requests. Enforcement: explicitly advisory prose (ARC-023) — whether a lawful basis is properly documented and a rights-request process actually functions is a substantive judgment about the downstream product's own operations; `spell-compliance` can only ask and report on it, never verify or gate on it.**
85
83
 
86
84
  ### CS-03: 72-hour breach notification
87
85
 
@@ -90,8 +88,7 @@ relevant supervisory authority within 72 hours of the organization becoming awar
90
88
  starts at awareness, not at confirmation of scope — an incident-response process that only begins
91
89
  drafting a notification after a full investigation completes risks missing the window entirely.
92
90
 
93
- **Rule (CS-03):** Have a breach-notification process that can produce an initial report to the
94
- supervisory authority within 72 hours of awareness, even before the full scope of an incident is known.
91
+ **Rule (CS-03): Have a breach-notification process that can produce an initial report to the supervisory authority within 72 hours of awareness, even before the full scope of an incident is known. Enforcement: explicitly advisory prose (ARC-023) — whether an incident-response process would actually meet the 72-hour window in a real breach is a judgment call about the team's own readiness that no Arcane mechanism tests.**
95
92
 
96
93
  ---
97
94
 
@@ -107,9 +104,7 @@ number here as current). Covered businesses must honor consumer rights to know w
107
104
  it, correct inaccuracies, and opt out of the sale or sharing of their personal information, plus limit
108
105
  use of sensitive personal information on request.
109
106
 
110
- **Rule (CS-04):** Verify CCPA's current statutory thresholds against the business's actual revenue and
111
- data volume, rather than assuming applicability (or non-applicability) from the business's category
112
- alone.
107
+ **Rule (CS-04): Verify CCPA's current statutory thresholds against the business's actual revenue and data volume, rather than assuming applicability (or non-applicability) from the business's category alone. Enforcement: explicitly advisory prose (ARC-023) — confirming current statutory thresholds against a business's actual revenue and data volume is a legal/business determination outside anything Arcane can check itself.**
113
108
 
114
109
  ### CS-05: A real opt-out mechanism, not just a policy statement
115
110
 
@@ -119,9 +114,7 @@ or an equivalent global-privacy-control-honoring mechanism. Stating an opt-out r
119
114
  policy's prose, without a working mechanism a consumer can actually use, does not satisfy the
120
115
  requirement.
121
116
 
122
- **Rule (CS-05):** Verify the opt-out mechanism itself functions end-to-end — a link that exists in the
123
- footer but doesn't actually stop the described sharing is not compliant, regardless of what the privacy
124
- policy says.
117
+ **Rule (CS-05): Verify the opt-out mechanism itself functions end-to-end — a link that exists in the footer but doesn't actually stop the described sharing is not compliant, regardless of what the privacy policy says. Enforcement: explicitly advisory prose (ARC-023) — `spell-compliance`'s Phase 2 only checks whether an opt-out mechanism's indicators are present, not whether it actually stops sharing end-to-end, so confirming real function stays a human verification step.**
125
118
 
126
119
  ---
127
120
 
@@ -135,8 +128,7 @@ feature), and distinguishable from other terms — not buried in a general terms
135
128
  Pre-ticked checkboxes, and consent bundled with acceptance of unrelated terms, do not qualify as valid
136
129
  consent under either framework.
137
130
 
138
- **Rule (CS-06):** Any consent mechanism must be opt-in (not pre-ticked), specific to its actual purpose,
139
- and separable from acceptance of unrelated terms.
131
+ **Rule (CS-06): Any consent mechanism must be opt-in (not pre-ticked), specific to its actual purpose, and separable from acceptance of unrelated terms. Enforcement: explicitly advisory prose (ARC-023) — `spell-compliance` can render a PASS/FAIL/PARTIAL judgment on a consent mechanism in its report, but that report only surfaces a finding for a human to act on and never gates a workflow, so consent validity remains a judgment call.**
140
132
 
141
133
  ### CS-07: A data inventory is the load-bearing prerequisite
142
134
 
@@ -146,8 +138,7 @@ Records of Processing Activities under GDPR Article 30), every downstream rights
146
138
  obligation is unenforceable in practice, even if a policy document claims it's honored — there is no way
147
139
  to actually locate everything that would need to be produced, corrected, or deleted.
148
140
 
149
- **Rule (CS-07):** Maintain a data inventory naming what personal data is collected, where it's stored,
150
- and why, before treating any rights-request or retention process as operational.
141
+ **Rule (CS-07): Maintain a data inventory naming what personal data is collected, where it's stored, and why, before treating any rights-request or retention process as operational. Enforcement: explicitly advisory prose (ARC-023) — `spell-compliance` can surface whether a data-inventory document exists, but it neither verifies the inventory's accuracy nor blocks any workflow on its presence, leaving completeness a human-verified judgment call.**
151
142
 
152
143
  ### CS-08: Retention periods must be defined and actually enforced
153
144
 
@@ -156,8 +147,7 @@ actually deleting it at the end of that period — not simply flagging a record
156
147
  while the underlying data persists indefinitely. An undefined retention period is itself a gap, distinct
157
148
  from and prior to the question of whether deletion is correctly implemented.
158
149
 
159
- **Rule (CS-08):** Define a retention period per data category, and verify deletion is real (data is
160
- actually removed, not merely deactivated) at the end of that period.
150
+ **Rule (CS-08): Define a retention period per data category, and verify deletion is real (data is actually removed, not merely deactivated) at the end of that period. Enforcement: explicitly advisory prose (ARC-023) — whether deletion is actually real rather than merely deactivated requires inspecting the downstream product's live data stores, which is outside anything Arcane's static, read-only self-assessment observes.**
161
151
 
162
152
  ---
163
153
 
@@ -174,9 +164,7 @@ suitably designed at a single point in time; a **Type II** report attests that t
174
164
  operated effectively over an observation period (commonly 3-12 months) — a Type I report does not
175
165
  substitute for a Type II when a customer's requirement specifically calls for one.
176
166
 
177
- **Rule (CS-09):** Confirm which Trust Services Criteria and which report type (I vs. II) a customer's
178
- actual requirement calls for before scoping a SOC 2 engagement — do not assume Security-only Type I
179
- satisfies a requirement that wasn't explicitly checked against what was asked for.
167
+ **Rule (CS-09): Confirm which Trust Services Criteria and which report type (I vs. II) a customer's actual requirement calls for before scoping a SOC 2 engagement — do not assume Security-only Type I satisfies a requirement that wasn't explicitly checked against what was asked for. Enforcement: explicitly advisory prose (ARC-023) — what a specific customer or auditor actually requires is an external fact no Arcane mechanism observes, so confirming it against a live requirement is inherently a human step.**
180
168
 
181
169
  ### CS-10: Access control and audit logging are the operational backbone
182
170
 
@@ -186,8 +174,7 @@ sensitive systems sufficient to reconstruct who did what and when. These are the
186
174
  controls a real security program needs regardless of whether a SOC 2 report is ever pursued — building
187
175
  them only when an audit is scheduled means starting the evidentiary trail late.
188
176
 
189
- **Rule (CS-10):** Implement least-privilege access control, periodic access review, and audit logging of
190
- access to customer-data-holding systems as an ongoing practice, not as audit-time preparation.
177
+ **Rule (CS-10): Implement least-privilege access control, periodic access review, and audit logging of access to customer-data-holding systems as an ongoing practice, not as audit-time preparation. Enforcement: explicitly advisory prose (ARC-023) — this doc states the obligation and points to `threat-model.md`/`hardening-checklist.md` for the control detail without restating or itself verifying it, so no executable check or platform-policy verification is wired to this rule here.**
191
178
 
192
179
  ---
193
180
 
@@ -202,9 +189,7 @@ typical consumer SaaS product with no health-data handling does not trigger HIPA
202
189
  users who happen to be patients elsewhere; the trigger is the product's own handling of PHI, not its
203
190
  users' medical status in general.
204
191
 
205
- **Rule (CS-11):** Confirm HIPAA applicability specifically against whether the product creates,
206
- receives, maintains, or transmits PHI as a covered entity or business associate — do not assume
207
- applicability (or safety from it) based on the target market alone.
192
+ **Rule (CS-11): Confirm HIPAA applicability specifically against whether the product creates, receives, maintains, or transmits PHI as a covered entity or business associate — do not assume applicability (or safety from it) based on the target market alone. Enforcement: explicitly advisory prose (ARC-023) — whether a product actually creates, receives, maintains, or transmits PHI is a factual/legal determination about that specific product that no Arcane mechanism observes.**
208
193
 
209
194
  ---
210
195
 
@@ -226,8 +211,7 @@ applicability (or safety from it) based on the target market alone.
226
211
  starts from real evidence rather than a scramble. HIPAA (CS-11) becomes relevant only if the business
227
212
  is entering healthcare specifically, at whatever stage that happens.
228
213
 
229
- **Rule (CS-12):** Use product stage as a prompt to re-check applicability, not as a substitute for
230
- checking it — a pre-launch product with EU beta users is already in GDPR's scope regardless of stage.
214
+ **Rule (CS-12): Use product stage as a prompt to re-check applicability, not as a substitute for checking it — a pre-launch product with EU beta users is already in GDPR's scope regardless of stage. Enforcement: explicitly advisory prose (ARC-023) — using product stage as a prompt to re-check applicability is itself guidance about when to apply judgment, not a mechanically checkable condition.**
231
215
 
232
216
  ## Related
233
217
 
@@ -44,7 +44,7 @@ This is not a rare edge case specific to any one product; it is a structural pro
44
44
 
45
45
  The only valid evidence of a successful write is: perform the write, then reload or re-fetch through a path independent of the one that performed the write (a fresh page load, a separate read API call, a different client), then compare the observed value against intent field by field. A screenshot taken without reloading, or a success message read from the same response that carried the write, proves only that the interface accepted input — never that the input was stored.
46
46
 
47
- **Rule (EV-01):** Persisted state is proved by re-reading it, never by the interface that accepted it.
47
+ **Rule (EV-01): Persisted state is proved by re-reading it, never by the interface that accepted it. Enforcement: explicitly advisory prose (ARC-023) — which read path counts as genuinely independent varies by system and is a judgment call applied case-by-case at the point of use, not a property a script can verify after the fact.**
48
48
 
49
49
  ### EV-02: A green pipeline does not mean the live system reflects the change
50
50
 
@@ -54,7 +54,7 @@ The only assertion that counts as evidence is against the actual served artifact
54
54
 
55
55
  This also cuts the other way: a live check performed in the same breath as a *confirmed-successful* deploy may legitimately still show the old state for a short window — propagation, cache invalidation, and instance rollout all take real time. A mismatch observed immediately after a successful deploy is not by itself proof the deploy failed; it is grounds to wait a short, bounded interval and re-check the served artifact again before escalating. What distinguishes this from ignoring a real failure is that the re-check still has to happen and still has to pass — the propagation window is a reason to retry the observation, never a reason to skip it.
56
56
 
57
- **Rule (EV-02):** A green exit status from a deploy or pipeline step is evidence that the pipeline ran, not that the live system reflects the change — verify against the served artifact itself, allowing a short, bounded propagation window before treating a fresh mismatch as failure.
57
+ **Rule (EV-02): A green exit status from a deploy or pipeline step is evidence that the pipeline ran, not that the live system reflects the change — verify against the served artifact itself, allowing a short, bounded propagation window before treating a fresh mismatch as failure. Enforcement: explicitly advisory prose (ARC-023) — what counts as a short, bounded window versus a genuine failure depends on the specific target system and cannot be fixed as a general mechanical threshold.**
58
58
 
59
59
  ---
60
60
 
@@ -66,7 +66,7 @@ Some external tools expose their own summary of current state alongside the acti
66
66
 
67
67
  Retrying the identical automated input against a control that just silently dropped it is not a fix — it is a repeat of the same conditions that produced the drop, and it will typically produce the same silent drop again. If the input path is the problem (a field the automation can't reach correctly, a save handler that doesn't fire for scripted events, a control that requires a human-timed interaction the automation collapses), no number of retries changes that. What changes it is a different path: a human operator performing the same step by hand, since a human interacting normally exercises the code path the interface was actually built for.
68
68
 
69
- **Rule (EV-03):** When a console or tool's own state readout disagrees with what you intended to set, trust the readout over the action's apparent success, and hand the step to a human operator rather than retrying the same automated input blindly.
69
+ **Rule (EV-03): When a console or tool's own state readout disagrees with what you intended to set, trust the readout over the action's apparent success, and hand the step to a human operator rather than retrying the same automated input blindly. Enforcement: explicitly advisory prose (ARC-023) — recognizing a genuine disagreement and deciding to stop and escalate are judgment calls made in the moment; this document states the discipline but does not itself implement or require a gate.**
70
70
 
71
71
  ---
72
72
 
@@ -80,7 +80,7 @@ The dangerous part is what "slightly different" does at the comparison site. Equ
80
80
 
81
81
  The fix is scope discipline: a value that will be compared verbatim carries only the characters the comparison expects, full stop. Explanation belongs in a comment beside the value's declaration, in a separate field, or in documentation — never folded into the value itself.
82
82
 
83
- **Rule (EV-04):** A value that will be compared elsewhere by exact string equality must never carry explanatory commentary appended or interleaved into the same string.
83
+ **Rule (EV-04): A value that will be compared elsewhere by exact string equality must never carry explanatory commentary appended or interleaved into the same string. Enforcement: explicitly advisory prose (ARC-023) — identifying which values are comparison-critical and what counts as appended commentary is a semantic judgment about intent, not a syntactic pattern a generic mechanical check can detect across arbitrary code and data.**
84
84
 
85
85
  ### EV-05: Enumerate before you write to shared external state
86
86
 
@@ -90,7 +90,7 @@ Two operations look interchangeable at the call site but are not: an additive op
90
90
 
91
91
  The failure this produces is also delayed and displaced: whatever else depended on the value you overwrote breaks only when that other thing is next exercised, which may be long after and far away from the change that actually caused it — making the eventual failure much harder to trace back to its cause than if the destructive write had failed loudly at the time. Enumerating the current value first, before deciding what to write, is what makes the additive-vs-replace choice an informed one rather than a guess.
92
92
 
93
- **Rule (EV-05):** Before writing to a piece of externally-shared state you did not create and do not fully control, first enumerate its current full value, and prefer an additive operation over a create-or-replace operation whenever the system offers both.
93
+ **Rule (EV-05): Before writing to a piece of externally-shared state you did not create and do not fully control, first enumerate its current full value, and prefer an additive operation over a create-or-replace operation whenever the system offers both. Enforcement: explicitly advisory prose (ARC-023) — recognizing which state is shared and not fully owned, and weighing additive against replace, is a case-by-case judgment about a specific external system, not a general invariant a script can verify.**
94
94
 
95
95
  ---
96
96
 
@@ -102,7 +102,7 @@ Many external systems separate the act of accepting a write from the act of refl
102
102
 
103
103
  The trap runs the other direction too, though: propagation lag is a real phenomenon, not a universal excuse, and it is easy to reach for as an explanation precisely because it requires no further investigation. Before attributing a "not found" to lag, verify the underlying resource independently, through a check that does not depend on the same status system that's reporting the problem — fetch the resource directly with a plain client, resolve a record against an independent resolver, query the actual target rather than a summary of it. If the independent check also fails, there is a real problem to fix, and lag was never the explanation. Only once the real, checkable causes are ruled out does "still propagating" become a legitimate conclusion rather than a guess dressed up as one.
104
104
 
105
- **Rule (EV-06):** A status of "not found" / "could not fetch" / "pending" observed immediately after submitting or registering something with an external system is often propagation lag in that system's own status reporting rather than a real failure — but before concluding it is lag, independently verify the underlying resource through a different, direct check, and only attribute the status to lag once the real, checkable causes have been ruled out.
105
+ **Rule (EV-06): A status of "not found" / "could not fetch" / "pending" observed immediately after submitting or registering something with an external system is often propagation lag in that system's own status reporting rather than a real failure — but before concluding it is lag, independently verify the underlying resource through a different, direct check, and only attribute the status to lag once the real, checkable causes have been ruled out. Enforcement: explicitly advisory prose (ARC-023) — distinguishing genuine propagation lag from a real failure depends on judgment about the specific system involved, not a property a generic mechanical check can decide.**
106
106
 
107
107
  ---
108
108
 
@@ -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
@@ -64,8 +64,7 @@ release, with its own binary assignment and its own country list. An operator wh
64
64
  release turn green will reasonably conclude the app is live to the public — it is not, and nothing in
65
65
  the console actively corrects that assumption.
66
66
 
67
- **Rule (MR-01):** Treat each Google Play track as an independent release requiring its own review and
68
- its own configuration; passing review on one track never promotes the binary to another.
67
+ **Rule (MR-01): Treat each Google Play track as an independent release requiring its own review and its own configuration; passing review on one track never promotes the binary to another. Enforcement: structured spell gate (ARC-023) — spell-eas-store-deploy opens its Google Play section with this exact rule as a read-first prerequisite, so no per-track setup or deployment step proceeds under the wrong assumption that another track's review already covers it.**
69
68
 
70
69
  ### MR-02: A fresh production track starts with zero countries — and fails silently about why
71
70
 
@@ -75,8 +74,7 @@ with your release / To save, fix errors" that never names the actual cause. The
75
74
  summary reading `0 countries / regions` — set the country list on the track before attempting to build
76
75
  the release, not after the generic error appears.
77
76
 
78
- **Rule (MR-02):** Before building a release for any Google Play track, confirm its country/region list
79
- is non-empty; a generic "fix errors" message with no named cause is this failure's signature.
77
+ **Rule (MR-02): Before building a release for any Google Play track, confirm its country/region list is non-empty; a generic "fix errors" message with no named cause is this failure's signature. Enforcement: structured spell gate (ARC-023) — spell-eas-store-deploy's Google Play setup step 2 requires confirming the track's country/region count is non-empty before building that release.**
80
78
 
81
79
  ### MR-03: Saving is not submitting
82
80
 
@@ -85,8 +83,7 @@ through an explicit "Send changes for review" action, which itself carries a sec
85
83
  A workflow that stops at "Save" ships nothing. The listing pages carry the identical trap under a
86
84
  differently-worded "Save and publish" action with its own second dialog.
87
85
 
88
- **Rule (MR-03):** After any Google Play console edit, look for and complete the explicit send-for-review
89
- (or save-and-publish) action and its confirmation dialog — "saved" is not a release state.
86
+ **Rule (MR-03): After any Google Play console edit, look for and complete the explicit send-for-review (or save-and-publish) action and its confirmation dialog — "saved" is not a release state. Enforcement: structured spell gate (ARC-023) — spell-eas-store-deploy's repeat-deployment step for Google Play requires locating and completing that confirmation dialog before the release counts as shipped.**
90
87
 
91
88
  ---
92
89
 
@@ -99,8 +96,7 @@ re-render, shifting which question sits at which row. A batch of clicks issued a
99
96
  lands on the wrong questions and can silently set an unintended answer — including sensitive categories
100
97
  like graphic violence or location sharing.
101
98
 
102
- **Rule (MR-04):** Answer the IARC questionnaire one question at a time, and re-read the full form after
103
- any change to the app's category, rather than assuming the row order is stable.
99
+ **Rule (MR-04): Answer the IARC questionnaire one question at a time, and re-read the full form after any change to the app's category, rather than assuming the row order is stable. Enforcement: structured spell gate (ARC-023) — spell-eas-store-deploy's Google Play setup step 5 requires re-reading the full IARC form after any category change before submitting answers.**
104
100
 
105
101
  ### MR-08: The "no deobfuscation file" warning is benign and permanent
106
102
 
@@ -109,8 +105,7 @@ wired up. This warning does not resolve itself and does not indicate a build def
109
105
  every future release until a mapping file is actually uploaded. State this explicitly wherever it
110
106
  appears in documentation or in-flight guidance, since it reads as alarming on a first submission.
111
107
 
112
- **Rule (MR-08):** Treat Google Play's "no deobfuscation file" warning as an expected, permanent state
113
- absent mapping-file upload — not a signal of a broken release.
108
+ **Rule (MR-08): Treat Google Play's "no deobfuscation file" warning as an expected, permanent state absent mapping-file upload — not a signal of a broken release. Enforcement: explicitly advisory prose (ARC-023) — spell-eas-store-deploy's Known Pitfalls list mentions this warning for context, but no step checks for it or blocks on it; treating it as benign rather than a build defect depends on the operator's own judgment.**
114
109
 
115
110
  ---
116
111
 
@@ -124,8 +119,7 @@ collection. Because both declarations are public, a reviewer or a user can compa
124
119
  two stores' answers for the same app must describe the same underlying behavior, not merely satisfy each
125
120
  store's form independently.
126
121
 
127
- **Rule (MR-05):** Data-safety and privacy declarations across both stores must agree with each other on
128
- what is actually collected, using "leaves the device" as the collection test in both places.
122
+ **Rule (MR-05): Data-safety and privacy declarations across both stores must agree with each other on what is actually collected, using "leaves the device" as the collection test in both places. Enforcement: structured spell gate (ARC-023) — spell-eas-store-deploy's Google Play setup step 6 requires confirming the data-safety declaration agrees with the App Store's own App Privacy answers before submission.**
129
123
 
130
124
  ### MR-06: The stores' locale catalogues differ
131
125
 
@@ -134,8 +128,7 @@ identical between Apple and Google. A locale available on one store may not exis
134
128
  default-language or locale-coverage choice has to be made against each store's own list — never copied
135
129
  across from the other store's configuration.
136
130
 
137
- **Rule (MR-06):** Resolve locale/language coverage against each store's own supported-locale list
138
- independently; do not assume the other store's locale set applies.
131
+ **Rule (MR-06): Resolve locale/language coverage against each store's own supported-locale list independently; do not assume the other store's locale set applies. Enforcement: explicitly advisory prose (ARC-023) — spell-eas-store-deploy's Known Pitfalls list cites this rule for context, but resolving locale coverage against each store's own catalogue is left to the operator's judgment, with no checkable state or step gating it.**
139
132
 
140
133
  ---
141
134
 
@@ -148,8 +141,7 @@ cap. An app with genuinely distinct account types (consumer vs. business, for ex
148
141
  account supplied directly, with prose describing how a reviewer reaches the other flows — there is no
149
142
  mechanism for supplying multiple credential sets natively.
150
143
 
151
- **Rule (MR-07):** Provide one working reviewer account per app submission, with any additional
152
- account-type flows described in prose rather than as separate credentials.
144
+ **Rule (MR-07): Provide one working reviewer account per app submission, with any additional account-type flows described in prose rather than as separate credentials. Enforcement: structured spell gate (ARC-023) — spell-eas-store-deploy's Google Play setup step 7 requires a working reviewer account to be provided before the submission steps that follow it.**
153
145
 
154
146
  ### MR-09: Read the actual signing certificate — never infer it
155
147
 
@@ -163,8 +155,7 @@ about certificate matching, since that flow never checks certificates. This is t
163
155
  `EV-01` states in general form — re-read the actual persisted/served state, never trust the interface —
164
156
  applied to a case where the "interface" is a console page that may not even show the value in question.
165
157
 
166
- **Rule (MR-09):** Never infer an Android signing SHA-1 from a console page; read the certificate the
167
- installed app actually presents, via `adb logcat` against a Play-delivered install (`EV-01`).
158
+ **Rule (MR-09): Never infer an Android signing SHA-1 from a console page; read the certificate the installed app actually presents, via `adb logcat` against a Play-delivered install (`EV-01`). Enforcement: structured spell gate (ARC-023) — cited by spell-eas-store-deploy's Known Pitfalls step, which requires reading the certificate via `adb logcat` against a Play-delivered install before trusting any `(package, SHA-1)`-keyed integration, applying the general EV-01 re-read-actual-state discipline to this specific case.**
168
159
 
169
160
  ### MR-10: Android OAuth clients are scoped to one `(package, SHA-1)` pair, custom scheme off by default
170
161
 
@@ -174,8 +165,7 @@ shared one. Separately, new Android OAuth clients ship with "Enable custom URI s
174
165
  default; leaving it off produces a visible `Error 400: invalid_request`, which is a console
175
166
  configuration gap, not a code defect.
176
167
 
177
- **Rule (MR-10):** Provision one Android OAuth client per distinct `(package, SHA-1)` pair, and confirm
178
- "Enable custom URI scheme" is on for any client that needs a custom-scheme redirect.
168
+ **Rule (MR-10): Provision one Android OAuth client per distinct `(package, SHA-1)` pair, and confirm "Enable custom URI scheme" is on for any client that needs a custom-scheme redirect. Enforcement: structured spell gate (ARC-023) — spell-eas-store-deploy's Known Pitfalls step requires confirming each OAuth client's package/SHA-1 pairing and its custom-URI-scheme toggle state before relying on a custom-scheme redirect.**
179
169
 
180
170
  ### MR-11: The public developer address comes from D-U-N-S, and confirming it locks it in
181
171
 
@@ -187,9 +177,7 @@ first, wait for propagation (days to weeks), let Google re-sync, and only then c
187
177
  verification carries its own hard deadline, so this correction needs to start early enough that the
188
178
  D&B propagation window still fits before that deadline.
189
179
 
190
- **Rule (MR-11):** Correct the address at the D-U-N-S source and allow it to propagate before confirming
191
- it in the Google Play console — confirming first permanently publishes whatever address is on file at
192
- that moment.
180
+ **Rule (MR-11): Correct the address at the D-U-N-S source and allow it to propagate before confirming it in the Google Play console — confirming first permanently publishes whatever address is on file at that moment. Enforcement: structured spell gate (ARC-023) — spell-eas-store-deploy's Google Play setup step 8 requires the D-U-N-S correction to propagate before the console confirmation step runs.**
193
181
 
194
182
  ---
195
183
 
@@ -205,8 +193,7 @@ dependency's manifest entries survive independently of whether anything still ca
205
193
  permission means removing the dependency that declares it, and the removal must be re-verified against a
206
194
  newly built artifact, not assumed from the source diff.
207
195
 
208
- **Rule (MR-12):** Verify declared permissions against the actually built artifact, not against source
209
- code's apparent usage, both before submission and after removing a permission-declaring dependency.
196
+ **Rule (MR-12): Verify declared permissions against the actually built artifact, not against source code's apparent usage, both before submission and after removing a permission-declaring dependency. Enforcement: structured spell gate (ARC-023) — spell-eas-store-deploy's Known Pitfalls step requires running `aapt2 dump permissions` (or an equivalent manifest inspection) against the built artifact before submission.**
210
197
 
211
198
  ### MR-13: Android notification icons need a dedicated asset, shipped natively
212
199
 
@@ -217,8 +204,7 @@ notification icon, check the notification shade specifically rather than the hea
217
204
  OEM skins legitimately omit the small icon from the banner view while still rendering it correctly in the
218
205
  shade. The branded, full-color icon slot is `largeIcon`, a separate asset from the required small icon.
219
206
 
220
- **Rule (MR-13):** Ship a dedicated monochrome small-icon asset for Android notifications in a native
221
- build (never an OTA), and diagnose icon issues via the notification shade, not the heads-up banner.
207
+ **Rule (MR-13): Ship a dedicated monochrome small-icon asset for Android notifications in a native build (never an OTA), and diagnose icon issues via the notification shade, not the heads-up banner. Enforcement: explicitly advisory prose (ARC-023) — spell-eas-store-deploy's Known Pitfalls list restates this rule for awareness, but no step verifies the icon asset exists or checks the notification shade before proceeding; both remain judgment calls for the operator.**
222
208
 
223
209
  ### MR-14: Android's native `AlertDialog` caps at three buttons
224
210
 
@@ -227,9 +213,7 @@ Android's native `AlertDialog` silently drops any button past a hard cap of thre
227
213
  the *Cancel* row, leaving a dialog with no way to dismiss it. iOS has no equivalent limit
228
214
  (`ActionSheetIOS` supports an arbitrary option count).
229
215
 
230
- **Rule (MR-14):** For any Android menu that could exceed three options, use a real bottom sheet
231
- dismissible at least three ways (an explicit cancel row, a scrim tap, and the hardware back gesture)
232
- instead of `Alert.alert`.
216
+ **Rule (MR-14): For any Android menu that could exceed three options, use a real bottom sheet dismissible at least three ways (an explicit cancel row, a scrim tap, and the hardware back gesture) instead of `Alert.alert`. Enforcement: explicitly advisory prose (ARC-023) — spell-eas-store-deploy's Known Pitfalls list cites this rule for awareness, but the fix is a UI code change with no console or platform state for the deploy workflow to check before proceeding; catching it depends on code review, not this spell.**
233
217
 
234
218
  ## Related
235
219
 
@@ -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