You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Spike: is claude --bg the right primitive for long-running work, and can helm host what it spawns?
The operator's position, which this exists to test rather than confirm:
use as much as possible of the native claude code stuff, helm is the pane and the bridge between pi as well, and codex soon
Today established that the spawn, the address and the wake are all Anthropic's, between Claude Code sessions — /tmp/cc-socks/ holds one socket per session, and fourteen subagents spawned under one session got zero. What nothing native does is see a pi or codex agent, or give you anything to look inside. That is the boundary this spike has to map precisely.
Companion artifact: ~/.prp/helm-3ec376fc/reports/agent-primitives.html, whose last section is the list of things nobody has measured. This is that list.
Assumptions to prove — each gets its own verdict
claude --bg starts a real, addressable session. Own pid, own socket under /tmp/cc-socks/, visible in ListAgents, reachable by SendMessage. Confirm each, do not infer from one.
It lands somewhere the operator can watch — or it does not.This is the question the whole thesis turns on. Does a --bg session appear in a helm pane, in ~/.helm/bench/snapshot.json, anywhere at all? If it is invisible, then "helm is the pane" means helm must spawn it (the spool) rather than adopt it, and that is a different architecture from the one the operator described.
The wake survives helm's unattended posture — or it does not.Spike: wake an idle Claude Code session over its own socket, and make mail delivery transport-aware #320 measured that a socket poke is silently held under --dangerously-skip-permissions, which SpoolUnattendedPolicy gives every spawned claude. The named lever is crossSessionInbound: "accept" via --settings. Nobody has measured whether they compose. If they do, the permission-mode question the operator raised never arises. Measure this first — it is cheap and it may moot the rest.
It survives its spawner. Kill the session that started it; does it keep working? This is the main argument for peers over subagents, and it is asserted, not tested.
What the return path actually costs. A subagent's result lands in the caller's context as a tool result, free and immediate. A peer must mail, or be polled, or be asked. Measure the round trip — wall clock and tokens — for one peer reporting one result, against a subagent doing the same.
Whether a --bg session can be adopted into a pane after the fact, or whether pane-hosting requires helm to have spawned it. This decides whether "native spawn + helm surface" is a real combination or two mutually exclusive options.
The boundary, confirmed rather than assumed. Nothing about --bg should help pi or codex. Verify — a negative that is measured is worth more than one that is obvious, and the whole bridge argument rests on it.
What "proved" means here
From an agent's position, live. This repo has shipped the same bug three times — a mechanism verified by a human, silent from an agent's tool call: #124, #184, and today's canvas gate. push.sh's header carries the measurement of that position: tty is ??, session 0, /dev/tty unopenable, [ -t 1 ] false.
Every verdict records the seat it was reached from. That instruction changed three verdicts today, including one that would have shipped a wake that never fires for any agent helm spawns.
Safety
Spawn only sessions you created; never poke, message or interrupt one you did not. The operator is working in this helm.
--bg sessions are real and can outlive you — that is the point of assumption 4. So enumerate what you started, and kill every one before you finish. Say what you started and what you killed, by pid.
Anything else you spawn dies without you: timeout, a self-checked deadline, or a trap, in that order.
Prefix scratchpad files with spikebg-; the session scratchpad is shared.
Mail work runs under your own HELM_DEFAULTS_SUITE — that isolation is real now (fix(mail): move the mailbox with the defaults suite #315 merged and the checkout is current). Verify ~/.helm/mail is untouched and report that negative.
Deliverable
No production change, no PR. A report in ~/.prp/<key>/research/, verdicts posted as a comment on this issue, and your final message must be the report — verdicts per assumption, the seat each was proved from, and a recommendation on the one question that matters:
For long-running work, should the default be a subagent, a claude --bg peer, or a helm-spawned pane — and what does the operator give up in each case?
Answer that with the numbers from assumption 5, not with a preference.
Spike: is
claude --bgthe right primitive for long-running work, and can helm host what it spawns?The operator's position, which this exists to test rather than confirm:
Today established that the spawn, the address and the wake are all Anthropic's, between Claude Code sessions —
/tmp/cc-socks/holds one socket per session, and fourteen subagents spawned under one session got zero. What nothing native does is see a pi or codex agent, or give you anything to look inside. That is the boundary this spike has to map precisely.Companion artifact:
~/.prp/helm-3ec376fc/reports/agent-primitives.html, whose last section is the list of things nobody has measured. This is that list.Assumptions to prove — each gets its own verdict
claude --bgstarts a real, addressable session. Own pid, own socket under/tmp/cc-socks/, visible inListAgents, reachable bySendMessage. Confirm each, do not infer from one.--bgsession appear in a helm pane, in~/.helm/bench/snapshot.json, anywhere at all? If it is invisible, then "helm is the pane" means helm must spawn it (the spool) rather than adopt it, and that is a different architecture from the one the operator described.--dangerously-skip-permissions, whichSpoolUnattendedPolicygives every spawnedclaude. The named lever iscrossSessionInbound: "accept"via--settings. Nobody has measured whether they compose. If they do, the permission-mode question the operator raised never arises. Measure this first — it is cheap and it may moot the rest.--bgsession can be adopted into a pane after the fact, or whether pane-hosting requires helm to have spawned it. This decides whether "native spawn + helm surface" is a real combination or two mutually exclusive options.--bgshould help pi or codex. Verify — a negative that is measured is worth more than one that is obvious, and the whole bridge argument rests on it.What "proved" means here
From an agent's position, live. This repo has shipped the same bug three times — a mechanism verified by a human, silent from an agent's tool call: #124, #184, and today's canvas gate.
push.sh's header carries the measurement of that position:ttyis??, session0,/dev/ttyunopenable,[ -t 1 ]false.Every verdict records the seat it was reached from. That instruction changed three verdicts today, including one that would have shipped a wake that never fires for any agent helm spawns.
Safety
--bgsessions are real and can outlive you — that is the point of assumption 4. So enumerate what you started, and kill every one before you finish. Say what you started and what you killed, by pid.timeout, a self-checked deadline, or atrap, in that order.spikebg-; the session scratchpad is shared.HELM_DEFAULTS_SUITE— that isolation is real now (fix(mail): move the mailbox with the defaults suite #315 merged and the checkout is current). Verify~/.helm/mailis untouched and report that negative.Deliverable
No production change, no PR. A report in
~/.prp/<key>/research/, verdicts posted as a comment on this issue, and your final message must be the report — verdicts per assumption, the seat each was proved from, and a recommendation on the one question that matters:For long-running work, should the default be a subagent, a
claude --bgpeer, or a helm-spawned pane — and what does the operator give up in each case?Answer that with the numbers from assumption 5, not with a preference.