Skip to content

fix(pi): queue turn-start prompts when native work is running - #18639

Merged
Yash-Singh1 merged 1 commit into
pingdotgg:mainfrom
StiensWout:t3code/pi-turn-start-streaming
Oct 13, 2026
Merged

Yash-Singh1 merged 1 commit into
pingdotgg:mainfrom
StiensWout:t3code/pi-turn-start-streaming

Conversation

@StiensWout

Copy link
Copy Markdown
Contributor

Pi can resume extension work before T3 receives its native wake event. The next user prompt then fails with "Agent is already processing", leaving the turn failed.

Always send turn-start prompts with streamingBehavior: "steer", so Pi atomically queues them during an active run or starts a new run when idle. Add coverage for resumed idle and streaming sessions before wake events arrive, and update Pi replay expectations.

Closes #15221.

Verified with 97 targeted adapter and Pi orchestration replay tests, provider package typecheck, targeted lint, and formatting. A live Pi 1.1.0 RPC probe against an isolated local model endpoint confirmed bare-prompt rejection during streaming, queued steer prompts, and normal idle starts.

Prepared for Wout by gpt-6.1-sol in T3 Code through the Codex harness.

@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Oct 12, 2026
@macroscopeapp

macroscopeapp Bot commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 137ad3a

Macroscope's review found this PR approvable — This is a narrowly scoped Pi adapter bug fix that atomically queues turn-start prompts during active native work while preserving idle execution. It includes targeted coverage for both streaming and idle states; the other changes only update replay expectations.

Notes:

  • Diff unchanged. Approvability was decided on eligibility alone.

You can add or adjust custom eligibility rules. Learn more.

macroscopeapp[bot]
macroscopeapp Bot previously approved these changes Oct 12, 2026
@juliusmarminge juliusmarminge added the macroscope-review Opt PRs made by unvouched contributors in for Macroscope review. Vouched contributors auto-reviews label Oct 12, 2026 — with ChatGPT Codex Connector
@macroscopeapp
macroscopeapp Bot dismissed their stale review October 12, 2026 11:39

Dismissing prior approval to re-evaluate 137ad3a

@coderabbitai

coderabbitai Bot commented Oct 12, 2026

Copy link
Copy Markdown

Review in Change Stack →

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Path: .coderabbit.config.ts
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 9e290b39-4055-4c5f-ac25-45215f32505a

📥 Commits

Reviewing files that changed from the base of the PR and between 5753207 and 137ad3a.


📒 Files selected for processing (11)
  • apps/server/src/orchestration-v2/testkit/fixtures/message_steering/pi_output.ts
  • apps/server/src/orchestration-v2/testkit/fixtures/message_steering/pi_transcript.ndjson
  • apps/server/src/orchestration-v2/testkit/fixtures/multi_turn/pi_transcript.ndjson
  • apps/server/src/orchestration-v2/testkit/fixtures/pi_compaction/pi_transcript.ndjson
  • apps/server/src/orchestration-v2/testkit/fixtures/provider_thread_resume/pi_transcript.ndjson
  • apps/server/src/orchestration-v2/testkit/fixtures/simple/pi_transcript.ndjson
  • apps/server/src/orchestration-v2/testkit/fixtures/thread_rollback/pi_transcript.ndjson
  • apps/server/src/orchestration-v2/testkit/fixtures/thread_rollback_after_stop/pi_transcript.ndjson
  • apps/server/src/orchestration-v2/testkit/fixtures/turn_interrupt_mid_tool/pi_transcript.ndjson
  • packages/provider-pi/src/server/adapter.test.ts
  • packages/provider-pi/src/server/adapter.ts

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 9 remain after this review.



📝 Walkthrough

Walkthrough

The Pi adapter now sends non-compact turn-start prompts with streamingBehavior: "steer". Adapter tests cover streaming and idle Pi states, and orchestration replay fixtures expect the added field.

Changes

Pi prompt steering

Layer / File(s) Summary
Turn-start prompt contract and coverage
packages/provider-pi/src/server/adapter.ts, packages/provider-pi/src/server/adapter.test.ts, apps/server/src/orchestration-v2/testkit/fixtures/*/pi_output.ts, apps/server/src/orchestration-v2/testkit/fixtures/*/pi_transcript.ndjson
startTurn now includes streamingBehavior: "steer" on non-compact prompts. The adapter test fake can report streaming state and the tests cover resumed turns when Pi is streaming or idle. Replay fixture expectations now include the steer field.

Priority: ➖ Normal

