rdmsm4x-changelog-20260916-1345-tyrell-menubar-sessions-complete-r3-soaking-resume-point
rdmsm4x-changelog-20260916-1345-tyrell-menubar-sessions-complete-r3-soaking-resume-point
Rich's Tyrell complaints (menu-bar bars inconsistent or absent; Sessions and other fields not populating) are fixed and merged to main across two lanes; canary R3 is soaking with the fixed app, and a resume point for a session restart is published in main:SESSION-STATE.md.
Scope
- Host: rdmsm4x. Read-only SSH measurements of rdmbair15m5 and rdmpw3275m. This session installed nothing and mutated no other host.
- claude@rdmsm4x/4a36fd71 · 2026-09-14 15:14 → 2026-09-16 13:50 EDT · ISSUE-20260914-12 (open, claim released), FEAT-20260914-01 (handed to claude@rdmbair15m5/dev-a7), ISSUE-20260915-09 (filed)
What was wrong, and what fixed it (all merged to main)
- Menu bar drew bars only during an active transfer; the item's width jumped 53-68 pt every 3 s. Now every enabled meter owns a fixed gauge slot (hollow = no reading, lit sliver = measured 0%), with the label column sized to the widest rotating label - measured constant 93 pt across 8 samples.
- Focus panel listed 11 raw usage buckets with bars on 3-4. Now one bar row per usage window per provider; raw buckets folded.
- Sessions titles came from a 4 KB substring peek: 20/40 recent Claude transcripts had no prompt in range and every Codex rollout opens with a ~22 KB meta line. Now Claude custom-title/ai-title (tail read), Codex session_index.jsonl thread names, agy conversation metadata, then the first typed prompt with harness tags skipped. Measured on real data: untitled Claude 20/40 -> 1/40 (a 0-byte file), Codex fallback 20/20 -> 0/20.
- Sessions had no live view; /api/sessions 404s on the deployed Build 15 daemon on both ports. Now sampled in-process via TyrellCore SessionRegistrySampler (1,272 processes in ~1 s, off the main thread, 20 s refresh), with the daemon route preferred when present and the source named in the header.
- Observatory showed "agy - unavailable" on every host (census key is gemini) and, on client Macs, a single-host heatmap: a client daemon holds only its own events (hub 5000 events across six hosts; rdmbair15m5 100 on 43118 / 1400 on 43117). Now ActivityEndpointPolicy asks the master first on clients and the chart states coverage instead of drawing one lane silently.
- Daemon Sessions/Usage series had no source events. FEAT-20260914-01 (peer lane) adds a bounded emitter: session hourly 24/host/day, usage on-change with a 2 h floor 12/host/day, per kind per host, 0 disables. Bounds sized from a measurement I took: the events table is bounded but holds 5074 rows ~ 15 days at ~340 events/day fleet-wide, so a 15-minute usage cadence would have cut retention to ~5 days.
- Two defects found while working: AppActivityEvent.id omitted kind from its hash (app-side cousin of ISSUE-20260914-15), and relativeAge rendered future timestamps as "-1619280s".
Releases
- Build 22 (app-only, on main lineage) built and notarized 2026-09-14, then SUPERSEDED by daemon-lane Builds 23/24. NEVER DEPLOY: ~/dev/_handoff/tyrell-build22-app-ui-20260914/.
- Build 25 = Build 24 source 3834d45 + the UI commits, source f97f4ce, notarized 1ed71cc3-2c75-4283-88a7-cab3278cae70, app exe d7bb71eb…, CDHash 2b333606…, DR unchanged, universal2. This is the artifact on the canary.
- Next build (not cut): f97f4ce + 9d467db + 631491b + 701fcc6 + 88d8eef + 56b1f27 + stamp. Verified head d466293: 727 Swift Testing cases 0 failures, five release script contracts rc=0.
Canary history (owner codex@rdmpw3275m/01a078a7; this session never launched or installed)
- R2 started 2026-09-15 22:21 with Build 25 app + Build 24 daemon; 30-minute short gate passed at 67.8 MiB; ABORTED 23:56 on "canary clamshell closed" (guard verify_power_envelope). Inconclusive, not a memory rejection. Fail-closed rollback to exact Build 17 app + Build 15 daemon, verified three times independently (peer, coordinator, me).
- R3 started 2026-09-16 09:40:52 after I measured and reported the lid-open condition (AppleClamshellState = No, AC, battery 100%). Short gate: 31 samples / 1800.2 s, physical end 24.59 MiB, slope 0.026 MiB/min (Build 21 was rejected at 0.91). At 13:42 state soaking, daemon PID 20671, physical 59.9 MB, RSS 145 MB, 27 descriptors, 2 TCP. Long-gate verdict ~15:51 EDT.
Verification
- Full swift test runs on rdmsm4x throughout: app branch 702 Swift Testing cases 0 failures; app+daemon packet 720; verified next cut 727. XCTest 0 failures in all.
- Screens verified with the app's own capture (tyrell-app --visual-fixture, tyrellbar --visual-fixture, and tyrellbar --status-item-diagnostics), which need no Screen Recording grant.
- Artifact identity on the canary matched the notarized build by SHA-256, not by version string.
Incidents and corrections this session
- An unannounced commit (3a2131e) appeared in this session's claimed branch adding an unused constant and a test asserting it equals its own literal. Reverted in ab291e7 on merits; caught only because the suite count moved 702 -> 703 and test names were diffed. Broadcast asked the author to identify themselves; no reply.
- A test required /tmp/providers_dashboard_fixture.png generated by an unrelated lane, so it reported red on hosts that had simply never generated it; now skips honestly (56b1f27).
- main (74f1a59) does NOT contain be3e664/093d653/3834d45. A build cut from main would ship a daemon older than the one under canary. Broadcast to all lanes and recorded in the resume block.
Outstanding owner actions
- Rich: add the read-only ECS_LIBS_TOKEN GitHub secret (needs his login). Until then CI fails at preflight and skips every checkout, so PRs show red on work that is green locally.
- Coordinator: the R3 long-gate verdict ~15:51 EDT; then cut the next build from the verified cherry-pick list; and answer whether a soak may run with the lid closed on a host with AC sleep disabled and sleep assertions held.
- ISSUE-20260915-09: two load-sensitive TyrellCoreTests (WorktreeEngine commit-tree empty stdout; SafetyInvariantsTests.swift:42 elapsed < 2.0). Core lane's.
Resume after restart
Read main:SESSION-STATE.md top block ("RESUME POINT"). main = 74f1a59 on hub, backup and fleet, all in sync, tree clean. Ticket claim released; nothing half-applied.
Undo
Every change is a commit on main or a named branch; artifacts are in ~/dev/_handoff/tyrell-build2*/ and nothing is installed by this session. The cutcheck worktree can be removed with git worktree remove.