Follow-on to #3 (the LCM + Session Manager lane core, merged via #2). That core is implemented and tested behind fakes; this issue tracks the runner + the adapters we own to get from "tested behind fakes" to a daemon that actually spawns and supervises sessions.
Owner
@harshitsinghbhandari (+ @yyovil on the Agent adapter — a dependency, built separately).
Scope (ours)
Runner / wiring
Carried-forward items (from the core PRs)
Real adapters we own
Dependencies (other lanes — coordinate; not blocking the above)
Agent adapter (claude-code / codex) → @yyovil. The reaper's liveness sampling and the SM's spawn use the Agent port; our work proceeds against the port + a fake until it lands.
- Persistence + CDC (incl.
Seed/Get) → Tom.
- SCM poller producing
SCMFacts → adil.
- Backend API + OpenAPI → aditi.
Notes
- Everything in Scope (ours) can be built against the existing
ports/ interfaces with fakes, then run against real adapters as they land — none of it is blocked on the external lanes.
- Architecture + current status: see
docs/ (docs/architecture.md, docs/status.md).
Follow-on to #3 (the LCM + Session Manager lane core, merged via #2). That core is implemented and tested behind fakes; this issue tracks the runner + the adapters we own to get from "tested behind fakes" to a daemon that actually spawns and supervises sessions.
Owner
@harshitsinghbhandari (+ @yyovil on the
Agentadapter — a dependency, built separately).Scope (ours)
Runner / wiring
LCM.ApplyRuntimeObservation, and (b) callsLCM.TickEscalations(now)so duration-based escalations actually fire. (The design assigns the reaper to this lane; the LCM never polls itself.)main.gostub with the real assembly: construct the LCM + Session Manager with their adapters, start the reaper loop, and handle graceful start/stop/shutdown.Carried-forward items (from the core PRs)
react()out-of-lock dispatch ordering (from feat(lifecycle): ACT layer — reaction table + escalation engine (split B) #6) — reactions fire after the per-session lock releases; givereact()a per-session ordering (a small react queue) or re-check the triggering state before dispatch, so concurrent observers can't dispatch on a stale snapshot.ExpectedRevisionwiring (from feat(lifecycle): LCM Apply* pipeline (split A) #5) — use theLifecyclePatch.ExpectedRevisionoptimistic-CAS for multi-writer / CDC safety (currently the only guard is the in-process per-session mutex).Real adapters we own
Runtime— tmux adapter —Create/Destroy/SendMessage/GetOutput/IsAlive(tmuxnew-session/has-session/send-keys/capture-panemechanics).Workspace— git-worktree adapter —Create/Destroy/List/Restore, honoring the worktree-remove safety (refuse torm -rfa path still registered aftergit worktree prune).Dependencies (other lanes — coordinate; not blocking the above)
Agentadapter (claude-code / codex) → @yyovil. The reaper's liveness sampling and the SM's spawn use theAgentport; our work proceeds against the port + a fake until it lands.Seed/Get) → Tom.SCMFacts→ adil.Notes
ports/interfaces with fakes, then run against real adapters as they land — none of it is blocked on the external lanes.docs/(docs/architecture.md,docs/status.md).