Status
contract + direction
Conceptual layer
④ Decision
Repo layer
L4 knowledge-reasoning
Source
architecture section 4, section 3.6.4
Normative kernel
00-kernel.md
ADRs
ADR-024 · ADR-021 · ADR-019
Siblings
03-plant-situation-model.md · 04-constraints.md · 18-contract-deltas.md
Change class
Data (topology rows, suggestions) · Plug-in (new builder-read shapes) · Structural only if publication path changes

Purpose#

Cross-asset checks need more than a list of assets. They need directed flow, buffers, lag, shared utilities, and who draws from what. This doc states where that structure lives, how it reaches L4, what happens when it is missing, and what minimum evidence a family or pattern needs before it may run at a plant.

L4 never invents plant topology into live use. A named plant owner confirms structure into the site packVersioned, owner-reviewed plant configuration including topology. Humans decide and execute; L4 recommends against structure that already exists.


Decision 1 — Site-pack topology is the plant-structure SSOT#

Decision. Plant structure lives in a versioned topology section of the site pack, not in an L4-only config and not as an inventable graph inside the Plant Situation Model (PSMPlant Situation Model). L2 remains the store of record for published topology; graph modules are read-only views (D1, architecture section 4).

Content of the topology section (versioned together):

ElementWhat it carries
Areas / linesStable ids, display names, parent plant, optional process role
Flow edgesFrom-asset → to-asset (or area handoff); direction; buffer size where known; lag (transport or queue delay)
Shared resourcesKind + id + capacity where known: feeder, transformer, compressor header, chiller loop, furnace, fixture, crew pool (and later kinds via registry)
Meter hierarchyMeter → parent meter / feeder / transformer; which measurements bind to which resource
Asset → resource drawsWhich assets draw which shared resource; draw class (power, air, cooling, fixture slot, crew role)

Numbers that are not measured or ops-locked at a site (for example a default buffer of “12 pieces” or lag of “8 minutes” in a worked example) are illustrative until the site pack carries the real values.

Reason. L3 detectors and L5 verification need the same flow and shared-resource facts L4 uses for footprints and constraint neighbourhoods. If L4 alone owns topology, those layers cannot see it, and the graph drifts from what the plant believes is true.

Rejected. L4-only topology config; auto-accepting model-proposed edges into live structure; requiring a full plant ontology before the first card.

Would change this. A layer other than the site pack becomes the shared, versioned, owner-reviewed artifact for structure — with the same publication path and owner gate. Until then, site pack stays.


Decision 2 — Publish L1 → L2 as typed topology records; L4 uses builder reads#

Decision. L1 publishes topology as typed topology records into L2 (contract shapes in 18-contract-deltas.md). L4 does not parse site-pack YAML at runtime for live decisions.

Builder reads (bulk / list APIs for the PSM builder) are separate from the agent tool catalog (ADR-019 allowlisted tools). Builder reads:

  • feed the PSM builder and propagation code;
  • may return area-wide or plant-wide topology slices;
  • are read-only;
  • are not exposed as model-callable tools.

Models never walk the graph. They request typed zoom reads that code executes (see 03-plant-situation-model.md).

Reason. ADR-019 forbids model graph traverse. Bulk structure for a derived cache is a different job from a focused tool call during a decision run. Mixing them either starves the builder or hands models a traverse surface.

Rejected. Giving models a graph/traverse tool; having L4 read pack files directly as SoR; writing topology from L4 into L2.

Would change this. A measured need for a single read surface that still keeps models off the walk — with proof that bulk builder traffic does not become an agent tool.


Decision 3 — Topology suggestions: propose → owner confirms → site pack#

Decision. A model (or scanner) may propose a missing link or shared-resource draw. The proposal becomes a topology suggestion with:

  • claimed edge or draw;
  • evidence (ledger ids / L2 fact refs);
  • expiry;
  • target named plant owner.

It enters the site pack only when that owner confirms. Confirmation is a pack version bump, then republish L1 → L2.

Rejected suggestions are remembered (negative memory / suggestion ledger). They are not re-proposed without new evidence (new facts, new epoch, or materially stronger support).

Reason. Most plants have incomplete formal topology. Letting the model fill gaps silently produces a private fiction. Forcing every suggestion through a named owner keeps plant truth plant-owned.

Rejected. Auto-merge of high-confidence edges; re-proposing the same rejected link every shift.

Would change this. A plant opts into a narrow auto-accept class (for example meter→feeder from a certified connector) with owner-set policy — still not free invention of process flow.


Decision 4 — Missing structure → unknown; unknown in a constraint neighbourhood → withhold#

Decision. A cross-asset check that needs a flow edge, lag, buffer, or shared-resource link and cannot find it returns unknown, not a guessed satisfied.

If that unknown sits in the constraint neighbourhood of a candidate (the scopes the candidate’s footprint and applicable constraints touch), the kernel withholds (reason includes constraint / structure unknown). Modeled benefit does not override. See 00-kernel.md and 04-constraints.md.

Reason. Pretending a feeder relationship exists so a card can emit is how plants lose trust. Honest unknown is better than a confident wrong neighbourhood.

Rejected. Defaulting missing edges to “no interaction”; LLM judgment that “they are probably independent.”

