rdmsm4x-changelog-20260904-1834-tyrell-main-45e976b-clean-signed-leakfix-artifact
Built and team-signed a clean-provenance Tyrell 0.2.0 build 7 artifact of canonical main 45e976b (fd/memory leak fix) in an isolated scratch worktree; read-only plan accepted it; nothing installed or deployed. Also filed the 09-03 build 13 changelog to Notes (was pending on a wedged Notes.app). Undo: remove the three scratch worktrees named in the report.
Tyrell 0.2.0 build 7 (canonical main 45e976b) — clean package + sign, leak fix, handoff
[2026-09-04 18:35:02 EDT · rdmsm4x] · from the Aqua desktop session "Tyrell build 13 — package/sign + handoff" · Rich approved 2026-09-04 ~18:26 EDT ("all approved")
Objective
Give the Tyrell dev lead (session that took over from codex@rdmsm4x) a signed, verified, clean-provenance artifact of the fd/memory leak fix so the five spokes still running the leaking Build 15 can be rolled. PACKAGE + SIGN + READ-ONLY PLAN ONLY. Nothing installed, launched, deployed, committed; no launchd/TCC/database change.
Why a scratch worktree and not ~/dev/apps/Tyrell
Canonical main working tree is DIRTY (13 lines): Package.swift (+ECSMemory dep), MainShell/Providers/SettingsView.swift, 3 untracked Mem0 sources, a test, .DS_Store, and the four deploy scripts (plan/redeploy/probe/accept). Building there bakes another agent's uncommitted, unreviewed source into a fleet release. The staged bundle already in ~/dev/apps/Tyrell/.build (06:40, build 7) is unsigned (TeamIdentifier not set) and its tree state at build time is unknown.
Provenance (fail-closed, all clean, unchanged after build)
- /Users/richh/dev/_scratch/tyrell-main-45e976b-sign-20260904/apps/Tyrell = worktree detached at 45e976bee95a416fc45863495bfc544f045855d9 (canonical main HEAD), dirty=0 (only .DS_Store + my build log afterwards)
- ../../lib/ecs0lib = worktree detached at 22888aab1eba746b53ebd5a8fc886e0305298d4f (canonical HEAD; canonical checkout has 2 non-Swift dirty files), dirty=0
- ../../lib/ECSCloudKit = worktree detached at 93b9f700e7b73c02881b0a00007cb6f813720a43 (canonical HEAD; canonical has untracked docs/), dirty=0
- Fix commits 8aeef22 a527972 7193c00 e828ae0 8ff19b2 all ancestors of 45e976b.
- Context: rdmsm4x · richh uid 501 · launchctl managername=Aqua · Xcode 27.0 (27A5252f) · identity "Apple Development: Richard Doty (S65Q255HA8)" OU=ZU2882L4HT (only identity in keychain; no Developer ID; not notarized).
- Command:
zsh scripts/make_app_bundle.zsh(no --install), 18:30:xx → 18:31:57 EDT, rc=0. 0 compiler errors, 76 warnings (Swift 6 Sendable).
Artifact
/Users/richh/dev/_scratch/tyrell-main-45e976b-sign-20260904/apps/Tyrell/.build/Tyrell.app (79M, 9 files, 0 symlinks) · 0.2.0 · CFBundleVersion 7 · LSMinimumSystemVersion 15.0
| Outer Tyrell.app | Helper Contents/Library/LoginItems/TyrellBar.app | |
|---|---|---|
| Bundle ID | com.eastcoastscience.Tyrell | com.eastcoastscience.Tyrell.TyrellBar |
| TeamIdentifier | ZU2882L4HT | ZU2882L4HT |
| CodeDirectory | v=20500 flags=0x10000(runtime), Runtime 15.0.0 | v=20500 flags=0x10000(runtime), Runtime 15.0.0 |
| arm64 CDHash (full) | 6ff03301a5e122b099a1cd8592a8e03038e44117ab02da2b674d3a67b3109656 | f1134577f81aef324674ea9c90cc23b6ba5e79be40be112a18cd336aacac8bf6 |
| x86_64 CDHash (full) | 85bd0af993ffbc9bc1851b844b3a1aa6758eff63f23856217d55b751c286c0e9 | d008b6b62864c56255a37ea5b10dd95eb0ff726f046802606b0707b1182cbffd |
| lipo | x86_64 arm64 | x86_64 arm64 |
| Signed | 2026-09-04 18:31:56 EDT | 2026-09-04 18:31:56 EDT |
Designated requirements (both): identifier "
SHA-256 (all universal2 x86_64+arm64): 8597c9fc76569c868211337073aa273203d39ef84cff72c0c7e11b11d75284c5 Contents/MacOS/Tyrell (= lifecycle tyrell_app_executable_sha256) 3b057fe2ebde4aa36974396ee41b37b375905ec5ae1eab1f8db9d6bf8d624c05 Contents/MacOS/tyrellbar (= .build/release/tyrellbar) 9ca3df8422a2860eed1ef7be87c3622bc9d8dbcdc914b8da14ae3a604e784604 Contents/Library/LoginItems/TyrellBar.app/Contents/MacOS/tyrellbar dbc440bd54b85a54dd6c4150b23b3e508bff7d8d8080687d81b9ba7ac2cbbcf0 .build/release/tyrelld 4a7ff6aa35d227f6f65f547615ba4bef5f084c60c6e423ef84c55215482c45c8 .build/release/tyrell de0a22aea0951735c6dd687d2f907aa06e10850215b7a80a4da74f4858f6b96c .build/release/tyrell-app 7381f36808c736cbda634017b3f92d8212d792127a4d922580097bb6ca23a194 .build/release/tyrell-mcp
The fix is IN this artifact (the incident script's own gates, run by hand)
- tyrelld: SubprocessRunner symbols 196 · FileDescriptorLimit symbols 72 · objc_autoreleasePoolPush refs 1
- Tyrell.app/Contents/MacOS/Tyrell: SubprocessRunner 196
- For contrast: /Applications/Tyrell.app on rdmsm4x (build 7, signed 09-04 00:53) → 0; rdmsm4x's tyrelld LaunchAgent points at ~/dev/apps/Tyrell/.build/release/tyrelld → 196.
Read-only deployment plan (committed scripts/plan_app_deployment.zsh v3.0) — ACCEPTED
rc=0 · mode=canary · hosts=rdmbair15m5 · deployment_state=proposed · candidate_sha256=8597c9fc… · candidate_cdhash=6ff03301…9656 · bundle_id=com.eastcoastscience.Tyrell · team_id=ZU2882L4HT · probe_order=43118,43117
Manifest / checksum / logs (all under /Users/richh/dev/_scratch/tyrell-main-45e976b-sign-20260904/apps/Tyrell/.build/evidence-main-45e976b-20260904-1830)
- Tyrell.app-manifest.sha256 (9 files) — sha256 3618cde67303e6ef000bad3c62cba6d685765075bdaf3347849c92020985fdc8
- Tyrell.app.tar (ustar, uid/gid 0, sorted entries) — sha256 ba01668f91299497d5824d2a2c42c83002043b5db6658104f8637ca93bebea88
- make_app_bundle-20260904-1830.redacted.log (545 lines, ANSI/OSC stripped) — sha256 a3d1d9f0fbda20744954d873a66e065eb599542ccd6a43725985d0b5ed2b8e49; secret scan: 10 hits, all the identifier "r.secret" in a Sendable warning, no values
- raw log: /Users/richh/dev/_scratch/tyrell-main-45e976b-sign-20260904/apps/Tyrell/.build-sign-20260904.log c4f39bcb2c229b4b91f2ece56c3eda7d7488f5dd3c89cd1cbbf6f3f65d000732 .build/Tyrell.app/Contents/Info.plist 6b4507a495224cc5275d90fd824e91c16503fc51aaa64019528e7d5b30f7ef3c .build/Tyrell.app/Contents/Library/LoginItems/TyrellBar.app/Contents/Info.plist 9ca3df8422a2860eed1ef7be87c3622bc9d8dbcdc914b8da14ae3a604e784604 .build/Tyrell.app/Contents/Library/LoginItems/TyrellBar.app/Contents/MacOS/tyrellbar 6d77ccca2cfb302d23960b3fdd7c35062593275746447f67fb77917e75ceabce .build/Tyrell.app/Contents/Library/LoginItems/TyrellBar.app/Contents/Resources/Tyrell.icns 35ace3a7478850757c537191e7fa3f5e80abaa23fdf3505fe78bf923c2e406ff .build/Tyrell.app/Contents/Library/LoginItems/TyrellBar.app/Contents/_CodeSignature/CodeResources 8597c9fc76569c868211337073aa273203d39ef84cff72c0c7e11b11d75284c5 .build/Tyrell.app/Contents/MacOS/Tyrell 3b057fe2ebde4aa36974396ee41b37b375905ec5ae1eab1f8db9d6bf8d624c05 .build/Tyrell.app/Contents/MacOS/tyrellbar 6d77ccca2cfb302d23960b3fdd7c35062593275746447f67fb77917e75ceabce .build/Tyrell.app/Contents/Resources/Tyrell.icns 9928ae0e3cbd33db75e1500b7a0c82959960766fda9010052eff144fdef53abc .build/Tyrell.app/Contents/_CodeSignature/CodeResources
Blockers / risks for the rollout (not acted on — dev lead's call)
- sign_and_stage_after_console_login.zsh depends on UNCOMMITTED edits to scripts/{plan_app_deployment,redeploy_app_fleet,run_tyrell_app_canary_probe,accept_tyrell_app_canary}.zsh on canonical main (38/3/28/34 lines). The committed planner has no --candidate-bundle flag (the incident script's call fails with "unknown argument"). Those edits are the vulnerable verified-and-uncommitted state; commit them by path before anyone rolls out.
- The incident script hardcodes REPO=~/dev/apps/Tyrell and REBUILDS there — from the dirty tree. Either clean/commit canonical main first, or point BUNDLE at this clean artifact and skip its build step.
- Build number goes backwards on the spokes: canonical main is CFBundleVersion 7; the five spokes run "Build 15" from the build15 worktree lineage. Deploy scripts compare hashes, not versions, so this is a labeling/telemetry confusion risk, not a proven fault — but the fleet dashboard and any "is it newer" check will read 7 < 15.
- rdmsm4x's own daemon LaunchAgent runs a DEVELOPER BUILD PATH (ISSUE-20260831-17 anti-pattern), and /Applications/Tyrell.app on the hub is the unfixed build 7 bundle.
- rdmpw3265m / rdmpw3275m need their own console login before their LaunchAgents can start the daemon (incident script's note).
Offer / required authority
This Aqua session can run the canary and fleet stages in minutes
(signing key proven usable). I did NOT: a canary install is a host-state
change and the pipeline it runs on is uncommitted. Give me a clean,
committed pipeline (or an explicit "run --canary with this artifact")
and I will run it and post the receipt. Undo of everything above:
git -C ~/dev/apps/Tyrell worktree remove ~/dev/_scratch/tyrell-main-45e976b-sign-20260904/apps/Tyrell
(and the two lib worktrees); nothing else was touched.
Source: fleet msg 20260903-021723-F4684800 (build 13, closed 09-03, Notes filed 09-04 18:26) · TASK-20260904-03 · INC-20260904-01 · session CCD local_0db431ea (takeover from codex)