Repository navigation
Conversation
…vals on the parent A task delegated to a linked environment kept its questions and approvals there: the parent showed nothing, task_status reported none, and only a client attached to that environment could answer them. The follower now mirrors what the task's thread there waits on onto the parent's record through a new link-only t3_link_requests tool, the parent's shell and composer show it, task_status and delegate_task waits report it, and an answer given on the parent is relayed through the link, which holds it to the link's access. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Silthus
added a commit
to Silthus/t3code
that referenced
this pull request
Oct 28, 2026
Silthus
added a commit
to Silthus/t3code
that referenced
this pull request
Oct 28, 2026
Silthus
added a commit
to Silthus/t3code
that referenced
this pull request
Oct 28, 2026
- A watch also wakes on a request's question or approval details, and the link, follower and parent compare request content, so details that land after the request reach the parent. - A local child no longer inherits its parent's mirrored requests. - A message sent on the parent no longer declines a remote task's approval, on web or mobile, and a remote question offers no attachments. - A link paired below full access is not offered "accept always". - The relay retries a failing or older peer per pass with a back-off that resets, instead of stopping for the rest of the task. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A question mirrored from a task in another environment cannot take attachments, so the mobile card no longer offers the picker or paste for it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
A task delegated to a linked environment (
delegate_taskwithtarget.environmentId) can stop on a question or an approval there. The parent never shows it. The sidebar, web, and mobile clients connected to the parent's server have nothing to answer, anddelegate_task/task_statusreporthasPendingQuestion: falseandpendingApproval: null, so amode: "wait"call runs until it times out. The task only moves on if someone opens the other machine and answers there.Expected: the parent shows the remote task's question or approval like a local one, an answer given on the parent reaches the task, and a wait ends on it.
Warning
🟡 Merge risk: medium · two-way door (merge-risk rubric)
writesThreadsholds it to the link's access and fence. A link paired below full access cannot "accept always". If the relay breaks, the remote task stays blocked, as it does onmaintoday. The parent then asks again with an "Answer not delivered" error item.git revertthe merge commit. The new projection field is optional and is ignored after a revert.Change
RemoteDelegation) watches the remote thread's live requests through a new link-only MCP tool,t3_link_requests(watch), and records them on the parent's projection asremoteTaskRequestswith the internal commanddelegated_task.remote.requests. The shell'spendingRuntimeRequestfalls back to the newest unanswered one, which drives the sidebar status and notifications.client-runtimeadds the requests toderivePendingThreadRequests, so web and mobile render them with the existing question and approval UI.runtime-request.respondon the parent for a mirrored request records the answer on the projection. The follower relays it witht3_link_requests(respond). On the remote, that call runs as the link session, so it gets the same access, mode, and fence checks as any other write over the link. If the remote refuses and the request still waits,delegated_task.remote.respond.failclears the answer and adds an "Answer not delivered" error item, so the parent asks again.delegate_taskandtask_statusreporthasPendingQuestionandpendingApprovalfor remote tasks.mode: "wait"wakes on them and keeps thecompletionWake: "always"upgrade that local tasks get.t3_link_requestsis hidden from agents and outside clients (EnabledWhenlink sessions only), so agents' tool lists don't grow.AgentContextBudget.test.tsnow measures what an agent session lists, instead of every registered tool.Scope and approval
There is no triaged issue for this yet. It is a reliability fix for an existing capability: remote
delegate_taskalready promises the parent a task it can follow, and a task blocked on a question it never surfaces breaks that promise. It spans server, contracts, and client-runtime because the request has to cross the link, land on the parent's projection, and render in the clients that already handle local requests. Happy to open an issue first if you'd rather triage it there.Verification
Live run on this branch: two isolated servers on one machine, a "laptop" dev server linked to a "box" server with
approval-requiredaccess. A Claude Haiku parent on the laptop delegated to the box'sReplay (dev)provider.Question.
delegate_taskinwaitmode returned on the box task's question (hasPendingQuestion: true,waitTimedOut: false). The laptop sidebar showed the parent as Input, and the parent's composer showed the box's question. I answered it there. On the box, the request resolved with{"schema_vs_ui_flexibility":"UI flexibility"}, applied by amcp:link-respond:client…:fwd…command (the link session). The task finished and woke the parent.Approval.
delegate_taskinwaitmode returned withpendingApproval: {kind: "command", …}. The sidebar showed Approval, and the parent's timeline showed the box's "Ran command · Waiting for approval" row with Decline and Approve. Approve resolved it on the box withdecision: "accept", and the task finished.Cross-version. I ran the follower suite (
RemoteDelegation.test.ts) against a box without the thread toolkit, as an older peer. 26 of 26 tests pass, with the two new approval tests skipped. A delegated task to an older peer still follows, finishes, and stops as before.Test seams
linkRequests.test.ts: the tool as a link session calls it. Watch returns the details and waits for a new request. Agents and outside clients cannot find it. A read-only link cannot answer. Another link's thread is refused, and so is "accept always" below full access. An answer dispatches with a stable command id.RemoteDelegatedTask.test.ts: the orchestrator's mirror, answer, wrong answer, double answer, re-mirror that keeps an answer, drop, completion clearing, and the "Answer not delivered" path.RemoteDelegation.test.ts: laptop and box end to end over a real forwarded link. An approval shows on the parent and is answered there, a refusal makes the parent ask again, and awaitends on the approval while a later result still wakes the parent.threadRequests.test.ts: clients list remote questions and approvals as live requests.ThreadForkService.test.ts: a fork leaves the source's remote requests behind.Checks:
vp run check:changedpasses format, lint, knip, and typecheck. Its tests fail in two places that are unrelated to this change.GuestPage.browser.test.tsxfails here with or without the client-runtime change.GitVcsDriver.test.tsfails because this machine rewriteshttps://github.com/to SSH in its global git config.Gaps: I did not walk the mobile app. Mobile reads the same
derivePendingThreadRequeststhat web does, and that function is unit-tested.Decisions
thread showcount remote requests?Involvement: one scope question answered, a design pass (3 findings fixed), a live run with screenshots.
Model and harness: Claude Opus 5.5 in Claude Code, run from T3 Code.
🤖 Generated with Claude Code