Main's thread↔PR linking never reached the v2 runtime: the client types were optional stubs and the v2 server dropped the field, so linking a PR on a v2 environment silently no-opped and #7454's settle-once logic could never match the linked identity. The link now flows end to end: thread.metadata.update carries an optional linkedPullRequest (object to link, null to unlink), the orchestrator folds it into thread state, and both shell builders project it — no migration needed since v2 shells persist as payload JSON. The client command sends the field and the shell mapper surfaces it, so the existing web/mobile badge and settle plumbing light up on v2 threads. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Julius Marminge committed on 9/5/2026, 4:54:26 AMparentdf71f08
5 files changedLine totals unavailable