Estimated code review effort: 2 (Simple) | ~10 minutes

Change: Bug fix · Severity of issue fixed: Medium

Possibly related PRs

  • pingdotgg/t3code#15444: Adds the same steer streaming behavior to Pi turn-start prompts and tests the “Agent is already processing” case.

Suggested reviewers: juliusmarminge


Merge Risk | ⚪ Minimal · up to 137ad

Merge Risk: ⚪ Minimal · up to 137ad

Turn-start prompts now request steer behavior, including when Pi is already streaming. No actionable merge risk remains beyond normal checks.

Security Architecture Review

Security architecture risk: 🔵 Low · up to 137ad

The change uses an existing queuing mode and does not demonstrate increased access or privileges. Some cancellation and completion edge cases remain unverified.

Retained concerns
No architecture-level concerns identified.

Security review details

Security Blast Radius

  • inferred — The changed reachability is admission of user text and images into an already-running, bound native session instead of rejection. Any resulting activity uses that session's existing authority; the production diff does not grant additional credentials, tools, or process privileges. This is not evidence of tenant or host isolation.

Trust Boundaries and Controls

  • observed — The existing transport separates correlated request responses from asynchronous session events. Turn-start prompt acknowledgements are handled as deferred events and matched against the pending provider-turn identity. The PR changes busy-session admission, not this identity handling.

Resilience and Maintainability Implications

  • observed — Normal settlement checks streaming, compaction, pending-message count, turn identity, and probe generation before finalizing. User Stop requests runtime restart and reaches process termination; ordinary interruption can instead use native abort. Native queue cleanup under that soft-abort path remains unverified.

Hardening Proposals

  • proposed — Validate the queue lifecycle against supported native versions: delay acknowledgement during a no-wake start, interrupt before queued consumption, and repeat or recover the turn. Establish that cancelled input cannot execute later and that completion cannot precede pending command expansion.

Pre-merge checks | Passed 4
✅ Passed checks (4 passed)
Check name Status Explanation
Title check Passed The title clearly summarizes the primary fix: queueing Pi turn-start prompts while native work is running. It is concise and specific.
Description check Passed The description explains the problem, the implementation, the linked issue, and focused verification results. It does not use the template headings, but it includes the required information and is suf…
Linked Issues check Passed The PR addresses active issue #15221. In packages/provider-pi/src/server/adapter.ts, every non-compact turn-start prompt now sends streamingBehavior: "steer". This lets Pi queue the prompt during …
Out of Scope Changes check Passed The changes remain within #15221. The adapter change fixes the Pi prompt contract. The fake Pi behavior, targeted race test, and replay expectation updates support and verify that contract. No unrelat…

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create a new PR

  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Comment @coderabbitai help to get the list of available commands.

@Yash-Singh1
Yash-Singh1 merged commit 9a9fd2e into pingdotgg:main Oct 13, 2026
33 checks passed
github-actions Bot added a commit to omarcresp/t3code-flake that referenced this pull request Oct 13, 2026
## What's Changed
* fix(web): remember editor selections before opening folders by @Yash-Singh1 in pingdotgg/t3code#19078
* fix(ci): retry Cursor webhook HTTP 400s on main by @Yash-Singh1 in pingdotgg/t3code#19077
* fix(web): let context handoff details use the available width by @Yash-Singh1 in pingdotgg/t3code#19098
* fix(server): snoozed threads allow queued automatic wakes by @Yash-Singh1 in pingdotgg/t3code#19099
* fix(web): merge button fits its label and animates width changes by @flamboh in pingdotgg/t3code#18478
* fix(web): Cmd+Enter creates the new project while an option is highlighted by @SunkenInTime in pingdotgg/t3code#18901
* fix(pi): queue turn-start prompts when native work is running by @StiensWout in pingdotgg/t3code#18639
* fix(pi): load T3 tool schemas for completion gateways by @StiensWout in pingdotgg/t3code#18643
* fix(devices): report agent tool startup failures by @PixPMusic in pingdotgg/t3code#18502
* fix(web): settings warn when an environment silently drops a setting by @flamboh in pingdotgg/t3code#18334
* fix(desktop): stop unsolicited Messages code autofill by @StiensWout in pingdotgg/t3code#19118
* feat(chat): show pending context handoff when selecting a model by @maria-rcks in pingdotgg/t3code#18369
* fix(server): collect SQLite planner statistics when the database opens by @otavio in pingdotgg/t3code#18471
* fix(server): failed threads no longer scan every tool item for errors by @realhasanshoaib in pingdotgg/t3code#18628
* fix(web): keep clone folder names readable in the setup project picker by @tachytelicdetonation in pingdotgg/t3code#12474
* fix(composer): allow slash skill search within messages by @Bil0000 in pingdotgg/t3code#19107