Would change this. EvidenceLayer contract for detector output (direction; as built: Finding finding.json 1.2.0) that a specific check class is safe with a declared default, registered per family, still failing closed outside that class.


Decision 5 — Commissioning: minimum evidence before a family or pattern activates#

Decision. Each decision family and discovery pattern declares a commissioning checklist. Until the named plant owner marks the checklist satisfied for that plant, the family/pattern stays shadow or inactive for emit.

Checklist dimensions#

DimensionMinimum before activation
TopologyRequired areas, flow edges, and asset bindings named by the family/pattern
Shared resourcesRequired resource kinds with capacity or explicit “capacity unknown → bound checks withhold”
ConstraintsRequired constraint kinds present (or explicit advisory-only mode if the family allows)
Verification signalsL2 signals named in the verification recipe must resolve for in-scope assets

Worked commissioning rows (illustrative families / patterns)#

These rows are illustrative templates for the registries — not a claim that any named plant already meets them.

Family / pattern (illustrative id)Topology minimumShared-resource minimumConstraint minimumVerification-signal minimum
family.idle_auxiliary_loadAsset in an area; meter or load binding for the assetFeeder or panel draw for the asset (or explicit single-asset scope)Availability / quality-hold if the family touches restartasset_state + load measurement path used by the Finding verification plan
family.demand_spike_responseMeter hierarchy up to the billed or controlled level the card namesFeeder / transformer capacity where a bound appliesbound on feeder or contract window if claiming a demand limitInterval demand / meter series L3 already uses for the Finding
pattern.shared_furnace_overlapFlow or schedule-adjacent assets that share the furnace resourceFurnace (or fixture) resource with capacityMutual exclusion or cumulative capacity on that resourceAsset start/stop or batch start events for both assets
pattern.compressor_header_contentionAssets drawing the headerCompressor header + capacity or envelope methodCumulative capacity or reserve marginHeader pressure / kW and asset draw signals
pattern.handoff_wait_recurringDirected flow edge with lag between upstream and downstreamBuffer size if the pattern claims starvation vs blockPrecedence / min separation if claiming sequenceQueue or flow_position / batch timestamps on both sides
family.exception_after_stopAsset + areaCrew pool if recommending a call-out roleDo-not-disturb / quality / maintenance constraints that block restartStop event + post-stop asset_state

Activation is per plant. Global certification of a pattern is not the same as plant commissioning.

Reason. A pattern that needs a shared furnace will invent conflicts if the furnace resource is missing. Commissioning makes the gap visible before the first live card.

Rejected. “Ship the family; fill topology later”; plant-wide ontology as a prerequisite for any card.

Would change this. Measured safe emit for a family with a reduced checklist, still with explicit unknown→withhold on the omitted dimensions.


Why site pack (not L4-only)#

Plant structure is plant truth. L3 uses it for detectors that span assets. L5 uses it for verification neighbourhoods and footprint display. Ask and offline improvement need the same ids. The site pack is already the per-plant, versioned, owner-reviewed artifact (ADR-019 packs). Owning structure only inside L4 would hide it from every other layer and turn suggestions into silent writes.

The PSM (03-plant-situation-model.md) caches published topology with provenance. It is not the system of record.


Failure modes the plant sees#

FailureWhat L4 doesWhat the plant sees
Topology unpublished / stale pack versionBuilder cannot refresh structure; runs that need it withhold or stay shadowFewer cards; staff see structure-unknown in traces / backlog where soft gates apply
Suggestion rejectedRemembered; no re-spamOwner is not asked again without new evidence
Capacity unknown on a shared resourceBound / cumulative checks return unknown → withhold when hardNo card that pretends the feeder limit is known
Family activated without commissioningBlocked by release / plant override rulesPattern stays shadow until owner completes checklist

Relation to constraints and the kernel#

  • Constraint rows reference topology scopes (asset, edge, shared resource, area). See 04-constraints.md.
  • Hard vs soft gates are kernel concerns (00-kernel.md, ADR-025). Missing structure that yields unknown on a hard constraint is a hard-gate withhold — not a soft threshold to tune.

v1 slice vs later#

In v1Later
Topology section fields above; L1→L2 typed records; builder reads for PSMRicher resource kinds via registry; optional narrow auto-accept classes
Suggestions with evidence, expiry, owner confirm, rejection memoryConnector-certified meter hierarchy auto-proposals under owner policy
Per-family / per-pattern commissioning checklists for Pilot 1 familiesFull catalog coverage as families certify
Missing structure → unknown → withhold in neighbourhoodDeclared safe defaults only where registered and proven

Open gaps#

  1. Exact topology record schemas and builder-read paths land in 18-contract-deltas.md (not fully specified here).
  2. Seed commissioning checklists for every registry family/pattern are owned by the shared registry pack once that pack exists under stamped-external/registries/.
  3. 00-kernel.md may still be landing in the same docs set; this file links it as the normative gate surface and does not restate terminals.
Page history: last 3 changes
  1. 2026-10-07 docs(technical): rewrite l4 00-10 to the architecture c52a111
  2. 2026-10-03 docs(decisions): renumber live ADRs 001-032 in order, mark withdrawn refs ADR-W###, repoint withdrawn links to archive, note partial supersessions 36c944e
  3. 2026-09-25 docs(l4): agentic decision architecture, ADRs, and production hardness 8275e7c

Diagram

100%

Search the architecture