Criteria as a Substrate-View Describe Level — Normative and Discovered as Typed Provenance, Promotion Gated Not Automatic
Accepted
Context
The constellation-memory work introduces criteria: the conditions a project holds itself to — release gates, quality bars, coherence rules. They arrive from two directions. Some are NORMATIVE: declared requirements an author states up front ('every Accepted ADR cites a Proof'). Others are DISCOVERED: they emerge from harvested insights (the coder harvest, plan component A) and the interaction trace (ADR-037) as patterns that turned out to matter in practice. ADR-046 established the substrate view as the unit of dynamic context provisioning — a discipline mounts only the slice of levels it needs, and a level is consumed identically by CLI, agent, and daemon interfaces via the surfaces field, with eligibility 'Always or 'Learned. ADR-018 fixed level-hierarchy and describe-projection mechanics. What is missing is where criteria sit in that structure. Two errors are available. If criteria are a flat undifferentiated list, a pattern someone NOTICED (discovered, reflection axis — what BECAME salient) is indistinguishable from a requirement someone DECLARED (normative, ontology axis — what IS required), and the first silently acquires the authority of the second. If, conversely, discovered criteria can auto-promote to normative once they recur, the reflection axis starts minting requirements without a declared, witnessed act — the engine deciding what is authoritative. The project's core identity tension, ontology-vs-reflection, is engaged directly, and formalization-vs-adoption is engaged because adding a criteria level is more schema that a minimal adopter must not be forced to carry. SCOPE (amended 2026-08-10): the taxonomy binds to criteria IN USE, not only to criteria at rest in a store. A criterion derived inside a working session — a plan's success line, an agent's restatement of a goal as a testable condition — is 'Discovered by construction, and enforcing it as though it were declared is the same collapse with no artifact to tag. The store is where the tag is recorded when one exists; it is not the boundary of the rule.
Decision
Establish criteria as a first-class describe level mounted through the substrate-view engine (ADR-046), distinguished by a typed provenance taxonomy and a gated promotion path. Four mechanisms. (1) TYPED PROVENANCE TAXONOMY — every criterion carries kind : [| 'Normative, 'Discovered |] as a typed tag, not free text. 'Normative criteria are declared requirements (ontology axis); 'Discovered criteria are harvested from insights/interaction (reflection axis) and MUST record provenance: the source insight or interaction id they were graduated from. The tag is the legibility seam: a reader always knows whether a criterion is asserted or observed. (2) CRITERIA AS A 'Describe LEVEL — register criteria in levels.ncl with kind = 'Describe and eligibility = 'Learned, added to the relevant disciplines[].levels (coding, positioning, dissemination); `describe criteria --discipline <D>` projects the discipline's slice, mirroring the existing constraints projection (ADR-018). (3) PROMOTION IS GATED, NEVER AUTOMATIC — a discovered criterion may be PROPOSED for promotion to normative, but promotion is gated behind novelty-check --threshold plus human approval (the backlog propose-status/approve path, ADR-046 witnessed-reversible); recurrence alone never promotes. The reverse — a normative criterion being demoted because reality drifted — is likewise a proposal, never silent. (4) OPT-IN ABSENCE — eligibility 'Learned and an opt-in migration mean a project that declares no criteria mounts no criteria level and pays nothing; the level is absent, not empty-and-mandatory.
Constraints
- Hard Every criterion carries kind : [| 'Normative, 'Discovered |] as a typed tag; a 'Discovered criterion additionally records the source insight or interaction id it was graduated from
- Hard A 'Discovered criterion becomes 'Normative only through novelty-check plus human approval via propose-status/approve; recurrence alone never promotes, and demotion of a 'Normative criterion is likewise a proposal, never silent
- Soft The criteria level is registered with kind 'Describe and eligibility 'Learned; a project that declares no criteria mounts no criteria level and carries no mandatory criteria schema
- Hard criteria are projected through `describe criteria` and consumed identically across CLI/agent/UI/MCP/GraphQL via the surfaces field, with no bespoke per-surface code
Alternatives considered
- A flat untyped criteria list — rejected: Collapses ontology-vs-reflection: a discovered pattern becomes indistinguishable from a declared requirement and silently acquires its authority. The typed normative/discovered tag is the minimal addition that keeps both poles legible.
- Auto-promote discovered criteria to normative once they recur N times — rejected: Lets reflection mint requirements without a declared, witnessed act — reflection-dominates, the collapse ADR-046 C1 forbids. Recurrence is evidence; only a gated, approved act confers normative authority.
- A standalone criteria store outside the substrate-view engine — rejected: Reinvents discipline-scoped composition, persistence routing, partial-knowledge verification, and interface parity that ADR-046 already provides, and would need its own cross-project story. Criteria are a level; mounting them through the view engine inherits all of it.
- A new typed criterion_kind on qa_entry_type instead of tags, requiring a schema-field migration immediately — rejected: Premature: tagging normative/discovered on the existing qa entry type needs no required-field migration and keeps the adoption floor flat. A typed criterion_kind is a later move only if a Spiral-poled criterion field is needed (bl-009 graduation), and that is itself an ondaod-gated decision.
- Make criteria mandatory for all adopters to maximize ecosystem visibility — rejected: Collapses formalization-vs-adoption toward mandatory gates, violating the core.ncl node invariant 'schemas are optional layers, not mandatory gates'. eligibility 'Learned plus opt-in migration keep absence free.
Anti-patterns
- Discovered criterion wears normative authority — A criterion harvested from insights or interaction is recorded without a provenance tag and is read as a declared requirement, silently acquiring authority it was never granted.
- Auto-promotion by recurrence — A discovered criterion is promoted to normative automatically once it recurs enough times, letting reflection mint authoritative requirements with no declared, witnessed act.
- Derived criterion enforced as given — A criterion produced inside the work — an analyst's or agent's restatement of a goal as a testable condition — is then treated as the goal itself. It is 'Discovered wearing 'Normative authority in the case C1 did not picture: there is no stored row to tag, so nothing marks it as derived and nothing gates its promotion. The damage is specific: the real goal stays unexamined while its proxy accumulates the cost of satisfying it, and evidence that contradicts the proxy is read as an obstacle to route around rather than as a refutation. A success criterion is a hypothesis about what resolves the problem, and it is falsified like any other.
- Lesser-evil menu — Once a derived criterion turns out to be unreachable, the analysis enumerates ways to pay for it and recommends the cheapest, instead of returning to the criterion. Collapsing is not resolving: the menu moves the discussion to which cost to accept, and the premise that generated every cost stops being a candidate for falsification. This is the detectable tell of derived-criterion-enforced-as-given — the criterion itself is silent, but the menu is visible.
- Criteria mandatory at the adoption floor — The criteria level is made mandatory or empty-but-required for every adopter, putting new schema at the adoption floor instead of the top of the curve.
Related ADRs
ADR-046 · ADR-018 · ADR-024 · ADR-037 · ADR-029 · ADR-003 · ADR-050