fabro/lib/components
Brandon McNama 465cc66283
feat(approvals): auto-approve child starts by parent workflow policy
A workflow agent that spawns child runs forces every dispatch through an
operator checkpoint, even for dispatcher workflows whose whole purpose is
unattended fan-out. The only workaround today is out-of-band approval
hooks that poll the runs API and click approve from the host, which needs
a server token inside the worker host and leaves the decision recorded
nowhere near the run it approved.

Give the platform a first-class policy path instead: a child start is
auto-approved only when the server enables
`[server.approvals] allow_child_auto_approval` and the spawning parent's
registered `workflow.toml` opts in with `[run.children] auto_approve`.
Both defaults stay false, so nothing changes for existing workflows.

The decision is read from the parent's persisted spec at start time, so a
config reload affects future starts only, reassigning a run's parent link
cannot change the policy, and `RunIntentArgs.auto_approve` keeps its
existing meaning (the child's own agent-interaction posture) without ever
bypassing the lifecycle checkpoint. A worker start outside its own
parentage fails closed to the operator gate.

Auto-approved children record a distinct `auto_approved` lifecycle
transition and project `approval.state = approved` with a decision
timestamp in one pass, so lifecycle history is auditable and no transient
pending state is ever observed.

Note: this commit depends on lithoscomputer/petri accepting the
platform-only `[run.children]` workflow.toml section; the Cargo.lock bump
to the merged rev lands with that PR.
2026-10-15 15:27:59 -04:00
..
fabro-automation Open sandbox provider identity to plugin kinds 2026-09-09 15:17:32 -06:00
fabro-checkpoint Merge remote-tracking branch 'origin/main' into remove/run-metadata-branches 2026-09-12 16:28:01 -06:00
fabro-dot Include stall fixture in workflow inventory snapshot 2026-10-14 13:27:17 -04:00
fabro-dump Build the run's display graph from Petri's admission 2026-09-19 11:41:58 -04:00
fabro-environment Open sandbox provider identity to plugin kinds 2026-09-09 15:17:32 -06:00
fabro-github Resolve one Git identity per run and inject it everywhere 2026-09-12 11:35:46 -06:00
fabro-graphviz Read workflow graphs through Petri's DOT parser 2026-09-19 12:23:57 -04:00
fabro-install Drop the dependency edges with no production use 2026-09-19 09:33:31 -04:00
fabro-interview Delete the interviewers the Petri cutover left unused 2026-09-19 09:05:52 -04:00
fabro-llm Scope run model clients with session headers 2026-10-14 12:44:52 -04:00
fabro-manifest Read workflow graphs through Petri's DOT parser 2026-09-19 12:23:57 -04:00
fabro-mcp-store refactor: organize crates into three layers 2026-07-23 17:59:34 -04:00
fabro-petri feat(approvals): auto-approve child starts by parent workflow policy 2026-10-15 15:27:59 -04:00
fabro-slack Delete fabro-core and the engine half of fabro-workflow 2026-09-18 10:44:41 -04:00
fabro-store feat(approvals): auto-approve child starts by parent workflow policy 2026-10-15 15:27:59 -04:00
fabro-tool Answer steer and interrupt with the worker's acknowledgement 2026-09-18 23:54:11 -04:00
fabro-tracker refactor: organize crates into three layers 2026-07-23 17:59:34 -04:00
fabro-variable refactor: organize crates into three layers 2026-07-23 17:59:34 -04:00
fabro-workflow Scope run model clients with session headers 2026-10-14 12:44:52 -04:00
fabro-workflow-version Read workflow graphs through Petri's DOT parser 2026-09-19 12:23:57 -04:00