Skip to content

← Firmware Downloads

Post-install setup · Reborn (Y2Linux) · Y2

Next-session handoff — Y2Linux 1.0 Beta 8.4 candidate (latest entry first; started 2026-10-09 as the deep-sleep continuation)

Debian-based Linux with a fast clickwheel interface for the Innioasis Y2.

Instructions published by the project, shown here word for word.

Next-session handoff — Y2Linux 1.0 Beta 8.4 candidate (latest entry first; started 2026-10-09 as the deep-sleep continuation)

START HERE (2026-11-06): BETA 9.3.16 (BASELINE 224) RELEASE. Steady Bluetooth after the 2026-11-06 review of #96, Y2Reborn #99/#87 and 28 reports (ledger F69–F73): continuous Bluetooth PCM in Reborn (bridge feeds the kept sink, no BT drain, 8 × 1024 ring, 3 s pause grace, no probe open), BlueALSA 0005/0007/0008 gone, SBC/AAC fixed rate by default, 44.1 kHz for all, y2-radiod quick-drop park. The Buildroot patch copy now removes dropped Y2 patches (5d87f546). Owed: AirPods listening checks (skips, seeks, song ends gapless off, pause < / > 3 s, radio zapping; bluetooth_xruns must stay 0), reporter confirmations. Next free label 225, sequence above 14900, next version 9.3.17 (Beta 9.3.16 report).

Previous entry: START HERE (2026-11-05): BETA 9.3.15 (BASELINE 223) RELEASE. The Quick Menu (Y2Linux #85): holding Power opens a centred, animated tile panel (Reborn quick_menu.rs, views_quick.rs; settings map section "The Quick Menu"); the turn-off ring moved onto its Power Off tile (3 s + 1.2 s). Test build 222 (9.3.14, list version) never published. Installed on the developer's player. Owed: Back from the sleep timer returns to the menu; the items owed under 9.3.13 below. Next free label 224, sequence above 14800, next version 9.3.16 (Beta 9.3.15 report).

Previous entry: START HERE (2026-11-05): BETA 9.3.13 (BASELINE 221) RELEASE. Fixes from the issue triage: a Wi-Fi join's first NotFound restarts Wi-Fi once via y2-radiod WifiRestart and retries (Y2Linux #83; the router-refusal part of #83 and the join controller P7 stay open); WPA3 is impossible on the Y2 (gen2 firmware SME, see m5-connectivity-implementation), rows name WPA3 only / Needs a login / WEP (#91); letter jumps at the top (Y2Reborn #91); square Now Playing cover under skins, Winamp centred, Cassette stripe (Y2Reborn #81, #82). Not run on a player before release. Owed: device check of 221 (Wi-Fi retry, skins), the 9.3.12 owed items below, #88 MTP copy of 05 I Still....m4a to an exFAT card (reproduce with umtprd logs), #84 long-M4B decision. Next free label 222, sequence above 14600, next version 9.3.14 (Beta 9.3.13 report).

Previous entry: START HERE (2026-11-04): BETA 9.3.12 (BASELINE 220) RELEASE. Bluetooth pauses and skips like a phone again: bluealsad --keep-alive=0 (a stream kept started without packets muted AirPods after any gap and caused the 9.3.7 pause drop; btmon on test build 219 showed no gap at the skips, only at pause/resume), Reborn keeps a Bluetooth sink's audio at a track change and does no drain, the 15-min paused-headset hold counts from each pause (Y2Linux #90, F68), F66 codec loop (Y2Reborn #94). Owed: reporters' confirmations on #89, #90, Y2Reborn #94 and #87; an overnight on this build; the Wi-Fi join controller (P7); the Reborn format probe at each Play now opens/closes the PCM within 20 ms (Suspend/Start pair before the real Start, as 9.2.16). Next free label 221, sequence above 14500, next version 9.3.13 (Beta 9.3.12 report).

Previous entry: START HERE (2026-11-03): BETA 9.3.7 (BASELINE 215) RELEASE. Bluetooth rebuilt around the radio daemon y2-radiod (architecture, plan, as built, measurements). Installed on the developer's player. Owed: (1) the pause drop: every pause > ≈22 s ends in an HCI supervision timeout (0x08), AirPods silent at the baseband ≈2 s after the stream closes, same with Wi-Fi off; find whether it is the headset's idle behaviour or the keep-alive stream without packets (btmon here shows no A2DP media packets even on healthy links); (2) an overnight drain on this build; (3) other headsets; (4) the Wi-Fi join controller (P7); (5) replies on Y2Reborn #78 and #92. Next free label 216, sequence above 14000, next version 9.3.8 (Beta 9.3.7 report).

Previous entry: START HERE (2026-11-02): BETA 9.2.16 (BASELINE 207) RELEASE. Steadier Bluetooth for Y2Reborn #87 (F63 in UserReports/REVIEWED.md): AAC standard / LDAC mobile defaults, a codec ceiling while the Wi-Fi radio is on (/run/y2/bt-codec-ceiling, BlueALSA patches 0002/0003), Auto = AAC, aptX, SBC, and a codec choice refused during playback re-asked at the next pause. NOT tried on a player (it was not connected): owed a device check (AAC rate with Wi-Fi on/off in y2-platform status bluetooth encoder bitrate_bps, SBC bit-pool, no audible step) and the #87 reporter's confirmation. Next free label 208, sequence above 13200, next version 9.2.17 (Beta 9.2.16 report).

Previous entry: START HERE (2026-11-01, night): BETA 9.2.15 (BASELINE 206) RELEASE. Settings and Settings > Library no longer recount the library every frame (Y2Reborn #85, contributor PR #86 merged as 97e46a8; audit of the borrowed-library pattern and a 72 000-song frame timing of every screen found no other case). Owed: #85 reporter's confirmation, the F61 reporter's confirmation (9.2.14). Next free label 207, sequence above 13100, next version 9.2.16 (Beta 9.2.15 report).

Previous entry: START HERE (2026-11-01, evening): BETA 9.2.14 (BASELINE 205) RELEASE. Bluetooth sink kept between streams (F61, report c0fe2638: quick radio station changes dropped the earbuds after an AVDTP Start timeout). Issue forms replace blank issues (both repositories; labels performance/power/sound/wifi/update). Six quick skips on the owner's AirPods Pro played in the kept sink and were heard. Owed: the reporter's confirmation (owner relays it), Y2Reborn #85 (slow Settings with a large library, details asked). Next free label 206, sequence above 13000, next version 9.2.15 (Beta 9.2.14 report).

Previous entry: START HERE (2026-11-01, afternoon): BETA 9.2.13 (BASELINE 204) RELEASE. Search song plays alone (Reborn #79), long MP3/AAC resume from kept seek points (Reborn #80), letter scroll at 3 steps (#64), Bluetooth peer_disconnected reasons. Owed on a player: resume time after sleep, letter-scroll feel. Open: #83 is now a hardware report (USB-C heat, answered), Reborn #75. Next free label 205, sequence above 12900, next version 9.2.14 (Beta 9.2.13 report).

Previous entry: START HERE (2026-11-01): BETA 9.2.12 (BASELINE 203) RELEASE. Bluetooth off at once (reconnect page held the lock ~20 s, taps turned it on again), light skins' grey text (Reborn #76). Open: #83 (waiting for a 9.2.8+ report), Reborn #75, Output page scrolling. Next free label 204, sequence above 12800, next version 9.2.13 (Beta 9.2.12 report).

Previous entry: START HERE (2026-10-31, late night): BETA 9.2.11 (BASELINE 202) RELEASE. Status icons only while connected (#73 follow-up). Open: #83 (waiting for a 9.2.8+ report), Reborn #75 #76, Output page scrolling. Next free label 203, sequence above 12700, next version 9.2.12 (Beta 9.2.11 report).

Previous entry: START HERE (2026-10-31, late night): BETA 9.2.10 (BASELINE 201) RELEASE. Settings reorganised (owner): eight places, Customize → Home Menu / Browsing / Wheel & Buttons, Library, System; pickers and hints; before adding any setting read Y2Reborn docs/ui/REBORN-SETTINGS-MAP.md and find its place first. Menus scroll like lists (#74), Music scrolls, Cover Flow year once (#73). 9.2.9 was test build 200 only. Open: #83 (router rejects, waiting for a 9.2.8+ report), Reborn #75 #76, Output page scrolling with many BT devices. Next free label 202, sequence above 12600, next version 9.2.11 (Beta 9.2.10 report).

Previous entry: START HERE (2026-10-31, late night): BETA 9.2.8 (BASELINE 199) RELEASE. Diagnostics for #83 (F60 reopened): supplicant_events.rejects counts ASSOC/AUTH-REJECT by status code (+timeout). #83 reporter's AP is seen at −55…−61 dBm among ≈50 networks yet rejected 12–20 times; reply posted asking router/band steering. Next report from install a204f45a on 9.2.8 decides. Open: Reborn #73 #74 #75 #76. Next free label 200, sequence above 12400, next version 9.2.9 (Beta 9.2.8 report).

Previous entry: START HERE (2026-10-31, late night): BETA 9.2.7 (BASELINE 198) RELEASE. Wheel clicks whenever no music plays (also no song: the sink thread opens/keeps a wired sink 10 s, click_while_idle, keep_for_clicks), crackle fixed (no rewind), sleep request closes a kept sink (Beta 9.2.7 report). Device-checked by injected wheel keys (printf input_event to /dev/input/event3, KEY_DOWN 108 / KEY_UP 103 after rebornctl action screen_wake). Open: Reborn #73 #74 #75 #76; click loudness by ear. Next free label 199, sequence above 12300, next version 9.2.8.

Previous entry: START HERE (2026-10-31, night): BETA 9.2.6 (BASELINE 197) RELEASE. Y2Reborn #77: wheel clicks failed while paused (ALSA -77: the wired codec has no device pause, a held stream is drained to SETUP); now Off/On, clicks only while paused, the stream prepared after the paused music played out (Beta 9.2.6 report). Owed: the click by ear. Open: Reborn #73 #74 #75 #76. Next free label 198, sequence above 12200, next version 9.2.7.

Previous entry: START HERE (2026-10-31, night): BETA 9.2.5 (BASELINE 196) RELEASE. F60 (Y2Linux #83, report fa30bf96): after a wake, scans missed the saved network and Join could not help; the platform now cycles Wi-Fi's rfkill once after 4 blind scans over 60 s (WifiRecovery::restart_unseen, journal wifi_restart, ≤ every 10 min). Cause unproven (Bluetooth reconnect paging at the same time; y2-bt-reconnect logs no timing). Open: Reborn #73 #74 #75 #76 (new after 9.2.3), click loudness by ear. Next free label 197, sequence above 12100, next version 9.2.6 (Beta 9.2.5 report).

Previous entry: START HERE (2026-10-31, late evening): BETA 9.2.4 (BASELINE 195) RELEASE. Reborn: Home order (Customize > Home Menu), playlist order (Move), Wheel Click Off/When Paused/Always (wired sink only, needs a song loaded; rewind and replay so no music is lost), Cover Flow text travelling with its cover (Beta 9.2.4 report). Owed: listening to the click on a player (level 0.3 is a guess, pops?). Closed #64 (battery estimate) and #40 (settled on Discord); on hold #41 #19 (plugins) and #63. Next free label 196, sequence above 12000, next version 9.2.5.

Previous entry: START HERE (2026-10-31, evening): BETA 9.2.3 (BASELINE 194) RELEASE. Reborn defaults from the GitHub triage (no new settings): album years (METADATA_REVISION 5 re-reads tags once after the update), Other Network… (hidden Wi-Fi), Cover Flow position in the title, numbered album songs in skins, brighter greys (Beta 9.2.3 report). Open on GitHub: Y2Reborn #71 #67 #63 #64 #53 #33 #40 #41 #19. Follow-up: split Reborn's reborn-core and reborn-library lib.rs (≈2300/2200 lines). Next free label 195, sequence above 11900.

Previous entry: START HERE (2026-10-31, afternoon): BETA 9.2.2 (BASELINE 193) RELEASE. Fix releases after 9.2 are 9.2.x (owner); 9.2.1 = test build 192, not published. Release 1.0.0-beta.9.2.2, sequence 11800, label 193 (Beta 9.2.2 report): F59 (SD card without Power Off Notification Ready: kernel patch 0071 + Run::kernel_refusal retries a proven device refusal), GitHub requests #64 #70 #72 #73 #74 #76 (skins' indicators, AM/PM, {date}, brightness wheel 5–100 %, letter scroll at 4 steps, 20 EQ filters), the length limits as ceilings (150/1500). Report review 2026-10-31: only 9.2 reports count (owner); F58 (codec choice refused busy after a Connect) and the overnight Power refusals wake_event_in_progress (≈1 PMIC key IRQ per press; cause open) are open. Owed on the player: the fast-scroll and brightness feel by hand; F59 only on the reporter's card. Next free label 194, sequence above 11800.

Previous entry: START HERE (2026-10-31, night): BETA 9.2 (BASELINE 191) RELEASE. Owner: slow wake after Power-to-sleep when unplugged; "build install with ota and publish". Release 1.0.0-beta.9.2, sequence 11600, label 191 (Beta 9.2 report): the sleep helper's radio quiesce waited ≈20 s on y2-bt-reconnect's page to headphones that were off without reading the wake IRQs; fixed (wake check in the quiesce, busy bluetooth-power writes power_pending); serde_json float_roundtrip (reset plans); reset goldens' host device volatile (the gate was red on clean HEAD). Owed on the player: Power to sleep within 20 s of a wake with the headphones off, then Power: lit at once; journal quiescing→syncing ≈1–2 s. Next free label 192, sequence above 11600.

Previous entry: START HERE (2026-10-31): TEST BUILD 190 AND THE CODING STANDARD. After an audit ("do we have clean Reborn, Y2Linux and platform now?") the owner chose the quick fixes and the two big player functions (CURRENT_PLATFORM_STATE.md "Since Beta 9.1"), then: "going forward I only want high grade production level code everywhere" — the coding standard and its ratchet (tools/development/code-quality.py, in the gate) are the answer; read both before writing code. Test build 190 (seq 11510) built and installed on the owner's player, not published. Next free label 191, sequence above 11510. Plugins: PLUGINS-PLAN.md (owner: one unified kind of package, every plugin with code WebAssembly, Rust everywhere; next P0 spike). Open: the hardware round, the update core in Rust, 184 broken links in old docs (tools/development/check-docs.py).

Previous entry: START HERE (2026-10-30, late night): BETA 9.1 (BASELINE 189) RELEASE. Owner: "build it install it test it briefly and then publish it". Release 1.0.0-beta.9.1, sequence 11500, label 189 (Beta 9.1 report): Reborn on the contract types, the file and function split, platform leftovers (PLATFORM-RUST-IDIOMATIC-PLAN.md "After Beta 9.0"). Labels 187/188 were built only. Still open: the owner's hardware round; the update core in Rust (not started, owner decision). Next free label 190, sequence above 11500.

Previous entry: START HERE (2026-10-30, night): BETA 9.0 (BASELINE 186) RELEASE. Owner: "make a build and publish it as beta 9.0" with a report users can read: Beta 9.0 report. Release 1.0.0-beta.9.0, sequence 11400, label 186. Open: the owner's hardware round (overnight sleep, low-battery shutdown, SD repair/format, reset) — not done before publishing; answer error reports against 9.0 first. Next free label 187, sequence above 11400.

Previous entry: START HERE (2026-10-30, evening): 185 ON THE PLAYER, Q5 CLEAN-UP COMMITTED (NOT YET IN A BUILD); HARDWARE ROUND OPEN. Q5 since 185: the update core's journal typed on the platform side and one y2p_contract::Versions (d7a909d2; an update journal whose state is no text now leaves status readable, update Unavailable), CONTRACT.md "Typed records", measurements in the idiomatic plan (185: daemons 17.3 MB RSS / 5.5 MB PSS, idle 12.0 s/h, Reborn 15.7 s/h, simple calls 6–8 ms, status 330 ms of which ≈170 ms is the bounded wakeup_count read on the charger, application_ready 37.0 s). Tried and dropped: typing the receipt's battery copy (lossy). Contract synced to Reborn (93a0586). Open: the owner's hardware round on 184/185 (list below); the Q5 commits go into the next build (label 186, sequence above 11300); push only on the owner's word. A Rust rewrite of the C update core is a separate later project.

Previous entry: START HERE (2026-10-30, later): TEST BUILD 185 ON THE OWNER'S PLAYER; Q4 DONE, OWNER'S HARDWARE ROUND OPEN. Q4 part 2 (83778bce … a683b584): Reborn's sleep answer typed (pyjson deleted), suspend Receipt/Product (an unreadable receipt refuses as suspend_receipt_unreadable; the failure is still recorded in a new receipt), sleep admission, reset Plan/ResetRecord (confirmation still a hash over the plan as read; pyops deleted), one power-journal row and one sleep-diagnostics row, Failure::Crash gone. 185 (seq 11300, e7624ebf) Acknowledged; device check OK; the apply from 184 ran through the typed shutdown Intent on the player; sleep status read a 185-written receipt (refused, charger_active); application_ready 37.0 s (183: 40.0, before 37.4). **Owner's hardware round on 184/185:** SD + USB write window (ro after unplug), power-off/restart/low-battery, OTA + rollback, Y2Media, sleep (normal, maintenance wake, charger refusal), one reset of caches, sleep status after a wake. Next (Q5): optional: type the update core's journal on the platform side (contract test against the real core), versions.json and the battery copy (lenient: old receipts must stay readable); measure against the start; CONTRACT.md. A Rust rewrite of the C update core is its own later project (owner discussed 2026-10-30). Nothing pushed. Next free label 186, sequence above 11300.

Previous entry: START HERE (2026-10-30, after midnight): TEST BUILD 184 ON THE OWNER'S PLAYER; Q4 PART 1 DONE, OWNER'S HARDWARE ROUND OPEN. Q4 part 1 (021e2b9a … da7b1338): update health-ack, time floor, update restart/channel (one power-socket client), SD records (MediaRecord = media.json/claim/lifecycle, card Identity, Check, write windows), USB hand-off (usb-transfer views, one mtp-roots/mtp-events record), Y2Media (setup note/status, resume record keeps unknown fields, marker/claim), battery profile loader (shared with the setup gate), boot journal, CPU idle policy, power policy, shutdown Intent (+ one ProcessIdentity). Bug fixed on the way: USB tick and radiofw read the write-window answer's holders as an object (it is a list), so USB re-opened its SD window every tick and never closed it on unplug. 184 (seq 11290, 0516270c) Acknowledged, device check OK (power.json 11 rewrites/20 s as before). Owner's hardware round on 184: SD (insert/remove, write window with the USB cable in and out — card goes ro again), power-off/restart and low-battery shutdown, OTA + rollback, Y2Media, sleep unchanged so far. Owner decisions for part 2: corrupted /data records on the remaining critical path fail closed with ONE refusal reason (no Python error-text parity, pyjson/pyops go); build 185 follows. Part 2 so far: Reborn's sleep answer typed, pyjson removed (83778bce). Next: typed suspend Receipt/Product (sleep status, transition, record/progress, admission, helper, both journals), reset/maintenance, power journal; then build 185. Next free label 185, sequence above 11290. The native update core's journal/answers stay a boundary (C program's record, shown as is).

Previous entry: START HERE (2026-10-30, late night): TEST BUILD 183 ON THE OWNER'S PLAYER; FINISHING Q1–Q3 DONE, Q4 NEXT. Q3 since 182: codec module, radio firmware, wifi-failure record, typed Wi-Fi look end to end, power-save record, transfer manifest, capabilities on y2p_contract::Capabilities, one volume probe + one SD identity (storage), Wi-Fi events, USB records, readiness reasons, network-check (7a64dcc0 … c8833769). 183 (seq 11280) Acknowledged, device check OK; application_ready 40.0 s on this update boot (181/182: 37.5/37.4; services_started 22.7 vs 19.9 — watch on a plain restart). Q3 leftovers on purpose: bench (developer tool), facts/session/SQLite and other programs' data (boundaries), the power-journal row passthroughs, usb-transfer.json in the system section (View/Transfer hold &'static str), storage sys.rs USB status + the SD mount claim (go with Q4's SD operations). Next: Q4 (critical: update journal/health/staging/apply, SD operations + claim, internal setup, reset, power coordinator/policy, suspend, sleep.rs, boot.rs, time floor, cpu_idle), then build 184 and the owner's hardware round. Next free label 184, sequence above 11280.

Previous entry: START HERE (2026-10-30, night): TEST BUILD 182 ON THE OWNER'S PLAYER; FINISHING PLAN Q1+Q2 DONE, Q3 STARTED. PLATFORM-RUST-IDIOMATIC-PLAN.md "Finishing (Q1–Q5)" (owner decisions: critical code last with a hardware round, /data rollback-safe, Reborn API may change with Reborn). Q1 (status sections, ObservationRecord, Health, readiness, evidence record, netlink answers, power section) and Q2 (reports.json, report index, triggers, upload gate and answers, diagnostics bundle) committed through the gate; 182 (seq 11270) Acknowledged, device check OK, typed sections checked on the player. Q3 so far: one typed codec module (7a64dcc0). Pattern: a broken record leaves the command readable (section Unavailable/Failed) instead of refusing; odd fixture inputs the writer repairs go into tools/development/record-compat-allow.txt (reviewed). Next (Q3): storage observe/records/sys read sides, service radiofw copy/usb/download, connectivity wifi monitor/dns/radio_policy, devices transfer/time, capabilities template; then Q4 (critical: suspend, sleep.rs, power coordinator/policy, update journal/health/staging/apply, SD ops, internal setup, reset) + build 183 + owner's hardware round. Next free label 183, sequence above 11270.

Previous entry: START HERE (2026-10-30, evening): TEST BUILD 181 ON THE OWNER'S PLAYER; IDIOMATIC PLAN P0–P7 DONE FOR NON-CRITICAL CODE. PLATFORM-RUST-IDIOMATIC-PLAN.md P5 (typed Snapshot, 01c484d2), P6 (reports without Py, 76675310/585566fa), P7 (y2p_core::pyjson deleted, ASCII kernel numbers, ffd6ff52), CONTRACT.md stdout rule (67254a08); Reborn 717f038 (contract data). 181 (seq 11260) Acknowledged, application_ready 37.5 s, device check OK (health: Bluetooth UNAVAILABLE = radio off). Left (plan §3 notes): section functions returning their structs (readiness/health still read inside sections by key), reports.json as a struct, P4 leftovers (storage volume map, wifi internals, evidence, system); Value mentions 2,189 (reports moved Py → Value). Flaky test: y2p-core power_journal::wifi_rows_append_rotate_once_and_skip_a_busy_lock (forked child holds the flock until exec; give it the power test's retry). Owner: hardware checks owed since 169, event-source/dark-wake checks, boot-profile decisions. Next free label 182, sequence above 11260.

Previous entry: START HERE (2026-10-30, late afternoon): TEST BUILD 180 ON THE OWNER'S PLAYER; IDIOMATIC PLAN P0–P4 DONE, P5/P6 NEXT. PLATFORM-RUST-IDIOMATIC-PLAN.md: P0 (tools: semantic gate, Reborn contract test, record-compat, golden-diff), P1 (one serde writer), P2 (one argument reading), P3 (Rust types instead of Python comparisons outside critical code), P4 partly (Bluetooth typed), P7 started. 180 (seq 11250) Acknowledged, device check OK. Next: P5 (typed status snapshot), P6 (reports without Py, ≈420 uses), P7. Commit only on GATE OK (tools/development/platform-gate.sh, no argument). Next free label 181, sequence above 11250.

Previous entry: START HERE (2026-10-30, afternoon): NEXT WORK IS PLATFORM-RUST-IDIOMATIC-PLAN.md. Owner: outputs no longer have to be byte-identical to the Python platform, they must still work; move all code that is not extremely critical from Python behaviour to Rust behaviour; one agent, alone. The plan holds the contract that stays (Reborn, shell consumers, /data records across rollback, the report bundle, hardware behaviour), the critical code left alone, the method (semantic goldens, Reborn contract test, rollback-read) and phases P0–P7 → test builds 180–187. On the player: test build 179 (seq 11240). Next free label 180.

Previous entry: START HERE (2026-10-30, midday): TEST BUILD 179 ON THE OWNER'S PLAYER; NOT PUBLISHED. 178 + 179 finished the next-agent handoff's code items the agent could do alone (C, D, E, F, item 9, parts of G and J3; what was left on purpose and why: PLATFORM-RUST-NEXT-AGENT-HANDOFF.md §0). Service daemon dark 4.2 s/h; Reborn (764b024, 68af9ac) no longer asks to sleep every minute on the cable; application_ready follows the first frame on plain restarts. Owner decisions: the radio driver's fixed 5 s PMIC settle on every boot and boot-gate holding Reborn for the radios (roadmap-gap-audit.md "Boot profile"). Owed: event-source checks for I, dark-wake checks. Next free label 180, sequence above 11240.

Previous entry: START HERE (2026-10-30, morning): TEST BUILD 177 ON THE OWNER'S PLAYER, ACKNOWLEDGED; NOT PUBLISHED. 176's silent USB network was a one-off ECM bulk-OUT stall after its OTA boot (host transmit timeouts, usb0 had its address; replug fixed it, 176 Acknowledged, no fault counter, no gadget code in 176). 177 = 176 + eMMC entries skipped in the SD inventory/USB tick + BAT0 pread in the power daemon; seq 11220, Acknowledged, device check OK. Idle dark (battery Full): power 4.1, service 4.9, ssh 2.0, Reborn 12.5 s/h, process starts 3.0/min. Next: PLATFORM-RUST-NEXT-AGENT-HANDOFF.md §0 (C–F remainders, G, J2/J3). Owed (owner): event-source checks for I, dark-wake checks. Next free label 178, sequence above 11220.

Previous entry: START HERE (2026-10-30, early morning): TEST BUILD 176 (NEXT-AGENT HANDOFF A–F) APPLIED ON THE OWNER'S PLAYER — ITS USB NETWORK DID NOT COME BACK; NOT PUBLISHED. One overnight agent: §4 A (typed shared records) and B (state enums) done, C–F partly (see the handoff's §0), 34 commits on local main from 2e68d63e, every step byte-identical (platform-gate.sh), host suite 576 OK. 176 (seq 11210) staged and applied 03:48; the player enumerated (MTP + ECM) and MTP answers from the PC, but usb0 carried no packet (SSH unreachable), so update state and the device check are unknown; the agent stopped as asked (no 177, no idle measurement). After 176, committed and gated but not built: cheaper SD inventory/USB signature (eMMC entries skipped after one readlink) and the power daemon's pread of BAT0. First: look at the player, replug USB, check ip addr show usb0 and update status. Next free label 177, sequence above 11210. Details: PLATFORM-RUST-NEXT-AGENT-HANDOFF.md §0.

Previous entry: START HERE (2026-10-30, night): TEST BUILD 175 (REFACTOR NEXT PASS P1–P9) ON THE OWNER'S PLAYER, NOT PUBLISHED. 174 + 175 on top of 173 (refactor plan "Next pass"): BAT0 reads only what the estimate uses, power.json every 2 s, ~25 duplicate merges (low-battery policy, SD write window, /proc/locks, SHA-256, regex …), From<io::Error> errors, y2p_core::sys wrappers (unsafe 200 → 173, purge fd leak fixed), one-volume probes, space policy in the service daemon, USB tick never waits for media.lock, nl80211 power-save readback. 175 (seq 11200) by OTA, Acknowledged. Owed: long-uptime idle measurement, dark-wake checks. Next free label 176, sequence above 11200. Next work (one agent): PLATFORM-RUST-NEXT-AGENT-HANDOFF.md.

Previous entry: START HERE (2026-10-29, night): TEST BUILD 173 (DUPLICATION PASS + IDLE GAINS) ON THE OWNER'S PLAYER, NOT PUBLISHED. On top of 172 (refactor plan "Duplication pass and idle gains"): shared paths/digest/clock/json helpers; Wi-Fi look and ssh's usb0 address without processes (connectivity::direct); power.json on change/2 s (no effect: voltage changes every sample); NTP start only without ntpd; Reborn (639049b) dark-quiet cadence and metrics from the control thread. 173 (seq 11180) by OTA, Acknowledged ≈91 s. Idle dark: Reborn 45 → 19 s/h, process starts ≈140 → 34/min. Owed: dark-wake checks (Power, USB plug, Bluetooth Play, automatic sleep on battery). Next free label 174, sequence above 11180.

Previous entry: START HERE (2026-10-29, late evening): TEST BUILD 172 (REFACTOR QUICK WINS) ON THE OWNER'S PLAYER, NOT PUBLISHED. On top of 171: one text, Wi-Fi observer, workload lease, USB state and sleep-diagnostics parts each; explicit imports; codec inventory refusal; atomic_json syscall; stale doc references (refactor plan "Quick wins"). Byte-identical outputs to 171. 172 (seq 11170) by OTA, Acknowledged in 86 s. Owed: the owner's hardware checks on 172. Next free label 173, sequence above 11170.

Previous entry: START HERE (2026-10-29, evening): TEST BUILD 171 — THE REFACTORED RUST PLATFORM — ON THE OWNER'S PLAYER, NOT PUBLISHED. Owner: "just do the refactoring plan now and after you are finished install via ota". Done on main (not pushed): refactor plan waves 1 and 2 (cli.rs parser, one shared core in y2p-core, typed records, split modules, tests through the root's runner/clock, crash paths → refusal records, daemons survive odd records, same-lease DHCP renew changes nothing; CONTRACT.md "Refactor"). Test build 171 (seq 11160) installed by OTA from 170, Acknowledged in 86 s, application_ready 37.45 s. Owed: the owner's hardware checks (PLATFORM-RUST-PORT-HANDOFF.md §6 A) on 171; owner questions in the plan's status line. Next free label 172, sequence above 11160.

Previous entry: START HERE (2026-10-29, afternoon): TEST BUILD 170 ON THE OWNER'S PLAYER — PLATFORM DEFECTS FIXED, RUST-ONLY TESTS, NOT PUBLISHED. Owner: "start fixing the defects … no python … going forward, we only have the rust code"; then "just put it on the player and then review and see what works", and a code-quality refactor later. Done on main (not pushed): the ten carried defects fixed (CONTRACT.md table; Reborn 9859348 adds the update_in_progress message), tools/platform deleted, its ≈630 unit tests are Rust (608 Rust tests), the differential harness is a golden suite against the Rust binary (1 063 goldens recorded from Python), host tools in tools/host/tools/production, release's firmware check reads the stock files with the Rust reader. Test build 170 (seq 11150) installed by the first Rust stage/apply on a player (apply → Acknowledged 86 s, application_ready 37.7 s); SFTP opens Internal Storage (checked). Owed: the owner's hardware checks (PLATFORM-RUST-PORT-HANDOFF.md §6 A), then the refactor plan. Next free label 171, sequence above 11150.

Previous entry: START HERE (2026-10-29): NO PYTHON ON THE PLAYER — TEST BUILD 169 (WHOLE PLATFORM IN RUST) INSTALLED, NOT PUBLISHED. All phases implemented on main (not pushed): Linux 5640949 + docs, Reborn dc38c55, sequence 11140, label 169, Acknowledged by the Rust health-ack. Device (audit "PLATFORM-RUST phases 2–6"): daemons 15.2 MB RSS (Python 58.4), idle 19.6 s/h CPU (91.8), restart trail 0.46 s (2.57), boot 36.8 s (44.4), root 111 MB (130). **Owed (owner's hardware tests):** sleep cycles, two overnight runs, low battery, charger plug/unplug, power-off on a charger, SD, Internal Storage, OTA+rollback from 169, reports, MTP/SSH, Wi-Fi, Bluetooth. Known: two product-sleep differential cases are timing-sensitive under load (Python vs Python too); status --reborn --pss CPU is now mostly Reborn's rebornctl metrics --json. Then (§8): fix the defects carried 1:1, drop the Python reference from the host tests. Next free label 170, sequence above 11140. **Full port handoff (state, layout, build/test/install commands, decisions, defect list with locations, lessons): PLATFORM-RUST-PORT-HANDOFF.md.**

Previous entry: START HERE (2026-10-29): PLATFORM RUST PORT — ALL GROUPS MERGED ON MAIN, PHASE 6 (REMOVE PYTHON) NOT DONE. Stopped at the usage limit. On main (not pushed): argparse-identical dispatcher and every group ported and merged (observation, connectivity, devices, storage, service: update+firmware, reports, power, suspend); 30 test modules green with Y2_PLATFORM_RUST. Last device build: 168. Open: (1) stopped agent branches worktree-agent-a9cbacb26426e3605 (export-diagnostics wired; service-daemon and update health-ack not yet) and worktree-agent-a03b5860b99a9360a (non-UTF-8 argv in Rust; the other fallbacks not yet): review, finish, merge. (2) Phase 6: drop BR2_PACKAGE_PYTHON3* (keep SQLITE: reports load libsqlite3.so.0), post-build links y2-status/y2-health/y2-suspend-record/y2-power-audit and /sbin/poweroff,reboot to y2-platform, no /usr/lib/y2-platform, build without the Python fallback, fix validate.py 359-360, composition.py 48-70, check_installed_arm.py (Python under qemu), CONTRACT.md rows. Then build 169 (seq > 11130), OTA, owner's hardware tests.

Previous entry: START HERE (2026-10-28, late night): PLATFORM RUST PORT PHASE 1 DONE — TEST BUILD 166 (RUST DISPATCHER) ON THE OWNER'S PLAYER, NOT PUBLISHED. Owner: "go ahead with phase 1, we can't do the overnight drain yet". Linux 5d2c1ec..f336f3c + identity 10f884c (1.0.0-beta.8.44, seq 11110, rootfs v1.208), Reborn bd96685. platform/ Cargo workspace (Rust 1.99.0, vendored serde/serde_json/libc/ryu): y2p-core (ctx paths/reads, json.dumps-identical output, atomic_json, flock, clocks), y2p-contract (MIT; schema names, boot/health/capabilities/status/error types, Python goldens via tools/development/platform-goldens.py), y2-platform (execs the same Python command for every subcommand). Buildroot package y2-platform; post-build refuses a non-ELF /usr/sbin/y2-platform; shell wrapper removed. Reborn carries crates/y2p-contract (stamp Y2LINUX-SOURCE) and uses its schema names; `release.py sync-contractcopies it,build` refuses a differing copy. Harness: Rust vs Python identical on all 16 cases (host-tests.sh builds the host binary). Device (audit "PLATFORM-RUST phase 1"): OTA Acknowledged, restart trail 2.57 s orderly, Settings/About data, one unplugged sleep 261.6 s result 0, dispatcher +4–22 ms per call; plain restart boot baseline platform_start 8.72 / application_ready 44.44 s. Owed: overnight drain on 166 (= Python baseline), 165's power-off holding Power 15 s. Next: phase 2 (plan §5: status, health, capabilities, boot-stage, boot-evidence, time*, sleep status, wifi/dhcp/ntp-event, network-check, codec-runtime, cpu-idle-policy in Rust, each with a differential case; mark carried defects // DEFECT (CONTRACT.md)). Next free label 167, sequence above 11110.

Previous entry: START HERE (2026-10-28, night): PLATFORM RUST PORT PHASE 0 DONE, OWNER DECISIONS TAKEN — PHASE 1 NEXT. Plan §5 Phase 0, no product change, nothing built or installed; 165 stays on the owner's player (its overnight/power-off checks below are still owed). Measured on 165 (plan §7): platform daemons 58.4 MB RSS / 35.0 MB PSS, ≈92 s CPU per hour awake idle (power-daemon 60) and ≈109 s/h playing; `status --reborn --pss` 1.49 s, a Reborn refresh ≈3 s CPU, any state-changing call ≥0.84 s; Python 21.3 MB of the 130 MB tree; boot platform_start 12.5 → services_started 27.7 → application_ready 48.6 s. The idle run was 9 min (owner stopped it), playing 10 min (wired headphones); awake current not measurable on the charger. Inventory: platform/CONTRACT.md + platform/contract.json (106 entries; argument table checked by tools/development/platform-contract.py --check). Harness: tests/platform_differential.py, tests.test_platform_differential in tools/production/tests.sh (Rust side via Y2_PLATFORM_RUST, skipped now). Suspected defects in CONTRACT.md; confirmed on the player: usr/libexec/sftp-server greps "state": "Ready", the file has "state":"Ready", so SFTP never roots at Internal Storage. Raw samples: /data/logs/phase0/ on the player. Owner decisions (later that night): y2p-contract in Y2Linux, vendored by Reborn with a stamp, release.py build refuses a mismatch (plan §4 (a)); suspected defects are ported 1:1 and fixed after parity (plan §3.2, §8). Next: read the 165 overnight drain from the power journal (owner unplugs tonight; it is the Python drain baseline), then Phase 1 (repeat the roadmap gap audit first: architecture change). Next free label 166, sequence above 11100.

Previous entry: START HERE (2026-10-28, late): BETA 8.44 TEST BUILD 165 ON THE OWNER'S PLAYER, NOT PUBLISHED — WATCHDOG, LONG-PRESS, PANIC. Owner: "do what you think is best" on the open decisions. Kept: sleep floor 3.4 V/5 %, Wi-Fi heal timing, no panel re-init at lcm=0. Done: kernel-fed SoC watchdog in normal use (patch 0037 mtk_wdt, mtk_wdt.y2_keepalive=0 turns it off, stopped on suspend, tests/test_watchdog_keepalive.py), PMIC long-press reset off once a shutdown executes (/sys/firmware/y2_pmic/long_press_reset), panic=10 in the running system (rescue keeps 0). Seq 11100, label 165, Acknowledged. Device so far: "Watchdog enabled (timeout=31 sec)", keepalive Y, panic 10, loader warm/cold in the boot evidence. The freeze test is impossible here: no CONFIG_MAGIC_SYSRQ (no /proc/sysrq-trigger). Owed: sleep cycles and an overnight unplugged (no false resets, maintenance wakes), a power-off while holding Power 15 s (pmsg long_press_reset ok), an update restart. Next free label 166, sequence above 11100.

Previous entry: START HERE (2026-10-28, night): BETA 8.43 (BASELINE 164) PUBLISHED — Y2REBORN ISSUE FIXES. Seq 11000, Linux f5529b7, Reborn a08ca5d (fixes 2eada03). Report Beta 8.43, notes out/release-164-notes.md. Installed on the owner's player (build 164 = the release, Acknowledged). Issues fixed: Y2Reborn #25 #28 #30 #45 #46 #51 #52 #55 #56 #57 #60 #62 (answered, closed). Answered without code: #50 #54 #59 #61; later: #53 #33 #27 #41 #40; podcasts PR #19 not answered (owner). Owed by hand: letter-scroll feel, USB/seek ticks, leaving Search, Cover Flow shelf in light skins. Next free label 165, sequence above 11000.

Previous entry: START HERE (2026-10-28, evening): BETA 8.42 (BASELINE 163) PUBLISHED — SLEEP, LARGE SD CARDS, QUICK SCAN, REPORT FIXES, #62. Seq 10900, Linux 7e5b151 (#62 9ee3f04), Reborn 25b8e06. Report Beta 8.42, notes out/release-163-notes.md. Not installed before publishing (the owner's player runs 162, seq 10820). Issues #62 and #63 answered with the release link. Device checks and owner decisions owed: see the entry below and the report's Open section. Next free label 164, sequence above 10900.

Previous entry: START HERE (2026-10-28): BETA 8.42 IN PROGRESS, NOT PUBLISHED — REPORT FIXES F17 F23 F34 F39 F50–F57, TEST BUILD 162 ON THE OWNER'S PLAYER. All 40 pending error reports were reviewed (ledger UserReports/REVIEWED.md: rows, F50–F57, a dated paragraph for F39/F34/F23/F17/F48/F40). Fixes on main in both repos, not pushed: Linux boot (F23, F34…) .. `reports (F50, F56, F57…), kernel config7924194(CONFIG_LOG_BUF_SHIFT` 19: the Image was 5.4 KiB over the 12 MiB cap; the 1 MiB log comes from log_buf_len=1M), sequence d6b8420 (10820, rootfs v1.204); Reborn 3a4860b (F51 Play waits for lost Bluetooth headphones, F52 exact Wi-Fi reasons), 13f03d0 (F57 held Power after a wake), 25b8e06 (F17 EACCES).

  • F39/F50: SoC watchdog armed for the whole shutdown (power.py arm_watchdog, BAT0/watchdog_powers_off clears

    AUTO_RESTART for a power-off), pmsg begin <step> lines, radio stop after sync per radio, Wi-Fi IRQ returns IRQ_NONE after a connectivity failure (suspected stall, unproven), last power-off handler that never returns. Device: a user restart on 162 wrote the full trail (execute → init_reboot ok in 2.7 s).

  • F54/F55 (battery.py, product_sleep.py): warm restart keeps the saved percent (stock dod_init); sleep refused

    for the battery only at filtered 3.4 V / 5 %. F52/F53 (network.py, connectivity.py): WRONG_KEY latches on the 2nd, saved-network reselect after 30 s DISCONNECTED, interface re-add, wifi-journal.jsonl. F17: no DCS reads while reads are doubled, DSI restart ≤ 2 when no frames, splash CRTC cycle. F23/F34: init waits for both partitions; recovery watchdog from the first step. F56/F57: /sys/firmware/y2_pmic/power_status → previous-boot-evidence.json pmic (on 162: long-press reset enabled, 11 s, no record); pstore panic re-send fixed.

  • Device on 161 before the update: 17.3 h sleep ≈ 2 mA (voltage estimate), no F47 refusal. 162 installed by staged

    OTA, Acknowledged on health boot 1, ST7701S streams (vblank 16), kernel log 1 MiB.

Next: device checks per finding (F54 warm restart start: warm/saved; F55 sleep below 3.6 V; F51 Play after a sleep with Bluetooth headphones; F52/F53 ip link set wlan0 down, wpa_cli disconnect + platform restart; F57 hold Power after a wake; F50/F39 echo 1 > BAT0/watchdog_powers_off + open /dev/watchdog → off / charging mode; F49 large card), overnight drain on 162, release docs, publish only when the owner says so. Owner decisions: sleep floor 3.4 V/5 %; PMIC long-press reset (stock clears TOP_RST_MISC bit 6, we keep it: a hold through our 8–14 s power-off can be cut); watchdog in normal use (F56); panic=10 in the running system; Wi-Fi heal thresholds; stock re-inits the panel at boot when LK reports lcm=0 (not adopted). Next free label 163, sequence above 10820.

Previous entry: START HERE (2026-10-27, evening): BETA 8.42 IN PROGRESS, NOT PUBLISHED — SLEEP (F47/F48), LARGE SD CARDS (F49), QUICK SCAN. The owner said: commit, do not publish yet. Everything below is on main in both repos, not pushed, not tagged.

  • F47/F48 sleep (earlier today): Linux d3b49f2 (UART0 RX pad to GPIO in sleep, UART-busy dump + one retry),

    2200bad (a refused sleep stays dark); Reborn 57b47b2 (screen off at once on Power), 9ee61f0 (no Sleep page). Identity df66c7e/c5029b1 (8.42, seq 10800) and 5c0bc11 (seq 10810). Test build 160 ran on the owner's player; 161 (seq 10810, Reborn 9ee61f0) is built in out/release-161, its device check is not recorded.

  • F49 large SD card (Linux 84e5366): report d32f8f3c (install b4bc0c95; the user wrote "BFBC0C95"), 8.41,

    1 TB exFAT, 71 400 songs. fsck.exfat -n took 58.8–59.6 s; above ≈72 000 songs it hit the fixed 60 s, the card went read-only (check_timed_out) and Repair (fsck.exfat -p, 60.5 s, nothing changed) could not help. Now: admission check ADMISSION_CHECK_SECONDS 20 (ext4 EXT4_CHECK_SECONDS 60, no background path); a timeout mounts read-only as read_only: checking (observe: Ready, not writable; write_window → card_being_checked; not repairable); service.media_verify starts y2-platform media verify (retry VERIFY_RETRY_S 30) → media.verify: checker with CHECK_SECONDS 1800, no lock while reading, applies only to the same mount + card (identity id + diskseq), a failed check across a sleep (CLOCK_BOOTTIME − monotonic grew) gives no verdict. Pass → protected (USB window opens on its next 10-s tick); finding/timeout → filesystem_errors/check_timed_out (Repair). sd-admissions.json rows carry background: true. fsck.fat/fsck.exfat -n open the device O_RDONLY without a mount check (dosfstools 4.2, exfatprogs 1.4.3 sources in out/build/buildroot/build). Tests: test_platform_storage_tools (4 new), test_platform_update.test_media_verify_*. Docs: STORAGE.

  • Quick scan (Reborn c2ef3af): the same report's restart scans took 62–70 s to list 70 500 files. Automatic

    scans (Scanner::scan = ScanMode::Quick: start, storage change, after USB) skip a folder whose mtime is unchanged while the storage's free space (quick_fingerprint: mountinfo type exfat or ext4 only, reborn_platform::free_bytes) equals the last complete walk. Records: additive tables scan_folders/scan_volumes (with METADATA_REVISION), written only after a complete verified walk, cleared otherwise. Skipped folders' rows are marked seen (seen_folders, range on UNIQUE(source_id,path)), counts/playlists/subfolders come from the record. Scan for Music and control scan = scan_all (ScanMode::Walk). Trade-off: an edit on a computer that changes neither a folder's time nor the free space (most tag edits) shows only after Scan for Music. Kernel facts: 6.18 fs/exfat/super.c counts used clusters from the bitmap at mount; namei.c sets the parent's mtime on create/unlink/rename. Tests: quick_scan_tests (4); workspace tests, strict Clippy, fmt pass.

Next, in this order:

  1. Sequence bump for a test build (as 5c0bc11: update_sequence 10820, rootfs_version v1.204), commit, then

    Y2_STOCK_PACKAGE=$PWD/donorSource/y2_v3.2.0_FM-20260813 tools/production/release.py build --label 162 (do not touch the tree while it builds). Next free label 162.

  2. Device check of F49: first time fsck.exfat -n on the owner's card. If it finishes under 20 s, put a generated

    library on it (tens of thousands of small files) until it does not. Expect: card plays at once, /run/y2/media-mount.json read_only: checking → protected, an sd-admissions.json row with background, MTP read-only during the check and writable after, nothing offered for Repair. Also: sleep during the check, card pulled during the check.

  3. Device timing of the quick scan: restart Reborn twice with an unchanged card and compare the scan_completed

    fields (quick, folders_skipped, elapsed_ms); copy a song over USB (expect a full walk, quick: false); Settings → Scan for Music (full walk).

  4. F47/F48 on 161/162: Power → dark and stays dark; overnight drain (owed since 8.41).
  5. Release docs (report docs/validation/Y2-LINUX-1.0-BETA-8.42.md, state, readme, catalog, audit, handoff; Reborn

    state + readme). Publish only when the owner says so.

  6. Reply to the report user (the owner relays it; text below). Ledger: UserReports/REVIEWED.md F49 + row d32f8f3c.
  7. Pending error reports: about 30 since 2026-10-24 were read for sleep only (F47/F48) plus d32f8f3c; the rest are

    not reviewed (python3 tools/reports/fetch.py --pending --into UserReports).

Draft reply for d32f8f3c: "Thanks, your report showed it exactly. Your card isn't damaged: the player checks a card before using it, and with about 71 000 songs on your 1 TB card that check takes just under a minute, the time limit it had. Above about 72 000 songs it ran out of time, so the player kept the card read-only and offered Repair, which found nothing to fix. The next version uses the card straight away and finishes the check in the background, and after a restart it no longer reads every unchanged folder again. If you edit tags on a computer, use Settings → Scan for Music afterwards. Until then your music still plays; to add songs, put the card in your PC."

Previous entry: START HERE (2026-10-27): BETA 8.41 (BASELINE 159) PUBLISHED — INTERNAL SPEAKER, HEADPHONE DETECTION, HAPTICS (#28). Seq 10700, Linux af69742, Reborn 1358702. Plan/REA: docs/planning/SPEAKER-HAPTICS-PLAN.md; report BETA-8.41. Kernel: VIBR regulator-haptic (policy 0x542 0x8004 thermal never cleared, 0x544 selectors 3..5), kernel/audio/aw87559.c (registers without an answer so headphones never depend on it), card Speaker pin + y2_output_put rules, overlay 0030 speaker route in y2_hp_level_write and y2_jack_poll (200 ms, __pm_runtime_put_autosuspend: 6.18's pm_runtime_put_autosuspend marks busy). The audio I2C bus is 0 or 1 by probe order: find *-0030. Reborn: jack.rs, SinkSpec.speaker, native route 2, VolumeRamp::mono, jack changes through with_model_action, rebornctl jack in|out. Device path test: /data/speaker-paths.sh on the player (headphones out). Owed: overnight drain, a real plug on 159, GitHub #28 reply. Next free label 160, sequence above 10700.

Previous entry: START HERE (2026-10-27): BETA 8.40 (BASELINE 154) PUBLISHED — POWER OFF ON A CHARGER OPENS THE CHARGING SCREEN (F46). Seq 10500, Linux 1b09963 (fix 9f933b1), Reborn 77c54e2 (identity only). y2_charger_power_off in kernel/platform/mt6323-charger.c + poweroff-policy.h: CHRDET at power-off → stock charger RGU reset (reason 3) → LK mode 8. Device-checked on the owner's player (8.40 installed, Acknowledged): mode=8 reason=3, unplug there switches off (next start reason=1). Build gotcha: Y2_STOCK_PACKAGE=…/Y2Linux/donorSource/y2_v3.2.0_FM-20260813. Next free label 155, sequence above 10500.

Previous entry: START HERE (2026-10-26): BETA 8.39 (BASELINE 153) PUBLISHED — FOLDERS BY FILE NAME, SHUFFLE ALBUMS, PLAYLIST SORT, 120 000 SONGS. Seq 10470, Linux 1c599c5, Reborn 7cf527d (features 894a99c, performance b3534e9..7cf527d). Folders via reborn_ui::folders::FolderIndex and sort::natural_key; ShuffleMode (settings.shuffle + shuffle_albums, queue::album_shuffle); PlaylistSort per playlist; Ui::prewarm while the screen is off; playlists from the scan (ScanMetrics::playlists, worker Job::Known, cache/playlists.json). Device numbers for 120 829 songs in the Beta 8.39 report. Labels 147–152 were test builds. Next free label 154, sequence above 10470.

Previous entry: START HERE (2026-10-25): BETA 8.38 (BASELINE 146) PUBLISHED — BLUETOOTH PAUSE (F43), LIVE WAVE. Seq 10310, Linux 4c79cdb, Reborn 6c37d9f (F43 990443f). Bluetooth Pause releases the sink, Play reopens (BlueALSA in-place resume silent with AirPods Pro 2; reporter confirmation owed). Wave: ribbon AA + levels from app/reborn/src/meter.rs (Playback::heard, Ui::set_heard, components::wave_progress(.., levels)), also on Home's card. Label 145 was a test build. Next free label 147, sequence above 10310.

Previous entry: START HERE (2026-10-25): BETA 8.37 (BASELINE 144) PUBLISHED — SLEEP TIMER, SEARCH, ONE WAY OF SCROLLING. Seq 10200, Linux 69f9f4c, Reborn 69232c2. Sleep timer picker (#29, skins {sleep}), search Back one level / empty start / playlists / See All (#44), playlist focus fix, headers stay and only lists scroll everywhere (components::header_list_*, views_search::search_first, Ui::group_window). Spec: Y2Reborn docs/ui/REBORN-PRODUCT-UI-V4.md. Labels 139–143 were device test builds. Next free label 145, sequence above 10200.

Previous entry: START HERE (2026-10-25): BETA 8.36 (BASELINE 138) PUBLISHED — GITHUB ISSUE FIXES, ONE MENU ORDER, CUSTOMIZE. Seq 10050, Linux 8d22ba1 (supervisor report 007aa9c), Reborn 92b9c9a (fixes d340263, redesign 92b9c9a). Menu rules (owner): menus hold actions, Customize preferences, one order, no new row without removing one — spec Y2Reborn docs/ui/REBORN-PRODUCT-UI-V4.md (last section), test every_menu_lists_its_shared_actions_in_one_order. Label 137 (seq 10002) was a device test build. Open: haptics (#28, PMIC VIBR driver), AVRCP/Last.fm joined artists, queued songs deleted from storage stay in Up Next. Next free label 139, sequence above 10050.

Previous entry: START HERE (2026-10-25): BETA 8.35 (BASELINE 136) PUBLISHED — LOUDER HEADPHONES, SAFE BY DEFAULT (F45). Seq 9902, Linux fc733e8 (docs cc8e384), Reborn e0921a0 (change 5a40103). Master per level (Low −9, Medium −6, High 0 dB → ≈0.35/0.71/1.73 Vrms), volume in 0.6 dB steps, safe level = the old maximum (−14.7 dBV, safe volume 90/80/67) with Raise the Volume? and a 20-h lapse, one-time volume migration, start/BT-return cap. Plan and assessment: headphone drive plan; report Beta 8.35. No meter: the ≈100 Ω series resistance is still inferred. Build gotcha: release.py build needs Y2_STOCK_PACKAGE=$PWD/donorSource/y2_v3.2.0_FM-20260813 (default path ../Y2Player is gone). Next free label 137, sequence above 9902.

Previous entry: START HERE (2026-10-24): BETA 8.34 (BASELINE 135) PUBLISHED — MTP HANG FIX (#61). Seq 9802, Linux 88febab (fix 8a699dc: buildroot/package/y2-mtp/0006-y2-mtp-events-never-block.patch), Reborn 01f1ed3 (identity only). uMTP wrote StoreAdded/Removed under inotify_mutex and the interrupt write waits for the host; the SD write window swaps the SD storage right after connecting, so KDE/libmtp sessions hung. Report Beta 8.34, ledger F44. Repro on a KDE host: kioclient ls "mtp:/Y2/SD Card/" after umtprd "-cmd:unmount:SD Card" + "-cmd:mount:SD Card" on the player. 5 newer error reports fetched, not reviewed. Next free label 136, sequence above 9802.

Previous entry: START HERE (2026-10-24): BETA 8.33 (BASELINE 134) PUBLISHED — SEARCH PAGE AND QUEUE REDESIGN. Seq 9702, Linux 0caf312, Reborn eca7f49 (search 512a5f3/fdfa148, queue 8f7de2c, rebornctl action eae392b, Shuffle-off fix eca7f49). 8.32 (labels 131/132) was never published. Report Beta 8.33. Device-tested on the owner's player through rebornctl action NAME (hold menus cannot be injected as key presses). Open: holds and Move by hand; GitHub #60, Y2Reborn #26/#31/#32/#38 not yet answered. Build needs Y2_STOCK_PACKAGE=…/Y2Linux/donorSource/y2_v3.2.0_FM-20260813 (the stock folder moved). Next free label 135, sequence above 9702.

Previous entry: START HERE (2026-10-24): BETA 8.31 (BASELINE 130) PUBLISHED — LEFT/RIGHT BALANCE. Seq 9500, Linux b0b8ae6, Reborn b07cb9d (feature b12a1ee). Settings → Sound → Balance (user request, one ear hears less): settings.balance -10..=10 dB, the other side lowered at the live sink gain (VolumeRamp::balance). Installed and Acknowledged on the owner's player (normal restart), checked through button events; not listened to. Also this session: all 29 open Y2Player issues got a "no longer developed, use Y2Reborn" comment (still open). Next free label 131, sequence above 9500.

Previous entry: START HERE (2026-10-24): BETA 8.30 (BASELINE 129) PUBLISHED — GITHUB TRIAGE FIXES, REPLIES POSTED. Seq 9401, Linux e510867 (fixes 14e2c91), Reborn 44481c3 (fixes 20a493b, seek 44481c3). Report Beta 8.30. Done: #58 (no audiobooks in music queues), Songs in list order and Previous restarts after 3 s (Y2Reborn #21), AVRCP absolute volume (Y2Reborn #22: BlueZ transport Volume, settings.wired_volume, takeover never louder; not run with real headphones), #55 recovery lines + two-line toasts (16 were cut), GC9503V power-down default (#42/#45), #59 assessed (ext4 yes, f2fs maybe, btrfs no). Device: 9401 installed and Acknowledged on the owner's player; Previous 3/3. **The first boot after the 9401 update restart hung before boot.json (splash "Couldn't Start", no USB, no logs; pmsg lost to the long-press reset)** — F39 family, second occurrence; next lever: keep the early-boot stage trail where a long-press reset cannot clear it. GitHub: closed #58 #55 #53 #56 #45 #46 #42 with replies; commented #50 #59 #40 #41, Y2Reborn #21 #22 #19 #20. Still open: #40 split artists, #41 Album Artists, #50.3/#50.6, Y2Reborn #21.4 (MusicBee, report asked), #22 confirmation, #19 podcasts (owner: later). Next free label 130, sequence above 9401.

Previous entry: START HERE (2026-10-24): BETA 8.29 (BASELINE 128) PUBLISHED — CHARGING WITHOUT PMIC DIE CALIBRATION (F42). Seq 9300, Linux 4d97301 (fix 1a51503), Reborn e58980c. Reports 09888d70/8fc8eea6/ba0bb428 (install 047f2c1a, 8.28): never charged; die calibration=0 (efuse 0x63a bit 1 clear, CID 0x2023) → die channel -ENODATA → charger fault=0x3 forever. Fix: y2_pmic_calibrate returns 1 and uses the stock nominal (VTS 3698, 25 °C, slope 0) +10 °C (owner choice); boot log die calibration=2 + efuse words. Not installed on a player before publishing (SSH to the owner's player denied by the session's permission classifier). Reporter confirmation owed. The GitHub triage below is still unposted. Next free label 129, sequence above 9300. Report BETA-8.29.

Previous entry: START HERE (2026-10-24): AFTER BETA 8.28 — TRIAGE OF ALL OPEN GITHUB ISSUES DONE, NOTHING POSTED; PICK THE NEXT BETA.

State. Newest release Beta 8.28 = baseline-127 (seq 9200, Linux build f3f938a + docs 96b5039, Reborn f6eb0b2 + docs pushed). The owner's player runs 8.28 (installed by OTA, Acknowledged boot 1). Both repositories clean and pushed. Next free label 128, sequence above 9200. 0 pending error reports at the end of 2026-10-23.

Released on 2026-10-23 (each installed and checked on the owner's player before publishing; reports in docs/validation/):

  • 8.25 (baseline-124, seq 8901): #52/#54 headphone crystal, both reporters confirmed and closed.
  • 8.26 (baseline-125, seq 9000): review of 12 reports → F35–F41: F36 low-battery power-off loop on a charger

    (restore/OCV/SOC-shutdown rules), F37 y2-radio per-device rfkill (Wi-Fi blocked after a sleep with Wi-Fi off; reproduced and fixed on the player), F38 nonstandard chargers 450 mA (owner choice, unqualified), F39 pmsg shutdown trail + 3-s stage writes, F35 cfg80211 roam BSS, F12/F13 evidence fields, F41 scrubber.

  • 8.27 (baseline-126, seq 9100): SD cards (report 29ed4ccb): FAT/exFAT with errors mount read-only and

    play; Repair SD Card (owner-confirmed, charger or 30 %, tables copied to /data/system/platform/sd-repair/, fsck.fat -a -w / fsck.exfat -p / e2fsck -p); healthy cards protected (ro between writes, windows y2-media write --holder usb|reborn|report|radiofw, closed by the 3-s reconcile tick; owner switch /data/system/platform/sd-always-writable). Device-checked: ro 4 s after unplug, fsck.exfat clean, rw on replug. Not run on a really damaged card in a player.

  • 8.28 (baseline-127, seq 9200): Y2Reborn #20 wrong Wi-Fi password never said → platform reports

    Failed/wrong_credentials (+ failed_network_id) until a connect; Reborn tries a join before saving it (PendingJoin), reopens the keyboard with the text + "Wrong password", one entry per network, other networks enabled again, Change Password. Device-checked with rebornctl test wifi-join-wrong --saved 0 (WrongPassword 5.8 s, nothing left) and wifi-join --saved 0 (Joined).

Review ledger UserReports/REVIEWED.md (untracked): F1–F41 + rows up to 2026-10-23. Still open: F13 (saved network "not found" with BT off and the AP listed at −66 dBm; empty scans after wakes on 8.25 — new fields saved_age_s, saved_flags, saved_key_mgmt from 8.26 should explain the next one), F38 (450 mA unqualified on a real nonstandard charger), F39 (cause of the hung update restart; pmsg trail since 8.26), F40 (two xruns, watch), F12 (the reporter's other line — 8.26 records its shape; 8.27 plays such cards read-only).

GitHub triage (2026-10-23, nothing posted, closed or changed — waiting for the owner). 15 open issues:

  • Close with a short comment: Y2Linux #53 (time: fixed 8.22, manual clock), #56 (update freeze: watchdog

    since 8.23, report reviewed), #57 (gain: Settings → Sound → Output → Headphone Jack; top level still a bit quieter than stock), #45 (panel power-down: fixed 8.7, confirmed), #46 (hardware report, answered), #42 (drain: ≈1.9 mA with the panel power-down — best closed together with the GC9503V default below).

  • Comment, keep open: Y2Linux #50 (#1 pause silence 8.12, #2 genre All Songs/Shuffle 8.14, #4 shuffle order

    8.14 fixed; #3 genre → playlist and #6 genre-filtered album open; #5 Librepods not planned); Y2Reborn #21 (2 wrong password fixed 8.28; 1 Previous-restarts-song open; 3 Songs plays album order — check; 4 MusicBee → SD — ask for an 8.27+ report); Y2Reborn #20 (closed by reporter: note "fixed in 8.28"); Y2Reborn #19 podcasts PR (samanz) — owner decision: PR yes/no, placement, directory (fyyd), auto-download.

  • Code candidates (nothing implemented):
    1. Y2Linux #58 audiobooks in All Songs shuffle — confirmed: filtered_indices()

      (Y2Reborn crates/reborn-ui/src/lib.rs:2438) filters only track_matches, the queue builder only online; add is_music() (one line + test).

    2. Y2Linux #55 "This takes less than a minut": recovery screen COLUMNS 28 (tools/update/recovery-ui.c:34),

      text 30 chars in initramfs/production/recovery.sh:202,248 → e.g. "It takes under a minute.".

    3. GC9503V panel power-down by default: CONFIRMED_PANELS = {'st7701s'}

      (tools/platform/y2_platform/power_features.py:47); #45 reporter confirmed GC9503V on 8.7 and ≈1.9 mA. One line, hardware decision.

    4. Y2Reborn #21.1 Previous restarts the song after ~3 s (today Effect::PreviousTrack always steps back,

      app/reborn/src/main.rs).

    5. Y2Linux #50.3 genre → Add to Playlist / Play Next / Add to Queue (collection menu only on Album/Artist,

      crates/reborn-ui/src/lib.rs:1344).

    6. Y2Linux #40 split multi-artist tags ("A;B" under both; Artists list groups by raw t.artist,

      crates/reborn-ui/src/catalog.rs:181).

    7. Y2Linux #41 Album Artists browse (albums already keyed by album_artist).
    8. Y2Reborn #22 Bluetooth absolute volume: bluealsad started without --a2dp-volume

      (usr/libexec/y2/connectivity:18), Reborn volume is software only; needs AVRCP volume sync + fallback.

    9. Y2Linux #50.6 album opened from a genre shows only that genre's songs (option).
    10. Y2Linux #59 f2fs/btrfs/ext2 on SD: answer "use ext4 (supported)", not planned.

Other owed items: GitHub replies not posted on #20/#21/#58/#55 etc.; the 8.24 crystal trim plan (remove non-stock crystal code, keep the switches as diagnostics) still waits; WPA3-only networks are not offered (Network::password_required accepts PSK only).

How-to reminders (details in memory notes): release = release.py bump --version X --sequence N → commit both repos (Reborn with GIT_AUTHOR_*/GIT_COMMITTER_* env, never model attribution) → release.py build --label N (tree must stay clean while it runs) → install on the player (scp out/release-N/ota/* to /data/updates/owner-N, y2-platform update stage --package DIR, update apply) → docs → `release.py publish --label N --title … --notes out/release-N-notes.md --yes` (Reborn HEAD must be the built commit: Reborn docs commit after publishing). Host checks: tools/development/host-tests.sh (906; the report tests are load-flaky, rerun alone), Reborn `cargo test --workspace,clippy -D warnings,fmt --check, previewscargo run --bin reborn-preview -- DIR` + tools/preview/render_previews.py DIR. Player SSH over USB ([email protected], key ~/.ssh/y2linux_ed25519); Wi-Fi may be idle-powered-down while dark (unblock the wlan rfkill); a background logger needs a long runtime when the owner unplugs (the card is always rw while USB is connected).

Previous entry: START HERE (2026-10-24): BETA 8.28 (BASELINE 127) PUBLISHED — WI-FI WRONG PASSWORD (Y2Reborn #20). Seq 9200, Linux f3f938a, Reborn f6eb0b2. Platform: wifi-failure.json credential block (kept until a connect, survives ap_unavailable), network.json Failed/wrong_credentials + failed_network_id. Reborn wifi.rs PendingJoin (ATTACH, SELECT, events; saved only on connect; older same-SSID entries removed; ENABLE_NETWORK all; failed try removed), Status.join, UI wifi_join_changed (keyboard reopened with the text + "Wrong password"), Change Password, rebornctl test wifi-join[-wrong] --saved ID. #20 not commented on GitHub. Next free label 128, sequence above 9200. Report BETA-8.28.

Previous entry: START HERE (2026-10-24): BETA 8.27 (BASELINE 126) PUBLISHED — SD CARD PHASES 0–3. Seq 9100, Linux 65e1c47, Reborn 4947352. F12 follow-up (report 29ed4ccb): interrupted-write leftovers Linux never sees are admitted; FAT/exFAT cards with errors mount read-only (media-mount.json `read_only: filesystem_errors | check_timed_out), RebornSdCard::ReadOnly/Unchecked, Settings → Storage → Repair SD Card (y2-media repair`, tables copied to /data/system/platform/sd-repair/); healthy cards read_only: protected with windows (`y2-media write --holder usb|reborn|report|radiofw), closed by the reconcile tick; owner switchsd-always-writable`. Device-checked: protection/windows/unplug; not run: read-only fallback and repair on a really damaged card. Report BETA-8.27. Next free label 127, sequence above 9100.

Previous entry: START HERE (2026-10-24): AFTER BETA 8.26 (BASELINE 125) — REPORT FIXES F35–F41 PUBLISHED. Published 2026-10-23 (seq 9000, Linux build 518c641; Reborn 404edb3, identity only); the owner's player runs it. The 12 reports pending after 8.25 were reviewed (ledger UserReports/REVIEWED.md, F35–F41) and fixed: F36 start on a charger after a low-battery power-off (battery.py restore, stale power-on OCV, power.py SOC shutdown on battery only), F37 y2-radio per-device rfkill (reproduced on 8.25 and fixed on the device), F38 nonstandard 450 mA (owner choice, unqualified), F39 pmsg shutdown trail + 3-s stage writes, F35 roam BSS entry, evidence for F12 (other shapes) and F13 (entry age, flags, key_mgmt), F41 scrubber. F40 (two xruns) is watch-only. Next: fetch.py --pending; watch for F13/F39 evidence and F38 on a nonstandard charger; then the 8.24 crystal trim plan. Next free label 126, sequence above 9000. Report BETA-8.26.

Previous entry: START HERE (2026-10-24): #52/#54 ARE SOLVED ON BETA 8.25 — REVIEW THE OTHER PENDING REPORTS, THEN TRIM. 2026-10-23: both reporters closed their issues. #54's 8.25 report (5f909e65, install 0400eb78): `tries=1 ready_ms=30 errors=0 cycles=0 stream_cycles=0— the chip-powered start (PWDN_CTL=0x10`) alone fixed a unit whose crystal failed at every power-up on 8.22/8.24; 23 tracks, 0 playback errors. #52 (2813306c) confirmed in text, no report. Ledger rows added. Nothing of 8.25's retry machinery was exercised, so the 8.24 trim plan (keep stock-equivalent parts, remove non-stock crystal code; keep the switches as diagnostics) may start. Before that: 12 other pending reports from 2026-10-22/23 (installs 00322807, 03df8d42, 07e62fce, 432e74ab, 4ff97dff, 703f1fbf, 72f7e3ee ×3, cc1fe289, 09cabe08, aa96e00a) are unreviewed — ledger first. Next free label 125, sequence above 8901.

Previous entry: START HERE (2026-10-24): AFTER BETA 8.25 (BASELINE 124) — READ THE #52/#54 RESULTS. Published 2026-10-23 (seq 8901, Linux build f7f23d4; Reborn 40386bc); the owner's player runs it. 8.24 did not fix #52, and #54 fails the same way: the CS43131 crystal flags XTAL_ERR at power-up (both 8.24 reports, cycles=0). Full evidence, stock RE and Fable's analysis: docs/planning/ISSUE-52-54-CRYSTAL-HANDOFF.md. 8.25: crystal start with the chip powered as stock except the headphone amplifier (with it, static at screen wake on the owner's player), three tries with 500 ms rail cycles, one cold start for the first song; switches y2_xtal_full_power, y2_xtal_start_hp, y2_xtal_quiet_start, echo cycle > y2_hp/xtal; y2_hp/xtal adds tries= start_ms= stream_cycles=. Order: (1) reports (fetch.py --pending, ledger): tries=, errors=, stream_cycles=, unconfirmed= on 2813306c and 0400eb78, and any test output in the issue comments. (2) If tries>1 then ready: the retries work; if ready only with start_hp=1, design a click-free amplifier start. If still never ready: supply margin (VGP2 under load, real GPIO rail voltages) is next, not the register sequence. (3) The trim plan of the 8.24 entry waits until #52/#54 play. Next free label 125, sequence above 8901. Report BETA-8.25.

Previous entry: START HERE (2026-10-24): AFTER BETA 8.24 (BASELINE 123) — WAIT FOR #52/#54, THEN TRIM THE CRYSTAL CODE. Published 2026-10-23 (seq 8800, Linux build 2a21690, docs 6cc7eb2; Reborn e199d9c, docs db4c407); the owner's player runs it. #52 cause: every failure on 8.21–8.23 was a 48 kHz start through the CS43131 PLL (PLL_READY -110, then XTAL_ERR); stock audio_policy.conf output = 44100 only, so stock never runs the PLL. 8.24: AFE 44.1 kHz only, codec refuses non-crystal rates, Reborn reborn_audio::WIRED_RATE (decoder converts; one open sink for all rates), codec power cycle after a crystal error (y2_hp/xtal cycles=), cold start at probe when rails are on (cold_start=). Device: 13/13 (48/96 kHz at 44100 Hz, crystal selected, 50 reuses, 0 reopens). Correction: a software or OTA restart already resets VGP2 (2.5 V reset value, off at probe), so the "VGP2 survives a restart" idea in f66d71d was wrong; the code comment is fixed on main (0da8393, unbuilt). Order for today:

  1. Reports first (UserReports/REVIEWED.md, tools/reports/fetch.py --pending). #52 (2813306c), #54 (0400eb78) on

    8.24: y2_hp/xtal (ready_ms, errors, unconfirmed, cycles, cold_start), any refused: it needs the PLL or codec power-cycled kernel line, sink_reused/sink_reopened. #54 failed differently on 8.22 (crystal not ready 45.9 s after power-up), so the 44.1 kHz conversion alone may not fix it.

  2. GitHub: no comment on #52 about 8.24 yet (owner not asked; offered). #56 comment's battery sentence still overstated.
  3. Owner decision recorded 2026-10-23: no rollback of the crystal changes now. Most of 8.21–8.23 copies stock

    (crystal with the codec, never switched, stock power-up, hold while the screen is on); the pre-8.21 behaviour was the unusual one, and which change fixed #52 is unknown. Once #52/#54 confirm 8.24, trim only non-stock parts that prove unnecessary: (a) probe cold start (proven not to trigger) first, (b) the power cycle if no report shows cycles>0, (c) the up-to-1-s ready wait only after reports settle (it gives ready_ms). Measure the hold's battery cost before touching it (a shorter idle delay is the milder lever).

  4. Still owed on the owner's player: click check by ear at track changes, unplug USB → real sleep/wake → play on

    headphones, full power-off/on, overnight drain vs 8.22.

  5. Open questions unchanged: #56 drain in a frozen recovery on a charger, F34's cause, the synchronous hold write at

    screen wake (≈70 ms when the codec was down), car AVRCP metadata, long-book seek, #42, #45, #47, F23.

Next free label 124, sequence above 8800. Report BETA-8.24.

Previous entry: Y2LINUX 1.0 BETA 8.24 (BASELINE 123) PUBLISHED — NO CODEC PLL, 44.1 kHz AS STOCK (#52). Build 123, seq 8800, installed on the owner's player; see the entry above and report BETA-8.24.

Previous entry: AFTER BETA 8.23 (BASELINE 122) — WHAT IS OWED TODAY. Published 2026-10-22 night (seq 8705, Linux e3195fd + docs, Reborn 0779d8b + docs dfd9640); the owner's player runs it. GitHub comments posted on #52, #54 (asked to retest; #54 to enable Send Error Reports and give the Install ID) and #56 (correction: the Reborn F33 fix was another bug; 8.23's watchdog is the fix for the freeze). The #56 comment's last paragraph calls the battery drain explained — it is not; an edit was blocked, the owner may fix it. Order for today:

  1. Read new reports first: UserReports/REVIEWED.md + tools/reports/fetch.py --pending (ledger rule). For #52 (2813306c) and

    #54 (0400eb78) on 8.23 read y2_hp/xtal (ready_ms, errors, unconfirmed), sink_reused/sink_reopened, dac_hold_failed; any frozen install: /data/logs/recovery-previous-boot.txt and Y2RECOVERY/pmsg lines.

  2. Owner's player, needs the owner: listen for a click at same-format track changes (kept sink); unplug USB → screen

    off → product sleep → wake → play on headphones (first real sleep with the hold/new power-up; read sleep rows and cs_sleep_*/cs_force_* notes); full power-off/on; ideally an overnight drain vs 8.22's figures.

  3. Open questions: #56 lost 54 points in ≈1 h frozen in recovery on a charger (does recovery charge? what drew it?);

    F34's cause (needs a trail); the hold write at screen wake is synchronous (≈70 ms when the codec was down — move off Reborn's main thread if it shows); battery cost of the screen-on hold (stock does the same, unmeasured).

  4. Unchanged from before: car AVRCP metadata, long-book seek, #42 sleep drain, #45 GC9503V screen-off, #47 charging

    confirmation, F23 rollback cause.

Next free label 123, sequence above 8705.

Previous entry: Y2LINUX 1.0 BETA 8.23 (BASELINE 122) PUBLISHED — RECOVERY WATCHDOG (F34), DAC AS STOCK (#52, #54). Build 122, seq 8705, Linux e3195fd, Reborn 0779d8b, installed on the owner's player (test builds 8700–8704). F34: recovery feeds the SoC watchdog only while the installer progresses (120 s), pmsg trail and /data/logs/recovery-previous-boot.txt; initramfs links few applets (touch missing broke 8701/8702; a test now checks every command). #52/#54: stock power-up (XTAL+PLL+CLKOUT, select EXT 20 ms later, ready_ms), DT rail burst (dac20/18 0, dac15 50 ms), y2_hp/hold set by Reborn while the screen is on, Reborn keeps the wired sink across same-spec track changes (sink_reused). Owed: real sleep/wake and power-off with this build, battery cost of the hold, click check at track changes, reporters' y2_hp/xtal. Report BETA-8.23. Next free label 123, sequence above 8705.

Previous entry: Y2LINUX 1.0 BETA 8.22 (BASELINE 121) PUBLISHED — REPORT FIXES F23–F32, #53, #52/#54 CRYSTAL. All pending reports reviewed (ledger UserReports/REVIEWED.md, F23–F32). Built and installed on the owner's player (build 121, seq 8607, Linux 073aa0c, Reborn e196033; test builds 8600–8606 found initramfs applet, printk-JSON, busybox-ntpd and PLL-switch issues, all fixed). #52/#54 crystal: stock lifecycle (probe start, 2-min idle, no source switch, 20-ms polls, ready_ms); stock RE confirms a crystal on every Y2; next lever if it still fails: stock's exact power-up (PLL/CLKOUT on, rail burst). F23 (update rollback, GC9503V) has evidence capture (/dev/pmsg0 trail, /data/updates/health/*.txt) and a recovery display-off fix candidate; cause unproven. Owed on a player: F24 after a real sleep (USB blocks sleep), F25/F26/F28/F31 failure cases, Date & Time page by hand. Report BETA-8.22. Next free label 122, sequence above 8603.

Previous entry: Y2LINUX 1.0 BETA 8.21 (BASELINE 120) PUBLISHED — CRYSTAL RUN AS STOCK (#52, #54). Installed on the owner's player before publishing (build 120, seq 8500, Linux 2e914d6, Reborn cdc6b43). 8.20's 15 µA boost failed on #52, and #54 (install 0400eb78) is a second player that never plays on headphones but does on stock. Stock cs43131_hw_init powers the crystal with the codec and masks/never reads XTAL_RDY/XTAL_ERR; we had started it only at hw_params and stopped it before every retry (≤0.5 s continuous). Overlay 0030 (Linux 9ba00b9): crystal on at runtime resume, off only at runtime suspend, a stream waits until it ran 1 s then uses it anyway, later flags only counted, no auto boost/rail cycle, codec autosuspend 5 s; y2_hp/xtal running= ready= unconfirmed= errors= boosted=. Device runs all pass (report BETA-8.21); the slow path itself is owed by the #52/#54 reporters. #53 (clock = build time without Wi-Fi) diagnosed, fix awaits the owner's choice. Ledger rows in UserReports/REVIEWED.md. Next free label 121, sequence above 8500.

Previous entry: Y2LINUX 1.0 BETA 8.20 (BASELINE 119) PUBLISHED — #52 HEADPHONE CRYSTAL. Installed on the owner's player before publishing (build 119, seq 8400, Linux 0f0b4ed, Reborn cdae78e). #52 = the #48/#51 player (install 2813306c): its CS43131 flags XTAL_ERR at the stock 12.5 µA bias; overlay 0030 now raises the bias to 15 µA after a failed start or a stop while running (y2_hp/xtal boosted=, writable boost), Reborn's open deadline 5 s, reports collect y2_hp/xtal. Device runs at stock and forced 15 µA all pass (report BETA-8.20). Owed: the reporter's confirmation (next report's y2_hp/xtal). Test tones (48/96 kHz) on the owner's Internal Storage Reborn Test 48k/. 8 uploaded reports still pending review (fetch.py --pending). Next free label 120, sequence above 8400.

Previous entry: Y2LINUX 1.0 BETA 8.19 (BASELINE 118) PUBLISHED — AUDIOBOOKS, SHARPER COVERS, CUSTOMIZE. Installed on the owner's player before publishing (build 118, seq 8302, Linux 6649c89, Reborn da5b777; 8.18 was test-only). Audiobooks: reborn_core::books, app/reborn/src/books.rs, sleep_timer.rs, views_books.rs; plan, code map and device test in Reborn docs/ui/REBORN-AUDIOBOOKS.md; user guide docs/AUDIOBOOKS.md. FFmpeg gains atempo (01d8882); FFmpeg allocation ceiling 128 MiB (long M4B). Covers 180/128 + levels; Customize (Wrap Around, When Screen Off). Open: car AVRCP metadata (btmon capture on the owner's player /data/logs/car-bt/), in-file seek for long books (2–3 s reopen), the 4.5-min pre-recovery stall seen once (build 115). Test books on the owner's Internal Storage Audiobooks/Reborn Test Books/. Next free label 119, sequence above 8302.

Previous entry: Y2LINUX 1.0 BETA 8.17 (BASELINE 114) PUBLISHED — #51 CRYSTAL, REPORT/REDDIT FIXES F12–F22. #51 (XTAL_READY -110 until reboot, the #48 player): crystal now runs until runtime suspend as stock, forced restart, one rail cycle (overlay 0030, y2_hp/xtal). F12 SD admission accepts Windows-benign fsck findings (media.py fat_findings, sd-admissions.json); F20 bt_lost |=; F21 discovery; F14 intents now reach /run/y2/bt-intent (were never read since Oct 5), page cancel, timed holds (failed/pending/codec), busy retries; F22 SBC ABR (bluez-alsa 0003); F15, F16, F5, F13 diagnostics, F18 sleep waits for application_ready, F17 DSI double read + Reborn wake retry. Ledger UserReports/REVIEWED.md. Not installed before publishing (owner OTA); device checks listed in the 8.17 report. Deferred by owner: HLS radio, on-device SD repair. Next free label 115, sequence above 8100.

Previous entry: Y2LINUX 1.0 BETA 8.16 (BASELINE 113) PUBLISHED — LARGE LIBRARIES (QUEUE, SCAN SPEED). Report 9765e1e7 (28 600 songs): invalid queue bounds on every All Songs play (MAX_QUEUE 20 000; ≈500 B/song in an 8 MiB session) → MAX_QUEUE 5 000 window/random part, trimmed restore (122607f). Scans: 757.8 s full, 759.2 s with no change (db 749 s) → scan probe marks seen by id (5c7e768, host 54.7 → 0.08 ms/batch); tags read on up to 3 cores at nice 10 (4922cab, host 3.3×). Not installed before publishing; the reporting user's next report gives the scan timing (scanner scan_completed fields). Next free label 114, sequence above 8000.

Previous entry: Y2LINUX 1.0 BETA 8.15 (BASELINE 112) PUBLISHED — CJK TEXT, UPDATE CHECK AFTER WAKE, CODEC RETRY. CJK: Noto Sans CJK JP Regular package y2-font-noto-cjk (0b3fcb5), Reborn runtime glyph page (a3b1943, reborn-graphics glyphs.rs, reborn-ui glyph_cache.rs, texture slot 9). Update: user "no Update button" + reports 61caa81e/297f1032 → update.stage waits 30 s for Online, 3 tries, a failed check keeps an offered release, failed daily check retries hourly (abee0c0); Reborn wording/flash (cdf8c7b). F8 codec retry in the BT worker (b8cd9a7). Build 112 (seq 7900) not installed before publishing: the owner updates the maintainer's player by OTA — then check CJK on Lima, the glyph-page speed, and Check for Updates right after a wake. Next free label 113, seq > 7900.

Previous entry: Y2LINUX 1.0 BETA 8.14 (BASELINE 111) PUBLISHED — SHUFFLE, SEEK, GENRE SHUFFLE, TITLES, EMMC ZERO-OUT. User requests: shuffle seed was the track ID (same order every time) → getrandom + splitmix64, Shuffle rows start anywhere; held seek 30 s/step → 1 s → 3 s → 10 s (≤ 1/60 song); Shuffle row on a genre (All Songs existed); Home card title fitted to 200 px (Reborn 2861ec9). Report bf017f02: eMMC advertised TRIM → setup zero-out became an erase the MSDC guard rejects → overlay 0009 init_card marks TRIM broken (f9a3bd8), write_zeroes 0 on the player. Report docs/validation/Y2-LINUX-1.0-BETA-8.14.md, audit BETA-8.14. Build 111 (seq 7800) installed, owner checked. NEXT (owner): Japanese text = Noto Sans CJK fallback with runtime glyph cache (audit first, AGENTS.md). Later: USB DAC (owner checks GPIO93/5 V boost + CC first), video not for 1.0. Next free label 112, sequence above 7800.

Previous entry: Y2LINUX 1.0 BETA 8.13 (BASELINE 110) PUBLISHED — SONGS OVER MTP, WI-FI CONNECT, BOOT LOG. Five uploaded reports (now pulled automatically: systemd user timer → UserReports/, ledger UserReports/REVIEWED.md, tools/reports/fetch.py --pending --into UserReports lists unreviewed ones) and two user messages. Strawberry saw no songs: umtprd reported every file as Undefined → overlay 0005 formats by extension + tags from Reborn's library (207e920, hidden files 3f4f3d1, container SQLite stub 338e408); mtp-tracks 0 → 311 on the maintainer's player. Wi-Fi sme.c:845 dropped connect → driver passes the BSS to cfg80211_connect_bss (9595a50). Boot Errno 22 → 0f18219. Pause silence = #48 (8.12), checked on a player. Report docs/validation/Y2-LINUX-1.0-BETA-8.13.md, audit BETA-8.13. Build 110 (seq 7701) installed and checked; test build 109 (seq 7700) before it. Owed: Strawberry itself, Windows Explorer display of music Names. Next free label 111, sequence above 7701.

Previous entry: Y2LINUX 1.0 BETA 8.12 (BASELINE 108) PUBLISHED — CRASH LOOP, CODEC CLOCK, SLEEP, REPORTS. Issues #48/#49 and 16 uploaded reports (UserReports/). #49 and two more players: an M3U line with a multi-byte character across byte 8 panicked Reborn (playlists.rs:223, also playlist_index.rs lookup/percent-decode) at every SD scan → supervisor gave up (stale fbdev "glitch") → update rollback. #48: CS43131 XTAL_READY timeout on a quick reopen played silence. Fixed: Reborn 3ff346a (slicing), bc2762d (isolated()), 2db37cf (open retry); Linux 4d77820 (overlay 0030 crystal retry, per-DAI clock requests), c885c12 (system-idle notifier priority 1), d491201 (loader hold with provider active), c93fcb7 (pre-freeze refusal retried), 02ebd61/81cd4e3 (reports), f056579 (Couldn't Start, retry on SD change), dccce63 (leftover system.img). Report docs/validation/Y2-LINUX-1.0-BETA-8.12.md, audit BETA-8.12. Test build 107 (seq 7600) installed and checked on the maintainer's player; 108 (seq 7601) not installed (classifier). Owed: slow crystal, sleep with a parked CPU, Couldn't Start on a player, GC9503V recovery restarts, splash text with an SD hint, live EQ without a reopen. Next free label 109, sequence above 7601.

Previous entry: Y2LINUX 1.0 BETA 8.11 (BASELINE 106) PUBLISHED — INTERNAL STORAGE SETUP ON A LOW BATTERY. User report UserReports/y2linux-report-20261019-153610 ("internal storage is still 700 mb after multiple restarts"): setup Pending/battery_low at every start (3.54–3.59 V under boot load < 3.7 V), and Reborn said "Restart to finish setting up" for every Pending. Fixed: 25 % from BAT0 voltage_ocv via the stock profile (Linux fee6b36), Reborn shows Connect a charger and restart (f649609). Report docs/validation/Y2-LINUX-1.0-BETA-8.11.md, audit BETA-8.11. Release 1.0.0-beta.8.11, sequence 7500, Linux 9c7f079, Reborn 727fd47; not installed on a player. Open: leftover system.img when firmware is already installed (radiofw.scan returns early). Next free label 107, sequence above 7500.

Previous entry: Y2LINUX 1.0 BETA 8.10 (BASELINE 105) PUBLISHED — CHARGING FIX #47, ERROR REPORTS OVER WI-FI. Owner: "publish without it and answer the issue without it" (no wall-charger test on 105). Report docs/validation/Y2-LINUX-1.0-BETA-8.10.md, audit BETA-8.10. Release 1.0.0-beta.8.10, sequence 7400, Linux 9df5ccf, Reborn cfac12b. #47 cause: y2_charge_prepare refused any inherited CV other than selector 30/0; the reporter's PMIC held 31 (4.1875 V) → fault 0x80/-EIO on every charger. Now CV/input OVP/battery OVP are replaced by stock values and read back; only an asserted battery-OVP detector refuses; refusals named in check_*. Reply posted on #47; waiting for their confirmation. Uploads live: players are asked once; reports in R2, tools/reports/fetch.py. Owed: Cloudflare WAF rate-limit rule + R2 billing alert (owner), wall-charger check on 8.10, progress page by eye. Flaky host tests seen once each: test_error_reports queue/save (only inside the full suite). Next free label 106, sequence above 7400.

Previous entry: ERROR REPORT UPLOADER (R3 + R4) DONE ON MAIN; OWNER DEPLOYS THE WORKER NEXT. Owner chose receiver option 1 (Worker + R2, pulled home): "do all you can do also check the plan and code again", then "fix it for main directly". Done and tested on main (not released, not pushed): Worker fixes + 11 node --test tests, tools/reports/fetch.py (SigV4, AWS vectors), new_upload_key.py, deploy steps tools/reports/README.md, uploader report.upload + report work, service schedule, build step for the key, Reborn "Report sent" / "couldn't be sent". Trigger review on the owner's player found and fixed three false triggers (Wi-Fi record on every connection, -EBUSY sleep cancellations, pulled SD card I/O errors). Plan section "R3 and R4 done".

  • Owner next: deploy per tools/reports/README.md (R2 bucket + 180-day rule, KV namespace ID into

    wrangler.toml, new_upload_key.py, secrets, wrangler deploy, read-only R2 token for fetch.py).

  • Then R6: a test build (with the key file from the deploy, the build prints reports: upload key included), install

    on the owner's player (stage + apply), Send Report Now, fetch.py downloads it; one provoked trigger. R7: user guide section "Sending reports", release.

  • Beta 8.9 (label 102, sequence 7100): built, installed on the owner's player (Acknowledged; Save Report used,

    SD 509 KB), not published: main moved on, so release.py publish --label 102 refuses. The next release is a new build from main with a sequence above 7100 (the owner's player runs 7100). Next free label 103.

  • Reborn main also has the 8.9 docs commit 537e147 after the built commit 4da5f84 (publish needs Reborn HEAD

    = the built commit: for any future publish, build after the last Reborn commit).

Previous entry: Y2LINUX 1.0 BETA 8.9 (LABEL 102) BUILT, NOT PUBLISHED — SAVE REPORT WITHOUT A TOPIC. Owner: "would it not be better to just export all?" — the topic never changed a report's content, so Save Report asks only for the storage (Reborn c0c5e04). Report docs/validation/Y2-LINUX-1.0-BETA-8.9.md, audit BETA-8.9.

Previous entry: Y2LINUX 1.0 BETA 8.8 (BASELINE 101) PUBLISHED — ERROR REPORTS SAVED TO STORAGE; NEXT R3/R4. Owner: "publish the next beta with what we have currently and export to storage feature … we will do the worker afterwards". Report docs/validation/Y2-LINUX-1.0-BETA-8.8.md, audit BETA-8.8, user guide docs/ERROR-REPORTS.md, plan section "Save to storage and speed, Beta 8.8". Release 1.0.0-beta.8.8, sequence 7000, Linux be71b6d, Reborn b6b6fbc (builds 99/100 superseded, never installed). Owner's player still runs test build 98 (6952) and installs 8.8 by OTA. Reports take ≈10 s (4 workers, nice 10). No uploader: report.py UPLOAD = False hides the switch/question in Reborn; R4 sets it True. Owner wants the Worker next (receiver placement still open: Worker + R2 pulled home, or home server behind a Tunnel). #47 (no charging) was asked to save a report on 8.8. Next free label 102, sequence above 7000.

Previous entry: ERROR REPORTS — CONTINUE R3 (RECEIVER) AFTER THE OWNER PICKS WHERE IT RUNS. Plan with every decision and result: ERROR-REPORTS-PLAN (sections "R2 results", "Test build 96", "R5 screens, test builds 97–98", "R3 status and the open decision"); audit ERROR-REPORTS.

  • Owner's player: test build 98 = 1.0.0-beta.8.8, sequence 6952 (Linux d9b19cb, Reborn fbecb77),

    Acknowledged. It has y2-platform report …, About & Updates → Error Reports and the one-time question; **the owner answered Send Reports** (install ID 1A9A44E7…). Reports that trigger now wait in /data/system/platform/reports/ (max 3): there is no uploader yet. Published release stays Beta 8.7 (baseline-95, sequence 6900).

  • Open owner decision: where the receiver runs. (1) Cloudflare Worker + R2, pulled to the home server

    (recommended), or (2) the same receiver on the home server behind a Cloudflare Tunnel; (3) port forward advised against. Home server: [email protected] (key ~/.ssh/y2linux_ed25519), reviewed read-only 2026-10-18.

  • R3 drafted, untested: tools/reports/worker/src/index.js, wrangler.toml. To do: Worker tests

    (node --test, Node 24 on the PC), tools/reports/fetch.py (stdlib SigV4), tools/reports/README.md (deploy steps for the owner: R2 bucket, KV namespace, secrets UPLOAD_KEY/RATE_SALT, custom domain, 180-day lifecycle), the upload key. Then R4: uploader in report.py (urllib TLS as update.py, retry/backoff, Wi-Fi + battery rules, NetworkTransfer workload) and the periodic report check in the platform service; R6 device test; R7 release.

  • Lessons today: never inject button presses while the report question can appear (scripted presses answered it

    once on test build 97; reset); Reborn only observes the platform on platform screens (now also once 20 s after start); ctx.json reads at most 128 KiB; known-secret matching must be a prefix-tree regex. Flaky Reborn test: lastfm::tests::requests_carry_secrets_only_on_stdin_and_errors_classify (passes alone).

  • Git: everything since Beta 8.7 is local only (Linux from fdb7a90, Reborn from ef9e805), nothing pushed.

    Next free label 99, sequence above 6952. Workspace out/build, out/release-95 (published), out/release-97, out/release-98.

  • Paste-ready prompt: "Continue the error reports: read docs/planning/NEXT-SESSION-HANDOFF.md (START HERE) and

    docs/planning/ERROR-REPORTS-PLAN.md. I choose receiver option <1 or 2>. Finish R3 with tests, then R4 (uploader), then a test build for my player."

Previous entry: ERROR REPORTS — R2 + R5 ON THE OWNER'S PLAYER AS TEST BUILD 98 (1.0.0-beta.8.8, SEQ 6952, NOT PUBLISHED); THE OWNER ENABLED REPORTS; NOTHING UPLOADS YET. Owner: opt-in reporter with "everything" about the error and device, no personal data, Wi-Fi HTTPS; decisions: Cloudflare Worker

  • R2 at reports.schulzcode.dev (home server reviewed: patched/UFW/fail2ban/key-only SSH, but LAN-only NPM with no

access lists — not to be exposed), scrubbed raw logs, automatic + Send Report Now, random install ID, one-time question after the update, MAC maker kept, 180-day retention. Plan + R2 results: ERROR-REPORTS-PLAN, audit ERROR-REPORTS. Next: R3 Worker (tools/reports/worker/, owner deploys with wrangler), R4 uploader + periodic check, R5 Reborn screens, R6 device test.

Previous entry: START HERE (2026-10-18): Y2LINUX 1.0 BETA 8.7 (BASELINE 95) PUBLISHED — GC9503V IDENTIFIED FROM LK. Owner: "publish the release also so i can update from OTA". Report docs/validation/Y2-LINUX-1.0-BETA-8.7.md, audit BETA-8.7; release 1.0.0-beta.8.7, sequence 6900, Linux f7b4fb5, Reborn 82fe089. Owner installs by OTA (check: panel path unchanged, panel=st7701s or record). Replies posted on #45/#46 (test steps, LK hash, jack answer). Next free label 96, sequence above 6900.

Previous entry: #45/#46 SECOND-PLAYER INVESTIGATION — PARSER FIX COMMITTED, UNRELEASED. REA fm-lk 0x81e0af60: LK's list is [gc9503v, st7701] (0x81e3821c); the lcm= name is the first driver whose compare_id matched, else the last (st7701); the digit is a separate DCS 0x0A read. GC9503V compare (0x81e1eb60) only matches DCS 0x04 = xx 95 03/04, so lcm=0-gc9503v… (samanz's boots) is a positive GC9503V ID that boot-policy.h ignored. Fix: gc9503v with either digit, st7701 still only with lcm=1-; tests test_power_policy (mutation caught), test_power_final_27; boot.o/panel.o W=1 clean; host 805 OK; 8.1 report row corrected. GC9503V power-down stays opt-in (CONFIRMED_PANELS). Not done on purpose: "no power-down on a lag boot" — samanz's 7.10 run showed the lag clears after the first screen-off (DIS domain power cycle). Hardware comparison (owner vs samanz): identical except panel, eMMC model (FN62MB 2019 vs FNX2MB 2017, same CSD) and his 3.2.1 bootloaders (his LK hash unknown). Replies on #45/#46 drafted, not posted (owner's OK). Ships with the next release.

Previous entry: START HERE (2026-10-18): Y2LINUX 1.0 BETA 8.6 (BASELINE 94) PUBLISHED — AUDIO PLAYBACK REVIEW. Owner: "publish as a new update, once you deem this good". Report docs/validation/Y2-LINUX-1.0-BETA-8.6.md, audits AUDIO-REVIEW-8.5 and BETA-8.6; the owner's player runs test build 94 = this release (/data/ota-94 deleted). Next free label 95, sequence above 6800. Owed: battery current with a profile (USB unplugged), DAC Filter by ear, sleep with a level, the output measurements of HEADPHONE-OUTPUT.md. History of the work: Owner asked for a review of all audio playback, then "do it all", then "do the test on the player".

  • Test build 94: Linux fd32cdb, Reborn cefcc8a, release.py build --label 94 (148 s, container suite 778,

    no firmware); stage + apply over SSH (owner approved each step in /permissions), install ≈16 s, Acknowledged 6800. Pre-existing, unrelated: a Python OSError: [Errno 22] line in kmsg at ≈29 s on every boot since 8.5.

  • **Device results (buttons pressed over SSH by writing evdev records to the real input nodes — no uinput needed;

    screen via /data/system/capture/y2-screen-stream; a short Power press wakes a dark screen, Select/Back/wheel are ignored while dark):** profile list K→M has no "LICENSE-AutoEq"; profile off while playing → dsp_rise_fade 2000 ms, back on → no fade (preamp −6.1 for AirPods Pro, P1); EQ change in a held pause → pause_released; pressing the checked level → no restart; High while playing → level_raise_fade, Next 0.7 s later → fade_continued 907 ms (no jump); High = 0x30/0x1E Live High, Low = 0x10/0x1C, Master −19.5 dB, 0 xruns; hpload_measure during playback → EBUSY. No kernel warnings.

  • CPU/battery (60 s, owner's AirPods Pro profile, same song, python3 measure.py with cpufreq time_in_state):

    8.5: Reborn 17.9 % of one core (playback thread 12.0 %), CPU floor 747.5 MHz the whole time, SLIDLE/DORMANT 0, WFI entries 68 248/min. 8.6: floor 598 MHz (avg 608 MHz), Reborn ≈118 MHz-equivalent (playback ≈75 MHz vs ≥90 on 8.5, ≥16 % fewer cycles), WFI entries 30 443/min (fewer wake-ups); profile off: playback 4.6 % ≈29 MHz, so a 10-band profile still costs ≈46 MHz of the decode thread. Deep idle stays 0 during any playback (the INFRA-audio rule, see the awake-idle analysis), so D1 saves the frequency floor, not idle states. mA not measured (USB on).

  • Side effects: test playback scrobbled one song to the owner's Last.fm. Restored afterwards: track 500 at

    1:21.7 paused, volume 47 (30 during the level tests), Low, Fast, AirPods Pro, Normalize Track. /data/ota-94 (59 MB copy of the package) left on the player.

  • Not checked on the player: volume up during a fade (unit test only), DAC Filter click (listening), sleep

    with a level (USB connected), the A1 race itself (not triggerable on purpose).

  • Earlier, host stage of the same work: Audit AUDIO-REVIEW-8.5; Reborn 0b55cbb (+ docs 86b7baa), state "Unreleased —

audio playback review". Nothing was built for the player, written to it or published.

  • Kernel (0030, Linux): the level's PDN_HP check and write now run under the card's DAPM mutex (before, a

    stream starting between check and write could get OUT_FS written with the amplifier on); hpload_measure refuses an open stream and holds DAPM while measuring. tests/test_hp_level.py models the lock (mutations caught); W=1 compile in the sandbox clean; host suite 805 OK.

  • Reborn: fade carries over a reopened sink and through volume up; louder sound settings fade in

    (dsp_rise_fades); held pause released on every sound change; same Headphone Level = no restart; EQ no longer PlaybackHeavy; one FFmpeg graph thread (host −43 %/−20 % CPU, bit-identical); preamp over 44.1–384 kHz (six shipped profiles 0.1–0.4 dB lower); license file not a profile; FFI layout asserts, new loud fixture, clip test at S24/S16. 539 tests, fmt, strict Clippy.

  • Answers: OUT_FS was only ever written live through the two races above. Clip safety holds with ReplayGain,

    crossfade (tri curves sum ≤ limit), gapless (alimiter latency=1 trims/pads) and 24-bit; files below 44.1 kHz rely on the limiter (FFmpeg bypasses filters above Nyquist). Old Reborn + new kernel: 4.8 dB quieter; new Reborn + old kernel: as 8.4. A reboot with High saved plays High without a fade (by design).

  • Owed on the player (buttons, after a test build with the owner's OK): Headphone Profile shows 47 entries and no

    "LICENSE-AutoEq"; raise the level while playing, press Next within 2 s: the fade continues; volume up during the fade: no jump; profile on → off while playing: fades in; pause until held, Reset Settings at High, Play: Low; press the checked level: no restart; DAC Filter change while playing: listen for a click. Measure CPU (decode+filter threads, HD 650) and the playback current with a profile vs 8.5 (PlaybackNormal now).

  • Not done on purpose: refusing files whose preamp is far below what their filters need (the fade covers the

    jump); covering sample rates below 44.1 kHz in the preamp (would lower many profiles by up to 6 dB).

Previous entry: **START HERE (2026-10-18): Y2LINUX 1.0 BETA 8.5 (BASELINE 93) PUBLISHED — HEADPHONE LEVEL, HEADPHONE PROFILES (AUTOEQ, 47 SHIPPED), DAC FILTER, SOUND ON ONE SCREEN.** Owner: "publish it as beta 8.5". Report docs/validation/Y2-LINUX-1.0-BETA-8.5.md, audit BETA-8.5; the owner's player runs test build 93 = this release. History of the work below (first written when it was host-tested only). Owner question from an email (stock bass roll-off, "output gain switching with impedance"). Guide + measurement plan: HEADPHONE-OUTPUT; audit HP-LEVEL-EQ.

  • Code: Linux 2c59a31 (0030: ALSA HP Output Level Low/Medium/High = OUT_FS 0x10/0x20/0x30 with hv_seq's

    HV_EN, written only while PDN_HP is set (now or at the HiFi DAC PRE_PMU), HP Output Level Live, probe default Low; tests/test_hp_level.py C harness, mutation-checked; FFmpeg lowshelf highshelf; tools/audio/test_signals.py). Reborn dc66880 (Settings → Sound: Headphone Level, DAC Filter; Equalizer → Headphone Profile from EQ folders, 10 filters, clip-safe preamp; Master −19.5 dB with the control, −24 dB without; 2-s fade after a rise). Owner choice: 10 bands (AutoEQ files have 10). Host: Linux 804 OK (host-tests.sh), driver compiles W=1 in the sandbox; Reborn 529 tests, fmt, strict Clippy.

  • Facts found: DS1155F2 OUT_FS 00/01/10/11 = 0.5/1.0/1.41/1.73 Vrms; HV_EN = 1 specified for ≥ 600 Ω and

    VP ≥ 3.3 V (VGP2 in the DT is 1.8 V, so VP is wired elsewhere, probably to the battery: unknown). Stock never writes CLASS_H (runs 0x10 + 0x1E) and writes OUT_FS with the amplifier on. Y2Linux full volume was ≈0.11 Vrms (1.73 V −24 dB); stock's top step ≈0.71 Vrms. c852008 (Baseline 49) already had y2_hp/hp_gain + on-demand load measurement, unused by Reborn; the 102-Ω board offset found then may be real series resistance (output impedance), so measure it.

  • **Test build 91 = 1.0.0-beta.8.5, sequence 6750 (Linux 5de9c95, Reborn 14aad05), installed 2026-10-18 over SSH

    (stage + apply, install 16.0 s, Acknowledged).** 5de9c95 makes a resumed build rebuild FFmpeg when its options change (it never compiled the new filters before). Device results: probe default Low (HP_OUT_CTL_1 0x10, CLASS_H 0x1C; 8.4 had 0x30/0x1E); wired play: PWDN 0xA6, 0x10/0x1C, Master −19.5 dB, hp_level_live 0; High requested during playback left the registers alone, a silent stream afterwards came up at 0x30/0x1E (Live High), Low while down written at once. Runtime FFmpeg lists lowshelf/highshelf. Session-edit tests (owner granted stopping Reborn; backup /data/reborn/state/session.json.before-hp-test, restored after): High + Slow Phase Compensated + HD 650 profile → startup wrote 0x30/0x1E and PCM_FILT_OPT 0xC2, play Live High, Master −19.5, no fade (startup baseline), graph EQ=configured,preamp=-6.4dB,alimiter (−6.1 sanitized), 0 xruns/filter/decode errors. CPU on the same song: decode+filter threads 4.4 % → 11.7 % of one core with the 10-band profile (second thread = the EQ slice thread; one thread may be cheaper). Original settings back (Low, Fast, no profile), player paused. Not run: UI changes (no input injection), the fade after a chosen rise, profile scan/import screens, system sleep (USB unplugged). Test files in /media/internal/music/EQ/ (HD 650 + a broken one).

  • Test build 92 = sequence 6751 (Linux ef1619c, Reborn 770a6de), installed 2026-10-18, Acknowledged: owner

    disliked scrolling in Sound and chose layout C: Sound = Equalizer, Normalize, Gapless, Crossfade + Output card ("Level Low · Filter Fast"); the card opens Screen::Output (outputs checked + Headphone Jack group with Level and DAC Filter). Owner to try with the buttons.

  • Test build 93 = sequence 6752 (Linux 04e2dc8, Reborn b694670), Acknowledged: 47 AutoEq profiles of common

    headphones/IEMs ship in /usr/share/reborn/eq (Reborn assets/eq, pinned AutoEq 7ae0f56, MIT license in legal-info); a storage EQ file replaces a shipped one by name. Owner tested the broken-file refusal ("it works"); the test copies on Internal Storage were removed (identical to the shipped ones).

  • Owed: a test build on the player (owner's OK): amixer -c Y2Audio cget name='HP Output Level Live', regmap

    debugfs HP_OUT_CTL_1/CLASS_H per level, the 2-s fade, listening at Low (should match the old loudness), suspend and resume keep the level, a profile file from Internal Storage EQ/. Then the emailer's measurements (plan in the guide; signal in out/audio-test-signals/, or regenerate). Not decided: the release number; attaching the test signal to a release.

Previous entry: START HERE (2026-10-18): Y2LINUX 1.0 BETA 8.4 (BASELINE 90) PUBLISHED — DARK DISPLAY AFTER A RESTART. Owner: "publish, I do OTA"; report docs/validation/Y2-LINUX-1.0-BETA-8.4.md, audit BETA-8.4. The 8.3 OTA's restart from the recovery came up dark and the health check rolled the install back. Logs (out/dsi-lag-2026-10-18/, local): on the dark boot mm-clocks took no holding SMI common/larb0 (the SMI common gate was already closed at 0.36 s, before Lima), the handover logged SMI gates 1 left closed by a restart with larb0 stat=1 greq=1, and the DSI register reads lagged from the first modeset (3 power cycles useless): the leftover-gate case of POWER-FINAL-40 (watchdog restart keeps MMSYS_CG_CON0). The three lit restarts that day all took the hold. 42's restart handler (reopen SMI common/larb0 as the last step before the watchdog) was removed in 43 for a different cause; Linux 7ed664b brings it back next to 43's hold and logs `SMI common gated before Linux touched it: CG_CON0=…` when the gate is found closed at probe. Not established: why only some restarts close the gate. Candidate 1.0.0-beta.8.4, sequence 6700, Linux c339919, Reborn identity only; container suite 775 OK. Owed: after the owner's OTA, check the 8.4 boot for holding SMI common/larb0 and no SMI gates … left closed (dmesg, /data/logs/system.log), and the install timings; later restarts the same.

Previous entry: START HERE (2026-10-18): Y2LINUX 1.0 BETA 8.3 (BASELINE 89) PUBLISHED — SECONDS LEFT ON THE UPDATE SCREENS. Owner: "build the latest and publish, but don't update the player, I want to do that with OTA" and "more precise time to finish". Release 1.0.0-beta.8.3, sequence 6600, Linux 029d93e (+ docs), Reborn 03e6dff; report docs/validation/Y2-LINUX-1.0-BETA-8.3.md, audit BETA-8.3. Time plan in tools/update/core.c (plan_add, plan_left, models per MiB from the owner's player), "<percent> <step> <s>" progress lines, tools/update/recovery-ui.c countdown, Reborn check-step seconds. Also 9c7dae7 (kept root hashed during verify, phase timings in the journal). Player state: 6500 after the 8.2 rollback test, current/ = 6501 (dropped at the next queue). Owed: the owner's own OTA to 8.3 (live backup expected, about 24 s), then read timings from y2-platform update status; a later update for the kept path with the parallel hashing.

Previous entry: START HERE (2026-10-18): Y2LINUX 1.0 BETA 8.2 (BASELINE 88) PUBLISHED — FASTER UPDATES (OTA-50). Owner: "can you give me the best solution, so multicore, the other stuff?" and chose to keep the verified package as the rollback copy. Release 1.0.0-beta.8.2, sequence 6501, Linux 1d463f6 (+ docs; code in f9c1eae), Reborn 5aad5f1; report docs/validation/Y2-LINUX-1.0-BETA-8.2.md, audit BETA-8.2, contract in docs/architecture/platform-ota-v2.md. Segmented root gzip (index in the signed manifest), four-thread decode / backup / readback in tools/update/core.c, kept package /data/updates/current/. Owner's player: installer 53.5 → 23.6 s (live backup, test build 87 = 6500) → 14.9 s (kept package, 6501), both acknowledged. Owed: on-device rollback from a kept package (host-tested; going back needs a higher build afterwards), why verify took 3.2 s once. tests.test_platform_update is not in the release gate: run it on the host (TSan/ASan via Y2_UPDATE_TEST_CC). Still owed from 8.1: the overnight drain (#42), the GC9503V test (#45).

Previous entry: START HERE (2026-10-18): Y2LINUX 1.0 BETA 8.1 (BASELINE 86) PUBLISHED — PANEL POWER-DOWN (#45), TWO PANEL TYPES. Release 1.0.0-beta.8.1, sequence 6463, Linux 78220dc (+ docs), Reborn a558870; report docs/validation/Y2-LINUX-1.0-BETA-8.1.md, audit BETA-8.1. The owner's player has the ST7701S panel (LK and the stock 0xA1 ID read); the GC9503V path is opt-in until the #45 reporter confirms it. Baselines 76–85 were test builds (6450–6462). Owed: one overnight sleep on battery for the drain (#42); the reporter's GC9503V test. Lessons: test builds 6451 (GC9503V commands on an ST7701S: white stripes) and 6452 (stale object after a revert, fixed in tools/build/run.py). A rollback restores the previous install, not the last published release. Update-speed idea (owner asked): the installer's backup step takes 31 of 53 s; keep the verified package as the rollback copy, or compress on four cores.

Previous entry: START HERE (2026-10-18): Y2LINUX 1.0 BETA 8.0 (BASELINE 75) PUBLISHED — 1.0 REVIEW FIXES. Owner: "fix it all and publish a new release beta 8.0". Release 1.0.0-beta.8.0, sequence 6400, Linux 662ff11 (+ docs), Reborn 1b3a5c1, report docs/validation/Y2-LINUX-1.0-BETA-8.0.md, audit BETA-8.0. Installed on the owner's player by OTA and acknowledged; the broken-song case (B3) checked on the device. The review itself: V1-RELEASE-READINESS, V1-CODE-REVIEW (top notes say what is fixed).

  • Code: Reborn d11563b (unreadable songs counted, kept, no incomplete scan; healthy in rebornctl status;

    session quarantine + settings recovery), 1a3afc2 (audio profile matcher). Linux e361b8b (health uses healthy), 3bc6abb (reconcile in the background, common.kill_tree), ca119ff (mode-1 fallback stops the engine first, y2_hsdma_stop in 0055), ebc164e (stuck recovery powers off after 10 min on battery), f261044 (Y2MEDIA noinit_itable, mkfs nodiscard), 9c45e5c/662ff11 (toolchain sources asset, `tools/production/ toolchain_sources.py, cached in.cache/downloads/toolchain-sources/),a90ba0c` (INSTALL.md in the packages, docs).

  • Owed on the device: an MTP copy (the player was in developer USB mode), a large/slow SD card (B5), cable pull /

    sleep / Windows (A8), and everything A1, A2, A9–A11 in the readiness file.

  • Owner decisions still open: A10 headphone detection (PR #11/#12), A14/R3 debug tools and panic=0, A16 skin

    names, A18 open PRs. Not done on purpose: R1 (big-file split), A6 ("Beta" wording waits for the 1.0 label).

  • Release mechanics: next free label 76, sequence above 6400. FM (beta8-fm) needs a rebase and a new beta number.

    Workspace out/build, out/release-74, out/release-75.

Previous entry: START HERE (2026-10-17): Y2LINUX 1.0 BETA 7.11 (BASELINE 74) PUBLISHED — FASTER COPIES TO THE PLAYER. Owner: "Dolphin copies work, publish it as beta 7.11". Release 1.0.0-beta.7.11, sequence 6352, Linux 9c3e4f1 (+ docs), Reborn 814cd14, report docs/validation/Y2-LINUX-1.0-BETA-7.11.md, audit BETA-7.11. The owner's player already runs exactly this build (installed locally as the 6352 test build). Uploads 29.6 MB/s Internal, 23.3 MB/s SD. Still owed (owner): cable pulled mid-copy, sleep/wake, Windows Explorer. Next free label 75, sequence above 6352. Workspace out/build, out/release-73, out/release-74. Open from before: automatic restart after an update when the storage setup waits; restore the skins backup; FM radio on beta8-fm (rebase, sequence above 6352).

Previous entry: **START HERE (2026-10-17 evening): FAST UPLOADS WORK — MULTI-PACKET RECEIVE DMA ON BY DEFAULT IN TEST BUILD 7.11 (SEQUENCE 6352), INSTALLED ON THE OWNER'S PLAYER, NOT PUBLISHED.** Plan + results: USB-RX-DMA-MODE1-PLAN; audit row USB-RX-DMA (update section).

  • Result: uploads 1 GiB Internal 29.6 MB/s (was ≈10), SD 23.3 MB/s, ECM 10–14 MB/s; ≈1 450 musb IRQ/s instead of

    ≈22 000; every byte hashed, libmtp suite 26/26, boundary/random sizes on both storages, no fallback or DMA error.

  • Code: Linux 1f86b4f (mode 1 behind rx_dma=2), b49afaa (two-sample short-packet rule: RXCOUNT falls while

    the engine unloads a packet; one sample cut an upload in build 6350), 049df5c (off = PIO, never mode 0), 10ec3eb (default on), 64af1b2 (mtpbench ZLP fix), 8942946 (host test stubs). Identity commits 8aa868c, 7b9941f, 9c3e4f1 (1.0.0-beta.7.11, sequences 6350 → 6351 → 6352); Reborn 814cd14 (identity only).

  • Build/install: out/release-74 = sequence 6352 (built with release.py build --label 74, nothing pushed or

    tagged). Installed by scp out/release-74/ota/* → /data/ota-74, y2-platform update stage --package /data/ota-74, y2-platform update apply (restart, recovery installs, ≈75 s). The player was in PendingHealth 6352 right after.

  • Switches (/sys/devices/platform/11200000.usb/): rx_dma 0 PIO / 1 mode 0 / 2 multi-packet (default),

    rx_dma_eps (default 0xfffe; MTP OUT = ep1, ECM = ep3), rxdiag counters m1_prog/m1_end/m1_kick/m1_fallback (healthy: m1_prog = dma_done + m1_end, kick and fallback 0).

  • Owed by the owner before release: cable pulled mid-upload; sleep and wake with it on (sleep only unplugged);

    Dolphin copies (end kiod6 before mtpbench runs); Windows Explorer if available. Then: release notes + report docs/validation/Y2-LINUX-1.0-BETA-7.11.md, readme/state/catalog, release.py publish --label 74 (needs a fresh build if anything changes; next free label after that 75, sequence above 6352).

  • Test tooling notes: the Bash tool does not word-split variables, use a wrapper script for ssh options. A

    device-side guard must use /proc/uptime, not date (the clock steps after boot and fired a wall-clock guard twice). mtpbench storages can segfault on junk after a desynced session; restart the player to recover MTP.

  • Still open from before: automatic restart after an update when the storage setup waits; restore the owner's

    skins backup; FM radio on beta8-fm.

Previous entry: START HERE (2026-10-17, for the next session): FASTER UPLOADS — MULTI-PACKET (MODE 1) RECEIVE DMA. Owner: "i would like to do multi packet and fix the kernel instead" and continue in a fresh session. Plan USB-RX-DMA-MODE1-PLAN, audit row USB-RX-DMA (commit 39cb314). **Plan written, not yet approved in detail, nothing built.**

  • Released state: Y2Linux 1.0 Beta 7.10 (Baseline 73, sequence 6300, tag baseline-73, Linux 72a565d + docs, Reborn

    511dbf0 + docs) is GitHub latest and installed on the owner's player (confirmed 2026-10-17 00:40). 7.10 = musb zero-length-packet oops fix (da0917d, kernel/patches/0065-y2-musb-pio-progress.patch) + MoveObject/CopyObject (4c0a54d, buildroot/package/y2-mtp/0004-y2-mtp-move-and-copy-objects.patch, y2_copy_file in tools/usb/mtp-safe.c). tools/usb/mtp-file-ops.c (libmtp) passed all 26 steps on the player. 7.9's automatic Internal Storage passed on the player (509 kept files hash-identical). User guide for storage: docs/STORAGE.md.

  • Measured (owner's player, 7.10, tools/usb/mtpbench.c, libusb, SHA-256): download 37.7 MB/s (TX DMA), upload

    8.7–10.3 MB/s on Internal Storage and SD. /sys/devices/platform/11200000.usb/status: dma_rx_programs=0, pio_rx_bytes>0 → every received packet is PIO. Upload CPU: the musb IRQ (213) core is 96–100 % busy at ≈21–24 k IRQ/s whichever core it runs on (live affinity test on CPU3, restored to f); ≈45 µs CPU per 512-byte packet = the ceiling. Storage write ceilings (candidate 11): eMMC 30 MiB/s, SD 26 MiB/s. Double-buffered FIFOs and ioread32_rep are already in place.

  • Why RX DMA is off: kernel/platform/usb.c y2_dma_is_compatible() keeps bulk-OUT unmapped unless sysfs rx_dma=1

    (mode 0: two IRQs per packet, CPU-FIX02 storm guard, a lost ACKed packet after an IN completion within µs; FIX03 corrected the guard). Upstream mode 1 lives in rxstate() (patched overlay .cache/overlays/647766a6…, ≈lines 547–820) only for short_not_ok (mass storage): MTP needs short-packet/ZLP termination (abort channel, read moved bytes, PIO the short packet, give back the exact length).

  • First steps: (1) REA on the stock kernel out/rea/fm-kernel.elf (local, not in git): how MediaTek's musb driver

    programmed RX DMA on this controller (mode, RXCSR/DMAREQ sequence, short-packet handling, errata). (2) Read drivers/usb/musb/musbhsdma.c (+ overlay 0055) and musb_g_rx() for the DMA-busy/short-packet interrupt path. (3) Implement mode 1 behind rx_dma=2, default off, keeping the receive event ring/counters; zero-fuzz overlay patch + manifest hash (see how 0065 was regenerated with diff -u from .cache/sources/linux-6.18). (4) Release with the switch off, owner installs, live A/B echo 2 > /sys/devices/platform/11200000.usb/rx_dma (a runtime write the owner must authorise), run the device tests of the plan, then default on in a later release.

  • Measuring: `cc -O2 -Wall -o /tmp/mtpbench tools/usb/mtpbench.c -lusb-1.0 -lcrypto && /tmp/mtpbench -s 0xffff0001 up

    64 x.bin(SD0xffff0002; theclean` command in its usage text does not exist — it deletes its own files). Functional suite: cc -O2 -Wall -o /tmp/ops tools/usb/mtp-file-ops.c -lmtp && /tmp/ops. The owner uses KDE Dolphin: kiod6 holds the MTP interface while Dolphin has the player open — ask the owner, then end kiod6 (it restarts on demand).

  • Player state: Internal Storage = Old Player Files (509 old stock files, the owner may delete them over USB now);

    the owner's 138 skin files from the old Internal Storage are NOT restored yet (backup out/deep-sleep-final/evidence/20261016/internal-storage-backup-before-stock-test/internal-music.tar, copy on /media/sd/.y2-backup-20261016/). pstore still holds the 7.9 oops record.

  • Open owner decisions: automatic restart right after an update when the storage setup waits (recommended, not

    built); restore the skins; GitHub #39 and #44 were closed 2026-10-17 with explanations. Cleanup idea: the eMMC write guard refuses ext4's WRITE_ZEROES inside p8 (mmc_erase: group start error -30 at start, harmless). FM radio stays on beta8-fm (device test owed; rebase onto main and use a sequence above 6300).

  • Release mechanics: next free label 74, sequence above 6300; workspace out/build, out/release-72,

    out/release-73; release.py bump/build/publish with GIT_AUTHOR_*/GIT_COMMITTER_* env (Luca, no attribution).

  • Paste-ready prompt: "Continue with faster USB uploads: read docs/planning/NEXT-SESSION-HANDOFF.md (START HERE),

    AGENTS.md and docs/planning/USB-RX-DMA-MODE1-PLAN.md. Start with the REA analysis of how the stock MediaTek kernel drives musb receive DMA, then implement multi-packet (mode 1) receive DMA behind the rx_dma=2 switch, default off. Do not publish or write to the player without asking me."

Previous entry: START HERE (2026-10-17, latest): Y2LINUX 1.0 BETA 7.10 (BASELINE 73) — USB FILE OPERATIONS. Release 1.0.0-beta.7.10, sequence 6300, Linux 72a565d (code da0917d musb ZLP fix, 4c0a54d MoveObject/CopyObject + tool), Reborn 511dbf0, report docs/validation/Y2-LINUX-1.0-BETA-7.10.md, audit BETA-7.10. 7.9's automatic Internal Storage PASSED on the owner's player (509 kept files hash-identical). Next: owner installs 7.10, then run cc -O2 -Wall -o /tmp/ops tools/usb/mtp-file-ops.c -lmtp && /tmp/ops with the player connected (MTP); then Windows Explorer / macOS app checks by the owner. Owner still to decide: automatic restart after an update when the storage setup waits; restore the skins backup (out/deep-sleep-final/evidence/20261016/internal-storage-backup-before-stock-test). Next free label 74, sequence above 6300.

Previous entry: **START HERE (2026-10-17, latest): Y2LINUX 1.0 BETA 7.9 (BASELINE 72) PUBLISHED — INTERNAL STORAGE FOR EVERY PLAYER, #39, #44.** Release 1.0.0-beta.7.9, sequence 6250, Linux 2ac6abd (code 5d2801c, 3110f3a), Reborn 926ef45 (code 93be94f, b023daf), report docs/validation/Y2-LINUX-1.0-BETA-7.9.md, audits STORAGE-SETUP and BETA-7.9, plan docs/planning/INTERNAL-STORAGE-SETUP-PLAN.md. Owner's player is prepared for the device test: p8 is the stock FAT again (serial 3F93-07E6, 512 files from the 2026-10-10 backup, hash-identical); the old Internal Storage skins (138 files) are backed up in out/deep-sleep-final/evidence/20261016/internal-storage-backup-before-stock-test/internal-music.tar and /media/sd/.y2-backup-20261016/. Next: owner installs 7.9 over the air, restarts once after it is confirmed → case 2 must run (check /run/y2/internal-media-setup.json, Y2MEDIA identical, Old Player Files = backup hashes), then copy the skins back into /media/internal/music/Themes. Next free label 73, sequence above 6250. Workspace out/build, out/release-71, out/release-72.

Previous entry: START HERE (2026-10-16, latest): Y2LINUX 1.0 BETA 7.8 (BASELINE 71) PUBLISHED — LAST.FM FIXES. Release 1.0.0-beta.7.8, sequence 6200, Linux 21d5ba0, Reborn 35a3d56 (fixes e417ecb log subsystems, 8bd1452 Now Playing after pause/repeat/failure, error-6 split, clock gate, one sign-in), report docs/validation/Y2-LINUX-1.0-BETA-7.8.md, audit BETA-7.8. Device checks owed after the owner's OTA install: Now Playing after a pause; offline play sent after sleep with USB unplugged; Last.fm events in the log. Next free label 72, sequence above 6200 (FM on beta8-fm must rebase; its fm.1 output out/release-68 was pruned by this build). Workspace: out/build, out/release-70, out/release-71. Unreleased on main since 7.8: issue #44 (SD card pulled while mounted never mounted again): Linux 3110f3a (media.read_only_check/fat_unclean_only: a failed fsck.fat -n whose only findings are the dirty bit and the boot backup difference at offset 37/65 is admitted; still no repair; failed-run output not kept; observe.refused_card reports a refused, still-inserted card as Degraded/filesystem_check_failed), Reborn b023daf (SdCard::NeedsRepair, "Needs repair · Check it on a computer"). exFAT (fsck ignores the dirty flag in -n) and ext4 (journal keeps VALID_FS) were never affected. Open owner decision: an explicit Repair action on Settings → Storage (fsck.fat -a, writes to the card).

Previous entry: START HERE (2026-10-16, latest): Y2LINUX 1.0 BETA 7.7 (BASELINE 70) PUBLISHED — LAST.FM SCROBBLING. Release 1.0.0-beta.7.7, sequence 6150, Linux bcb7815, Reborn f117586, report docs/validation/Y2-LINUX-1.0-BETA-7.7.md, audit BETA-7.7. Device checks owed after the owner's OTA install: QR sign-in, a real scrobble and Now Playing, an offline play sent after sleep and Wi-Fi; 7.6 update fps on this download. Next free label 71, sequence above 6150 (FM on beta8-fm must rebase and use a sequence above the newest published one). Key file: ~/.local/share/y2linux/lastfm-api.json. Device result (owner's OTA install): QR sign-in and the first real scrobble worked (account confirmed on last.fm); Now Playing vanished after a pause (sent only once per song). Fixed on Reborn main, not released (candidate 7.7.1): e417ecb (radio/clock/platform/lastfm/scrobble events were dropped by the log allowlist; guard test), 8bd1452 (Now Playing again after a pause/repeat/failed attempt, ≤ every 30 s; a play Last.fm refuses with error 6 no longer blocks the queue; sign-in and Now Playing wait for a trusted clock; one sign-in request at a time). Still owed: the offline test (Wi-Fi off, play past half, sleep unplugged — the charger refuses sleep — wake, Wi-Fi on, play appears).

Previous entry: (2026-10-16) LAST.FM SCROBBLING ON main — PHASES 1–3 BUILT, KEY + DEVICE TEST OWED. Owner: ship scrobbling separately from FM; FM stays on branch beta8-fm (implemented there, device test owed — see that branch's handoff). Plan/security: LASTFM-SCROBBLE-PLAN, audits LASTFM. Reborn main 60bea96 (rules, queue, .scrobbler.log, Last.fm client, Settings → Last.fm with QR sign-in), Y2Linux adfb5c9 (key file into images, privacy). Next: owner puts ~/.local/share/y2linux/lastfm-api.json (0600, api_key + shared_secret); bump a version above 6100 on main (FM's test sequences 6110/6120 were never installed), build, owner installs, sign in by QR, play past half a song, check last.fm, offline queue across sleep; then release on the owner's word.

Previous entry: (2026-10-16 night) BETA 8 = FM RADIO — KICKOFF FOR A FRESH SESSION (owner: "lets start with fm radio for beta 8 but with a new fresh session"). Nothing for FM is built, planned in detail or authorised on hardware yet. The released state is Beta 7.6 (entry below).

  • Rule first (AGENTS.md): FM is a new hardware subsystem and opens the Beta 8 milestone, so the first deliverable is the roadmap/gap audit (standing procedure) with real hardware evidence, written as a BETA-8-FM audit row plus a plan; no build, flash or tuner power-up before the owner agrees to the plan. Device access over USB SSH ([email protected], key ~/.ssh/y2linux_ed25519, HostKeyAlias y2linux-production-v1) is read-only unless the owner OKs an experiment; the owner presses the buttons.
  • What is known (Android-era evidence, ../Y2Player/docs/FM_RADIO_FEASIBILITY.md, 2026-08-01…03): the tuner is the MT6627 FM core in the CONSYS combo (chip id 0x6627), reached on stock Android through /dev/fm (MediaTek fmradio driver; vendor call sequence opendev, powerup, tune, setmute, switchAntenna, autoscan, powerdown). It opened, tuned and played on headphones, audio only via the HAL's indirect path (FM → I2S → AFE → DAC; the direct analog path was silent). Reception was the problem: the headphone cable is the aerial and the owner's unit received essentially nothing; register 0x61 bit 4 (antenna type) stays at the long-aerial default. §9 of that document lists the controls still owed (correct band sweep, cable/no-cable comparison, stock FM app as control, Y1/Y2 driver comparison).
  • Firmware: mt6627_fm_v1_patch.bin, mt6627_fm_v1_coeff.bin (/etc/firmware/mt6627/) and /etc/fmr/mt6627_fm_cust.cfg come from the owner's Innioasis system.img, like the Wi-Fi/Bluetooth firmware: never in our images; extend tools/platform/y2_platform/radiofw.py (Firmware drive install) to take them.
  • Where it lands in Y2Linux: our own connectivity driver kernel/platform/connectivity/ (WMT wmt.c, STP stp.c, BTIF, firmware loader) has Wi-Fi and Bluetooth but no FM function yet; FM needs the WMT FM function-on, its STP channel and a tuner driver (donor reference: community kernel drivers/misc/mediatek-consys/fmradio, commit 5a0058fb; the stock kernel ELF out/rea/fm-kernel.elf (local, not in git) contains the vendor FM driver: mt6627_PowerUp, mt6627_DspPatch, mt6627_i2s_info_get, fm_powerup, fm_tune_new, fm_ana_switch, 111 such strings, the reference for the exact register sequence). Audio: the AFE/I2S input path in kernel/audio/ and the platform's audio policy. Reborn: a source next to internet radio (reborn_platform::radio, screens Radio/RadioStations), hidden where a scan finds nothing (owner decision 2026-10-15: the menu stays hidden on players without reception).
  • Owner decisions already made: FM menu hidden when no station is found; internet radio stays as is. Open for the plan: band/region (87.5–108 MHz, 100 kHz steps vs 50 kHz), RDS, presets, behaviour with Bluetooth output (FM audio is wired-only on stock), sleep while FM plays.
  • Paste-ready prompt for the fresh session: "Start Beta 8: FM radio. Read docs/planning/NEXT-SESSION-HANDOFF.md (START HERE), AGENTS.md and ../Y2Player/docs/FM_RADIO_FEASIBILITY.md. First do the milestone gap audit for FM with real hardware evidence (read-only on the device), then propose a phased plan (kernel FM function over WMT/STP, firmware from system.img, audio path, platform API, Reborn UI) with the open owner decisions. Do not build, flash or power the tuner until I agree."

Previous entry: (2026-10-16 night) Y2LINUX 1.0 BETA 7.6 (BASELINE 67) IS THE LATEST PUBLISHED RELEASE. Release 1.0.0-beta.7.6, label 67, sequence 6100, Linux 58de7d8 (+ docs 8a529cb), Reborn 36e6994 (+ docs), tag baseline-67 in both repositories, GitHub release latest. Report docs/validation/Y2-LINUX-1.0-BETA-7.6.md; audit row BETA-7.6.

  • What the 7.x line changed (all Reborn): 7 UI v4 + CPU thermal after sleep + sleep retry; 7.1 one-step Update Now, automatic time zone; 7.2 motion at 60 fps and the Now Playing wave; 7.3 USB message + status-bar symbol (no computer screen); 7.4 messages as a pill in the status bar, wave without the CPU lease; 7.5 larger status bar (name beside the back arrow, Title Case), Home header "Reborn ", Settings → Skin (Skins folders, Themes still read), About without Music Library; 7.6 update download/check at the full frame rate (were ≤ 29 fps, Ui::download_shown in gliding()), Download · Check · Install tracker.
  • Device checks owed (owner installs over the air; owner presses buttons, SSH [email protected] only for reading): (1) 7.5 look on the panel: status bar with Wi-Fi, Bluetooth, USB and charging at once, Home header, messages, Settings → Skin; (2) 7.6 update screens appear on the update after 7.6: sample rebornctl metrics (graphics_frames) during that download; (3) 7.4 Now Playing on battery: cpufreq time_in_state (598 MHz expected), CPU/PMIC temperature over ten minutes; (4) Songs list scroll fps (7.2); (5) 7.1 USB/update/time zone, 7 thermal zone after a night, Power-sleep right after a wake.
  • Known gaps: sleep ≈7.8 mA vs stock 1.3 mA; no wired-headphone detection; 12/24-hour clock follows the zone; light skins remap the update bar's highlight into a dark smudge. FM radio = Beta 8 (own audit first; evidence ../Y2Player/docs/FM_RADIO_FEASIBILITY.md).
  • Release mechanics: docs/BUILDING.md §7 (release.py bump/build/publish, GIT_AUTHOR_*/GIT_COMMITTER_* env, no model attribution; never edit the tree while build runs). Workspace out/build, out/release-66, out/release-67; next free label 68, sequence above 6100.

Previous entry: (2026-10-16 night) Y2LINUX 1.0 BETA 7.5 (BASELINE 66) PUBLISHED — LARGER STATUS BAR, HOME HEADER, SKIN IN SETTINGS. Release 1.0.0-beta.7.5, label 66, sequence 6050, Linux 2ec56d2 (+ docs), Reborn 0291d69 (+ docs). Owner chose status bar layout C (name beside the back arrow, Title Case); Theme → Settings → Skin (Skins folders, Themes still read); About's Music Library row removed. Next: device look at the bar/Home header/messages, then the 7.4 Now Playing battery check and Songs scroll sample. Workspace: out/build, out/release-65, out/release-66; next free label 67, sequence above 6050. FM radio = Beta 8.

Previous entry: (2026-10-16 night) Y2LINUX 1.0 BETA 7.4 (BASELINE 65) PUBLISHED — STATUS-BAR MESSAGES, WAVE WITHOUT CPU LEASE. Release 1.0.0-beta.7.4, label 65, sequence 6000, Linux d909231 (+ docs), Reborn 8c0f8c4 (+ docs). Motion measured on 7.3 (archive 20261016/157-beta73-fps-sample): 62 fps median, 0 missed, 0 fps at rest. Next: Now Playing on battery (cpufreq time_in_state, CPU/PMIC temperature, fps), Songs list scroll sample. Workspace: out/build, out/release-64, out/release-65; next free label 66, sequence above 6000. FM radio = Beta 8.

Previous entry: (2026-10-16 night) Y2LINUX 1.0 BETA 7.3 (BASELINE 64) PUBLISHED — USB MESSAGE AND SYMBOL INSTEAD OF A SCREEN. Release 1.0.0-beta.7.3, label 64, sequence 5950, Linux cbab171 (+ docs), Reborn 7175c76 (+ docs). The 7.1 lock and its developer switch are gone (owner). Next: the Beta 7.2 frame-rate sample over SSH (scratchpad sampler idea: poll rebornctl metrics + status every 0.5 s; graphics_frames delta, graphics_frame_time_ms, current_screen). Workspace: out/build, out/release-63, out/release-64; next free label 65, sequence above 5950.

Previous entry: (2026-10-16 night) Y2LINUX 1.0 BETA 7.2 (BASELINE 63) PUBLISHED — MOTION AT 60 FPS AND THE NOW PLAYING WAVE. Release 1.0.0-beta.7.2, label 63, sequence 5900, Linux 78b548b (+ docs), Reborn 846da2d (+ docs). Report docs/validation/Y2-LINUX-1.0-BETA-7.2.md. Motion: crates/reborn-ui/src/motion.rs, canvas::Moving, Ui::slide_screens, components::wave_progress; reborn-preview --motion. First thing: sample fps on the device (control socket metrics, graphics_frames) for lists, slides and Now Playing; then the 7.1/7 checks. Workspace: out/build, out/release-62, out/release-63; next free label 64, sequence above 5900. FM radio = Beta 8.

Previous entry: (2026-10-16 night) Y2LINUX 1.0 BETA 7.1 (BASELINE 62) PUBLISHED — ONE-STEP UPDATE, USB SCREEN AT ONCE AND LOCKED, AUTOMATIC TIME ZONE. Release 1.0.0-beta.7.1, label 62, sequence 5850, Linux e9427a9 (+ docs), Reborn 81a907e (+ docs). Report docs/validation/Y2-LINUX-1.0-BETA-7.1.md (causes, decisions, device checks), audit BETA-7.1. Device checks owed: USB screen within ~1 s on Home/Now Playing and not leavable (service page "Use While Connected" for SSH screen capture!), Check for Updates answer at once, Time Zone Automatic (clock/zone_found in the Reborn log), plus Beta 7's. The first real one-step run needs the next release. Workspace: out/build, out/release-61, out/release-62; next free label 63, sequence above 5850. FM radio = Beta 8.

Previous entry: (2026-10-16 evening) Y2LINUX 1.0 BETA 7 (BASELINE 61) PUBLISHED — UI V4 + CPU THERMAL AFTER SLEEP + SLEEP RETRY. GitHub release baseline-61 (latest), both repos pushed and tagged; Reborn docs added after publishing. The publish lines below are done.

  • Release 1.0.0-beta.7, label 61, sequence 5800, Linux 7c0ee9f (+ docs), Reborn 7ade64b; out/release-61 (container suite 743 OK, no firmware, OTA signed). Report docs/validation/Y2-LINUX-1.0-BETA-7.md (hashes), audits UI-V4 and BETA-7. Release notes ready: out/release-61/release-notes.md.
  • Publish (owner's word first): python3 tools/production/release.py publish --label 61 --title "Y2Linux 1.0 Beta 7" --notes out/release-61/release-notes.md --yes with the GIT_AUTHOR_*/GIT_COMMITTER_* environment (Luca, noreply). Then set the report's status to PUBLISHED and add Reborn's readme/CURRENT_REBORN_STATE entry for 1.0.0-beta.7 (Reborn docs go in after publishing: publish needs Reborn's HEAD = 7ade64b).
  • After the owner's OTA install: UI v4 phase 4 device tour with screen capture (owner presses buttons), thermal_zone1 enabled after a night, Power-sleep right after a wake. FM radio is Beta 8.
  • Workspace: out/build, out/release-60, out/release-61. Next free: label 62, sequence above 5800. Lesson: never edit the tree while release.py build runs (packaging checks a clean tree at the end).

Previous entry: (2026-10-16 afternoon) UNRELEASED WORK ON TOP OF BETA 6.3 — UI V4 ACTIVE, PHASES 1–3 DONE; TWO PLATFORM FIXES. NO BUILD UNTIL ALL UI PHASES ARE DONE (owner).

  • Overnight drain of 6.3 (archive out/deep-sleep-final/evidence/20261016/156-beta63-overnight-drain): ≈7.8 mA, 14 h asleep, all SPM/INFRA/PMIC counters clean.
  • Fix 1, CPU thermal zone dead after the first sleep: kernel/platform/thermal.c programmed the 1100b000 monitor only in probe; INFRA power-down wipes it (monitor/period/filter/poll read 0), y2_soc_temp returned -ENODATA and the thermal core disabled cpu-thermal (trips 110/120 °C). Seen in archives 124/125/155/156. Now y2_thermal_init runs again in y2_thermal_resume when the monitor is off. Compiles against out/build (W=1); device check owed: /sys/class/thermal/thermal_zone1/mode stays enabled with a temperature after a night.
  • Fix 2, Power sleep refused wake_event_in_progress (10:31 in archive 156; Beta 1's 06:38 self-wake): a BAT0 notification during preparation invalidated the wakeup count. product_sleep.py now takes a fresh count up to STALE_COUNT_RETRIES (2) times; the Power/RTC IRQ and cable checks run again each pass, so real wakes still cancel. 3 new tests; host suite 770 OK.
  • UI v4 (plan, decisions and Phase 1 record: Reborn docs/ui/REBORN-PRODUCT-UI-V4.md; audit row UI-V4): Phase 1: fixed accent outside Now Playing, one focus row, one button, one empty state, LIVE only. Phase 2: Home = Now Playing, Music, Playlists, Radio, Search, Settings; Music menu with counts; Display → Home Menu pins (Settings::home_pins); skins needed no new layout. Phase 3: hint lines gone (hold menus already name the actions), Now Playing label/gapless icon/radio tags gone, lists trimmed (stations "Country · Genre", devices Connected/Paired, networks Saved/Secured/Open), theme swatches, Storage/About cleanup ("1.0 Beta 6.3"), American spelling. 479 tests, strict Clippy; host previews only. **Next: Phase 4 (previews of every skin, device walk-through with screen capture). FM radio (Beta 7) follows UI v4.
  • Nothing of this is committed yet unless a later entry says so. Beta 6.x device checks below still stand.

Previous entry: (handoff written 2026-10-16 00:53 local): Y2LINUX 1.0 BETA 6.2 (BASELINE 59) IS SUPERSEDED: BETA 6.3 (BASELINE 60) IS THE LATEST PUBLISHED RELEASE. Beta 6.3 = 6.2 + one Reborn fix: Power while paused was refused ("finishing another task", activity_operation:<reborn pid>) because the held pause's sink keeps the platform's activity lease; a sleep request now releases the hold first (release_hold_with(true)), refusals are logged (power/sleep_refused). Release 1.0.0-beta.6.3, tag baseline-60, sequence 5750, Linux b20404c + docs, Reborn b18d98c; report docs/validation/Y2-LINUX-1.0-BETA-6.3.md, audit BETA-6.3. Everything below about 6.2 still applies; all of it is pushed.

Released on 2026-10-15/16 (all public, OTA): Beta 4 (53) internet radio → 4.1 (54) radio hang, Wi-Fi after wake, TLS clock → 5 (55) keyboard, search, UI pass → 5.1 (56) live search, Radio section → 6 (57) playlists, pause in place, seeking → 6.1 (58) Bluetooth resume (drain), skipping while a song starts, SD duplicates (#15, PR #14), review fixes → 6.2 (59) clock (PR #10), every skin updated for the newer screens, Bunny Bow skin. The owner installed Beta 6; whether 6.1/6.2 are installed is not yet known.

First thing tomorrow — device checks (ask the owner to install 6.2 if not done; device access is read-only for us, writes and experiments need the owner's go):

  1. Beta 6.3: on battery, pause and press Power within a few seconds → the player sleeps; wake, Play continues at the same place (log: pause_released for_sleep: true).
  2. AirPods: Pause, wait, Play → sound returns (6.1 drain path; Beta 6 was silent). Log: /data/reborn/logs/reborn-current.jsonl (alsa pause events should show device_pause: false for bluealsa:).
  3. Next/Previous right after starting a song (Bluetooth): no "Couldn't complete that"; Play/Pause during a start pauses on the chosen song.
  4. Settings → Display → Time Zone (Berlin) → clock in Reborn's look and in two or three skins; 12/24 h follows the zone.
  5. Theme → Bunny Bow: Home (cloud clock, bunny), Now Playing, lists, keyboard, a radio station (LIVE, logo, song), Station Info; skin load time in the log.
  6. Any skin: radio Now Playing shows LIVE/logo/song (not "1 of 1"); Favorites heart on Now Playing.
  7. Library has no second copy of SD songs after a scan (owner's DB only had 2 such rows of another card: they correctly stay).
  8. Still open from earlier betas: radio after sleep/Wi-Fi wake (4.1), live search and radio logos (5.1), playlists on the device (6), AAC by ear.

Backlog on GitHub (not yet analysed): Y2Reborn PRs by samanz #11 (headphone correction from AutoEq profiles on the SD card), #12 (Settings > Sound > Measure headphones), #13 (spinners at the panel's rate) — review like #10/#14 (merge with --no-ff to keep the author; check against 0e14a3e-era helpers). Y2Linux issues #39 (Firmware drive: a system.img larger than Y2DATA's free space fails silently), #40 (artist tags not displayed properly), #41 (browse by Album Artist), #42 (second Y2 drains ≈35–39 mA overnight with every sleep feature armed). Owner-parked: station logos as a Cover Flow for radio favorites; a 12/24-hour switch.

Next milestone: FM radio = Beta 7. Do the milestone-boundary audit first (docs/planning/roadmap-gap-audit.md, standing rule; AGENTS.md). Evidence: ../Y2Player/docs/FM_RADIO_FEASIBILITY.md; the FM firmware must come from the owner's system.img like Wi-Fi/Bluetooth (no MediaTek firmware in images).

Where things are (Reborn): clock reborn_core::clock + zones.rs (regenerate with tools/clock/zones.py), picker/caches reborn_ui::time_zone; skin engine vars/flags crates/reborn-ui/src/skin/{mod,draw,compile}.rs; skins are generated — never edit skins/*/skin.json by hand: change tools/assets/build_skins.py (finishing steps add_clock/add_live/add_keyboard/add_heart; Bunny Bow in bunny_bow(); fonts in assets/fonts/pixelify) and rerun it (Classic's json is hand-written). Check that the default look stays pixel-identical by rendering reborn-preview before/after and diffing PNGs. Pause/BlueALSA in crates/reborn-audio/native/audio.c (rb_sink_pause); pending-start skips in app/reborn/src/main.rs Runtime::effect; pre-CID cleanup retire_pre_cid_copy in crates/reborn-library.

Release mechanics (unchanged): release.py bump --version X --sequence N → commit both → release.py build --label N → verify image → docs (report, audit row, readme, state, catalog, docs README, handoff; tools/development/check-docs.py) → docs commit → release.py publish **with the GIT_AUTHOR_*/GIT_COMMITTER_* environment** (Luca, noreply address; never model attribution). Publish needs Reborn's HEAD to be the built commit: Reborn docs fixes go in after publishing. Workspace: out/build, out/release-59, out/release-60 (prune keeps two). Next free: label 61, sequence above 5750 (Beta 7 e.g. 5800).

Previous entry: (2026-10-16) Y2LINUX 1.0 BETA 6.2 (BASELINE 59) PUBLISHED — CLOCK, SKINS, BUNNY BOW. Reborn PR #10 clock, skin engine {clock} {station} has_clock live favorite, heart, keyboard layout, Station Info facts, Bunny Bow.

Previous entry: START HERE (2026-10-16 local, latest): Y2LINUX 1.0 BETA 6.1 (BASELINE 58) PUBLISHED — BETA 6 FIXES. Release 1.0.0-beta.6.1, tag baseline-58, sequence 5650, Linux faf85ba + docs, Reborn 78e36db; report docs/validation/Y2-LINUX-1.0-BETA-6.1.md, audit BETA-6.1.

  • Reborn: BlueALSA pause → drain/prepare (rb_sink_pause(s, on, device_pause), AlsaSink::pause); Next/Previous/Play-Pause during pending_reconfiguration handled in Runtime::effect (step + hold + seek_until); retire_pre_cid_copy in reborn-library scan finish (#15); PR #14 merged (playlist_index online-first); review commit 0e14a3e.
  • Owed on the device: AirPods sound after pause/resume (the drain path is unverified on BlueALSA), skipping during a start, no SD duplicates after a scan; plus the Beta 6 checks.
  • Next: FM radio (Beta 7), audit first. Owner-parked: station logos Cover Flow for radio favorites.

Previous entry: START HERE (2026-10-15 local, latest): Y2LINUX 1.0 BETA 6 (BASELINE 57) PUBLISHED — PLAYLISTS, INSTANT PAUSE. Release 1.0.0-beta.6, tag baseline-57, sequence 5600, Linux 45d3696 + docs, Reborn 544d3c9; report docs/validation/Y2-LINUX-1.0-BETA-6.md, audit BETA-6.

  • Reborn: playlists (reborn_core::playlist, reborn_platform::playlists, reborn_ui::{playlist_index, playlists_ui, views_playlists}, worker app/reborn/src/playlists.rs; owner: anywhere in music, edit the file itself, Favorites with heart, Move with the wheel); pause in place (Playback::hold, AudioSink::pause/rb_sink_pause, HOLD_LIMIT 3 min) and collected seeking (SEEK_SETTLE 350 ms).
  • Owed on the device: the Beta 6 report's checks; plus earlier betas'.
  • Next: FM radio (now Beta 7), audit first. Possible later: in-place seek in the decoder (a seek still restarts playback, ≈1 s on Bluetooth); the timing-sensitive radio reconnect test (stream_strips_titles_and_reconnects_after_a_drop) failed once under a parallel full run.

Previous entry: START HERE (2026-10-15 local, latest): Y2LINUX 1.0 BETA 5.1 (BASELINE 56) PUBLISHED — LIVE SEARCH, RADIO SECTION. Release 1.0.0-beta.5.1, tag baseline-56, sequence 5500, Linux e9ac2a5 + docs, Reborn 35e333d; report docs/validation/Y2-LINUX-1.0-BETA-5.1.md, audit BETA-5.1.

  • Reborn: live search (keyboard::LIVE_ROWS, Ui::show_live_results), search index (search::Index, benchmark cargo test -p reborn-ui --release -- --ignored --nocapture speed), radio section views_radio (logos via radio::fetch_logo → LogoFetcher in main → artwork::Art::Logo → rb_media_logo_file + art::logo_tile; live logo check REBORN_LOGO_OUT=dir cargo test -p reborn -- --ignored live_logos), ranked top 10 (RadioView::set_stations_ranked), Station Info (Screen::RadioInfo), zapping (Runtime::zap).
  • Owed on the device: logos in lists/Now Playing, top 10 + A–Z, Station Info, Previous/Next between stations, live search; plus the Beta 5 and 4.1 checks.
  • Next: FM radio (Beta 6), audit first.

Previous entry: START HERE (2026-10-15 local, latest): Y2LINUX 1.0 BETA 5 (BASELINE 55) PUBLISHED — KEYBOARD, SEARCH, UI PASS. Release 1.0.0-beta.5, tag baseline-55, sequence 5450, Linux 5dd995f + docs, Reborn 84df9ae; report docs/validation/Y2-LINUX-1.0-BETA-5.md, audit BETA-5.

  • What changed (Reborn): reborn_ui::keyboard (QWERTY, pages, owner: Back = up / hold Back = leave), ActionRouter::set_keyboard (buttons as arrows, wheel inert), reborn_ui::search + Screen::Search (Home → Search), UI pass (Title Case rule, toasts in the status bar, opaque power hold). Previews: cargo run --bin reborn-preview -- DIR + tools/preview/render_previews.py.
  • Owed on the device: password join, radio and library search, held-button repeat speed, hold Back cancel, playback while typing; plus the Beta 4.1 checks below.
  • Next: FM radio (now Beta 6) — audit first (new hardware subsystem), see the Beta 4 entry. Ideas parked by the owner: station logos / Cover Flow for radio favorites.

Previous entry: START HERE (2026-10-15 local, latest): Y2LINUX 1.0 BETA 4.1 (BASELINE 54) PUBLISHED — RADIO/WI-FI FIXES. Release 1.0.0-beta.4.1, tag baseline-54, sequence 5350, Linux 929ea0d + docs, Reborn d0008dd; report docs/validation/Y2-LINUX-1.0-BETA-4.1.md, audit BETA-4.1.

  • Fixed: radio Stream::drop deadlock ("playback command queue full"); radio availability per loop pass; Reborn accepts an Online network.json up to 45 s and falls back to the supplicant; TLS clock coherence via CLOCK_BOOTTIME (updates after sleep). release.py bump takes point betas.
  • Owed on the device: station stop/pause/switch; Wi-Fi + Radio after 10+ min screen-off without a Wi-Fi restart; Check for Updates right after deep sleep; Bluetooth after wake (owner suspects a problem, no evidence yet).
  • Then FM radio (Beta 5) as planned below.

Previous entry: START HERE (2026-10-15 local, latest): Y2LINUX 1.0 BETA 4 (BASELINE 53) PUBLISHED — INTERNET RADIO. Release 1.0.0-beta.4, tag baseline-53, sequence 5300, Linux d681990 + docs, Reborn 94eae20; report docs/validation/Y2-LINUX-1.0-BETA-4.md, audit BETA-4.

  • Internet radio (Reborn reborn_platform::radio, Decoder::open_stream, screens Radio/RadioStations/RadioCategories): radio-browser.info directory, own .m3u/.pls in a Radio folder, favorites /data/reborn/state/radio.json, curl fetcher + ICY + reconnect; FFmpeg still network-free.
  • Owed on the device after the OTA install: play Popular stations, titles, favorites after restart, search, Wi-Fi drop reconnect, CPU/battery while streaming, Bluetooth while streaming. "Another pass" if needed (owner).
  • FM radio next (Beta 5): owner decision — hide FM where a scan finds no station. Plan: audit first (new hardware subsystem); evidence in Y2Player/docs/FM_RADIO_FEASIBILITY.md; firmware mt6627_fm_v1_patch.bin/_coeff.bin + mt6627_fm_cust.cfg from the owner's system.img; donor driver drivers/misc/mediatek-consys/fmradio; device experiments need the owner's OK.
  • Bluetooth range (Beta 3 follow-up): owner hears dropouts at 2–4 m, stock is bad too (hardware). Owed A/B: Wi-Fi off; AAC Standard; SBC.

Previous entry: START HERE (2026-10-15 local, latest): Y2LINUX 1.0 BETA 3 (BASELINE 52) PUBLISHED — BLUETOOTH QUALITY. Release 1.0.0-beta.3, tag baseline-52, sequence 5200, Linux 2731169 + docs, Reborn 8cd4362; report docs/validation/Y2-LINUX-1.0-BETA-3.md, audit BETA-3. Built with release.py build --label 52 in 119 s.

  • What changed: AAC afterburner up to the peer's rate capped to one packet per frame (y2_aac_mtu_bitrate), adaptive CBR AAC rate (BlueALSA buildroot/patches/bluez-alsa/0002-y2-aac-adaptive-bitrate.patch, --aac-abr), settings aac_quality (high default) / aac_abr (on), EncoderStats for AAC → status aac_abr_level/aac_abr_adjustments; SBC XQ ungated; Reborn rows AAC Quality / AAC Auto Rate (service menu).
  • Device check owed (after OTA, read-only): y2-platform status bluetooth → encoder.bitrate_bps (expect 256000 or MTU-capped), aac_abr_adjustments 0 at close range; bluealsad CPU vs ≈9 %; owner listening High vs Standard; walk-away test watching aac_abr_level.
  • Live-device rule learned: restarting bluealsad on the player is a device write; the session's safety check refused the second attempt — ask the owner before any on-device experiment. The connectivity supervisor restarts bluealsad immediately with policy args (pidfd).

Previous entry: START HERE (2026-10-15 local, latest): BUILD PIPELINE REWORKED (after Beta 2; not released, not pushed). Owner: "do all of the fixes" + "never more than 2 builds on this pc".

  • Release = 3 commands (docs/BUILDING.md §7): tools/production/release.py bump --version X, commit both repos, release.py build --label N (≈95 s: resume 51 s, all checks in parallel 28 s, sign/firmware-scan/assets 15 s; --clean ≈8.5 min), docs commit, release.py publish --label N --title … --notes … --yes (tags, pushes, GitHub release; third-party sources archive Y2Linux-sources-third-party-<sha12>.tar and linux-6.18.56.tar.xz are linked instead of re-uploaded when an earlier release carries the identical file; writes published.json).
  • One build workspace out/build, resumed in place; build folders are never copied any more: copies kept absolute paths, the staging symlink and per-package RPATHs of their origin — Beta 2's build still read libraries/.pc files of power-final-34-build, and its libdbus carried build-34 paths. Outputs per release in out/release-<N>/ (update, first-install, ota, assets, receipts, summary.json; receipts also in out/deep-sleep-final/build<N>-receipts).
  • Prune after every build: workspace + 2 newest release outputs (always the newest published one = next --base), unused .cache/environment-* removed; a build the workspace still references is never deleted. First run freed 55 GB; out/ now: build, deep-sleep-final (old logs in old-build-logs/), rea, screenshots, y2linux-1.0.0-beta.2-update (base for 52).
  • Build changes: Buildroot per-package directories + ccache (.cache/ccache), all cores; Reborn/fdk-aac/bluez-alsa rebuilt only when their inputs change (+ reverse dependencies under PPD); exfatprogs now depends on util-linux (missing dependency found by the parallel build); Reborn cross.sh takes the package's host view (Y2_BUILDROOT_HOST, Reborn bae14ca). Clean workspace target equals Beta 2's (2310 files; only sqlite3 CLI without zlib — undeclared dependency the serial build picked up by luck —, libdbus without build-34 paths, Python sysconfig paths).
  • Tests: tools/development/host-tests.sh = container module list on the host, 760 OK in 45 s (needs python-pyelftools, qemu-user — installed); clang 23 warning fix in C test harnesses; new tests/test_release_tool.py in the suite (733 in the container).
  • Not pushed: Y2Linux commits after 4808347 and Reborn bae14ca are local; push needs the owner's go. Next release (52) uses the new flow; Beta 2 OTA device check still owed.

Previous entry: START HERE (2026-10-15 local, for the next session): Y2LINUX 1.0 BETA 2 (BASELINE 51) PUBLISHED, NOT YET ON THE PLAYER. Release 1.0.0-beta.2 (Reborn 1.0.0-beta.2), tag baseline-51, sequence 5100, Linux fc1f5ea + docs, Reborn 009cd32; report docs/validation/Y2-LINUX-1.0-BETA-2.md, audit BETA-2. Owner wants OTA only from now on (no USB staging).

  • What 51 changes: BTIF RX acknowledge-before-drain (kernel/platform/connectivity/btif.c; every BTIF timeout on record had RX flag=0 valid=2..7); HCI post_init writes page timeout 0x2000 and logs page timeout X -> 8192 slots (hci.c); y2-bt-reconnect call deadline 45 s (tools/connectivity/reconnect.c); DNS re-check 300 s / fresh 420 s (network.py, observe.py); radio_off_disconnects; BlueZ Class=0x00041C. Reborn: AutoOutput in app/reborn/src/main.rs (Bluetooth wins once per connection, start on jack), Wi-Fi psk sent raw / SSID hex (wifi.rs).
  • Device check owed after the owner's OTA install (read-only): uname -r = 6.18.56-y2linux-1.0.0-beta.2, update Acknowledged (5100), firmware Ready; dmesg | grep 'page timeout' (old value tells whether 18 s came from the controller default); no BTIF timeout over many wakes; /run/y2/bt-reconnect.json never Inhibited with completion_unknown… when the AirPods are away; output switches to AirPods on connect (output_automatic in Reborn's log); time from wlan0 registered to DHCP after a wake (was 7.5 s / 22.4 s).
  • Owner question answered (not started): more Bluetooth quality/range/stability — candidates: AAC afterburner/bitrate (BlueALSA --aac-afterburner), SBC XQ out of the experimental gate, Wi-Fi/BT coexistence setup vs stock (REA the stock WMT/AFH channel hand-over), larger Bluetooth sink buffer; measure first (RSSI/link quality/encoder stats, walk test, Wi-Fi on/off). Range is calibration/antenna-bound.
  • Not changed on purpose: Wi-Fi power save off; wpa_cli/ip status probes (0.2–0.7 % CPU); BlueZ uinput message.
  • Still open: 155 report/audit entry for Beta 1's night not written; wake_event_in_progress race; issue #39 plan; Reborn PRs #9–#13.

Previous entry: START HERE (2026-10-15 local, later): BETA 1 DEVICE CHECK PASSED; FIRST OVERNIGHT DRAIN ON BETA 1 ≈ 9.4 mA (archive 20261016/155-beta1-overnight-drain, next 156). Read-only capture with out/deep-sleep-final/capture-return.py; no report or audit entry written yet (owner: handoff only for now).

  • Install check (open item 1, done): kernel 6.18.56-y2linux-1.0.0-beta.1, update status Acknowledged (sequence 5000), firmware status Ready (7 files in /data/firmware/mt6582), recovery log without radio firmware kept and without a DSI read-back line.
  • Night 00:07–09:24 local (boot 81283b3d; system.log stamps are UTC, 2 h behind): 18 timer maintenance wakes (wake=0x1, 30 min), vproc/PMIC sleep/wheel/USB PHY/INFRA 12/12 clean, INFRA lost=0x0, no taint. Morning wake wake=0x20.
  • Drain ≈ 9.4 mA (least squares on suspend_maintenance_wake remaining_uah_estimate, first 2 h skipped; 10.8 mA with all rows; −8.8 mV/h at 4.09→4.01 V). Same script on the 26 night (archive 124): 8.3 mA at ≈3.99→3.94 V. panel_stock_suspend, vgp2_idle_off and the VSYS PMIC group were all active → 27's measures bring no measurable gain (voltage-only estimate, different SOC region: ±1–2 mA is noise). Stock ≈1.3 mA; the gap needs new sources, not a re-measurement of A–C.
  • 06:38 self-wake (known race, now in a maintenance re-entry): after the 13th maintenance wake the /sys/power/wakeup_count store failed (BAT0 change; BAT0 wakeup_count 19, mt6323-keys 0, no key event) → Refused('wake_event_in_progress') → screen-first + radios restored, screen lit 63 s, Wi-Fi associated, asleep again 06:40. Code: tools/platform/y2_platform/product_sleep.py (store at ≈338, refusal restore at ≈380). Fix proposed since report 26 and still not made: on a failed store with unchanged Power/RTC wake IRQs, re-read the count and retry (bounded) instead of a full wake.
  • Morning radio restore: WMT patch 2 (opcode 07) BTIF timeout −110; the driver's retrying once succeeded 0.6 s later, Wi-Fi online. AirPods reconnect Inhibited again (Host is down, peer probably absent). USB plugged 09:25:36 → configured, charging 450 mA, SSH fine (one more good USB-after-wake point).
  • Open Reborn PRs (samanz, #9–#13; only the PR descriptions and file lists were read, code not reviewed or built, none merged; #11 and #12 conflict on one line, the hint under Output — #12 says keep its version): #9 M3U playlists, #10 status-bar clock, #11 AutoEq headphone EQ, #12 Measure headphones (Y2Linux #38 button), #13 spinners at panel rate. Owner decides.
  • Open Y2Linux issue #39 (samanz): a raw (non-sparse) system.img (his 3.2.1 copy, 859,826,928 B) cannot fit the Firmware drive on Y2DATA (585.8 MB free there; ours 634 MB) → MTP copy fails with ENOSPC (mtp-events.json error 28), nothing tells the owner. The SD card Firmware/system.img route worked (candidates() in radiofw.py). Our tested v3.2.0 image is sparse, 518,590,232 B. Suggested: show ENOSPC on the player, name the SD route in the inbox README (radiofw.py README) and more prominently in INSTALL.md step 7, say the sparse v3.2.0 image is expected. Not answered yet.

    Proposed plan (owner agreed to record it; not started, issue not answered): (3) wording first: inbox README in radiofw.py names the v3.2.0 system.img (≈520 MB) and the SD card Firmware folder for a larger copy; INSTALL.md step 7 names the SD route in the step itself. (2) Player message: radiofw.state() reports {"state":"Missing","reason":"too_large"} when the last Firmware-inbox copy failed with error 28 in /run/y2/mtp-events.json; Reborn adds a hero page beside That File Isn't the Y2 Firmware, e.g. That File Doesn't Fit — use the v3.2.0 system.img or a Firmware folder on the SD card; clears on a found file or Ready. (1) Real fix, after checking upstream umtprd for an existing check: in the y2-mtp SendObjectInfo patch, answer MTP_RESPONSE_STORE_FULL when the announced object size exceeds the target storage's free space, so the computer says "not enough space" before any data moves (today STORAGE_FULL is returned only after the whole transfer, 0001-y2-safe-media-transfers.patch ≈528, which Windows does not show clearly). Do not grow or move the Firmware drive; reading raw images already works. Order: (3)+(2) in the next release, (1) after the upstream check; samanz offered to test (has the raw 3.2.1 image). Reply on #39 only with the owner's go.

  • Next: write the 155 result into a validation report + audit entry; fix the wake_event_in_progress race (owner go); then continue the sleep-power gap.

Previous entry: START HERE (2026-10-15 local, for the next session): Y2LINUX 1.0 BETA 1 IS PUBLISHED AND INSTALLED.

  • State: GitHub release baseline-50 "Y2Linux 1.0 Beta 1" (latest; the update channel reads releases/latest), tag baseline-50 in both repositories, Linux 5ac955f + docs, Reborn e394c38. Release 1.0.0-beta.1, Reborn 1.0.0-beta.1, kernel 6.18.56-y2linux-1.0.0-beta.1, sequence 5000, built with build.py --public. Owner installed it over Wi-Fi and reports "works"; the on-device check was not done (player not connected): first thing next session, read-only: uname -r, update status (Acknowledged), firmware status (Ready), recovery log (radio firmware kept not expected again; screen lit), Wi-Fi/BT up → archive 20261016/155.
  • Release recipe (as done for 49/50): bump kernel/config/production.config + tools/production/release.json (+ Reborn Cargo.toml, cargo update --workspace --offline); commit; build.py --output out/<b> --resume kernel --public (copy the previous build dir first); container suite; system_update.py … --public; validate/check_elf/check_installed_arm/privacy/release_inventory; package.py --build … --stock <Innioasis folder> --public (first-install); legal-info with PATH=.cache/host-tools:$PATH; sign with tools/update/package.py candidate … --private ~/.local/share/y2linux/signing/platform-v1-release-20261015.key; assets = 5 OTA files + first-install zip + legal-info tar + Linux tarball + SHA256SUMS; gh release create baseline-NN --latest (never a pre-release). Packaging requires HEAD = build commit and a clean tree: dry-run tool changes with a scratch wrapper before rebuilding.
  • Rules learned this session: no image may contain the MediaTek radio firmware (owner has Innioasis' permission, not MediaTek's; releases 46–48 had their rootfs.ext4.gz removed); public codecs SBC + AAC (fdk-aac-free) + LDAC, aptX/aptX HD only in owner-private builds (default build.py without --public); every build installs into an empty target. Pushing/publishing is outward-facing: the owner said so explicitly each time.
  • Open, in priority: (1) device check of Beta 1 (above); (2) AAC with the owner's AirPods on fdk-aac-free; (3) sleep power (≈8.3 mA vs stock ≈1.3; 27/32 measures never measured overnight); (4) USB after deep-sleep wake over many wakes; (5) Bluetooth reconnect after wake; (6) the DSI register read lag's own cause (harmless since 47, 2 of 5 restart entries); (7) laggy spinners elsewhere in Reborn (download screen is fixed); (8) contributor @samanz offered more features on his fork (search, playlists, podcasts, clock, headphone EQ, games…), owner declined for now; Y2Linux #38 headphone measurement has no Reborn button yet. Private aptX package for the owner exists only for 49 (out/y2linux-platform-v1-power-final-candidate-49-private-ota); a Beta 1 private build would need build.py without --public.
  • Reports: docs/validation/Y2-LINUX-1.0-BETA-1.md, …POWER-FINAL-44..49.md; audits POWER-FINAL-44, OTA-46, POWER-FINAL-47, OTA-48, RELEASE-49, BETA-1. Docs: docs/INSTALL.md (8-step release install), docs/RECOVERY-AND-UPDATES.md. Next archive 155.

Previous entry: START HERE (2026-10-16, later): Y2LINUX 1.0 BETA 1 (BASELINE 50) — FIRST PUBLIC BETA. Release 1.0.0-beta.1 (Reborn 1.0.0-beta.1), tag baseline-50, sequence 5000, built with --public; report docs/validation/Y2-LINUX-1.0-BETA-1.md, audit BETA-1. Owner installs over Wi-Fi; then AAC with AirPods. Open gaps: sleep power, USB after wake over many wakes, BT reconnect, second-device install.

Previous entry: START HERE (2026-10-16, end): BASELINE 49 PUBLISHED — firmware-free public images + first-install package + GPL sources on GitHub release baseline-49; releases 46–48 no longer carry rootfs.ext4.gz (contained MediaTek firmware). Owner installed the public 49 over Wi-Fi (archive 153: firmware kept, radios up, screen lit; no aptX); private aptX build out/y2linux-platform-v1-power-final-candidate-49-private-ota (stage over USB on request). Check after the install: recovery log radio firmware kept on Y2DATA, /data/firmware/mt6582 7 files, Wi-Fi/Bluetooth up, recovery screen lit; then (owner OK) the Firmware-drive test with system.img. Report docs/validation/Y2-PLATFORM-V1-POWER-FINAL-49.md; audit RELEASE-49. Contributions merged (#38, Reborn #6–#8). Firmware-drive test done (archive 154; bugs fixed in Linux d1f1195). Next archive 155. For the next release: Reborn 476e281 (cancel no longer hides a newer release), Linux d1f1195 (watcher re-check, reliable radio restart). Open: AAC with the owner's headphones.

Previous entry: UPDATE (2026-10-16, latest): 48 INSTALLED OVER WI-FI, RECOVERY SCREEN LIT; FIVE RESTART-ENTERED RECOVERY PROBES ALL LIT (archive 20261016/151, next 152). The DSI read lag still appears (probes 4, 5) with DCM off, but the pipeline runs: DSI DCM was what made it dark. Open: the lag's own cause; 44's retry is useless (remove or keep as a log). Contributions: all four PRs reviewed (all make sense; #7 sort order and #38 headphone level are owner choices), none merged — owner decides; local review branches review/prs, pr-6..8 in Y2Reborn.

Previous entry: START HERE (2026-10-16, late night): BASELINE 48 PUBLISHED — OVER-THE-AIR UPDATES FROM GITHUB RELEASES. Releases baseline-46, -47, -48 on SchulzCode/Y2Linux (tags in both repositories; release key platform-v1-release-20261015, private key only in ~/.local/share/y2linux/signing/, owner should back it up). The player checks releases/latest/download/manifest.json. Publish recipe: identity bump → build.py --resume kernel → container suite → system_update.py (HEAD = build commit) → seal checks → tools/update/package.py candidate … --private <release key> --key-id platform-v1-release-20261015 → gh release create baseline-NN --latest with the five files.

  • On the player (last seen): 46 installed over Wi-Fi from its release (archive 20261016/150, Acknowledged); 47 downloaded over Wi-Fi and queued; owner then asked to publish 48 (not yet seen on the player). Next archive 151.
  • Open: dark recovery screen. The DSI register port answers every read one register late from Linux's first modeset (archives 143, 147's recovery, 150; not the SMI wedge fixed in 43). 44's power-cycle retry does not clear it. 47 keeps MMSYS DCM off for DSI/DPI (suspected cause; stock enables DCM once while streaming). Check after the next install: /data/logs/recovery-last.log (park video … dcm1=0000000f, no read-back line) and recovery-display.txt; the owner approved five y2-platform update probe-recovery runs (each restarts into the recovery screen and back; 47+).
  • 46: space for every update (stale package and disposable logs removed before a download, rollback copies counted as free, needed_bytes), restart into the installer and back by default (restart.json {"mode":"poweroff"} = override), low battery in the recovery always powers off. 48: live download progress (/run/y2/update-progress.json, /run/y2/update-check-progress), one decoding check (≈12 s less), nice 10, new Reborn download screen (first visible on the download after 48).
  • Contributions (samanz): Y2Linux issue #37 / PR #38 (cs43130 headphone load measurement on demand, two upstream driver bugs) reviewed: merges cleanly, overlay hash matches, build + 718 + audio host tests pass; owner said yes → merge it into 49 with an audit entry and a device test. Y2Reborn PRs #6 (artwork worker), #7 (A–Z sort), #8 (genre grid title) not yet reviewed.
  • Reports docs/validation/Y2-PLATFORM-V1-POWER-FINAL-{44..48}.md; audit entries POWER-FINAL-44, OTA-46, POWER-FINAL-47, OTA-48.

Previous entry: START HERE (2026-10-16, night): 43 FLASHED — SOFTWARE RESTART KEEPS THE DISPLAY (fixed, archive 147). Remaining checks: power-on from charging with USB plugged in, then restart.json on and an install with no Power presses.

Previous entry: START HERE (2026-10-16, night): 43 SEALED. The dark panel after a restart (and after power-on from charging with USB, owner's observation) is a boot-time race: Lima's runtime idle (200 ms after probe) drops the last SMI common reference before a late display handover (~0.9 s on restart boots vs ~0.47 s cold), CCF closes the gate under LK's fetch, larb0 wedges. 43 holds SMI common/larb0 until the display mutex takes over. Next: flash 43, restart + USB power-on tests, then restart.json.

Previous entry: START HERE (2026-10-16, evening): 42 SEALED. 41 on the device confirmed the closed SMI gate after a restart but opening it at handover is too late (archive 142); 42 reopens the gates in a restart handler before the watchdog reset. Next: flash 42, restart test, then restart.json.

Previous entry: START HERE (2026-10-16, later): ROOT CAUSE OF THE DARK PANEL AFTER A SOFTWARE RESTART FOUND (40); 41 SEALED WITH THE FIX. At handover after a restart MMSYS_CG_CON0=1: Linux closed the SMI common gate at shutdown, the watchdog restart keeps it, LK's first fetch hangs (larb0 busy, GREQ 1). 41 opens the gates at handover. Next: flash 41, restart test, then restart.json and a no-press install.

Previous entry: START HERE (2026-10-16): 40 SEALED (handover snapshot), AWAITING FLASH. 39 on the device: restart still dark with screen on and off (archives 137/138); SMI larb0 busy after every restart. 40 snapshots LK's pipeline at handover/parked. Next: flash 40, cold + one restart, diff slots 2/3. OTA works (two Power presses); automatic restart waits for this.

Previous entry: START HERE (2026-10-15, late night): 39 SEALED (display mutex reset), AWAITING FLASH. Restart on 38 stayed dark (archive 135): stale mutex grant → could not acquire mutex 0; 39 resets all display mutexes once at handover. Next: flash 39, check Y2SCAN mutex reset line, restart test (owner OK), then restart.json on.

Previous entry: START HERE (2026-10-15, night): 38 INSTALLED OVER THE AIR FROM 37 (release key), 52 s in recovery (37: 136 s), health acknowledged. Next: one software restart on 38 (owner OK) to test the stock external-reset sequence; if the panel survives, /data/updates/restart.json {"mode": "reboot"} and an install without Power presses. Possible further speed-up: back up only the chunks that change (backup is now 31 of 52 s).

Previous entry: START HERE (2026-10-15, evening): 37 FLASHED (cold snapshot archive 133; 37 reinstall test staged), 38 SEALED. REA: stock wdt_arch_reset sets WDT external reset + auto-restart before WDT_SWRST; ours did not → 38 uses the stock sequence (docs/validation/Y2-PLATFORM-V1-POWER-FINAL-38.md). Opt-in automatic restart for updates: /data/updates/restart.json {"mode": "reboot"}. Next: owner's 37 install test (Turn Off and Install), then 38 (SPFT or OTA …-38-ota-release), one restart test, then restart.json on.

Previous entry: START HERE (2026-10-15, later): POWER-FINAL-37 SEALED, AWAITING THE FLASH (docs/validation/Y2-PLATFORM-V1-POWER-FINAL-37.md). On 35: recovery entry PASSED; first install 35→36 refused by the recovery itself (replay check against its own release; nothing written) → fixed; Python status called the schema-2 journal unreadable → fixed (36, never installed). Software restart still leaves the panel dark (archives 130/131: OVL/RDMA never complete, DSI equal to cold); LK shows the logo and its platform_init has no boot-reason branch (REA). RTC alarm power-on after power-off: no (test negative). 37 adds a read-only display snapshot (/sys/kernel/debug/y2_display_snapshot) for a cold/warm diff. Next: flash 37, cold snapshot (archive 133), one restart with owner OK + warm snapshot, then the install test with …-37-ota-devtest. Owner wants automatic restart instead of pressing Power once the display restart is fixed.

Previous entry: START HERE (2026-10-15): POWER-FINAL-35 SEALED = OVER-THE-AIR UPDATES (OTA-35), AWAITING THE OWNER FLASH. Owner asked for Wi-Fi updates of Y2Linux + Reborn and approved replacing the stock recovery ("yes to all": power-off + press Power, GitHub Releases, charger or ≥ 50 %, daily check that only notifies). Design: the installed LK equals the analysed FM LK (archive 20261015/128, read-only) and boots RECOVERY when MISC says boot-recovery; a Y2 recovery image there installs BOOTIMG + Y2ROOT with backup/readback/restore; each kernel may write only the other boot image (kernel policy). Contract docs/architecture/platform-ota-v2.md; report docs/validation/Y2-PLATFORM-V1-POWER-FINAL-35.md (owner steps). Package out/y2linux-platform-v1-power-final-candidate-35/ (fallback 34) with recovery-install/ (one-row SPFT scatter), receipts build35-receipts, Linux 3eb96ba, Reborn 6fbaba8, BOOTIMG c27dd33c…c391, Y2ROOT 25ec8077…5eff, RECOVERY 859227b4…04cb, suite 718. Signed OTA packages (not published): …-35-ota-devtest (development key, reinstall) and …-35-ota-release (new release key platform-v1-release-20261015, private key in ~/.local/share/y2linux/signing/, sequence 3500).

Work list, in this order:

  1. Owner flashes 35 (preserve scatter: BOOTIMG + ANDROID) and recovery-install/ (RECOVERY only). Then read-only archive 129: recovery_image=0, policy line, y2-platform update recovery-status → valid recovery image.
  2. probe-recovery PASSED 2026-10-15 (archive 129 + recovery-probe.json): LK boot mode 2, recovery_image=1, panel lit ("Recovery works"), MISC cleared, normal start afterwards. Steps 1–2 done; 3 is next.
  3. First install from …-35-ota-devtest copied to the device (update stage --package), Turn Off and Install in Reborn; then optional interruption test.
  4. Network: a GitHub release needs the owner's OK (outward-facing). Older work list (34 checks, owed tests, open defects incl. warm-reboot dark panel, themes 3/4, BT PSM) is unchanged below.

Rules (unchanged): read-only first, archive before anything (next archive 129); never software-restart; scope-audit entry before source changes; the agent never flashes; commit with the Luca identity via env vars.

Previous entry: START HERE (2026-10-14, late night): BASELINE 34 PUBLISHED (baseline-34 in both repositories). Images from Linux de62fa9, Reborn 5b69ef5; package out/y2linux-platform-v1-power-final-candidate-34/ (fallback 33), receipts out/deep-sleep-final/build34-receipts/, BOOTIMG ee80a82c…c30c, Y2ROOT 9d3e93c1…ff6c, suite 715. Device last seen on 33 (installed; Reborn themes work, owner: "it works very good"). 34 = 33 + battery level for the stock_oam source (Reborn showed no level since 29) + all 15 themes shipped in /usr/share/reborn/skins + skin font charset: ascii / text case: lower (Zune). 13 trial theme copies sit in Internal Storage Themes/ (hidden by the shipped ones; can be deleted). Reports docs/validation/Y2-PLATFORM-V1-POWER-FINAL-{27..34}.md; theme authoring guide Y2Reborn docs/skins.md; themes generated by Y2Reborn tools/assets/build_skins.py.

Work list, in this order:

  1. After the owner flashes 34: battery number/fill shown; Theme picker lists 15; Zune loads (rebornctl theme zune --json, log skin_loaded load_ms).
  2. Owed tests: 32's wired screen-off playback (≈30 min, Bluetooth off; deep_audio_entries, SPM dormant_*, Reborn audio_xruns; off switch {"deep_idle_audio": false}), an overnight sleep on 27+ (start ≥4 h after charging, ≥12 h), 30's cold SD scan time, Cover Flow fps.
  3. Open defects: AirPods reconnect Inhibited; AAC not confirmed; wake_event_in_progress refusal after unplug; software restart leaves the panel dark; play on a saved-but-disconnected Bluetooth output should connect it (needs the owner's OK).
  4. Themes: step 3 (web editor with true preview) and step 4 (polish: scrolling titles, cover reflection, horizontal gradients, highlight animation) are not started.
  5. Bluetooth PSM/BTIF clock gating (awake idle, ledger F34–F38) is the larger power follow-up.

Rules (unchanged): read-only first, archive before anything (next archive 128); never software-restart; scope-audit entry before source changes; the agent never flashes; commit with the Luca identity via env vars.

Previous entry: START HERE (2026-10-14, night): POWER-FINAL-32 SEALED, AWAITING FLASH + WIRED SCREEN-OFF PLAYBACK TEST (contains 27–31; deep_idle_audio switch: deep idle during playback as stock dpidle). Package out/y2linux-platform-v1-power-final-candidate-32/ (fallback 31), Linux 4ded0fe, Reborn 0892bf2, BOOTIMG 5f1766ca…a131, Y2ROOT f9ca5bbc…8938, suite 713. Report docs/validation/Y2-PLATFORM-V1-POWER-FINAL-32.md (test procedure). Next archive 128.

Previous entry: START HERE (2026-10-14, night): POWER-FINAL-31 SEALED, AWAITING THE OWNER FLASH (supersedes the unflashed 30: storage/decode pass + Reborn 0892bf2 folder-first artwork, more cover names, m4b/oga/aifc, ALBUM ARTIST). Package out/y2linux-platform-v1-power-final-candidate-31/ (fallback 30), Linux ebd2a58, Reborn 0892bf2, BOOTIMG 9aeeba78…b384, Y2ROOT b275bf04…bf4f, suite 711. Report docs/validation/Y2-PLATFORM-V1-POWER-FINAL-31.md. Awake-idle analysis done (ledger F34–F38): proposed 32 = allow deep idle during screen-off playback (drop our extra INFRA-audio rule, as stock), switchable; Bluetooth PSM/BTIF gating is the larger follow-up. Awaiting the owner's go and a wired screen-off playback test. Next archive 128.

Previous entry: START HERE (2026-10-14, late): POWER-FINAL-30 SEALED, AWAITING THE OWNER FLASH (storage + decode performance pass; 29 installed and its full charge qualified, archive 127, pushed). 30: plugged exFAT/FAT/ext4 directory readahead (cold SD scan ≈7 s → expected <1 s), noatime on all cards and Y2Media, Reborn f08cf93 conditional limiter (pipeline CPU halved). Package out/y2linux-platform-v1-power-final-candidate-30/ (fallback 29), receipts build30-receipts, Linux 6aa52e3, Reborn f08cf93, BOOTIMG 7d95f855…02b9, Y2ROOT 65467e6a…82c2, suite 711. Report docs/validation/Y2-PLATFORM-V1-POWER-FINAL-30.md. Next archive 128.

Previous entry: START HERE (2026-10-14): POWER-FINAL-29 SEALED, AWAITING THE OWNER FLASH (28 on the device: OCV start + restore work, finish stage stalled at 70 mA because an awake Y2 on USB eats ~90 mA, display drifted 89 → 85 under load; 29: 450→200→70 mA steps, plateau completion, stock top-off budget completes, stock OAM estimate on battery). Package out/y2linux-platform-v1-power-final-candidate-29/ (fallback 28), receipts build29-receipts, Linux f9ce653, BOOTIMG 3f82ae59…fc07, Y2ROOT 5d9f298b…7f52, suite 708. Report docs/validation/Y2-PLATFORM-V1-POWER-FINAL-29.md. Archive 126 has the 28 charge log. Next archive 127.

Previous entry: START HERE (2026-10-14 evening): POWER-FINAL-28 SEALED, AWAITING THE OWNER FLASH (stock battery percentage + top-off, ledger F28–F33; contains 27). 27 is installed (archive 20261014/125, boot 5919b4fe: switches armed, VGP2 off when idle, no panel/codec errors; short sleep for the VSYS counters not yet done). Package out/y2linux-platform-v1-power-final-candidate-28/ (fallback 27), receipts build28-receipts, Linux 36b8500, Reborn 1c9edd4, BOOTIMG eb413fdc…9c94, Y2ROOT 7537ba43…fdf, suite 707. Report docs/validation/Y2-PLATFORM-V1-POWER-FINAL-28.md (owner checks 1–5; the full charge with SSH is the important one: finish, full_rest_uv, no 0x8 fault). Next archive 126.

Previous entry: START HERE (2026-10-14): POWER-FINAL-27 SEALED, AWAITING THE OWNER FLASH (stock sleep-parity gaps C panel, A VGP2, B VSYS; ledger F20–F22). Package out/y2linux-platform-v1-power-final-candidate-27/ (fallback 26), receipts out/deep-sleep-final/build27-receipts/, Linux 2c3e2bd, Reborn 1c9edd4, BOOTIMG c9017de1…902c, Y2ROOT c70dc92b…737a, suite 701. Switches in power-features.json: panel_stock_suspend, vgp2_idle_off, pmic_sleep (15/7). Report docs/validation/Y2-PLATFORM-V1-POWER-FINAL-27.md (owner checks 1–5). Next archive 125. Bluetooth on 26/27 (AirPods never connected) is still open.

Previous entry: START HERE (2026-10-14 morning): POWER-FINAL-26 OVERNIGHT SLEEP PASSED (archive 124); Bluetooth on 26 still unverified. Device: kernel 6.18.56-y2linux-platform-v1-power-final-26, Linux 64b3cc4 (docs after it), Reborn 1c9edd4, root v1.56, boot 9f7fe545 at archive time. Package out/y2linux-platform-v1-power-final-candidate-26/ (fallback 25). Nothing pushed; baseline-24 is still the published state. Archives out/deep-sleep-final/evidence/20261013/119..123, 20261014/124 (next 125). Reports docs/validation/Y2-PLATFORM-V1-POWER-FINAL-{25,26}.md.

Open Bluetooth issue (archive 121): after flashing 26 the owner could not play music. Reborn's output was the AirPods Pro (14:14:7D:AA:34:47), which never connected this boot: the platform reconnect's two ConnectProfile calls got no reply → /run/y2/bt-reconnect.json Inhibited, completion_unknown_user_retry_required (tools/connectivity/reconnect.c, unchanged since 25). Reborn: 0 connects, pcms empty, every play → "connected A2DP peer required". The session migrated to Auto (codec_revision 1). 26's codec request never ran. The owner was told to connect manually; unverified whether that worked.

21:19 update (archive 122): the Y2 "woke itself" right after unplugging: no sleep happened. A BAT0 change from the charger noticing the unplug landed during the ≈5-s radio quiesce, the wakeup_count store failed, and the helper refused (wake_event_in_progress) and restored the screen (seen twice before, both on 13). Proposed fix in the 26 report (retry the handshake with a fresh count when Power/RTC did not change); not made. AirPods reconnect failed a third time (still Inhibited).

Overnight baseline (archive 123, 21:24 UTC): fresh boot 8943a99a on 26 after an owner restart, taint 0, DSI hand-over normal, SPM entries 0, sleep guard not pending, power features as wanted (golden_apply 15, pmic_sleep 7, md1/pwrap/dis on), battery 4.07 V charging on USB, the usual boot lines only (mmc_erase -30, thermal_zone1 -61, mt6323-led). Reconnect already Inhibited after one failed try (AirPods not connected). Compare the morning archive against this one.

Overnight result (archive 20261014/124-power26-overnight-result, read 07:47 UTC): same boot 8943a99a, taint 0. Sleep from 21:27:28 UTC to the owner's Power press at 07:46:49 UTC (10.3 h suspended): 21 kernel suspends, 20 RTC maintenance wakes (wake 0x1) + final wake 0x20 (Power), every stage result 0, no refusals, no unexplained wakes, suspend-last complete_result_0, sleep guard not pending. SPM: entries/resumes 21/21, infra_pdn_entries 21, golden_entries 21, pwrap_gates/ungates 21/21 (0 failures), md1_gate 1 (0 regates), dis_offs/ons 23/22, aborts 0. INFRA: saves/restores 21/21, last_lost=0x0, total_lost_regs 0 (unchanged). pmic_sleep_state entries/restores 21/21, 0 failures. Wheel: sleeps/wakes 21/21, wake_retries 42 (2 NACKs per wake, same as 16's 66 for 33), 0 failures. Drain ≈8.3 mA (least squares on remaining_uah_estimate at maintenance wakes, first 2 h skipped; 7.6 mA without the skip; filtered voltage −5.0 mV/h, identical to 16's −5.0 mV/h / 8.7 mA by the same method) → at parity with 16, no regression from 17–26. Battery 83 % → 78 % (3.998 → 3.933 V). USB: first plug-in after the night configured at once (udc_change → configured, MTP+ECM Ready, SSH immediate); dma_unmask_lost 21 (one per sleep, re-armed, as since 17). dmesg: only the known boot lines plus the wheel NACKs. Bluetooth: AirPods still never connected this boot (connected=false, pcms empty, metrics connects/disconnects 0/0, codec_policy null); reconnect tried again after the morning wake and is Inhibited (total_attempts 2, failures 2). So items 2–3 below are still open.

Remaining-gap audit (2026-10-14, read-only, ledger F18–F27 in docs/knowledge/stock-suspend-re-ledger.md): the SoC rows still different at entry are checklist-only (stock never writes them). Confirmed gaps against stock: C panel suspend (stock GC9503V sends a 24-write analog power-down block after sleep-in and leaves reset high; ours holds reset low), A VGP2 always-on (stock turns the CS43131's VGP2 off when idle; sole owner), B VSYS buck never in sleep mode (stock init VSYS_VOSEL_CTRL/VSLEEP_EN/QI_VSYS_VSLEEP), D VEMC3V3 (known; stock msdc_emmc_power turns it off). Radios, SD, DRAM, GPIO: no gap found. Drain measurement is relaxation-limited (late-night 2–8 mA); the stock board has no coulomb counter. No implementation without the owner's go and a scope-audit entry.

Work list, in this order:

  1. Read the overnight result first done (archive 124, passed; see above). Was: wake count/causes, last_lost, pmic_sleep_state, pwrap_gate*, drain against 16's ≈8.6 mA, USB after the first plug-in (Defect B / first-USB-after-flash flakiness).
  2. Bluetooth on 26: ask whether a manual connect worked. Then status bluetooth.pcms[0].codec = AAC, codec_policy all five runtime_enabled, metrics bluetooth_disconnects unchanged after the connect (26 is the first image to send SelectCodec on connect; if it drops the AirPods, skip the request when the negotiated codec already equals Auto's choice). Codec row Auto/SBC/AAC in Settings.
  3. Reborn design gap: with a saved but disconnected Bluetooth output, play only fails. Proposed: on play, ask the platform to connect the saved peer (that also clears the reconnect inhibit) and show "Connecting…"; if that fails, offer the Y2's own output. Get the owner's OK before changing it.
  4. Cover Flow fps on 25/26 still unmeasured (sampler out/deep-sleep-final/coverflow-sampler.py <reborn pid>, copy to the device and run while the owner scrolls: graphics_frames deltas every 0.5 s for 45 s; y2-screen-stream cannot show more than ≈10 fps).
  5. Owner checks still open: start-up colour flash (22), Genres after the tag re-read.
  6. Remove the test library /media/sd/Cover Flow Test when the fps work is done.
  7. After 1–2 pass: consider publishing Baseline 26 (README, docs index, build guide, state, catalog, tags in both repositories; only on the owner's request).
  8. Older items 4–8 of the Baseline 24 entry below (PMIC/SoC golden rows, stock suspend hooks, faster wake, DRAM) are unchanged.

Rules (unchanged): read-only first, archive before anything; never software-restart; scope-audit entry before source changes; the agent never flashes; commit with the Luca identity via env vars.

Previous entry: START HERE (2026-10-13 late night): POWER-FINAL-26 SEALED, AWAITING THE OWNER FLASH (Bluetooth codec auto-selection). Package out/y2linux-platform-v1-power-final-candidate-26/ (fallback 25), receipts out/deep-sleep-final/build26-receipts/, Linux 64b3cc4, Reborn 1c9edd4, BOOTIMG f4ca442b…585a, Y2ROOT 66efd3ed…405f, suite 693. Cause: Reborn matched BlueALSA's Codecs prefix only as lowercase a2dp-source: (5.0 says A2DP-source:), so no codec was runtime-enabled and the codec choice was hidden; now case-insensitive, default Auto, old SBC default migrates once. 25 checked on the device (archive 119): healthy, card scan complete (0 failures); Cover Flow fps unmeasured (archive 120 partial). Report docs/validation/Y2-PLATFORM-V1-POWER-FINAL-26.md. Checks: codec row Auto/SBC/AAC with AirPods, AAC selected; then items 3–5 of the 24 entry (sleep tests owed).

Previous entry: START HERE (2026-10-13 late night): POWER-FINAL-25 SEALED, AWAITING THE OWNER FLASH (handoff items 1 and 2). Package out/y2linux-platform-v1-power-final-candidate-25/ (fallback 24), receipts out/deep-sleep-final/build25-receipts/, Linux f7eb741, Reborn ed6a8cb, BOOTIMG 44a9c3cf…3cf7, Y2ROOT 6f629a89…8f67, suite 693. 24's 27 fps came from the render gate still requiring 34 ms between frame starts (presentation waits for the flip → every 2nd/3rd vblank); 25 uses a 12-ms gap while Ui::gliding() and renews the Interactive lease during the glide; album detail cached; sub-minute albums m:ss; scanner skips ._* and macOS system folders. Report docs/validation/Y2-PLATFORM-V1-POWER-FINAL-25.md. Checks: Cover Flow fps (40-s sampler), card rescan complete, then items 3–5 below unchanged.

Previous entry: START HERE (2026-10-13 night, fresh session): BASELINE 24 IS INSTALLED AND PUBLISHED (baseline-24 in both repositories). Next work: Cover Flow to 60 fps (Reborn), small Reborn fixes, then the sleep tests that are still owed for 19–24.

Where things are. Device runs POWER-FINAL-24 (kernel 6.18.56-y2linux-platform-v1-power-final-24, Linux d2b38e8, Reborn ced5199, root v1.54). Package out/y2linux-platform-v1-power-final-candidate-24/ (fallback 23), receipts out/deep-sleep-final/build24-receipts/. Reports docs/validation/Y2-PLATFORM-V1-POWER-FINAL-{19..24}.md. SSH (USB only): ssh -F /dev/null -o HostKeyAlias=y2linux-production-v1 -i ~/.ssh/y2linux_ed25519 [email protected], lease flock -n /tmp/y2-platform-v1-device.lock. Archives out/deep-sleep-final/evidence/20261013/110..118 (next 119). Reborn control socket /run/reborn/control.sock (JSON line {"version":1,"id":1,"command":{"op":"metrics"|"status"|"scan"|...}}; metrics has graphics_frames, graphics_frame_time_ms, graphics_cpu_ms). Screen capture: /data/system/capture/y2-screen-stream → host ffmpeg -use_wallclock_as_timestamps 1 -f rawvideo -pix_fmt bgr0 -s 480x360 -i - (≈10–15 fps over USB). Test library: 100 generated albums in /media/sd/Cover Flow Test (remove the folder when done).

What 19–24 did (all physical boots healthy): 19 gates the AP PMIC_WRAP clock (INFRA bit 23) around the PCM sleep (47-min sleep clean, INFRA_PDN at entry = stock golden, INFRA still last_lost=0); 20 reclaims the never-initialised UART1 clock; 21 unlinks the backlight from DRM, sinks off at shutdown, splash dark across its modeset (owner: shutdown white screen gone); 22 darkens the backlight across the DSI hand-over (startup colour flash: not yet confirmed by the owner); 23 Reborn Cover Flow + Genres (library genre column, METADATA_REVISION 3; Quad.warp + texture2DProj; views_coverflow.rs, flow.rs; full-res centre cover via the artwork worker; Settings → Display → Album view); 24 animation frame pacing (main_loop_interval 16.7 ms while ui.animating()).

Work list, in this order:

  1. Cover Flow to ≈60 fps. 24 measured 27 fps median / 31 max (half of the panel's ≈63 Hz), Reborn main thread 45 % CPU, CPU at 598–747 MHz, GPU frame cost 3–18 ms with 1–4 ms CPU. (a) Take a CPU workload lease while ui.animating() (platform workload QoS, reborn_platform::workload::CpuWorkloadLease, as artwork decoding does; check the classes and the lease API first). (b) Profile ui.draw for Cover Flow on the host with ~300 tracks (likely: album_detail filters all tracks every frame, visible_rows/row_at per cover, text fitting); cache per-focus strings. (c) Re-measure on the device with the 40-s sampler (frames/s from graphics_frames deltas) and a capture.
  2. Small Reborn fixes: album detail shows "0 min" for sub-minute albums (use m:ss); the scanner must skip macOS ._* files and .Spotlight-V100/.fseventsd/.Trashes (the owner's card has 11 ._*.mp3, every scan reports "incomplete … 11 traversal failures" and keeps stale entries).
  3. Owner checks on 24: start-up colour flash gone? (dmesg | grep handoff shows backlight off until the first Linux frame / backlight restored); Genres populated after the one-time tag re-read.
  4. Sleep tests owed: a ~35-min sleep then an overnight drain on 24 (contains 17–20 power work); read y2_infra/state last_lost, pmic_sleep_state, pwrap_gate*, drain vs 16's ≈8.6 mA (method: archive 110). Remaining INFRA candidates if still retained: the 10 remaining SoC golden rows, VEMC3V3 (needs an eMMC suspend-model change; overlay 0029), and whether MT6582 INFRA power-down loses PERICFG at all.
  5. Open since earlier: first USB connection after a flash is sometimes dead/flaky until replug (seen on 18, 20, 21); software Restart leaves the panel dark (never software-restart).

Rules (unchanged): read-only first, archive before anything; live register writes only with the owner's OK (a loaded probe taints the kernel → sleep refused until a hold-Power restart); scope-audit entry before source changes; after editing a kernel overlay patch use tools/build/refresh-overlays.py (manifest hash); builds: build.py --output out/power-final-NN-build --owner-firmware out/deep-sleep-final/owner-firmware, system_update.py --build … --base out/y2linux-platform-v1-power-final-candidate-24 --fallback-rootfs …/Y2ROOT.img --output …, then validate/check_elf/check_installed_arm/privacy/release_inventory and the container suite (tools/build/run.py --output B -- sh /project/tools/production/tests.sh); Reborn: cargo fmt, cargo clippy --workspace --all-targets -- -D warnings, cargo test --workspace, GLES check tools/preview/gles_compare.py on reborn-preview output; commit with the Luca identity (env vars), no attribution.

Previous entry: START HERE (2026-10-13 late evening): POWER-FINAL-24 SEALED (Reborn ced5199: animation frame pacing), AWAITING THE OWNER FLASH. 23 flashed: Cover Flow looks right but ran ≈10 fps (live sample: frames 3–17 ms, graphics_frames +468 in 45 s, main thread 5.5 % CPU) because main_loop_interval slept the idle 250 ms between wheel events. 24 waits 16.7 ms while ui.animating(). Package out/y2linux-platform-v1-power-final-candidate-24/ (fallback 23), BOOTIMG 653c7d85…dda7, Y2ROOT 21f21e47…860b. Test library: 100 generated albums in /media/sd/Cover Flow Test. Follow-ups: Reborn should skip macOS ._* files and .Spotlight-V100/.fseventsd (11 on the owner's card make every scan "incomplete"); then the sleep tests.

START HERE (2026-10-13 evening): POWER-FINAL-23 SEALED = 22 + Reborn Cover Flow and Genres (owner request), AWAITING THE OWNER FLASH. Reborn 58670c8 (genre column, METADATA_REVISION 3, Genres screen, genre: filter, All Songs, seven-row home), 116f673 (renderer Quad.warp, texture2DProj; harness/compare/rasteriser), 83c9127 (Cover Flow view views_coverflow.rs, motion flow.rs, open/close flight, full-res centre cover via artwork worker want_cover → collection_artwork, Album view setting). Package out/y2linux-platform-v1-power-final-candidate-23/ (fallback 22), Linux 7f5445d, BOOTIMG 9ea7a943…75cb, Y2ROOT 8fff0f83…d297, suite 693, Reborn 370 tests. 22 (dark DSI hand-over) was never flashed separately; 23 contains it. Checks: startup flash gone, Cover Flow smoothness on the Mali-400 (metrics graphics_frame_time_ms), Genres after the one-time tag re-read, then the sleep tests.

START HERE (2026-10-13 ~17:30): POWER-FINAL-22 SEALED, AWAITING THE OWNER FLASH. 21 fixed the shutdown (dark after the animation); the startup colour flash remained: 21's boot log (archive 118) shows DSI "park video" 0.489 s → Linux fbdev modeset 0.532 s → splash 0.642 s, lit panel without stream. 22 (overlay 0017, display.ko in the initramfs): backlight off before park, relit 50 ms after the first Linux enable (3-s fallback, relit on unbind/probe failure). Package out/y2linux-platform-v1-power-final-candidate-22/ (fallback 21), build 430ff11, BOOTIMG f73ba54c…402b, Y2ROOT d7d21d71…6a0d, suite 693. Checks: startup flash gone, dmesg | grep handoff; then the sleep tests (35 min → archive 119+, overnight).

START HERE (2026-10-13 evening): POWER-FINAL-21 SEALED (= 20 + display fixes), AWAITING THE OWNER FLASH. Owner reported a colour flash at startup and a white/colour screen after the shutdown animation. Causes: the panel linked the backlight to DRM (drm_panel_of_backlight → backlight_enable() at every pipeline enable; at shutdown the fbdev restore after Reborn exits re-lit a stale buffer, racing the platform's bl_power=4); the splash's first SetCrtc re-initialises DSI with LK's picture lit. 21: link removed, backlight sinks off in .shutdown, splash dark across its modeset (relit after 2 vblanks, always). Package out/y2linux-platform-v1-power-final-candidate-21/ (fallback 20), build 0b3e0e1, BOOTIMG ea1da0b7…908e, Y2ROOT 9a9b99ce…7b77, suite 692. Checks: power on/off a few times, screen off/on and sleep/wake still lit, then the 20 sleep checks on 21 (archive 118+).

START HERE (2026-10-13 ~15:50): 20 INSTALLED (working boot 6fd4d362, archive 117); UART1 now gated (never_initialised). The first boot after the flash (53bad0d8) had dead USB networking (Y2 received but sent 0 packets, host bulk-OUT timeouts); off/on + replug fixed it; similar but milder on 18's first check → first-connection-after-flash issue, open, not attributed to 20. Next: ~35-min sleep (archive 118: last_lost, golden −1), then overnight.

START HERE (2026-10-13 late afternoon): POWER-FINAL-20 SEALED, AWAITING THE OWNER FLASH (owner: build 20, then repeat the tests on 20). Package out/y2linux-platform-v1-power-final-candidate-20/ (fallback = 19), receipts out/deep-sleep-final/build20-receipts/, build commit c853915. BOOTIMG 1ffdb4a2…3c55, Y2ROOT 98ffdca9…9548. Suite 689/exit 0. Change: never-initialised UART1 (all-zero registers) reclaimed by CCF at boot (idle-clock-policy.h). Checks: clocks.unused_handoff UART1 never_initialised retained=0; a ~35-min sleep (last_lost, golden differences −1); then the overnight drain vs 16's ≈8.6 mA. Archive numbers continue at 117.

START HERE (2026-10-13 15:00): 19 INSTALLED; 47-min sleep clean (archive 116). PMIC_WRAP gated/ungated 2/2, INFRA_PDN_STA at the kick = stock golden 0x80bfe6 exactly; INFRA still last_lost=0x0. Remaining PERI difference: PDN0 bit 17 (UART1, unowned, LK leaves it on; stock gates it in idle, deep idle and suspend). Candidate 20: gate UART1 (at boot if idle, or at sleep entry in the golden PERI group). If INFRA still stays on after that, all SoC clock gates match stock and the remaining question is whether MT6582 INFRA power-down loses PERICFG at all (our last_lost premise) — stock only restores the UART after it.

START HERE (2026-10-13 afternoon): POWER-FINAL-19 SEALED, AWAITING THE OWNER FLASH (owner asked for 19 right after the PMIC_WRAP live test; 18's overnight drain postponed). Package out/y2linux-platform-v1-power-final-candidate-19/ (fallback = 18 = baseline-18), receipts out/deep-sleep-final/build19-receipts/, build commit 0fa5135. BOOTIMG 49494899…44ed, Y2ROOT 1e6a61fc…f4d5. Suite 689/exit 0. Report docs/validation/Y2-PLATFORM-V1-POWER-FINAL-19.md. What changed: spm.pwrap_gate (owner switch pwrap_gate, default on): INFRA_PDN_SET bit 23 right before y2_spm_suspend_arm (after the last AP PMIC access), CLR right after cpu_suspend returns (after the backstop re-arm, before INFRA/PMIC/VPROC restores) and on the arm-failure path; state line pwrap_gate… in the SPM state. First checks: boot/display/audio/radios/USB; pwrap_gate=1; a ~35-min sleep first (pwrap_gates=pwrap_ungates, failures 0, pwrap_gate_sta bit 23); y2_infra/state last_lost — the key question; then the overnight drain vs 16's ≈8.6 mA. If a sleep stalls (RGU reset after 30 s): hold-Power restart, {"pwrap_gate": false}, or flash fallback/ (18). The 18 boot 69ef8c26 is tainted by the probe — flashing 19 restarts anyway.

PMIC_WRAP live test DONE (2026-10-13 13:35, owner-authorised, ledger F17): gating INFRA bit 23 makes the AP's PMIC wrapper read as all-zero (WACS2 read -EIO, no hang); ungating restores it at once. So bit 23 is the AP-side wrapper clock and can only be gated after the last AP PMIC access in y2_spm_enter and must be ungated before the first restore. The probe tainted boot 69ef8c26 (taint 4096): sleep is refused until a hold-Power restart.

PMIC_WRAP investigation (2026-10-13, REA/static, ledger F17): INFRA bit 23 (PMIC_WRAP clock) is the only INFRA gate still differing at sleep entry. Stock checklists gate it in suspend and even awake in video playback/3G paging, so AP PMIC access does not need it; stock never gates it by clock ID (indirect). Our keep-on reason (SPM firmware uses the wrapper) is not supported by stock. Next (after 18's overnight, because a probe taints the kernel and blocks sleep): owner-authorised live probe: INFRA_PDN_SET (0x10001040) bit 23 → read a PMIC register through the wrapper (e.g. cat /sys/module/pwrap/parameters/cpu_voltage_uv) and PWRAP state → INFRA_PDN_CLR (0x10001044) bit 23; then hold-Power restart. If AP access survives: 19 = gate bit 23 as the very last write before the PCM kick and ungate as the very first after the wake (before the PMIC/VPROC restores), switch golden_apply bit 16; then read last_lost.

START HERE (2026-10-13, 18's 1-h sleep read, archive 114): clean (3/3, USB ok, wake ≈0.5 s); PMIC step 3/3 restored, last_changed=0x3f, PMIC golden 15 → 7; INFRA still last_lost=0x0 — neither the modem requests (17) nor the PMIC audio clock (18) were the blocker. Audio after the wake still to be confirmed by the owner. Next: an overnight drain on 18 (vs 16's ≈8.6 mA), then INFRA: remaining candidates are hardware/bus-side (e.g. a bus master or INFRA clock left on: compare INFRA_PDN_STA bit 23 PMIC_WRAP kept on — stock golden gates it; SPM may need PMIC_WRAP idle — and the remaining SoC golden rows) or that INFRA power-down needs the eMMC/MSDC side (VEMC, 0029 retention).

START HERE (2026-10-13 evening): POWER-FINAL-18 INSTALLED (first boot 69ef8c26 healthy, archive 113) AND PUBLISHED AS baseline-18 (owner request, before its sleep test). Owner is running a 1-h sleep test: archive it as 114 and check audio after the wake, pmic_sleep_state, last_lost, wake time, USB. Previously: POWER-FINAL-18 SEALED (owner asked for all proposed PMIC changes). Package out/y2linux-platform-v1-power-final-candidate-18/ (fallback = 17 = baseline-17), receipts out/deep-sleep-final/build18-receipts/, build commit d2fff53 (test-only 545b90e and later). BOOTIMG 5d405228…2ace, Y2ROOT 71852869…2c612. Container suite 685/exit 0. Report docs/validation/Y2-PLATFORM-V1-POWER-FINAL-18.md. What changed: pmic-sleep-policy.h + pwrap.pmic_sleep (owner switch pmic_sleep, default 7): inside the SPM enter, after the VPROC step, group 1 rg_clksq_en_aud→0 and rg_adacck_en→0, group 2 drv_2m/rtc_mclk/efuse/auxadc_ctl clocks gated, group 4 VREF18 off; exact restore before VPROC restore; state pmic_sleep_state (also in diagnostics rows). PMIC golden capture now after both steps. Journal rows keep suspend.reason/error. VEMC3V3 deliberately NOT done (overlay 0029 retains the root eMMC in TRAN state without re-init; cutting it would break root access — needs an eMMC suspend-model change first). 0x108[9] accdet: Linux already gates it (my F15 summary had it backwards; corrected in the report). First checks: display; audio headphones + BT (the PMIC audio clock is only released during sleep, check playback after every wake); pmic_sleep=7; after a sleep pmic_sleep_state entries=restores, failures 0, last_changed=0x3f; y2_infra/state last_lost; then the night vs 16's ≈8.6 mA. If audio or wake misbehaves: {"pmic_sleep": 0} (or bisect 1/2/4) + hold-Power restart, or flash fallback/ (17). 17's own night was never measured.

INFRA requester analysis (2026-10-13 afternoon, REA, ledger F14–F16): the SoC side is stock-identical write for write (spm_module_init, spm_go_to_normal, spm_go_to_sleep, AP_STANBY_CON 0x180010 masks MD/CONN); R13 MD/CONN request bits are clear; last_lost=0 is a sound proof that INFRA stays powered. All 15 differing PMIC rows are now mapped to stock field names. Prime suspect: rg_clksq_en_aud (PMIC 0x102 bit 0) = 1 all the time — stock clears it when the last analog-audio user goes and in AudDrv_Suspend_Clk_Off; Linux never writes it (bootloader value). Also on in ours: rg_adacck_en (0x70c.4), accdet clock (0x108.9); off in stock suspend: VEMC3V3, VREF18 (0x776/0x778), AUXADC clocks/hw modes, vproc/vsys_vsleep_en. 18 plan: PMIC sleep entry with exact save/restore like golden-apply-policy.h, behind a bitmask switch: group 1 audio clocks (clksq_en_aud, adacck_en, accdet ck pdn — check our audio path does not need them while playing), group 2 unused PMIC clocks (drv_2m, rtc_mclk, efuse, auxadc_ctl), group 3 VREF18, group 4 VEMC3V3 off (high risk, last). Then read last_lost and the drain.

START HERE (2026-10-13 noon): 17 IS INSTALLED; first boot (archive 111) and an 18-min sleep (archive 112) clean; owner: audio works, wake feels faster. Next: the owner's longer/overnight sleep. Published as baseline-17 (owner request); INFRA requester analysis started. Screen now ≈0.5 s after the SPM return (16: ≈2.5 s). MD1 requests gated at entry, but INFRA last_lost still 0x0 → item 3 (other requesters) is next. dma_unmask_lost went 0 → 1 across the sleep (real lost unmask, re-armed, USB fine: supports Defect B theory). Two automatic requests right after the unplug were refused after the radio quiesce; the reason is not persisted (add it to the journal/diagnostics row in 18). Read the night like 110: archive 113, skip the first 2 h, least-squares on remaining_uah_estimate at the maintenance wakes, compare 16's ≈8.6 mA.

START HERE (2026-10-13 afternoon): POWER-FINAL-17 SEALED, AWAITING THE OWNER FLASH. Package out/y2linux-platform-v1-power-final-candidate-17/ (fallback = 16 = baseline-16), receipts out/deep-sleep-final/build17-receipts/, build commit 0459116 (test-only ebdfcf8 after). BOOTIMG 2ddd8d38…0b76, Y2ROOT dc1f057a…3e76. Container suite 682/exit 0. Flash BOOTIMG + ANDROID only with MT6582_preserve_data_scatter.txt, Download Only. Report docs/validation/Y2-PLATFORM-V1-POWER-FINAL-17.md. What changed: (1) MD1 request gate (spm.md1_gate, owner switch md1_gate in power-features.json): PERICFG MD1_SET 0x20 = 0x3ffffff at application_ready, readback md1_sta, re-gated at every sleep entry (md1_regates). (2) Wake order: product_sleep.py calls Reborn sleep_restore (screen_first) before the radio restore; the completion record reuses the ack (restore_ack), a failed early one is retried. (3) 16's follow-ups from d1953fa (MMSYS DCM in 0011, DMA-unmask readback bits 15..8). First checks, in order: (1) display, then state shows md1_gate=1 md1_result=0 md1_sta=0x3ffffff; USB, Wi-Fi, BT, charger, audio. If anything misbehaves after the UI comes up: {"md1_gate": false} and hold-Power restart, or flash fallback/. (2) Owner wake feel: screen should come in ≈1 s (16: ≈2.6 s); check dmesg that the DSI modeset now precedes the CONN/WMT lines. (3) After one sleep: golden PERI_PDN0_MD1_STA e=3ffffff 1, and y2_infra/state last_lost (non-zero = INFRA finally powers down — the key question). (4) Overnight drain vs 16's ≈8.6 mA (stock curve, skip the first 2 h). No probe modules this time (taint blocks sleep). Then (work list below, items 3–8): INFRA requesters if last_lost stays 0; PMIC golden; remaining SoC golden; stock suspend hooks; further wake steps (leaner kernel_resumed record ≈0.32 s, panel deep standby).

START HERE (2026-10-13, 17 IN PROGRESS): 16's night is read (Step 1 below is DONE); 16 is published as baseline-16. Owner asked to start 17 with the work list below, including item 7 (faster wake: screen first, radios in the background). 16's night (archive out/deep-sleep-final/evidence/20261013/110-power16-overnight-return/, boot f871fd6a, taint 0): unplugged sleep 18:27 → Power 10:24 (≈16 h), 33 entries / 33 resumes / 0 aborts / 0 failures, vproc/phy/wheel 33/33, DIS 35/35. USB worked after the morning replug (second good wake on 16; dma_unmask_lost=32 is the known false positive). Drain ≈8.6 mA (least-squares on the stock-curve remaining charge at the maintenance wakes from 20:27; 86 % → 74 %), 15 was ≈10 mA, stock ≈1.3 mA. INFRA last_lost=0x0 on all 33 restores, PERI_PDN0_MD1_STA=0 at every entry, SoC golden 11/34 and PMIC 15/44 unchanged. Owner wake: kernel_resumed 10:24:29 → complete_result_0 10:24:31.

START HERE (2026-10-12 night, for 17): 16 IS INSTALLED AND WORKS; ITS OVERNIGHT DRAIN TEST IS RUNNING. Goal of 17 (owner): stock sleep parity, ≈0.1 points/h (≈1.3 mA), with deep suspend and resume 100 % working.

Where things are. Device runs POWER-FINAL-16 (first boot 0b0e8a77, kernel 6.18.56-y2linux-platform-v1-power-final-16, root v1.46), package out/y2linux-platform-v1-power-final-candidate-16/ (fallback 15), built from a4e9c3b. Everything is pushed to GitHub main (baseline-15 is still the last tag; tag baseline-16 once the night is good). Report: docs/validation/Y2-PLATFORM-V1-POWER-FINAL-16.md; stock analysis: docs/knowledge/stock-suspend-re-ledger.md (F1–F13, REA/Ghidra on out/rea/fm-kernel.elf, an ELF wrapper of the stock FM kernel with its kallsyms; rebuild it with a ~50-line ELF writer if out/rea is gone). SSH/lease as below.

Step 1 — read 16's night. The owner charged to 86 % (stock curve), unplugged and started the night on 2026-10-12 evening. Check first that the kernel was not tainted: the live MD1 probe (md1probe.ko) tainted boot 0b0e8a77, and product sleep refuses on a tainted kernel; if the owner did not hold-Power restart before unplugging, the rows show suspend_refused_kernel_sleep_unavailable all night. Archive read-only first (109 layout: first-return.json, persistent.tar of /data/system/platform, /data/logs, /run/y2), next number 110. Read sleep-diagnostics.jsonl (kernel_resumed rows carry golden with extra rows and pmic_golden) and power-journal.jsonl. Drain: skip the first 1–2 h (post-charge relaxation; 16's 36-min test fell 4033 → 3935 mV from relaxation alone), then use resting voltages at the maintenance wakes on the stock curve (battery-profile.json, 1300 mAh). Compare with 15 ≈10 mA (archive 108, re-read on the stock curve). USB after the morning replug (Defect B): 16's first wake worked, but the DMA unmask was not lost (dma_intr_before=0000ff00, bits 15..8 are the readback), so the cause of the fix is unproven; record every wake.

17 work list (in this order, adjusted by the night):

  1. Gate the never-used modem's clock requests at boot (PERICFG MD1_SET 0x20 = 0x3ffffff; proven AP-writable and harmless by the live test, ledger F11), with a switch in power_features and a boot-time readback of MD1_STA 0x30. Main suspect for INFRA never powering down (last_lost=0x0 on every 16 sleep).
  2. Already fixed in source (d1953fa), only needs the build: the MMSYS DCM call (0011 overlay hash) and the DMA unmask readback field.
  3. INFRA power-down: after 1, read y2_infra/state last_lost; if still 0, find the remaining requester (SRCLKENA, PCM R13 0xe8060000 bits, MD_MASK 0x38 = 3).
  4. PMIC golden: 15/44 rows differ (0x04e, 0x102, 0x108, 0x10e, 0x120, 0x212, 0x216, 0x21c, 0x230, 0x256, 0x310, 0x508, 0x70c, 0x776, 0x778). Map each to its regulator (MT6323), adopt the stock suspend value with save/restore around sleep, like golden-apply-policy.h. Do not touch AUXADC trims (battery readings).
  5. Remaining SoC golden rows (11): bus DCM at entry (TOPCKGEN+0x004, stock bus_dcm_enable writes 0x8f), CLK_CFG_4, AP_PLL_CON1/CON2 (decode first), MAINPLL/AXI only if the drain demands it. Deliberate exceptions stay: console UART mux and gate, PMIC_WRAP, PERI DCMDBC (Y2 stock code).
  6. Other stock suspend hooks: panel deep standby (lcm_suspend 0xc04a24f4 table), VEMC3V3 off and the VGP2 DAC rail in suspend, pmic_early_suspend (VREF18/AUXADC), PMIC BAT_L interrupt instead of the 30-min timer wake.
  7. Faster wake (owner request 2026-10-12, no deep-sleep trade-off): the screen stays dark 2–3 s after Power. 16's 16:08 wake: kernel_resumed 16:08:33 → restoring_radios 16:08:33 → complete_result_0 16:08:35, so the SoC is back in ≲1 s and most of the dark time waits for the Wi-Fi/Bluetooth restore before the UI gets the screen. First measure the morning wake with millisecond kernel-log timestamps (PM resume, SPM exit, device resume, DIS power-on/DSI modeset, panel, backlight, radio restore). Then, ordered by expected gain: (a) screen first, radios restored in the background (≈1.5–2 s; stock Android does this), (b) backlight as soon as the pipeline is up with Reborn's last frame, (c) panel deep standby (lcm_suspend, also item 6), (d) DIS domain costs only milliseconds. Owner wants this; nothing changed yet.
  8. Later: DRAM MEMPLL high→low at screen-off (awake-dark only), software Restart leaves the panel dark (known since 11).

Rules (unchanged): read-only first, archive before anything; live register writes only with the owner's OK (the harness also needs a /permissions approval for building/loading a probe module; a loaded probe taints the kernel and blocks sleep until a hold-Power restart); never software-restart; scope-audit entry before source changes; after editing a kernel patch, update its result_sha256 in kernel/patches/manifest.json (test_overlay_hashes); builds as in 16 (build.py --output out/power-final-17-build --owner-firmware out/deep-sleep-final/owner-firmware, system_update.py --build … --base out/y2linux-platform-v1-power-final-candidate-16 --fallback-rootfs …/Y2ROOT.img, then validate/check_elf/check_installed_arm/privacy/release_inventory and the container suite); commit with the Luca identity, no attribution.

START HERE (2026-10-12 evening): POWER-FINAL-16 SEALED = 15 + stock sleep parity work (REA), awaiting the OWNER FLASH. Package out/y2linux-platform-v1-power-final-candidate-16/ (fallback = 15), receipts out/deep-sleep-final/build16-receipts/, build commit a4e9c3b on main (not pushed), docs 8ce5c5c. BOOTIMG 2f1cd1c0…debf, Y2ROOT bd4a12a0…3d9f. Container suite 676/exit 0. Flash BOOTIMG + ANDROID only with MT6582_preserve_data_scatter.txt, Download Only. What changed (ledger docs/knowledge/stock-suspend-re-ledger.md, audit "POWER-FINAL-16 stock sleep-parity scope audit"): Defect B DMA-unmask re-arm (dma_unmask_rearms/lost/intr_before/after in the y2-usb status); Defect C (SDP always stock 450 mA; sleep allowed with an idle, unconfigured cable); DIS power domain (screen-off and sleep); stock boot DCM; golden sleep entry (PLLs/muxes/PERI+INFRA gates, exact restore); read-only PMIC golden and MD-side request capture; stock fuel-gauge profile (percentages jump up: 3.8 V is now 54 %, not 45 %); kmsg fix; 8 MiB journal. First checks after the flash, in this order: (1) display at boot, then screen off and on 5× (DIS domain; dis_offs/dis_ons in /sys/devices/platform/10006000.power-controller/state); a dark panel after screen-on = DIS problem: hold Power, then over SSH write {"dis_pdn": false} to /data/system/platform/power-features.json and restart, or flash fallback/. (2) state shows dcm_result=0, golden_apply=0xf, dis_pdn=1; /run/y2/power-features.json. (3) audio, Bluetooth, Wi-Fi, MTP, SSH. (4) one unplugged 35-min sleep, then cable in: USB must work (Defect B); read dma_unmask_lost and dma_intr_before. (5) golden now entry_differences well below 26; pmic_golden 44 rows; extra MD1 rows. (6) overnight drain against 15's ≈10 mA (stock curve). If sleep hangs or wakes break: set {"golden_apply": 0} (or bisect 1/2/4/8) in the power-features file over SSH after a hold-Power restart; it applies at the next application_ready. 2026-10-12 18:20, first 16 results: display domain 5/5 off/on, 35-min sleep clean, USB worked after the wake (first time since 13; unmask was NOT lost, 0000ff00, so the cause of the fix is still open), SoC golden 26→11, PMIC golden 15/44 differ. Live MD1 test passed (ledger F11): AP may write PERICFG 0x20/0x28, gating all 26 bits leaves the AP untouched. The probe tainted the kernel (sleep refused until a hold-Power restart). Left for 17: MD1 gating at boot (proven writable), PMIC golden writes (from pmic_golden), DRAM MEMPLL at screen-off (no deep-sleep effect), MAINPLL/AXI.

START HERE (2026-10-12, for 16): 15 IS FLASHED AND WORKS; ITS OVERNIGHT SLEEP TEST IS READ (Step 1 below): SLEEP CLEAN, DEFECT B REPRODUCED. Goal of 16: deep suspend and resume 100 % working, and the stock golden-master table completed.

Where things are. Device runs POWER-FINAL-15 (boot e2952adf, kernel 6.18.56-y2linux-platform-v1-power-final-15, Buildroot 2026.08, Python 3.15, OpenSSL 4.0.3, Mesa 26.2.4). The owner confirmed display, audio, Bluetooth, Wi-Fi and MTP after the flash (first check: archive out/deep-sleep-final/evidence/20261012/107-power15-first-check/). Package out/y2linux-platform-v1-power-final-candidate-15/ (fallback = 14). Code: published as main and tag baseline-15 in both repositories (2026-10-12); work on 16 continues on main. Device SSH: ssh -F /dev/null -o HostKeyAlias=y2linux-production-v1 -i ~/.ssh/y2linux_ed25519 [email protected]; lease flock -n /tmp/y2-platform-v1-device.lock; Wi-Fi address 192.168.123.136 (ping only, SSH is USB-only). Device and host clocks agree now.

Step 1 — DONE 2026-10-12 08:38: 15 overnight sleep read. Archive out/deep-sleep-final/evidence/20261012/108-power15-sleep-return/ (captured after the owner's hold-Power restart; device now on boot bbea610d, uptime 21 s at capture, taint 0). Rows of boot e2952adf in extracted/data/system/platform/sleep-diagnostics.jsonl and power-journal.jsonl.

  • Sleep: clean. Suspend 01:03:19 → final wake 08:35:21 (7 h 32 min); 16 entries / 16 resumes / 0 aborts / 0 failures (15 maintenance timer wakes wake=0x1 every 1800 s, last wake 0x20 by the owner); vproc_sleep, phy_savecurrent, wheel_sleep 16/16 without failures (wheel wake_retries=32, 2 per wake, as on 14). Still unchanged: INFRA last_lost=0x0, pdn0 0x2fcfbfd->0x2fcfbfd on every restore (no real INFRA power-down); golden entry_differences=26 (same rows as 14).
  • Drain: 87 % (01:33, first value after the post-charge surface reading of 100 %) → 76 % (08:34), ≈ 1.6 points/h, voltage-derived (filtered 4046 → 3980 mV). 12/13 baseline ≈ 2.2 points/h.
  • Defect B reproduced, identical to 14. Cable unplugged 01:03:09 (stage 8). Replug 08:36:40: charger BC1.1 SDP, Y2USB stage=5 → reconnect armed → stage=6, UDC configured, usb0 up with 10.42.0.1, umtprd and dropbear running. RX keeps counting (PIO: rx_packets 114763 → 114828), TX frozen at tx_packets 224162 / tx_bytes 321055510, dma_aborts 6 → 12 (30 s follow-up) → 18 (unplug). Host side: cdc_ether up, host TX 36 packets, RX 0, ARP for 10.42.0.1 FAILED; Wi-Fi ping to 192.168.123.136 answered (device alive). After the wake the charger sat in phase=INHIBITED, charge_limit_ua=70000, "Not charging" (consequence to re-check once USB works).
  • Diagnostics gap: y2-usb status only reads the low byte of MUSB+0x200 (kernel/platform/usb.c:573, f.dma_intr=readb(b+0x200)), so the unmask bits 24..31 are not visible yet; the out_path summary has no TX-DMA counters. First 16 task (Track A.1 below) stands unchanged.
  • Discriminator still open: neither 14 nor 15 rows contain an unplug → replug without sleep in between. Cheap owner test, no device writes: screen on (no suspend), unplug, wait ~15 s, replug, check SSH. Works → Defect B is sleep-specific (supports the lost-unmask theory); fails → it is the stage 5 → 6 reconnect path itself (compare y2_usb_reconnect() vs y2_usb_register(), Track A.2).

Track A — resume 100 %.

  1. Defect B (USB dead after every wake), root-cause lead. 14's records (archive 106): after the wake USB is configured, usb0 up with its address, MTP/SSH running; RX keeps counting (PIO), TX is frozen; the controller programmed transmit DMA (dma_tx_programs − dma_irqs = 2) whose completion interrupt never came; dma_aborts 6 → 12. Receive uses PIO (rx_dma=0), transmit uses Inventra DMA. Hypothesis: the MUSB DMA-interrupt unmask (register MUSB base + 0x200, bits 24..31) is written exactly once, in y2_musb_dma creation (kernel/platform/usb.c: writel(0xff0000ff, base + 0x200); upstream drivers/usb/musb/mediatek.c also writes DMA_INTR_STATUS_MSK | DMA_INTR_UNMASK_SET_MSK once at init). If the MAC loses it in SPM sleep, DMA completions stay masked forever. y2_musb_enable rewrites L1INTM (15 with DMA) on reconnect but never 0x200; y2_musb_clear_stale only W1C-clears the low byte. Verify read-only first: add dma_intr32 (full 32-bit read of 0x200, plus the eight channel CNTL/ADDR/COUNT at 0x204+16n, L1INTS/L1INTM 0xa0/0xa4 and TXCSR of the ECM/MTP IN endpoints) to the y2-usb status attribute and to sleep_diagnostics.usb_net; expect bits 24..31 set before sleep and 0 after the wake. Fix (16): when y2_usb_dma_active, re-write the unmask (0xff000000, plus W1C of the sampled low byte) in y2_musb_enable() and/or y2_musb_after_restore(), with a host test in the style of tests/test_usb_*. Fallback experiment only with owner consent (a live sysfs write): one night with echo 0 > /sys/bus/platform/drivers/y2-usb/*/phy_savecurrent to rule out 13's PHY save-current. Note 12 showed Defect B once before PHY save-current existed.
  2. After the wake the reconnect ran only stages 5 → 6 (first plug-in after boot runs 1 → 6). Check y2_usb_reconnect() against y2_usb_register(): anything the full path programs that SPM sleep can reset (DMA unmask above, FIFO layout is rechecked in musb_start).
  3. INFRA never really powers down: every 14 restore says lost=0x0, pdn0 0x2fcfbfd->0x2fcfbfd. The stock state needs INFRA off. Check the SPM PCM flags / CC_DISABLE_INFRA_PWR, PWR_STATUS bit 6 during sleep, and what the stock slp_infra_pdn path does that we don't (out/deep-sleep-final/vendor-suspend-source/ is gone; re-extract from evidence-private/20260908-ram-map/fm-decompressed.bin + fm-symbols.json).
  4. Still open: software Restart leaves the panel dark (11; never investigated — do not software-restart); new on 15: Exception ignored while flushing sys.stdout: OSError EINVAL from y2-platform boot-stage (S03y2-platform) and cpu-idle-policy (S05y2-cpu-idle), whose output goes to /dev/kmsg (Python 3.15; only log text lost; fix by line-sized writes or logging through syslog); panel logs Skipping unprepare of already unprepared panel at every screen-off on 15 (wake works; check whether DRM now disables the pipeline at screen-off, which would also be the awake-dark power win).

Track B — complete the golden master. Source: the Y2's own stock FM kernel (evidence-private/20260908-ram-map/fm-decompressed.bin, base 0xc0008000, fm-symbols.json); data docs/validation/data/y2-stock-suspend-golden-20261011.json; capture cat /sys/devices/platform/10006000.power-controller/golden (also stored in each kernel_resumed row). 14 at sleep entry: 26 of 34 SoC rows differ (value&mask vs stock):

  • Clock muxes: TOPCKGEN+0x004 (e=0, stock 0x80), CLK_CFG_0..4 (mux power-down bits not set at entry; stock sets them).
  • PLLs on at entry (stock: off, hardware-controlled): MAINPLL_CON0 0x79000101, UNIVPLL_CON0 0xfd000001, MMPLL_CON0 0x111, MSDCPLL_CON0 0x121, MSDCPLL_PWR_CON0 0x80000001 (stock 2 = off + isolated), VENCPLL_CON0 0xa121 (stock off); AP_PLL_CON1 0xcc01c0 (stock 0), AP_PLL_CON2 4 (stock 0).
  • INFRA/PERI clock gates and DCM: INFRA_PDN_STA 0xb0a0 vs stock 0x80bfe6 (most INFRA clocks still ungated), INFRACFG+0x010/0x014/0x050/0x054/0x058 (bus DCM), PERI_PDN0_STA 0x2fcfbfd vs 0x2feffff, PERI_PDN0_MD1_STA 0 vs all-gated, PERICFG+0x050/0x054 (peri DCM).
  • DRAMC+0x1dc (self-refresh/power-down bits), MCUSYS+0x05c.

Already matching: CLK_SCP_CFG_0/1, AP_PLL_CON3 hardware-control bits (0x780000), TOPCKGEN+0x00c, INFRACFG+0x008. Plan: rank by risk; implement one group per candidate with a run-time switch and an A/B night each, read-only capture before/after. Lowest risk: INFRA/PERI clock gates of unused blocks and PERI MD1 gating; then bus/peri DCM; then CLK_CFG mux power-down at entry; then PLL software-off at entry (MSDC/MM/VENC first, MAIN/UNIV last, they feed the CPU/bus) with hardware control; DRAMC last. PMIC golden (44 rows, mt6323_power_gs_suspend_data; 55 of 80 stock init fields differed on 12): re-run the read-only PMIC comparison on 15 (tools/development/power-session/suspend-probe.py, arm-suspend-probe.py, tools/development/analyze-suspend-probe.py — arming writes a probe on the device: owner consent first). Stock hooks not yet adopted: VEMC3V3 off in suspend, VGP2/DAC rail, panel deep standby (lcm_suspend), AUXADC hardware mode + VREF18 off, PMIC BAT_L interrupt instead of timer wakes.

Suggested order for 16: (1) read 15's sleep done (Step 1); ask the owner for the replug-without-sleep discriminator; (2) Defect B diagnostics + unmask fix + tests; (3) INFRA power-down investigation; (4) the Python/kmsg logging fix; (5) first low-risk golden group; build 16, then a sleep test with USB after the wake and an overnight drain (12/13 baseline ≈ 2.2 points/h, voltage-derived; a current meter (PPK2 class) would make this a real number). Rules: read-only first, archive before anything; no live register or sysfs writes without the owner's OK; never software-restart; commit with the Luca identity via env vars, no attribution; scope-audit entry in docs/planning/roadmap-gap-audit.md before source changes (AGENTS.md); builds: python3 tools/production/build.py --output out/<b> --owner-firmware out/deep-sleep-final/owner-firmware (existing folder: --resume kernel), package with system_update.py --base out/y2linux-platform-v1-power-final-candidate-15.

START HERE (2026-10-12): POWER-FINAL-15 SEALED = 14 on the newest release of every component, awaiting the OWNER FLASH. Package out/y2linux-platform-v1-power-final-candidate-15/ (fallback = sealed 14), symbols …-15-symbols/, receipts out/deep-sleep-final/build15-receipts/; branches power-final-15 in both repositories (not pushed; main stays Baseline 13). BOOTIMG 86dc957a…844d, Y2ROOT 0b14b794…20ae. Linux 6.18.56, Buildroot 2026.08, Bootlin 2026.08-1 (GCC 15.3), Alpine 3.24.2/LLVM 22.1.3 sandbox, Rust 1.99. First checks after the flash: display (the GC9503V panel now sets prepare_prev_first, because 6.18.y reverted the DSI host's pre_enable_prev_first; Mesa 26 loads Lima from libgallium-26.2.4.so), then audio, Bluetooth (BlueZ 5.87 on GLib 2.90/D-Bus 1.16), Wi-Fi (wpa_supplicant on OpenSSL 4.0), SSH/SFTP (OpenSSH 10.6 sftp-server), MTP. If the panel stays dark: hold Power 10 s, then flash fallback/ (14). After that, the 14 sleep test (diagnostics rows in sleep-diagnostics.jsonl). 14 itself was flashed but its sleep test never ran (the owner asked for 15 in between). Build notes for later candidates: the kernel tree stays .cache/sources/linux-6.18 with linux-6.18.archive-sha256; the old 6.18.0 tree is kept as .cache/sources/linux-6.18.replaced-unknown and the old Alpine sandbox as .cache/environment-alpine-3.22.1-retired (both can be deleted). build.py needs --resume kernel on an existing output folder. BUILDING.md still describes the baseline-13 tag; update it (Rust 1.99, Buildroot 2026.08) when 15 is published.

START HERE (2026-10-11 late): POWER-FINAL-14 SEALED = 13 + persistent sleep/USB diagnostics, awaiting the OWNER FLASH. Package out/y2linux-platform-v1-power-final-candidate-14/ (fallback = sealed 13), symbols …-14-symbols/, receipts out/deep-sleep-final/build14-receipts/, branch power-final-14 (build commit 9d06ac4, not pushed). BOOTIMG 273dc927…3e5a, Y2ROOT 78203697…14b9. Flash BOOTIMG + ANDROID only, Download Only. Why: Defect B recurred on 13 at 20:56. Enumeration at 20:56:19, a host-side reset at 20:56:25, then 0 bytes; MTP returned no storage either. Host-side note: Wine winedevice.exe (Battle.net, since 19:51) and KDE kiod6 both had the device's usbfs node open. Wine was not running at the 18:39 failure, though. The Y2's old Wi-Fi address 192.168.123.136 answered ping (unconfirmed identity); SSH is usb0-only by design. After the owner flashes: read-only check, then one unplugged sleep of at least 35 min, Power, cable in. If USB is dead: wait 2 min, hold-Power restart, then read the previous boot's rows: /data/system/platform/sleep-diagnostics.jsonl (stages + usb_reason udc_change/udc_follow_up, features, usb_net, kernel_tail) and power-journal.jsonl (usb_net). Next decisions: the Defect B fix (A/B with phy_savecurrent off is the first suspect; needs owner consent for the sysfs write) and the golden-based power step. Afterwards, a separate update milestone: kernel 6.18.0 to 6.18.56, Buildroot 2025.02 (line ended) to 2026.02 LTS, then Mesa.

START HERE (2026-10-11 night): 13's FIRST SLEEP WORKED; USB DEAD AFTER THE WAKE (Defect B); BASELINE 13 PUBLISHED. Archive out/deep-sleep-final/evidence/20261011/104-power13-first-sleep-coldstart-archive/ (101-103 are failed SSH attempts with error output only). Sleep: host 15:17:30 to 18:39:33, 12,104 s suspended, 7 kernel suspends, 6 clean 1800 s maintenance wakes, Power wake, complete_result_0, 76% to 76% (4.036 V to about 4.007 V). Device clock on boot 604bc0e6 = host minus 37.9 min. Defect B on a clean wake: enumeration 5 s after the wake (host 18:39:38), udc configured, detached=0, stage=6 in suspend-last.json, yet the host got 0 bytes (no ARP) for 3 min. The owner powered off (shutdown_execute 18:42:29 host), then offline charging, then a cold boot 8cdde856 (taint 0, healthy). The in-memory counters (vproc/phy/wheel/infra/golden entry) were lost, and the night's syslog was not persisted past start-up. Next time USB is dead after a wake: do NOT restart. Wait, replug once, try Wi-Fi SSH if associated, and read the counters first. Then investigate the device side of Defect B (usb0 link/IP, ECM TX path after resume_noirq with the new PHY save-current; A/B with phy_savecurrent off). Published: origin/main of both repositories = Baseline 13 (13 source + tests + package.py --stock packaging fix + README/BUILDING/INSTALL), tag baseline-13. The plan below (overnight drain, golden entry diff for 14) is unchanged.

START HERE (2026-10-11 evening): POWER-FINAL-13 IS FLASHED AND HEALTHY — the first sleep test on 13 is next. First check archived read-only: out/deep-sleep-final/evidence/20261011/100-power13-first-check/ (capture-return.py). Boot 604bc0e6-c8d6-48bb-a963-6d884787b088, kernel 6.18.0-y2linux-platform-v1-power-final-13, build 47c1cf2, taint 0, pm_async 0, charging at 4.085 V, ~80 s uptime at the check. No sleep has happened yet: all counters 0. Verified: /sys/module/pwrap/parameters/vproc_sleep = Y (vproc_sleep_state stage=not_attempted, sleep_uv=850000; CPU DVFS still software_VOSEL at 0x21e, prepared=1); lp_sel applied=1 on VA/VIO28/VUSB/VM/VIO18/VMC/VMCH/VEMC3V3 (dmesg 10.7 s, CID 0x2023); y2-usb/*/phy_savecurrent enabled=1; wheel /sys/bus/i2c/devices/0-0051/sleep enabled=1 firmware=1 method=sleep_command (dmesg "firmware 1: suspend uses sleep command"); SPM mode=SPM_CPU_SHUTDOWN_INFRA_PDN maintenance_seconds=1800; y2_infra/state saves=0. dmesg has no new errors (only the known mmc_erase/thermal_zone1/mt6323-led lines). The old 12 guard file (pending:true, 12 identity) is still on /data but is ignored by 13 (identity mismatch). Golden, awake read (now column; entry column empty until the first sleep): matches stock: CLK_SCP_CFG_0/1 (0x3ff/0x11), APMIXED+0x00c = 0x780000 (PLL hardware-control bits already set), +0x018, +0x024. Differs: MAINPLL_CON0 0x79000101, UNIVPLL_CON0 0xfd000001, MMPLL_CON0 0x111, MSDCPLL_CON0 0x121 (all software-enabled; stock expects 0 at sleep entry), MSDCPLL_PWR_CON0 0x80000001 (powered; stock 2 = off+isolated), VENCPLL_CON0 0xa121 enabled (stock off), AP_PLL_CON1 0xcc01c0 (stock 0), AP_PLL_CON2 4, INFRA_PDN_STA 0xa0a0 and PERI_PDN0_STA 0x2ecf3fd (more infra/peri clocks ungated than stock), INFRA/PERI DCM fields (0x010/0x014/0x050/0x054/0x058, PERI 0x050/0x054) not the stock DCM setup, CLK_CFG mux power-down bits clear (expected awake). The ENTRY capture after a real sleep decides 14; likely candidates: VENCPLL/MSDCPLL/MMPLL off before sleep, AP_PLL_CON1 and the stock bus/infra/peri DCM. Next session, in order: (1) owner: music paused, unplug, screen times out, wait >= 35 min (one 30-min maintenance wake), press Power once; check Home, wheel scroll, BT reconnect, USB/SSH on replug. (2) Take the lease flock -n /tmp/y2-platform-v1-device.lock, archive with python3 out/deep-sleep-final/capture-return.py out/deep-sleep-final/evidence/<date>/<n>-power13-... BEFORE anything else. (3) Read vproc_sleep_state (entries == restores, failures 0), phy_savecurrent (saves == restores, mismatches 0, last_skip), wheel sleep (sleeps == wakes, failures 0), y2_infra/state (restores>0 and last_lost => INFRA really powers down), golden (entry column, entry_differences), suspend-last.json, power-journal.jsonl, pstore. (4) Overnight unplugged drain vs 12's ~2.2 points/h. (5) If a feature misbehaves, switch only it off (echo 0 > ..., commands in the 13 OWNER-HANDOFF.md) and A/B the next night. (6) Plan 14 from the golden entry diff (PLL/DCM/clock gates), then the awake-dark display pipeline (Reborn blanks only the backlight). Open items (not addressed by 13): (a) PLLs at sleep entry: correction to the earlier "Y2 never set up PLL hardware control": the awake read shows the AP_PLL_CON3 hardware-control bits already at the stock value 0x780000; what differs is that MAIN/UNIV/MM/MSDC PLL are software-enabled, MSDCPLL powered and VENCPLL on (stock: all off at entry), plus AP_PLL_CON1 and the bus/infra/peri DCM setup; confirm with the golden ENTRY column, then 14. (b) Screen-off keeps the display pipeline running (Reborn writes only bl_power; awake-dark ≈4.9 points/h). (c) eMMC supply (VEMC3V3) stays on in sleep (stock removes it; 13 only sets LP_SEL). (d) Software-restart dead panel (found on 11: flip_done timed out after a warm reboot) is uninvestigated; never software-restart until it is. Also open: VGP2/DAC rail, panel deep-standby table, PMIC BAT_L wake instead of timer wakes, 12 Defect B (USB no traffic after the stuck state, not reproduced). Full 13 detail: block below and docs/validation/Y2-PLATFORM-V1-POWER-FINAL-13.md. Never software-restart (dead panel); no live register writes without owner consent.

LATEST (2026-10-11 afternoon): POWER-FINAL-13 SEALED = 12 + stock suspend power parity — awaiting the OWNER FLASH. Package out/y2linux-platform-v1-power-final-candidate-13/ (fallback = sealed 12), symbols …-13-symbols/, receipts out/deep-sleep-final/build13-receipts/, worktrees /home/luca/Dokumente/Code/worktrees/platform-v1-power-final-13/{Y2Linux,Y2Reborn}, branch codex/platform-v1-power-final-13 (Linux build commit 47c1cf225dc140d151366f9e6309a3a07556fa67, later test-only commit; Reborn 71ddb0d unchanged). BOOTIMG f73c24da3abe5978f2c234bd9501a929415fc156fc5ab79ebc7755390dddc178, Y2ROOT e62cb6c7bab621e6f791359e5b56bba3a21f065d2ba864f4917b3ae808c01915; kernel -power-final-13, root v1.43, release .13. Flash BOOTIMG + ANDROID only, Download Only. Full report: docs/validation/Y2-PLATFORM-V1-POWER-FINAL-13.md. Second 12 return (archive 98, read-only): the Defect A guard survived the owner's restart: product-sleep-guard.json stayed pending (night boot 11f3bfa9, matched by build identity only), so boot 09ce553a refused every sleep for 4.2 h (301 sleep_recovery_required), screen dark, 78% to 56% (≈4.9 points/h awake-dark vs ≈2.2 asleep). Correction to the entry below: it was NOT "until reboot". Cause of Defect A: the Bluetooth reconnect daemon holds /run/y2/bt-operation.lock after a wake. Defect B did not reproduce (SSH worked in the same stuck state). Golden master = the Y2's own stock FM kernel (evidence-private/20260908-ram-map/fm-decompressed.bin): stock PMIC_INIT_SETTING_V1 (80 writes, 55 differ on 12, archive 99), mt6323/mt6582_power_gs_suspend_data, and stock hooks tpd_suspend (wheel sleep; this unit reg6=0x01), usb_phy_savecurrent, pmic_mt6323_suspend, cs43131_early_suspend, lcm_suspend. Data: docs/validation/data/y2-stock-suspend-golden-20261011.json (13 branch). 13 changes (all run-time switchable): radio quiesce retry + guard only after kernel entry; VPROC 0.85 V sleep voltage inside ->enter() only (/sys/module/pwrap/parameters/vproc_sleep, vproc_sleep_state); LP_SEL on VMC/VMCH/VEMC3V3 (/sys/firmware/y2_pmic/lp_sel); USB PHY save-current in noirq (y2-usb/*/phy_savecurrent); wheel sleep/reset (/sys/bus/i2c/devices/*-0051/sleep); maintenance wake 1800 s; read-only golden on 10006000.power-controller. After the owner flashes (read-only first): identity/taint; wheel, USB, BT work; then one unplugged sleep ≥ 35 min and read: vproc_sleep_state (entries = restores, failures 0), phy_savecurrent (saves = restores, mismatches 0), wheel sleep (sleeps = wakes), y2_infra/state (restores>0?), golden (which stock SoC rows still differ: PLL software enables, AP_PLL_CON3 hardware control, CLK_SCP_CFG, INFRA/PERI gates). Then an overnight drain vs 12's ≈2.2 points/h. Next candidate (14) is decided from golden: most likely PLL hardware control (the stock table expects MAIN/UNIV/MM/MSDC PLL software enable 0 at sleep entry) and the DIS/MMSYS domain. Not done: eMMC supply removal, VGP2, panel deep standby, PMIC BAT_L interrupt, awake-dark display pipeline (Reborn blanks only the backlight). Never software-restart (dead panel); no live register writes without consent.

OVERNIGHT RESULT ON POWER-FINAL-12 (2026-10-11 morning) — START HERE. Archive (read-only copies): out/deep-sleep-final/evidence/20261011/97-power12-overnight-return/ (power-journal.jsonl, power-journal.previous.jsonl, suspend-last.json, system.log.0; the night's syslog was NOT persisted past 23:46, pstore was empty after the hold-Power reset). Night boot 11f3bfa9…; the owner restarted at the end, now boot f3b6f6d3… (kernel -12, taint 0, pm_async 0, no sleep since). Device clock = host UTC minus about 33 min. Worked: synchronous device suspend. 34 kernel suspends 23:48-05:19 (device time), 33 clean 10-min maintenance wakes, suspended 99.6% of the time, no stall, no reset. Drain 91% to 79% in 5.5 h, about 2.2 points/h (4.074 to 3.995 V), the same as 05 (2.1-2.2), so infra_pdn=1 (06) and LP_SEL (05) did not visibly lower the floor. One night only. Defect A (candidate 13): owner woke it with Power at 05:26:48 (wake_reason=power); a second sleep request 9 s later failed in y2-radio ... off-runtime (sleep_service_failed:y2-radio, product_failure within 1 s). Suspect y2-platform bluetooth-power off (tools/platform/y2_platform/bt_control.py: returns platform_bluetooth_operation_in_progress if the lock is held, else bluetoothctl power off) racing the Bluetooth on-runtime restore of the previous wake. The first sleep at 23:48 with the same radio state worked. Because the kernel was never entered the result is 1 and product_sleep.py (end of the run function) leaves the guard pending, so ALL sleep is refused (sleep_recovery_required, 80 refusals) until reboot; the device stayed awake with a dark screen 05:27-06:53 (about 6.7 points/h, 78% to 69%). Fix ideas: serialize/retry the radio quiesce with the BT lock and a settle wait, and clear the guard when kernel_completed is false and the radios were restored. Defect B: in that stuck state the USB gadget re-enumerated on cable reconnect (0525:a4aa, host interface up) but the host received 0 bytes, no ping or SSH, until the owner restarted. Cause not investigated (suspend-last.json usb_restore: configured=0 monitor_parked=1 detached=1, udc "not attached"). Open question: the owner reports the UI showed 100% instead of about 69%. The platform journal never exceeded 98% after unplug and Reborn displays platform.battery.percent as given (Y2Reborn/crates/reborn-platform/src/power.rs), so the cause is unknown. Ask the owner WHERE and WHEN (status icon, battery screen, right after waking, after replugging) before guessing; check whether Reborn keeps a stale value when the status record is older than 5 s (fresh_record). Is 2.2 points/h good? No, it is high (assessment, not measured: general experience says a few mA deep-sleep floor, roughly 0.1-0.5 points/h; 2.2 points/h is about 45 h standby). Capacity is unknown and there is no current sensor, so no mA claim. The voltage-derived percent is unreliable on the flat part of the curve. Golden PMIC table (vendor mt6323_power_gs_suspend_data) is still mostly open. Data on the 05 branch: git show codex/platform-v1-power-final-05:docs/validation/data/y2-pmic-suspend-golden-vs-awake-20261008.json and docs/validation/Y2-PLATFORM-V1-SUSPEND-POWER-OPTIMIZATION.md (§21 ranking). 17 differences at suspend entry on 05 (22 before LP_SEL); no PMIC commit exists between 05 and 12. Not done: LP_SEL on VMC/VMCH/VEMC3V3 (blocked earlier by the safety classifier), VEMC3V3 off in suspend (high risk, patch 0029 retains it), VPROC/VSYS sleep-voltage enables (0x212 0x216 0x21c 0x230 0x256 0x310, conflicts with software DVFS), VUSB still on with the cable out, VGP2 on, clock/OSC bits 0x776/0x778. Done: LP_SEL on VA/VIO28/VUSB/VM/VIO18, vendor 597-word pcm_suspend (byte-identical). infra_pdn=1 is armed (/sys/firmware/y2_infra/mode = powerdown) but NO evidence yet that INFRA really loses power. The suspend-entry comparison was NOT re-run on 12. Plan for the next session, in order:

  1. (Read-only, no flash) Owner unplugs, screen times out, leave 15-20 min (do not press Power twice within seconds of a wake: that triggers Defect A). Then read /sys/firmware/y2_infra/state: restores>0 and last_lost non-zero means INFRA really powers down; restores=0 after real sleeps means it never does (explains the unchanged floor). Take the device lease flock -n /tmp/y2-platform-v1-device.lock, ssh helper: ssh -F /dev/null -o HostKeyAlias=y2linux-production-v1 -i ~/.ssh/y2linux_ed25519 [email protected].
  2. Re-run the suspend-entry PMIC comparison on 12 with the 05-branch tools tools/development/power-session/{suspend-probe,arm-suspend-probe}.py and tools/development/analyze-suspend-probe.py. This writes on the device (arms a probe): say what will run and get the owner's go-ahead first.
  3. Get a real number: an inline µA-resolution meter (PPK2 class) on the battery lead; the top-up integral from a USB meter is only an approximation.
  4. Candidate 13 = Defect A fix (+ Defect B investigation), then the low-risk golden items one at a time (VMC/VMCH LP_SEL, VUSB), high-risk ones (VEMC3V3, VPROC/VSYS) only with an A/B plan and owner approval. Never software-restart (dead panel finding), no live register writes without consent. Nothing in this entry is committed.

STATE (2026-10-11 late night): POWER-FINAL-12 IS FLASHED AND RUNNING; the owner starts the overnight unplugged drain/sleep test now. Nothing was touched on the device after the last read-only check. Verified read-only before the test (boot 11f3bfa9-11cf-4be8-9fdd-cc37fd90c07e, ~10-20 min uptime): kernel 6.18.0-y2linux-platform-v1-power-final-12, taint 0, /sys/power/pm_async = 0. The charger Full state works: status=4 full=1 at 4.088 V about 5 min after boot, a cable re-seat restarted the cycle, then Full again (hold at 4.175 V, 4.093 V after 60 s); BAT0/status = Full, /run/y2/power.json percent = 100, voltage 4.089 V. Wi-Fi state was not changed by me. Device clock is ~2.5 h behind the host (device 2026-10-10 23:43 = host 2026-10-11 02:16); convert when matching logs. Owner unplugs with music paused and lets the screen time out by itself. Morning, in this order (read-only first, archive before anything else):

  1. Device lease flock -n /tmp/y2-platform-v1-device.lock, then /tmp/dssh.sh (ssh -F /dev/null -o HostKeyAlias=y2linux-production-v1 -i ~/.ssh/y2linux_ed25519 [email protected]). Ask the owner for: unplug time, Power-press time, battery shown, whether it woke to Home (if the screen was dead: hold Power 10 s; that is the known display finding).
  2. Did it reboot? uptime, boot id (was 11f3bfa9…), /data/system/platform/suspend-last.json, power-journal.jsonl / power-journal.previous.jsonl, /sys/firmware/y2_pm/{previous,devices_previous,reset_status}, /sys/fs/pstore/console-ramoops-0 (look for Y2_DPM_STALL: with pm_async=0 any new stall should show a real blocked driver, not only dpm_wait_fn), /data/system/platform/retained/boot-*.tar.
  3. Sleep result: same boot with SPM sleep and wake reason = sync suspend worked (still only one night; the stall was intermittent, 469 s and 1 h passed before). Battery: start 100% / ~4.09 V Full; read BAT0/voltage_now, /run/y2/power.json percent, charger dmesg lines. Expect the percentage to slide from 100 toward the curve (~94% at 4.09 V) at 1%/min after unplugging; the Full latch only holds while the charger reports Full.
  4. After replugging: the charger should return to Full within minutes (hold at 4.175 V, rest >= 4.07 V for 60 s); if it keeps flipping Charging/Not charging, the 4.07 V threshold margin (about 20 mV) is too tight and Y2_FULL_REST_UV in kernel/platform/charger-policy.h needs re-measuring.

Unchanged / do not do: no software Restart (dead panel finding, still open); no live register writes; display-recovery files in the main repo are untracked and not part of 12. Next candidate (13) is only needed if the night shows a new defect; a stall with a named blocked driver is the key finding.

LATEST (2026-10-11 night): POWER-FINAL-12 SEALED = 11 + synchronous device suspend + a real Full state — awaiting the OWNER FLASH. Package out/y2linux-platform-v1-power-final-candidate-12/ (fallback = sealed 11), symbols …-12-symbols/, receipts out/deep-sleep-final/build12-receipts/, worktrees /home/luca/Dokumente/Code/worktrees/platform-v1-power-final-12/{Y2Linux,Y2Reborn}, branch codex/platform-v1-power-final-12 (Linux 21f2c86084068b8b71841b2edaa6872dc9037762; Reborn tree aa10a9f8… unchanged). BOOTIMG f33fac4ddeb14888395fab1e33f1837b4cb20b86b6feecedbe8f925a33ab0dc8, Y2ROOT 215892b5a2e5cacc8172da01a92dd0cf9dd5f720944d1585ba7be1417ade90d1; kernel -power-final-12, root v1.42, release .12. Flash BOOTIMG + ANDROID only, Download Only. Why: 11's unplugged sleep (23:07) stalled again: the retained Y2_DPM_STALL dump (pstore console-ramoops-0) shows only python3 and one async worker in dpm_wait_fn, nothing blocked in a driver, so the wheel disable_irq theory is not supported (wheel unchanged; I2C bus numbers swap between boots). 12 turns async device suspend off (overlay 0067). Unproven: needs repeated sleeps. Charger log: stops at 4.175 V loaded, rests 4.09-4.10 V, the 4.11 V recharge rule restarted it every ~70 s with full=0 all day. 12: Full when the hold rests ≥ 4.07 V for 60 s, refill below 4.00 V, UI 100% on Full (≥ 4.0 V). Pack is charged no higher than before. After flashing: plugged in, BAT0/status should reach Full within minutes; then repeated unplug sleeps (read suspend-last.json, /sys/firmware/y2_pm/devices_previous, pstore). Software Restart still unsafe (dead panel, not addressed). The uncommitted display-recovery files in the main repo were deliberately left out of 12. Note: the Y2Reborn repo history was rewritten by git filter-branch at ~01:48 on 2026-10-11 (not by this work); tips keep identical trees (11 was abbb2038…, now 71ddb0d…). Verdict: IMPLEMENTATION_READY_PHYSICAL_NOT_RUN.

NEW FINDING (2026-10-11): a software reboot (y2-platform shutdown reboot, so also the service-menu Restart and update reboots) left the panel dead on candidate 11 three times in a row (kernel mediatek-drm: flip_done timed out, vblank wait timed out; Reborn graphics presentation -16; reborn-splash never exits; boot_reason=4). A cold start or reflash recovers. Not caused by the screen-capture tool. Untested on 09/10. Do not software-reboot the device until investigated. The owner is also about to test deep sleep unplugged; watch for the same display failure on resume. Screen capture over SSH works (y2-screen-stream, kept on the device in /data/system/capture/; method in memory y2-software-reboot-display-failure). Measured ceilings (11): eMMC HS200 read 113 / write 30 MiB/s, SD SDR104 read 86 / write 26 MiB/s, Wi-Fi 2.4 GHz TCP 33-43 Mbit/s, MTP 10-11 up / 38 down MB/s (on 09).

LATEST (2026-10-11): POWER-FINAL-11 SEALED = 10 + the remaining screens — awaiting the OWNER FLASH. Package out/y2linux-platform-v1-power-final-candidate-11/ (fallback = sealed 10), symbols …-11-symbols/, receipts out/deep-sleep-final/build11-receipts/, worktrees /home/luca/Dokumente/Code/worktrees/platform-v1-power-final-10/{Y2Linux,Y2Reborn}, branch codex/platform-v1-power-final-11 (Linux 5741d161699582d5a2696c658c7ede05c712a6ae, Reborn 0.3.0 abbb2038dc392c520d76ce6e5a2747a68578252b). BOOTIMG 1482316d69e470c7625ea5805dbb4e17172ebebad2ecfb9f205c43b155f2ee08, Y2ROOT 4773d90d11213c5f676dd9f9027a809bf04a635164947bb3e6670f738515d73c; root v1.41, release .11. Flash BOOTIMG + ANDROID only, Download Only. New in 11: computer connection/copying screens, Bluetooth pairing card + failure dialog, update-download/scanning rings, battery-low dialog, SD removed / songs added toasts, crossfade icon, and the rescue charger's display redrawn (tools/production/offline-charge.c + generated tools/graphics/offline-charge-art.h; no percentage/time-to-full by design). 10 was flashed by the owner and is running (2026-10-10 night; media cleared; Sun Killer on the SD). After flashing 11 check: offline charging screen (player off + charger, Power hold still starts), computer screen with a real PC, pairing flow, then read-only identity/taint/Reborn RSS. Verdict: IMPLEMENTATION_READY_PHYSICAL_NOT_RUN.

PREVIOUS (2026-10-10 night): POWER-FINAL-10 SEALED = 09 + Reborn Product UI v3 — awaiting the OWNER FLASH. Package out/y2linux-platform-v1-power-final-candidate-10/ (fallback = sealed 09), symbols …-10-symbols/, receipts out/deep-sleep-final/build10-receipts/, worktrees /home/luca/Dokumente/Code/worktrees/platform-v1-power-final-10/{Y2Linux,Y2Reborn}, branch codex/platform-v1-power-final-10 (Linux build commit 04aa8f92080fba6cdefa4f73b5c7ca81d5c5bdaa, later test-only a08ad79; Reborn 0.3.0 f31c94c5775aee855589392447ba56ff1bf892ab). BOOTIMG 9d1f00a528f14824bef9eae5e65c4bd9cca00f38fc440e038c52e2cd67ecf0ca, Y2ROOT 77a41a333ca27e9092dbafa37dc3f8da87ec6810c81398fa2258a1c116eafe16; kernel -power-final-10, root v1.40, release .10. Flash BOOTIMG + ANDROID only, Download Only. New in 10: the whole Reborn UI (Open Sans, cover accent + thumbnails with a disk cache in /data/reborn/cache, bare volume line, option icons, hold-to-turn-off ring, flatter Settings, service menu = 7 taps on Version, new startup/failure screens and shutdown animation). Tools: Y2Reborn/tools/preview/{render_previews,gles_compare}.py, tools/assets/build_ui_assets.py. After the flash (read-only first): identity/taint, Reborn RSS and CPU, /data/reborn/cache growth, then the owner's visual review (startup bar, shutdown, covers, scroll speed). Not implemented from the design: auto "Connected to a computer" screen, charging screen with display off, update download ring, Bluetooth pairing progress card. Still open: 06's first power-down cycle, the unexplained first-boot failure after the 08 flash, high-current charging qualification. Verdict: IMPLEMENTATION_READY_PHYSICAL_NOT_RUN; readiness MORE_WORK_REQUIRED.

PREVIOUS (2026-10-10 night): POWER-FINAL-09 SEALED = 08 + MTP internal-root fix — awaiting the OWNER FLASH. Package out/y2linux-platform-v1-power-final-candidate-09/ (fallback = sealed 08), symbols …-09-symbols/, receipts out/deep-sleep-final/build09-receipts/, Linux 9d9d5c454d1eb7cfa461955dad522f5b890f3bf9 (branch codex/platform-v1-power-final-08), Reborn ac5502e. BOOTIMG 0dabbfabce27f6d33c139136e2df2c1cef08ed6ce89da1f5143aebe0b3de2077, Y2ROOT 0225ff37ef1668111f7ce2d2579ddda8b2f22d06761f5d1c7054649b00d9d28c. Container suite 630 PASS. 08 was flashed by the owner and is healthy. Y2Media was provisioned on the device (ext4 Y2MEDIA, 5.3 GB at /media/internal, 42 music files migrated and verified, originals removed). Defect found: the MTP responder patches hard-coded /data/music, so Internal Storage was listed but never pinned (fixed in 09 + test). Open: the first boot after the 08 flash showed "Could not start / Restart the player"; the second boot worked; the failed boot left no trace (never reached the userspace journal). After flashing 09: check MTP on both storages, Reborn on /media/internal/music (needs the flash reboot), and 06's first power-down cycle is still unrun.

LATEST (2026-10-10 evening): POWER-FINAL-08 SEALED — the one cumulative image (06 + 07 + 08); awaiting the OWNER FLASH (agent has not flashed or provisioned). Package out/y2linux-platform-v1-power-final-candidate-08/ (OWNER-HANDOFF.md, VALIDATION-REPORT.md, fallback/ = sealed 07), symbols …-candidate-08-symbols/, receipts out/deep-sleep-final/build08-receipts/, worktrees /home/luca/Dokumente/Code/worktrees/platform-v1-power-final-08/{Y2Linux,Y2Reborn}, branch codex/platform-v1-power-final-08 (Linux build commit d9fd5a7b57927fc22b4d62d9ee49a8e03c3cb170, later tests/docs c65080d, 32a9d13; Reborn ac5502ea96f4d85a9cdbb32f210d46e658430abd). BOOTIMG ad39788aa61303633d875ee4ff30068faa87ef5778496f31ec768144b449efb1, Y2ROOT e79bac968b559e19332a54dafa00566a552e028c0ea86999b46f2e8424eec71a; kernel -power-final-08, root v1.38, release .8. New in 08: Y2Media = stock FAT p8 as ext4 Y2MEDIA at /media/internal (eMMC write guard extended by exactly that span, owner-approved); MTP Internal Storage = /media/internal/music; Reborn follows the platform Ready record (fallback /data/music); y2-media format --confirm-cid/grow, undersized report, recycled-mount-id marker fix, resize2fs. SD card was already reformatted live (125.7 GB over MTP). Backup of the stock p8 files: out/deep-sleep-final/evidence/20261010/93-stock-fat-partition-backup/. Provisioning after the owner flashes (I run it, device idle): y2-platform internal-media provision --confirm-serial 3F93-07E6 (replaces only that stock FAT, migrates /data/music with hashes, removes originals only after verification), then reboot. Offline: container suite 629 PASS, 29 + 27 host PASS, package/ELF/ARM/privacy PASS, Reborn fmt/clippy/tests PASS; same 48 environment errors as 07 on the broad host run. Physical NOT_RUN. Still open: 06's first power-down cycle, MTP to Y2Media, library rescan after the root change, high-current charging (needs the cell rating). Verdict: IMPLEMENTATION_READY_PROVISIONING_PENDING; readiness MORE_WORK_REQUIRED.

LATEST (2026-10-10): POWER-FINAL-07 CHARGING CANDIDATE SEALED — awaiting the OWNER FLASH (agent has not flashed). 06 is flashed and healthy at first check (out/deep-sleep-final/evidence/20261010/90-power06-first-check/, boot bed8cebd, taint 0, Y2INFRA mode=powerdown fallback=0) but its first power-down cycle has NOT been run (battery was 8%, then charging). Package out/y2linux-platform-v1-power-final-candidate-07/ (own OWNER-HANDOFF.md, VALIDATION-REPORT.md, SHA256SUMS, fallback/ = sealed 06), symbols …-candidate-07-symbols/, receipts out/deep-sleep-final/build07-receipts/, worktrees /home/luca/Dokumente/Code/worktrees/platform-v1-power-final-07/{Y2Linux,Y2Reborn}, branch codex/platform-v1-power-final-07 (from 06 tip bd7e54d; build commit 551baad703b31c4fadfd0db96478481c0f5067bc, later docs b78e037, 017aa18), Reborn 97ff8c3 unchanged. Kernel 6.18.0-y2linux-platform-v1-power-final-07, root v1.37, release 1.0.0-platform-v1-power-final-candidate.7. BOOTIMG 65a1daf484bb54cde14f6dd4906bd9b6b72872213a9409b2ea1fdc3fd38a3001, Y2ROOT 83a61c1e73c5fa34acc7d6e9af707ac0fd54d20e1226da2ae278846ff6d19e66. What it is: 06 + the complete vendor charging policy. Verified stock CS_VTH table (16 steps, 0xc07572f8; 1200-1600 mA unprogrammable), stock per-source requests (0xc03a1d88: SDP 450, CDP 650, DCP 1100, nonstandard 1100, Apple 800, unknown 70), one decision function (kernel/platform/charge-limits.h), PMIC-die derating 60/70/80/90 C, read-only diagnostics incl. an unvalidated ISENSE charger-path estimate. Default owner ceiling stays 650 mA; nonstandard stays 70 mA; PC SDP never above 450 mA. Why: no cell charge rating, no pack NTC, no independent current measurement (page docs/knowledge/charging-current-policy.md). Raising the ceiling is root-only, volatile, logged; owner ramp tool tools/development/power-session/charge-qualify.py (restores 650 mA always). Offline: container suite 598 cases PASS, 29 packaging-host + 27 splash PASS, package/ELF/installed-ARM/privacy PASS, same 48 host-environment errors as the 06 baseline. Physical: NOT_RUN (incl. MTP/eMMC/SD while charging, PC<->wall switching, thermal ladder). Next (owner flashes): same SP Flash Tool steps as 06 (BOOTIMG+ANDROID only). Then: read-only check (charging_state new fields, y2_infra state, gadget/MTP/mounts), PC charging + tools/usb/qualify.py MTP matrix while charging, wall charger re-classification without reboot, and ONLY THEN consider charge-qualify.py ramp on an attended wall charger. Still open from before: 06's first power-down cycle (needs a charged battery). Verdict: IMPLEMENTATION_READY_HIGH_CURRENT_QUALIFICATION_PENDING; readiness MORE_WORK_REQUIRED. Open questions that need the owner: the pack label/charge rating (open the device or manufacturer data), and whether to rebase the charging commits onto 05 if 06 fails its power-down cycle. Working-tree note: the untracked diagnostics from the 06 note remain untracked by design.

LATEST (2026-10-09 evening): POWER-FINAL-06 BRING-UP CANDIDATE SEALED — awaiting the OWNER FLASH (agent has not flashed). Package out/y2linux-platform-v1-power-final-candidate-06/ (own OWNER-HANDOFF.md, SHA256SUMS, validation/, fallback/ = sealed 05), symbols …-candidate-06-symbols/, frozen worktrees /home/luca/Dokumente/Code/worktrees/y2-power-final-06/{Y2Linux,Y2Reborn} (Linux c1ef37a6f6338b3abe7fcb4f2aa505b6fb861075, Reborn 97ff8c3 unchanged), dev branch codex/platform-v1-power-final-06 (worktree …/worktrees/platform-v1-power-final-06/Y2Linux, later commits: probe pin a2fe9a7, test fixture a9f9b0e, report bd7e54d), receipts out/deep-sleep-final/build06-receipts/. Kernel 6.18.0-y2linux-platform-v1-power-final-06, root v1.36, release 1.0.0-platform-v1-power-final-candidate.6. BOOTIMG (7260160 B) 64a916282b383116fb5d323fe60f5fbf638ae966291ce20827617fd23147869f, Y2ROOT e1c0bcd3dc200c3fa2179d65ab18ba1358c46fc4b6fe0b2740f7f44f6c23e4be. BRING-UP, NOT PRODUCTION; physical NOT_RUN. Owner-approved plan: bring-up first, then production cleanup/refactor and a clean rebuild AFTER hardware qualification.

  • Correction: Y2Linux already ran the vendor 597-word pcm_suspend (identical words, SHA-256 0ee71194…6ab94); the 05 report/handoff "480-word dpidle" was the runtime-idle line (fixed on the 06 branch). Stock slp_infra_pdn defaults to 1

    (0xc09b1084 = 01 01 01 00 in evidence-private/20260908-ram-map/fm-decompressed.bin, base 0xc0008000, symbols fm-symbols.json; retained extraction: out/deep-sleep-final/vendor-suspend-source/stock-infra-pdn/). Our difference was infra_pdn=0.

  • 06 changes: infra_pdn=1 arm + CLK_CON readback; PERICFG save/verify-restore right after cpu_suspend() (kernel/platform/infra-pdn*.{h,c}, manual 2.3.2: INFRACFG+PERICFG are in the powered-down domain; PDN0 resets to 0); INFRACFG read-only;

    automatic retained-mode fallback on any unverifiable restore (-EIO, SPM broken, product guard) and INFRA_PDN_ENTRY journal stage (previous boot died inside the attempt => retained next boot); owner switch /sys/firmware/y2_infra/{mode,state,diff}; UART SLEEP_EN re-armed on resume (overlay 0061); MUSB L1INTM keeps only bits 0..3 and masks unowned PHY level bits (kernel/usb/l1.h); terminal USB stop PARKS the controller (no platform_device_unregister).

  • Defect 2 root cause (new): the 05 Oops was the usb0 ECM netdev's dangling dev.parent (stack bytes "usb0") after the 01:34 terminal USB stop unregistered musb-hdrc; first ip after the radios came back crashed. Not wlan0.
  • Offline qualification: full container suite 581 cases PASS (at a9f9b0e; first run at c1ef37a stopped at a stale USB fixture — tests.sh aborts at the first failing module), 25 packaging-host + 27 splash PASS, preserving package/validate/ELF 384/1411/installed-ARM/privacy PASS, new strings present in the Image.
  • Idle evidence (archive 89, read-only, 05 image, 9 h): 95.6% in SPM sleep, 51 maintenance wakes, no USB overflow, no Oops (single run), about 2.2 points/h voltage-derived (data docs/validation/data/y2-power05-idle9h-20261009.json).
  • Next (owner flashes): SP Flash Tool Download Only, 06 folder scatter, BOOTIMG+ANDROID only. Then I run out/deep-sleep-final/image06-readonly-health.py <dir> (read-only; archive with capture-return.py first on any return), check dmesg | grep Y2INFRA, /sys/firmware/y2_infra/state, then ONE normal

    unplugged cycle. Success signature: same boot, Y2INFRA: restore result=0 ... pdn0 <saved>-><0x0>, restore_failures=0, fallback=0. last_lost=0 after a long sleep means INFRA did NOT power down (check CC_DISABLE_INFRA_PWR, PWR_STATUS bit 6). Failure: ~30 s backstop reset or no wake (hold Power 10 s); next boot says previous_boot_died_in_infra_pdn; archive first, then echo retained > /sys/firmware/y2_infra/mode to compare with 05. Then repeated cycles, USB cable wake, Wi-Fi/BT restore, overnight vs 05's about 2.1 points/h.

  • Remaining PMIC sleep-config differences vs the vendor golden table (17 entries, e.g. VEMC3V3, VPROC/VSYS sleep voltage, LP_SEL on storage rails) are NOT in 06; each needs separate design/approval. A USB meter gives a top-up integral only (report §31).
  • Working-tree note: kernel/platform/ovl-reset.h, tests/fixtures/ovl-recovery.c, tests/test_ovl_recovery.py, tools/development/power-session/{deepsleep-device-wait.py,y2-display-observe.c,y2-display-recover.c,y2-pm-device-stack.c} remain untracked diagnostic sources by design (do not ship).

LATEST (2026-10-09 morning): 05 OVERNIGHT RESULT — suspend works, two NEW defects. Archive out/deep-sleep-final/evidence/20261009/88-power05-overnight-return/ (read-only, under the host lease), data y2-power05-overnight-20261009.json. Boot 3cae62f2, taint 0, image 05 unchanged. 88a-accidental-unlocked-readonly-capture/ is a stray duplicate (capture-return.py has no argparse: --help became the output dir; read-only, no device change). Time bases: journal wall time is CEST; /data/logs/system.log stamps are UTC (+2 h); use boottime_s.

  • Result: owner unplugged; suspend entry 23:03:21 CEST (boottime 3804.9), owner Power-button wake 09:40:36 (boottime 42039.5). 38,052.5 s suspended of 38,234.6 s (99.5%),

    64 cycles, 63 maintenance wakes (600 s), resume result 0 in 2.2 s. SOC 88% (4.084 V) → 66% (3.93 V), ≈2.1 points/h (03 night ≈5.5/h). Voltage-derived, no current sensor, non-linear curve: indicative only, NOT a drain measurement. Final wake is wake=0x20 (same code as the earlier USB wakes, here a Power press): the product label unknown is not specific.

  • Defect 1 — USB dies terminally with no cable (01:34:01 CEST). Y2USB IRQ overflow: l1=800/f00 usb=0/0 tx=0/0 rx=0/0 on the resume from a maintenance wake, then

    Y2USB stopped stage=8 result=-75; detached=1 gadget_state=0 reconnect_retries=0 irq_max_burst=513>512 irq_unexplained=512. The guard is terminal (kernel/usb/fault.h, kernel/platform/usb.c ~688). Sleep kept working 8 more hours (49 later suspends), but at the owner's reconnect there was no enumeration, no 10.42.0.1, charger "Not charging". Reboot cleared it. Earlier occurrences were under loaded USB; this is the first with no traffic (L1 bit 0x800, no MUSB sub-status, on resume).

  • Defect 2 — kernel Oops at Wi-Fi restore (09:40:38 CEST). NULL deref in strlen ← nla_put_string ← rtnl_fill_ifinfo ← rtnl_getlink (Comm ip, pid 4183) right after

    wlan0 registered. Register r5=0x38 = IFLA_PARENT_DEV_NAME, so dev_name(wlan0->dev.parent) looks NULL (inferred, not confirmed in source). First full radio restore after a long sleep. From 09:40:48 all sleep attempts were refused kernel_sleep_unavailable (4 refusals); link to the Oops is unverified (the USB fault cannot be the cause).

  • After: owner orderly shutdown 09:49:21, new boot 65d3b0c9, taint 0, SSH/USB healthy, product guard pending:false. lp_sel is still set (not cleared). Nothing deployed/changed.
  • Next (not started, owner decides): (a) source fix for a recoverable USB guard (unexplained-IRQ burst on resume → controller reset/rebind instead of a permanent latch) with a

    regression test; (b) find why wlan0's parent device has no name when ip link runs right after registration (y2-mt6582-wifi glue), regression test; (c) re-check whether the kernel_sleep_unavailable refusals follow from the Oops (system.log.0 after 07:40:38 UTC, product sleep helper); (d) both bugs exist in 05 only as far as tested — compare 04/03 logs for earlier Y2USB IRQ overflow; (e) still open from before: Power/RTC wake and early boot on 05, A/B with lp_sel cleared, optional USB-meter measurement, then the pcm_suspend (06) decision. A fix needs a new candidate (06); do not flash or deploy without the owner. Readiness stays MORE_WORK_REQUIRED.

LATEST (end of 2026-10-08): POWER-FINAL-05 is INSTALLED (owner flashed; archives 82–84 verified). Folder out/y2linux-platform-v1-power-final-candidate-05/ (own OWNER-HANDOFF.md, SHA256SUMS), symbols …-candidate-05-symbols/, worktrees /home/luca/Dokumente/Code/worktrees/y2-power-final-05/, receipts out/deep-sleep-final/build05-receipts/. Linux 837b6146ee4d0f551b69cfaddd686a69ce56a060 (branch codex/platform-v1-power-final-05, based on 04), Reborn 97ff8c3 unchanged, kernel 6.18.0-y2linux-platform-v1-power-final-05, root v1.35, release 1.0.0-platform-v1-power-final-candidate.5. BOOTIMG (7256064 B) 0137a855db96d8f94005333941495c4fdaa2f81c9eb653458b77e9c0fd044117, Y2ROOT 9175185fd577b759302337cc8d17f678fde3dc621525b90d45cf6cb370e99a4d; fallback/ = sealed 04. Change vs 04 (only): vendor PMIC_INIT_SETTING_V1 LP_SEL (bit 0) on VA 0x404, VIO28 0x500, VUSB 0x502, VM 0x552, VIO18 0x556, applied ~10 s after boot (E2 only, readback verified), PMIC write whitelist extended by exactly those bits, runtime revert /sys/firmware/y2_pmic/lp_sel (root; echo 0 clears, echo 1 sets). The bits live in the PMIC and survive reboot: echo 0 before flashing 04 back. A beyond-vendor storage-rail switch (VMC/VMCH/VEMC3V3) was NOT included (blocked by the safety classifier). No power benefit is claimed: there is no on-device current sensor, capacity is unknown, SOC is voltage-derived. Evidence on 05: first check clean (boot 3cae62f2, taint 0, lp_sel applied=1, golden differences 25→20 awake). Suspend probe run (archives 85–87): 1573.4 s suspended, 2 maintenance wakes, SPM 3/3, aborts 0, golden differences at suspend entry 22→17, SD rails off across suspend, connectivity rails off, VEMC3V3/VUSB/VGP2 on. Full analysis, rail map (measured PMIC state), vendor-source comparison and candidate ranking live in docs/validation/Y2-PLATFORM-V1-SUSPEND-POWER-OPTIMIZATION.md on branch codex/platform-v1-power-final-05 (worktree /home/luca/Dokumente/Code/worktrees/platform-v1-power-final-05/Y2Linux), with data docs/validation/data/y2-suspend-power-optimization-20261008.json, y2-pmic-suspend-golden-vs-awake-20261008.json, y2-suspend-probe-analysis-20261008.json, and tools tools/development/power-session/{suspend-probe,arm-suspend-probe}.py, tools/development/analyze-suspend-probe.py. Key findings: (1) the maintenance wake is the SPM PCM timer, 600 s (vendor SPM_WAKE_PERIOD), 603 s cycle with ~3 s awake; (2) CORRECTED 2026-10-09: Y2Linux full suspend ALREADY runs the vendor 597-word pcm_suspend (byte-identical, SHA-256 0ee71194…6ab94; the "480-word dpidle" in earlier text was the runtime-idle line). The only difference from the vendor default (infra_pdn=1) is infra_pdn=false (CC_DISABLE_INFRA_PWR set) with no INFRA restore path (stock restores the console UART; PERICFG/INFRACFG are INFRASYS-MTCMOS blocks); (3) the vendor suspend golden PMIC table differs in 17 entries at suspend entry (VEMC3V3 on, VPROC/VSYS sleep-voltage enables, LP_SEL on VMC/VMCH/VEMC3V3, clock/OSC control); (4) radios and SD card are already off in suspend. Next (agreed with owner): overnight unplugged drain test on 05 (paused, screen dark; started from 88%/4.095 V, post-charge, probe stopped), archive with capture-return.py under the host lease before anything else; then Power-button and RTC wake and early-boot on 05; overnight A/B with lp_sel cleared; optional USB-meter top-up measurement (KWS-2303C class; verify mAh counter, D+/D- pass-through); then decide on pcm_suspend (06). Notes: never read /sys/power/wakeup_count or /proc/kmsg over SSH; the PWRAP write allowlist in kernel/platform/policy.h is a guarded safety control (widen only with explicit owner approval).

UPDATE (POWER-FINAL-05 built, awaiting owner flash): out/y2linux-platform-v1-power-final-candidate-05/ (Linux 837b614 on branch codex/platform-v1-power-final-05, worktrees y2-power-final-05). 04 + vendor LP_SEL on five LDOs with runtime revert /sys/firmware/y2_pmic/lp_sel; BOOTIMG 0137a855…44117, Y2ROOT 9175185f…99a4d. Full validation PASS; physical NOT_RUN; benefit unmeasured. Installed image is still 04 until the owner flashes. Suspend probe tools: tools/development/power-session/{suspend-probe,arm-suspend-probe}.py (power branch). Report: docs/validation/Y2-PLATFORM-V1-SUSPEND-POWER-OPTIMIZATION.md (power branch).

CURRENT STATE — read this first (updated end of 2026-10-08). Blocks below are chronological detail; where they conflict with this block, this block wins.

Installed image: DEEPSLEEP-FINAL-04 (owner flashed; archive68 verified read-only). Diagnostic successor to 03: Linux 5e267571d584da7fbe356d3161801ba15f87fa57 (code commit 5e26757), Reborn 97ff8c357bab12319087740d7c97b5051e6588f5 (unchanged), kernel 6.18.0-y2linux-platform-v1-deepsleep-final-04, root v1.34, release 1.0.0-platform-v1-deepsleep-final-candidate.4. BOOTIMG (7256064 B) 4738de48bea8a9970e89cc8d703c824ac3faec103ab2ed6989270816f9ace5f6, Y2ROOT (536870912 B) b0e667515971da65e1a48afb222248bf68e841bef9d015ad9669944c9bafc041. Owner folder out/y2linux-platform-v1-deepsleep-final-candidate-04/ (own OWNER-HANDOFF.md, SHA256SUMS, fallback/ = sealed 03), symbols …-candidate-04-symbols/, frozen worktrees /home/luca/Dokumente/Code/worktrees/y2-deepsleep-final-04/, receipts out/deep-sleep-final/build04-receipts/. 03 package, symbols, worktrees and all evidence are untouched.

What 04 changes vs 03 (diagnostics only, no behavioural fix intended): WAIT/LOCK retained-ring phases (9/10) around the silent steps of device_suspend() plus legacy-bus logging (overlay 0059), and a built-in device-phase stall sampler in pm-journal.c (4 s/12 s after a successful DPM_PREPARED: ring notes dpm_stall/S:/D:/dpm_blocked and stacks to the RAM console). git diff cfb7e09 5e26757 -- . ':!docs' is the complete non-doc difference. Because the extra records change timing, a clean 04 does NOT prove the stall is fixed; it could be hidden. A revert of only the per-device records is the test if 04 stays clean.

Why 03 failed (analysis, unchanged evidence): retained ring logs only devices with PM callbacks; every failure ends after a returned 11008000.i2c callback at DPM_PREPARED, so the stall is in an unrecorded wait (dpm_wait_for_subordinate, pm_runtime_barrier, device_lock, dpm_list_mtx, post-callback bookkeeping or the global async_synchronize_full()). Host chronology puts the reset ~30 s after the last callback (consistent with the 30 s RGU backstop; reset source unproven). No upstream 6.18.y fix matches. Both 03/02 stalls were ~400-460 s after boot; the 04 passes entered at 557 s and later (untested hypothesis).

Physical results on 04 (all owner-driven, no collector, normal automatic policy, nothing deployed to the device): trial 1 (archives 68-71): 469.27 s real SPM sleep, same boot. One-hour trial (archives 72-73): 3805.25 s suspended in ~3825 s, six 600 s maintenance wakes (dark, connectivity suspended) each re-entered, SPM boot totals 9/9 entries/resumes, aborts 0, restore failures 0, taint 0, ext4 errors 0, USB wake 0x20 labelled unknown by the product. Provisional pre-cable SOC 71%→69% (3.966→3.948 V; post-charge relaxation included): NOT a drain result. Data: docs/validation/data/y2-deepsleep04-trial1-20261008.json, …trial2-1h-20261008.json.

Early-boot test PASSED (archives 74-75, after the owner's reboot): new boot aae0ddb3, taint0; the product requested sleep at BOOTTIME35.6 and entered the kernel at 39.4 s (far earlier than the 03/02 stalls at ~400-460 s), slept 551.80 s (18081448 ticks), woke on the USB reconnect (0x20, label unknown), PM COMPLETE seq48, Reborn restored, ext4 errors0, 04 guard pending:false. A simple "too early after boot" trigger is therefore not supported by this sample; one pass cannot exclude it. Data: docs/validation/data/y2-deepsleep04-early-boot-20261008.json. Overnight drain test is next.

Next (agreed with owner): one owner reboot (early-boot test: unplug ~6 min after boot to probe the 400-460 s stall window), then an overnight unplugged drain test (paused, screen dark, no input; owner reports unplug/reconnect times; morning: archive with capture-return.py under flock -n /tmp/y2-platform-v1-device.lock BEFORE anything else, then image04-readonly-health.py <dir>). On a stall: do not restart, clear the (new, 04-identity) guard or repeat; connect USB; the ring/sampler notes resolve against the 04 System.map. Still open: stall rate, Power/RTC wake on 04, formal 30-min/2-h gates, overnight drain, warm-start display, user poweroff, cold-C3/electrical gaps. Collectors still pin the 03/02 identity and need a reviewed update before use (not needed for owner-driven trials). Never read /proc/kmsg over SSH (blocks). The 03 guard on /data (pending, 03 identity) is inert on 04.

Product direction discussed (not started): release builds should drop observer modules/dev collectors/verbose console and the heavy stall dump, keep the retained black box + 30 s suspend backstop, and replace the permanent post-failure guard with a bounded cooldown policy. Opt-in automatic error reporting is feasible (diagnostic exports exist; send after next boot over HTTPS, scrubbed, rate-limited, consent-gated) and is a later task after suspend is settled.

04 one-hour trial PASSED (archives 72-73): same boot 836f0b1d, taint0. Main sleep from BOOTTIME1364.1; six 600 s maintenance wakes (1965...4980 s), each dark with connectivity runtime-suspended, each re-entered; final USB wake at 5188.7. Product receipt: 7 cycles, 6 maintenance wakes, 3805.25 s suspended (99.5% of ~3825 s unplugged); SPM boot totals 9/9 entries/resumes, aborts0, restore failures0; ext4 errors0, pstore empty, Reborn restored. Provisional pre-cable SOC 71%->69%, 3.966->3.948 V (post-charge relaxation included; no pack current): NOT a drain result. A 1.2 s early entry/return at 1358.0 preceded the main entry (consistent with the unplug event); it also completed. Data: docs/validation/data/y2-deepsleep04-trial2-1h-20261008.json. Still open: stall rate unknown (nine clean entries on 04), early-boot hypothesis, Power/RTC wake, formal 30-min/2-h gates, overnight, display/poweroff gaps.

04 trial 1 PASSED (2026-10-08, archives 68-71): normal automatic policy, no collector, owner unplug ~16:15:30 UTC and USB re-plug. Same boot 836f0b1d, taint0; journal request BOOTTIME556.0, kernel suspend557.8, resumed1027.8 (USB wake 0x20, product label unknown). SPM entries/resumes0→1/1, aborts0, restore failures0, residence15376821 ticks=469.27 s, PM COMPLETE seq48/error0, Reborn restored, ext4 errors0, 04 guard pending:false. This is one passing cycle; it does not resolve the intermittent pre-SPM stall. New WAIT/LOCK records are overwritten by the resume tail on a pass and are only informative after a stall. Data: docs/validation/data/y2-deepsleep04-trial1-20261008.json. Observation to test (not a finding): both 03/02 stalls occurred ~400-460 s after boot; this pass entered at 557 s.

Latest: DEEPSLEEP-FINAL-04 diagnostic successor built and sealed — awaiting owner flash (2026-10-08). Owner folder out/y2linux-platform-v1-deepsleep-final-candidate-04/ (own OWNER-HANDOFF.md, SHA256SUMS verified); matching symbols …-candidate-04-symbols/; frozen paired worktrees /home/luca/Dokumente/Code/worktrees/y2-deepsleep-final-04/; receipts out/deep-sleep-final/build04-receipts/. Linux 5e267571d584da7fbe356d3161801ba15f87fa57, Reborn 97ff8c357bab12319087740d7c97b5051e6588f5 (unchanged), kernel 6.18.0-y2linux-platform-v1-deepsleep-final-04, root v1.34. BOOTIMG 4738de48bea8a9970e89cc8d703c824ac3faec103ab2ed6989270816f9ace5f6, Y2ROOT b0e667515971da65e1a48afb222248bf68e841bef9d015ad9669944c9bafc041. Preserving scatter identical to 03; Y2DATA unselected; fallback/ = sealed 03. Validation: container suite, 10 native packaging, 27 native splash, Reborn fmt/clippy/335 tests, QEMU, ELF closure 384/1411 all PASS; new stall records verified present in the kernel. Physical status NOT_RUN. 03's pending guard does not match 04's identity, so automatic sleep is admitted on 04; after install verify identity read-only, then one bounded normal-policy trial (to be reviewed with the owner). On a stall, retained ring ends at the last WAIT/LOCK record and/or dpm_stall/S:/D: notes (resolve wchan against the 04 System.map); preserve the new guard and archive before any reboot. Collectors still pin 03 and need a reviewed identity update. Docs here are uncommitted alongside the owner's earlier doc edits; code is committed as 5e26757.

**Previous: 2026-10-08 late local analysis — device-phase stall diagnostic prepared (source only; nothing built, flashed, deployed or run on hardware).** Reconciling archives 65/66 with the exact03 suspend/device PM code gives these findings:

Next concrete owner decision: approve building a **diagnostic successor (DEEPSLEEP-FINAL-04 source, not yet built)** and flashing BOOTIMG+Y2ROOT with the preserving scatter; then one bounded normal-policy trial on that image. Until a successor is installed, another unplugged wait on 03 cannot diagnose the stall (the guard refuses entry). The collectors pin the 03 identity and need an explicit reviewed identity update for the successor; do not weaken their gates.

Previous: 2026-10-08 evening read-only follow-up (archive67). The morning failure below remains the suspend blocker. At 17:00 CEST the installed03 Y2 was on boot ad0d5416-1a4a-453c-a008-704b3ae88ceb, taint0. The intervening 81dce40c boot ended with an orderly user-requested poweroff at approximately 09:55:39 CEST (journal shutdown_execute, pstore Power down), followed by the current boot about16 seconds later. Times are anchored to host capture and per-boot BOOTTIME; device wall time is unreliable. This is distinct from the earlier unclean pre-SPM reset. The pending guard still names failed boot 0132fb21 and exact03; it remains intact. Current boot SPM entries/resumes0/0, with421 journaled sleep_recovery_required refusals before cable return. BOOTTIME and MONOTONIC advance together; no whole-system sleep occurred during this seven-hour window.

On the current boot, the voltage-derived battery estimate was57%/3.862V at BOOTTIME5s and32%/3.736V at the last pre-cable journaled refusal (BOOTTIME25346s, about16:58 CEST). The hourly series falls through52,47,42,38, 36 and32%; it is not flat in the archived journal. After reconnection the live daemon reports Charging31%/3.830V at17:00 CEST. The 63% prior to orderly poweroff and57% just after boot are different-load provisional estimates, not six points of measured off-state use. Current, capacity and a calibrated SOC remain unavailable. Charging/CONSTANT_CURRENT reports fault/sample/stop/last errors0; 450000uA is the programmed ceiling, not measured current.

Read-only archive out/deep-sleep-final/evidence/20261008/67-image03-evening-return/ holds the first-return, retained pstore/PM, persistent logs, health check and summary and machine-readable follow-up. Exact03 executable/helper hashes still match archive65; Reborn is responsive and paused, PCM closed, no scan, Wi-Fi/BT off, ext4 errors/warnings0, USB configured. No test, policy change, guard clear, reboot or deployment was made. Continue investigating the pre-SPM device-phase failure before another unplugged endurance claim. Roadmap/audit remain MORE_WORK_REQUIRED.

**Earlier morning03 observation FAILED automatic suspend, then rebooted without owner intervention.** Read-only SSH archive out/deep-sleep-final/evidence/20261008/66-image03-morning-return/ contains the first-return, retained PM/pstore and persistent logs, subsequent health check, owner observation, analysis, battery timeline and SHA256 receipts. Read the overnight result and machine summary.

Next blocker is the recurring pre-SPM device-phase failure on exact03. This inspection did not reboot, clear the guard, deploy, build, flash or launch a trial. Controlled30-minute/two-hour/endurance acceptance and the independent display, poweroff, cold-C3/electrical gaps remain open. The audit and roadmap are refreshed without milestone promotion. Preserve all evidence and matching images/symbols. Pre-observation statements below that03 suspend was NOT_RUN or that the night had not started are superseded by this morning result.

Previous checkpoint — 03 installation sanity pass

**Owner-installed DEEPSLEEP-FINAL-03 passes the requested quick SSH installation check.** Archive out/deep-sleep-final/evidence/20261008/65-image03-first-check/ preserves the first-return, retained/persistent evidence, exact installed hashes and verification.json (18/18 checks). Boot 0132fb21-8462-4f77-9faf-3a7e7f1b8429, taint0, uptime182–278 seconds. Linuxcfb7e09 / Reborn97ff8c3 / rootv1.33 / kernel03 match the sealed package; running Reborn and all three changed Python helpers match the build byte-for-byte. Reborn presents a real first frame and responds to status. USB is configured; Charging/CONSTANT_CURRENT is observed with fault/sample/stop/last errors0 and SDP450000uA programmed ceiling. Subsequent HOLD/recharge samples are retained; no actual battery-current or full-charge measurement is claimed. All three ext4 error counters are0, playback paused, PCM closed, no scan, Wi-Fi/BT off.

Normal automatic sleep is built in. The synthetic USB budget supply has no wakeup source; physical cable and battery wake remain enabled. Operation locks are free, only Idle workload is leased, and old02's pending guard does not match 03's identity. No test/helper, RTC alarm or recovery backstop is armed. No device policy, service, firmware or guard was changed by this check. The host lease is released at the end of the check.

03 full suspend/endurance remain NOT_RUN: entries/resumes0 while USB is attached; admission correctly refuses active charging. A successful boot is not a suspend/resume qualification. The owner still intends an exploratory unplugged night. Leave playback paused and screen off; record actual unplug/entry time from owner/journal. No overnight start is yet recorded and no collector is armed. On morning reconnect, archive first before reboot or changes; compare boot ID, actual accumulated sleep, maintenance/other wakes and fresh voltage/SOC. Connected88% is provisional and is not an unplugged test endpoint. The missing controlled30-minute/two-hour gates and independent reliability defects remain. Cleanup is outside this task; preserve all evidence, sealed images and symbols.

Successor03 baseline — installed, quick check passed

Owner folder: /home/luca/Dokumente/Code/Y2Linux/out/y2linux-platform-v1-deepsleep-final-candidate-03/. Use its OWNER-HANDOFF.md, SHA256SUMS, manifest.json and preserving scatter. The unsuffixed …-candidate/ and explicit …-candidate-02/ still contain02; they were not overwritten. Matching03 symbols/build remain separately retained.

The source-bound BOOTIMG/Y2ROOT pair includes all committed production corrections described below, includingd43b592 and Linux/Reborn display readiness/retry changes. The source patch is not a claim that the independent warm-start display root cause is fixed. No failed or untracked display reset diagnostic goes into production. The first test-run dependency failure is preserved: native splash needs desktop libdrm/Pillow; cfb7e09 routes it to the required packaging-host pass. No test was dropped.

Owner uses Download Only, reloads03's MT6582_preserve_data_scatter.txt, and selects BOOTIMG + ANDROID/Y2ROOT only. Y2DATA and every other partition remain unselected. Boot USB-connected and verify exact image, charging, display, logs and boot ID before unplugging. The owner alone flashes; no agent flash.

Overnight intent: the owner wants the player unplugged for the rest of the night, with morning inspection. Save its actual start/stop times and fresh unplugged battery endpoint. Preserve retained/persistent evidence first on morning reconnect, before reboot or changes. Calculate real accumulated suspend, maintenance/other wakes, awake gaps, same-boot continuity, voltage and fresh SOC. An exploratory night does not retrospectively pass the interrupted30-minute or missing two-hour gates. Entry and endurance on03 are PHYSICAL_NOT_RUN despite the successful installation sanity check. No overnight collector/alarm is armed. Archive65 verifies that the old02-specific pending guard has a different identity and does not quarantine03. Historical02 overlay ledgers on Y2DATA remain evidence, not a claim that overlays were applied to03.

The existing clean/product collectors pin02 source identities and will refuse03. After fresh SSH verification, update their explicit accepted pair for a reviewed 03 trial; do not bypass boot/taint/source checks or reuse04/02 diagnostic modules. capture-return.py is read-only and can archive the new boot before that work.

Stopped for the day — archives62/63, interrupted endurance

If the owner has not installed03, verify02 identity, overlays and runtime wake setting before any mutation. Prefer the newly requested coherent03 installation over another live overlay. Its short normal-policy and full thirty-minute checks must precede acceptance of two hours/overnight. Sealed02 remains unchanged. The original independent reliability gaps remain open.

Latest physical result — normal automatic sleep PASS

Archive 59-product-usb-wake-return/, root3787, proves the narrow USB wake correction: named maintenance7356 refusal, releaseBOOTTIME3895.063, automatic kernel entry3916.070, one 203.051330566-second SPM return. RTC7→8, Power12→12, COMPLETE573, boot unchanged, taint0, Reborn restored, ext4 errors0. SPM totals8/8 with zero restore failures; total includes the earlier falsely reported53 return. No hidden retry/direct collector suspend call. USB reconnect transfers302MB and Charging works; all six physical wake owners remain enabled. This is qualified live-overlay/runtime-policy behavior, not unchanged sealed02 acceptance.

Immediate ADC4.086035→4.092187V includes recovery. Immediate resume SOC90 is still a pre-wake daemon sample; after-snapshot8.63s later has a fresh0.397s-old sample90%, ADC4.060327V with application awake. No short-test drain/target claim. Archive59 hashes: firstff64b9b0573ba305e252e4ecbdcb785f91b0d69b4a2019643a2536a4e1f4924b, retained5138336dda0076704d8f9db7bddcac4a5d7fa5f6ae2ae4c7448c655651ecb843, persistentada2ffd65ec837c9a7987ed5e2ee1fe1a10e8d41dd435c72be7b9b5ae842d736. The roadmap/gap audit retains the short-policy and thirty-minute gates; owner stopping for the day suspends further physical work until the next session.

Current live corrections — keep separate from sealed02

  1. Linux 0ba99f5ffbdc6af2dac6320d0b3256121642fb0c fixes buffered

    PM-command replay. /usr/lib/y2-platform/y2_platform/product_sleep.py SHA 72651d6f6366b7d58a8e80cac9e5681acb00ab4e7eb0315016ac4cc1789d72da. Archive54 and /data/logs/deepsleep-live-overlay-f567b2c3-2987/ retain original bytes and deployment receipt; /data/system/platform/deepsleep-live-overlay.json records it. Kernel/Reborn/image metadata unchanged. Real Python-I/O regressions pass on host and installed Python3.12.14; old code fails all3 error cases.

  2. Archive57 changes only /sys/class/power_supply/y2-usb-input/power/wakeup

    from enabled to disabled. This is the software gadget current-budget publisher. All six other PMIC/charger/Power/RTC/battery wake settings remain enabled. No current/voltage/protection/notification change. Persistent ledger /data/system/platform/deepsleep-runtime-policy.json; device evidence /data/logs/deepsleep-usb-budget-wake-f567b2c3-3773/. Runtime only; kernel source commit 9066f73 sets power_supply_config.no_wakeup_source=true, ARM USB compile PASS; archive59 physically confirms the causal correction. Do not claim that sealed02 contains it.

Archive53 FAILED product completion: named maintenance refusal and later auto request worked; buffered Python close replayed an EBUSY suspend, then reported that stale error after198.585602 seconds of same-boot RTC sleep. SPM7/7, RADIOS_RESTORING470, taint0; actual application restoration occurred but no successful product receipt. The local and installed-Python fixtures reproduce exactly two stores and the stale exception. Commit0ba99f5 fixes that bug.

Archive56 then exposes the underlying refusal without replay: three normal requests abort in device suspend with EBUSY, no new SPM entry (still7/7), same boot/taint0, final RADIOS_RESTORING524/DEVICES_RESUMING error−16. Only synthetic y2-usb-input suspend-check wake count increases2→8. pm_wakeup_irq is absent. MUSB PM calls set_power→power_supply_changed→pm_stay_awake on this synthetic supply. The explicit owner helper did not arm wakeup_count, so its passes did not cover this path. Archive57's narrow runtime change tests that cause. The old collector cleanup raced a final automatic refusal's guard clear; host retook both operation locks and restored quarantine before the new trial.

  1. 39290266a020782b7cb543048aefb33c3da68570 receipt/journal changes are

    now DEPLOYED, archive60, backup /data/logs/deepsleep-endurance-journal-f567b2c3-4870/.36 affected tests pass. suspend_record.py SHA97c8a6804c4dcacfddd0dbba4cca75780a0b8061c86123fa32fba7f56a47aa73; power_journal.py SHA57add62a7b97c9ef3055abfc94e2a24d8e8bdd2075f03b6bff9800a8c6d3e1b9. Keeps first entry ADC/timestamp across maintenance returns and completed endpoints at the existing event cadence. Both locks held, backups/ledger durable, no service restart, kernel/Reborn/firmware metadata unchanged. Existing power-daemon periodic rows still use its old imported logger; new product helpers use the updated event logger. No new polling timer.

The optional collector120-minute/8-hour modes require reviewed shorter success. Only30 minutes is admitted now. It captures a separate fresh battery-after sample; kernel-return receipt SOC may precede the battery daemon's next tick. The new03 image contains these corrections; owner installation is now pending.

Local-only maintenance correction prepared during trial61

d43b5923803d006122402aba65ee275d7f19ca13 is committed and included in03, NOT DEPLOYED to the still-installed02. Production currently reuses the wake-event count read before the2-second battery maintenance pause. A normal BAT0 notification in that interval invalidates it and unnecessarily restores the screen/radios instead of re-entering sleep. A real product-flow fixture with kernel wake-count comparison reproduces wake_event_in_progress on old code. Set the count toNone after maintenance so the next loop takes a fresh bounded read; preserve prior Power/RTC IRQ comparison and the atomic count-store guard. All27 affected tests pass, including Power/RTC during the gap and another event after the fresh read. Source SHA d83f140fb9b3670ae778864c39f61cfb64f5a1aa2279022eefec8e1f8c149dba. Receipt out/deep-sleep-final/maintenance-count-source-validation.json.

Trial61 remained on SHA72651d6f… and archive62 proves its first maintenance re-entry succeeded. It ended on the owner's USB reconnection, not this race. The old-source negative fixture still establishes the latent bug. Before any longer trial, record the backed-up overlay when deployed and qualify the corrected source; nothing was deployed after the owner's stop request. Do not weaken the collector's shorter/same-source evidence checks. No new candidate, raw hardware write or charging-policy change was made.

Read-only vendor comparison is saved at out/deep-sleep-final/vendor-suspend-source/. It confirms stock INFRA/DDRPHY collapse requires its additional UART restore path, whereas installed mode retains it. Existing stock poweroff extracts also show write-interface unlock, BBPU4309 and GPIO37 handling; installed callback uses4300. This is a sequence mismatch, not proof that changing one literal fixes poweroff. No pin/register experiment or source implementation was performed.

Confirmed clean progress

Archive 50-clean-cycles-return/ passes all five new real cycles on the same untainted boot: three short RTC, Power89.802795s, RTC305.200562s. Combined with47, 6/6 clean returns: Power2/2, RTC4/4, SPM6 entries/6 resumes, aborts and restore failures0, COMPLETE408. All RTC alarms auto-disarmed, no unexpected wake. Five-minute ADC4.057031→4.052416V (−4.615mV), provisionalSOC89→89; no claim of zero current or overnight target pass. Archive51 also proves live application sleep preparation refuses playback_active while playback continues, then PCM closes after pause. Volume and position restored.

Archive 47-clean-power-return/: installed02 passes all five PM stages, then a genuine same-boot Power return. SPM entries/resumes1/1, aborts/restore failures0, 1243558 ticks = 37.950378418 seconds, Power IRQ6→8 and RTC0→0, COMPLETE seq163, taint0. RTC fallback was still pending and explicitly cleared. Owner saw the normal player. Strict clean verdict passes.

Archive 48-clean-resume-health/: five-second playback advances to4969 ms, PCM hw_ptr216584, then PCM closes on pause. Volume/position restored. Both internal and SD storage pass262144-byte write/fsync/readback/hash, ext4 errors0. Wi-Fi is Online/COMPLETED by this check; the immediately returning health sample in47 caught it reconnecting. Do not mislabel that earlier sample all-servicesOK.

Archive42 previously proved the same built-in02 context path through all five stages plus RTC wake (24.529053 s) with a read-only stack observer/taint4096. This is diagnostic evidence, separate from clean47.

Installed image and sealed package

DEEPSLEEP-FINAL-02, release1.0.0-platform-v1-deepsleep-final-candidate.2, root2025.02.18-platform-v1.32, kernel6.18.0-y2linux-platform-v1-deepsleep-final-02. Linux 5a32683f1ae9493c6a37bd18af3d131afb04d450; Reborn 5a9f7586dd8d80ab5afc16c6a9a7e853e7469aeb. Owner installed it. It corrects01's missing inherited USB CCF clock claim. USB and charging work; 450000uA SDP ceiling is programmed policy, not measured battery current. Archive26 recovers01's saved diagnostic export and exact stage2/-EIO failure.

Sealed immutable owner folder out/y2linux-platform-v1-deepsleep-final-candidate-02/, identical canonical …-candidate/. Matching …-candidate-symbols/ retained.

No agent flash. Any successor is BOOTIMG/Y2ROOT only; owner installs preserving Y2DATA. The new03 package above supersedes02 for the requested next baseline; 02 remains the preserved prior package/fallback.

Unresolved failures — do not erase after a pass

  1. Intermittent device-phase wait: clean02 archive28b resets during devices,

    last retained DPM_PREPARED seq21, ring ends with successful I2C after codec/MMC. No outstanding callback/wait is identified. Passing observer captures show a transient UART/SRCU wait but do not establish the root cause. Clean47 now passes the same staged sequence; repeated reliability remains open.

  2. Warm-start display: service reboots after diagnostic boots reproduce

    vblank1/no progress and taint512 at~1.026s before modules (archives32/44). Owner hardware restart restores clean startup (38/45b). Active read-only archive36 shows OVL FSM0x100 (h_wait_w_rst), unchanged35 samples. Source display-readiness/retry fixes below do not fix that driver cause.

  3. Failed display recovery diagnostic: archive38 recovers successful KMS

    disable after31.015s and inactive snapshot, then no return from module call. First completed hardware operation is unknown. **Do not repeat y2-display-recover.ko**. No backstop was armed in that trial; that omission must not recur. kernel/platform/ovl-reset.h is not production-integrated.

  4. Original user-poweroff BBPU/panic defect remains separate and unresolved.
  5. Clean short RTC/Power and five-minute residence now pass narrowly. Product

    auto-sleep/inhibitors now pass narrowly with the recorded overlays; cold-battery C3,30/120-minute and overnight drain remain incomplete. SPM shuts CPUs down with infrastructure/DDRPHY retained; deepest electrical minimum is unknown. No measured current, battery-degradation finding or <=1% target pass exists.

Source branches and undeployed work

Both primary repositories: codex/platform-v1-deep-sleep-final. Frozen paired worktrees: /home/luca/Dokumente/Code/worktrees/y2-deepsleep-final/. Do not edit frozen production sources or upstream source cache.

Reborn 97ff8c357bab12319087740d7c97b5051e6588f5 is committed but **not deployed**: require first page-flip event before presentation, preserve failed buffers safely, one automatic context recreation per incident, wake retry. 335 workspace tests/fmt/strictClippy/ARM PASS, actual native regression fails on old source. Linux splash retry-handshake fix has27 native tests/ARM PASS, committed as f4d2774 but not deployed. Receipt out/deep-sleep-final/display-recovery-source-validation.json. No installed source metadata may be changed to imply these fixes are running.

Linux commits 9066f73, c73c581 and d43b592 record the USB wake correction, reviewed collectors and maintenance fix. The working tree also holds preserved untracked diagnostic sources; do not include the failed reset diagnostic in production. Existing Luca identity stays unchanged. No push, release promotion, remote issue closure or external messages.

Original overnight evidence and root correction

The initial image was POWER-FINAL-04, Linux5aeba051/Reborn8cd365d/rootv1.30, verified against newest04 handoff and manifests. Retained long boot74a4645d shows~6.72h screen-off, paused/radiosoff, no product auto-suspend policy. Cold-battery C3 was enabled but blocked by USB PERI bit10; observed C3 zero. Later voltage3.900146→3.403564V proves real depletion. Exact88% starting voltage and charge termination did not survive rotation; no88% UI cap exists. Owner later charged briefly and turned off; separate shutdown/panic logs are not proof of an overnight suspend attempt.

Original full-suspend post-thaw hang was localized to nested CPU/cluster PM saving masked GIC enables over core's original save. Removing that duplicate owner and replaying CIRQ after core restore is built into01/02. Matching04 context-suppression diagnostic proved14 same-boot returns. Its30-minute repeat accumulated1811.835s, four expected RTC wakes,4.050439→4.013964V; old SOC86→86 was invalid as drain evidence.02 fixes elapsed-time filtering usingBOOTTIME without changing the curve, limits or reported values to hide loss.

The full38-section validation report and standing audit contain detailed receipts/limitations. Raw archives/hashes stay under ignored out/deep-sleep-final/evidence/20261007/. All previous failed trials remain failures; #16/#27/#28/#29/#31/#32/#33/#34 remain open, historical#30 unchanged.

Historical 2026-10-06 handoff (superseded where noted above)

Three jobs. Do not start the cleanup before Job 0 is complete.

Job 1 and Job 2 are independent. If the owner has not flashed yet, start Job 2.

State of main right now (updated)

The working baseline is POWER-FINAL-04. main in both repos contains it: Linux main (compiled commit 5aeba05, later commits are docs only) and Reborn main 8cd365d. 04 = 03 + the 11 parallel branches merged with 03 winning every collision; the image is behaviourally identical to 03 (the merge added tools, tests and docs only), so 03 was never flashed and can be discarded. (Reborn's checked-out branch was switched from cpu-idle-completion to main; cpu-idle-completion is an ancestor and still exists). The earlier session's uncommitted main docs are preserved on branch wip/main-dirty-docs-2026-10-06 (commit 0f02caf) and as /home/luca/Dokumente/Code/Y2Linux-backups/main-dirty-2026-10-06/ (patch + untracked copies). Decide whether to merge those docs into the consolidated documentation (they describe the Baseline02 integration plan) or drop them.

Paste-ready prompt

Read /home/luca/Dokumente/Code/Y2Linux/docs/planning/NEXT-SESSION-HANDOFF.md completely
(it is on `main`), then re-verify Job 0, then do Job 2 (cleanup) and, once I confirm
POWER-FINAL-04 is installed, Job 1 (hardware validation). We work with 04, not 03.
Do not flash. Do not push. Preserve Git identity (Luca) via environment variables and add no
model attribution. Never delete anything listed under "Must not be lost".

Is 04 the newest image with every fix I proposed?

Yes, 04 is the newest image and contains every fix that was implemented, plus the integrated parallel branches. It was built from clean main commits, packaged, validated (515 production cases, 10 skips, 0 failures) and sealed. It has not been flashed; the device runs POWER-FINAL-02. The table below was written for 03; every row applies unchanged to 04. It is not "everything proposed": the table is exact.

ItemIn 04 (and 03)?Evidence
DAC idle bias off (rails drop when paused)yes (from 02)hardware PASS
Blocking connectivity supervisor + zombie reap fixyes (from 02)hardware PASS
Reborn calls /usr/sbin/y2-platform (Power "not available")yeshardware, via live symlink
Screen-off fallback when sleep refused (qualification, charger)yeshardware (qualification case), unit tests
Wi-Fi blocked at runtime after 5 dark idle minutes on batteryyesdecision function unit-tested; never run on hardware
Missing-AP scan backoff (autoscan exponential:2:120)yesruntime command measured live; supervisor code unit-tested
Post-thaw stall sampler, oops/panic notes, ramoopsyescompiles, DT/config validated; never run on hardware
Journal breadcrumbs + jiffies around codec railsyes (from 02)ran; showed the stall moved to filesystems_thaw
Slow the 20 ms polled navigation GPIO while darknoidea only; top steady wake source (27 ctx/s). Dark transport buttons need it; needs a decision
Bluetooth connected idle vs C3 (BTIF/APDMA also blocks C2/C3?)nounmeasured; test with headphones connected, dark, battery
Clear stale restore_failed sleep receipt from an earlier bootnopersists until the next request; cosmetic but wrong
FAST_PSP as Wi-Fi defaultno, rejectedblocks C3 either way; CAM stays default
Automatic paused-inactive full suspendnogated until a same-boot resume exists

Not yet done on hardware: Power wake, repeated suspend cycles, wall charging, missing Bluetooth peer, 2-hour idle, overnight. Full suspend still fails (see below). Verdict: MORE_WORK_REQUIRED.

Where everything is

WhatWhere
Source, Linuxmain in /home/luca/Dokumente/Code/Y2Linux, compiled 5aeba051c428451483402e5874dcf8222afca259 (later commits on main are docs only). The build clone out/power-final-documentation/Y2Linux is only a build vehicle
Source, Rebornmain in /home/luca/Dokumente/Code/Y2Reborn, compiled 8cd365da5f3454c8e3189df1434b966edbd06575
Sealed 04 package (flash this)out/y2linux-platform-v1-power-final-candidate-04/ release …candidate.4, build Y2LINUX-PLATFORM-V1-POWER-FINAL-04, kernel 6.18.0-y2linux-platform-v1-power-final-04, root 2025.02.18-platform-v1.30; BOOTIMG be0f4379531be4b8f94fd927adda18106fbad1a567665cb63d5807908095aea4, Y2ROOT 4fc765b931f85e0fee96c0b80c92592eca3a4f3f2a4e379d18abd71bc3978e64; fallback/ is the exact 02 pair (the image installed today). Superseded and discardable: candidate-03 (never flashed) and earlier
04 kernel symbolsout/y2linux-platform-v1-power-final-candidate-04-symbols/ (vmlinux, System.map, .config): needed to turn stall wchan numbers into function names
Installed on the device todayPOWER-FINAL-02 (79f0925f…b307 / 93c1bf99…f147), plus a live symlink /usr/bin/y2-platform
Private raw evidenceout/platform-v1-power-final/private/ (network/media details, never publish)
Owner firmware provisioning (needed for any build)out/cpu-idle-completion-02-owner-firmware/
Machine reportsdocs/validation/data/y2-power-final-02-physical.json, y2-platform-v1-power-final.json; report sections 38 and 39 of docs/validation/Y2-PLATFORM-V1-POWER-BATTERY-FINAL.md
Device harnessestools/development/power-session/ (README inside)
Memory notes~/.claude/projects/-home-luca-Dokumente-Code-Y2Linux/memory/ (y2-power-final-findings, y2-power-candidate-build-lessons)

Job 0 — make the cleanup safe

The Linux working clone's origin is an external worktree and its newest commits lived only in its own .git under out/. They were copied into both main repos as codex/platform-v1-power-final-03. Before deleting anything:

  1. git -C /home/luca/Dokumente/Code/Y2Linux log --oneline -3 codex/platform-v1-power-final-03 shows the

    docs/harness commit on top of 1ca3673; same check in Y2Reborn (b2c460e). If the newest clone commit is missing, git fetch out/power-final-documentation/Y2Linux codex/platform-v1-power-final:refs/heads/codex/platform-v1-power-final-03 again.

  2. (done, preserved as described above) Main working tree was dirty and belonged to an earlier session. main has 7 modified docs

    (CURRENT_PLATFORM_STATE.md, DOCUMENTATION_CATALOG.md, knowledge/candidate-index.md, planning/platform-v1-roadmap.md, planning/roadmap-gap-audit.md, release/Y2-COMMUNITY-BETA-FEATURE-AUDIT.md, …FEATURES.json) and untracked docs/release/Y2-PLATFORM-V1-{INTEGRATION-PLAN,INTEGRATION-STATUS,MASTER,PHYSICAL-QUALIFICATION}.md, docs/validation/Y2-PLATFORM-V1-INTEGRATION.md, tools/development/observe-platform-v1.py. Save them first: git diff > /safe/main-dirty.patch and copy the untracked files. Then decide (owner) whether they are kept (merge into the consolidated docs) or dropped.

  3. (done) main was an ancestor of 03 in both repos, so the merge was a fast-forward:

    git merge --ff-only codex/platform-v1-power-final-03 (Linux: 37 commits; Reborn currently on branch cpu-idle-completion, 19 commits). Do it only after step 2, on a clean tree.

  4. Verified at handoff: no detached worktree holds a commit that is on no branch. The only dirty one is

    the owner's /home/luca/Dokumente/Code/worktrees/platform-v1-usb-final/Y2Linux (4 owner files). **Do not remove it without the owner's explicit yes.**

Must not be lost

Job 3 — the 11 parallel handoffs: INTEGRATED on 2026-10-06 (done)

All eleven codex/platform-v1-<name> branches plus codex/highres-audio-completion are merged into main in both repos, with POWER-FINAL-03 as the baseline: on every collision 03's version wins, docs are unioned, nothing from 03 was overwritten.

How it was verified (repeat it if in doubt): for each branch, every code line the branch added relative to its fork point was searched in the integrated tree (lost-lines check). Result: the branches were already integrated into 03's lineage in adapted form by an earlier integration pass, so almost all of their code is present. What is genuinely new from the merge is small:

RepoNew in main from the merge
LinuxAFE register lab (tools/development/afe-lab), audio observer, generate_live low-bit fixtures in tools/host/audio_precision.py, tests/test_highres_observations.py (now in tests.sh), planning/validation docs and evidence
Reborntools/build/precision-probe.c, docs

Proof that 03 is untouched: Linux git diff ffddeb8 main -- kernel buildroot tools/production tools/connectivity initramfs tools/build tools/validation is empty; the only image-reachable file that differs is tools/host/audio_precision.py (additive). Reborn code differs from 03 only by the new probe file. The sealed 03 images therefore still correspond to main.

Final gates on the integrated trees: Linux production profile 515 cases (511 plus 4 new), 10 skips, 0 failures; Reborn fmt, strict clippy and all tests pass with the same counts as 03.

Per-branch outcome (Linux code that 03 already had in a newer form was kept; "absent" = branch lines not in the result, all superseded variants):

BranchResult
storage, wifi, bluetooth, highres-audio, suspend, inputcode already in 03; docs added. Absent lines: 1-15 per branch (old wait() signature, bt-control.ini location, patch hunk headers)
usbsuperseded by USB02: 36 of 2079 lines absent, all config/mechanics 03 changed after hardware validation. Kept 03's usb.py, mtp-safe.*, patch 0065, config
ffmpeg-metadata, library-db, graphics, reborn-performanceLinux side docs only
highres-audio-completionnew tools and fixtures added

Correction to an earlier statement in this file's previous version: it said all 12 Reborn branches "merge cleanly". That was wrong: the Reborn repo has no Git identity, so those trial merges aborted and the result was an artefact. The real Reborn merges (with identity from environment variables) had code conflicts in main.rs, input.rs, storage.rs, media.c, the library and others. They were resolved toward 03 after checking that 03 already contains each feature in adapted form (TransferRefresh/USB-triggered refresh, input_resume/resumed(), pinned_folder_artwork, artwork_lowres, metadata_revision, a superset main_loop_interval). Three merges (ffmpeg-metadata, reborn-performance, input) had auto-merged partial hunks that did not compile against 03 (an evdev_us field without producers, a duplicate metadata_tests module); those files were restored to 03 in a visible commit.

Not taken on purpose, because 03 does it differently and was hardware-validated or is the Product UI v2 policy: the usb branch's thread-based service wake, its gadget MaxPower/storage-line mechanics, the input branch's Power key mapping to screen-sleep, reborn-performance's evdev_us input timestamps and simple loop interval. If the owner wants any of them, port that single feature deliberately and re-run the gates. One optional small port: the usb branch's tools/usb/qualify.py takes /tmp/y2-platform-v1-device.lock (03's does not).

Branches are now merged, so cleanup may delete them: git branch --merged main includes all of these in both repos. Keep the archive tags rule for anything still unmerged. The earlier warning about not deleting these branches no longer applies.

Job 2 — cleanup

State measured at handoff: out/ is 325 GB in 303 entries. Linux has 49 registered worktrees: the main tree, 19 under out/…-worktrees, 16 under /home/luca/Dokumente/Code/worktrees (85 GB) and 13 under /tmp/y2linux-* (probably stale; git worktree prune clears the missing ones). 35 local Linux branches. Y2Reborn has its own 36 worktrees and 23 branches (same procedure, same locations). Y2Reborn/target is 4.1 GB; Y2Linux/.cache is 4.1 GB (keep, builds need it); docs/ is 882 files / 16 MB.

A. out/ keeps only 04

Keep exactly: the 04 package, the 04 symbols directory, platform-v1-power-final/private/ (owner decision). Everything else goes, in this order (the 11 parallel branches live in the repo and in /home/luca/Dokumente/Code/worktrees/, not only in out/):

  1. git worktree list — for each worktree under out/: git worktree remove --force <path>, then git worktree prune.

    Never rm -rf a registered worktree first; that leaves dangling registrations.

  2. Delete old builds and packages: all *-build, *-package*, y2linux-* directories except the 04 pair above

    (includes POWER01, 02, 03, USB02 and baseline packages; 04's fallback/ already carries the 02 pair, which is what the device runs today). Consequence to state to the owner: rolling back further than 02 will need a rebuild.

  3. Delete out/power-final-documentation last, only after Job 0 steps 1 and 3 are verified. Its out/power-final-04-build (and the 03 build)

    can be deleted; a rebuild reproduces behaviour, not identical bytes, so the sealed package is the artifact.

  4. Delete the remaining historical evidence trees and tmp directories (*-validation, *-physical, *-overlay, logs).
  5. Result check: du -sh out is a few GB; git status in Y2Linux and Y2Reborn is clean (out/ and .cache/ are ignored).

B. External worktrees and branches

C. Documentation consolidation (882 files)

Current layout: docs/validation 48 files, docs/release 17, docs/hardware-evidence 31 dated directories, docs/knowledge 86, docs/architecture + docs/build 74, plus docs/planning where roadmap-gap-audit.md alone is 5382 lines (every audit appended at the top) and CURRENT_PLATFORM_STATE.md (372), DOCUMENTATION_CATALOG.md (396), KNOWLEDGE_BASE.md, README.md.

Principle: keep one current truth per topic, push history to Git, never delete what code or tests read.

  1. Tag first: git tag archive/docs-pre-cleanup-2026-10-06 main so anything deleted stays recoverable.
  2. Files that tools and tests read — keep or retarget the reader in the same commit:

    docs/release/Y2-COMMUNITY-TESTER-GUIDE.md, Y2-COMMUNITY-SOURCE-DELIVERY.md, Y2-COMMUNITY-BETA-IMPLEMENTATION-PASS.md (seal_sources.py); docs/architecture/production-install.md, reborn-ffmpeg9-build.md, production-partitions.json, update-model.md, production-recovery.md, production-storage-v1.md, bluetooth-codecs.md, dependencies.json; docs/knowledge/evidence/gpu-source-contract.json, m5-firmware-inventory.json; docs/hardware-evidence/2026-09-13-storage05-owner/readback-corrected-analysis.json, docs/hardware-evidence/2026-09-18-gpu01/audio.txt (system_update.py, tests/test_emmc_layout.py); docs/validation/Y2-STORAGE-CEILING.md; docs/ui/previews/v2/boot-layout.json; docs/DOCUMENTATION_CATALOG.md is read by package inventory code (check with grep -rn DOCUMENTATION_CATALOG tools tests). Run grep -rhoE "docs/[A-Za-z0-9_./-]+" tools tests | sort -u again before deleting; this list may be incomplete.

  3. Proposed target structure: README.md (entry), STATE.md (single current platform state, replaces

    CURRENT_PLATFORM_STATE*.md and the per-candidate index), architecture/, hardware/ (knowledge consolidated per subsystem: power/battery/charging, CPU idle and suspend, storage, USB, display/GPU, audio, Wi-Fi/Bluetooth, input), validation/ (one current report per subsystem, the 39-section power report kept whole), release/ (Community beta set), planning/ (one roadmap, one current gap audit).

  4. Consolidate rather than delete where the content is still true: the 5382-line gap audit becomes a current audit (status table

    per issue #28–#34) plus an archive pointer; per-candidate validation reports (Y2-CPU-FINAL*, FIX01/02/03, M5 connectivity01.., storage diag, hardware01/02, USB02, POWER01) fold into the subsystem report's "history" paragraph with commit/hash references.

  5. Delete as stale: superseded per-candidate reports, dated hardware-evidence/* directories nothing references, duplicated

    candidate indexes, CURRENT_PLATFORM_STATE.entry-2026-09-23.md, and the old catalog rows. Evidence referenced from a kept document stays.

  6. Rewrite DOCUMENTATION_CATALOG.md from the final tree (script it: it is generated knowledge, not prose). Update every link.
  7. Verify: full host test run in the container (tools/build/run.py … tools/production/tests.sh, expect 515 cases, 10 skips, 0 failures),

    git grep for dead docs/ paths, then one commit per step so each deletion is reviewable.

  8. Same pass for Y2Reborn/docs and its readme.md.

Decisions needed from the owner (ask once, early): the dirty main docs, the USB owner worktree, keeping/archiving the private evidence, and whether to keep POWER01/02 packages anywhere outside out/.

Job 1 — hardware validation of 04 (after the owner flashes)

Take /tmp/y2-platform-v1-device.lock first (flock -n … sleep N &; release by killing that PID, not pkill -f). The classifier asks for explicit user consent before launching scripts that write on the device: say what will run, then run it.

  1. Identity: /etc/y2linux/versions.json = release …candidate.4, build …POWER-FINAL-04, kernel …power-final-04, Linux

    5aeba051…, Reborn 8cd365da…; boot id, taint 0. The live symlink /usr/bin/y2-platform disappears with the new root: after the flash ls /usr/bin/y2-platform must fail while Power still works, which proves the Reborn path fix.

  2. Smoke gate, DAC, supervisor: repeat power-session/dac-readback.sh and proc-rates.sh (they passed on 02).
  3. Suspend (the main goal): run power-session/suspend-session.py (README). After the recovery boot read:

    cat /sys/firmware/y2_pm/state /sys/firmware/y2_pm/devices; look for thaw_stall, S:<comm>, D:<comm>, thaw_blocked, I:…mmc entries. Each S:/D: entry's number is a kernel address: resolve it with awk on out/y2linux-platform-v1-power-final-candidate-04-symbols/System.map (use the map that matches the running kernel; 03's map is not interchangeable) (nearest lower symbol). Then mount -t pstore pstore /sys/fs/pstore; ls /sys/fs/pstore — a console-ramoops* file means DRAM survived and gives the full dmesg of the stalled boot (enable /sys/power/pm_print_times and pm_debug_messages first). oops_pc/oops_lr/panic entries mean a crash, not a hang. Hypothesis to confirm or kill: storage I/O blocked after reset-return (filesystems_thaw waiting on s_umount while a task is stuck in mmc_wait_for_req), eMMC controller state not restored. Fix the cause, do not skip thaw. Backstop maximum is 30 s.

  4. Wi-Fi idle policy: battery, dark, Wi-Fi on: after about five minutes C3 entries must appear (cpuidle/state2/usage), Reborn event log

    idle_power_down; screen wake must restore Wi-Fi without touching /data/network/enabled.

  5. Remaining matrix: Bluetooth connected idle vs C3, missing Bluetooth peer (owner switches headphones off), Power then RTC wake cycles

    (5, then 10) once a same-boot resume exists, PC and wall charging and source transitions (ask the owner to connect the wall charger), 5/30/120-minute idle, then an overnight procedure. Report programmed ceilings, never measured mA.

  6. If kernel or root changes are needed: accumulate fixes and build one POWER-FINAL-05 (see

    ~/.claude/projects/…/memory/y2-power-candidate-build-lessons.md for the exact build, package, validate and seal commands and the .cache pitfalls). Never flash, never push.

Facts that are easy to get wrong

Published by the schulzcode/y2linux project [1] [3]