You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Last reviewed: 2026-08-30 — Gate 3 item 3 is COMPLETE: part 2 merged (#1553 / PR #1567 — sample assembly and running statistics live in RecorderMachine, TrackSink deleted; the one-round review caught a silent staged-tail discard at Save before merge). #1398 R1 and R2 are closed. A CI-speed PR (#1564, issue #1565 carries the cost table and two owner decisions) lands the required ci gate at ~4.5 min from ~14. The D-epic on #1515 is complete through PR #1562: D1 #1537, D2 #1547, D3 #1555, D4a #1561, the board backlight #1560 (closes #1558), and the region/frozen-base slice #1562 (closes #1559). Gate 3 items 1, 2, 3a and 6 are merged (#1545 / #1550 / #1554 / #1551); #1549 keeps four owed on-glass checks and #1557 carries the recorder follow-ups. The verification budget for agents now lives in CLAUDE.md (PR #1563) — read it there, not in an orchestration brief. On-glass work is consolidated: one curated list on #1515 (comment 5445859898) replaces every per-epic checklist, and the epics that carried nothing else are closed. The #1400 Navigator route-following cutover is complete via #1571 / PR #1572: Navigator now owns active-route identity and route-following state, ride_engine.rs is deleted, and the target App and resident RAM remain exact. V4 is complete via #1573 / PR #1574: ActionRows has three production adopters, final resources are exact, and the measured production cost is +59 lines. V5 is complete via #1575 / PR #1576: every full-screen card action list uses ActionRows, only four intentional panel callers remain, and the port is net −6 production lines with exact memory. V6 and optional V7 are closed without code after refinement disproved both proposed abstractions. Weather Hourly already shares list chrome and has different read-only semantics; a gesture-default table marker would duplicate typed handler policy without deleting exhaustive match arms. #1396 is complete through docs-only V8 child #1577 / PR #1578. W2 is complete via #1579 / PR #1580: board and simulator now share request-context assembly, the simulator uses the typed weather-effect path, and the review removed a mirrored scheduler state before merge. #1557 items 2–3 have owner policy. Recorder has no timeout/replay; damaged logical recovery uses one rider-confirmed exact removal of the RECORDING entry, preserving the map and every other object. Whole-card FORMAT and ride-kind purge are rejected. D4b is complete via #1581 / PR #1583 (merge 8ae896d6): the weather context sheet (Refresh now + Interval) replaced the Weather settings screen, the central Settings list has five rows, settings VERSION is unchanged, and the App allocation table matched exactly. D4c is complete via #1585 / PR #1586 (merge 6b507e11): the Map's own five-row sheet with three in-place display switches, settings/display.rs down to the idle-return row, VERSION unchanged, App allocations exact. D4d is complete via #1587 / PR #1588 (merge 388b9f1b): bike type has one home on the create-route sheet, the Bike-type screen is deleted, the refuted "route options" row was never built, and the cross-slice ContextValue widenings landed with exact App allocations. The D4 family (a–d) is complete. D5 is complete via #1589 / PR #1590 (merge 1d35ea17): the refuted ScreenTick::region premise was closed without code, and the slice fixed a live defect — a press landing on a slide's settling frame stole the sheet's owed base draw; that draw is now a debt only a rendered frame clears. The #1515 D1–D5 production slice map is COMPLETE (D4b #1583, D4c #1586, D4d #1588, D5 #1590, all 2026-08-30, adversarial review + green CI, no on-device work per the ruling); the epic's remaining half is the curated on-glass list (items 1–37) and is the owner's. The #1398 recovery child is IN FLIGHT as #1591 / PR #1592, paused at the final gate (2026-08-30). The owner ruled the no-on-device waiver does not extend to storage-recovery work (#1557 comment 5469819084): merge needs review + green CI + one on-device acceptance run. All software gates are green at head 9e67241d — adversarial review APPROVE plus a delta APPROVE after the owner folded the review's M1 finding in (a failed rider-confirmed Discard of a healthy recovered ride now latches one-attempt-per-action too, card copy "Discard failed"; the collapsed state model also closed a second phantom-session hole). CI green, threads resolved. The on-device run was attempted and is BLOCKED by the J-Link VCOM injection wedge (telemetry out, injected writes swallowed; survives probe-rs reset and one power-cycle; the board carries TWO USB cables so a true power-cycle must remove both). Scenarios A/B/C not started; the card untouched; no damage fabricated. The board currently runs the debug-uart acceptance image — reflash the release build before trail use. The implementer worktree /Users/timo/Documents/OSM-agents/rr1 is kept until the verified merge. Resume: full power-cycle → attach RTT → liveness-probe the link (K t 0 must echo an input: line) → run #1591 scenarios A/B/C → merge → reflash release. Related follow-ups: #1593 (pre-existing recovery-card copy overflow), the owner-started OUT/ gitignore side task. Parallel refinement-ready: #1399 T4's line-C re-measure (unblocked now that the post-D4 screen set is final) and #1400 N2–N5 refinement; TS4b (web) remains implementation-ready from the #1449 outline. The owner waived on-device, flashing, HIL, and on-glass verification for the next batch; use adversarial review plus green CI, and ask only for a subjective product choice that prior decisions and current code cannot answer.
Purpose
This issue is the single entry point for the current device architecture refactor.
It owns the global order, current frontier, cross-epic gates, and progress summary.
The linked workstream issues own architecture and acceptance criteria. Their child issues own implementation details.
GitHub lists these workstreams as formal sub-issues of this tracker.
Fresh agents must read this tracker first. They must then read the selected child issue and its parent epic.
1. Status at a glance
Current stage: Gate 0 (except FS1), DeviceCore Phase 1 (DC1–DC7, gate closed via PR #1484), the test-system delivery steps 1–3, and the #1397 slices S1/S2/S3/S5/S6a are complete — 19 merged PRs; per-slice evidence lives on the closed child issues. S5's CoreMode passed its on-glass soak 2026-08-24 (record on #1487). The board's drain_host_commands in ride.rs is the last legacy drain in any runtime host.
Current frontier: Gate 2 is closed. S4 #1447 merged via PR #1536: every screen row declares an exact RenderKeyKind, App::pass compares stack-local keys, six hand-written repaint mirrors are gone, and a four-replay differential harness (175 passes) proves parity with lower repaint counts. Its two review rounds found and fixed three real missed redraws (the map low-battery cue, the Up-ahead timeline, the rain step declared on the wrong key) and a backward replay-clock defect; 18 surviving field mutants have named masking reasons in the PR. size_of::<App>() fell 16 B, resident fell 24 B, the poll frame is unchanged. Follow-ups: #1538 (StatsKey does not name the NextAhead cache), #1539 (checkout persist-credentials sweep). Next frontier work: S6c #1516 is merged (PR #1529, f7ec1b18): −5,179 lines, the legacy host protocol, compat.rs/migration.rs, LegacyLoop and the DC1 legacy baseline all gone; 974 obc-app tests, conformance 25, 270/270 snapshot frames byte-identical, board flash −6,848 B and resident −8 B. Its review round is worth remembering: six tautological assertions were introduced while porting suites off the deleted protocol, and fixing them uncovered three lost coverage gates (the 44-row DC1 checklist left ungated, the feeder-exercise loop the issue had asked be re-homed, and three feeders that had silently stopped being recorded). All restored, each fix demonstrated against a mutant the old form passed. S6b #1494 is closed on its recorded A–K soak. S6b #1494 is closed on its recorded on-glass A–K soak (2026-08-26): A, B, C, D, E, G, H, J, K PASS; F and I partial with named reasons (F's same-id replace needs a linked-route rename+update, now known reachable; I's DFU third needs UPDATE.BIN and there is no MSC mode, #983). The soak found and closed a rider-visible UI lockout — the map-transfer card could never be dismissed (PR #1519, confirmed on glass) — and raised #1522 (no timeout bounds a stalled transfer, so a wedged peer refuses every plan by name; PR #1523 in review) plus companion bugs #1520 and #1521. S6c's start gate is met; S4 #1447 ends Gate 2 after it.
Assurance: TS1–TS3 complete (one selection engine; PR #1482). The delivery-step-3 precondition for the Gate 3 ownership cutovers is met. Strict-align defect #1171 closed with on-glass evidence.
FS10 iOS cutover (PRs #1430/#1456/#1457) is merged with physical-iPhone acceptance; Builder and simulator work remain in #1392.
R1 AND R2 complete; #1557 policy complete: executor-totality contract plus one-shot exact damaged-recording removal, with map and all other objects preserved
Future children: bounded firmware terminal recovery, then typed store recovery for valid-catalog/rollover-blocked state; R3–R5 remain
T1–T3b complete (PRs #1472, #1507, #1514, #1546 — the alert marks are their own record; v17 is the first live tail-defaulting exercise, anchors survive the upgrade)
Re-measure line C against the post-#1515-D4 screen set before committing T4
Complete V4 through V8 in #1396 after their local gates. S1 must close before the full card-family port.
Gate 2 is closed (2026-08-26): all runtime hosts use the final pass, and S4 proved its render keys at that boundary via PR #1536's differential harness.
Last reviewed: 2026-08-30 — Gate 3 item 3 is COMPLETE: part 2 merged (#1553 / PR #1567 — sample assembly and running statistics live in RecorderMachine, TrackSink deleted; the one-round review caught a silent staged-tail discard at Save before merge). #1398 R1 and R2 are closed. A CI-speed PR (#1564, issue #1565 carries the cost table and two owner decisions) lands the required
cigate at ~4.5 min from ~14. The D-epic on #1515 is complete through PR #1562: D1 #1537, D2 #1547, D3 #1555, D4a #1561, the board backlight #1560 (closes #1558), and the region/frozen-base slice #1562 (closes #1559). Gate 3 items 1, 2, 3a and 6 are merged (#1545 / #1550 / #1554 / #1551); #1549 keeps four owed on-glass checks and #1557 carries the recorder follow-ups. The verification budget for agents now lives in CLAUDE.md (PR #1563) — read it there, not in an orchestration brief. On-glass work is consolidated: one curated list on #1515 (comment 5445859898) replaces every per-epic checklist, and the epics that carried nothing else are closed. The #1400 Navigator route-following cutover is complete via #1571 / PR #1572: Navigator now owns active-route identity and route-following state,ride_engine.rsis deleted, and the targetAppand resident RAM remain exact. V4 is complete via #1573 / PR #1574:ActionRowshas three production adopters, final resources are exact, and the measured production cost is +59 lines. V5 is complete via #1575 / PR #1576: every full-screen card action list usesActionRows, only four intentional panel callers remain, and the port is net −6 production lines with exact memory. V6 and optional V7 are closed without code after refinement disproved both proposed abstractions. Weather Hourly already shares list chrome and has different read-only semantics; a gesture-default table marker would duplicate typed handler policy without deleting exhaustive match arms. #1396 is complete through docs-only V8 child #1577 / PR #1578. W2 is complete via #1579 / PR #1580: board and simulator now share request-context assembly, the simulator uses the typed weather-effect path, and the review removed a mirrored scheduler state before merge. #1557 items 2–3 have owner policy. Recorder has no timeout/replay; damaged logical recovery uses one rider-confirmed exact removal of theRECORDINGentry, preserving the map and every other object. Whole-card FORMAT and ride-kind purge are rejected. D4b is complete via #1581 / PR #1583 (merge8ae896d6): the weather context sheet (Refresh now + Interval) replaced the Weather settings screen, the central Settings list has five rows, settings VERSION is unchanged, and the App allocation table matched exactly. D4c is complete via #1585 / PR #1586 (merge6b507e11): the Map's own five-row sheet with three in-place display switches,settings/display.rsdown to the idle-return row, VERSION unchanged, App allocations exact. D4d is complete via #1587 / PR #1588 (merge388b9f1b): bike type has one home on the create-route sheet, the Bike-type screen is deleted, the refuted "route options" row was never built, and the cross-sliceContextValuewidenings landed with exact App allocations. The D4 family (a–d) is complete. D5 is complete via #1589 / PR #1590 (merge1d35ea17): the refutedScreenTick::regionpremise was closed without code, and the slice fixed a live defect — a press landing on a slide's settling frame stole the sheet's owed base draw; that draw is now a debt only a rendered frame clears. The #1515 D1–D5 production slice map is COMPLETE (D4b #1583, D4c #1586, D4d #1588, D5 #1590, all 2026-08-30, adversarial review + green CI, no on-device work per the ruling); the epic's remaining half is the curated on-glass list (items 1–37) and is the owner's. The #1398 recovery child is IN FLIGHT as #1591 / PR #1592, paused at the final gate (2026-08-30). The owner ruled the no-on-device waiver does not extend to storage-recovery work (#1557 comment 5469819084): merge needs review + green CI + one on-device acceptance run. All software gates are green at head9e67241d— adversarial review APPROVE plus a delta APPROVE after the owner folded the review's M1 finding in (a failed rider-confirmed Discard of a healthy recovered ride now latches one-attempt-per-action too, card copy "Discard failed"; the collapsed state model also closed a second phantom-session hole). CI green, threads resolved. The on-device run was attempted and is BLOCKED by the J-Link VCOM injection wedge (telemetry out, injected writes swallowed; survives probe-rs reset and one power-cycle; the board carries TWO USB cables so a true power-cycle must remove both). Scenarios A/B/C not started; the card untouched; no damage fabricated. The board currently runs the debug-uart acceptance image — reflash the release build before trail use. The implementer worktree/Users/timo/Documents/OSM-agents/rr1is kept until the verified merge. Resume: full power-cycle → attach RTT → liveness-probe the link (K t 0must echo aninput:line) → run #1591 scenarios A/B/C → merge → reflash release. Related follow-ups: #1593 (pre-existing recovery-card copy overflow), the owner-started OUT/ gitignore side task. Parallel refinement-ready: #1399 T4's line-C re-measure (unblocked now that the post-D4 screen set is final) and #1400 N2–N5 refinement; TS4b (web) remains implementation-ready from the #1449 outline. The owner waived on-device, flashing, HIL, and on-glass verification for the next batch; use adversarial review plus green CI, and ask only for a subjective product choice that prior decisions and current code cannot answer.Purpose
This issue is the single entry point for the current device architecture refactor.
It owns the global order, current frontier, cross-epic gates, and progress summary.
The linked workstream issues own architecture and acceptance criteria. Their child issues own implementation details.
GitHub lists these workstreams as formal sub-issues of this tracker.
Fresh agents must read this tracker first. They must then read the selected child issue and its parent epic.
1. Status at a glance
Current stage: Gate 0 (except FS1), DeviceCore Phase 1 (DC1–DC7, gate closed via PR #1484), the test-system delivery steps 1–3, and the #1397 slices S1/S2/S3/S5/S6a are complete — 19 merged PRs; per-slice evidence lives on the closed child issues. S5's CoreMode passed its on-glass soak 2026-08-24 (record on #1487). The board's
drain_host_commandsinride.rsis the last legacy drain in any runtime host.Current frontier: Gate 2 is closed. S4 #1447 merged via PR #1536: every screen row declares an exact
RenderKeyKind,App::passcompares stack-local keys, six hand-written repaint mirrors are gone, and a four-replay differential harness (175 passes) proves parity with lower repaint counts. Its two review rounds found and fixed three real missed redraws (the map low-battery cue, the Up-ahead timeline, the rain step declared on the wrong key) and a backward replay-clock defect; 18 surviving field mutants have named masking reasons in the PR.size_of::<App>()fell 16 B, resident fell 24 B, the poll frame is unchanged. Follow-ups: #1538 (StatsKey does not name the NextAhead cache), #1539 (checkout persist-credentials sweep). Next frontier work: S6c #1516 is merged (PR #1529,f7ec1b18): −5,179 lines, the legacy host protocol,compat.rs/migration.rs,LegacyLoopand the DC1 legacy baseline all gone; 974 obc-app tests, conformance 25, 270/270 snapshot frames byte-identical, board flash −6,848 B and resident −8 B. Its review round is worth remembering: six tautological assertions were introduced while porting suites off the deleted protocol, and fixing them uncovered three lost coverage gates (the 44-row DC1 checklist left ungated, the feeder-exercise loop the issue had asked be re-homed, and three feeders that had silently stopped being recorded). All restored, each fix demonstrated against a mutant the old form passed. S6b #1494 is closed on its recorded A–K soak. S6b #1494 is closed on its recorded on-glass A–K soak (2026-08-26): A, B, C, D, E, G, H, J, K PASS; F and I partial with named reasons (F's same-id replace needs a linked-route rename+update, now known reachable; I's DFU third needsUPDATE.BINand there is no MSC mode, #983). The soak found and closed a rider-visible UI lockout — the map-transfer card could never be dismissed (PR #1519, confirmed on glass) — and raised #1522 (no timeout bounds a stalled transfer, so a wedged peer refuses every plan by name; PR #1523 in review) plus companion bugs #1520 and #1521. S6c's start gate is met; S4 #1447 ends Gate 2 after it.Assurance: TS1–TS3 complete (one selection engine; PR #1482). The delivery-step-3 precondition for the Gate 3 ownership cutovers is met. Strict-align defect #1171 closed with on-glass evidence.
FS10 iOS cutover (PRs #1430/#1456/#1457) is merged with physical-iPhone acceptance; Builder and simulator work remain in #1392.
ride_engine.rsdeletion; N2–N5 remain separate2. Work next
2.1 Critical path
RECORDINGremoval and must preserve the map and all other objects. Whole-card FORMAT and ride-kind purge are rejected. W2 refactor(weather): share request-context assembly and finish the simulator request cutover #1579 / PR refactor(weather): share request context and finish simulator cutover #1580 is merged. V6 is closed without code because Weather Hourly already uses shared list chrome and has different read-only semantics. Optional V7 is also closed without code: a table marker cannot delete the local exhaustive gesture arms, and the larger alternatives would reduce auditability. V5 — Complete ActionRows adoption on full-screen cards #1575 / PR V5: Complete ActionRows adoption on full-screen cards #1576 completed all five remaining full-screen card ports; only four intentional panel callers remain, and TripDelete's Hold-on-Cancel exception stays local. V4 — Add ActionRows and port three card decisions #1573 / PR V4: add ActionRows and port three card decisions #1574 measured V4 at +59 production lines, so the old 700-line card-frame forecast is retired. Navigator owns route following; delete Activity navigation state and RideEngine #1571 / PR Move route following into Navigator #1572 completed the Navigator route-following cutover with an exact targetAppsize and unchanged resident RAM.blefeature is retired — 58 guards, two CI legs, and the duplicate resource profile deleted; the sweep also repaired theobc flash blepath it first broke, and review proved the deleted CI leg byte-identical to the default leg).2.2 Implementation-ready parallel work
stage_idsis already resident), the residual protocol is down to two commands,size_of::<App>()moved 0 B, and board flash fell 2.6 KB. Review found and fixed a major defect: a media-truncated listing read as an absent object, which let the cascade pass a still-stored member. Board on-glass held-to-delete timing is the one open follow-up.2.3 Planning-ready work
Do not implement a planning-only row directly. First add files, tests, deletions, resource limits, and a formal parent relationship.
2.4 Supporting work
3. Agent start protocol
CONTRIBUTING.md.If texts conflict, use this precedence:
4. Global gates
The gates below are not exclusive time blocks. Work can run in parallel when its child issue permits it.
Cross-cutting test-system lane
#1449 supplies assurance for every global gate. It does not replace an architecture gate.
Use this order:
The current work does not wait for #1449.
Gate 0: flat-store and verification foundations
Gate 0 does not require FS1 before host work. FS1 remains the final hardware fault-model proof.
Gate 1: DeviceCore foundation
DeviceCore Phase 1 can continue during Gate 0. DC7 must close before the #1397 protocol replacement starts.
Gate 2: app pass and UI ownership
Complete these local slices in #1397:
Complete S4 S4 — Replace manual dirty mirrors with declared render keys #1447 after S6 and V0.Complete via PR S4 #1447: the screens declare what they draw, and the pass compares it #1536, 2026-08-26.Complete V4 through V8 in #1396 after their local gates. S1 must close before the full card-family port.
Gate 2 is closed (2026-08-26): all runtime hosts use the final pass, and S4 proved its render keys at that boundary via PR #1536's differential harness.
Gate 3: domain ownership cutovers
Apply this order to ownership cutovers:
Move catalog refresh and deletion into CatalogMachine.Complete via Catalog refresh and deletion are ordered by CatalogMachine, not composed by executors #1541 / PR feat(catalog): the re-read is ordered by the domain, not composed by executors #1545, 2026-08-27.Move retention policy into RetentionMachine.Complete via Retention's expiry is retired by the catalog's verdict, not by a timer waiting for a rescan #1548 / PR Retention's expiry is retired by the catalog's verdict, not by a timer #1550, 2026-08-27.Recorder cutoverCOMPLETE: part 1 The ride close is a Recorder verdict, not a legacy command and a catalog re-feed #1552 / PR The ride close is a Recorder verdict, not a legacy command and a catalog re-feed #1554 (2026-08-27), part 2 One live ride state: sample assembly and running statistics move into Recorder #1553 / PR Recorder assembles the ride's samples and keeps the ride's numbers #1567 (2026-08-28).Move route-following ownership into Navigator and deleteComplete via Navigator owns route following; delete Activity navigation state and RideEngine #1571 / PR Move route following into Navigator #1572, 2026-08-28. N2–N5 remain later slices.ride_engine.rs.Move visible weather policy into WeatherDomain.Complete via Visible weather policy is decided by WeatherDomain, not assembled by each host's render call #1549 / PR refactor(weather): the domain decides, and the hosts stop assembling #1551, 2026-08-27 (issue open for on-glass only).Independent baselines, codecs, formatters, and pure algorithms can start earlier when their local gate permits them.
The Recorder cutover must remove its fields before Navigator deletes
ride_engine.rs.Gate 4: platform convergence
Gate 5: dependent cleanup and closure
5. Start gates for future slice maps
The planning-only tables remain in their domain epics:
Before work starts, create formal child issues for the next eligible row. Do not refine all later rows at one time.
6. Tracker maintenance
Update this issue when one of these events occurs:
For each update:
Do not copy architecture specifications into this tracker.
7. Program acceptance
The program closes when all of these statements are true: