L3 — Finding contract and L4 intake
- Status
- as-built (emit 1.2.0) · direction (Evidence 2.0.0, section 5.2)
- Conceptual layer
- ③ Analytics → ④ Decision seam
- Repo layer
- L3 core + SE contracts
- Source
- architecture section 5.2
Contract: contracts/schemas/intelligence/finding.json · const 1.2.0
Forward schema (direction): finding-2.0.0.json — not what core emits today
What core emits#
| Field / rule | As-built |
|---|---|
schema_version | 1.2.0 (stamped_l3_core.models.finding) |
ops_clearance | Required — measurement boundary, related tags, predicate, stabilize / reopen |
value_domain | energy_efficiency | equipment_health (product framing is four outcomes in the master document; field not migrated yet) |
| Money | Tariff-cited decomposition; no silent invent |
| Dual-lane | Outbox only when status=emitted and delivery=l4 |
| Envelope | record_type=finding via StampedRecordEnvelope |
In-memory tradeoff attached for Lab / L4 tool paths is stripped before outbox (PrescriptionWhat to do, why, who, check plan (direction; as built: prescription.json 1.0.0 / card-proposal) / card scoped).
Historical build docs that say FindingAs-built L3 detector output admitted to L4 (finding.json 1.2.0) 1.1.0 are outdated for emit.
Direction: EvidenceLayer contract for detector output (direction; as built: Finding finding.json 1.2.0) replaces the energy-only Finding with value_vector, contract tier, and evidence labels (D13, DECIDED). PlantState (section 5.1) is produced by estimators and the twin, not by the outbox.
How a Finding becomes L4 work#
Core outbox publish → L4 inbox / DecisionRuntime intake → floor checks (schema, bind, evidence, verification, detector identity when present) → staged graph → terminals emit | supersede | withhold | abstain → card-proposal only when emit allowed.
Normative L4 side: ../l4/15-l3-l4-interface.md · ../l4/07-finding-runtime.md · as-built map ../l4/30-as-built.md.
| L3 owns | L4 owns |
|---|---|
| Detection methods, calculator references, verification-plan builder | Decision runtime, portfolio, card proposal |
| Dual-lane emit | Terminals; never invent ₹ |
Lab / Discovery rows never become customer cards without a new emitted+l4 Finding (or a certified L4 discovery path — contract, not a Lab promote).
Pivot fields L4 cares about#
| Need | Why |
|---|---|
| Schema-valid 1.2.0 | Reject intake otherwise |
ops_clearance | L5 clearance poll later |
Impact / evidence / dedupe_key / engine identity | Bind and audit |
Envelope emitted + l4 | Only of-record work enters the decision runtime |
Optional intake-floor fields (detector_id, detector_version, condition_key, …) may appear on 1.2.0 without a schema bump — see finding.json description and 15-l3-l4-interface.md.
Fast loop and Findings (direction)#
Twin outputs (PlantState direction, write requests, alerts, signals) are not Findings and never enter L4 intake. A twin condition becomes a card only when a scheduled twin-record engine detects it from L2 and emits a 1.2.0 Finding through the outbox. Such Findings cite the episode_id and the plant-box lockfile id inside existing evidence references; no schema bump is claimed. A dedicated field would be a separate contract change. See 05-twin-and-fast-loop.md.
Page history: last 4 changes
- docs(technical): rewrite l3/ to the architecture
4a28bbd - docs(l3): twin runtime, twin-record engines, packs and replay as direction
28255e9 - docs(architecture): align identity with the four-outcome master document
1663dd2 - docs(l3): document rulepacks, evals, and L4 intake
8013d9c