Consumer-SSOT Registry — per-consumer pool subset
Goal
- Complete the registry so each entry records WHICH shared pools it reads, not a uniform assumption.
- Record the one nuance:
ori_evalreadsCanExpr+DecisionTreePoolbut NOT the resolved type pool (noori_typesdependency).
Implementation Sketch
- Extend
ConsumerEntrywith a per-pool subset flag set{CanExpr, DecisionTreePool, resolved_type_pool}; populate accurately per consumer. - Record
ori_eval’s runtime method-dispatch as a SCOPED, ALLOWED surface (dispatch-among-already-typechecked-candidates), NOT a re-derivation violation. - Add a module doc + Design-Invariants note mirroring
ori_registry’s structural-enforcement comment. - Corrected topology:
ori_reprandori_fmtare NOT canon consumers (verified via theirCargo.toml); do not register them.
Spec References
missions.md §ori_registry (pure-data model); missions.md §ori_eval (parity + no type-pool dep); canon.md §3.
Work Items
- Add per-pool subset flags to
ConsumerEntry; populate{CanExpr, DecisionTreePool, type-pool}accurately for each of the 5 consumers. - Record
ori_evalruntime-dispatch as an allowed scoped surface (annotation on the entry), not a violation. - Add module doc + Design-Invariants comment mirroring
ori_registry’s structural-enforcement note. - Unit test asserting each entry’s pool flags match the consumer’s real type references.
Items
- Add per-pool subset flags to
ConsumerEntry, modeled as a closed classification (an enum/small named-set over {MeaningConsumer{CanExpr, DecisionTreePool, resolved_type_pool}, OrchestrationIdOnly, IdOnlyImporter} — never 3 independent raw bools, since only 3 meaningful shapes exist) rather than boolean flags. Populate it accurately for the 5 already-registeredCANON_CONSUMERSentries. ALSO resolve, in this same registry pass, the classification gap the walking-skeleton’s own fresh-intel already found on the live tree: registerori_types(ID-only viaMonoInstanceId) andori_patterns(ID-only viaCanId+SharedCanonResult) with an explicit ID-only pool-subset entry, OR record each’s exemption with a stated why per COVER-35 — never leave either silently unregistered for thes-e26ee405lint to discover later. - Add a module doc + Design-Invariants note mirroring
ori_registry::burden’s structural-enforcement comment, documenting: (a) the closed pool-subset classification (meaning-consumer / orchestration-ID-only / ID-only-importer) and whyori_types/ori_patternsare registered as ID-only rather than silently exempted; (b) thatcrate_namestays the real Cargo package identity while any module-qualified detail lives indescriptiononly. State only the invariant content (WHY the shape is closed, WHY the classification exists) — never restate what the code visibly does (COMMENT-01/COMMENT-09).
Fresh intel (regenerated)
The section’s own goal statement is already stale against the terrain. It says “populate accurately for each of the 5 consumers” — but its own sibling section (walking-skeleton--s-598f5119, completed) already ran a fresh-intel pass and found the 5-crate list undercounts the real dependency surface: ori_types (via MonoInstanceId) and ori_patterns (via CanId + SharedCanonResult) both import ori_ir::canon today and carry NO CANON_CONSUMERS entry. This dossier’s own terrain query (§2) independently confirms both import sites verbatim against live source. This is not new information this section can ignore — it is a decision the section’s Implementation Sketch has not yet made, and the sibling lint section (s-e26ee405) will trip over the gap the moment its negative-fixture lint runs against the real tree.
Three decisions this package forces before any code is written:
- The “5 consumers” premise is wrong — widen the classification, don’t just populate it.
ori_types::MonoInstanceIdandori_patterns::CanId/SharedCanonResultare ID-only handle-passers (index/key passage for monomorphization dispatch + closure-body storage), not tree-walking meaning-consumers — exactly the “ID-only importer” category the goal’s own second work item (w-0051af00, scopingori_evalruntime-dispatch as allowed) already gestures at for a THIRD crate. Extend the per-pool-subset classification to explicitly register (or explicitly exempt with a stated reason)ori_typesandori_patterns, not just the 5 named crates. - The mechanical enforcement (
crate-dag-lint.py) validates ONLYcrate_name+ theori_irdependency edge — never the pool-subset field._read_canon_consumersis a bare regex (crate_name:\s*"([^"]+)") over the Rust source text; it has no knowledge ofdescription, let alone a not-yet-existing pool-subset field. The section’s ownw-e318d6df(a Rust unit test asserting pool-flag accuracy) is therefore the ONLY mechanical backstop for this section’s actual deliverable — there is no cross-check today between what the registry CLAIMS about a consumer’s pool usage and whatcargo metadata/the lint verifies. entry_for— the query API the module doc calls “the one query” — has zero production callers. The graph flags itis_dead_code_candidate: true; its only caller is its own unit test, and it sits in a 2-node community with nothing else in the ~223K-symbol graph coupled to it. This is not this section’s bug to fix (pre-existing, shipped by the walking-skeleton), but populating the registry with richer data (pool-subset flags) is the natural moment to ask whether anything should actually query throughentry_for— or whether the registry stays a compile-time-only, Python-regex-consumed artifact forever.
DIG DEEPER
scripts/intel-query.sh plan-status canonical-consumer-boundary
scripts/intel-query.sh dag-ascii canonical-consumer-boundary
sed -n '1,50p' compiler_repo/compiler/ori_ir/src/canon/consumers.rs
(full dossier: consumer-ssot-registry—s-e731d59b.intel.md)