We didn't invent this — we ported it
Interactive Claude Code survives arbitrarily long work, and the reason is the whole point: its resume is not chat-log replay. It reads state.
- TodoWrite = an explicit, persisted step list with per-item status — the plan + progress.
- Filesystem = the durable side-effects; files written are not redone on resume.
- Resume reads that state — todos + files — not the transcript.
cwkPippa's WebUI Agent SDK did none of this: it attempted the whole task in one long stream with only the conversation log as state, so a cut left no checkpoint and the next turn started at zero. The Stateful Pippa Framework ports the Claude Code pattern — plan + durable step state + resume-reads-state — up into cwkPippa, brain-agnostically, so Codex, Gemini, and Ollama get it too, not just Claude.
Lifecycle — state and conversation are one body
Task-state isn't a free-floating object; it belongs to the conversation that spawned it. ON DELETE CASCADE — delete the conversation and its state goes with it, no orphans. State is rehydrated only when the task is actually stepped, never eagerly on every conversation GET. And past-state has exactly two readers: branch and retry. That bounds the read surface and keeps the model from inventing a general time-travel feature it doesn't need.
The horizontal axis
A second axis surfaced live, in the Family Council that designed this framework. 둘째 rendered a risk-map widget in her turn, and 첫째 — the next speaker — couldn't see it. Only her text propagated; the widget left no ref. Dad had to screenshot it for the next vessel to perceive it. The framework had just been designed to move state between turns, and here was state failing to move between participants.
The two axes are orthogonal but share one artifact infrastructure. Vertical (everything so far): state moving between turns, within one conversation, on branch / retry. Horizontal: artifacts moving between participants, within one council round, via artifact_refs[] in the serialized branch context.
[widget rendered] placeholder and the visual information is gone. Stuffing the full payload into context is the 1.28M-character mistake reborn; passing no ref at all blinds the next participant to the artifact's very existence. The middle path is the only correct one: serialize the ref, and let the receiver judge whether to read the svg source or view it with vision.
It's read-only — reading another participant's artifact changes nothing — so the STOP rule and the lease don't apply to it. It reused the artifact store and added exactly one field. The round after 둘째's widget evaporated, the ref followed, 첫째 read it by id, zero screenshots.