# Public evidence replay — issue16524

Base a46f80ee28d9b498bb8b407c8b60bd4e93bbe2e3; final head df3035d36a8ca441dc8ccd283464daadd459bae2. Captured 2026-10-24 UTC. No code or evidence committed to app repo.

## Rebuild safely
Create separate detached git worktrees for those commits, run `vp i`, then `vp run dev --no-seed` in each. Read assigned ports from dev-runner output; use isolated worktree .t3 state. Never use live ~/.t3 state, never bake origins. Use own new T3 Browser tabs; use separate incognito context for base because localhost pairing cookies cross ports. Mint pairing through `node apps/server/src/bin.ts pair` privately if needed; never publish pairing URLs.
Create a disposable Git repository with main branch. Create ios/.agents/skills/ios-release/SKILL.md and ios/.claude/skills/ios-release/SKILL.md, each with YAML name ios-release and description Nested iOS release fixture, followed by instructions to report cwd and never modify files. Commit skills; run prepare-fixture.sh after changing its hardcoded disposable path to yours. Add project rooted at repo/ios through real app UI. All file content is synthetic. Root-only skill/media fixture were not created during this capture.

## UI actions / recordings
- before-U1-1440-light.mp4 13:26:25.534–13:27:04.472: New worktree draft at0s, send pwd prompt ~11s, actual result ~25s, type $ios by end. Prompt: Run pwd and report the working directory. Do not modify files. Codex gpt-6-astra Medium/full access. Base cwd wrongly wt; ios skill absent.
- before-U2-control.mp4 13:28:17.194–13:28:59.244: Current checkout control, same prompt, actual cwd repo/ios.
- after-U1-1440-light.mp4 13:37:42.678–13:38:12.233: Same New worktree/prompt, completed pwd wt/ios ~13s; $ios shows Ios Release by end. All AFTER captures use final committed head.
- after-U1-U4-U7-flows.mp4 13:38:28.224–13:40:07.326: select Ios Release0s, send ~9s; ask read docs/setup.md and ../shared/file.ts and reply with relative docs/setup.md:2, sibling ../shared/file.ts:1, README basename and absolute links. Nested line2 click ~40s; @docs/setup search/select ~46–57s; draft chip opens nested sentinel; recreate chip, append prompt without selecting existing chip, send ~74s; persisted absolute chip and IOS result ~83s. Basename/absolute links emitted but not independently clicked; persisted chip after reload not clicked.
- after-U3-branch-transitions.mp4 13:40:25.115–13:41:32.844: In disposable app-created worktree, create evidence-ios-missing branch deleting ios (commit removal); git switch it while UI mounted. pwd root ~9s; restore directory branch ~20s, pwd ios ~30s; switch evidence-ios-file branch replacing ios with ordinary file ~35s, provider pwd root but file tree crashes ~42.7s. Restore original branch and reload browser. Actual fixture branch commits 1c97e7a/5917363. Do not manipulate implementation checkout.
- after-provider-change.mp4 13:42:47.507–13:43:10.647: Change Codex to Claude Sonnet5.5 High, send pwd/read .claude skill, completion retains cwd wt/ios and history. This does not prove same-provider model change or old Claude resume.
- after-checkpoint-restore.mp4 13:43:11.611–13:44:30.656: Ask Claude append CHECKPOINT_IOS_EDIT to docs/setup.md and CHECKPOINT_SHARED_EDIT to ../shared/file.ts. Completed turn shows2 files/+2. Click last Edit from here, confirm Revert files too. Git diff becomes empty, both original sentinel files restored; conversation rewound to composer. No alternate lifecycle checked.

Runtime capture driver capture-runtime.py reads only synthetic isolated SQLite and outputs authoritative persisted inputs/runs/messages/sessions. compare-images.py computes absolute RGB differences, threshold0, no masks,8x brightness images. Stills are after document.fonts.ready, CSS animation/transition none and caret transparent, at least500ms apart. Browser API did not expose actual prefers-reduced-motion emulation; CSS suppression is the implemented reduction. Wide CSS1440x900/DPR2 is tool-downsampled to1280x800 PNG; narrow CSS390x844/DPR2 exports780x1688. Thus native1440 and native client proof remain unverified. Light stills show small nonzero raster differences; never label all still pairs identical.

## Native attempt
EAS CLI authenticated pingdotgg, simulator API available. Read eas-simulator skill before commands. Temporary native worktree reset to final head; prepare-native-profile.py adds simulator static preview profile outside PR. `eas build --platform ios --profile issue16524-static --non-interactive --no-wait --json` accepted build29f276e1-a592-44ad-bfcb-e590b5193fcd. An existing exact-base static simulator build790b8253-5eb0-4b52-9359-750669c5c2dd was also available. `eas simulator:start --platform ios --type agent-device --build-id <base-id> --name ... --max-duration-minutes 12 --egress local --egress-allow localhost:14075 --egress-allow localhost:14386 --non-interactive --json` rejected: Local egress is not enabled for this account. Experimental proxied simulator traffic needs account enablement. Request64c657ad-6fe9-49f0-bae1-b0b76fd8c0e6. No emulator session created. No public backend tunnel provisioned within budget; native flow unverified. Build was a real attempted build step, not declared unavailable for absence of ready client.

Final EAS build result13:45:13 UTC: ERRORED, XCODE_BUILD_ERROR: Unable to resolve module dependency GhosttyKit in T3TerminalNative/Pods. No final-head native app was installed.

## Bounded base FileTree replay
before-U3-branch-replay.mp4 13:48:20.107–13:49:41.074 UTC. Real base turn emits ios/docs/setup link; open at~10s, mounted embedded FileTree highlights nested file. Switch missing branch~18s, complete pwd run~50s, manually refresh files~65s. Restore branch~71s and refresh, start pwd run~72s, switch file branch~73s and refresh. Same FileTree error at73.761s (13:49:33.868Z), same node18 and stack. Real provider runs all completed (runtime snapshot). Directory restore did not wait for provider completion before regular-file switch, so this is bounded equivalence of mounted FileTree crash rather than full base cwd transition certification. It establishes crash exists at base; do not claim a new regression from final change or prove unrelatedness. Original fixture branch restored afterward.
