100%

Spec-layer sync + proposal complementarity + close

Goal

  • Sync the rules-layer spec so the new enforcement is discoverable next to PHASE-54.
  • Record the draft-proposal complementarity and prove the north-star gate end-to-end.

Implementation Sketch

  • Update canon.md §7.5 ‘already-landed enforcement’ to name the consumer-SSOT registry + lint alongside PHASE-54.
  • Record complementarity with single-semantic-authority-tooling-proposal.md (draft) in HISTORY: its tooling-consumer case registers in this SSOT once tooling is built.
  • End-to-end north-star verification: unregistered-consumer fixture rejected + real tree green + the three rules present and citing the backing.

Spec References

canon.md §7.5; proposals.md (draft complementarity, no proposal edit here); missions.md §How to use.

Work Items

  • Fix the phantom probe_ref shared by TWO success criteria this section owns or terminates: the section-local sc-ff165de905 (owner_section_id: s-3c90c7fe) and the PLAN-WIDE functional sc-344fce343b (owner_section_id: null, kind: functional — the north-star gate this plan-terminating close mechanically evaluates per missions.md §How to use — the mission-chain audit). Both currently carry the identical probe_ref ‘python -m scripts.consumer_ssot_lint —self-test’ — verified live: zero files matching consumer_ssot_lint exist anywhere in the repo (ModuleNotFoundError on invocation). This is the FIFTH instance of the exact defect class the four completed sibling sections already found and fixed on their own criteria (sc-93a0660b1f, sc-2d1ad5ae90, sc-5a808987f4, sc-20775d1462) — confirming a real, still-open plan-wide defect, not stale dossier content. Fix via scripts/plan_corpus/write.py:amend_success_criterion ONLY (plan.json is script-only per plan-read-discipline.md §2.1; never a hand-edit). Re-point sc-344fce343b (plan-wide) at ‘python3 compiler_repo/scripts/crate-dag-lint.py —self-test’ — the same already-proven probe as the sibling sc-5a808987f4, and verified live here too (exit 0, self-test OK) — since crate-dag-lint.py’s negative-fixture rejection + clean-real-tree pass is the literal, already-satisfied text of the plan-wide criterion; do NOT author a new scripts/consumer_ssot_lint.py to make the phantom string true — that would itself be a second cargo-metadata-reading script duplicating crate-dag-lint.py/consumer_registration_check.py (LEAK:algorithmic-duplication), the exact temptation the two prior sibling sections (w-8a2865ab, w-d140e950) already refused when they hit the identical defect. Re-point sc-ff165de905 (section-local) at a DIFFERENT probe — its text is about canon.md §7.5 content and HISTORY, not the lint’s fixture — author it as a grep/self-test asserting .claude/rules/canon.md §7.5 mentions ori_ir::canon::consumers + crate-dag-lint.py (or PHASE-58/COVER-35/DESIGN-26) AND this section’s own content file (spec-sync-and-close—s-3c90c7fe.md) carries a ## HISTORY block per state-discipline.md §7; the probe_ref text can be written now (it references content w-46c77f4f/w-8f95a92a will land) but its PASS evidence is only recorded once those two items complete — run it as part of w-b306e354’s verification, not before.
  • Update canon.md §7.5 to reference the consumer-SSOT registry + lint alongside PHASE-54.
  • Record draft-proposal complementarity in HISTORY.
  • Run the end-to-end north-star verification (fixture rejected + real tree green + rules present).

Fresh intel (regenerated)

This section closes the plan — but its own gate is currently unprovable, and so is the plan’s. Two success criteria share the identical phantom probe_ref (python -m scripts.consumer_ssot_lint --self-test) — a wrapper-root Python module that has never existed anywhere in this repo: the section’s own sc-ff165de905 AND, more consequentially, the plan-wide kind: functional criterion sc-344fce343b that this plan-terminating close mechanically evaluates per missions.md §How to use — the mission-chain audit. This is the fourth and fifth instance of the exact same defect class already found and fixed on all three completed siblings (sc-93a0660b1f, sc-2d1ad5ae90’s sibling sc-5a808987f4, sc-20775d1462) — the section cannot honestly execute w-b306e354’s “end-to-end north-star verification” while its own gate, and the plan’s gate, both point at a command that raises ModuleNotFoundError.

