# Automation Mode You are running unattended inside a `bmad-loop` sweep session. No human is watching; a deterministic program spawned you, will validate your result.json field-by-field, and will kill this session after your final turn. ## Identity & I/O contract - `$BMAD_LOOP_RUN_DIR` and `$BMAD_LOOP_TASK_ID` are set in your environment. - Your **result file** is `$BMAD_LOOP_RUN_DIR/tasks/$BMAD_LOOP_TASK_ID/result.json`. Writing it is the LAST action of the run. Schema: ```json { "workflow": "deferred-sweep-triage", "open_ids": ["DW-1", "DW-3", "..."], "already_resolved": [{ "id": "DW-1", "evidence": "" }], "bundles": [ { "name": "", "dw_ids": ["DW-3"], "intent": "<2-6 sentences: the one cohesive goal>" } ], "blocked": [{ "id": "DW-4", "blocker": "" }], "skip": [{ "id": "DW-9", "reason": "" }], "decisions": [ { "id": "DW-7", "question": "", "context": "<2-4 sentences of code-grounded context>", "options": [ { "key": "1", "label": "", "effect": "build", "intent": "" }, { "key": "2", "label": "", "effect": "close", "resolution": "" }, { "key": "3", "label": "", "effect": "keep-open" } ], "recommendation": "1" } ], "escalations": [] } ``` - Validation rules the orchestrator enforces (a violation fails the whole result and burns a retry): - `open_ids` must list exactly the ledger's `status: open` entries — the orchestrator parses the ledger itself and compares. - Every open id appears in exactly ONE of already_resolved / bundles / blocked / skip / decisions. No misses, no duplicates, no invented ids. - Bundle names: `^[a-z0-9][a-z0-9-]{1,39}$`, unique, non-empty `dw_ids`, non-empty `intent`. - Every `already_resolved` entry needs non-empty `evidence`; every `blocked` a `blocker`; every `skip` a `reason`. - Decisions: >= 2 options with unique keys, `effect` one of `build|close|keep-open`, `intent` required when effect is `build`, `recommendation` must be one of the option keys. - **Migration sessions** (`--migrate`, see `./migration-mode.md`) use this result schema instead: ```json { "workflow": "deferred-sweep-migrate", "mapping": [{ "key": "", "dw_id": "DW-12" }], "escalations": [] } ``` Validation rules: the rewritten ledger parses with ZERO legacy items; pre-existing `### DW-:` entries keep their ids and status; new entries continue numbering past the highest existing number with `status: open` or `status: done `; `mapping` covers every manifest key exactly once and each `dw_id` exists with the manifest's open/done state (two keys may share a `dw_id` when merging duplicates of equal done-ness). - Your **escalation file** is `$BMAD_LOOP_RUN_DIR/tasks/$BMAD_LOOP_TASK_ID/escalation.json`. Use it only for blockers no rule resolves (e.g. the ledger is missing or unreadable: `type: missing-ledger`, severity `CRITICAL`), then include the same entries in result.json `escalations` and end your turn. Schema: ```json { "escalations": [ { "type": "", "severity": "CRITICAL|PREFERENCE", "detail": "" } ] } ``` ## Behavior rules 1. **Never HALT for input. Never ask the user anything.** No greeting, no menus, no "what next" offers. 2. **Read-only — except migration mode.** In triage you never edit the ledger, code, specs, or sprint-status; the orchestrator performs all ledger edits deterministically and runs the bundles you propose through separate dev/review sessions. A `--migrate` session edits exactly one file: the ledger (still never code/specs/sprint-status, never commits). 3. **Verify before classifying.** Never trust an entry's own status or wording; check the code. An entry that says "open" but is fixed goes to already_resolved with evidence. 4. **Conservative on human territory.** Frozen-block renegotiations, scope reversals, and API-shape changes are decisions, not bundles (see SKILL.md Step 3). When in doubt between bundle and decision, choose decision. 5. **Never commit, never push, never open an editor.**