> - Paperclip is the open source app people use to manage AI agents for
work.
> - Native OpenCode sends semantic tool calls through the durable Runner
protocol.
> - The Runner retains a call until its result is known.
> - OpenCode and its HTTP bridge each stopped waiting after 30 seconds.
> - A slow response could leave a call pending after the provider had
moved on.
> - A later run then failed the pending-call guard during attachment.
> - This pull request keeps native calls under their Runner owner until
settlement or cancellation.
> - The benefit is one delivered result and a safe next run.
Related: #18343 applies the durable wait policy to native ACPX calls.
This change applies that policy to native OpenCode.
**What happened?**
An assigned tool call took more than 30 seconds. OpenCode reported an
MCP timeout while the Runner still retained the request. The source turn
could finish, but suspension failed. A later `run.attach` failed because
provider tool calls were still pending.
**Expected behavior**
The native proxy must wait for the authoritative result under the Runner
owner. Stop, bridge close, and lease expiry must still end the wait.
Unknown effects must still block attachment.
**Steps to reproduce**
1. Start a native OpenCode run with an assigned semantic tool.
2. Hold the controller's result for 31 seconds.
3. Observe the provider's MCP result and attach a later run to the
session.
**Paperclip version or commit**
Reproduced against `6d72243d8af0362d73fbcb5331fd42a384800d4e`. The
branch is based on `36df8933f0`.
- The native OpenCode proxy enables a driver capability for durable tool
requests.
- That capability removes the bridge's separate request timer and sets
OpenCode's fixed MCP client ceiling to one hour, consistent with the
native ACPX sidecar.
- Ordinary driver calls keep their 30-second deadline. Assigned external
MCP connections keep their existing budget.
- Cancellation, result replay, tool authorization, and the pending-call
attachment guard keep their existing contracts.
- The native regression holds a result for 31 seconds, then completes a
second run with the same Runner process and no pending provider calls.
- The deterministic provider fixture honors the emitted MCP budget and
retains the initial completion contract across ordinary follow-ups.
- Execution semantics and the session verification maps describe the
wait and its safety checks.
- Red before production edits: the bridge aborted a durable request at
the ordinary 30-second boundary. The driver emitted `30000` instead of
the expected `3600000` client budget.
- The final combined bridge, driver, proxy, and native protocol run
passed: 95 tests in five files (71.17 seconds).
- The native delayed-result probe passed with the current Rust Runner
and current bundled proxy. It completed the later run with the same
Runner PID and an empty pending-call ledger.
- Actual provider check passed on macOS arm64 with
`opencode-ai@1.18.34`, the changed source, and a local deterministic
OpenAI-compatible model. One assigned write waited 31 seconds and saved
one file. Both turns completed. The second turn retained the saved tool
receipt. The write ran once across five model requests.
- Bridge safety cases cover result replay without another action,
ordinary timeout behavior, MCP cancellation, and teardown of an
unanswered durable request.
- Both runner TypeScript projects passed typecheck. The first attempt
lacked the eval-kernel build; it passed after building that declared
dependency.
- Map alignment, module boundaries, and `git diff --check` passed.
- The first native follow-up probe failed because its synthetic provider
forgot the initial completion-contract revision. This caused a repair
turn and another discovery call. The fixture now retains the contract,
and the same probe passed. The failure is retained here.
- Runtime acceptance used the implementation at `583d316ad4`. The later
clarification commit changes comments, documentation, and a test name
only. It does not change runtime behavior.
- Full current-head CI passes, including typecheck, build, general and
serialized tests, Rust/Runner checks, all eight E2E shards, and the `ci
/ e2e` and `ci / verify` aggregate gates. Greptile is 5/5 on this
commit, with no unresolved review threads. No deployment or retry of the
affected historical task was performed. The actual provider check used a
local model; it does not qualify a deployed Linux sandbox or a live
model service.
- A native call can wait longer while its Runner owner remains valid.
Stop, teardown, and lease expiry still end the wait. The MCP client has
a separate fixed one-hour ceiling. Runner ownership can renew beyond
that ceiling. If the client deadline expires first, the operation
outcome remains unknown and the existing hold must still block replay
and run attachment.
- This prevents new premature timeouts. It does not classify or replay
an old request whose effect remains unknown.
- No schema, migration, credential, or permission change is required.
- OpenAI Codex, GPT-6 family. The harness does not expose the exact
model ID or context window. Capabilities used: code generation,
tool-assisted diagnosis, local execution, and test analysis.
- [x] I have included a thinking path that traces from project context
to this change
- [x] I have specified the model used (with version and capability
details)
- [x] I have checked ROADMAP.md and confirmed this PR does not duplicate
planned core work
- [x] I have searched GitHub for duplicate or related PRs and linked
them above
- [x] I have either (a) linked existing issues with `Fixes: #` / `Closes
issue template
- [x] I have not referenced internal/instance-local Paperclip issues or
links (only public GitHub `#NNN` / `github.com/paperclipai/paperclip`
URLs)
- [x] My branch name describes the change (e.g. `docs/...`, `fix/...`)
and contains no internal Paperclip ticket id or instance-derived details
- [x] I have run tests locally and they pass
- [x] I have added or updated tests where applicable
- [x] I have updated relevant documentation to reflect my changes
- [x] I have considered and documented any risks above
- [x] All Paperclip CI gates are green
- [x] Greptile is 5/5 with no open P2s, recommendations, or follow-ups
- [x] I will address all Greptile and reviewer comments before
requesting merge
---------
Co-authored-by: Paperclip <noreply@paperclip.ing>
Bind the actual human and canonical native source before independent installed-runtime readback. Preserve installer, partial-outcome, repeat, runtime, query and original480s contract.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Poll local native readiness before reading GitHub. Preserve real provider reads at preview and installation, reusing only an unchanged exact immutable-source checkpoint during grade settling.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Bind the current person's canonical source and native reply before secure human entry. Preserve the actual original660s definition and all independent secret/privacy phases.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Preserve raw system activity and prove its exact accepted worker outcome instead of requiring the legacy agent PATCH audit shape.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Preserve the original case budget and require the saved question and canonical completed source run before human form actions.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Pair the ordinary shared proposal disclosure with exact pending invocation arguments and actual provider dispatch. Keep the short preview valid, reject uninspectable or changed content, and retain the original three human/native permission phases.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Keep worker credentials limited to task validation and use the existing trusted fixture client for the fixed board-only file route after a live scope/checkout join. Preserve actual bounded command and receipts; reject changed custody before publishing the exit result.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Bound only the initial reply wait to the existing remaining 300-second case clock, checking before and after. Preserve actual terminal reply, personal permission controls and all settled Chat final verification.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Reconstruct the documented gateway result independently, retaining raw provider and source attribution checks. Preserve the original failure and mark the oracle v3 changed condition.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Use the public Pro configuration as the incidental starting proposal, verified against current official prices and every selected 1017 rate variant. Keep all comparison, catalog, identity, configuration and pending-approval guards unchanged. Record the starting-model change as definition v3, never a historical regrade.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Enable only the singleton dismissal journey against a reviewed public synthetic staging feed. Require its real server publication before any chat and preserve actual human-only personal dismissal and audience checks. Publication is a separate explicit operator action.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Accept the documented OpenCode auth-required warning as a missing-account prerequisite while keeping a distinct member strictly ready. Retain only the existing closed probe projection before setup refusal; no new probes, model calls or clock changes.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Read immutable pinned version detail and require the source-bound native completion turn. Preserve the original query, model, 540-second attempt and actual failing-sample output requirements.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Require the actual pinned update-status prerequisite before the canonical request. Add an exact human-session GET reader that bounds error-body parsing and preserves only three source-owned reason codes and finite provider statuses; generic response-body withholding is unchanged. Fail closed on unknown, oversized, malformed or private error content. Stop retrying typed update-read refusals while retaining all real source, review, update, version and fork assertions. This improves diagnosis and eligibility, not feature grading.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Require the actual recent CEO conversation, original visible human and native reply, and editable composer after navigation and final profile proof. Re-read the persisted Morgan preference and exact original chat/run set after readiness. Use only remaining original case budget and preserve all existing primary/privacy grading. Calibrate the actual final verifier with loading, late side-effect, wrong identity and exhausted-budget negatives.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Dispose only unread browser-session response bodies. Exercise the actual callback with real Node Responses so successful JSON is not followed by locked-stream cancellation. Preserve real reader and owner identity checks, restoration, denied-body disposal, malformed JSON failures, feedback privacy oracles, and original clocks.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Accept a null-target durable wake receipt only with the unique succeeded answer-bound continuation from the server response path. Keep actual human answer, company/task/agent, ordering, duplicate conflict, saved output and full run accounting checks. Version the observer and retain failed history.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Replace the disabled-button assumption with real invalid-click validation, no page advance, no saved answer and no new work. Keep all subsequent exact answers, page retention and continuation checks. Calibrate the real QuestionForm with a pure React test; no product UI behavior changes.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Keep the exhausted-budget negative while respecting the readonly public context type. No production observer or grader changes.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
For the reusable-skill request, prove ordinary library discovery, editable Studio checklist content and reload with the same saved version instead of prescribing a chat-link format. Keep current-version/content/attribution/assignment checks and all other skill contracts unchanged; record the explicit authoring v2 conditions.
Co-Authored-By: Paperclip <noreply@paperclip.ing>