# feat\(orchestration-v2\): project linked pull requests on threads \(\#8160\) · pingdotgg/t3code

[View on GitCafe](https://git.cafe/pingdotgg/t3code/commit/565d682e8d5ca9f469861088b58219127bbbabb1)

Repository: [pingdotgg/t3code](https://git.cafe/pingdotgg/t3code)

Visibility: public

Requested revision: 565d682e8d5ca9f469861088b58219127bbbabb1

Requested commit: 565d682e8d5ca9f469861088b58219127bbbabb1

Commit: 565d682e8d5ca9f469861088b58219127bbbabb1

Tree: b2c9d95abd590e2b30a7d8d2991ea389bf697175

Author: Julius Marminge

Committer: Julius Marminge

## Message

```
feat(orchestration-v2): project linked pull requests on threads (#8160)

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>

```

## Parents

- [a365d988537c10a184e491931aea9c3d522f7fd1](https://git.cafe/pingdotgg/t3code/commit/a365d988537c10a184e491931aea9c3d522f7fd1?format=markdown)

[Source at this commit](https://git.cafe/pingdotgg/t3code/tree/565d682e8d5ca9f469861088b58219127bbbabb1?format=markdown)
