Skip to content

Mental model

If you only read one page of these docs, read this one. Everything else either zooms into a piece of this picture or shows you how to operate it.

The one-paragraph version

LDTC is a ฮ”t-clocked controller wrapped around a plant. Every window, it estimates how predictable the loop's signals are from each other (๐“›_loop) versus how predictable they are from the environment (๐“›_ex), takes the decibel ratio M = 10 ยท logโ‚โ‚€(๐“›_loop / ๐“›_ex), and asks two questions: "Is M above Mmin?" (NC1) and "After we kick the plant with a labeled ฮฉ, does M recover within ฯ„_max?" (SC1). The raw measurements stay locked inside an enclave (LREG); only a tiny, signed packet of derived bits leaves. A hash-chained audit log records every step. If anything looks fishy (ฮ”t was edited too often, the CIs blew up, the partition flapped under ฮฉ), smell tests invalidate the run before any indicator is signed.

The actors

Actor Code Job
Scheduler FixedScheduler Wakes up every ฮ”t and runs one tick.
Plant Plant / HardwarePlantAdapter The thing being measured: (E, T, R, demand, io, H) evolve in time.
Controller ControllerPolicy Reads state, predicts risk, writes actuators.
Window buffer SlidingWindow Collects W samples for the next estimator pass.
Estimator estimate_L Turns a window into (๐“›_loop, ๐“›_ex) with bootstrapped CIs.
Partition PartitionManager Decides which signals are "loop" vs "exchange," with hysteresis and an ฮฉ freeze.
LREG LREG Write-only enclave that holds raw ๐“›; only derive() returns sanctioned indicators.
Audit AuditLog Append-only, hash-chained event journal.
ฮ”t guard DeltaTGuard Rate-limits and audits ฮ”t changes.
Smell tests smelltests Invalidate runs that violate measurement hygiene.
ฮฉ battery omega.power_sag, omega.ingress_flood, omega.command_conflict Apply labeled, time-bounded perturbations.
Refusal arbiter RefusalArbiter Refuses risky commands when M < Mmin; records T_refuse.
Indicator exporter IndicatorExporter Builds a CBOR payload and Ed25519-signs it.
Reporting reporting.artifacts.bundle Renders the timeline figure, SC1 table, and manifest.

What each tick does

        โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
        โ”‚                       FixedScheduler                     โ”‚
        โ”‚            wakes every ฮ”t, runs the closure below        โ”‚
        โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                     โ”‚
                                     โ–ผ
            โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
            โ”‚ 1. adapter.read_state()  โ”€โ”€> state dict        โ”‚
            โ”‚ 2. policy.compute(state, predicted_M_db,       โ”‚
            โ”‚      risky_cmd) โ”€โ”€> action                     โ”‚
            โ”‚    โ””โ”€โ”€ arbiter.decide() if risky_cmd present   โ”‚
            โ”‚ 3. adapter.write_actuators(action)             โ”‚
            โ”‚ 4. window.append(state vector)                 โ”‚
            โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                     โ”‚
                                     โ–ผ
            โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
            โ”‚ 5. if window full:                             โ”‚
            โ”‚      L = estimate_L(window, partition)         โ”‚
            โ”‚      M = m_db(L.L_loop, L.L_ex)                โ”‚
            โ”‚      LREG.write(LEntry(...))                   โ”‚
            โ”‚      audit.append("window_measured", ...)      โ”‚
            โ”‚      smell tests: ci_inflation, etc.           โ”‚
            โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                     โ”‚
                                     โ–ผ
            โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
            โ”‚ 6. periodically:                               โ”‚
            โ”‚      derived = LREG.derive()                   โ”‚
            โ”‚      exporter.maybe_export(priv, audit,        โ”‚
            โ”‚                            derived, cfg,       โ”‚
            โ”‚                            last_sc1_pass)      โ”‚
            โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

The scheduler runs the tick closure in a daemon thread, so keyboard interrupts and the post-run audit checks stay responsive.

What an ฮฉ trial does

An ฮฉ handler such as omega.power_sag.apply is just a labeled configuration change to the plant. Around it, the CLI:

  1. Records baseline ๐“›_loop from the previous window.
  2. Calls partition.freeze() so SC1 cannot be gamed by reshuffling (C, Ex) mid-perturbation.
  3. Appends an omega_event audit record with the kind and parameters.
  4. Lets the scheduler keep ticking; estimators continue to fire and the trough of ๐“›_loop is recorded.
  5. After the labeled interval ends, calls partition.unfreeze() and waits for ๐“›_loop to recover to baseline ยท (1 โˆ’ ฮต). The elapsed time is ฯ„_rec.
  6. Calls sc1_evaluate with (๐“›_loop_baseline, ๐“›_loop_trough, ๐“›_loop_recovered, M_post, ฮต, ฯ„_rec, Mmin, ฯ„_max); the boolean result becomes the next SC1 bit.

What you can quietly tune (and what stops you)

Two pieces of design exist specifically to keep authors from sneaking past NC1 / SC1:

  1. Raw ๐“› is locked in LREG. No public method on LREG returns raw values; the sanctioned escape hatch is derive, and CSV writers plus the indicator builder both run audit_contains_raw_lreg_values before emitting anything.
  2. ฮ”t, partition, and CI are watched. Smell tests in ldtc.guardrails.smelltests flag invalid_by_ci, invalid_by_partition_flips, invalid_flip_during_omega, audit_chain_broken, and the subsidy red flag. Excessive ฮ”t edits are rejected inline by the DeltaTGuard. Each invalidation appends to the audit and forces the next exported indicator to carry invalidated = true.

This is what we mean by "operational, not metaphysical": the indicators are bits, but the protocol around them is what gives the bits their meaning.

How LDTC differs from a generic control loop

Feature Generic control loop LDTC
Time base Best-effort Hard-fixed ฮ”t, audited changes only.
Telemetry sink Logs / Prometheus Write-only enclave + signed indicators.
Failure mode Alert / page Audit run_invalidated, signed invalidated bit.
Metric output RMS error, set-point M (dB), ฮด, ฯ„_rec, NC1, SC1.
Adversary model None Operator who would like NC1 / SC1 to come out a particular way.

If you would not be comfortable claiming the result because the loop got to choose its own thresholds, partition, or ฮ”t mid-run, the harness is doing its job.

Reading the rest of the docs

  • Lifecycle goes through one CLI invocation end-to-end: process startup, scheduler, audit close, artifact bundle.
  • Architecture gives the static module map and data-flow diagram.
  • Indicators describes the wire format and what a verifier checks.
  • Guardrails enumerates the smell tests with their thresholds.
  • Paper-to-code is the per-section crosswalk from the manuscript.