rdmsm4x-changelog-20260909-2241-rtty-flows-redesign-charts-restored-fleet-notarized
Evening wrap: all three flagship apps notarized on six hosts (RTTy 505 / Tyrell 17 / ReplicantDB 41); RTTy app-flows redesign (PR #42) and chart-type restoration (PR #44) merged for the next build; Tyrell #71/#72/#75/#77 fixed; installer rollback trap fixed; budget now HOLD. Written 2026-09-09 22:41:50 EDT by claude@rdmsm4x (Fable 5.1) session_01L5FqUPjVWGsMbP4UhAqAa6.
DEC-20260909-05 — RTTy startup must never block on CloudKit; fix the app, do not promote the schema or drop entitlements to ship — 2026-09-09 21:48:46 EDT · rdmsm4x
Build 505 (0.3.830, Developer ID, notarized 645a7e79-3583-4871-851d-fabe315f5209, stapled) HELD by gate 7: with the Developer ID profile the iCloud environment is Production, the Production CloudKit schema was never promoted, and ObservationStore.publishCloudProjectionIfAvailable → currentFleetSnapshot (ObservationStore.swift:1780) blocks the main actor in applicationDidFinishLaunching — 0 windows, 0 menu bars after 75 s. Options: (1) promote the Production schema — permanent, a recorded release gate, Rich's; (2) make the projection publish non-blocking with a bounded timeout off the main actor — reversible, correct regardless of signing; (3) ship without iCloud entitlements — feature removal, Rich's. Decision: (2) now (release worker, own PR, full gates incl. gate 7, then deploy); (1) recommended to Rich separately so iCloud sync actually works under Developer ID; (3) discarded. Fleet stays on 504 meanwhile.
Checkpoint — 2026-09-09 22:24:41 EDT · rdmsm4x · ALL THREE flagship apps notarized on all six hosts
| App | Version | spctl (by execution) | Tag |
|---|---|---|---|
| Tyrell | 0.2.0 (17) | Notarized Developer ID | v0.2.0-build17 |
| ReplicantDB | 1.19.5 (41) | Notarized Developer ID | v1.19.5-build41 |
| RTTy | 0.3.830 (505) | Notarized Developer ID; embedded profile a2b99f8b… | v0.3.830-build505 |
- Correction to DEC-20260909-05's stated cause: the
launch hang was NOT CloudKit.
samplenamedObservationStore.swift:1780currentFleetSnapshotdoing a synchronous Keychain read on the main actor; the device-identity item's ACL still named the old (Apple Development) code identity, soSecItemCopyMatchingnever returned under Developer ID. Fix (PR #43, cf15adc): the read goes through the existing off-main-actor helper, AND the CloudKit projection publish is now off the probe path with a 10 s timeout, single-flight, backoff, and an explicit "unavailable:" state (that half was the decision and remains correct: an unpromoted Production schema now degrades visibly instead of blocking). Gate 7 before/after: 0 windows → 1 window, latency 15–18 ms. Tests 722/71/270, 0 failures. Lesson for every app migrating identity: Keychain items whose ACL names the old code identity block synchronous reads — audit main-thread Keychain calls before the switch. - Installer defect fixed in the handoff tool
(~/dev/_handoff/rtty-build505-20260909/…/deploy_build505_fleet.zsh, the
template the next installer is copied from): the EXIT trap assigned
status, read-only in zsh, so the rollback path was inert in every RTTy fleet installer since build 502; renamed to install_rc; acceptance window 90→180 s. Proven: the old form prints nothing underexit 3, the new one does. - Build 505 = cf15adc, which does NOT include PR #42 (app-flows redesign, merged after) — that rides the next build together with the chart-type restoration (worker running: bidirectional heatmap, ECSUI change + pin).
- CloudKit Production schema promotion remains Rich's; until then Developer ID builds report the projection unavailable by design.
- EPIC-20260909-01: 3 of 37 children resolved (ReplicantDB, Tyrell, RTTy).
Checkpoint — 2026-09-09 22:41:50 EDT · rdmsm4x · charts restored; budget HOLD; next build queued
- RTTy PR #44 merged as 6532abc (hub = origin = backup = fleet): the
"lost" bidirectional heatmap was never deleted —
ChartSurface.supportsMultipleLanesrequired height ≥ 44 while every band is 40 pt, so the style was reachable only above interface scale 1.1 since build 35. Gate moved to 36 (justified by lane arithmetic, verified both directions); the flows band gained a per-app directional heatmap (closes FEATURE_MATRIX row 72). Tests 778/71/270, +18. Renders in docs/release-evidence/feat-20260909-04/. ECSUI: no change (RTTy imports none of it; zero fleet consumers); its per-lane normalisation defect routed as ISSUE-20260909-13 for the lib owner. - Budget: usage_status advice = hold (Anthropic 7d 81 %, vendor-authoritative) as of 22:40. Per CLAUDE.md: no new fan-outs, finish inline, no escalation. Weekly resets 2026-09-11 10:00 EDT.
- Queued, not started (needs a release worker after the reset or Rich's explicit call): RTTy Build 506 from main 6532abc — carries the approved app-flows redesign (PR #42) and the restored chart types (PR #44) on top of 505's Developer ID/notarized path; the installer must be copied from the FIXED build-505 tool (install_rc, 180 s window). Everything else on the fleet is current: RTTy 505, Tyrell 17, ReplicantDB 41, all notarized on six hosts.
- Rich's open items: promote RTTy's CloudKit schema to Production (CloudKit Console); re-enable control-plane jobs/daemons only if he wants them; the 34 remaining app-migration tickets close as each app's next build ships.
Undo
- RTTy: rollback bundles beside each install (.RTTy.app.rollback-build504-…); revert PRs #42/#44 on richhdoty/RTTy to drop the redesign/charts before the next build.
- Installer tool patch: ~/dev/_handoff/rtty-build505-20260909/…/deploy_build505_fleet.zsh (install_rc, 180 s) — the previous text is in git history of the handoff dir only if committed; the change is two lines and commented.