The good news the recon also proves: the underlying machinery this section needs to cite and verify is already fully built, wired, and green on the real tree. ori_ir::canon::consumers::CANON_CONSUMERS (Rust registry, 10/10 unit tests pass) + compiler_repo/scripts/crate-dag-lint.py --self-test (verified live: exits 0, its self_test_consumer_checks() DOES reject a synthetic unregistered-consumer fixture) + impl-hygiene.md PHASE-54/PHASE-58/COVER-35/DESIGN-26 (verified live: finding_categories freeze --check passes) together already satisfy the plan-wide criterion’s literal text (“A CI/hygiene pass rejects a synthetic consumer… and passes the real tree unchanged”) — the fix is a probe_ref correction, not new engineering.

Decisions this package forces before any edit lands:

  1. Fix sc-344fce343b and sc-ff165de905 FIRST, via scripts/plan_corpus/write.py:amend_success_criterion (never a hand-edit — plan.json is script-only per plan-read-discipline.md §2.1), mirroring the exact cure the three sibling sections already applied to their own instances of this bug. Never author the phantom module to make the string true — that would be inventing a fourth cargo-metadata reader (LEAK:algorithmic-duplication) for a check that already exists twice over.
  2. The plan-wide criterion’s real proof is crate-dag-lint.py --self-test + a clean real-tree run — the same probe already proven for sc-5a808987f4. Re-point sc-344fce343b there (or a thin wrapper composing it with the finding_categories/rules_parser parity check for the “three rules cite the backing” half).
  3. The section’s own criterion (sc-ff165de905) needs a DIFFERENT probe than the plan-wide one — its text is about canon.md §7.5 + HISTORY content, not the lint’s negative fixture. No existing script asserts “does canon.md mention the registry/lint.” The section’s own work items (w-46c77f4f, w-8f95a92a) must land the prose first; the probe is then a grep/self-test over .claude/rules/canon.md (mentions ori_ir::canon::consumers + crate-dag-lint.py) and over this section’s own content file (carries a ## HISTORY block per state-discipline.md §7 recording the draft-proposal complementarity) — never the phantom module either.
  4. Do not touch single-semantic-authority-tooling-proposal.md. The section’s own Spec References line is explicit: “no proposal edit here” — the file lives under the locked drafts/ directory (proposals.md §Proposal Lock), and w-8f95a92a’s HISTORY record belongs in THIS section’s own artifact, not the proposal.
  5. The graph is structurally blind to the enforcement half of this plancrate-dag-lint.py and its sibling consumer_registration_check.py are Python and carry zero symbols in the ori-repo graph (file-symbols queries returned empty for both). Every verification of “is the lint real and does it work” in this dossier came from running the command directly (read-only Bash), never from the graph. Treat that as the honest floor of what /query-intel can tell you about this plan’s north-star gate.

DIG DEEPER

python -m scripts.plan_corpus.read plans/canonical-consumer-boundary --criteria
python -m scripts.plan_corpus.read plans/canonical-consumer-boundary --criteria --section s-3c90c7fe
python3 compiler_repo/scripts/crate-dag-lint.py --self-test   # verify the real gate live

(full dossier: spec-sync-and-close—s-3c90c7fe.intel.md)

HISTORY

  • 2026-07-07 — Consumer-boundary enforcement lands; complements the single-semantic-authority-tooling draft: The canonical-consumer-boundary plan delivered the COMPILE-TIME enforcement for PHASE-54’s single-semantic-authority invariant — the ori_ir::canon::consumers::CANON_CONSUMERS registry with its closed PoolAccess classification, the crate-dag-lint.py / consumer_registration_check.py unregistered-consumer lint (synthetic negative fixture + --warn-only wiring into lefthook + test-all.sh), and impl-hygiene COVER-35 (registration-required) / PHASE-58 (least-resistance) / DESIGN-26 (proactive-at-add) with their finding-categories.md LEAK subcats. This COMPLEMENTS the draft compiler_repo/docs/ori_lang/proposals/drafts/single-semantic-authority-tooling-proposal.md, which names the invariant and binds all tooling at the spec layer: when the LSP / tooling consumer is built per that proposal (reusing the shared Salsa CompilerDb, never a parallel analyzer), it registers here as a ConsumerEntry and is caught by the same lint if it re-derives meaning. No proposal was edited in this plan — the complementarity is enforcement (this plan) meeting principle (the draft).