Repository navigation
Description
Child of #585. The close child (relay). Security story: it waits with the parent for the owner's approval.
User story
As the owner, I want the projectless-adopt epic merged to relay's main only after its checks pass on both heads together, so that main never holds half of it.
Acceptance criteria
- Adopt a terminal Claude in no project: adopt, relaunch paths, session mark, audit, fakerelay #586 is merged to
epic/585-projectless-adoptwith its review and evidence lines. - A sync PR from
sync/585-mainmergesmaininto the epic branch and saysCloses #587. - The repo suite and the
--stackrun pass on the epic head, on a stack built with eve's epic head. - The devbox pass shows each step of the verification task below.
- A
Verified:line on this issue names the final epic head. merge-checkpasses on the epic PR tomain, and relay merges before eve.
What I'd notice
Nothing new. The change appears on main in one step.
Close lines (relay)
- The verification task runs on the epic head after line 4: the repo suite, then
stack-upon the epic head and the--stackrun, thenstack-down. Relay: one run. This issue gets theVerified:line. - Any push after line 1 means line 1 runs again on the new head.
- Every child is merged to the epic branch, with review and evidence lines in place.
mainis merged into the epic branch by a sync PR whose head issync/585-mainand whose body saysCloses #587. Conflicts are resolved on it.- Close Adopt a terminal Claude in no project: adopt, relaunch paths, session mark, audit, fakerelay #586 with a comment naming its PR.
merge-checkpasses on the epic PR tomain.- Merge under the joint close task on Epic: adopt an outside Claude session that is in no project #585 (step c). Confirm
maingreen, close the parent (step d), delete the epic branch. - The run report's final body (
run-report finish, by the coordinator).
Verification task
On the devbox, on the epic head after line 4, as step b of the joint close task. Unlock the devid keychain and run npm ci in the eve checkout first. No devlock.
-
repo-suite:(cd e2e && go test -race -timeout 30m ./features/). -
devboxverify:stack-up r587 --relay <relay checkout at the epic head> --eve <eve checkout at its epic head>,go run ./cmd/devboxverify --stack <stack.json> --phase api,stack-down r587(also on a failure). -
real-appon the stack, in scratch folders only:- Start a terminal Claude in a scratch folder outside every project. Its row shows Adopt on the Agents rail. Tap Adopt.
- The managed row shows "Unsandboxed".
relay session list --jsonshowsunsandboxed: true. - In the Chief of Staff, ask it to pass a message to that agent and tap Send on the card. The agent's thread shows the message.
- Ask the agent for a tool call that needs approval. The permission prompt shows; Allow runs it.
- Drop in. The terminal row shows "Unsandboxed". A Chief of Staff send now answers
dropped_in. - Close the terminal. The session is idle and headless again, still "Unsandboxed", in the same folder.
- A Chief of Staff send reaches it again.
relay audit --event session_adoptand--event session_swapshowno_project: truerows.- Refusals: a second scratch Claude whose folder is removed before Adopt answers "Can't adopt" with
directory_unusable. A third whose folder is made a project between listing and Adopt answerschanged. A Pi in no project shows "Not in a project, so it can't be adopted." and no button.
- Post
Verified: <head sha> · repo-suite: <result> · devboxverify: <result> · real-app: <result> · log: <link or path>here.
Tasks
- Open relay's draft epic PR (
epic/585-projectless-adopttomain, bodyCloses #587) when Adopt a terminal Claude in no project: adopt, relaunch paths, session mark, audit, fakerelay #586 merges. - Lines 3 and 4, then report them on Epic: adopt an outside Claude session that is in no project #585 (joint close step a).
- Line 1 under joint close step b.
- Lines 5 to 8 under joint close steps c and d. Merges happen on the devbox, never on the Mac.
Contract
This child adds no code. Its PRs are the sync PR and relay's epic PR to main (Closes #587). merge-check judges both on the files that differ from main, so this list is the union of #586's paths. Conflict resolution stays inside them.
File ownership
The dev and test-writer paths of #586 and #594, as their contracts list them, and no other:
cmd/devboxverify/README.mdcmd/devboxverify/journey_adopt.gocmd/relay/outside_session_ops.gocmd/relay/session_adopt.gocmd/relay/session_chief_of_staff.gocmd/relay/session_dropin.gocmd/relay/session_launch.gocmd/relay/session_rebind.gocmd/relay/session_routes.gocmd/relay/session_swap.gocmd/relay/session_unsandboxed.godocs/FEATURES.mddocs/THREAT-MODEL.mddocs/audit-log.mddocs/cli.mddocs/events.mddocs/fakerelay.mddocs/outside-sessions.mddocs/routes.mddocs/session-adoption.mddocs/session-host.mde2e/features/bug594_unsandboxed_permission_test.goe2e/features/g1_outside_adopt_test.goe2e/features/g1_outside_adopt_unsandboxed_test.gofakerelay/internal/sessions/adopt.gofakerelay/internal/sessions/dropin.gofakerelay/internal/sessions/register.gofakerelay/internal/sessions/session.gofakerelay/internal/sessions/terminal.gofakerelay/internal/world/validate.gofakerelay/prooftest/adopt_test.gointernal/outsidesessions/probe.gointernal/sessions/hostapi/dispatch.gointernal/sessions/hostapi/server.gointernal/sessions/hostapi/types.gointernal/sessions/ledger/ledger.gointernal/sessions/provider/claude.gointernal/sessions/provider/shimspawn.gointernal/sessions/session/manager.gointernal/sessions/terminal/manager.gointernal/sessions/terminal/session.gointernal/sessions/types/session.go
Test surface
The whole repo suite and the --stack api run (every journey, not a selection), plus the real-app pass above. Nothing new is written here.
Waits:
- Merges and child state:
merge-checkexit codes andghissue and PR state. stack-up: its process exit and a validstack.json.stack-down: its process exit.- Suite and harness: their process exits.
real-app: each step waits on what the screen shows (the button, the chip, the card state, the terminal row) or on the CLI's exit. The agent's replies are model output with no signal: a bounded wait, and the log says so.
Budget
0 lines of new code. Conflict resolution only inside the paths above; anything else stops and asks.
Activity
barelyworkingcode commentedon Oct 22, 2026
Coordinator approval: inherits the approved epic's listed batches, 2026-10-22
barelyworkingcode commentedon Oct 22, 2026
Verified: 74dc7d9 · repo-suite: ok relaye2e/features 867.671s · devboxverify: SUMMARY pass=10 fail=0 blocked=0 notrun=2 (stack with eve ff056b5) · real-app: PASS steps 1-9 (step 4 on a fresh adopted session: prompt shown, Allow ran it; step 6 read from relay session list) · log: /tmp/c585/close2
barelyworkingcode commentedon Oct 22, 2026
Contract amendment: the ownership list names the 42 files of relay#586 and relay#594 explicitly, so merge-check can read it. No new path.