Deployment on kinto, and staying isolated from production Impulse
Deployment runs under launchd on kinto, exposed via Reception. The pattern is your existing one: a launchd plist runs the process; Reception’s Caddy routes a path to its port with header_up Host localhost, the load-bearing line. Approval and the live panel reach you over Tailscale.
Try it yourself
Where the checkpointer becomes load-bearing for approval
This is the seam where two modules depend on each other. Trace one roll end to end before answering.
Tracing one wild roll through all seven modules, at which point does the module 4 checkpointer become load-bearing for the module 5 approval, and why?
Reveal answer
The checkpointer becomes load-bearing at the moment interrupt() fires and the graph pauses. Without a checkpoint of the state at that exact point, there would be nothing to resume into when your approval decision comes back (possibly much later, from Discord or the panel) -- the pause would just lose the in-flight roll. The checkpointer is what makes "pause now, resume whenever a human responds" survivable rather than instantaneous-or-lost.
What keeps v2 isolated from production Impulse
"Runs alongside production Impulse without touching it." What concretely keeps v2 isolated, at the data layer and the process layer?
Show answer
Correct answer: D — v2 is a separate process with its own database and directory, isolated from production Impulse
Process-level isolation (a separate launchd-managed process, not sharing memory or a runtime with production Impulse) plus data-level isolation (its own checkpointer / database, its own directory) means v2 can be built, run, and even break without any path back into the real heartbeat's process or state.
Assemble and deploy Impulse v2
Wire modules 3 through 8 into one running system and deploy it on kinto, without touching production Impulse.
- Create the build under ~/dev/groundschool/builds/m9-impulse-v2, separate from production Impulse.
- Take the m3 dice StateGraph as the core: sense -> modulate -> roll -> route.
- Put an m4 PostgresSaver checkpointer under it, using its own database, not production Impulse's.
- Gate the wild face behind an m5 interrupt(), approved from Discord or the groundschool panel before the wild action fires.
- Stream the whole run into the learning cockpit using m6's config.writer events and graph.stream.
- Dispatch the rolled continue/personal/wild face to an m7 worker subgraph (a createDeepAgent) that executes the action, with Command.PARENT handoff back.
- Enable m8 tracing: LANGSMITH_TRACING=true plus wrapAnthropic on the deep agent's SDK calls.
- Deploy under launchd on kinto and expose the panel/approval endpoints via a new Reception conf.d/*.caddy snippet.
- Run one real autonomous roll end-to-end and confirm it survives a kinto restart mid-roll.
Capstone end-to-end roll verified
Confirm the full assembled system on a real roll.
One real autonomous roll runs end-to-end through all seven modules, a kinto restart mid-roll resumes rather than restarts, and production Impulse is untouched and unaffected throughout.