Fleet changelogs · dev.ecs0.net
rdmsm4x-changelog-20260831-1236-tyrell-cli-rebuild-two-hosts

rdmsm4x-changelog-20260831-1236-tyrell-cli-rebuild-two-hosts

Rebuilt the missing tyrell CLI on rdmbair13m5 and jdmbair13m5, restoring on-demand fleet sync on the two hosts that had no way to run it; verified end to end against the master.

Why

During the 2026-08-30 fleet sync acceptance, tyrell sync could not be run on rdmbair13m5 or jdmbair13m5: only tyrelld and tyrell-mcp were present in their build output. Those hosts had no on-demand sync path and depended entirely on the daemon. tyrell-mcp run_sync would also have failed there, because MCPMain.swift:306 resolves the CLI as a sibling of the tyrell-mcp executable and returns "tyrell CLI not found" when it is absent.

Pre-flight findings

Host Repo state Package.swift SHA-256 (prefix) Swift
rdmsm4x (canonical) git main @ eff5293, clean 0aaee742 —
rdmbair13m5 git main @ 6ddef9b, 2 dirty files 6310f37c (diverged) 6.4, Xcode-beta
jdmbair13m5 not a git repo (no .git) 0aaee742 (matches canonical) 6.3.3, Xcode

rdmbair13m5 is behind canonical by 20 commits / 91 files / ~16.5k insertions. Its two dirty files (scripts/sysmon.zsh plus a .bak-reconcile-20260830-010303) are unrelated to Tyrell sources.

Decision: build from each host's own tree; do NOT git pull. Justification, verified before building: git diff --stat 6ddef9b..eff5293 -- Sources/tyrell Sources/TyrellCore shows Sources/tyrell unchanged and SyncEngine.swift untouched. The CLI and the sync path are byte-identical across the divergence, so a local build is functionally equivalent, stays consistent with each host's own tyrelld, and avoids disturbing uncommitted work on rdmbair13m5.

Commands run

Identical on both hosts, via ssh richh@<tailnet-ip>:

cd ~/dev/apps/Tyrell
swift build -c release --product tyrell    # detached, logged
~/dev/apps/Tyrell/.build/release/tyrell sync

Build logs: ~/Library/Logs/Tyrell/build-tyrell-cli-20260831-123501.log on each host.

Verification evidence

Builds (incremental; dependencies were already present):

Live sync through the new binaries, both reaching rdmsm4x.ts.dataroo.net:43117:

Master-side confirmation via fleet_status immediately after:

Note: "sent 0 files" is the correct result, not a failure

Recorded 2026-08-30 and still true. The fleet's nonzero pendingFiles / pendingBytes is a permanent floor of continuously-rewritten files, not a backlog: ~/.codex/logs_2.sqlite and its -wal/-shm siblings, ~/.agent-coordination/heartbeats/*.json (rewritten every 5 min by agentstatus), antigravity conversation .db files, ~/dev/.tmp.driveupload scratch. SyncEngine.swift:122 correctly refuses to upload a file whose size/mtime moved under it — a torn SQLite snapshot is worse than none — while SQLiteStateStore.swift:321 (pendingAgainstCAS) then counts it owed forever. pendingFiles must not be used as a sync-complete indicator on the agents board; it will never reach zero.

Backups / undo

No backups needed: nothing was overwritten, no config or source file was edited, no git state was changed on any host. The only new artifacts are the two build products and their logs.

To undo: rm ~/dev/apps/Tyrell/.build/release/tyrell on either host. This restores the prior condition exactly (no CLI present) and does not affect the running tyrelld.

Outstanding owner actions for Rich

  1. rdmbair13m5 is 20 commits behind canonical Tyrell (main @ 6ddef9b vs eff5293). Not touched here by design. Its tyrelld, built 2026-08-29 from that tree, is likewise stale. Decide whether to bring it to canonical.
  2. jdmbair13m5's ~/dev/apps/Tyrell is not a git repository — the source matches canonical by hash, but it has no provenance and no way to pull. Worth converting to a real clone.
  3. Build-path drift across the fleet, unresolved: .build/out/Products/Release (rdmbair15m5), .build/x86_64-apple-macosx/release (rdmpw3265m), .build/x86_64-apple-macosx/debug (rdmpw3275m — running a debug binary), .build/release symlink targets differing by host. Any script hardcoding one path breaks on the others; this is what broke the first pass of the 2026-08-30 sync run.

No secrets, tokens, or credentials are recorded in this file.