rdmsm4x-changelog-20260923-2307-rtty-ios-local-charts-and-air-verify
rdmsm4x-changelog-20260923-2307-rtty-ios-local-charts-and-air-verify
Session rtty-ce (claude@rdmsm4x/af5abb76, Fable 5.1), 2026-09-23 22:33:11 → 2026-09-23 23:07:52 EDT on rdmsm4x. Ticket TASK-20260923-05 (child of TASK-20260923-03). Lead c13f617a.
Summary: RTTy iOS gained the three missing macOS dashboard bands (bandwidth, connection health, application health) plus a System/Light/Dark switcher with the Space Blue dark board, committed on a lane branch in a mirror for the lead to merge; RTTy 0.3.843/518 was verified installed and running on rdip17air (installed by lane I, not reinstalled); simulator preview captures before/after were produced for Rich.
Scope
- Host: rdmsm4x only. No fleet host touched, no live repo write (the
hub checkout
~/dev/apps/RTTystayed clean at e3e23bb).
Files touched
- New mirror clone
~/dev/_scratch/rtty-ios-charts-20260923(branchios/local-charts-20260923, commits f0dea7f + be515cd on e3e23bb;HANDBACK.mduntracked in the mirror). UnderApps/RTTyMobile/: 8 new source files (RTTyMobileCore/InterfaceThroughput.swift; RTTyMobileUI/InterfaceThroughputMonitor, MobileBandwidthBand, MobileConnectionHistory, MobileConnectionHealthBand, MobileApplicationHealthBand, MobileDashboardBandHeader, MobileAppearance), 7 modified (HealthDashboardView, RTTyMobileStore, ProtectedMobileHealthHistoryStore, MobileDashboardControls, MobileSettingsPlaceholderView, RTTyMobileRootView, RTTyMobilePreviewFixtures), 5 new test files + MobileChartGeometryTests pin;CLAUDE.mdcorrections. ~/dev/_handoff/rtty-ios-deploy-20260923/rdip17air-verify-rtty-ce.md(new),preview-518/(4 PNG + log, before) andpreview-charts-20260923/(6 PNG + logs, after).- Tickets: TASK-20260923-05 opened + claimed (lease to 00:58); comments on TASK-20260923-03 and -05.
- Scratch: simulator builds in
/private/tmp/rtty-ios-ce-simand/private/tmp/rtty-ios-ce-sim-charts; simulators 27044A08 (iPhone 17 Pro) and 1B6BFDC0 (iPad Pro 13") booted with the app installed.
Commands run (representative)
xcrun devicectl list devices,device info apps --device 00008150-000230290AD8401C --bundle-id com.eastcoastscience.rtty→ RTTy 0.3.843 / 518 installed (lane I, 22:32:19 + 22:36:45; probe launch 22:36:53 with accountStatus available).xcodebuild … -destination 'generic/platform=iOS Simulator'(twice per code state),simctl boot/install/launch/io screenshot.cd Apps/RTTyMobile && swift test(host): 132 swift-testing (44/85/3) + 7 XCTest, rc=0, 23:02:55–23:03:01.git commitby explicit path in the mirror; nothing pushed.
Verification evidence
- Captures viewed: bands render on iPhone light/dark and iPad; bandwidth bars fill from launch; connection band shows cellular ticks + an unreachable cell; application-health empty row present.
- Test logs in the session scratchpad
(
mobile-swift-test-{,2,3}.log).
Undo
rm -rf ~/dev/_scratch/rtty-ios-charts-20260923discards the branch (nothing is pushed). Handoff PNGs/records can be deleted.xcrun simctl shutdown/uninstallfor the simulators.ticket release TASK-20260923-05.
Outstanding
- Lead merges the branch, then installs on rdip17air
(
Apps/RTTyMobile/deploy_devices.sh --device rdip17air). - Apple Notes entry NOT written: this session runs under a Background
launchd manager (
launchctl managername= Background), so~/scripts/notes_changelog.zshrefuses by design. Add from an Aqua session:zsh ~/scripts/notes_changelog.zsh "/Users/richh/dev/LLM/Claude/changelogs/rdmsm4x-changelog-20260923-2307-rtty-ios-local-charts-and-air-verify.md".
Addendum 2026-09-23 23:19:04 EDT — second slice: Direct App Group prep (TASK-20260923-06)
- New mirror
~/dev/_scratch/rtty-appgroup-20260923(branchdirect/app-group-20260923, commit 4cb3535 on c5c4b17;HANDBACK.mduntracked). Files:script/release_plist_tool.py,script/qa_release.sh,Tests/ScriptTests/direct_app_group_{policy,bundle}_test.py,docs/engineering/DIRECT-APP-GROUP-PREP-20260923.md. - Measured: no Direct provisioning profile grants an app group
(a2b99f8b Developer ID, 9d6a4fb0 development); Standard's two do. Switch
(
Support/RTTyDirect.entitlements) left OFF; validators fail closed with the portal message. Blocked on Rich's developer-portal step. - Verification: new tests PASS (bundle test also PASS read-only
against the live
dist/RTTy.app, prints OFF); existingdirect_development_profile_test.pyandrelease_signing_test.shPASS; real-profile positive/negative controls as expected; writer output canonical-identical to the staged 518 signature. No build run on this host. - Tickets: TASK-20260923-06 opened, claimed, hand-back comment, status blocked (portal step); comment on TASK-20260923-03.
- Undo:
rm -rf ~/dev/_scratch/rtty-appgroup-20260923(nothing pushed).
Addendum — RTTy Build 519 fleet rollout (Rich: "launch new RTTy to the fleet when ready")
- Scope: all six fleet Macs mutated —
/Applications/RTTy.appreplaced with 0.3.844 / Build 519 (commit d8731a0, zip sha256 3807df7b…, exe sha256 982dde66…, notarized c0cb9ae0, Developer ID, x86_64 arm64); previous 518 kept beside it as/Applications/.RTTy.app.rollback-build518-d8731a0on every host, re-checked by hash (e474d550…) before replacement. - Order and timing (EDT): canary rdmpw3275m 23:36:40→23:37:50 (accepted 55 s) → rdmsm4x 23:38:07→23:39:12 (52 s; moved up at the lead's request so the 520 gate on this host does not collide) → rdmbair13m5 / rdmbair15m5 / jdmbair13m5 / rdmpw3265m in parallel 23:39:27→23:40:39 (55 / 54 / 58 / 55 s). 6/6 STATUS=accepted.
- Tooling: the lead's
~/dev/_handoff/rtty-build519-20260923/release/build519/tools/deploy_build519_fleet.zsh <host>(constants-only derivation of the 518 installer; path-anchored process matching). Artifact verified before the canary: zip hash, installer constants, unpacked bundle (version/build/bundle id, exe hash, lipo, codesign authority,spctl"Notarized Developer ID", BuildInfo clean). - Evidence: receipts
…/build519/receipts/<host>-deploy.txt, logs…/build519/logs/deploy-<host>.log, samples…/logs/soak-baseline-518-*.txt,soak-immediate-519-*.txt(6/6 one process, identical exe hash, 0 crash reports),soak-plus15-519-*.txt(pending at 23:51:40). - Undo: on a host,
sudo mv /Applications/RTTy.app /Applications/.RTTy.app.rejected-519 && sudo mv /Applications/.RTTy.app.rollback-build518-d8731a0 /Applications/RTTy.app && open /Applications/RTTy.app(what the installer's ownrestore_rollbackdoes on failure). - Store: ASC stays on 518 (lead's call; Rich asked for the fleet only). Apple Notes copy still pending a GUI session.
- Soak +15 min (2026-09-23 23:53:58 EDT record): 6/6
on 519, 0 crash reports; one process each except rdmbair13m5, where RTTy
quit voluntarily at 23:41:33 through the AppKit terminate path with a
person active at that Mac's keyboard (Dock/Mission Control events, local
Terminal + claude session at 23:42); no scripted sender in the log.
Relaunched 23:53:28 (pid 1372, build 519). rdmpw3265m showed a 90 %
decaying-average CPU at +15 min (ISSUE-20260915-11 class, Direct-only;
noted, not acted on). Logs:
soak-plus15-519-*.txt,soak-rdmbair13m5-after-relaunch-*.txt.
Addendum — Build 520 rollout and partial rollback (2026-09-24 00:09:47 EDT)
- 520 (0.3.845, f499f86, zip 21cceda7…, exe 44305a86…, notarized
57fd9826) verified on the artifact and rolled out 23:58:11→00:08:05 to
all six hosts (installer
…/release/build520/tools/deploy_build520_fleet.zsh, rollback baseline 519 armed by hash). - Lead STOPPED it at ~00:08 (regression: dashboard minimum window
height 988 pt; chart stack does not compress below ~1,550 pt; 13-inch
Airs cannot show the window). Rolled back rdmbair13m5,
jdmbair13m5, rdmbair15m5 to 519 (00:08:57–00:09:10): each
rollback bundle's exe hash checked against 982dde66… before the swap,
rejected 520 moved to
/Applications/.RTTy.app.rejected-build520-f499f86-rolled-back(not deleted), app relaunched, one process each. rdmsm4x, rdmpw3275m, rdmpw3265m remain on 520 (large displays). 521 will carry the fix. - Undo of the rollback (i.e. put 520 back on an Air):
sudo mv /Applications/RTTy.app /Applications/.RTTy.app.rollback-build519-f499f86 && sudo mv /Applications/.RTTy.app.rejected-build520-f499f86-rolled-back /Applications/RTTy.app && open /Applications/RTTy.app. - Evidence:
…/build520/receipts/<host>-deploy.txt(6 accepted),<host>-rollback.txt(3),logs/soak-immediate-520-*.txt,soak-after-rollback-*.txt,soak-plus15-520-*.txt(pending). - 520 soak +15 (2026-09-24 00:14:38 EDT): 5/5 reachable hosts one process, 0 crash reports (three on 520, two on 519); jdmbair13m5 offline since ~00:10 (Tailscale "offline, last seen 3m ago", off-LAN relay; ssh timeout twice) — last measured 00:09:47 on 519 with one process after its rollback; treated as asleep, re-sample before 521.
Addendum — Build 521 rollout (2026-09-24 00:56:23 EDT)
- 521 (0.3.846, 8b2f84e, zip 83773232…, exe 17c306d9…, notarized
5e06c696; carries the small-window dashboard fit fix) verified on the
artifact and rolled out 00:51:55→00:55:40 to the five reachable hosts
(canary rdmpw3275m → rdmsm4x → rdmbair13m5 / rdmbair15m5 / rdmpw3265m in
parallel), all accepted; installer
…/release/build521/tools/deploy_build521_fleet.zshwith per-host rollback baselines (Airs → 519 982dde66…, Pros + rdmsm4x → 520 44305a86…), each armed by hash. jdmbair13m5 skipped: offline since ~00:10, still on 519; the lead installs it in the morning. - Evidence:
…/build521/receipts/<host>-deploy.txt(5),jdmbair13m5-skipped.txt,logs/deploy-<host>.log,logs/soak-immediate-521-*.txt;soak-plus15-521-*.txtpending 01:06:55. - Undo per host: swap
/Applications/RTTy.appwith/Applications/.RTTy.app.rollback-build<519|520>-8b2f84eas the installer'srestore_rollbackdoes. - 521 soak +15 (2026-09-24 01:08:40 EDT): four remote
hosts one process each, 0 crash reports; jdmbair13m5 still asleep
(lead's 8 h retry loop will install 521 when it wakes); rdmsm4x's Direct
521 was terminated programmatically at 01:01:27 by the lead's Standard
screenshot automation (AppKit
terminate:after an accessibility request; no crash) — a watcher (…/build521/logs/rdmsm4x-relaunch-watch.log) relaunches it once the capture job and the Standard copy exit. - Correction (2026-09-24 01:09:22 EDT): the rdmsm4x 01:01:27 exit was a human quit (lead confirmed no automation ran 00:57:21–01:05:33), not the screenshot job; Direct 521 relaunched, pid 17151. Rollout closed.
Addendum — 2026-09-24 morning sweep, 521 CPU profile, 522 acceptance prep (2026-09-24 07:19:09 EDT · rdmsm4x)
- Span 06:23 (first sweep claim) → this addendum; budget advice
hold, so everything ran inline with no subagents. - Commits on main by explicit path, both inside the 522 gate's 1628
tests per arch: 5efdb5d (Direct
ping6gets ping6's flags plus a watchdog; the two swift-testing MultiWAN suites become XCTest; the runner-policy guard fails closed again with a negative control;qa_release.shstage-4 wiring) and 49bad10 (Project/ISSUES.md: ten overtaken Build 42/45 and continuity items → RESOLVED with dated evidence). - Tickets resolved, 8, all RTTy, 06:25–06:37 EDT: ISSUE-20260923-13,
DEC-20260904-04, DOC-20260923-01, TASK-20260923-05, TASK-20260905-01,
SEC-20260910-01, ISSUE-20260923-11, ISSUE-20260923-12. Filed:
ISSUE-20260924-12 (Store export
BuildInfo.jsonreports signingMode unsigned-structural / releaseEligible false on the signed App Store build, verified on 521; rootISSUES.mdL11 now points at it) and ISSUE-20260924-13 (P3: the release gate binds its verdict to every third-party front door at one instant; 522 gate run 1 lost to portal.azure.com at 06:59:03, 1 of 1628). Released the expired lease on TASK-20260923-06 with a note (its remaining step is the developer-portal registration, Rich's Apple ID). Evidence comments on ISSUE-20260924-06 and ISSUE-20260915-11, plus two timestamp corrections after estimated clock times slipped into ticket text (rule reinforced: take the time fromdatein the same command). - ISSUE-20260924-06 evidence: 10 s
sampleof the running 521 on rdmsm4x (pid 72175) →~/dev/_handoff/rtty-build519-20260923/release/build521/logs/sample-521-72175-rdmsm4x-20260924-0647.txt(6,960,378 bytes, sha256 c6cedeaab6c7e261…) andsample-521-72175-analysis-20260924.md(06:57:31). Main-thread shares: ~48 % display-cycle render (no RTTy frame above it; beneath it the flows-band Canvas redraw and a TimelineView invalidation, which is what the 522 render-loop change removes); ~28 % SwiftUI body re-evaluation whose RTTy frames areApplicationFlowsViewrows →subprocesses(for:)(uncached libproc calls and string canonicalization per visible row per update),FleetHealthSnapshotBuilder.build,DashboardColumnLayout.sizeThatFits; ~10 %NSStatusItemreplicant re-snapshot on every transfer-rate observation; and a ~2.6 s CPU burst once per 60 s fromcurrentFleetSnapshotJSON-decoding up to 20,160 archive rows for the CloudKit projection. Caveat recorded in the analysis:samplesuspends the task per snapshot and inflates absolute busy share; read shares between phases, never absolutes. - ISSUE-20260915-11 evidence: canary rdmpw3275m on 521 at 6h08m uptime
read top 80.7 / 100.8 / 107.1 % and rss 1968 MiB, growing ~2 MiB/min
(sampler 06:41→07:13: 1931 → 2023 MiB, cpu 77 → 82 %);
ps -Mshows the main thread carrying the time (UTIME 238 min). rdmsm4x on 521 at 14 min: 29–32 %, 510 MiB. Consequence: a fresh 522 looks better by uptime alone, so 522 is judged on rss/cpu slope and matched uptime, not on a fresh-process number. - Read-only tooling left in the handoff tree:
release/build521/logs/cpu_growth_sampler.zsh(4 h, one row per host every ~5 min intocpu-growth-<host>.tsv; started 06:41:31, pid 13002; follows whichever pid owns/Applications/RTTy.app, so it ignores the two CoreSimulator RTTy instances on rdmsm4x),release/build519/tools/accept_522.zshv1.0 (sha256 b1924df970c50923…; usage<host> [top-samples=4] [interval=5]), andrelease/build521/logs/watch-522-install.log(522 seen: rdmpw3275m 07:14:25, rdmsm4x 07:15:28 EDT; the lead's chain did the installs). - Held until the lead's "main is yours" message: the root
ISSUES.mdreconciliation, committed in the mirror~/dev/_scratch/rtty-sweep-20260924as d6f8a8d on top of 63229dc (11 insertions / 11 deletions, that file only; 7 bullets → RESOLVED, L146/L365 narrowed to what is still unproven, L11 → ISSUE-20260924-12, L642 resolved; 4 OPEN leads remain; no bullet removed). - Undo: this session mutated nothing on the fleet (every probe
read-only; the 522 install belongs to the lead's chain with its own
per-host rollback bundles). The two doc/fix commits revert with
git revert 49bad10/git revert 5efdb5d; the mirror commit is unpushed. - Apple Notes copy: still pending an Aqua session (this one is
Background); the lead is asked to run
zsh ~/scripts/notes_changelog.zshon this file.
Addendum — 522 acceptance at +15 min, ISSUES.md pushed (2026-09-24 07:32:07 EDT · rdmsm4x)
- Rollout (lead's chain, read-only observed): 522
(0.3.847, tag
v0.3.847-build522on 63229dc, Direct exe 48a819c1…, notarization c25a11b5) installed on rdmpw3275m 07:14:25, rdmsm4x 07:15:28, rdmbair13m5 / rdmbair15m5 / rdmpw3265m by 07:16 EDT; jdmbair13m5 asleep (lead's retry loop). ASC build 09e68982 attached, PREPARE_FOR_SUBMISSION. Lead's close-out commit 2d6a0d8. - Acceptance (ISSUE-20260924-06, method as written on the
ticket: display awake, window visible,
top -l 4 -s 5): rdmpw3275m at 15m48s: 38.7 / 68.0 / 63.4 % (ceiling 10 %), rss 666 MiB; rdmsm4x at 15m22s: 30.0 / 32.1 / 33.5 % (ceiling 5 %), rss 535 MiB, against 521 at 15m43s on the same host 29.1 %, 515 MiB. Not met on either host; no measurable change at matched uptime. Occluded (hidden via System Events for 25 s, then restored and confirmed visible): 0.5 / 0.5 / 0.7 / 0.2 %, meets ≤ 0.5 %. Growth in the first 15 min: canary 470 → 661 MiB (~18 MiB/min), rdmsm4x 503 → 531 MiB (2.7 MiB/min, identical to 521). +60 min read scheduled 08:15:30 EDT (accept-522-plus60.log). Ticket left OPEN with the four ranked leads; claim released 07:31 EDT. Logs:release/build521/logs/accept-522-rdmpw3275m-plus15.log,accept-522-rdmsm4x-plus15.log. - Root
ISSUES.mdreconciliation pushed: 6709bab on origin, backup and fleet (11 insertions / 11 deletions, that file only). First attempt b5f7393 reached fleet only: GitHub rejected it with GH007 (author email [email protected] from my mirror commit); amended the author to the noreply address every commit on main uses (tree hash unchanged), pushed 6709bab, replaced b5f7393 on fleet with--force-with-lease=refs/heads/main:b5f7393. Lesson saved as project memorygithub-push-needs-noreply-author-email. - Doc fix outside RTTy:
~/dev/CLAUDE.md§5 exampleticket comment <id> --note "…"corrected to the positional form the CLI accepts (re-read first; one line changed). - Pending: the "## Acceptance (rtty-ce)" append to
docs/app-store/UPLOAD-0.3.847-522-20260924.mdgoes in after the lead's soak-line commit lands (agreed sequencing), then the +60 min slope comment. Apple Notes copy still needs an Aqua session. - Record commits on RTTy main (2026-09-24 07:34:45
EDT): ca9f4b3 "## Acceptance (rtty-ce)" in
docs/app-store/UPLOAD-0.3.847-522-20260924.md; effab8bProject/SESSION-STATE.md"Why 522" row (its message over-names two files that landed in the next commit); 16f7ecadocs/RELEASE_HISTORY.md522 entry and the record's 53e0eb5 carry-table row, all three now saying the render-loop change measured NO CHANGE at matched uptime in the signed build (lead's request; my wording keeps "did not reproduce" rather than asserting the cause). Docs validator PASS 18/167/8 before each push; origin, backup and fleet at 16f7eca. Undo:git revert 16f7eca effab8b ca9f4b3. - 522 at +60 min (2026-09-24 08:17:51 EDT):
rdmpw3275m 59.8 / 82.1 / 82.2 %, rss 1150 MiB at 1h01m; rdmsm4x 33.1 /
38.6 / 38.6 %, rss 567 MiB — still not met. First-hour growth: canary
linear 12.5 MiB/min (11.4 second half) with CPU tracking it; rdmsm4x 1.2
→ 0.8 MiB/min, levelling at ~565 MiB. CloudKit publish completes every
minute on both hosts (unified log), so a failed-publish backlog is ruled
out as the growth cause. Posted on ISSUE-20260924-06 and
ISSUE-20260915-11; record line committed as dc84fc8 (origin, backup,
fleet). Logs:
release/build521/logs/accept-522-plus60.log,cpu-growth-<host>.tsv. - Fleet 6/6 (2026-09-24 08:23:19 EDT, relayed by the
lead): jdmbair13m5 accepted 522 at 08:19:24 EDT on the retry
loop's ninth attempt (hash-checked, pid 20867, no rollback); the host
dropped off both routes again by 08:21, so the receipt is the evidence.
Lead's c5d983e records 6/6 in the 522 record and SESSION-STATE. c84fa85
(08:04, front-door test hardening for ISSUE-20260924-13) was written by
neither the lead nor this session; the ticket store attributes the
resolution to agy@rdmbair15m5 at 08:05:05. Apple Notes copy of this
file: published 08:20:18 EDT by the autopublish job
(com.rdm.claude-notes-autopublish, replace-same-title); later addenda
re-publish on
launchctl kickstart -k gui/$(id -u)/com.rdm.claude-notes-autopublish. - Memory-growth measurement corrected (2026-09-24 08:55:51
EDT, ISSUE-20260915-11 claimed 08:22 → released 08:55): two
sudo footprint(1)snapshots 30 min apart on both hosts (release/build521/logs/footprint-522-<host>-snap1/2.txt, read-only). Live memory 470 → 489 MB on rdmpw3275m and 488 → 525 MB on rdmsm4x between 1h09m and 1h39m; the Intel rss (1200 → 1304 MiB) is dominated by reclaimable MALLOC_MEDIUM pages (520 → 594 MB), so every rss-based slope on that ticket, including this morning's 12.5 MiB/min, overstated — footprint or top's MEM column is the meter. The Intel CPU rise with uptime (45.3 / 62.6 / 85.7 % at 1h39m vs 36.5–37.7 % on rdmsm4x) is real and now the open question on ISSUE-20260924-06 (uptime-scaling body work over the flows history is the named candidate). Posted on both tickets; record correction committed to RTTy main (7d6d327 on origin, backup and fleet; docs validator PASS 18/167/8). No claims held.