## New Contributors
* @tachytelicdetonation made their first contribution in pingdotgg/t3code#12474

**Full Changelog**: pingdotgg/t3code@v0.0.46-nightly.20261013.3066...v0.0.46-nightly.20261013.3080

Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.46-nightly.20261013.3080
github-actions Bot added a commit to davidvanderklay/t3code-flake that referenced this pull request Oct 13, 2026
## What's Changed
* fix(web): remember editor selections before opening folders by @Yash-Singh1 in pingdotgg/t3code#19078
* fix(ci): retry Cursor webhook HTTP 400s on main by @Yash-Singh1 in pingdotgg/t3code#19077
* fix(web): let context handoff details use the available width by @Yash-Singh1 in pingdotgg/t3code#19098
* fix(server): snoozed threads allow queued automatic wakes by @Yash-Singh1 in pingdotgg/t3code#19099
* fix(web): merge button fits its label and animates width changes by @flamboh in pingdotgg/t3code#18478
* fix(web): Cmd+Enter creates the new project while an option is highlighted by @SunkenInTime in pingdotgg/t3code#18901
* fix(pi): queue turn-start prompts when native work is running by @StiensWout in pingdotgg/t3code#18639
* fix(pi): load T3 tool schemas for completion gateways by @StiensWout in pingdotgg/t3code#18643
* fix(devices): report agent tool startup failures by @PixPMusic in pingdotgg/t3code#18502
* fix(web): settings warn when an environment silently drops a setting by @flamboh in pingdotgg/t3code#18334
* fix(desktop): stop unsolicited Messages code autofill by @StiensWout in pingdotgg/t3code#19118
* feat(chat): show pending context handoff when selecting a model by @maria-rcks in pingdotgg/t3code#18369
* fix(server): collect SQLite planner statistics when the database opens by @otavio in pingdotgg/t3code#18471
* fix(server): failed threads no longer scan every tool item for errors by @realhasanshoaib in pingdotgg/t3code#18628
* fix(web): keep clone folder names readable in the setup project picker by @tachytelicdetonation in pingdotgg/t3code#12474
* fix(composer): allow slash skill search within messages by @Bil0000 in pingdotgg/t3code#19107

## New Contributors
* @tachytelicdetonation made their first contribution in pingdotgg/t3code#12474

**Full Changelog**: pingdotgg/t3code@v0.0.46-nightly.20261013.3066...v0.0.46-nightly.20261013.3080

Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.46-nightly.20261013.3080
aorwall added a commit to aorwall/t3code that referenced this pull request Oct 14, 2026
Merges `pingdotgg/t3code` up to `6002c5c68c` (42 commits, base
`5070a83a32`), using a merge commit. No open merge PR to stack on; this
branches from `main` at `882bb0a638`.

## Resolution

