Method
Fresh clone of dev at c2000ad, 1724 tracked files, every file read and every
match bucketed so the totals reconcile exactly.
Matching uses a word-boundary–anchored pattern
((?<![A-Za-z0-9])(ACES|Aces|aces)([-_.][A-Za-z0-9]+)*) rather than a substring
search. This matters: a naive grep aces matches spaces, surfaces,
interfaces, namespaces, workspaces, traces, replaces, races, faces, places,
braces — which is a plausible way earlier passes both over- and under-counted.
Total: 4840 occurrences across 760 files.
What is already done
Worth stating so this doesn't get re-litigated:
- Every Python package under
implementations/python/packages/ is raes_*.
- The
aces namespace package (implementations/python/src/aces/) is gone,
along with the aces._compat / aces.core.sdl transitional shims.
- Zero
import aces… / from aces… import statements remain.
- Only two string-form module references survive, and both are artifact names
rather than imports (covered in §5).
The Python import rename is complete. What remains is contract, artifact, and
prose surface.
Reconciliation
| Bucket |
Occurrences |
Files |
1. Published contract (contracts/schemas, profiles, concept-authority, schema-publication) |
488 |
115 |
2. Contract fixtures (contracts/fixtures) |
250 |
106 |
| 3. Implementation code + tests |
858 |
174 |
4. Specs (specs/) |
72 |
23 |
5. Docs prose (docs/, excl. records) |
55 |
16 |
| 6. Examples |
53 |
20 |
| 7. Tools |
139 |
21 |
| 8. Agent / CI config |
87 |
17 |
| 9. Repo root |
18 |
10 |
| Live subtotal |
2020 |
502 |
| 10. Historical records |
2820 |
258 |
| Total |
4840 |
760 |
§1 — The published schema namespace is still aces.dev (highest impact)
Every $id in the repo is rooted at https://aces.dev/schemas. All 72 of
them. There are no exceptions.
72 "$id": "https://aces.dev/schemas/..."
36 .../schemas/semantic-invariants/...
This is the single largest item in the audit and the one with the widest blast
radius, because $id values are the identity of the published contract — any
consumer that resolves, caches, or pins a schema URL is bound to this namespace.
Decide explicitly whether aces.dev is being retired. If it is, the cutover
needs a version and probably a redirect; if it is not, that should be written
down, because right now it reads as an oversight rather than a decision.
§2 — Contract identifier strings
Identifier values in const / enum / title, i.e. matched literally by
consumers:
| Identifier |
Occurrences |
Notes |
aces-invariants |
149 |
82 in published contract |
aces-reference-processor |
114 |
81 in fixtures |
aces-semantic-invariants-v1 |
83 |
also a filename, see §4 |
aces-sdl-semantic |
45 |
|
aces-semantic-profile |
39 |
|
aces-variable-reference |
35 |
|
aces-behavioral-relations |
29 |
|
aces-sdl-instantiated-snapshot |
15 |
|
aces-client-verified, aces-client-identity |
30 |
|
aces-finite-domain-satisfiability-v1 |
19 |
|
aces-reusable-asset-trust-policy |
8 |
consumed downstream by env-packs ADR 0010 |
aces-random-stream-v1, aces-exploit-path-analysis-v1, aces-plane, aces-validation, aces-document-phase, aces-realization-dimension, aces-structural-validation, aces-semantic-validation, aces-evidence-backed-validation, aces-trust, aces-inventory, aces-participant-semantics, aces-z3-finite-domain, aces-attack-graph, aces-exploit-path-{query,witness,invalid,unsupported}, aces-monotonic-attack-transition, aces-deterministic-attack-graph-search, aces-sdl-snapshot-attack-binding, aces-satisfiability-{witness,unsupported}, aces-unsatisfiable-core, aces-finite-domain-{constraints,theory}, aces-sdl-authoring-translation, aces-test |
remainder |
|
contracts/schemas/exploit-path-analysis/exploit-path-analysis-evidence-v1.json
and contracts/schemas/satisfiability/scenario-satisfiability-evidence-v1.json
are the densest single files here.
§3 — Wire field names and model class names
JSON object keys — renaming these is a payload-breaking change, distinct
from the identifier strings above:
aces_boundaries — contracts/schemas/provenance/sdl-lineage-ledger-v1.json
aces_native — same
aces_relative_to_source — same
aces_address — contracts/schemas/exploit-path-analysis/…
Pydantic model names in
contracts/schemas/profiles/aces-semantic-invariants-v1.json:
AcesSemanticInvariantEntryModel
AcesSemanticInvariantInputModel
AcesSemanticInvariantProfileReferenceModel
§4 — Files and paths still named aces*
contracts/schemas/profiles/aces-semantic-invariants-v1.json
contracts/schema-publication/entries/aces-semantic-invariants-v1.json
docs/decisions/adrs/adr-012-shared-concept-authority-and-aces-extension-discipline.md
docs/research/specification-coverage/bundles/aces-standardized-specification-coverage-{8bf12ee,9347f64}-v1.json
The first two are published-contract paths, so renaming them is a contract move,
not a file move.
§5 — Runtime artifact names (user-visible, not tracked files)
These are names the tooling writes or reads at runtime, so they never show
up in a file listing and are easy to miss:
| Artifact |
Where |
aces.lock.json — module lockfile |
packages/raes/module_registry.py:37 (LOCKFILE_NAME) |
aces-trust.yaml — trust policy file consumers author |
15 refs |
OCI container labels aces.workspace, aces.address |
packages/raes_reference_backend/drivers/oci.py:52 |
libvirt domain naming aces.libvirt.scenario* |
15 refs, incl. aces.libvirt.scenario-evidence-run |
aces-sdl-policy.out, aces-sdl-gc.out |
CI output artifacts |
§6 — Runtime event topic namespace
The whole event vocabulary is still aces.*:
aces.participant_runtime.{lifecycle,outcome_report,observation,shared_state,joint_action}
aces.outcome.interpreted aces.observation.emitted
aces.lifecycle.operation_state.completed
aces.operation_state.running aces.shared_state.commit
aces.challenge aces.cross
§7 — Environment variables
ACES_REQUIREMENT_UID (21)
ACES_REAL_LIBVIRT_URI (9)
ACES_RELATIVE_TO_SOURCE (2)
ACES_NATIVE (2)
§8 — Code identifiers in implementation
aces_invariant* (81), aces_uuid (24), aces_revision (23), aces_level,
aces_semantic_invariant_annotations (12), plus 213 bare aces tokens in
docstrings and comments across 174 files. Densest: raes_contracts/contracts/schema_constraints.py
(39), raes_contracts/contracts/schema_invariants.py (24),
raes_backend_libvirt/guest_appliance.py (23), and the runtime test modules
(test_libvirt_backend_driver.py 35, test_runtime_contracts.py 34,
test_runtime_control_plane_api.py 30, test_runtime_planner.py 23).
§9 — Specs, docs, examples, tools, config
- specs/ — 72 across 23 files;
specs/concept-authority/* (4 files) and
specs/formal/* carry most of it, including the identifier aces-extension-discipline.md.
- tools/ — 139 across 21 files;
tools/real-daemon/libvirt_smoke.py (38) is
the densest, plus tools/policy/* and the check_*.py gate scripts.
- agent/CI config — 87 across 17 files, incl.
.github/workflows/ci.yml,
.github/dependabot.yml, .github/PULL_REQUEST_TEMPLATE.md, .gc/plan-rules.md,
and the .claude/ + .codex-skills/ skill definitions (already named
raes-*, but ACES survives in their bodies — 60 occurrences).
- repo root — 18 across
README.md, AGENTS.md, CONTRIBUTING.md,
noxfile.py, sonar-project.properties, .ground-control.yaml, .mcp.json,
.gitleaks.toml, implementations/python/pyproject.toml, contracts/README.md.
- examples/ — 53 across 20 files, incl.
aces-library-pattern,
aces-library-template.
- docs/ prose — 55 across 16 files, mostly the
aces-inventory /
aces_inventory.py capture tooling.
§10 — Historical records (2820, 58% of total)
| File / area |
Occurrences |
docs/decisions/ (ADRs + preflights) |
1509 |
docs/research/ |
627 |
contracts/provenance/sdl-lineage-ledger-v1.json |
346 |
CHANGELOG.md |
297 |
docs/migration/, docs/lessons/ |
41 |
These are dated records of decisions and derivation. My recommendation is to
leave them as written and let the names be historically accurate — the lineage
ledger in particular is a provenance artifact whose whole value is that it was
not edited after the fact. Flagging rather than deciding, since the instruction
was to find everything.
Suggested order
- Decide
aces.dev (§1) — everything else in the contract layer depends on it.
- Decide frozen-vs-rename for identifiers (§2) and wire keys (§3) together;
they share consumers.
- §5–§7 (artifacts, events, env vars) — user-visible, independently shippable.
- §8–§9 — mechanical, no consumer impact.
- §10 — decide once, apply never or apply wholesale.
Downstream tracking: OpenRAE/env-packs#139, #907.
Requirements
Method
Fresh clone of
devatc2000ad, 1724 tracked files, every file read and everymatch bucketed so the totals reconcile exactly.
Matching uses a word-boundary–anchored pattern
(
(?<![A-Za-z0-9])(ACES|Aces|aces)([-_.][A-Za-z0-9]+)*) rather than a substringsearch. This matters: a naive
grep acesmatches spaces, surfaces,interfaces, namespaces, workspaces, traces, replaces, races, faces, places,
braces — which is a plausible way earlier passes both over- and under-counted.
Total: 4840 occurrences across 760 files.
What is already done
Worth stating so this doesn't get re-litigated:
implementations/python/packages/israes_*.acesnamespace package (implementations/python/src/aces/) is gone,along with the
aces._compat/aces.core.sdltransitional shims.import aces…/from aces… importstatements remain.rather than imports (covered in §5).
The Python import rename is complete. What remains is contract, artifact, and
prose surface.
Reconciliation
contracts/schemas,profiles,concept-authority,schema-publication)contracts/fixtures)specs/)docs/, excl. records)§1 — The published schema namespace is still
aces.dev(highest impact)Every
$idin the repo is rooted athttps://aces.dev/schemas. All 72 ofthem. There are no exceptions.
This is the single largest item in the audit and the one with the widest blast
radius, because
$idvalues are the identity of the published contract — anyconsumer that resolves, caches, or pins a schema URL is bound to this namespace.
Decide explicitly whether
aces.devis being retired. If it is, the cutoverneeds a version and probably a redirect; if it is not, that should be written
down, because right now it reads as an oversight rather than a decision.
§2 — Contract identifier strings
Identifier values in
const/enum/title, i.e. matched literally byconsumers:
aces-invariantsaces-reference-processoraces-semantic-invariants-v1aces-sdl-semanticaces-semantic-profileaces-variable-referenceaces-behavioral-relationsaces-sdl-instantiated-snapshotaces-client-verified,aces-client-identityaces-finite-domain-satisfiability-v1aces-reusable-asset-trust-policyaces-random-stream-v1,aces-exploit-path-analysis-v1,aces-plane,aces-validation,aces-document-phase,aces-realization-dimension,aces-structural-validation,aces-semantic-validation,aces-evidence-backed-validation,aces-trust,aces-inventory,aces-participant-semantics,aces-z3-finite-domain,aces-attack-graph,aces-exploit-path-{query,witness,invalid,unsupported},aces-monotonic-attack-transition,aces-deterministic-attack-graph-search,aces-sdl-snapshot-attack-binding,aces-satisfiability-{witness,unsupported},aces-unsatisfiable-core,aces-finite-domain-{constraints,theory},aces-sdl-authoring-translation,aces-testcontracts/schemas/exploit-path-analysis/exploit-path-analysis-evidence-v1.jsonand
contracts/schemas/satisfiability/scenario-satisfiability-evidence-v1.jsonare the densest single files here.
§3 — Wire field names and model class names
JSON object keys — renaming these is a payload-breaking change, distinct
from the identifier strings above:
aces_boundaries—contracts/schemas/provenance/sdl-lineage-ledger-v1.jsonaces_native— sameaces_relative_to_source— sameaces_address—contracts/schemas/exploit-path-analysis/…Pydantic model names in
contracts/schemas/profiles/aces-semantic-invariants-v1.json:AcesSemanticInvariantEntryModelAcesSemanticInvariantInputModelAcesSemanticInvariantProfileReferenceModel§4 — Files and paths still named
aces*contracts/schemas/profiles/aces-semantic-invariants-v1.jsoncontracts/schema-publication/entries/aces-semantic-invariants-v1.jsondocs/decisions/adrs/adr-012-shared-concept-authority-and-aces-extension-discipline.mddocs/research/specification-coverage/bundles/aces-standardized-specification-coverage-{8bf12ee,9347f64}-v1.jsonThe first two are published-contract paths, so renaming them is a contract move,
not a file move.
§5 — Runtime artifact names (user-visible, not tracked files)
These are names the tooling writes or reads at runtime, so they never show
up in a file listing and are easy to miss:
aces.lock.json— module lockfilepackages/raes/module_registry.py:37(LOCKFILE_NAME)aces-trust.yaml— trust policy file consumers authoraces.workspace,aces.addresspackages/raes_reference_backend/drivers/oci.py:52aces.libvirt.scenario*aces.libvirt.scenario-evidence-runaces-sdl-policy.out,aces-sdl-gc.out§6 — Runtime event topic namespace
The whole event vocabulary is still
aces.*:§7 — Environment variables
ACES_REQUIREMENT_UID(21)ACES_REAL_LIBVIRT_URI(9)ACES_RELATIVE_TO_SOURCE(2)ACES_NATIVE(2)§8 — Code identifiers in implementation
aces_invariant*(81),aces_uuid(24),aces_revision(23),aces_level,aces_semantic_invariant_annotations(12), plus 213 bareacestokens indocstrings and comments across 174 files. Densest:
raes_contracts/contracts/schema_constraints.py(39),
raes_contracts/contracts/schema_invariants.py(24),raes_backend_libvirt/guest_appliance.py(23), and the runtime test modules(
test_libvirt_backend_driver.py35,test_runtime_contracts.py34,test_runtime_control_plane_api.py30,test_runtime_planner.py23).§9 — Specs, docs, examples, tools, config
specs/concept-authority/*(4 files) andspecs/formal/*carry most of it, including the identifieraces-extension-discipline.md.tools/real-daemon/libvirt_smoke.py(38) isthe densest, plus
tools/policy/*and thecheck_*.pygate scripts..github/workflows/ci.yml,.github/dependabot.yml,.github/PULL_REQUEST_TEMPLATE.md,.gc/plan-rules.md,and the
.claude/+.codex-skills/skill definitions (already namedraes-*, butACESsurvives in their bodies — 60 occurrences).README.md,AGENTS.md,CONTRIBUTING.md,noxfile.py,sonar-project.properties,.ground-control.yaml,.mcp.json,.gitleaks.toml,implementations/python/pyproject.toml,contracts/README.md.aces-library-pattern,aces-library-template.aces-inventory/aces_inventory.pycapture tooling.§10 — Historical records (2820, 58% of total)
docs/decisions/(ADRs + preflights)docs/research/contracts/provenance/sdl-lineage-ledger-v1.jsonCHANGELOG.mddocs/migration/,docs/lessons/These are dated records of decisions and derivation. My recommendation is to
leave them as written and let the names be historically accurate — the lineage
ledger in particular is a provenance artifact whose whole value is that it was
not edited after the fact. Flagging rather than deciding, since the instruction
was to find everything.
Suggested order
aces.dev(§1) — everything else in the contract layer depends on it.they share consumers.
Downstream tracking: OpenRAE/env-packs#139, #907.
Requirements