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

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

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

Visibility: public

Requested revision: d14f023f88f48d5213e98b4c98b2c679c00a1001

Requested commit: d14f023f88f48d5213e98b4c98b2c679c00a1001

Commit: d14f023f88f48d5213e98b4c98b2c679c00a1001

Tree: dcc6a7e0499d4d952cf1340979f15978d237d906

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

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

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