UNPKG

aios-core

Version:

Synkra AIOS: AI-Orchestrated System for Full Stack Development - Core Framework

886 lines (675 loc) 25.5 kB
--- ## Execution Modes **Choose your execution mode:** ### 1. YOLO Mode - Autonomous (0-2 prompts) - Waves auto-proceed after gate approval - Checkpoints default to GO - **Best for:** Well-tested epics with low conflict risk ### 2. Interactive Mode - Balanced (5-10 prompts) **[DEFAULT]** - Human checkpoint between waves - Gate review before merge - **Best for:** First epic execution, medium-high complexity ### 3. Pre-Flight Planning - Comprehensive Analysis - Full dependency analysis before execution - Dry-run wave structure validation - **Best for:** Very high complexity epics, unknown conflict risk **Parameter:** `mode` (optional, default: `interactive`) --- ## Task Definition (AIOS Task Format V1.0) ```yaml task: executeEpicPlan() responsavel: Morgan (PM) responsavel_type: Agente atomic_layer: Orchestration **Entrada:** - campo: execution_plan_path tipo: string origem: User Input obrigatório: true validação: Must be a valid path to an EXECUTION.yaml file (typically in docs/stories/epics/{epic}/) - campo: action tipo: string origem: User Input obrigatório: false validação: Must be "start", "continue", "status", "skip-story", or "abort". Default: "start" - campo: mode tipo: string origem: User Input obrigatório: false validação: Must be "yolo", "interactive", or "preflight". Default: "interactive" - campo: wave tipo: number origem: User Input obrigatório: false validação: Wave number to resume from (only with action=continue). Default: auto-detect from state. **Saída:** - campo: epic_state tipo: object destino: File system (.aios/epic-{epicId}-state.yaml) persistido: true - campo: wave_report tipo: object destino: Output persistido: false - campo: next_steps tipo: string destino: Output persistido: false ``` --- ## Pre-Conditions ```yaml pre-conditions: - [ ] execution_plan_path must resolve to an existing YAML file tipo: pre-condition blocker: true validação: | File must exist and contain execution.epicId, execution.stories, execution.waves error_message: "Pre-condition failed: Execution plan not found at '{execution_plan_path}'" - [ ] All story files referenced in the plan must exist tipo: pre-condition blocker: true validação: | For each story in execution.stories, verify {storyBasePath}/{story.file} exists error_message: "Pre-condition failed: Story file '{story.file}' not found" - [ ] Template workflow must exist tipo: pre-condition blocker: true validação: | execution.template must resolve to .aios-core/development/workflows/{template}.yaml error_message: "Pre-condition failed: Template '{template}' not found" - [ ] For action=continue, state file must exist tipo: pre-condition blocker: true validação: | .aios/epic-{epicId}-state.yaml must exist with status=active error_message: "Pre-condition failed: No active state found. Use action=start first." - [ ] Git working tree must be clean (no uncommitted changes) tipo: pre-condition blocker: true validação: | git status --porcelain returns empty or only untracked files error_message: "Pre-condition failed: Uncommitted changes detected. Commit or stash first." ``` --- ## Post-Conditions ```yaml post-conditions: - [ ] State file updated with current wave progress tipo: post-condition blocker: true validação: | .aios/epic-{epicId}-state.yaml exists and reflects completed waves/stories error_message: "Post-condition failed: State file not persisted" - [ ] All completed stories have branches pushed tipo: post-condition blocker: false validação: | For each completed story, git branch {story.branch} exists error_message: "Warning: Some story branches may not have been pushed" ``` --- ## Acceptance Criteria ```yaml acceptance-criteria: - [ ] Each story in each wave was executed via development-cycle tipo: acceptance-criterion blocker: true validação: | Each story spawned a subagent that followed the full development-cycle (PO validate -> Executor develop -> Self-healing -> Quality gate -> DevOps push) error_message: "Acceptance criterion not met: Stories did not follow development-cycle" - [ ] Wave gates were executed between waves tipo: acceptance-criterion blocker: true validação: | After each wave, the gate agent reviewed cross-story integration error_message: "Acceptance criterion not met: Wave gates skipped" - [ ] State supports resume across sessions tipo: acceptance-criterion blocker: true validação: | Aborting and running action=continue resumes from last completed wave error_message: "Acceptance criterion not met: Resume not working" ``` --- ## Tools - **Tool:** Task tool (Claude Code built-in) - **Purpose:** Spawn subagents for story development-cycle and wave gates - **Source:** Claude Code runtime - **Tool:** Read tool (Claude Code built-in) - **Purpose:** Read execution plan, story files, workflow templates - **Source:** Claude Code runtime - **Tool:** Write tool (Claude Code built-in) - **Purpose:** Persist epic state file - **Source:** Claude Code runtime - **Tool:** AskUserQuestion (Claude Code built-in) - **Purpose:** Wave checkpoints (GO/PAUSE/REVIEW/ABORT) - **Source:** Claude Code runtime - **Tool:** Bash (Claude Code built-in) - **Purpose:** Git operations (branch check, worktree creation) - **Source:** Claude Code runtime --- ## Error Handling **Strategy:** retry-at-story-level **Common Errors:** 1. **Error:** Story development-cycle fails - **Cause:** Dev agent encountered an error, tests fail, etc. - **Resolution:** development-cycle handles retries internally (max 3) - **Recovery:** If still failing, mark story as blocked, continue other stories in wave 2. **Error:** Wave gate fails - **Cause:** Integration issues between stories in wave - **Resolution:** Gate agent identifies specific issues - **Recovery:** Create fix tasks, re-run affected stories, re-submit gate 3. **Error:** Merge conflict between wave branches - **Cause:** Stories modified overlapping files - **Resolution:** Follow merge order from execution plan - **Recovery:** Resolve conflicts manually, re-run tests 4. **Error:** State file corrupted - **Cause:** Interrupted write, concurrent access - **Resolution:** Backup state before each write - **Recovery:** Restore from .aios/epic-{epicId}-state.yaml.bak --- ## Performance ```yaml duration_per_wave: 30-120 min (depends on story count and complexity) duration_total: 2-8 hours (depends on epic size) cost_per_story: $0.05-0.50 (subagent spawning) token_usage: ~5,000-20,000 tokens per story cycle ``` --- ## Metadata ```yaml story: EPIC-ACT (epic infrastructure) version: 1.0.0 dependencies: - epic-orchestration.yaml (template) - development-cycle.yaml (inner loop per story) - po-epic-context.md (epic context tracking) - validate-next-story.md (PO story validation) tags: - epic - orchestration - wave-execution - parallel-development - quality-gates updated_at: 2026-02-06 ``` --- # Execute Epic Plan Task ## Purpose Orchestrate the execution of an epic by reading a project-specific EXECUTION.yaml plan, processing stories in wave-based parallel execution, running each story through the full `development-cycle` (PO validate -> Dev implement -> Self-heal -> QA review -> DevOps push), managing wave quality gates, and persisting state for resume across sessions. ## Prerequisites - Execution plan YAML exists (e.g., `docs/stories/epics/{epic}/EPIC-{ID}-EXECUTION.yaml`) - Template `epic-orchestration.yaml` exists in `.aios-core/development/workflows/` - Inner loop `development-cycle.yaml` exists in `.aios-core/development/workflows/` - All story files referenced in the plan exist - Git working tree is clean --- ## Command ``` @pm *execute-epic {path-to-EXECUTION.yaml} [action] [--mode=interactive] ``` ### Examples ```bash # Start a new epic execution @pm *execute-epic docs/stories/epics/epic-activation-pipeline/EPIC-ACT-EXECUTION.yaml # Resume from where you left off @pm *execute-epic docs/stories/epics/epic-activation-pipeline/EPIC-ACT-EXECUTION.yaml continue # Check current progress @pm *execute-epic docs/stories/epics/epic-activation-pipeline/EPIC-ACT-EXECUTION.yaml status # Start in YOLO mode (autonomous) @pm *execute-epic docs/stories/epics/epic-activation-pipeline/EPIC-ACT-EXECUTION.yaml start --mode=yolo # Abort execution @pm *execute-epic docs/stories/epics/epic-activation-pipeline/EPIC-ACT-EXECUTION.yaml abort ``` --- ## Task Execution ### Action: `start` Initialize epic execution and begin Wave 1. **1. Read and parse the execution plan:** ``` Read {execution_plan_path} Extract: - epicId - storyBasePath - template (reference to epic-orchestration.yaml) - stories (map of story definitions) - waves (ordered list of wave definitions) - final_gate (epic-level sign-off criteria) - bug_verification (optional checklist) ``` **2. Validate all references:** ``` FOR each story in execution.stories: VERIFY file exists at {storyBasePath}/{story.file} VERIFY story.executor is a valid agent ID VERIFY story.quality_gate is a valid agent ID VERIFY story.quality_gate != story.executor (enforcement from development-cycle) FOR each wave in execution.waves: VERIFY all story IDs in wave.stories exist in execution.stories VERIFY wave.dependencies reference valid previous waves VERIFY epic-orchestration.yaml exists VERIFY development-cycle.yaml exists ``` **3. Pre-flight analysis (if mode=preflight):** ``` FOR each wave: List all key_files across stories in the wave Identify overlapping files flag conflict risk Estimate total complexity Show dependency chain Display full analysis and ASK user to confirm before proceeding. ``` **4. Initialize state:** ```yaml # .aios/epic-{epicId}-state.yaml epic_state: epicId: {epicId} execution_plan: {execution_plan_path} mode: {mode} started_at: {ISO timestamp} updated_at: {ISO timestamp} status: active current_wave: 1 total_waves: {count} waves: 1: name: {wave.name} status: pending # pending | in_progress | gate_review | completed | failed stories: {story_id}: status: pending # pending | in_progress | completed | failed | blocked branch: {story.branch} started_at: null completed_at: null executor: {story.executor} quality_gate: {story.quality_gate} 2: # ... gate_verdicts: {} bug_verification: {} ``` **5. Display epic header:** ``` === Epic Execution Started: {epicId} === Plan: {execution_plan_path} Mode: {mode} Stories: {total_stories} across {total_waves} waves Template: epic-orchestration + development-cycle (per story) Wave Structure: Wave 1: {wave.name} ({story_count} stories, parallel={wave.parallel}) Wave 2: {wave.name} ({story_count} stories, parallel={wave.parallel}) ... Starting Wave 1... ``` **6. Execute Wave 1** call the **Wave Executor** (see below). **7. Save state and STOP** (wait for wave completion or user checkpoint). --- ### Action: `continue` Resume epic execution from current state. **1. Load state** from `.aios/epic-{epicId}-state.yaml` **2. Verify** status is `active` **3. Determine resume point:** ``` IF current wave has status=in_progress: Resume wave (some stories may already be done) IF current wave has status=gate_review: Resume gate review IF current wave has status=completed: Advance to next wave IF all waves completed: Run final gate ``` **4. Execute from resume point** call Wave Executor or Final Gate. **5. Save state.** --- ### Action: `status` Show epic progress without executing. ``` === Epic Status: {epicId} === Plan: {execution_plan_path} Mode: {mode} Status: {active|completed|aborted} Progress: Wave {current}/{total} --- Wave Progress --- [x] Wave 1: {name} {completed_stories}/{total_stories} stories [x] ACT-1: {title} (branch: {branch}) [x] ACT-2: {title} (branch: {branch}) ... Gate: APPROVED by @{agent} [>] Wave 2: {name} {completed_stories}/{total_stories} stories <-- current [>] ACT-6: {title} (branch: {branch}) IN PROGRESS Gate: PENDING [ ] Wave 3: {name} 0/{total_stories} stories ... --- Bug Verification --- [x] Bug 1: {description} Fixed by {story} [ ] Bug 2: {description} Pending ({story}) ... Next: @pm *execute-epic {path} continue ``` --- ### Action: `skip-story` Skip a specific story within the current wave (only if not critical). **1. Load state.** **2. Verify** the story is in the current wave and has priority != critical. **3. Mark story as skipped** with reason. **4. If all other stories in wave are done**, proceed to wave gate. **5. Save state.** --- ### Action: `abort` Abort epic execution. **1. Load state.** **2. Set status to `aborted`.** **3. Generate abort report:** ``` === Epic Aborted: {epicId} === Progress: Wave {current}/{total} Completed: - Wave 1: {N} stories done - ... In Progress: - {story}: branch {branch} (uncommitted work may exist) Branches created: - feat/act-1-greeting-config - feat/act-2-user-profile-audit - ... State preserved at: .aios/epic-{epicId}-state.yaml To resume later: @pm *execute-epic {path} continue ``` **4. Save state.** --- ## Wave Executor (Core Algorithm) This procedure executes a single wave from the epic plan. ``` PROCEDURE execute_wave(wave, stories, state): state.waves[wave.number].status = "in_progress" save_state() Display: "--- Wave {wave.number}: {wave.name} ---" "Stories: {story_count} | Parallel: {wave.parallel}" "Dependencies: {wave.dependencies}" # ───────────────────────────────────────── # STEP 1: Execute stories via development-cycle # ───────────────────────────────────────── IF wave.parallel == true: # Spawn ALL stories in this wave simultaneously using Task tool # Each story runs the full development-cycle as a subagent FOR EACH story_id IN wave.stories (IN PARALLEL): story = execution.stories[story_id] IF state.waves[wave.number].stories[story_id].status == "completed": SKIP (already done from previous resume) state.waves[wave.number].stories[story_id].status = "in_progress" state.waves[wave.number].stories[story_id].started_at = NOW # Spawn subagent for this story Task tool call: description: "EPIC:{epicId} Wave:{wave.number} Story:{story_id}" subagent_type: "aios-dev" prompt: | You are executing story {story_id} as part of epic {epicId}, Wave {wave.number}. ## Story File Read and implement: {storyBasePath}/{story.file} ## Development Cycle Follow the development-cycle workflow: 1. @po validates the story draft (read the story, verify acceptance criteria) 2. @{story.executor} implements the code changes 3. Self-healing: fix any lint/test/typecheck errors 4. @{story.quality_gate} reviews the implementation 5. @devops creates branch {story.branch} and pushes ## Epic Context - Epic: {epicId} {epic title from INDEX} - Wave: {wave.number} of {total_waves} "{wave.name}" - This story: {story.title} - Complexity: {story.complexity} - Key files: {story.key_files} ## Branch Create and work on branch: {story.branch} ## Output When done, report: - Status: completed or failed - Files changed - Tests added/passing - Branch pushed: yes/no # Wait for ALL parallel stories to complete # Collect results ELSE (sequential): # Execute stories one at a time FOR EACH story_id IN wave.stories (SEQUENTIAL): # Same spawning logic as above, but wait for each before starting next # ───────────────────────────────────────── # STEP 2: Update state with results # ───────────────────────────────────────── FOR EACH story_id IN wave.stories: IF story completed successfully: state.waves[wave.number].stories[story_id].status = "completed" state.waves[wave.number].stories[story_id].completed_at = NOW ELSE: state.waves[wave.number].stories[story_id].status = "failed" Log failure reason save_state() # Check if wave can proceed failed_stories = stories with status == "failed" IF failed_stories is not empty: Display: "WARNING: {count} stories failed in Wave {wave.number}:" FOR EACH failed: " - {story_id}: {reason}" "Options: retry failed stories or proceed to gate with partial results" ASK user: [Retry] [Proceed] [Abort] # ───────────────────────────────────────── # STEP 3: Wave Gate (integration review) # ───────────────────────────────────────── state.waves[wave.number].status = "gate_review" save_state() Display: "--- Wave {wave.number} Gate: Integration Review ---" "Agent: @{wave.gate.agent}" "Focus: {wave.gate.focus}" # Spawn gate agent for integration review Task tool call: description: "EPIC:{epicId} Wave:{wave.number} GATE" subagent_type: "aios-architect" # or whatever the gate agent is prompt: | You are reviewing Wave {wave.number} ("{wave.name}") of epic {epicId}. ## Stories Completed in This Wave {FOR EACH story in wave: story_id, title, branch, key_files} ## Gate Review Focus {wave.gate.focus} ## Review Checklist - [ ] Cross-story integration compatibility - [ ] No shared file conflicts between story branches - [ ] Combined test suite passes - [ ] No regressions from parallel changes - [ ] Architecture consistency across stories ## Merge Plan Order: {wave.merge.order} Conflict risk: {wave.merge.conflict_risk} Notes: {wave.merge.notes} ## Output Verdict: APPROVED or REJECTED If REJECTED: list specific issues to fix # Process gate result IF gate verdict == APPROVED: state.gate_verdicts[wave.number] = { status: "approved", agent: gate_agent, at: NOW } # Merge wave branches (delegate to @devops) Display: "Gate APPROVED. Merging branches..." "Merge order: {wave.merge.order}" Task tool call: description: "EPIC:{epicId} Wave:{wave.number} MERGE" subagent_type: "aios-devops" prompt: | Merge Wave {wave.number} branches to main in this order: {wave.merge.order} For each branch: 1. git merge {branch} --no-ff 2. Resolve conflicts if any (conflict risk: {wave.merge.conflict_risk}) 3. Run tests after merge 4. Tag: {wave.tag} ELSE (REJECTED): state.gate_verdicts[wave.number] = { status: "rejected", issues: gate_issues } Display rejection issues ASK user: [Fix and retry] [Override] [Abort] # ───────────────────────────────────────── # STEP 4: Wave Checkpoint # ───────────────────────────────────────── state.waves[wave.number].status = "completed" save_state() IF mode == "interactive": Display: "=== Wave {wave.number} Complete ===" "Stories: {completed}/{total}" "Gate: {verdict}" "Tag: {wave.tag}" "" "Next: Wave {wave.number + 1} — {next_wave.name}" "Stories: {next_wave.stories}" ASK user: [GO - Continue to next wave] [PAUSE - Save state, stop execution] [REVIEW - Show detailed wave summary] [ABORT - Stop the epic] ON GO: advance current_wave, execute next wave ON PAUSE: save state, STOP ON REVIEW: show detailed summary, then re-ask ON ABORT: set status=aborted, STOP ELSE IF mode == "yolo": # Auto-proceed to next wave advance current_wave execute next wave END PROCEDURE ``` --- ## Final Gate After all waves complete: ``` PROCEDURE final_gate(execution, state): Display: "=== FINAL GATE: Epic {epicId} ===" "Agent: @{execution.final_gate.agent}" # Spawn final gate agent Task tool call: description: "EPIC:{epicId} FINAL GATE" subagent_type: "aios-architect" prompt: | Epic-level sign-off for {epicId}. ## Focus {execution.final_gate.focus} ## Bug Verification Checklist {FOR EACH bug in execution.bug_verification: Bug {bug.bug}: {bug.description} Fixed by: {bug.fixed_by} Verify: {bug.verify} } ## All Waves {FOR EACH wave: number, name, stories, gate verdict} ## Output Verdict: APPROVED or REJECTED Bug verification: {checklist with pass/fail per bug} IF approved: state.status = "completed" Tag: {execution.final_gate.tag} # Optional: Retrospective IF execution.retrospective: Display: "Running retrospective..." Spawn @{execution.retrospective.agent} for retrospective save_state() Display final report. END PROCEDURE ``` --- ## State Persistence State is saved after EVERY significant action (wave start, story complete, gate verdict, checkpoint). ```yaml # .aios/epic-{epicId}-state.yaml epic_state: epicId: EPIC-ACT execution_plan: docs/stories/epics/epic-activation-pipeline/EPIC-ACT-EXECUTION.yaml mode: interactive started_at: "2026-02-06T10:00:00Z" updated_at: "2026-02-06T14:30:00Z" status: active # active | completed | aborted current_wave: 2 total_waves: 3 waves: 1: name: "Foundation Fixes" status: completed tag: wave-1-complete stories: ACT-1: { status: completed, branch: feat/act-1-greeting-config } ACT-2: { status: completed, branch: feat/act-2-user-profile-audit } ACT-3: { status: completed, branch: feat/act-3-status-loader-reliability } ACT-4: { status: completed, branch: feat/act-4-permission-mode } 2: name: "Unification" status: in_progress stories: ACT-6: { status: in_progress, branch: feat/act-6-unified-pipeline } 3: name: "Intelligence & Governance" status: pending stories: ACT-5: { status: pending } ACT-7: { status: pending } ACT-8: { status: pending } gate_verdicts: 1: { status: approved, agent: architect, at: "2026-02-06T12:00:00Z" } bug_verification: 1: { verified: true, by: ACT-1 } 2: { verified: false, pending: ACT-4 } ``` ### Resume Across Sessions The state file persists on disk. To resume in a new Claude Code session: ``` @pm *execute-epic docs/stories/epics/epic-activation-pipeline/EPIC-ACT-EXECUTION.yaml continue ``` The executor loads state, reads `current_wave` and story statuses, and picks up exactly where it left off. --- ## Integration with Existing Infrastructure ### development-cycle.yaml (inner loop) Each story spawns the full development-cycle: 1. `@po` validates story draft 2. `${story.executor}` develops (spawned in terminal) 3. `@dev` self-healing (CodeRabbit, conditional) 4. `${story.quality_gate}` reviews (agent != executor) 5. `@devops` pushes branch + PR 6. `@po` checkpoint (auto-GO in wave mode) ### epic-orchestration.yaml (template) Provides the generic wave pattern that this task instantiates with project-specific data from the EXECUTION.yaml. ### po-epic-context.md Used by @po during story validation to understand accumulated changes across the epic. ### Wave Executor (wave-executor.js) The JS engine can be used for programmatic wave execution if available. This task provides the AI-driven alternative that works without code changes. --- ## Output Format All actions produce structured output: - Epic header with progress - Current wave status - Story-level detail - Next command to run - Estimated remaining time (based on complexity ratings) --- ## Related Commands - `*create-epic` - Create a new epic (PM) - `*epic-context` - Show accumulated epic context (PO) - `*run-workflow development-cycle` - Run single story cycle - `*waves` - Analyze wave structure of a workflow - `*status` - General workflow status --- ## Agent Integration This task is owned by: - `@pm` (Morgan/Bob) - Primary orchestrator This task spawns: - `@po` (Pax) - Story validation, checkpoints - `@dev` (Dex) - Story implementation (via development-cycle) - `@architect` (Aria) - Wave gates, final gate - `@devops` (Gage) - Branch merge, push - `@qa` (Quinn) - Quality gates (via development-cycle) --- ## Change Log | Version | Date | Changes | |---------|------|---------| | 1.0.0 | 2026-02-06 | Initial implementation connects epic-orchestration + development-cycle |