Progress is grouped by calendar day, newest first. Detailed acceptance criteria remain in the engineering backlog; this log is the concise public chronology.
- Transferred the public repository into the
Limited-Undergroundorganization and renamed it fromOpenGaugetoDisplay. GitHub repository ID1328425491,mainhistory, two merged pull requests, workflow ID330673065, and all 54 existing Actions runs were preserved; the former URL redirects to https://github.com/Limited-Underground/Display. - Updated the public landing-page title and Host validation badge while
preserving
OpenGauge,opengauge, andOG-engineering, protocol, storage, schema, and compatibility identifiers. This administrative change does not alter V1 progress, hardware evidence, or readiness.
- Locked Limited Underground as the working parent brand and Limited
Underground Display as the working customer-facing vehicle firmware and
software family, while preserving
OpenGauge,opengauge,OG-, protocol, schema, storage, cryptographic, and board identifiers as stable engineering names. - Reserved Limited Underground Display Premium Bundle for an exact hardware and software combination that has passed its documented acceptance gates. Display Gateway remains a component name unless it is deliberately sold and supported separately.
- Recorded the shared Limited Underground Firmware Loader name. Until real flashing and recovery are physically verified, customer presentation remains Limited Underground Firmware Loader — Preview with inspection-only wording. All names remain provisional pending comprehensive clearance; no registered-mark claim is made. This naming decision changes no V1 completion evidence or production-readiness claim. See the product-naming decision.
- Added a backend-neutral compiler from one complete dashboard frame to a fixed-array plan for a half-open 466 by 466 logical circular profile. One through eight widgets emit exactly one panel, label, and primary primitive; an optional recovery badge remains nonoverlapping. The maximum is 25 primitives, and a caller may enforce a smaller explicit backend budget.
- Numeric, needle, and bar widgets carry a measurement only for
validinput. Suspect, missing, stale, unavailable, error, out-of-range, and unknown states become attention-bearing state badges with no value, unit, or normalized position. Status fails closed until the signal registry has a reviewed Boolean signal. - Frame, registry, value-shape, geometry, and capacity validation occurs before the caller's prior plan changes. Smaller recompilation clears the inactive tail; needle/bar normalization is overflow-safe across the full signed 64-bit range. Semantic equality ignores only diagnostic publication sequence/time and inactive capacity, and receiver-private metadata is absent.
- Nine strict C++17 scenario groups pass 100/100 independent repeats. The complete host run passes 52 executed test binaries, 53 compiled names, and both publication-safety scans; one compiled physical CLI is intentionally not executed. This does not draw pixels or prove a graphics framework, target driver/task, localized or accessible presentation, touch, timing/memory/power, or physical compatibility. See the round render-plan contract.
- Added one facade-owned presentation latch after changed running-layout
activation. While the facade or runtime still owns that exact generation,
all new layout mutations fail before confirmation-token consumption or a
storage write, and
service_presentationis the sole serialized runtime service route. - A successful renderer service produces a one-cycle receipt only for a frame accepted and generation-tracked by that runtime. Only an exact matching generation completes the facade gate; the receipt cannot replay. An exact receipt may complete despite an unrelated nested dashboard or frame-observation error, which remains available diagnostically.
- Busy, offer, renderer-service, and clock failures retain coherent pending work. Direct runtime service or stop, latch/generation mismatch, or a tracked wrong-generation presentation instead requires reconstruction and keeps mutation blocked. Spurious untracked signals remain ordinary pending; an exact no-op creates no new obligation, while zero-write activation retry can transition into the same gate.
- Eleven focused strict C++17 scenario groups pass 100/100 independent repeats. The inherited renderer-runtime 11 groups and activation-workflow ten groups pass, and the complete host run passes 51 executed test binaries, 52 compiled names, and publication-safety scans. One compiled physical CLI is intentionally not executed. See the presentation-completion contract.
- Added one display-side facade that owns local layout confirmation for the exact store bound to the running dashboard. Store identity, running state, and absence of accepted renderer work in flight are checked before confirmation can consume the prompt or write.
- Successful changed or unchanged persistence reloads only its exact generation and atomically updates live model/visible metadata. A changed model or metadata invalidates the dashboard copy and discards only unoffered pending runtime work; an exact no-op preserves frame and pending work. Activation performs no renderer offer/service or time/telemetry cycle, so an existing presented front may remain while later new-generation presentation is explicitly pending.
- Commit uncertainty has unknown generation, blocks new mutation, and requires reconstruction/restart reconciliation. A definite post-persist activation failure instead latches the exact generation; retry performs no confirmation or write, rejects generation drift, and preserves the old model/frame until exact activation succeeds.
- Ten focused scenario groups pass strict C++17 validation and 100/100 independent repeats, and the complete 50-executable host matrix passes. The host script compiles 51 named programs because one physical CLI is intentionally not executed. Target serialization, source authority, rendered prompt/physical input, ESP-IDF storage, pixels, and physical display evidence remain separate gates. See the activation contract.
- The operator assigned the connected battery-free USB candidate public-safe
ID
OG-DISP-001, confirmed its prior demo was visible, and passed the cold BOOT-strap recovery gate. LabeledOG-DISP-002remained disconnected and untouched. A passive roster showed exactly one Started Port-class303A:1001interface without retaining a port or private identifier. - The exact 16,777,216-byte official v1.0.1 HelloWorld combined image matched
its recorded SHA-256 and was written at offset
0x0without erase, force, security override, or eFuse operations. Esptool reported verification, and the operator visually observedHello World. - The exact 16,777,216-byte official factory image from pinned source commit
ec7380d2aef4d54816a29d7940ef8f756e4bbd1bmatched its recorded SHA-256 and was written with the same non-erasing/force-free shape. One public interface returned, and the operator confirmed the original demo looked good. The private original backup remains outside Git and was not restore-tested. - This passes a bounded recovery-first vendor image/display checkpoint only. OG-012A remains planned and candidate-only; touch, audio, IMU, RTC, PMIC, Micro SD, resources/timing/stability, power/heat, paired independence, OpenGauge firmware, and support remain unproved. See the dated Phase-C evidence.
- Added a display-neutral
GaugeRendererboundary and single-owner runtime that services the dashboard exactly once, retains or replaces one newest complete pending frame, attempts at most one nonblocking offer, and services the renderer exactly once for every accepted monotonic cycle. - Busy and hard offer failures retain pending work. Accepted work moves to the renderer, whose service failure preserves its in-flight frame and the prior complete front frame while later dashboard cycles continue aging telemetry. Primary failure follows dashboard/copy, offer, then renderer-service order; exact nested errors remain available. Caller-time rollback mutates no downstream state, and equivalent or nonunique publication sequences are not silently suppressed.
- Eleven focused groups pass with C++17 warnings-as-errors and 100/100 repeats. They cover lifecycle/rollback, fieldwise semantic comparison, exact service order, bounded latest-frame coalescing, offer/service failure retention, exact stale/no-value under busy rendering and rejected traffic, and pending ownership. The complete 49-executable host matrix also passes. Diagnostic counter saturation is implemented but was not forced to maximum in tests. Pixels, text/localization, accessibility, touch/input, ESP-IDF scheduling and drivers, target allocation, and physical display behavior remain separate gates.
- Added a single-owner display-side loop that selects the validated safe or
newest usable
OGL0layout, verifies the view model is bound to the exact receiver, and publishes one complete fixed-capacity renderer-neutral frame only after servicing the receiver once and refreshing every widget. - Typed receiver rejection, malformed input, transport failure, and packet-time regression cannot replace good state, while elapsed time still advances it to exact-boundary stale/no-value. Caller-time rollback is rejected before receiver, transport, or view work; refresh failure preserves the prior complete frame.
- Twelve focused groups pass with C++17 warnings-as-errors and 100/100 repeats. They include real encrypted fake delivery through the packet decoder and receiver into numeric, needle, and bar snapshots, plus safe/newest/degraded layout selection, session clearing, and restart reload. The complete 48-executable host matrix also passes. Renderer/input binding, ESP-IDF scheduling, target storage, RF, and physical display acceptance remain separate gates.
- With the second display disconnected and untouched, esptool 5.3.1 without its
RAM stub identified the connected target as ESP32-S3, reported 16 MB flash,
and reported Secure Boot and flash encryption disabled. The redacted result
did not separately expose Secure Download state, so that mode remains
unreported and unknown in the public record. A separate
flash-idcommand completed, but no broader security inference is accepted. - The sole privacy-safe Started
303A:1001interface returned after both metadata resets. A default-stub backup attempt failed before flash transfer with no retained partial file; a 4 KiB probe and then a 16,777,216-byte full-flash read through the ESP ROM loader using--no-stubcompleted, with the full capture hashed and retained privately outside Git. The interface returned after that reset as well. No raw log, port, MAC, private backup hash, or private path is published. - The pinned Waveshare factory image and v1.0.1 HelloWorld ZIP/combined image
matched their public SHA-256 values and offset-
0x0manifests; the packaged script contains no erase, force, or security override. No image was written. - The display was not visually checked after reset, manual BOOT recovery was not attempted, and the box/unit/public-ID association remains open. OG-012A therefore remains planned and candidate-only. See the dated Phase-B evidence.
- Recorded the owner's report that two 1.75-inch round-display candidates are on hand, with one temporarily disconnected during the observation.
- The supplied package photo names the public
ESP32-S3-Touch-AMOLED-1.75-Bmodel with case. The visible label does not show SKU31262or a board revision, so the procurement mapping and exact physical-unit association remain open. - An underside label names
ESP32-S3 Touch AMOLED 1.75and prints a public component map for a 466x466 AMOLED, CST9217, CO5300, 16 MB flash, 8 MB PSRAM, QMI8658, AXP2101, PCF85063, TCA9554, ES8311, and labeled Micro SD, speaker, battery, USB-C, microphone, BOOT, power, and header interfaces. These are printed identification/specification claims, not functional validation. - One supplied photo shows a powered launcher rendering SquareLine,
Calculator, DrawPanel, AIChats, status icons, and page indicators. This proves
only power and display rendering, not touch or peripheral behavior. A second
demo screen displays manufacturer
Waveshareand UI frameworkESP-Brookesia; it establishes no version, source commit, authenticity, or second-unit result. - A privacy-safe Windows Port-class roster changed from two
303A:1001interfaces to one when a unit was disconnected; the interface description wasUSB Serial Device, manufacturerMicrosoft, stateStarted. No port was opened and no unit was reset, queried with esptool, flashed, or otherwise changed. OG-012A remains planned and no hardware support claim was added. See the dated arrival observation.
- Added one public role/dependency map separating the vehicle gateway from gauge endpoints and optional GNSS, additional display, OpenTrail bridge, and auxiliary roles.
- Clarified that the ordered 1.75-inch round touch unit can serve as a complete compact gauge endpoint. A larger touchscreen is an alternative renderer for more simultaneous content and navigation, not a base requirement.
- Required both display shapes to consume the same normalized telemetry, explicit stale/error state, alarms, and semantic configuration boundaries; each still needs its own readability/touch/resource/power acceptance.
- Preserved independent failure: display loss cannot stop gateway acquisition; GNSS/OpenTrail/auxiliary absence cannot stop core instrumentation; and raw CAN/J1939 never crosses into OpenTrail.
- Composed the existing canonical exporter and confirmed importer across two independent fake stores without adding a hidden transfer shortcut.
- Source generation 2 exports exactly, while a destination already at generation 10 performs no write during preview and stores the confirmed content as its own generation 11. Restart selects that destination record.
- Re-importing the same source record under a new confirmation token returns unchanged at generation 11 with no extra write; destination re-export carries generation 11 and the transferred content.
- Eleven cumulative workflow groups pass 100/100 focused repeats plus the complete 47-executable host matrix including publication safety. File transport, source/destination authorization, and physical behavior remain open.
- Added
GaugeLayoutStore::export_current, which reuses normal boot selection and returns the exact load source, both slot states, and recovery requirement with one canonical 576-byteOGL0record. - Known empty/corrupt storage can export the separately validated safe default; one known valid slot can be exported with recovery visibly required. A valid older slot is not exported when the other slot is unreadable because it may hide a newer committed generation.
- Invalid output capacity, invalid safe default, equal-generation conflict, and I/O degradation fail without changing the caller's sentinel-filled buffer.
- Thirteen cumulative layout groups pass 100/100 focused repeats plus the complete 47-executable host matrix including publication safety. File/download adapters, access/confidentiality policy, and physical behavior remain open.
- Added
stage_import_recordto the layout-change workflow. It accepts only the exact 576-byte canonicalOGL0record and preserves the decoder's typed length, magic, version, canonical-form, checksum, and layout errors. - Successful decode returns only a bounded summary for preview and then stages the decoded content under the existing single-use confirmation token. The record's source generation is informational; confirmation allocates the normal next local generation.
- Short input cannot consume a request ID. Corrupt input performs no write and
cannot replace an already-live confirmation prompt. Even a source generation
of
UINT64_MAXbecomes local generation 1 on empty storage after exact confirmation, with zero erases. - Ten cumulative workflow groups pass 100/100 focused repeats plus the complete 47-executable host matrix including publication safety. File selection, source authorization/authenticity, renderer/input binding, and physical target behavior remain open.
- Added
stage_restore_defaultto the existing layout-change workflow, sharing its one pending request, exact confirmation window, same-boot replay rules, generation allocation, uncertainty handling, and operator projection. - A confirmed compiled default is stored as an ordinary next generation. Host restart selects it as newest; a repeated restore is unchanged and causes no write; invalid default content fails before persistence.
- The workflow test explicitly proves zero slot erases during stage, confirm, restart, unchanged repeat, and invalid request. Low-level two-slot erase remains a separate service/replacement primitive rather than a casual UI reset.
- Nine cumulative workflow groups pass 100/100 focused repeats plus the complete 47-executable matrix including publication safety. Renderer text/input, source authorization, target concurrency, and physical behavior remain open.
- Changed the two-slot layout reset path to preserve
commit_uncertainwhen either erase reaches a failed backend commit; ordinary erase failure remains distinct, and both slot erases are still attempted. - Expanded the target-shaped key/value suite across failed commit on slot A or slot B, with the erase applied and unapplied in each position. Restart chooses safe default only when both keys are actually gone; otherwise it selects the surviving prior generation with recovery required.
- The eleven adapter groups and twelve core groups pass 100/100 focused repeats plus the complete 47-executable matrix including publication safety. Reset confirmation, ESP-IDF behavior, physical interruption, and endurance remain open.
- Added one facade that owns the coordinator and returns operation error, persistence evidence, projection error, and operator status together for start, stop, snapshot, stage, confirm, cancel, and expiry service.
- The projection is derived before the method returns from the coordinator's immediate post-operation status. Callers no longer supply or later re-pair an operation observation with mutable state.
- Eleven groups cover lifecycle/policy, exact prompt staging, mismatch without prompt loss, apply/unchanged persistence, cancel/expiry, ordinary failure versus uncertainty, clock rollback, same-boot request replay, and confirmed default restoration without slot erase, strict confirmed import with non-authoritative source generation, and independent export/import transfer. Both underlying error and projected next action remain available.
- The suite passes 100/100 focused repeats plus the complete 47-executable host matrix including publication safety. The facade owns no lock, RTOS task, renderer, local-input proof, source authority, diagnostic policy, or target backend.
- Added a separate magic/versioned 32-bit diagnostic encoding for coarse layout-change operator state, requested action, attention, confirmation, and rejected-action flags.
- Struct and codec boundaries omit request ID, remaining confirmation time, layout generation/content, widget labels, and counters. A fixed redaction bit is required; nonzero reserved bits, unknown enums, and incoherent flag/state combinations fail closed.
- The adapter records through the existing fixed diagnostic ring under the configuration event family. Normal lifecycle state is info, expiry/rejection is warning, and persistence failure/uncertainty or clock fault is error.
- Eight groups pass 100/100 focused repeats and remain in the complete 47-executable host matrix including publication safety. Target logger binding, persistent retention/export, and physical failure capture remain open.
- Added a pure fixed-shape projection from coordinator status, one observed operation result, and boot-local time into ready, confirmation-required, applied, unchanged, cancelled, expired, rejected, persistence-failed, restart-required, clock-fault, or unavailable state.
- The pending request token and exact remaining milliseconds exist only while confirmation is allowed. At the exact deadline the projection removes both and requests coordinator expiry service; an earlier clock sample fails visibly without inventing a valid countdown. A rejected stale/mismatched action flags the rejection without hiding the still-valid pending prompt.
- Successful persistence requires coherent active-slot/generation evidence. Ordinary failure asks for a newly staged request, while uncertain commit asks for restart reconciliation. Impossible state/operation/store combinations are rejected instead of becoming plausible UI state.
- Eight groups pass 100/100 focused repeats and remain in the complete 47-executable host matrix including publication safety. Rendering, localized text, diagnostic retention, source authority, target concurrency, and physical input remain open.
- Added a semantic coordinator that stages at most one validated layout change under an exact nonzero request ID and a caller-supplied monotonic timestamp.
- Confirmation must repeat that ID before the exact configured boundary. Successfully staged IDs must increase strictly within one coordinator start cycle; invalid or already-pending proposals do not consume an ID, while cancelled, failed, uncertain, and completed proposals do. Mismatch, replay, cancellation, expiry, and clock rollback leave storage untouched; clock rollback also consumes any pending request.
- The request is consumed before persistence. Ordinary failure therefore needs a new local confirmation, while commit uncertainty requires restart inspection rather than replaying an old approval. A newly confirmed request after an applied uncertain commit observes the stored generation and performs no additional write.
- Ten deterministic groups pass 100/100 focused repeats and remain in the complete 47-executable host matrix including publication safety. This does not prove physical-presence input, rendering, cross-boot input flushing, target task serialization, authenticated configuration, ESP-IDF storage, or power-cut behavior.
- Added one shared backend-neutral key/value blob contract and moved the
existing
ORS0adapter onto it without changing its public behavior. - Added exact 576-byte
og_config/gauge_layout/ogl0_a|blayout binding with explicit commit after write/present-key erase, idempotent missing-key erase, strict value size, and distinct missing versus I/O errors. - Ten deterministic groups exercise exact operations, backend failures, real layout rotation/reset, and restart selection after both applied and unapplied failed commits. A store-owned update path now ignores caller generation, allocates highest-valid plus one only for changed canonical content, rejects conflict/I/O/exhaustion before writing, and performs zero backend write/commit calls for unchanged content. Backend commit failure now returns a distinct uncertain result: restart suppresses a rewrite when the new generation exists and performs one normal retry when it does not. Ten adapter and twelve core groups pass 100/100 focused repeats and remain in the complete 47-executable host matrix including publication safety. ESP-IDF binding, physical power cuts, wear, migration, and configuration authenticity remain open.
- Added a backend-neutral adapter for the two exact 1280-byte alert-system
recovery slots with fixed
og_state/og_recovery/ors0_a|bbinding. - Required backend commit after full-blob write or present-key erase, preserved missing-key erase as idempotent, and kept failed commits uncertain for restart inspection instead of blind retry or rollback.
- Thirteen deterministic groups exercise exact reads, failure mapping, real
ORS0save/rotation/reset, boot/save composition after restart, and both applied and unapplied uncertain commits. Applied uncertainty is reconciled by advancing separate trust after restart; unapplied uncertainty restores the prior trusted generation without inventing a newer record. The focused suite passes 100/100 repeats and remains in the complete 47-executable host matrix including publication safety. ESP-IDF binding, protected keys, authenticated integrity, trusted generation, locking, physical interruption, endurance, and on-device boot evidence remain open.
- Linked OpenTrail's deterministic four-client, four-plus-repeater, and eight-plus-repeater load model as separate planning evidence. It does not substitute for OpenGauge ESP-NOW, display, CAN, or vehicle validation.
- Confirmed OpenTrail public run
31415094006passes 33 strict C++ executables, three verifier/planning CLI builds, four MeshCore lease groups, six field-plan/evidence, nine pilot-result, eight crypto-benchmark, twelve local-interface, eleven power-state, eight portable-client composition, eight secure-randomness, and eight monotonic-clock groups. - Linked OpenTrail's portable-client composition preflight as separate platform groundwork. Its whole-contract review binds ten target-facing interfaces and caught the need for separate 64-byte protocol/configuration and 704-byte replay-checkpoint storage surfaces. It performs no mutable adapter I/O and supplies no concrete ESP-IDF adapter, board target, or physical result; it is not evidence for OpenGauge display, input, storage, power, ESP-NOW, CAN, or vehicle behavior.
- Linked OpenTrail's fail-closed secure-random source as separate security groundwork: typed readiness, bounded 1-64-byte requests, and complete output or no change. Its deterministic fake and host evidence do not prove target entropy/DRBG behavior or any OpenGauge target security property.
- Linked OpenTrail's checked monotonic-clock boundary as separate platform groundwork. It keeps boot-local elapsed time separate from UTC, permits equal ticks and temporary not-ready recovery, and latches rollback/source failure. No ESP-IDF timer/task/deep-sleep/brownout or physical timing evidence exists, and this does not prove any OpenGauge target property.
- Linked OpenTrail's fail-visible power-state boundary as separate platform groundwork. It preserves charging, missing, stale, fault, and invalid states without estimating percentage from voltage. Board adapters, thresholds, charger behavior, endurance, and all OpenGauge target power behavior remain unproved.
- Linked OpenTrail's revision-bound semantic display/input contract as separate platform groundwork. It rejects stale screen actions and requires hold-only critical confirmation without choosing a renderer. This does not validate OpenGauge display/input hardware, rendering, accessibility, vehicle use, or critical-alert delivery.
- Linked OpenTrail's ten-group rollback-safe outbound-counter prerequisite as separate packet-security groundwork. It is not evidence for OpenGauge target storage, keys, ESP-NOW, CAN, display, or vehicle behavior.
- Linked OpenTrail's strict crypto-benchmark evidence boundary and protected- packet budget, which now has nine groups. The latter exposes a 36-byte candidate authenticated header plus 16-byte tag and a separate 64-byte signed-group source-authentication candidate.
- Linked OpenTrail's zero/one-repeater decision and nine-group exact-byte host policy. It does not rewrite a protected TTL and does not establish OpenGauge ESP-NOW overhead, security, routing, or target behavior.
- Linked OpenTrail's nine-group reboot-safe repeater replay coordinator. It persists each eligible observation before queue release, repairs known host- checkpoint degradation before operation, and blocks transmit after uncertain persistence. Its volatile frame-loss tradeoff, protected target storage, power cuts, wear, and durable outbox remain OpenTrail gates; none of this is OpenGauge target evidence.
- Linked OpenTrail's ten-group context-bound
ODS0/v1store. The same 704-byte slots now embed group context and epoch; mismatched and legacy unbound media require service without restore or overwrite. Protected integrity, rollback, reset/migration, and physical storage evidence remain OpenTrail gates and do not validate OpenGauge persistence. - Linked OpenTrail's versioned four-person standalone plan and deterministic pass/fail/ineligible/invalid result evaluator. The plan requires no OpenGauge device or vehicle connection and remains blocked on an exact four-unit client hardware/firmware freeze; it is not OpenGauge CAN, ESP-NOW, display, or vehicle evidence.
- Built deterministic host foundations for passive CAN/J1939 acquisition, normalized telemetry, alarms, diagnostics, GPS state, gauge presentation, update rollback, peer authorization, and the OpenTrail critical-alert path.
- Proved physical
OGA0alert andOGK0acknowledgement delivery through two Heltec companions and a SenseCAP repeater, including accepted, terminal stale, retryable rate-limit, retry-to-accept, and live host-state lifecycles.
- Added canonical ACK replay and outbox checkpoints, preflighted combined
OCR0recovery, a recoverable two-slot host store, store-owned generations, and uncertain-commit reconciliation. - Added the canonical 256-byte
OPA0peer-authorization checkpoint. It restores active/revoked peers, opaque key handles, and authorization epochs atomically; the full 33-executable matrix and 100 focused repeats pass. - Added the recoverable 288-byte
OPS0two-slot host store aroundOPA0. Automatic generations, exact readback, ten interrupted-write boundaries, full-write error reconciliation, conflict/exhaustion handling, the complete 34-executable matrix, and 100 focused repeats pass. - Added the 1280-byte
ORS0system checkpoint, binding exactOPA0peer authorization to exactOCR0ACK/outbox state under one generation. Private, dependency-correct candidates preflight all three owners before live import; the complete 35-executable matrix and 100 focused repeats pass. - Added a recoverable two-slot store for exact
ORS0generations. Store-owned allocation, exact readback, eleven interrupted-write boundaries, full-write error reconciliation, conflict/exhaustion refusal, the complete 36-executable matrix, and 100 focused repeats pass. - Added an explicit external trusted-generation contract. Restore refuses a valid record below the supplied floor without live import; save allocation advances beyond both trusted and local generations. Ten focused groups, the unchanged 36-executable matrix, and 100 repeats pass.
- Documented the target storage/boot acceptance boundary: exact two-slot semantics, protected key-handle resolution, separate trusted-generation authority, boot/save ordering, coordinated reset, and physical interruption evidence. No ESP-IDF target implementation is claimed.
- Added dependency-injected protected key-handle preflight to direct and stored
ORS0restore. Active handles must validate before any live owner changes; revoked peers are skipped, and unavailable/purpose/backend failures remain typed. Eight system and eleven store groups plus 100 repeats each pass. - Added a typed system-recovery boot coordinator. Clean first boot requires an uninitialized trust source, unprovisioned state, and two exactly empty slots; successful restore, degraded repair, safe mode, and service-required outcomes remain distinct. Trusted-floor catch-up must pass exact readback before transport is enabled. Nine groups, the 37-executable matrix, and 100 repeats pass.
- Added verified system-recovery save ordering. Normal saves require exact
agreement between the newest local and trusted generation, then verify the
next
ORS0before advancing and exactly reading back trust. Ahead/uncertain state requires boot reconciliation; behind is rollback; missing state fails visibly. Eight groups, the 38-executable matrix, and 100 repeats pass. - Hardened degraded boot recovery against a hidden-newer-slot case. Empty or checksum-invalid peer media remains known degraded state, but an unreadable peer slot now requires service with transport disabled and no trusted-floor advancement. Ten boot groups, the 38-executable matrix, and 100 repeats pass.
- Added bounded automatic repair for known empty/checksum-invalid peer media.
Only a current operationally degraded boot result may write; repair commits a
new
ORS0, advances/readbacks trust, and verifies both slots valid. Unreadable, healthy, service, stale, and uncertain cases fail closed. Five groups, the 39-executable matrix, and 100 repeats pass. - Added a fixed-shape, redacted operator status for boot, save, and repair outcomes. It preserves coarse state/reason/action, slot health, checkpoint generations, protected-key failure category, and transport/repair flags while excluding peer IDs, key handles, addresses, credentials, and raw checkpoint bytes. Unknown or incoherent results fail closed. Seven groups, the complete 40-executable matrix, and 100 focused repeats pass locally.
- Bound that redacted status to the existing diagnostics ring as one atomic,
magic/versioned 32-bit
configuration_recovery / state_codeevent. The word round-trips coarse outcome and severity while omitting generations and all identity-bearing fields; malformed or incoherent words fail closed. Eight groups, the complete 41-executable matrix, and 100 focused repeats pass locally.
- Added public GitHub Actions validation for every
mainpush and pull request. The Windows 2025/UCRT64 workflow uses commit-pinned actions and runs the complete matrix; its current-main run passes all 41 executables with zero annotations. - Linked OpenTrail's separate public workflow after it passed both verifier CLI builds, 23 C++ test executables, and the four-group Python MeshCore lease suite with zero annotations. The two CI scopes remain distinct.
- Kept all target claims bounded: there is no ESP-IDF storage/radio/CAN binding, protected on-device key persistence, physical power-cut evidence, or vehicle validation yet.
- OpenGauge work was still represented through the separate OpenTrail planning boundary; no standalone OpenGauge firmware repository capability was claimed.