test(examples): pi end-to-end verification runbook - #157
Conversation
Adds an operator runbook for verifying the Pi path end to end — blueprint, pi_json mount, streaming turn, interrupt, steer/follow-up, suspend/resume, reconnect-with-replay — with the expected events at each step so a failure localises to one hop. Nothing here runs in CI; recurring live coverage belongs in the smoke-tests repo. Tightens the Pi assertions in feature-examples around what the runbook makes explicit: single-prompt now asserts the turn settled on agent_settled and that Pi reports itself idle afterwards, and session-resume-pi asserts the session file changes on new_session and is restored by switch_session.
|
Smoke-suite follow-up filed: runloopai/remote-agents-sdk-smoke-tests#6 ("Add Pi (pi_json) case to the release smoke suite"). |
ross-rl
left a comment
There was a problem hiding this comment.
Review summary
Findings: 1 minor.
- [TEST] minor — This stacked PR also receives no build/typecheck job because its base is not
main; only conventional-commit ran. It changes feature-example TypeScript in addition to the runbook, so please obtain a CI typecheck result or broaden the workflow trigger before landing.
No functional runbook finding. The procedure correctly distinguishes prompt acceptance from completion, treats agent_settled (not agent_end) as the boundary, documents broker-owned launch arguments, and explicitly states that live coverage is not automated.
|
From the SDK side (#155): the missing-CI finding on this PR is addressed by #158, Until then, worth stating in the body that only |
What
examples/combined-app/docs/pi-e2e-runbook.md(new) — the operator procedure for verifying the Pi path end to end: preconditions → blueprint build → thepi_jsonmount JSON inline → app start → provision a Pi agent → streaming turn → interrupt → steer/follow-up → session state and idle-suspend/resume → reconnect-with-replay →feature-compat. Each step lists the expected timeline events so a failure localises to one hop, and a closing section says what the runbook deliberately does not cover.examples/combined-app/README.md— a Docs section linking the runbook (and the existing architecture doc).single-prompt.ts— asserts the turn settled onagent_settled(not on theagent_endthat can precede it) and thatgetState().isStreamingis false afterwards.session-resume-pi.ts— assertsnew_sessiondoes not reuse session A's transcript file and thatswitch_sessionrestores it.Why
PR 5 of the Pi sub-plan, on top of #156. The repo has no e2e or integration suite — every
sdk/src/**/*.test.tsis a unit test against__test-utils__/mock-axon.ts, and the only live-agent CI is therepository_dispatchatrunloopai/remote-agents-sdk-smoke-tests. So this codifies the Pi e2e as a reproducible runbook plus assertions in the repo's existing live-agent automation (feature-examples), rather than smuggling new browser-driving CI infrastructure in under a test label.What was actually executed — and what was not
Not executed: the vbrowser run. I could not perform it, and none of the runbook's live steps have been run. Three independent blockers, all present:
runloopai/runloop#10256 (feat(broker): plumb Pi protocol selection) is open, not merged, so no broker in any environment accepts api_jsonmount yet.RUNLOOP_API_KEY,NEBIUS_API_KEYandNEBIUS_BASE_URLare all unset, and there is no Nebius endpoint access.vbrowser,chromiumorplaywrightbinary is available here.There are therefore no screenshots of a streamed turn, an interrupted turn, or a post-resume turn. I am not claiming verification I did not perform.
Executed:
Against that running server I confirmed the Pi wiring that does not need credentials:
POST /api/pi/statewith an unknown agent returns 404{"error":"Agent nope not found"}, andPOST /api/startwithagentType: "pi"returns 401{"error":"RUNLOOP_API_KEY not set in server .env"}— i.e. the routes are registered and the credential guard fires before any devbox is created. That is the whole of the live evidence.What remains to be verified, and how
Once #10256 is merged and deployed, an operator with
RUNLOOP_API_KEY+NEBIUS_API_KEY+NEBIUS_BASE_URLshould:devbox.suspended/devbox.resumedevents visible).agent_endarrives, streaming may continue, and the composer re-enables only atagent_settled.bun run feature-compat(no filters) and commit the regeneratedcompatibility.md. It is deliberately not regenerated in this PR or in feat(examples): add Pi agent to blueprint, feature examples, and combined app #156: its rows are live-run results, and regenerating without credentials would replace every realpasswithskip. Until thenbun run feature-compat --validatereports one issue —[compatibility.md] Use case "session-resume-pi" not found in table.llms.txtwas regenerated in feat(examples): add Pi agent to blueprint, feature examples, and combined app #156, because it derives fromUSE_CASESalone. CI does not run--validate, so this does not turn CI red.passforpionsingle-prompt,agent-via-blueprintandsession-resume-pi; any row that cannot pass needs a written reason in the use case, per theelicitation-acpconvention.A follow-up issue for adding the Pi case to the release smoke suite is filed against
runloopai/remote-agents-sdk-smoke-tests(linked in the comments).PR title format
test(examples): Pi end-to-end verification runbookChecklist
<type>(<scope>): <description>formatbun run checkpasses (lint + format)bun run buildpassesbun run testpassessdk/changes here