- **`package.json`** (conflict): dropped upstream's `tsc-rs` 0.6.0 bump
(pingdotgg#19187). The fork removed `tsc-rs`, and the `tsc-rs` tripwire holds
that. New path-policy entry: `root-package-json` (`decide`).
- **`pnpm-lock.yaml`** (conflict, `theirs`): took upstream's copy. Its
seven `tsc-rs@0.6.0` entries fail `minimumReleaseAge` before resolution
can prune them, so I stripped them and let `install.mjs` re-derive the
rest. The fork edges (`moatless-api`, `mermaid`) are back, and `verify
--only lockfile` passes.
- 14 other files that both sides touched merged without conflict.
`duplicate-adds` and `resolution-check` are both clean.
`FilePreviewPanel.tsx` (`decide`) took upstream's `threadRef` prop and
kept both fork deltas. The two unlisted files now have `converged`
entries: `terminal-drawer-open-in-editor` and `thread-shell-subtasks`.
In `threadShell.ts`, upstream's `isChildRunLive` and the fork's listing
filter merged together correctly.
- File counts: 136 files landed, against 136 in the upstream range. The
only differences are `package.json` (missing, because its one upstream
change was the dropped bump) and `docs/fork/inventory.json` (extra,
fork-only). The fork delta is 809 files.
- **Script fix:** Moatless replaced its dispatch match arms with a
`MethodTable` (moatless#1138). Because of that,
`unsupported-methods.mjs` found no arms and exited 2. It now reads
`.detached`/`.session`/`.stream` registrations and follows handlers
passed by name. Result: ADD 0, DROP 0, KEEP 2 (`vcs.switchRef`,
`git.preparePullRequestThread`), which matches `gaps.md`.

## Verification

`verify.mjs`: these checks pass: duplicate-adds, tripwires,
resolution-check, unsupported-methods (after the fix), lockfile, fmt,
lint, typecheck, build. `test` fails. Each of the failing files also
failed when run alone, and they are the same five files as in the
2026-10-13 merge, all caused by the sandbox: shared `AgentScope`, server
`ServerBrowserPage` (no Playwright browser), `AcpAdapterV2`,
`OrchestratorReplayFixtures`, and `OpenCodeServerLedger`.

## Usable as-is

- Full-screen visual replies with zoom (pingdotgg#17561). Links inside HTML
renders open the way chat links do (pingdotgg#18897). App shortcuts keep working
after you click into an HTML render (pingdotgg#18898).
- Touch-scrolling in terminal output (pingdotgg#11305). Fixed: answering a
question reset the editor caret (pingdotgg#11337). Links in agent questions are
now clickable (pingdotgg#19197).
- Fixed: "Subagent needs input" stayed after the subagent finished
(pingdotgg#18996). This is client-side and uses `activityRunStatus` with a
fallback to `status`.
- Slash skill search now works mid-message (pingdotgg#19107). Fixed: removing a
project opened a new thread for it (pingdotgg#15864). Settings now warn when an
environment silently drops a setting (pingdotgg#18334).
- Smaller fixes: context handoff details use the available width
(pingdotgg#19098), pace icon alignment (pingdotgg#18580), tool-call collection perf
(pingdotgg#18853), git file paths keep whitespace in the contract schema
(pingdotgg#12465), Android beta links (pingdotgg#18955).
- Pending context-handoff preview when you pick a model (pingdotgg#18369). It is
computed on the client from `server.providers`
(`requiresNewThreadForModelChange`, `continuation.groupKey`). If
Moatless does not report those fields, the preview shows a handoff on
every provider switch.

## Unsupported in Moatless / needs implementation

- Delegated tasks in separate worktrees (pingdotgg#19102): `isolation:
"worktree"` on the orchestrator MCP `delegate_task`, and
`workspaceStrategy` on the child-launch command. Moatless does not
create worktrees (`FEATURES.worktreeSelection`).
- These land behind flags that are already gated: scheduled-task dialog
fix (pingdotgg#18940, `scheduledTasks`), PR merge/auto-merge button sizing
(pingdotgg#18478, pingdotgg#19111, `pullRequestSurface`), remembering editor selections
(pingdotgg#19078, `openInEditor`), device tool startup failures (pingdotgg#18502,
`deviceHub`), npm "update everything" (pingdotgg#18709, `serverUpdateBanner`),
clone folder names in the welcome wizard (pingdotgg#12474), Cmd+Enter
create-project in the palette (pingdotgg#18901).
- No new RPC methods (ADD 0).

## Backend behavior to consider reproducing in Moatless

I added these to the "Runtime fixes upstream made to its own server"
entry in `docs/fork/gaps.md`:
- Worktree isolation for delegated tasks (pingdotgg#19102).
- Snoozed threads still take queued automatic wakes (pingdotgg#19099).
- Indexed failed-thread error lookup (pingdotgg#18628).
- SQLite: no fsync on every commit, and planner stats collected on open
(pingdotgg#19205, pingdotgg#18471).
- Distinct CI checks with overlapping names (pingdotgg#19162).
- Bitbucket short-hash heads in review guides (pingdotgg#18900).
- Webhook template backtracking (pingdotgg#19160).
- OpenCode timeout formatting (pingdotgg#12469).
- Pi tool schemas and turn-start queueing (pingdotgg#18643, pingdotgg#18639).
- Usage hubs without a host, and Antigravity accounts deduplicated
(pingdotgg#11368, pingdotgg#19207).
- Haiku 5.5 as the default for background text generation (pingdotgg#18781).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---
Moatless task:
https://moatless.soaplabstest.com/tasks/db18f6dc-70c1-4d89-ada7-cd4b4f19a247
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

macroscope-review Opt PRs made by unvouched contributors in for Macroscope review. Vouched contributors auto-reviews size:M 30-99 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Pi turn-start prompt lacks streamingBehavior — pi 1.0.x rejects prompts while an agent run is active

3 participants