Forgejo repository rename / linked pull request synchronization Environment for both recordings: - Real T3 Code development server, each revision in its own isolated worktree. - Fresh T3 databases with T3CODE_DEV_SEED=0. No production database copied. - Local Forgejo 12 (container image codeberg.org/forgejo/forgejo:12). - Real fj 0.7.0 authentication, application token stored with fj auth add-token. - Synthetic evidence account and repository only. - Server RPC surface; no browser, device, viewport, or theme applies. - Videos use identical 1440x900 dark terminal styling and play at 1x speed. - Videos render timestamped stdout recordings; accompanying .cast files are the original recordings. Reproduce: 1. Start local Forgejo on port 33029, create a synthetic evidence account and application token; save the token beside seed.py as forgejo-token (never upload it). 2. Run seed.py seed before-old. It creates main, feature, one changed file, and an OPEN pull request. Authenticate fj to http://forgejo.127.0.0.1.nip.io:33029 with the same token, using an isolated XDG_DATA_HOME for both server runs. 3. In each revision, install with vp i and run: T3CODE_DEV_SEED=0 XDG_DATA_HOME= vp run dev:server Read its serverPort. Issue a session into a private file with: node apps/server/src/bin.ts auth session issue --base-dir .t3 --token-only 4. Create an empty local git workspace with origin pointing to http://forgejo.127.0.0.1.nip.io:33029/evidence/before-old.git. 5. Run node driver.mjs before http://127.0.0.1: . The driver uses real T3 HTTP/RPC calls to create a project/thread and an agent-sourced PR link, waits for its initial OPEN snapshot, renames the repository, closes the PR, and observes the unchanged link for 80 seconds. It does not invoke a test runner or stub any server/provider implementation. 6. Stop the base server. Run seed.py reset to restore the same repository and reopen the same PR. Start the head server against its own database, create a second workspace with the same origin, and run the identical driver as after. 7. render-recording.py session.cast Before|After renders each stdout recording to an MP4. The .cast timing is preserved at 1x speed. Observed: Base 871b00907d0bcf2705224de6c6e90de925c7cbb9: stale OPEN snapshot; automatic sync fails with HTTP 301. Head fe167c169599b89de948ffbe1ea59943a9a1199c: automatic sync follows the 301 to a 200 response and stores CLOSED while retaining the original link key and URL. AI-assisted; verified with the tests and tools listed above.