Parent
PRD #45 — Chassis Actions (MVP)
What to build
The complete one-shot submit path for a Chassis Action, end-to-end through every layer.
- Persist Chassis Action definitions in
~/.pi/agent/chassis/state.json (global per-user), mirroring the caveman state convention. Expose read/write across the Desktop IPC Seam.
- A pure
parseChassisState(json) -> { actions, dropped } that validates on load and drops malformed actions instead of failing (a bad entry must never brick the composer).
- A new Settings → Actions section that can create a one-shot action with a
submit effect (label, showLabel, payload text).
- A single
ChassisActionControl component renders each action as a button in the composer control row, alongside the prebuilt toggles, across the in-thread, new-thread, and pending composer surfaces.
- Clicking a one-shot
submit action fires its fixed payload immediately through the existing composer submit seam (api.submitComposer), leaving any unsent draft untouched, and works whether the session is idle or running (steer).
Schema (MVP, one-shot/submit only here):
{{input}} templating and sticky/wrap are NOT in this slice. oneShot pairs only with submit.
Acceptance criteria
Blocked by
None - can start immediately.
Parent
PRD #45 — Chassis Actions (MVP)
What to build
The complete one-shot
submitpath for a Chassis Action, end-to-end through every layer.~/.pi/agent/chassis/state.json(global per-user), mirroring the caveman state convention. Expose read/write across the Desktop IPC Seam.parseChassisState(json) -> { actions, dropped }that validates on load and drops malformed actions instead of failing (a bad entry must never brick the composer).submiteffect (label, showLabel, payload text).ChassisActionControlcomponent renders each action as a button in the composer control row, alongside the prebuilt toggles, across the in-thread, new-thread, and pending composer surfaces.submitaction fires its fixed payload immediately through the existing composer submit seam (api.submitComposer), leaving any unsent draft untouched, and works whether the session is idle or running (steer).Schema (MVP, one-shot/submit only here):
{ "version": 1, "actions": [ { "id": "uuid", "label": "Security audit", "showLabel": true, "trigger": "oneShot", "effect": { "type": "submit", "text": "/security-scan" } } ] }{{input}}templating and sticky/wrap are NOT in this slice.oneShotpairs only withsubmit.Acceptance criteria
chassis/state.jsonand it survives an app restart.ChassisActionControlcomponent.chassis/state.jsonis dropped on load; the composer still works and other valid actions still render. (Unit test onparseChassisState.)Blocked by
None - can start immediately.