Tyrell Build 15 now has a source-complete, cache-first iOS HTTP fleet-reading slice that preserves truthful retained/offline evidence without changing any live fleet runtime.
Scope
- Host:
rdmsm4xonly. - Project work was confined to isolated worktree
/Users/richh/dev/_worktrees/tyrell-build15-ios-cache-20260902on branchcodex/tyrell-build15-ios-cache-20260902. - Ticket:
FEAT-20260902-31. - Exact base:
8270ed192956b6228fe075bda21c637acf724766. - Source commit:
f8d1e128f5d0378cec16f66a10b3f6f5162bbd04. - Final checkpoint:
82865ed51aabfb06f1cf4bf17505ed9a27b079c7.
What changed
- Added
ios/Sources/MobileFleetCache.swift: strict v1, 512 KiB maximum, validated and sanitized snapshot/coverage cache; configuration-scoped opaque SHA-256 filename; mode-0700 directory; mode-0600 fsynced atomic replacement. - Updated
ios/Sources/MobileStores.swift: cache-first restore, last-success timestamp, typed live/retained-stale/offline-retained/unavailable state, safe cache error wording, and overlapping fleet-refresh coalescing. - Updated
ios/Sources/FleetView.swift: explicit checking/live/retained/offline/ unavailable labels and last-update age. - Updated
ios/Tests/TyrellMobileTests.swift: deterministic persistence, privacy, corruption, scope, time, truth-state, and concurrency coverage. - Prepended completed/open continuity records to
SESSION-STATE.mdandISSUES.md. - Created the external evidence handoff and preserved raw build/test
logs under
/Users/richh/dev/_handoff/tyrell-build15-ios-cache-20260902*.
Privacy and truth boundaries
The durable fleet cache excludes indexing paths, transfer filenames, census details, pending-transfer details, tokens, message bodies, prompts, responses, provider databases, credentials, and raw HTTP data. Missing future freshness fields remain unknown. No ActivityKit, APNs, remote-delivery, CloudKit write, physical-device, signing, installed-app, service, canary, fleet, or credential action occurred. Build 14 chat/outbox source files were not changed.
Commands and verification
- Generated the iOS project with
xcodegen generate --spec project.yml. - Ran focused
MobileFleetStoreTests: 9 passed, 0 failed. - Created disposable iOS 27 iPhone 17 Pro
34F375B0-A254-47AC-91A9-D7EBC6C45B41, ran the complete generated iOS suite: 60 passed, 0 failed, then deleted the simulator and confirmed it absent. - Ran
swift test --no-parallel -j 4: exit 0, 242 XCTest plus 391 Swift Testing equals 633/633, zero failures. - Built the iOS app in Release for Simulator: exit 0.
- Ran
swift build -c release --product TyrellCloudProjection: exit 0. - Ran
swift build -c release --product tyrell-app: exit 0. - Ran
git diff --check, explicit-path staged six project files, and confirmed empty finalgit status --short.
Preserved log SHA-256 values:
- Full iOS tests:
9ff428c85e4e11548ee37e485468ec3d422a263120cf3438b871aed8749c3d9b. - Full package tests:
9c1dcc074d11339ced944c3b2af214e0a25e518c166cd786f000179c098e46f0. - iOS Release build:
5f9b05b475217e8d92055bb7d02e06b07c3100ef6ef86c3ca88a142355f5daf3. - Release cloud product:
1ede9ec1a23d7ff9cfd6f35b829c9f14a326b9a31a02b06ea512273f1358fdfd. - Release app product:
bebd34a02557b10c2bd459eef8fefffc054e94ab5c6779513e4cd0e9b49c5dc7.
Backup and rollback
The immutable base commit and isolated branch are the source backup.
Nothing is integrated or deployed. Leave the branch unmerged to roll
back before integration. If integrated later, revert checkpoint
82865ed51aabfb06f1cf4bf17505ed9a27b079c7 and then source
f8d1e128f5d0378cec16f66a10b3f6f5162bbd04 without rewriting
history. No production cache file was created by this task.
Outstanding work
Implement one foreground/reconnect owner in a separate isolated slice with configuration-generation cancellation, late-result protection, event coalescing, and exactly one guarded FIFO chat-outbox drain. Do not partially wire lifecycle events before those tests pass. Independent two-agent review was unavailable because the active task tree had no free agent slot; no peer-review claim is made.
Full handoff:
/Users/richh/dev/_handoff/tyrell-build15-ios-cache-20260902.md.