diff --git a/docs/approvals.md b/docs/approvals.md index 7f5149aa..e587add0 100644 --- a/docs/approvals.md +++ b/docs/approvals.md @@ -187,6 +187,49 @@ approval id to retry. Because tags are first-class git objects, rejected and failed trees stay browsable forever — `git log --tags` in the applied repo is the audit trail. +### Dispatch via `rebuild_queue` (#441) + +Long-running approval work — `ApplyCommit`, `UpdateMetaInputs`, +`Spawn` — no longer runs inline inside `actions::approve`. Instead +the approval handler enqueues a `QueueEntry` into the global +`rebuild_queue`: + +| `ApprovalKind` | `QueueKind` queued | `QueueSource` | +|---|---|---| +| `ApplyCommit` | `Rebuild` | `Approval` | +| `UpdateMetaInputs` | `MetaUpdate` | `Approval` | +| `Spawn` | `Spawn` | `Approval` | +| `InitConfig` | — runs inline (sub-second git seed) | — | +| `SchedulePrompt` | — runs inline (single sqlite insert) | — | + +Each queue entry carries the originating `approval_id` so the +worker can re-fetch the approval row when it dispatches, run the +kind-specific pipeline (`run_approval_apply_commit` / +`run_approval_update_meta_inputs` / `run_approval_spawn`), and +fire the matching `HelperEvent::*` on completion via +`finish_approval`. + +Two visible consequences: + +- **Operator dashboard**: after clicking APPR0VE the work-in-progress + shows up on the *rebuild queue* card (`POST /api/state.rebuild_queue` + + live `rebuild_queue_changed` events), not on the approvals panel + (which already moved the row to "approved"). A long meta-update + cascade renders as a parent entry with one child per per-agent + rebuild — see `docs/web-ui.md` for the layout. +- **Cancellation**: the dashboard's *× cancel* button on a `Queued` + entry calls `POST /api/rebuild-queue/{id}/cancel`, which flips the + entry to `Cancelled` before the worker dispatches it. Returns + `{"cancelled": true}` on success, `{"cancelled": false}` if the + entry already left `Queued` (running / done / failed) — terminal + states can't be retroactively rewritten. + +`QueueSource::Approval` carries the `approval_id` so a tail-end +build failure surfaces back as a failed approval row, not just a +silent queue entry. `QueueSource::Manual` (dashboard ↻ R3BU1LD) +and `QueueSource::AutoUpdate` (boot-time sweep) use the same +queue but skip the approval row plumbing. + ### Forge mirror When the bundled `hive-forge` container is running — on by