Status
as-built
Conceptual layer
③ Analytics
Repo layer
L3 intelligence-core (stamped_l3_core)
Source
architecture section 3.6.3, section 3.3b jobs 1–5

Pipeline#

L3 detection runtime

intelligence-core

L2 query HTTP / fixtures

PathScheduler
hot ~900s / warm ~3600s / cold ~86400s

Engines → Finding 1.2.0

waste_classifier / value_domain

SuppressionService

publish: emitted ∧ delivery=l4 only

TransactionalOutbox

LabLog

L4 inbox

How to read it.

  1. L2 data enters on hot, warm or cold paths; PathScheduler ensures cold never blocks hot.
  2. Engines build Finding 1.2.0; classifiers and suppressions run before dual-lane routing.
  3. Only status=emitted and delivery=l4 reach L4; all other rows stay in LabLog / RunArtifact 1.1.0.

Build now: this slow-loop pipeline. Later: router abstain and Evidence 2.0.0 per section 5.2.

View Mermaid source
flowchart TB
    %% house-style: l3-detection-runtime
    l2["L2 query HTTP / fixtures"]
    subgraph core["intelligence-core"]
        direction LR
        sched["PathScheduler<br/>hot ~900s / warm ~3600s / cold ~86400s"]
        eng["Engines → Finding 1.2.0"]
        wc["waste_classifier / value_domain"]
        sup["SuppressionService"]
    end
    lane{{"publish: emitted ∧ delivery=l4 only"}}
    out["TransactionalOutbox"]
    lab["LabLog"]
    l4["L4 inbox"]
    l2 --> sched --> eng --> wc --> sup
    sup --> lane --> out --> l4
    sup --> lab

    classDef govc fill:#fff4d6,stroke:#c99a2e,color:#000
    classDef agentc fill:#e8f0ff,stroke:#5b7bd5,color:#000
    classDef loopc fill:#eef7ee,stroke:#4f9a4f,color:#000
    class lane govc

Paths#

PathInterval (default)DoesNotes
Hot~900sMD (+ PF/TOD when configured); registered hot engines; CNC fleet if ENABLE_CNCMust not stall behind cold
Warm~3600s · lookback P7DEWMA / CUSUM residuals → unexplained drawLab by default; outbox if ENABLE_WARM_EMIT / PROOF_RUN
Cold~86400s · lookback P30DTOW-P baseline fit; TimesFM / TabPFN / LGBM shadow onlyShadows are not L4 work (D8)
Dual-modeon demandSame engines on live lookback or historian [from_ts,to_ts]Evidence tags carry data_source: / window: only

PathScheduler ensures cold never blocks hot.

Dual-lane#

LaneConditionDestination
L4status=emitted and delivery=l4Outbox → L4 inbox
Labeverything else (suppressed, shadow, hypothesis, …)LabLog / RunArtifact 1.1.0

Invariant (detection_lane.py): delivery == l4 iff status == emitted. There is no promote-Lab-to-L4 path in core.

Money#

ConcernBehavior
Tariffget_active_tariff from L2 → stamp l2:{tariff_id}: or tagged fallback:
DecompositionEngines attach INR / kWh bands with bill_line hints where applicable
GuardOutbox blocks forged INR ≥ 1M without decomposition

Fail-closed#

GateEffect
No L2_DATABASE_URLCore never opens Timescale
Missing tagsEngine KeyError / empty — no invented points
SchemaOutbox rejects Finding ≠ 1.2.0; requires ops_clearance
Suppressionsstartup / maintenance / mix / data_quality
AreaPackage path
Schedulerstamped_l3_core.scheduler
Engine registrystamped_l3_core.engines.registry
Dual-lanestamped_l3_core.detection_lane
Outboxstamped_l3_core.outbox
L2 clientstamped_l3_core.clients.l2

Fast path (direction)#

A second deployable, stamped-l3-twin, runs a per-second loop on the Plant BoxPlant-side computer for the fast loop (direction; D4) (D4): read the plant broker, check freshness and bounds, load the context's parameter row, predict and update, run accepted procedures, checkpoint, send records to L2 (D3). It holds no outbox and emits no Findings; scheduled engines pick up its records from L2. Detail: 05-twin-and-fast-loop.md · ../fast-loop/01-twin-runtime.md.

Next: 02-engines.md.

Page history: last 3 changes
  1. 2026-10-07 docs(technical): rewrite l3/ to the architecture 4a28bbd
  2. 2026-10-03 docs(l3): twin runtime, twin-record engines, packs and replay as direction 28255e9
  3. 2026-09-27 docs(l3): document detection runtime and engines 0a02a37

Diagram

100%

Search the architecture