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 (
bridgefeeds 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_xrunsmust 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-radiodWifiRestartand 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 of05 I Still....m4ato 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 iny2-platform status bluetoothencoderbitrate_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_disconnectedreasons. 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.mdand 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.rejectscounts 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 afterrebornctl 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, journalwifi_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_REVISION5 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_refusalretries 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 refusalswake_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, busybluetooth-powerwritespower_pending); serde_jsonfloat_roundtrip(reset plans); reset goldens' hostdevicevolatile (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 leavesstatusreadable, 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,status330 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 statusread 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 ofcaches,sleep statusafter 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
holdersas 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 withoutPy, 76675310/585566fa), P7 (y2p_core::pyjsondeleted, 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);Valuementions 2,189 (reports moved Py → Value). Flaky test: y2p-corepower_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
mainfrom 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, checkip addr show usb0andupdate 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; Reborn9859348adds theupdate_in_progressmessage),tools/platformdeleted, 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 intools/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): Linux5640949+ docs, Reborndc38c55, 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 --pssCPU is now mostly Reborn'srebornctl 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 withY2_PLATFORM_RUST. Last device build: 168. Open: (1) stopped agent branchesworktree-agent-a9cbacb26426e3605(export-diagnostics wired; service-daemon andupdate health-acknot yet) andworktree-agent-a03b5860b99a9360a(non-UTF-8 argv in Rust; the other fallbacks not yet): review, finish, merge. (2) Phase 6: dropBR2_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+ identity10f884c(1.0.0-beta.8.44, seq 11110, rootfs v1.208), Rebornbd96685.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 viatools/development/platform-goldens.py),y2-platform(execs the same Python command for every subcommand). Buildroot packagey2-platform; post-build refuses a non-ELF/usr/sbin/y2-platform; shell wrapper removed. Reborn carriescrates/y2p-contract(stampY2LINUX-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.shbuilds 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_start12.5 →services_started27.7 →application_ready48.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 bytools/development/platform-contract.py --check). Harness:tests/platform_differential.py,tests.test_platform_differentialintools/production/tests.sh(Rust side viaY2_PLATFORM_RUST, skipped now). Suspected defects in CONTRACT.md; confirmed on the player:usr/libexec/sftp-servergreps"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-contractin Y2Linux, vendored by Reborn with a stamp,release.py buildrefuses 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=0turns 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=10in 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 (pmsglong_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, Reborna08ca5d(fixes2eada03). Report Beta 8.43, notesout/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(#629ee3f04), Reborn25b8e06. Report Beta 8.42, notesout/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 onmainin both repos, not pushed: Linuxboot (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 fromlog_buf_len=1M), sequenced6b8420(10820, rootfs v1.204); Reborn3a4860b(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.pyarm_watchdog,BAT0/watchdog_powers_offclearsAUTO_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 okin 2.7 s).- F54/F55 (
battery.py,product_sleep.py): warm restart keeps the saved percent (stockdod_init); sleep refusedfor 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.jsonpmic(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/F53ip link set wlan0 down,wpa_cli disconnect+ platform restart; F57 hold Power after a wake; F50/F39echo 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=10in the running system; Wi-Fi heal thresholds; stock re-inits the panel at boot when LK reportslcm=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
mainin 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); Reborn57b47b2(screen off at once on Power),9ee61f0(no Sleep page). Identitydf66c7e/c5029b1(8.42, seq 10800) and5c0bc11(seq 10810). Test build 160 ran on the owner's player; 161 (seq 10810, Reborn9ee61f0) is built inout/release-161, its device check is not recorded.- F49 large SD card (Linux
84e5366): reportd32f8f3c(installb4bc0c95; the user wrote "BFBC0C95"), 8.41,1 TB exFAT, 71 400 songs.
fsck.exfat -ntook 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 checkADMISSION_CHECK_SECONDS20 (ext4EXT4_CHECK_SECONDS60, no background path); a timeout mounts read-only asread_only: checking(observe: Ready, not writable;write_window→card_being_checked; not repairable);service.media_verifystartsy2-platform media verify(retryVERIFY_RETRY_S30) →media.verify: checker withCHECK_SECONDS1800, 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.jsonrows carrybackground: true. fsck.fat/fsck.exfat-nopen the device O_RDONLY without a mount check (dosfstools 4.2, exfatprogs 1.4.3 sources inout/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. Automaticscans (
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 tablesscan_folders/scan_volumes(withMETADATA_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 controlscan=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.18fs/exfat/super.ccounts used clusters from the bitmap at mount;namei.csets the parent's mtime on create/unlink/rename. Tests:quick_scan_tests(4); workspace tests, strict Clippy, fmt pass.Next, in this order:
- Sequence bump for a test build (as
5c0bc11:update_sequence10820,rootfs_versionv1.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.- Device check of F49: first time
fsck.exfat -non the owner's card. If it finishes under 20 s, put a generatedlibrary on it (tens of thousands of small files) until it does not. Expect: card plays at once,
/run/y2/media-mount.jsonread_only: checking→protected, ansd-admissions.jsonrow withbackground, MTP read-only during the check and writable after, nothing offered for Repair. Also: sleep during the check, card pulled during the check.- Device timing of the quick scan: restart Reborn twice with an unchanged card and compare the
scan_completedfields (
quick,folders_skipped,elapsed_ms); copy a song over USB (expect a full walk,quick: false); Settings → Scan for Music (full walk).- F47/F48 on 161/162: Power → dark and stays dark; overnight drain (owed since 8.41).
- Release docs (report
docs/validation/Y2-LINUX-1.0-BETA-8.42.md, state, readme, catalog, audit, handoff; Rebornstate + readme). Publish only when the owner says so.
- Reply to the report user (the owner relays it; text below). Ledger:
UserReports/REVIEWED.mdF49 + rowd32f8f3c.- Pending error reports: about 30 since 2026-10-24 were read for sleep only (F47/F48) plus
d32f8f3c; the rest arenot 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, Reborn1358702. Plan/REA:docs/planning/SPEAKER-HAPTICS-PLAN.md; report BETA-8.41. Kernel: VIBRregulator-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_putrules, overlay 0030 speaker route iny2_hp_level_writeandy2_jack_poll(200 ms,__pm_runtime_put_autosuspend: 6.18'spm_runtime_put_autosuspendmarks 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 throughwith_model_action,rebornctl jack in|out. Device path test:/data/speaker-paths.shon 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(fix9f933b1), Reborn77c54e2(identity only).y2_charger_power_offinkernel/platform/mt6323-charger.c+poweroff-policy.h: CHRDET at power-off → stockchargerRGU 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 startreason=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, Reborn7cf527d(features894a99c, performanceb3534e9..7cf527d). Folders viareborn_ui::folders::FolderIndexandsort::natural_key;ShuffleMode(settings.shuffle+shuffle_albums,queue::album_shuffle);PlaylistSortper playlist;Ui::prewarmwhile the screen is off; playlists from the scan (ScanMetrics::playlists, workerJob::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, Reborn6c37d9f(F43990443f). Bluetooth Pause releases the sink, Play reopens (BlueALSA in-place resume silent with AirPods Pro 2; reporter confirmation owed). Wave: ribbon AA + levels fromapp/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, Reborn69232c2. 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: Y2Reborndocs/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 report007aa9c), Reborn92b9c9a(fixesd340263, redesign92b9c9a). Menu rules (owner): menus hold actions, Customize preferences, one order, no new row without removing one — spec Y2Reborndocs/ui/REBORN-PRODUCT-UI-V4.md(last section), testevery_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(docscc8e384), Reborne0921a0(change5a40103). 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 buildneedsY2_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(fix8a699dc:buildroot/package/y2-mtp/0006-y2-mtp-events-never-block.patch), Reborn01f1ed3(identity only). uMTP wrote StoreAdded/Removed underinotify_mutexand 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/"afterumtprd "-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, Reborneca7f49(search512a5f3/fdfa148, queue8f7de2c,rebornctl actioneae392b, Shuffle-off fixeca7f49). 8.32 (labels 131/132) was never published. Report Beta 8.33. Device-tested on the owner's player throughrebornctl 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 needsY2_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, Rebornb07cb9d(featureb12a1ee). 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(fixes14e2c91), Reborn44481c3(fixes20a493b, seek44481c3). 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 transportVolume,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 beforeboot.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(fix1a51503), Reborne58980c. Reports 09888d70/8fc8eea6/ba0bb428 (install 047f2c1a, 8.28): never charged;die calibration=0(efuse 0x63a bit 1 clear, CID 0x2023) → die channel -ENODATA → chargerfault=0x3forever. Fix:y2_pmic_calibratereturns 1 and uses the stock nominal (VTS 3698, 25 °C, slope 0) +10 °C (owner choice); boot logdie 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 buildf3f938a+ docs96b5039, Rebornf6eb0b2+ 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-radioper-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 andplay; 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, windowsy2-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.exfatclean, 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 withrebornctl test wifi-join-wrong --saved 0(WrongPassword 5.8 s, nothing left) andwifi-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 fieldssaved_age_s,saved_flags,saved_key_mgmtfrom 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'sotherline — 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):
- Y2Linux #58 audiobooks in All Songs shuffle — confirmed:
filtered_indices()(
Y2Reborn crates/reborn-ui/src/lib.rs:2438) filters onlytrack_matches, the queue builder onlyonline; addis_music()(one line + test).- 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.".- 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.- Y2Reborn #21.1 Previous restarts the song after ~3 s (today
Effect::PreviousTrackalways steps back,
app/reborn/src/main.rs).- 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).- Y2Linux #40 split multi-artist tags ("A;B" under both; Artists list groups by raw
t.artist,
crates/reborn-ui/src/catalog.rs:181).- Y2Linux #41 Album Artists browse (albums already keyed by
album_artist).- Y2Reborn #22 Bluetooth absolute volume:
bluealsadstarted without--a2dp-volume(
usr/libexec/y2/connectivity:18), Reborn volume is software only; needs AVRCP volume sync + fallback.- Y2Linux #50.6 album opened from a genre shows only that genre's songs (option).
- 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_requiredaccepts PSK only).How-to reminders (details in memory notes): release =
release.py bump --version X --sequence N→ commit both repos (Reborn withGIT_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, Rebornf6eb0b2. Platform:wifi-failure.jsoncredentialblock (kept until a connect, survives ap_unavailable),network.jsonFailed/wrong_credentials+failed_network_id. Rebornwifi.rsPendingJoin(ATTACH, SELECT, events; saved only on connect; older same-SSID entries removed; ENABLE_NETWORK all; failed try removed),Status.join, UIwifi_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, Reborn4947352. 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 cardsread_only: protectedwith 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; Reborn404edb3, identity only); the owner's player runs it. The 12 reports pending after 8.25 were reviewed (ledgerUserReports/REVIEWED.md, F35–F41) and fixed: F36 start on a charger after a low-battery power-off (battery.pyrestore, stale power-on OCV,power.pySOC shutdown on battery only), F37y2-radioper-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 (othershapes) 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; Reborn40386bc); 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; switchesy2_xtal_full_power,y2_xtal_start_hp,y2_xtal_quiet_start,echo cycle > y2_hp/xtal;y2_hp/xtaladdstries= 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 withstart_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, docs6cc7eb2; Reborne199d9c, docsdb4c407); 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); stockaudio_policy.confoutput = 44100 only, so stock never runs the PLL. 8.24: AFE 44.1 kHz only, codec refuses non-crystal rates, Rebornreborn_audio::WIRED_RATE(decoder converts; one open sink for all rates), codec power cycle after a crystal error (y2_hp/xtalcycles=), 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 inf66d71dwas wrong; the code comment is fixed on main (0da8393, unbuilt). Order for today:
- Reports first (
UserReports/REVIEWED.md,tools/reports/fetch.py --pending). #52 (2813306c), #54 (0400eb78) on8.24:
y2_hp/xtal(ready_ms,errors,unconfirmed,cycles,cold_start), anyrefused: it needs the PLLorcodec power-cycledkernel 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.- GitHub: no comment on #52 about 8.24 yet (owner not asked; offered). #56 comment's battery sentence still overstated.
- 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 givesready_ms). Measure the hold's battery cost before touching it (a shorter idle delay is the milder lever).- 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.
- 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, Reborn0779d8b+ docsdfd9640); 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:
- 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.txtandY2RECOVERY/pmsg lines.- 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.- 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).
- 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, Reborn0779d8b, 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 (touchmissing 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/holdset 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, Linux073aa0c, Reborne196033; 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/pmsg0trail,/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, Reborncdc6b43). 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. Stockcs43131_hw_initpowers 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 (Linux9ba00b9): 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/xtalrunning= 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 inUserReports/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, Reborncdae78e). #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/xtalboosted=, writableboost), Reborn's open deadline 5 s, reports collecty2_hp/xtal. Device runs at stock and forced 15 µA all pass (report BETA-8.20). Owed: the reporter's confirmation (next report'sy2_hp/xtal). Test tones (48/96 kHz) on the owner's Internal StorageReborn 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, Rebornda5b777; 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 Reborndocs/ui/REBORN-AUDIOBOOKS.md; user guidedocs/AUDIOBOOKS.md. FFmpeg gainsatempo(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 StorageAudiobooks/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 -110until 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.pyfat_findings,sd-admissions.json); F20bt_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. LedgerUserReports/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 boundson 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 (scannerscan_completedfields). 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-graphicsglyphs.rs, reborn-uiglyph_cache.rs, texture slot 9). Update: user "no Update button" + reports 61caa81e/297f1032 →update.stagewaits 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 0009init_cardmarks TRIM broken (f9a3bd8), write_zeroes 0 on the player. Reportdocs/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/, ledgerUserReports/REVIEWED.md,tools/reports/fetch.py --pending --into UserReportslists 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 files3f4f3d1, container SQLite stub338e408);mtp-tracks0 → 311 on the maintainer's player. Wi-Fisme.c:845dropped connect → driver passes the BSS tocfg80211_connect_bss(9595a50). BootErrno 22→0f18219. Pause silence = #48 (8.12), checked on a player. Reportdocs/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, alsoplaylist_index.rslookup/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: Reborn3ff346a(slicing),bc2762d(isolated()),2db37cf(open retry); Linux4d77820(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). Reportdocs/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"): setupPending/battery_lowat 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 BAT0voltage_ocvvia the stock profile (Linuxfee6b36), Reborn shows Connect a charger and restart (f649609). Reportdocs/validation/Y2-LINUX-1.0-BETA-8.11.md, audit BETA-8.11. Release1.0.0-beta.8.11, sequence 7500, Linux9c7f079, Reborn727fd47; not installed on a player. Open: leftoversystem.imgwhen 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. Release1.0.0-beta.8.10, sequence 7400, Linux9df5ccf, Reborncfac12b. #47 cause:y2_charge_preparerefused 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 incheck_*. 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_reportsqueue/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 + 11node --testtests,tools/reports/fetch.py(SigV4, AWS vectors),new_upload_key.py, deploy stepstools/reports/README.md, uploaderreport.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 forfetch.py).- Then R6: a test build (with the key file from the deploy, the build prints
reports: upload key included), installon the owner's player (stage + apply), Send Report Now,
fetch.pydownloads 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:
mainmoved on, sorelease.py publish --label 102refuses. The next release is a new build frommainwith a sequence above 7100 (the owner's player runs 7100). Next free label 103.- Reborn
mainalso has the 8.9 docs commit537e147after the built commit4da5f84(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). Reportdocs/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 guidedocs/ERROR-REPORTS.md, plan section "Save to storage and speed, Beta 8.8". Release1.0.0-beta.8.8, sequence 7000, Linuxbe71b6d, Rebornb6b6fbc(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.pyUPLOAD = Falsehides 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 (Linuxd9b19cb, Rebornfbecb77),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, secretsUPLOAD_KEY/RATE_SALT, custom domain, 180-day lifecycle), the upload key. Then R4: uploader inreport.py(urllib TLS asupdate.py, retry/backoff, Wi-Fi + battery rules, NetworkTransfer workload) and the periodicreport checkin 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.jsonreads 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 fromef9e805), 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 noaccess 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; release1.0.0-beta.8.7, sequence 6900, Linuxf7b4fb5, Reborn82fe089. Owner installs by OTA (check: panel path unchanged,panel=st7701sor 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); thelcm=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, solcm=0-gc9503v…(samanz's boots) is a positive GC9503V ID that boot-policy.h ignored. Fix: gc9503v with either digit, st7701 still only withlcm=1-; teststest_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-94deleted). 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, Reborncefcc8a,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_fade2000 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_continued907 ms (no jump); High = 0x30/0x1E Live High, Low = 0x10/0x1C, Master −19.5 dB, 0 xruns;hpload_measureduring playback → EBUSY. No kernel warnings.- CPU/battery (60 s, owner's AirPods Pro profile, same song,
python3 measure.pywith 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(+ docs86b7baa), 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_measurerefuses an open stream and holds DAPM while measuring.tests/test_hp_level.pymodels 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: ALSAHP Output LevelLow/Medium/High = OUT_FS 0x10/0x20/0x30 with hv_seq'sHV_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.pyC harness, mutation-checked; FFmpeglowshelf highshelf;tools/audio/test_signals.py). Reborndc66880(Settings → Sound: Headphone Level, DAC Filter; Equalizer → Headphone Profile fromEQfolders, 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 hady2_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, Reborn14aad05), installed 2026-10-18 over SSH(stage + apply, install 16.0 s, Acknowledged).**
5de9c95makes 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_live0; 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), graphEQ=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, Reborn770a6de), installed 2026-10-18, Acknowledged: ownerdisliked 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, Rebornb694670), Acknowledged: 47 AutoEq profiles of commonheadphones/IEMs ship in
/usr/share/reborn/eq(Rebornassets/eq, pinned AutoEq7ae0f56, MIT license in legal-info); a storageEQfile 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', regmapdebugfs 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 inout/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 noholding SMI common/larb0(the SMI common gate was already closed at 0.36 s, before Lima), the handover loggedSMI gates 1 left closed by a restartwith larb0stat=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 keepsMMSYS_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; Linux7ed664bbrings 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, Linuxc339919, Reborn identity only; container suite 775 OK. Owed: after the owner's OTA, check the 8.4 boot forholding SMI common/larb0and noSMI gates … left closed(dmesg,/data/logs/system.log), and the installtimings; 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, Linux029d93e(+ docs), Reborn03e6dff; reportdocs/validation/Y2-LINUX-1.0-BETA-8.3.md, audit BETA-8.3. Time plan intools/update/core.c(plan_add,plan_left, models per MiB from the owner's player),"<percent> <step> <s>"progress lines,tools/update/recovery-ui.ccountdown, Reborn check-step seconds. Also9c7dae7(kept root hashed during verify, phasetimingsin 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 readtimingsfromy2-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, Linux1d463f6(+ docs; code inf9c1eae), Reborn5aad5f1; reportdocs/validation/Y2-LINUX-1.0-BETA-8.2.md, audit BETA-8.2, contract indocs/architecture/platform-ota-v2.md. Segmented root gzip (index in the signed manifest), four-thread decode / backup / readback intools/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_updateis not in the release gate: run it on the host (TSan/ASan viaY2_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, Linux78220dc(+ docs), Reborna558870; reportdocs/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 intools/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, Linux662ff11(+ docs), Reborn1b3a5c1, reportdocs/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;healthyin rebornctl status;session quarantine + settings recovery),
1a3afc2(audio profile matcher). Linuxe361b8b(health useshealthy),3bc6abb(reconcile in the background,common.kill_tree),ca119ff(mode-1 fallback stops the engine first,y2_hsdma_stopin 0055),ebc164e(stuck recovery powers off after 10 min on battery),f261044(Y2MEDIAnoinit_itable, mkfsnodiscard),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 skinnames, 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, Linux9c3e4f1(+ docs), Reborn814cd14, reportdocs/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. Workspaceout/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 onbeta8-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 behindrx_dma=2),b49afaa(two-sample short-packet rule: RXCOUNT falls whilethe 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 commits8aa868c,7b9941f,9c3e4f1(1.0.0-beta.7.11, sequences 6350 → 6351 → 6352); Reborn814cd14(identity only).- Build/install:
out/release-74= sequence 6352 (built withrelease.py build --label 74, nothing pushed ortagged). 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 inPendingHealth 6352right after.- Switches (
/sys/devices/platform/11200000.usb/):rx_dma0 PIO / 1 mode 0 / 2 multi-packet (default),
rx_dma_eps(default0xfffe; MTP OUT = ep1, ECM = ep3),rxdiagcountersm1_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
kiod6before mtpbench runs); Windows Explorer if available. Then: release notes + reportdocs/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, notdate(the clock steps after boot and fired a wall-clock guard twice).mtpbench storagescan 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, Linux72a565d+ 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_fileintools/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), upload8.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 tof); ≈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 andioread32_repare already in place.- Why RX DMA is off:
kernel/platform/usb.cy2_dma_is_compatible()keeps bulk-OUT unmapped unless sysfsrx_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 forshort_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 driverprogrammed RX DMA on this controller (mode, RXCSR/DMAREQ sequence, short-packet handling, errata). (2) Read
drivers/usb/musb/musbhsdma.c(+ overlay 0055) andmusb_g_rx()for the DMA-busy/short-packet interrupt path. (3) Implement mode 1 behindrx_dma=2, default off, keeping the receive event ring/counters; zero-fuzz overlay patch + manifest hash (see how 0065 was regenerated withdiff -ufrom.cache/sources/linux-6.18). (4) Release with the switch off, owner installs, live A/Becho 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:kiod6holds the MTP interface while Dolphin has the player open — ask the owner, then endkiod6(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 -30at start, harmless). FM radio stays onbeta8-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/publishwith 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, Linux72a565d(codeda0917dmusb ZLP fix,4c0a54dMoveObject/CopyObject + tool), Reborn511dbf0, reportdocs/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 runcc -O2 -Wall -o /tmp/ops tools/usb/mtp-file-ops.c -lmtp && /tmp/opswith 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, Linux2ac6abd(code5d2801c,3110f3a), Reborn926ef45(code93be94f,b023daf), reportdocs/validation/Y2-LINUX-1.0-BETA-7.9.md, audits STORAGE-SETUP and BETA-7.9, plandocs/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 inout/deep-sleep-final/evidence/20261016/internal-storage-backup-before-stock-test/internal-music.tarand/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. Workspaceout/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, Linux21d5ba0, Reborn35a3d56(fixese417ecblog subsystems,8bd1452Now Playing after pause/repeat/failure, error-6 split, clock gate, one sign-in), reportdocs/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 onbeta8-fmmust rebase; its fm.1 outputout/release-68was pruned by this build). Workspace:out/build,out/release-70,out/release-71. Unreleased onmainsince 7.8: issue #44 (SD card pulled while mounted never mounted again): Linux3110f3a(media.read_only_check/fat_unclean_only: a failedfsck.fat -nwhose 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_cardreports a refused, still-inserted card as Degraded/filesystem_check_failed), Rebornb023daf(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, Linuxbcb7815, Rebornf117586, reportdocs/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 onbeta8-fmmust 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 Rebornmain, 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 branchbeta8-fm(implemented there, device test owed — see that branch's handoff). Plan/security: LASTFM-SCROBBLE-PLAN, audits LASTFM. Rebornmain60bea96 (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 onmain(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, HostKeyAliasy2linux-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(MediaTekfmradiodriver; vendor call sequenceopendev, 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.cfgcome from the owner's Innioasissystem.img, like the Wi-Fi/Bluetooth firmware: never in our images; extendtools/platform/y2_platform/radiofw.py(Firmware drive install) to take them.- Where it lands in Y2Linux: our own connectivity driver
kernel/platform/connectivity/(WMTwmt.c, STPstp.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 kerneldrivers/misc/mediatek-consys/fmradio, commit5a0058fb; the stock kernel ELFout/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 inkernel/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, Linux58de7d8(+ docs8a529cb), Reborn36e6994(+ docs), tagbaseline-67in both repositories, GitHub release latest. Reportdocs/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 (
Skinsfolders,Themesstill read), About without Music Library; 7.6 update download/check at the full frame rate (were ≤ 29 fps,Ui::download_showningliding()), 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: samplerebornctl metrics(graphics_frames) during that download; (3) 7.4 Now Playing on battery: cpufreqtime_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 whilebuildruns). Workspaceout/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, Linux2ec56d2(+ docs), Reborn0291d69(+ docs). Owner chose status bar layout C (name beside the back arrow, Title Case); Theme → Settings → Skin (Skinsfolders,Themesstill 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, Linuxd909231(+ docs), Reborn8c0f8c4(+ docs). Motion measured on 7.3 (archive20261016/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, Linuxcbab171(+ docs), Reborn7175c76(+ 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: pollrebornctl metrics+statusevery 0.5 s;graphics_framesdelta,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, Linux78b548b(+ docs), Reborn846da2d(+ docs). Reportdocs/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 socketmetrics,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, Linuxe9427a9(+ docs), Reborn81a907e(+ docs). Reportdocs/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_foundin 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, Linux7c0ee9f(+ docs), Reborn7ade64b;out/release-61(container suite 743 OK, no firmware, OTA signed). Reportdocs/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 --yeswith 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_zone1enabled 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 whilerelease.py buildruns (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.cprogrammed the 1100b000 monitor only in probe; INFRA power-down wipes it (monitor/period/filter/poll read 0),y2_soc_tempreturned -ENODATA and the thermal core disabledcpu-thermal(trips 110/120 °C). Seen in archives 124/125/155/156. Nowy2_thermal_initruns again iny2_thermal_resumewhen the monitor is off. Compiles againstout/build(W=1); device check owed:/sys/class/thermal/thermal_zone1/modestays 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.pynow takes a fresh count up toSTALE_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). Release1.0.0-beta.6.3, tagbaseline-60, sequence 5750, Linuxb20404c+ docs, Rebornb18d98c; reportdocs/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):
- 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_releasedfor_sleep: true).- AirPods: Pause, wait, Play → sound returns (6.1 drain path; Beta 6 was silent). Log:
/data/reborn/logs/reborn-current.jsonl(alsapause events should showdevice_pause: falseforbluealsa:).- Next/Previous right after starting a song (Bluetooth): no "Couldn't complete that"; Play/Pause during a start pauses on the chosen song.
- Settings → Display → Time Zone (Berlin) → clock in Reborn's look and in two or three skins; 12/24 h follows the zone.
- 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.
- Any skin: radio Now Playing shows LIVE/logo/song (not "1 of 1"); Favorites heart on Now Playing.
- 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).
- 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-ffto keep the author; check against0e14a3e-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'ssystem.imglike Wi-Fi/Bluetooth (no MediaTek firmware in images).Where things are (Reborn): clock
reborn_core::clock+zones.rs(regenerate withtools/clock/zones.py), picker/cachesreborn_ui::time_zone; skin engine vars/flagscrates/reborn-ui/src/skin/{mod,draw,compile}.rs; skins are generated — never editskins/*/skin.jsonby hand: changetools/assets/build_skins.py(finishing stepsadd_clock/add_live/add_keyboard/add_heart; Bunny Bow inbunny_bow(); fonts inassets/fonts/pixelify) and rerun it (Classic's json is hand-written). Check that the default look stays pixel-identical by renderingreborn-previewbefore/after and diffing PNGs. Pause/BlueALSA incrates/reborn-audio/native/audio.c(rb_sink_pause); pending-start skips inapp/reborn/src/main.rsRuntime::effect; pre-CID cleanupretire_pre_cid_copyincrates/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_clocklivefavorite,heart,keyboardlayout, 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, tagbaseline-58, sequence 5650, Linuxfaf85ba+ docs, Reborn78e36db; reportdocs/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 duringpending_reconfigurationhandled inRuntime::effect(step + hold +seek_until);retire_pre_cid_copyinreborn-libraryscan finish (#15); PR #14 merged (playlist_indexonline-first); review commit0e14a3e.- 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, tagbaseline-57, sequence 5600, Linux45d3696+ docs, Reborn544d3c9; reportdocs/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}, workerapp/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_LIMIT3 min) and collected seeking (SEEK_SETTLE350 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, tagbaseline-56, sequence 5500, Linuxe9ac2a5+ docs, Reborn35e333d; reportdocs/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, benchmarkcargo test -p reborn-ui --release -- --ignored --nocapture speed), radio sectionviews_radio(logos viaradio::fetch_logo→LogoFetcherin main →artwork::Art::Logo→rb_media_logo_file+art::logo_tile; live logo checkREBORN_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, tagbaseline-55, sequence 5450, Linux5dd995f+ docs, Reborn84df9ae; reportdocs/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, tagbaseline-54, sequence 5350, Linux929ea0d+ docs, Rebornd0008dd; reportdocs/validation/Y2-LINUX-1.0-BETA-4.1.md, audit BETA-4.1.
- Fixed: radio
Stream::dropdeadlock ("playback command queue full"); radio availability per loop pass; Reborn accepts an Onlinenetwork.jsonup to 45 s and falls back to the supplicant; TLS clock coherence viaCLOCK_BOOTTIME(updates after sleep).release.py bumptakes 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, tagbaseline-53, sequence 5300, Linuxd681990+ docs, Reborn94eae20; reportdocs/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/.plsin aRadiofolder, 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; firmwaremt6627_fm_v1_patch.bin/_coeff.bin+mt6627_fm_cust.cfgfrom the owner'ssystem.img; donor driverdrivers/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, tagbaseline-52, sequence 5200, Linux2731169+ docs, Reborn8cd4362; reportdocs/validation/Y2-LINUX-1.0-BETA-3.md, audit BETA-3. Built withrelease.py build --label 52in 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 (BlueALSAbuildroot/patches/bluez-alsa/0002-y2-aac-adaptive-bitrate.patch,--aac-abr), settingsaac_quality(high default) /aac_abr(on), EncoderStats for AAC → statusaac_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_adjustments0 at close range; bluealsad CPU vs ≈9 %; owner listening High vs Standard; walk-away test watchingaac_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 archiveY2Linux-sources-third-party-<sha12>.tarandlinux-6.18.56.tar.xzare linked instead of re-uploaded when an earlier release carries the identical file; writespublished.json).- One build workspace
out/build, resumed in place; build folders are never copied any more: copies kept absolute paths, thestagingsymlink and per-package RPATHs of their origin — Beta 2's build still read libraries/.pc files ofpower-final-34-build, and itslibdbuscarried build-34 paths. Outputs per release inout/release-<N>/(update, first-install, ota, assets, receipts, summary.json; receipts also inout/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 inold-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);exfatprogsnow depends on util-linux (missing dependency found by the parallel build); Reborncross.shtakes the package's host view (Y2_BUILDROOT_HOST, Rebornbae14ca). 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; newtests/test_release_tool.pyin the suite (733 in the container).- Not pushed: Y2Linux commits after
4808347and Rebornbae14caare 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(Reborn1.0.0-beta.2), tagbaseline-51, sequence 5100, Linuxfc1f5ea+ docs, Reborn009cd32; reportdocs/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 RXflag=0 valid=2..7); HCIpost_initwrites page timeout 0x2000 and logspage timeout X -> 8192 slots(hci.c);y2-bt-reconnectcall deadline 45 s (tools/connectivity/reconnect.c); DNS re-check 300 s / fresh 420 s (network.py,observe.py);radio_off_disconnects; BlueZClass=0x00041C. Reborn:AutoOutputinapp/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); noBTIF timeoutover many wakes;/run/y2/bt-reconnect.jsonneverInhibitedwithcompletion_unknown…when the AirPods are away; output switches to AirPods on connect (output_automaticin Reborn's log); time fromwlan0 registeredto 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/ipstatus 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_progressrace; 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 without/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 statusAcknowledged (sequence 5000),firmware statusReady (7 files in/data/firmware/mt6582), recovery log withoutradio firmware keptand without a DSIread-backline.- Night 00:07–09:24 local (boot
81283b3d;system.logstamps are UTC, 2 h behind): 18 timer maintenance wakes (wake=0x1, 30 min), vproc/PMIC sleep/wheel/USB PHY/INFRA 12/12 clean, INFRAlost=0x0, no taint. Morning wakewake=0x20.- Drain ≈ 9.4 mA (least squares on
suspend_maintenance_wakeremaining_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_offand 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_countstore failed (BAT0 change;BAT0wakeup_count 19,mt6323-keys0, 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 oncesucceeded 0.6 s later, Wi-Fi online. AirPods reconnectInhibitedagain (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.jsonerror 28), nothing tells the owner. The SD cardFirmware/system.imgroute worked (candidates()inradiofw.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.pyREADME) 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
READMEinradiofw.pynames the v3.2.0system.img(≈520 MB) and the SD cardFirmwarefolder 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 witherror 28in/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.0system.imgor aFirmwarefolder on the SD card; clears on a found file or Ready. (1) Real fix, after checking upstream umtprd for an existing check: in they2-mtpSendObjectInfo patch, answerMTP_RESPONSE_STORE_FULLwhen 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_progressrace (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 readsreleases/latest), tagbaseline-50in both repositories, Linux5ac955f+ docs, Reborne394c38. Release1.0.0-beta.1, Reborn1.0.0-beta.1, kernel6.18.56-y2linux-1.0.0-beta.1, sequence 5000, built withbuild.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 keptnot expected again; screen lit), Wi-Fi/BT up → archive20261016/155.- Release recipe (as done for 49/50): bump
kernel/config/production.config+tools/production/release.json(+ RebornCargo.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 withPATH=.cache/host-tools:$PATH; sign withtools/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.gzremoved); public codecs SBC + AAC (fdk-aac-free) + LDAC, aptX/aptX HD only in owner-private builds (defaultbuild.pywithout--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 needbuild.pywithout--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(Reborn1.0.0-beta.1), tagbaseline-50, sequence 5000, built with--public; reportdocs/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 carryrootfs.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 buildout/y2linux-platform-v1-power-final-candidate-49-private-ota(stage over USB on request). Check after the install: recovery logradio firmware kept on Y2DATA,/data/firmware/mt65827 files, Wi-Fi/Bluetooth up, recovery screen lit; then (owner OK) the Firmware-drive test withsystem.img. Reportdocs/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 Linuxd1f1195). Next archive 155. For the next release: Reborn476e281(cancel no longer hides a newer release), Linuxd1f1195(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 branchesreview/prs,pr-6..8in Y2Reborn.
Previous entry: START HERE (2026-10-16, late night): BASELINE 48 PUBLISHED — OVER-THE-AIR UPDATES FROM GITHUB RELEASES. Releases
baseline-46,-47,-48on SchulzCode/Y2Linux (tags in both repositories; release keyplatform-v1-release-20261015, private key only in~/.local/share/y2linux/signing/, owner should back it up). The player checksreleases/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 --latestwith 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, noread-backline) andrecovery-display.txt; the owner approved fivey2-platform update probe-recoveryruns (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.jsonon 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.jsonand 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, checkY2SCAN mutex resetline, restart test (owner OK), thenrestart.jsonon.
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_resetsets 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 itsplatform_inithas 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 saysboot-recovery; a Y2 recovery image there installs BOOTIMG + Y2ROOT with backup/readback/restore; each kernel may write only the other boot image (kernel policy). Contractdocs/architecture/platform-ota-v2.md; reportdocs/validation/Y2-PLATFORM-V1-POWER-FINAL-35.md(owner steps). Packageout/y2linux-platform-v1-power-final-candidate-35/(fallback 34) withrecovery-install/(one-row SPFT scatter), receiptsbuild35-receipts, Linux3eb96ba, Reborn6fbaba8, BOOTIMGc27dd33c…c391, Y2ROOT25ec8077…5eff, RECOVERY859227b4…04cb, suite 718. Signed OTA packages (not published):…-35-ota-devtest(development key, reinstall) and…-35-ota-release(new release keyplatform-v1-release-20261015, private key in~/.local/share/y2linux/signing/, sequence 3500).Work list, in this order:
- 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.PASSED 2026-10-15 (archive 129 +probe-recoveryrecovery-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.- First install from
…-35-ota-devtestcopied to the device (update stage --package), Turn Off and Install in Reborn; then optional interruption test.- 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-34in both repositories). Images from Linuxde62fa9, Reborn5b69ef5; packageout/y2linux-platform-v1-power-final-candidate-34/(fallback 33), receiptsout/deep-sleep-final/build34-receipts/, BOOTIMGee80a82c…c30c, Y2ROOT9d3e93c1…ff6c, suite 715. Device last seen on 33 (installed; Reborn themes work, owner: "it works very good"). 34 = 33 + battery level for thestock_oamsource (Reborn showed no level since 29) + all 15 themes shipped in/usr/share/reborn/skins+ skin fontcharset: ascii/ textcase: lower(Zune). 13 trial theme copies sit in Internal StorageThemes/(hidden by the shipped ones; can be deleted). Reportsdocs/validation/Y2-PLATFORM-V1-POWER-FINAL-{27..34}.md; theme authoring guide Y2Reborndocs/skins.md; themes generated by Y2Reborntools/assets/build_skins.py.Work list, in this order:
- After the owner flashes 34: battery number/fill shown; Theme picker lists 15; Zune loads (
rebornctl theme zune --json, logskin_loadedload_ms).- Owed tests: 32's wired screen-off playback (≈30 min, Bluetooth off;
deep_audio_entries, SPMdormant_*, Rebornaudio_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.- Open defects: AirPods reconnect
Inhibited; AAC not confirmed;wake_event_in_progressrefusal after unplug; software restart leaves the panel dark; play on a saved-but-disconnected Bluetooth output should connect it (needs the owner's OK).- Themes: step 3 (web editor with true preview) and step 4 (polish: scrolling titles, cover reflection, horizontal gradients, highlight animation) are not started.
- 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_audioswitch: deep idle during playback as stock dpidle). Packageout/y2linux-platform-v1-power-final-candidate-32/(fallback 31), Linux4ded0fe, Reborn0892bf2, BOOTIMG5f1766ca…a131, Y2ROOTf9ca5bbc…8938, suite 713. Reportdocs/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
0892bf2folder-first artwork, more cover names, m4b/oga/aifc, ALBUM ARTIST). Packageout/y2linux-platform-v1-power-final-candidate-31/(fallback 30), Linuxebd2a58, Reborn0892bf2, BOOTIMG9aeeba78…b384, Y2ROOTb275bf04…bf4f, suite 711. Reportdocs/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),
noatimeon all cards and Y2Media, Rebornf08cf93conditional limiter (pipeline CPU halved). Packageout/y2linux-platform-v1-power-final-candidate-30/(fallback 29), receiptsbuild30-receipts, Linux6aa52e3, Rebornf08cf93, BOOTIMG7d95f855…02b9, Y2ROOT65467e6a…82c2, suite 711. Reportdocs/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), receiptsbuild29-receipts, Linuxf9ce653, BOOTIMG3f82ae59…fc07, Y2ROOT5d9f298b…7f52, suite 708. Reportdocs/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, boot5919b4fe: switches armed, VGP2 off when idle, no panel/codec errors; short sleep for the VSYS counters not yet done). Packageout/y2linux-platform-v1-power-final-candidate-28/(fallback 27), receiptsbuild28-receipts, Linux36b8500, Reborn1c9edd4, BOOTIMGeb413fdc…9c94, Y2ROOT7537ba43…fdf, suite 707. Reportdocs/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), receiptsout/deep-sleep-final/build27-receipts/, Linux2c3e2bd, Reborn1c9edd4, BOOTIMGc9017de1…902c, Y2ROOTc70dc92b…737a, suite 701. Switches inpower-features.json:panel_stock_suspend,vgp2_idle_off,pmic_sleep(15/7). Reportdocs/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, Linux64b3cc4(docs after it), Reborn1c9edd4, root v1.56, boot9f7fe545at archive time. Packageout/y2linux-platform-v1-power-final-candidate-26/(fallback 25). Nothing pushed;baseline-24is still the published state. Archivesout/deep-sleep-final/evidence/20261013/119..123,20261014/124(next 125). Reportsdocs/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 twoConnectProfilecalls got no reply →/run/y2/bt-reconnect.jsonInhibited,completion_unknown_user_retry_required(tools/connectivity/reconnect.c, unchanged since 25). Reborn: 0 connects,pcmsempty, every play →"connected A2DP peer required". The session migrated to Auto (codec_revision1). 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
BAT0change from the charger noticing the unplug landed during the ≈5-s radio quiesce, thewakeup_countstore 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 (stillInhibited).Overnight baseline (archive 123, 21:24 UTC): fresh boot
8943a99aon 26 after an owner restart, taint 0, DSI hand-over normal, SPM entries 0, sleep guard not pending, power features as wanted (golden_apply15,pmic_sleep7, 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 alreadyInhibitedafter 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 boot8943a99a, 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-lastcomplete_result_0, sleep guard not pending. SPM: entries/resumes 21/21,infra_pdn_entries21,golden_entries21,pwrap_gates/ungates21/21 (0 failures),md1_gate1 (0 regates),dis_offs/ons23/22, aborts 0. INFRA: saves/restores 21/21,last_lost=0x0,total_lost_regs0 (unchanged).pmic_sleep_stateentries/restores 21/21, 0 failures. Wheel: sleeps/wakes 21/21,wake_retries42 (2 NACKs per wake, same as 16's 66 for 33), 0 failures. Drain ≈8.3 mA (least squares onremaining_uah_estimateat 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_lost21 (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,pcmsempty, metrics connects/disconnects 0/0,codec_policynull); reconnect tried again after the morning wake and isInhibited(total_attempts2,failures2). 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 initVSYS_VOSEL_CTRL/VSLEEP_EN/QI_VSYS_VSLEEP), D VEMC3V3 (known; stockmsdc_emmc_powerturns 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:
Read the overnight result firstdone (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).- Bluetooth on 26: ask whether a manual connect worked. Then status
bluetooth.pcms[0].codec= AAC,codec_policyall fiveruntime_enabled, metricsbluetooth_disconnectsunchanged after the connect (26 is the first image to sendSelectCodecon 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.- 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.
- 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_framesdeltas every 0.5 s for 45 s;y2-screen-streamcannot show more than ≈10 fps).- Owner checks still open: start-up colour flash (22), Genres after the tag re-read.
- Remove the test library
/media/sd/Cover Flow Testwhen the fps work is done.- 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).
- 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), receiptsout/deep-sleep-final/build26-receipts/, Linux64b3cc4, Reborn1c9edd4, BOOTIMGf4ca442b…585a, Y2ROOT66efd3ed…405f, suite 693. Cause: Reborn matched BlueALSA'sCodecsprefix only as lowercasea2dp-source:(5.0 saysA2DP-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). Reportdocs/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), receiptsout/deep-sleep-final/build25-receipts/, Linuxf7eb741, Reborned6a8cb, BOOTIMG44a9c3cf…3cf7, Y2ROOT6f629a89…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 whileUi::gliding()and renews the Interactive lease during the glide; album detail cached; sub-minute albums m:ss; scanner skips._*and macOS system folders. Reportdocs/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-24in 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, Linuxd2b38e8, Rebornced5199, root v1.54). Packageout/y2linux-platform-v1-power-final-candidate-24/(fallback 23), receiptsout/deep-sleep-final/build24-receipts/. Reportsdocs/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], leaseflock -n /tmp/y2-platform-v1-device.lock. Archivesout/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"|...}};metricshasgraphics_frames,graphics_frame_time_ms,graphics_cpu_ms). Screen capture:/data/system/capture/y2-screen-stream→ hostffmpeg -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_REVISION3;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_interval16.7 ms whileui.animating()).Work list, in this order:
- 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()(platformworkloadQoS,reborn_platform::workload::CpuWorkloadLease, as artwork decoding does; check the classes and the lease API first). (b) Profileui.drawfor Cover Flow on the host with ~300 tracks (likely:album_detailfilters all tracks every frame,visible_rows/row_atper cover, text fitting); cache per-focus strings. (c) Re-measure on the device with the 40-s sampler (frames/s fromgraphics_framesdeltas) and a capture.- 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).- Owner checks on 24: start-up colour flash gone? (
dmesg | grep handoffshowsbacklight off until the first Linux frame/backlight restored); Genres populated after the one-time tag re-read.- 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.- 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 checktools/preview/gles_compare.pyonreborn-previewoutput; 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) becausemain_loop_intervalslept the idle 250 ms between wheel events. 24 waits 16.7 ms whileui.animating(). Packageout/y2linux-platform-v1-power-final-candidate-24/(fallback 23), BOOTIMG653c7d85…dda7, Y2ROOT21f21e47…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_REVISION3, Genres screen, genre: filter, All Songs, seven-row home),116f673(rendererQuad.warp, texture2DProj; harness/compare/rasteriser),83c9127(Cover Flow viewviews_coverflow.rs, motionflow.rs, open/close flight, full-res centre cover via artwork workerwant_cover→collection_artwork, Album view setting). Packageout/y2linux-platform-v1-power-final-candidate-23/(fallback 22), Linux7f5445d, BOOTIMG9ea7a943…75cb, Y2ROOT8fff0f83…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 (metricsgraphics_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.koin the initramfs): backlight off before park, relit 50 ms after the first Linux enable (3-s fallback, relit on unbind/probe failure). Packageout/y2linux-platform-v1-power-final-candidate-22/(fallback 21), build430ff11, BOOTIMGf73ba54c…402b, Y2ROOTd7d21d71…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'sbl_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). Packageout/y2linux-platform-v1-power-final-candidate-21/(fallback 20), build0b3e0e1, BOOTIMGea1da0b7…908e, Y2ROOT9a9b99ce…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), receiptsout/deep-sleep-final/build20-receipts/, build commitc853915. BOOTIMG1ffdb4a2…3c55, Y2ROOT98ffdca9…9548. Suite 689/exit 0. Change: never-initialised UART1 (all-zero registers) reclaimed by CCF at boot (idle-clock-policy.h). Checks:clocks.unused_handoffUART1never_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 (ourlast_lostpremise) — 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), receiptsout/deep-sleep-final/build19-receipts/, build commit0fa5135. BOOTIMG49494899…44ed, Y2ROOT1e6a61fc…f4d5. Suite 689/exit 0. Reportdocs/validation/Y2-PLATFORM-V1-POWER-FINAL-19.md. What changed:spm.pwrap_gate(owner switchpwrap_gate, default on): INFRA_PDN_SET bit 23 right beforey2_spm_suspend_arm(after the last AP PMIC access), CLR right aftercpu_suspendreturns (after the backstop re-arm, before INFRA/PMIC/VPROC restores) and on the arm-failure path; state linepwrap_gate…in the SPMstate. First checks: boot/display/audio/radios/USB;pwrap_gate=1; a ~35-min sleep first (pwrap_gates=pwrap_ungates, failures 0,pwrap_gate_stabit 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 flashfallback/(18). The 18 boot69ef8c26is 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_enterand must be ungated before the first restore. The probe tainted boot69ef8c26(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) andPWRAPstate → 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), switchgolden_applybit 16; then readlast_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 stilllast_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: compareINFRA_PDN_STAbit 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
69ef8c26healthy, archive 113) AND PUBLISHED ASbaseline-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). Packageout/y2linux-platform-v1-power-final-candidate-18/(fallback = 17 =baseline-17), receiptsout/deep-sleep-final/build18-receipts/, build commitd2fff53(test-only545b90eand later). BOOTIMG5d405228…2ace, Y2ROOT71852869…2c612. Container suite 685/exit 0. Reportdocs/validation/Y2-PLATFORM-V1-POWER-FINAL-18.md. What changed:pmic-sleep-policy.h+pwrap.pmic_sleep(owner switchpmic_sleep, default 7): inside the SPM enter, after the VPROC step, group 1rg_clksq_en_aud→0 andrg_adacck_en→0, group 2 drv_2m/rtc_mclk/efuse/auxadc_ctl clocks gated, group 4 VREF18 off; exact restore before VPROC restore; statepmic_sleep_state(also in diagnostics rows). PMIC golden capture now after both steps. Journal rows keepsuspend.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 sleeppmic_sleep_stateentries=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 flashfallback/(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=0is 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 inAudDrv_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 likegolden-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 readlast_lostand 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 INFRAlast_loststill 0x0 → item 3 (other requesters) is next.dma_unmask_lostwent 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 onremaining_uah_estimateat 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), receiptsout/deep-sleep-final/build17-receipts/, build commit0459116(test-onlyebdfcf8after). BOOTIMG2ddd8d38…0b76, Y2ROOTdc1f057a…3e76. Container suite 682/exit 0. Flash BOOTIMG + ANDROID only withMT6582_preserve_data_scatter.txt, Download Only. Reportdocs/validation/Y2-PLATFORM-V1-POWER-FINAL-17.md. What changed: (1) MD1 request gate (spm.md1_gate, owner switchmd1_gateinpower-features.json): PERICFG MD1_SET 0x20 = 0x3ffffff atapplication_ready, readbackmd1_sta, re-gated at every sleep entry (md1_regates). (2) Wake order:product_sleep.pycalls Rebornsleep_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 fromd1953fa(MMSYS DCM in 0011, DMA-unmask readback bits 15..8). First checks, in order: (1) display, thenstateshowsmd1_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 flashfallback/. (2) Owner wake feel: screen should come in ≈1 s (16: ≈2.6 s); checkdmesgthat the DSI modeset now precedes the CONN/WMT lines. (3) After one sleep: goldenPERI_PDN0_MD1_STA e=3ffffff 1, andy2_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 iflast_loststays 0; PMIC golden; remaining SoC golden; stock suspend hooks; further wake steps (leanerkernel_resumedrecord ≈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 (archiveout/deep-sleep-final/evidence/20261013/110-power16-overnight-return/, bootf871fd6a, 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=32is 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. INFRAlast_lost=0x0on all 33 restores,PERI_PDN0_MD1_STA=0at every entry, SoC golden 11/34 and PMIC 15/44 unchanged. Owner wake:kernel_resumed10:24:29 →complete_result_010: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, kernel6.18.56-y2linux-platform-v1-power-final-16, root v1.46), packageout/y2linux-platform-v1-power-final-candidate-16/(fallback 15), built froma4e9c3b. Everything is pushed to GitHubmain(baseline-15is still the last tag; tagbaseline-16once 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 onout/rea/fm-kernel.elf, an ELF wrapper of the stock FM kernel with its kallsyms; rebuild it with a ~50-line ELF writer ifout/reais 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 boot0b0e8a77, and product sleep refuses on a tainted kernel; if the owner did not hold-Power restart before unplugging, the rows showsuspend_refused_kernel_sleep_unavailableall night. Archive read-only first (109layout:first-return.json,persistent.tarof/data/system/platform,/data/logs,/run/y2), next number110. Readsleep-diagnostics.jsonl(kernel_resumedrows carrygoldenwithextrarows andpmic_golden) andpower-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):
- 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_featuresand a boot-time readback of MD1_STA 0x30. Main suspect for INFRA never powering down (last_lost=0x0on every 16 sleep).- Already fixed in source (d1953fa), only needs the build: the MMSYS DCM call (0011 overlay hash) and the DMA unmask readback field.
- INFRA power-down: after 1, read
y2_infra/statelast_lost; if still 0, find the remaining requester (SRCLKENA, PCM R130xe8060000bits, MD_MASK 0x38 = 3).- 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).- Remaining SoC golden rows (11): bus DCM at entry (TOPCKGEN+0x004, stock
bus_dcm_enablewrites 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).- Other stock suspend hooks: panel deep standby (
lcm_suspend0xc04a24f4 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.- 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_resumed16:08:33 →restoring_radios16:08:33 →complete_result_016: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.- 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
/permissionsapproval 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 itsresult_sha256inkernel/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), receiptsout/deep-sleep-final/build16-receipts/, build commita4e9c3bonmain(not pushed), docs8ce5c5c. BOOTIMG2f1cd1c0…debf, Y2ROOTbd4a12a0…3d9f. Container suite 676/exit 0. Flash BOOTIMG + ANDROID only withMT6582_preserve_data_scatter.txt, Download Only. What changed (ledgerdocs/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/afterin the y2-usbstatus); 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_onsin/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.jsonand restart, or flashfallback/. (2)stateshowsdcm_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); readdma_unmask_lostanddma_intr_before. (5)goldennowentry_differenceswell below 26;pmic_golden44 rows;extraMD1 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 (frompmic_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, kernel6.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: archiveout/deep-sleep-final/evidence/20261012/107-power15-first-check/). Packageout/y2linux-platform-v1-power-final-candidate-15/(fallback = 14). Code: published asmainand tagbaseline-15in both repositories (2026-10-12); work on 16 continues onmain. Device SSH:ssh -F /dev/null -o HostKeyAlias=y2linux-production-v1 -i ~/.ssh/y2linux_ed25519 [email protected]; leaseflock -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 bootbbea610d, uptime 21 s at capture, taint 0). Rows of boote2952adfinextracted/data/system/platform/sleep-diagnostics.jsonlandpower-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=0x1every 1800 s, last wake0x20by the owner); vproc_sleep, phy_savecurrent, wheel_sleep 16/16 without failures (wheelwake_retries=32, 2 per wake, as on 14). Still unchanged: INFRAlast_lost=0x0,pdn0 0x2fcfbfd->0x2fcfbfdon every restore (no real INFRA power-down); goldenentry_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, UDCconfigured, 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_aborts6 → 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 inphase=INHIBITED,charge_limit_ua=70000, "Not charging" (consequence to re-check once USB works).- Diagnostics gap:
y2-usbstatus 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; theout_pathsummary 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()vsy2_usb_register(), Track A.2).Track A — resume 100 %.
- 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_aborts6 → 12. Receive uses PIO (rx_dma=0), transmit uses Inventra DMA. Hypothesis: the MUSB DMA-interrupt unmask (registerMUSB base + 0x200, bits 24..31) is written exactly once, iny2_musb_dmacreation (kernel/platform/usb.c:writel(0xff0000ff, base + 0x200); upstreamdrivers/usb/musb/mediatek.calso writesDMA_INTR_STATUS_MSK | DMA_INTR_UNMASK_SET_MSKonce at init). If the MAC loses it in SPM sleep, DMA completions stay masked forever.y2_musb_enablerewrites L1INTM (15with DMA) on reconnect but never 0x200;y2_musb_clear_staleonly W1C-clears the low byte. Verify read-only first: adddma_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-usbstatusattribute and tosleep_diagnostics.usb_net; expect bits 24..31 set before sleep and 0 after the wake. Fix (16): wheny2_usb_dma_active, re-write the unmask (0xff000000, plus W1C of the sampled low byte) iny2_musb_enable()and/ory2_musb_after_restore(), with a host test in the style oftests/test_usb_*. Fallback experiment only with owner consent (a live sysfs write): one night withecho 0 > /sys/bus/platform/drivers/y2-usb/*/phy_savecurrentto rule out 13's PHY save-current. Note 12 showed Defect B once before PHY save-current existed.- After the wake the reconnect ran only stages 5 → 6 (first plug-in after boot runs 1 → 6). Check
y2_usb_reconnect()againsty2_usb_register(): anything the full path programs that SPM sleep can reset (DMA unmask above, FIFO layout is rechecked inmusb_start).- 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_STATUSbit 6 during sleep, and what the stockslp_infra_pdnpath does that we don't (out/deep-sleep-final/vendor-suspend-source/is gone; re-extract fromevidence-private/20260908-ram-map/fm-decompressed.bin+fm-symbols.json).- 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 EINVALfromy2-platform boot-stage(S03y2-platform) andcpu-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 logsSkipping unprepare of already unprepared panelat 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); datadocs/validation/data/y2-stock-suspend-golden-20261011.json; capturecat /sys/devices/platform/10006000.power-controller/golden(also stored in eachkernel_resumedrow). 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 sleepdone (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 indocs/planning/roadmap-gap-audit.mdbefore 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 withsystem_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/, receiptsout/deep-sleep-final/build15-receipts/; branchespower-final-15in both repositories (not pushed;mainstays Baseline 13). BOOTIMG86dc957a…844d, Y2ROOT0b14b794…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 setsprepare_prev_first, because 6.18.y reverted the DSI host'spre_enable_prev_first; Mesa 26 loads Lima fromlibgallium-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 flashfallback/(14). After that, the 14 sleep test (diagnostics rows insleep-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.18withlinux-6.18.archive-sha256; the old 6.18.0 tree is kept as.cache/sources/linux-6.18.replaced-unknownand the old Alpine sandbox as.cache/environment-alpine-3.22.1-retired(both can be deleted).build.pyneeds--resume kernelon an existing output folder. BUILDING.md still describes thebaseline-13tag; 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/, receiptsout/deep-sleep-final/build14-receipts/, branchpower-final-14(build commit9d06ac4, not pushed). BOOTIMG273dc927…3e5a, Y2ROOT78203697…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: Winewinedevice.exe(Battle.net, since 19:51) and KDEkiod6both 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_reasonudc_change/udc_follow_up,features,usb_net,kernel_tail) andpower-journal.jsonl(usb_net). Next decisions: the Defect B fix (A/B withphy_savecurrentoff 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=6insuspend-last.json, yet the host got 0 bytes (no ARP) for 3 min. The owner powered off (shutdown_execute18:42:29 host), then offline charging, then a cold boot8cdde856(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 afterresume_noirqwith the new PHY save-current; A/B withphy_savecurrentoff). Published:origin/mainof both repositories = Baseline 13 (13 source + tests +package.py --stockpackaging fix + README/BUILDING/INSTALL), tagbaseline-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). Boot604bc0e6-c8d6-48bb-a963-6d884787b088, kernel6.18.0-y2linux-platform-v1-power-final-13, build47c1cf2, taint 0,pm_async0, 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_statestage=not_attempted, sleep_uv=850000; CPU DVFS stillsoftware_VOSELat 0x21e, prepared=1);lp_selapplied=1 on VA/VIO28/VUSB/VM/VIO18/VMC/VMCH/VEMC3V3 (dmesg 10.7 s, CID 0x2023);y2-usb/*/phy_savecurrentenabled=1; wheel/sys/bus/i2c/devices/0-0051/sleepenabled=1 firmware=1 method=sleep_command (dmesg "firmware 1: suspend uses sleep command"); SPMmode=SPM_CPU_SHUTDOWN_INFRA_PDN maintenance_seconds=1800;y2_infra/statesaves=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 (nowcolumn; 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 leaseflock -n /tmp/y2-platform-v1-device.lock, archive withpython3 out/deep-sleep-final/capture-return.py out/deep-sleep-final/evidence/<date>/<n>-power13-...BEFORE anything else. (3) Readvproc_sleep_state(entries == restores, failures 0),phy_savecurrent(saves == restores, mismatches 0, last_skip), wheelsleep(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 onlybl_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 outafter 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 anddocs/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/, receiptsout/deep-sleep-final/build13-receipts/, worktrees/home/luca/Dokumente/Code/worktrees/platform-v1-power-final-13/{Y2Linux,Y2Reborn}, branchcodex/platform-v1-power-final-13(Linux build commit47c1cf225dc140d151366f9e6309a3a07556fa67, later test-only commit; Reborn71ddb0dunchanged). BOOTIMGf73c24da3abe5978f2c234bd9501a929415fc156fc5ab79ebc7755390dddc178, Y2ROOTe62cb6c7bab621e6f791359e5b56bba3a21f065d2ba864f4917b3ae808c01915; 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.jsonstayedpending(night boot11f3bfa9, matched by build identity only), so boot09ce553arefused every sleep for 4.2 h (301sleep_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.lockafter 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): stockPMIC_INIT_SETTING_V1(80 writes, 55 differ on 12, archive 99),mt6323/mt6582_power_gs_suspend_data, and stock hookstpd_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-onlygoldenon10006000.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), wheelsleep(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 fromgolden: 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 boot11f3bfa9…; the owner restarted at the end, now bootf3b6f6d3…(kernel -12, taint 0,pm_async0, 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), soinfra_pdn=1(06) andLP_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 iny2-radio ... off-runtime(sleep_service_failed:y2-radio, product_failure within 1 s). Suspecty2-platform bluetooth-power off(tools/platform/y2_platform/bt_control.py: returnsplatform_bluetooth_operation_in_progressif the lock is held, elsebluetoothctl power off) racing the Bluetoothon-runtimerestore 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 andproduct_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 whenkernel_completedis 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.jsonusb_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 displaysplatform.battery.percentas 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 (vendormt6323_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.jsonanddocs/validation/Y2-PLATFORM-V1-SUSPEND-POWER-OPTIMIZATION.md(§21 ranking). 17 differences at suspend entry on 05 (22 beforeLP_SEL); no PMIC commit exists between 05 and 12. Not done:LP_SELon 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 bits0x776/0x778. Done:LP_SELon VA/VIO28/VUSB/VM/VIO18, vendor 597-wordpcm_suspend(byte-identical).infra_pdn=1is 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:
- (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>0andlast_lostnon-zero means INFRA really powers down;restores=0after real sleeps means it never does (explains the unchanged floor). Take the device leaseflock -n /tmp/y2-platform-v1-device.lock, ssh helper:ssh -F /dev/null -o HostKeyAlias=y2linux-production-v1 -i ~/.ssh/y2linux_ed25519 [email protected].- Re-run the suspend-entry PMIC comparison on 12 with the 05-branch tools
tools/development/power-session/{suspend-probe,arm-suspend-probe}.pyandtools/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.- 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.
- 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): kernel6.18.0-y2linux-platform-v1-power-final-12, taint 0,/sys/power/pm_async= 0. The charger Full state works:status=4 full=1at 4.088 V about 5 min after boot, a cable re-seat restarted the cycle, thenFullagain (hold at 4.175 V, 4.093 V after 60 s);BAT0/status= Full,/run/y2/power.jsonpercent = 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):
- 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).- Did it reboot?
uptime, boot id (was11f3bfa9…),/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 forY2_DPM_STALL: withpm_async=0any new stall should show a real blocked driver, not onlydpm_wait_fn),/data/system/platform/retained/boot-*.tar.- 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.jsonpercent, 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.- 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_UVinkernel/platform/charger-policy.hneeds 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/, receiptsout/deep-sleep-final/build12-receipts/, worktrees/home/luca/Dokumente/Code/worktrees/platform-v1-power-final-12/{Y2Linux,Y2Reborn}, branchcodex/platform-v1-power-final-12(Linux21f2c86084068b8b71841b2edaa6872dc9037762; Reborn treeaa10a9f8…unchanged). BOOTIMGf33fac4ddeb14888395fab1e33f1837b4cb20b86b6feecedbe8f925a33ab0dc8, Y2ROOT215892b5a2e5cacc8172da01a92dd0cf9dd5f720944d1585ba7be1417ade90d1; 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 retainedY2_DPM_STALLdump (pstoreconsole-ramoops-0) shows onlypython3and one async worker indpm_wait_fn, nothing blocked in a driver, so the wheeldisable_irqtheory 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 withfull=0all 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/statusshould reachFullwithin minutes; then repeated unplug sleeps (readsuspend-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 bygit filter-branchat ~01:48 on 2026-10-11 (not by this work); tips keep identical trees (11 wasabbb2038…, now71ddb0d…). 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 (kernelmediatek-drm: flip_done timed out,vblank wait timed out; Reborngraphics 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 memoryy2-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/, receiptsout/deep-sleep-final/build11-receipts/, worktrees/home/luca/Dokumente/Code/worktrees/platform-v1-power-final-10/{Y2Linux,Y2Reborn}, branchcodex/platform-v1-power-final-11(Linux5741d161699582d5a2696c658c7ede05c712a6ae, Reborn 0.3.0abbb2038dc392c520d76ce6e5a2747a68578252b). BOOTIMG1482316d69e470c7625ea5805dbb4e17172ebebad2ecfb9f205c43b155f2ee08, Y2ROOT4773d90d11213c5f676dd9f9027a809bf04a635164947bb3e6670f738515d73c; 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+ generatedtools/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/, receiptsout/deep-sleep-final/build10-receipts/, worktrees/home/luca/Dokumente/Code/worktrees/platform-v1-power-final-10/{Y2Linux,Y2Reborn}, branchcodex/platform-v1-power-final-10(Linux build commit04aa8f92080fba6cdefa4f73b5c7ca81d5c5bdaa, later test-onlya08ad79; Reborn 0.3.0f31c94c5775aee855589392447ba56ff1bf892ab). BOOTIMG9d1f00a528f14824bef9eae5e65c4bd9cca00f38fc440e038c52e2cd67ecf0ca, Y2ROOT77a41a333ca27e9092dbafa37dc3f8da87ec6810c81398fa2258a1c116eafe16; 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/cachegrowth, 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/, receiptsout/deep-sleep-final/build09-receipts/, Linux9d9d5c454d1eb7cfa461955dad522f5b890f3bf9(branchcodex/platform-v1-power-final-08), Rebornac5502e. BOOTIMG0dabbfabce27f6d33c139136e2df2c1cef08ed6ce89da1f5143aebe0b3de2077, Y2ROOT0225ff37ef1668111f7ce2d2579ddda8b2f22d06761f5d1c7054649b00d9d28c. Container suite 630 PASS. 08 was flashed by the owner and is healthy. Y2Media was provisioned on the device (ext4Y2MEDIA, 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/, receiptsout/deep-sleep-final/build08-receipts/, worktrees/home/luca/Dokumente/Code/worktrees/platform-v1-power-final-08/{Y2Linux,Y2Reborn}, branchcodex/platform-v1-power-final-08(Linux build commitd9fd5a7b57927fc22b4d62d9ee49a8e03c3cb170, later tests/docsc65080d,32a9d13; Rebornac5502ea96f4d85a9cdbb32f210d46e658430abd). BOOTIMGad39788aa61303633d875ee4ff30068faa87ef5778496f31ec768144b449efb1, Y2ROOTe79bac968b559e19332a54dafa00566a552e028c0ea86999b46f2e8424eec71a; kernel-power-final-08, root v1.38, release.8. New in 08: Y2Media = stock FAT p8 as ext4Y2MEDIAat/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/musicwith 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/, bootbed8cebd, taint 0,Y2INFRA mode=powerdown fallback=0) but its first power-down cycle has NOT been run (battery was 8%, then charging). Packageout/y2linux-platform-v1-power-final-candidate-07/(ownOWNER-HANDOFF.md,VALIDATION-REPORT.md,SHA256SUMS,fallback/= sealed 06), symbols…-candidate-07-symbols/, receiptsout/deep-sleep-final/build07-receipts/, worktrees/home/luca/Dokumente/Code/worktrees/platform-v1-power-final-07/{Y2Linux,Y2Reborn}, branchcodex/platform-v1-power-final-07(from 06 tipbd7e54d; build commit551baad703b31c4fadfd0db96478481c0f5067bc, later docsb78e037,017aa18), Reborn97ff8c3unchanged. Kernel6.18.0-y2linux-platform-v1-power-final-07, root v1.37, release1.0.0-platform-v1-power-final-candidate.7. BOOTIMG65a1daf484bb54cde14f6dd4906bd9b6b72872213a9409b2ea1fdc3fd38a3001, Y2ROOT83a61c1e73c5fa34acc7d6e9af707ac0fd54d20e1226da2ae278846ff6d19e66. What it is: 06 + the complete vendor charging policy. Verified stockCS_VTHtable (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 (pagedocs/knowledge/charging-current-policy.md). Raising the ceiling is root-only, volatile, logged; owner ramp tooltools/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_statenew fields,y2_infrastate, gadget/MTP/mounts), PC charging +tools/usb/qualify.pyMTP matrix while charging, wall charger re-classification without reboot, and ONLY THEN considercharge-qualify.py rampon 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/(ownOWNER-HANDOFF.md,SHA256SUMS,validation/,fallback/= sealed 05), symbols…-candidate-06-symbols/, frozen worktrees/home/luca/Dokumente/Code/worktrees/y2-power-final-06/{Y2Linux,Y2Reborn}(Linuxc1ef37a6f6338b3abe7fcb4f2aa505b6fb861075, Reborn97ff8c3unchanged), dev branchcodex/platform-v1-power-final-06(worktree…/worktrees/platform-v1-power-final-06/Y2Linux, later commits: probe pina2fe9a7, test fixturea9f9b0e, reportbd7e54d), receiptsout/deep-sleep-final/build06-receipts/. Kernel6.18.0-y2linux-platform-v1-power-final-06, root v1.36, release1.0.0-platform-v1-power-final-candidate.6. BOOTIMG (7260160 B)64a916282b383116fb5d323fe60f5fbf638ae966291ce20827617fd23147869f, Y2ROOTe1c0bcd3dc200c3fa2179d65ab18ba1358c46fc4b6fe0b2740f7f44f6c23e4be. 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-2560ee71194…6ab94); the 05 report/handoff "480-word dpidle" was the runtime-idle line (fixed on the 06 branch). Stockslp_infra_pdndefaults to 1(
0xc09b1084=01 01 01 00inevidence-private/20260908-ram-map/fm-decompressed.bin, base 0xc0008000, symbolsfm-symbols.json; retained extraction:out/deep-sleep-final/vendor-suspend-source/stock-infra-pdn/). Our difference wasinfra_pdn=0.- 06 changes:
infra_pdn=1arm + CLK_CON readback; PERICFG save/verify-restore right aftercpu_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) andINFRA_PDN_ENTRYjournal stage (previous boot died inside the attempt => retained next boot); owner switch/sys/firmware/y2_infra/{mode,state,diff}; UARTSLEEP_ENre-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 (noplatform_device_unregister).- Defect 2 root cause (new): the 05 Oops was the
usb0ECM netdev's danglingdev.parent(stack bytes"usb0") after the 01:34 terminal USB stop unregisteredmusb-hdrc; firstipafter the radios came back crashed. Notwlan0.- Offline qualification: full container suite 581 cases PASS (at
a9f9b0e; first run atc1ef37astopped at a stale USB fixture —tests.shaborts 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 withcapture-return.pyfirst on any return), checkdmesg | grep Y2INFRA,/sys/firmware/y2_infra/state, then ONE normalunplugged cycle. Success signature: same boot,
Y2INFRA: restore result=0 ... pdn0 <saved>-><0x0>,restore_failures=0,fallback=0.last_lost=0after a long sleep means INFRA did NOT power down (checkCC_DISABLE_INFRA_PWR, PWR_STATUS bit 6). Failure: ~30 s backstop reset or no wake (hold Power 10 s); next boot saysprevious_boot_died_in_infra_pdn; archive first, thenecho retained > /sys/firmware/y2_infra/modeto 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), datay2-power05-overnight-20261009.json. Boot3cae62f2, taint 0, image 05 unchanged.88a-accidental-unlocked-readonly-capture/is a stray duplicate (capture-return.pyhas no argparse:--helpbecame the output dir; read-only, no device change). Time bases: journal wall time is CEST;/data/logs/system.logstamps are UTC (+2 h); useboottime_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 labelunknownis 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/0on 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(Commip, pid 4183) right after
wlan0 registered. Register r5=0x38 =IFLA_PARENT_DEV_NAME, sodev_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 refusedkernel_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 guardpending:false.lp_selis 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 linkruns right after registration (y2-mt6582-wifi glue), regression test; (c) re-check whether thekernel_sleep_unavailablerefusals 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 earlierY2USB IRQ overflow; (e) still open from before: Power/RTC wake and early boot on 05, A/B withlp_selcleared, optional USB-meter measurement, then thepcm_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/(ownOWNER-HANDOFF.md,SHA256SUMS), symbols…-candidate-05-symbols/, worktrees/home/luca/Dokumente/Code/worktrees/y2-power-final-05/, receiptsout/deep-sleep-final/build05-receipts/. Linux837b6146ee4d0f551b69cfaddd686a69ce56a060(branchcodex/platform-v1-power-final-05, based on 04), Reborn97ff8c3unchanged, kernel6.18.0-y2linux-platform-v1-power-final-05, root v1.35, release1.0.0-platform-v1-power-final-candidate.5. BOOTIMG (7256064 B)0137a855db96d8f94005333941495c4fdaa2f81c9eb653458b77e9c0fd044117, Y2ROOT9175185fd577b759302337cc8d17f678fde3dc621525b90d45cf6cb370e99a4d;fallback/= sealed 04. Change vs 04 (only): vendorPMIC_INIT_SETTING_V1LP_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 0clears,echo 1sets). The bits live in the PMIC and survive reboot:echo 0before 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 (boot3cae62f2, 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 indocs/validation/Y2-PLATFORM-V1-SUSPEND-POWER-OPTIMIZATION.mdon branchcodex/platform-v1-power-final-05(worktree/home/luca/Dokumente/Code/worktrees/platform-v1-power-final-05/Y2Linux), with datadocs/validation/data/y2-suspend-power-optimization-20261008.json,y2-pmic-suspend-golden-vs-awake-20261008.json,y2-suspend-probe-analysis-20261008.json, and toolstools/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 (vendorSPM_WAKE_PERIOD), 603 s cycle with ~3 s awake; (2) CORRECTED 2026-10-09: Y2Linux full suspend ALREADY runs the vendor 597-wordpcm_suspend(byte-identical, SHA-2560ee71194…6ab94; the "480-word dpidle" in earlier text was the runtime-idle line). The only difference from the vendor default (infra_pdn=1) isinfra_pdn=false(CC_DISABLE_INFRA_PWRset) 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 withcapture-return.pyunder the host lease before anything else; then Power-button and RTC wake and early-boot on 05; overnight A/B withlp_selcleared; optional USB-meter top-up measurement (KWS-2303C class; verify mAh counter, D+/D- pass-through); then decide onpcm_suspend(06). Notes: never read/sys/power/wakeup_countor/proc/kmsgover SSH; the PWRAP write allowlist inkernel/platform/policy.his 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/(Linux837b614on branchcodex/platform-v1-power-final-05, worktreesy2-power-final-05). 04 + vendor LP_SEL on five LDOs with runtime revert/sys/firmware/y2_pmic/lp_sel; BOOTIMG0137a855…44117, Y2ROOT9175185f…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 commit5e26757), Reborn97ff8c357bab12319087740d7c97b5051e6588f5(unchanged), kernel6.18.0-y2linux-platform-v1-deepsleep-final-04, root v1.34, release1.0.0-platform-v1-deepsleep-final-candidate.4. BOOTIMG (7256064 B)4738de48bea8a9970e89cc8d703c824ac3faec103ab2ed6989270816f9ace5f6, Y2ROOT (536870912 B)b0e667515971da65e1a48afb222248bf68e841bef9d015ad9669944c9bafc041. Owner folderout/y2linux-platform-v1-deepsleep-final-candidate-04/(ownOWNER-HANDOFF.md,SHA256SUMS,fallback/= sealed 03), symbols…-candidate-04-symbols/, frozen worktrees/home/luca/Dokumente/Code/worktrees/y2-deepsleep-final-04/, receiptsout/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/LOCKretained-ring phases (9/10) around the silent steps ofdevice_suspend()plus legacy-bus logging (overlay0059), and a built-in device-phase stall sampler inpm-journal.c(4 s/12 s after a successfulDPM_PREPARED: ring notesdpm_stall/S:/D:/dpm_blockedand 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.i2ccallback 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 globalasync_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
0x20labelledunknownby 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, labelunknown), PM COMPLETE seq48, Reborn restored, ext4 errors0, 04 guardpending: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.pyunderflock -n /tmp/y2-platform-v1-device.lockBEFORE anything else, thenimage04-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 04System.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/kmsgover 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:
- Chronology. Archive65's host capture (03:12:20 CEST, BOOTTIME 182 s) puts
boot
0132fb21start near 03:09:18 CEST, so the kernel suspend request (BOOTTIME 398.4 s) fell near 03:15:57. Archive66's first SSH (07:44:11 UTC, BOOTTIME 23261.9 s) puts boot81dce40cstart near 03:16:29 CEST. The unplanned reset therefore came roughly half a minute after the last callback, not hours later. That is consistent with the 30 s RGU backstop the product helper arms before every entry (product_sleep.py), within host-timestamp error of several seconds. It does not prove the reset source (RGU status is raw0 even for known backstop resets). The ring headerbackstop_s=0only reflects that the helper's HELPER_REQUEST mark resets the ring before the backstop is written; it is not evidence that no backstop was armed. - What the ring can and cannot say.
y2_pm_device()is called only fromdpm_run_callback(), so it records devices that have a PM callback. Every logged entry has its leave. The stall is therefore in a step the ring cannot see:dpm_wait_for_subordinate(),pm_runtime_barrier(),device_lock(), the silent post-callback bookkeeping,dpm_list_mtx, or the globalasync_synchronize_full()at the end ofdpm_suspend()(Linux 6.18's new asynchronous scheme). A bus hang inside a runtime-resume triggered by the barrier is also possible and would be silent. Every failure so far (clean02 archive28b, 404ef43c core, 03 boot 0132fb21) ends at the same11008000.i2cleave; the registration order after it is not yet known. - No known upstream cause. Stable 6.18.y PM-core fixes after 6.18.0
(
f384497,c9670fd,bc6fdd4) concern the late/early runtime-PM enable order, a no_pm completion token and prepare-error cleanup. None describes a device-phase wait, so no backport is justified by the evidence. - Prepared, unbuilt diagnostic (smallest that separates the hypotheses).
Overlay
0059now also recordsWAIT(before the child/consumer wait and runtime barrier) andLOCK(arounddevice_lock) ring entries per device and logs legacy-bus suspend.pm-journal.cgains a built-in sampler armed by a successfulDPM_PREPARED: at 4 s and 12 s withoutDEVICES_SUSPENDEDit writes the suspender's wchan and up to three D-state tasks to the retained ring and full stacks (suspender, blocked tasks, busy workqueues) to the RAM console with only that console un-suspended. No external module: no taint. A hard bus hang that stops the worker is itself distinguishable (ring ends at the lastWAIT/LOCKentry with nodpm_stallnote). Regression:tests/test_dpm_stall_diagnostics.py(7 cases); fix01-03, platform suspend, CPU PM, product auto-sleep and sleep-product suites still pass (102 cases); the three changed objects cross-compile warning-free under the production config in the locked sandbox (out/dpm-stall-compile-check/, new directory). - Not claimed. This is diagnosis tooling, not a fix. pstore/DRAM retention
across the RGU reset is unproven for the console sink (the SRAM ring is the authoritative sink). Nothing here changes the pending 03 guard or any evidence.
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.
- Owner: approximately six hours unplugged, around88% at removal and55% in the
morning; no manual restart after installation. Pre-cable journal confirms 55%, so the displayed endpoint is not merely stale UI. The estimated drop is about33 percentage points (about5.5 points/hour using the owner's rough time), not a measured charge/current or battery-health result.
- Installed03 identity is unchanged: Linuxcfb7e09/Reborn97ff8c3/rootv1.33;
Reborn and all three changed helpers match archive65. Boot changed from
0132fb21-8462-4f77-9faf-3a7e7f1b8429to81dce40c-9bb5-4f14-8465-c7e80ba3c602. The boot ledger marks the previous shutdown unclean. Old boot requests kernel suspend at BOOTTIME398.407s; retained sequence8 ends at DPM_PREPARED, callback ring ends after successful I2C at398.638s, no SPM entry/return recorded. RGU cause is unreported/raw0; pstore has no panic. Do not attribute the exact cause to I2C or watchdog. - New boot has SPM entries/resumes0/0 and380 durable
sleep_recovery_requiredrefusals. Its pending guard belongs to03 and the failed0132fb21 boot, unlike the old02 guard from installation. Preserve it. BOOTTIME and MONOTONIC advance together; no six-hour full-sleep claim. Runtime CPU0 DORMANT has807610 entries/resumes and zero restore failures; this is lower-power runtime idle, not successful system suspend. - First-entry ADC4.092187V; final dark row56%/3.846972V, then screen-on
Discharging55%/3.821484V at BOOTTIME23179.994s. Initial SSH already sees charging54%; later healthy charging55%. Keep these connected readings separate from the pre-cable endpoint. Device wall time uses build_floor and regressed across reboot; use per-boot BOOTTIME and recorded host UTC.
- Morning health: taint0, Reborn first frame/status healthy, playback paused,
PCM closed, no scan, Wi-Fi/BT off, all three ext4 errors/warnings0, USB configured, Charging/CONSTANT_CURRENT with fault/sample/stop/last errors0. No active collector/helper, RTC alarm or backstop. Host lease released after reads.
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.
- Linux source
cfb7e098eae60918f47d7b330445bf66e9d61817. - Reborn source
97ff8c357bab12319087740d7c97b5051e6588f5. - Kernel
6.18.0-y2linux-platform-v1-deepsleep-final-03, rootv1.33,release
1.0.0-platform-v1-deepsleep-final-candidate.3. - BOOTIMG
00c4399af0985e88e3345b7782bc29f02a73fd57ab39bb64db06e8b1f717fb90. - Y2ROOT
569f92e0bdc43be5ef908884e7f171698dfc76025b1ebfb80cc90b4cede5d617. - 578 platform cases PASS (541 locked-container, ten native dependency,
27 native splash), zero uncovered skips/failures. Reborn fmt/strict Clippy/ 335 tests, fresh ARM, kernel/config/DT/module ABI/QEMU checks PASS. ARM closure384 files/1411 dependencies, no build RPATHs. Preserving package and ext4 checks pass; full receipts are in
out/deep-sleep-final/build03-receipts/.
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
- Base image02, boot
f567b2c3-97eb-42e2-8c24-ffca801be25c, taint 0,only normal DRM module. SSH
[email protected], pinned key/home/luca/.ssh/y2linux_ed25519. Acquire the shared host device lease again before resuming physical work; the previous session's lease was released. - Collector
/data/logs/deepsleep-product-f567b2c3-4893, former PID8254,has exited. Archive61 retains its arming; archive
out/deep-sleep-final/evidence/20261007/62-product-30min-interrupted-return/contains the complete first-return, retained SRAM/pstore and persistent archive.analysis.jsonandpower-events.jsonrecord the review. - Owner requested an early stop and was told to reconnect. The former 01:00 UTC
reconnect deadline is cancelled. This is **OWNER_INTERRUPTED, not a thirty-minute pass: two actual SPM intervals of 600.004089355 + 343.159606934 seconds**, total 943.163696289 seconds (15 minutes 43 seconds).
- The first interval ended on the 600-second SPM maintenance timer. Screen stayed
off (
bl_power=4), connectivity remained runtime suspended, and the normal product helper re-entered suspend. The second ended with USB insertion: PMIC wake0x20, cable presence/CHRDET activity, unchanged Power12 and RTC8 counts. The product receipt labels that terminal wakeunknown; do not call it RTC. - Same boot, taint0, SPM8→10 entries and resumes, no abort/restore failure,
COMPLETE667/error0, Reborn restored, three ext4 error counters0. The observer correctly stops with
USB returned, restores quarantine and clears its alarm. The local wake-count race below did not occur in this physical trial. USB contaminates the endpoint, and immediate receipt SOC is stale; no drain percentage or thirty-minute acceptance can be derived from this interrupted run. 63-session-stop/parked.jsonverifies both operation locks are available,no collector/helper remains, RTC alarm empty, backstop idle, pm_test
none, and the persistent product guard haspending:true. All 12 stop checks pass. Reborn answers status and playback is paused. USB is configured; the finalcharger-stop.jsonshows Charging, no faults, SDP450000uA programmed ceiling (not measured current). No new deployment, reboot, flash or test at closure.
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
- Linux
0ba99f5ffbdc6af2dac6320d0b3256121642fb0cfixes bufferedPM-command replay.
/usr/lib/y2-platform/y2_platform/product_sleep.pySHA72651d6f6366b7d58a8e80cac9e5681acb00ab4e7eb0315016ac4cc1789d72da. Archive54 and/data/logs/deepsleep-live-overlay-f567b2c3-2987/retain original bytes and deployment receipt;/data/system/platform/deepsleep-live-overlay.jsonrecords 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. - Archive57 changes only
/sys/class/power_supply/y2-usb-input/power/wakeupfrom 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 commit9066f73setspower_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.
39290266a020782b7cb543048aefb33c3da68570receipt/journal changes arenow DEPLOYED, archive60, backup
/data/logs/deepsleep-endurance-journal-f567b2c3-4870/.36 affected tests pass.suspend_record.pySHA97c8a6804c4dcacfddd0dbba4cca75780a0b8061c86123fa32fba7f56a47aa73;power_journal.pySHA57add62a7b97c9ef3055abfc94e2a24d8e8bdd2075f03b6bff9800a8c6d3e1b9. 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.
- BOOTIMG
38d2da2d9f4627d32e93dd87a91dd544e44526bbb6441619c5e4cf95d26fad75 - Y2ROOT
da874614b165287a8e22799dce65c75641bd423e0ccd5d18aee99a6ebeb536bc - 543 unique production checks plus kernel/config/DT/module ABI/QEMU/ARM/ELF/
preserving package checks pass. Failed01 is retained separately;04 fallback and source-matched symbols/build remain. Do not overwrite sealed packages.
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
- 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.
- 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. - 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.his not production-integrated. - Original user-poweroff BBPU/panic defect remains separate and unresolved.
- 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 0 — safety: DONE on 2026-10-06 (see below). Re-verify the three checks, then move on.
- Job 1 — hardware: owner flashes POWER-FINAL-04, validate it, locate the suspend stall.
- Job 2 — cleanup:
out/keeps only 04, documentation is consolidated, both repos end clean. - Job 3 — integrate the 11 parallel handoffs: DONE (section below); the cleanup may now delete those merged branches.
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.
| Item | In 04 (and 03)? | Evidence |
|---|---|---|
| DAC idle bias off (rails drop when paused) | yes (from 02) | hardware PASS |
| Blocking connectivity supervisor + zombie reap fix | yes (from 02) | hardware PASS |
Reborn calls /usr/sbin/y2-platform (Power "not available") | yes | hardware, via live symlink |
| Screen-off fallback when sleep refused (qualification, charger) | yes | hardware (qualification case), unit tests |
| Wi-Fi blocked at runtime after 5 dark idle minutes on battery | yes | decision function unit-tested; never run on hardware |
Missing-AP scan backoff (autoscan exponential:2:120) | yes | runtime command measured live; supervisor code unit-tested |
| Post-thaw stall sampler, oops/panic notes, ramoops | yes | compiles, DT/config validated; never run on hardware |
Journal breadcrumbs + jiffies around codec rails | yes (from 02) | ran; showed the stall moved to filesystems_thaw |
| Slow the 20 ms polled navigation GPIO while dark | no | idea 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?) | no | unmeasured; test with headphones connected, dark, battery |
Clear stale restore_failed sleep receipt from an earlier boot | no | persists until the next request; cosmetic but wrong |
| FAST_PSP as Wi-Fi default | no, rejected | blocks C3 either way; CAM stays default |
| Automatic paused-inactive full suspend | no | gated 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
| What | Where |
|---|---|
| Source, Linux | main 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, Reborn | main 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 symbols | out/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 today | POWER-FINAL-02 (79f0925f…b307 / 93c1bf99…f147), plus a live symlink /usr/bin/y2-platform |
| Private raw evidence | out/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 reports | docs/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 harnesses | tools/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:
git -C /home/luca/Dokumente/Code/Y2Linux log --oneline -3 codex/platform-v1-power-final-03shows thedocs/harness commit on top of
1ca3673; same check inY2Reborn(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-03again.- (done, preserved as described above) Main working tree was dirty and belonged to an earlier session.
mainhas 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 untrackeddocs/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.patchand copy the untracked files. Then decide (owner) whether they are kept (merge into the consolidated docs) or dropped. - (done)
mainwas 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 branchcpu-idle-completion, 19 commits). Do it only after step 2, on a clean tree. - 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
codex/platform-v1-power-final-03in both repos, thenmainafter the fast-forward.- 04 package, 04 symbols directory,
out/platform-v1-power-final/private/(ask owner: keep or archive). out/cpu-idle-completion-02-owner-firmware/: move it out ofout/(suggest/home/luca/Dokumente/Code/Y2Linux-private/owner-firmware), then update the path wherever documentation or a runbook names it. It is required bytools/production/build.py --owner-firmware.- Stock firmware lives outside the repo (
/home/luca/Dokumente/Code/Y2Player/…); do not touch it.
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:
| Repo | New in main from the merge |
|---|---|
| Linux | AFE 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 |
| Reborn | tools/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):
| Branch | Result |
|---|---|
| storage, wifi, bluetooth, highres-audio, suspend, input | code already in 03; docs added. Absent lines: 1-15 per branch (old wait() signature, bt-control.ini location, patch hunk headers) |
| usb | superseded 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-performance | Linux side docs only |
| highres-audio-completion | new 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/):
git worktree list— for each worktree underout/:git worktree remove --force <path>, thengit worktree prune.Never
rm -rfa registered worktree first; that leaves dangling registrations.- 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. - Delete
out/power-final-documentationlast, only after Job 0 steps 1 and 3 are verified. Itsout/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.
- Delete the remaining historical evidence trees and tmp directories (
*-validation,*-physical,*-overlay, logs). - Result check:
du -sh outis a few GB;git statusinY2LinuxandY2Rebornis clean (out/and.cache/are ignored).
B. External worktrees and branches
/home/luca/Dokumente/Code/worktrees/*(16 worktrees, 85 GB): same removal procedure per worktree. Skipplatform-v1-usb-finaluntilthe owner decides about its 4 dirty files.
git branch --merged mainlists branches safe to delete (now including the 11 integrated ones). For any branch not merged (for examplewip/main-dirty-docs-2026-10-06), creategit tag archive/<branch> <branch>first, then delete the branch only if the owner agrees.- Reborn: delete
target/(rebuilds in minutes), keepvendor/; remove staleout/(27 MB).
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.
- Tag first:
git tag archive/docs-pre-cleanup-2026-10-06 mainso anything deleted stays recoverable. - 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.mdis read by package inventory code (check withgrep -rn DOCUMENTATION_CATALOG tools tests). Rungrep -rhoE "docs/[A-Za-z0-9_./-]+" tools tests | sort -uagain before deleting; this list may be incomplete. - Proposed target structure:
README.md(entry),STATE.md(single current platform state, replacesCURRENT_PLATFORM_STATE*.mdand 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). - 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. - Delete as stale: superseded per-candidate reports, dated
hardware-evidence/*directories nothing references, duplicatedcandidate indexes,
CURRENT_PLATFORM_STATE.entry-2026-09-23.md, and the old catalog rows. Evidence referenced from a kept document stays. - Rewrite
DOCUMENTATION_CATALOG.mdfrom the final tree (script it: it is generated knowledge, not prose). Update every link. - Verify: full host test run in the container (
tools/build/run.py … tools/production/tests.sh, expect 515 cases, 10 skips, 0 failures),git grepfor deaddocs/paths, then one commit per step so each deletion is reviewable. - Same pass for
Y2Reborn/docsand itsreadme.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.
- Identity:
/etc/y2linux/versions.json= release…candidate.4, build…POWER-FINAL-04, kernel…power-final-04, Linux5aeba051…, Reborn8cd365da…; boot id, taint 0. The live symlink/usr/bin/y2-platformdisappears with the new root: after the flashls /usr/bin/y2-platformmust fail while Power still works, which proves the Reborn path fix. - Smoke gate, DAC, supervisor: repeat
power-session/dac-readback.shandproc-rates.sh(they passed on 02). - 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 forthaw_stall,S:<comm>,D:<comm>,thaw_blocked,I:…mmcentries. EachS:/D:entry's number is a kernel address: resolve it withawkonout/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). Thenmount -t pstore pstore /sys/fs/pstore; ls /sys/fs/pstore— aconsole-ramoops*file means DRAM survived and gives the full dmesg of the stalled boot (enable/sys/power/pm_print_timesandpm_debug_messagesfirst).oops_pc/oops_lr/panicentries mean a crash, not a hang. Hypothesis to confirm or kill: storage I/O blocked after reset-return (filesystems_thawwaiting ons_umountwhile a task is stuck inmmc_wait_for_req), eMMC controller state not restored. Fix the cause, do not skip thaw. Backstop maximum is 30 s. - Wi-Fi idle policy: battery, dark, Wi-Fi on: after about five minutes C3 entries must appear (
cpuidle/state2/usage), Reborn event logidle_power_down; screen wake must restore Wi-Fi without touching/data/network/enabled. - 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.
- If kernel or root changes are needed: accumulate fixes and build one
POWER-FINAL-05(see~/.claude/projects/…/memory/y2-power-candidate-build-lessons.mdfor the exact build, package, validate and seal commands and the.cachepitfalls). Never flash, never push.
Facts that are easy to get wrong
- Backstop range is 10..30 s. A reset is a failed suspend, never a resume.
- C3 is gated by an active charger, so any window with USB attached shows no C2/C3.
- Associated Wi-Fi blocks C2/C3 (APDMA bit 11, BTIF bit 20); radios-off battery windows give about 74% C3.
- Voltage slopes mix relaxation with load. There is no current sensor.
- The idle-bias fix means the codec is already down at suspend, so the old regcache stall cannot recur; the new stall is later.
- Tests run in the project container (
python3 tools/build/run.py --output <build> -- sh /project/tools/production/tests.sh); the host lacksqemu-armandpyelftools, so about 58 host-suite errors are environmental. - Commit with
GIT_AUTHOR_*/GIT_COMMITTER_*= Luca[email protected]; never change git config, never add attribution.