Files
automaton/prompts/workflow.md
T

115 lines
7.9 KiB
Markdown
Raw Normal View History

# Workflow State Machine
This file defines the linear progression of a task in automaton. The Orchestrator uses this to determine the next phase.
## Single Source of Truth: `.state` File
The `.state` file in each task folder is the canonical indicator of a task's current phase. It takes precedence over artifact-based heuristic.
- **Location**: `tasks/{task-name}/.state`
- **Content**: A single phase name (e.g., `research`, `research:awaiting_approval`, `implement`, `complete`)
- **Atomic writes**: Written to `.state.tmp` first, then renamed to `.state`
- **If `.state` is missing**: Fall back to artifact-based heuristic and write `.state` with the inferred phase
### `.state.approvals` Log
Each task has a `.state.approvals` file recording all user approvals:
- **Location**: `tasks/{task-name}/.state.approvals`
- **Format**: One line per approval: `{phase}:approved|{ISO-8601-timestamp}|{approver}`
- **Append-only**: Approvals are never deleted
- **Metadata**: Not a phase deliverable, excluded from artifact checks
### `.state.lock` (Multi-Agent Mode Only)
When `Mode: multi-agent` is set in `.agent.md`, a `.state.lock` file tracks which agent has claimed the task:
- **Location**: `tasks/{task-name}/.state.lock`
- **Format**: `agent: {id}`, `phase: {current}`, `claimed: {timestamp}`, `expires: {timestamp}`
- **Atomic writes**: Same `.tmp` pattern as `.state`
- **Default timeout**: 30 minutes (configurable in `.agent.md`)
- **Metadata**: Not a phase deliverable, excluded from artifact checks
## Task Lifecycle
| Current State | Signal | Next Phase | Action |
| :--- | :--- | :--- | :--- |
| **New Task** | `status.py --create-task {name} --project {project}` creates folder with `.state` = `new` | Research | Generate `SPEC.md` |
| **Research** | Has `.state` = `research` | research:awaiting_approval | Present SPEC.md draft for user sign-off |
| **research:awaiting_approval** | Has `.state` = `research:awaiting_approval` | research:approved | User says "APPROVED", call `status.py --approve` |
| **research:approved** | Has `.state` = `research:approved` | Decomposition (optional) or Design (optional) or Implement | Transition via `status.py --transition` |
| **Decomposition** | Has `.state` = `decomposition` | decomposition:awaiting_approval | Present DECOMPOSITION.md draft for user sign-off |
| **decomposition:awaiting_approval** | Has `.state` = `decomposition:awaiting_approval` | decomposition:approved | User says "APPROVED", call `status.py --approve` |
| **decomposition:approved** | Has `.state` = `decomposition:approved` | Sub-task Research | Orchestrator creates sub-task folders |
| **Design** | Has `.state` = `design` | design:awaiting_approval | Present DESIGN.md draft for user sign-off |
| **design:awaiting_approval** | Has `.state` = `design:awaiting_approval` | design:approved | User says "APPROVED", call `status.py --approve` |
| **design:approved** | Has `.state` = `design:approved` | Test Design (optional) or Implement | Transition via `status.py --transition` |
| **Test Design** | Has `.state` = `test_design` | test_design:awaiting_approval | Present TEST_PLAN.md draft for user sign-off |
| **test_design:awaiting_approval** | Has `.state` = `test_design:awaiting_approval` | test_design:approved | User says "APPROVED", call `status.py --approve` |
| **test_design:approved** | Has `.state` = `test_design:approved` | Implement | Transition via `status.py --transition` |
| **Implementation** | Has `.state` = `implement` | Code Review | Generate `CODE_REVIEW.md` |
| **Code Review** | Has `.state` = `code_review` | code_review:awaiting_approval | Present CODE_REVIEW.md draft for user sign-off |
| **code_review:awaiting_approval** | Has `.state` = `code_review:awaiting_approval` | code_review:approved | User says "APPROVED", call `status.py --approve` |
| **code_review:approved** | Has `.state` = `code_review:approved` | Bug Find | Transition via `status.py --transition` |
| **Bug Find** | Has `.state` = `bug_find` | Adversarial Bug Find | Generate `ADVERSARIAL_BUG_REPORT.md` |
| **Adversarial Bug Find** | Has `.state` = `adversarial_bug_find` | Doc Review | Generate `DOC_REVIEW.md` |
| **Doc Review** | Has `.state` = `doc_review` | Referee | Generate `VERDICT.md` |
| **Referee** | Has `.state` = `referee` | Complete / Human Intervention | Finalize or request user intervention |
### Phases Without Approval Gates
The following phases do **not** have `:awaiting_approval` sub-states because they do not require interactive user sign-off:
- `implement`, `bug_find`, `adversarial_bug_find`, `doc_review`, `referee`
- These transition directly to the next phase upon producing their artifact and calling `status.py --transition`
Phases with approval gates (require user sign-off):
- `research`, `decomposition`, `design`, `test_design`, `code_review`
## Task Creation (via `status.py`)
New tasks MUST be created via `status.py --create-task {name} --project {project}`. This creates the folder, `.state` = `new`, and an empty `.state.approvals` file.
Manual task folder creation (`mkdir tasks/my-task`) is flagged as a violation by `status.py --audit` and `status.py --validate-folder`.
Tasks without `.state` files are UNTRACKED. All commands (`--transition`, `--can-edit`, `--task`, `--approve`) refuse to operate on them. Run `status.py --upgrade --project {project}` to bootstrap `.state` files for pre-v2.0 tasks.
### Task creation from bugs
When the Orchestrator detects a `VERDICT.md` with `FAIL` or `NEEDS_REVIEW`, it uses `status.py --create-task --project {project}` to create fix/review/tiebreak tasks. The Orchestrator also copies relevant artifacts (SPEC.md, BUG_REPORT.md, etc.) and sets `.state` to the appropriate phase (e.g., `bug_find` for fix tasks).
## Enforcement via `status.py`
### Phase-Gated Transitions
All transitions go through `status.py --transition {phase} --project {project}`:
- Only legal transitions are allowed (defined in LEGAL_TRANSITIONS)
- `:awaiting_approval` phases can only transition to `:approved` via `status.py --approve --project {project}`
- Required artifacts must exist and be non-empty before transitioning
- Forbidden artifacts (from future phases) block transitions
### Folder Validation
`status.py --validate-folder --task {name} --project {project}` checks for:
- Out-of-order artifacts (artifacts from future phases)
- Missing `.state` file (manually created task)
- Phase-artifact inconsistency
### Audit
`status.py --audit --project {project}` checks all tasks for:
- Category 1: Out-of-order artifacts
- Category 2: State-artifact inconsistency
- Category 3: Unauthorized git modifications (if git repo)
- Category 4: Manually created task folders (no `.state`)
### Approval Gates
`status.py --approve --task {name} --project {project}` transitions from `:awaiting_approval` to `:approved`:
- Records approval in `.state.approvals` with timestamp and approver
- Refuses if not in an `:awaiting_approval` sub-state
- Refuses for phases that don't require approval
## Autopilot Rules
1. **Linear Progression**: Never skip a phase. Each transition must go through `status.py --transition --project {project}`.
2. **Approval Gates**: Research, Decomposition, Design, Test Design, and Code Review phases require explicit user approval before proceeding. The autopilot MUST pause at `:awaiting_approval` sub-states.
3. **Artifact Check**: A phase is only considered "complete" if its corresponding artifact exists, is non-empty, AND the `.state` file reflects the completed phase.
4. **Folder Validation**: Before each phase transition, run `status.py --validate-folder --project {project}`. Do not proceed past violations.
5. **Human Intervention**: If the Referee marks a task as `FAIL`, `NEEDS_REVIEW`, or identifies "Tie-Breaks", the Autopilot pauses and waits for user input.
6. **Task Creation**: Always use `status.py --create-task --project {project}` to create new tasks. Never create task folders manually.
7. **Forbidden Actions**: Respect the ALLOWED/FORBIDDEN sections in each phase prompt. Even in autopilot, the Orchestrator must not perform forbidden actions.