UNPKG

aios-core

Version:

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

906 lines (712 loc) 23.7 kB
# {Task Name} **Task ID:** `{task-identifier}` **Version:** {X.Y.Z} **Status:** {Draft|Active|Deprecated} --- ## Purpose {Brief description of what this task does and when to use it} --- ## Execution Modes **Choose your execution mode** (if applicable for this task): ### 1. YOLO Mode - Fast, Autonomous (0-1 prompts) - Autonomous decision making with logging - Minimal user interaction - **Best for:** Experienced developers, simple tasks, time-sensitive work ### 2. Interactive Mode - Balanced, Educational (5-10 prompts) **[DEFAULT]** - Explicit decision checkpoints - Educational explanations - **Best for:** Learning, complex decisions, collaborative work ### 3. Pre-Flight Planning - Comprehensive Upfront Planning - Task analysis phase (identify all ambiguities) - Questionnaire before execution - Zero ambiguity execution - **Best for:** Ambiguous requirements, critical work, team consensus needed **Parameter:** `mode` (optional, default: `interactive`) **Valid values:** `yolo`, `interactive`, `preflight` **Note:** For simple, deterministic tasks (e.g., load config, validate schema), execution mode may not apply. Mode selection is most valuable for tasks involving creativity, decisions, or ambiguity. --- ## Task Definition (AIOS Task Format V1.0) ```yaml task: {taskIdentifier()} responsável: {AgentName} # Agent executing this task (e.g., Dex, Quinn, Pax) responsavel_type: Agente # Open-source: always "Agente" (Worker/Humano/Clone for services only) atomic_layer: {Layer} # Atom|Molecule|Organism|Template|Page|Config|Strategy|Content|Media|Layout|Analysis (optional for open-source) **Entrada:** - campo: {fieldName} tipo: {type} # string | number | boolean | array<type> | object { key: type } origem: {source} # Step X ({stepName}) | User Input | config | {agent-id} output obrigatório: {true|false} padrão: {defaultValue} # Optional: default if not provided validação: {validationRule} # Optional: validation logic - campo: {fieldName2} tipo: {type} origem: {source} obrigatório: {true|false} **Saída:** - campo: {fieldName} tipo: {type} destino: {destination} # Step Y ({stepName}) | state | output | multiple steps persistido: {true|false} # Saved to file/DB or memory-only cache_key: {key} # Optional: if cacheable - campo: {fieldName2} tipo: {type} destino: {destination} persistido: {true|false} ``` --- ## Pre-Conditions **Purpose:** Validate prerequisites BEFORE task execution (blocking) **Checklist:** ```yaml pre-conditions: - [ ] {condition_description} tipo: pre-condition blocker: true validação: | {executable_validation_logic} error_message: "{message_if_fails}" - [ ] {condition_description_2} tipo: pre-condition blocker: true validação: "{simple_check}" error_message: "{message}" ``` **Examples:** ```yaml pre-conditions: - [ ] Input file exists and is readable tipo: pre-condition blocker: true validação: | const fs = require('fs'); if (!fs.existsSync(inputPath)) { throw new Error(`File not found: ${inputPath}`); } error_message: "Required input file not found" - [ ] Agent has required tools available tipo: pre-condition blocker: true validação: "expect(agent.tools).toContain('tool-name')" error_message: "Agent missing required tool: tool-name" ``` --- ## Workflow ### Mode: YOLO (Autonomous) **Execution:** 1. Read task definition 2. Validate pre-conditions automatically 3. Execute workflow with autonomous decisions 4. Log all decisions to `.ai/decision-log-{task-id}.md` 5. Validate post-conditions automatically 6. Return standardized output **Decision Logging:** ```markdown ## Decision: {Title} **Context:** {What problem} **Options:** [{Option A}, {Option B}] **Selected:** {Option} **Rationale:** {Why} **Timestamp:** {ISO 8601} ``` **User Prompts:** 0-1 (only if blocking issue) --- ### Mode: Interactive (Balanced) **[DEFAULT]** **Execution:** 1. Read task definition 2. Present summary to user 3. Validate pre-conditions with user 4. Execute workflow with decision checkpoints 5. Prompt user at each decision point 6. Explain options and trade-offs 7. Validate post-conditions with user 8. Return standardized output **Decision Checkpoints:** - {Decision point 1 description} - {Decision point 2 description} - {Decision point 3 description} **Educational Explanations:** - Before decision: Explain options and trade-offs - After decision: Explain why it's a good fit - During execution: Explain what's happening and why **User Prompts:** 5-10 --- ### Mode: Pre-Flight Planning (Comprehensive) **Execution:** 1. **Analysis Phase:** - Read task definition completely - Identify ALL ambiguities and decision points - Generate comprehensive questionnaire 2. **Questionnaire Phase:** - Present all questions to user at once - Collect all responses in batch - Create detailed execution plan 3. **Approval Phase:** - Present execution plan to user - Wait for user confirmation - Proceed only after approval 4. **Zero-Ambiguity Execution:** - Execute with full context from questionnaire - No additional decision points - Validate all conditions - Return standardized output **User Prompts:** All upfront (questionnaire), then 0 during execution --- ## Step-by-Step Execution ### Step 1: {Step Name} **Purpose:** {What this step accomplishes} **Actions:** 1. {Action 1} 2. {Action 2} 3. {Action 3} **Validation:** - {Validation check 1} - {Validation check 2} **Personality Injection (if applicable):** ```javascript // Use agent's vocabulary and tone const verb = selectFromVocabulary(agent.persona_profile.communication.vocabulary); const statusMessage = generatePersonalizedStatus(agent.persona_profile.communication.tone, verb, result); ``` **Example status messages by archetype:** - **Builder (Dex):** "✅ Implementei com sucesso. {detail}." - **Guardian (Quinn):** "✅ Validado rigorosamente. {detail}." - **Balancer (Pax):** "✅ Equilibrei todas as dependências. {detail}." --- ### Step 2: {Step Name} {Continue with additional steps...} --- ## Post-Conditions **Purpose:** Validate outputs AFTER task execution (blocking) **Checklist:** ```yaml post-conditions: - [ ] {condition_description} tipo: post-condition blocker: true validação: | {executable_validation_logic} rollback: {true|false} # Rollback changes if fails? - [ ] {condition_description_2} tipo: post-condition blocker: true validação: "{simple_check}" rollback: false ``` **Examples:** ```yaml post-conditions: - [ ] Output matches expected schema tipo: post-condition blocker: true validação: | const schema = loadSchema('output-schema.json'); const valid = validateAgainstSchema(output, schema); if (!valid) throw new Error("Schema validation failed"); rollback: false - [ ] All required fields present in output tipo: post-condition blocker: true validação: | expect(output.field1).toBeDefined(); expect(output.field2).toBeDefined(); rollback: false ``` --- ## Acceptance Criteria **Purpose:** Validate story requirements AFTER workflow (non-blocking, can be manual) **Checklist:** ```yaml acceptance-criteria: - [ ] {criterion_description} tipo: acceptance blocker: false # Non-blocking story: {STORY-XXX} manual_check: {true|false} test: {test_file_path} # If automated - [ ] {criterion_description_2} tipo: acceptance blocker: false story: {STORY-XXX} manual_check: true ``` **Examples:** ```yaml acceptance-criteria: - [ ] Output is user-friendly and easy to understand tipo: acceptance blocker: false story: STORY-6.1.2 manual_check: false test: "tests/user-experience/output-clarity.test.js" - [ ] Agent personality is recognizable in output tipo: acceptance blocker: false story: STORY-6.1.2 manual_check: true ``` --- ## Template (Optional) **Purpose:** Reference template files for input/output schemas, prompts, or UI forms ```yaml **Template:** - path: {relativePath} type: {input|output|prompt|ui|script} version: {X.Y.Z} variables: [{var1}, {var2}, {var3}] schema: {schemaPath} # Optional: JSON Schema reference ``` **Examples:** ```yaml **Template:** - path: .aios-core/product/templates/task-execution-report.md type: output version: 1.0 variables: [agent_name, task_name, duration, tokens, status_message] schema: schemas/task-execution-report.schema.json - path: .aios-core/product/templates/story-tmpl.yaml type: input version: 2.1 variables: [story_id, title, description, acceptance_criteria] ``` --- ## Tools (External/Shared) **Purpose:** Catalog reusable tools used by multiple agents **Definition:** Tools are external systems (MCPs, APIs, CLIs) or reusable scripts shared across agents. ```yaml **Tools:** - {tool_name}: version: {X.Y.Z} used_for: {description} shared_with: [{agent1}, {agent2}, {agent3}] cost: ${Y} per call # Optional: for cost tracking cacheable: {true|false} # Optional ``` **Examples:** ```yaml **Tools:** - mcp-clickup: version: 2.0 used_for: Task management integration shared_with: [pm, po, sm] cost: $0 - context7: version: 1.0 used_for: Documentation lookup during development shared_with: [dev, architect] cost: $0.001 per query cacheable: true - exa: version: 1.0 used_for: Web search for research and validation shared_with: [analyst, architect, qa] cost: $0.008 per search cacheable: false ``` --- ## Scripts (Agent-Specific) **Purpose:** Reference custom scripts specific to this agent/task **Definition:** Scripts are code files that are NOT reusable across agents (agent-specific logic). ```yaml **Scripts:** - {script_path}: description: {what_it_does} language: {javascript|python|bash|etc} version: {X.Y.Z} # Optional ``` **Examples:** ```yaml **Scripts:** - .aios-core/scripts/dev-specific/test-runner.js: description: Runs tests with coverage reporting specific to dev agent language: javascript version: 1.2.0 - .aios-core/scripts/qa-specific/regression-validator.js: description: QA-specific regression validation logic language: javascript version: 2.0.0 ``` --- ## Performance Metrics **Purpose:** Document expected performance for optimization ```yaml **Performance:** - duration_expected: {X}ms - cost_estimated: ${Y} # For AI executors (token costs) - cacheable: {true|false} - cache_key: {identifier} # If cacheable - parallelizable: {true|false} - parallel_with: [{task1}, {task2}] # If parallelizable - skippable_when: [{condition1}, {condition2}] # Optional: skip conditions ``` **Examples:** ```yaml # AI-heavy task (expensive, slow) **Performance:** - duration_expected: 4000ms - cost_estimated: $0.0025 - cacheable: false - parallelizable: false # Config load (fast, cacheable) **Performance:** - duration_expected: 100ms - cost_estimated: $0 - cacheable: true - cache_key: config_${format_id}_${brand_id} - parallelizable: true - parallel_with: [loadBrand] # Conditional execution **Performance:** - duration_expected: 2000ms - cost_estimated: $0.001 - cacheable: false - parallelizable: false - skippable_when: [ready_copy=true, template_id=provided] ``` --- ## Error Handling **Purpose:** Define error handling strategy for resilience ```yaml **Error Handling:** - strategy: {retry|fallback|abort} - fallback: {description_or_value} # If strategy=fallback - retry: max_attempts: {N} backoff: {linear|exponential} backoff_ms: {initial_delay} - abort_workflow: {true|false} - notification: {log|email|slack|etc} ``` **Error Strategies:** | Strategy | When to Use | Example | |----------|-------------|---------| | **retry** | Transient errors (API timeout, rate limit) | AI call failed with 429 | | **fallback** | Recoverable errors (AI failed, use default) | Template not found use default | | **abort** | Critical errors (invalid input, missing dependency) | Required file not found abort | **Fallback Plans:** ### Missing Input ```yaml **Error Handling:** - strategy: fallback - fallback: | If user input missing: 1. Check for default values in config 2. Prompt user for missing input 3. If still missing, use task default values - retry: max_attempts: 1 backoff: linear backoff_ms: 0 - abort_workflow: false - notification: log ``` ### Missing Template ```yaml **Error Handling:** - strategy: fallback - fallback: | If template not found: 1. Check alternative template paths 2. Use generic template from .aios-core/product/templates/ 3. If no generic template, create minimal output structure - retry: max_attempts: 2 backoff: linear backoff_ms: 100 - abort_workflow: false - notification: log + warn_user ``` ### Missing Tool ```yaml **Error Handling:** - strategy: abort - fallback: N/A (tool required for task) - retry: max_attempts: 1 backoff: linear backoff_ms: 0 - abort_workflow: true - notification: log + error_user - error_message: | {PERSONALITY_SLOT: agent_name} needs tool '{tool_name}' to complete this task. **Examples:** - Dex: "⚠️ Não consigo implementar sem a tool 'mcp-supabase'. Preciso dela pra continuar." - Quinn: "⚠️ Ferramenta 'coderabbit' ausente. Não posso validar sem ela. Bloqueando task." ``` ### Missing Data ```yaml **Error Handling:** - strategy: fallback - fallback: | If data file not found: 1. Check alternative data sources (.aios-core/data/) 2. Prompt user for manual data entry 3. Use minimal default data structure - retry: max_attempts: 1 backoff: linear backoff_ms: 0 - abort_workflow: false - notification: log + warn_user ``` ### Checklist Failure ```yaml **Error Handling:** - strategy: retry - fallback: Rollback to previous state if retry fails - retry: max_attempts: 3 backoff: exponential backoff_ms: 500 - abort_workflow: {depends_on_blocker_flag} # true if blocker=true - notification: log + error_user - error_message: | {PERSONALITY_SLOT: agent_name} detected validation failure: - Failed check: {failed_check_description} - Error: {validation_error_message} **Examples:** - Dex: "⚠️ Build falhou. Tentando novamente com cleanup antes..." - Quinn: "⚠️ Post-condition falhou: output schema inválido. Bloqueando execução." ``` **Personalized Error Messages:** ```javascript function generateErrorMessage(agent, errorType, errorDetails) { const { archetype, tone, vocabulary } = agent.persona_profile.communication; const templates = { Builder: "⚠️ {verb} falhou. Vou debugar e reconstruir.", Guardian: "⚠️ Validação falhou. Bloqueando até resolução.", Balancer: "⚠️ Conflito detectado. Vou mediar e encontrar solução.", Visionary: "⚠️ Planejamento interrompido. Preciso revisar estratégia.", }; return templates[archetype] || "⚠️ Erro detectado. Aplicando fallback."; } ``` --- ## Metadata **Purpose:** Link task to stories, versions, dependencies for traceability ```yaml **Metadata:** - story: {STORY-XXX} - version: {X.Y.Z} - dependencies: [{task1}, {task2}] # Other tasks this depends on - breaking_changes: [{change1}, {change2}] # If version is breaking - author: {name} - created_at: {YYYY-MM-DD} - updated_at: {YYYY-MM-DD} ``` **Example:** ```yaml **Metadata:** - story: STORY-6.1.2 - version: 2.0.0 - dependencies: [loadAgentPersona, validateVocabulary] - breaking_changes: - Output format changed: added persona_profile section - Removed generic status messages - author: Roundtable (Pedro, Brad, Seth, Dan) - created_at: 2025-01-14 - updated_at: 2025-01-14 ``` --- ## Output Format (Standardized) **CRITICAL:** All task outputs MUST follow this structure (see `AGENT-PERSONALIZATION-STANDARD-V1.md`): ```markdown ## 📊 Task Execution Report **Agent:** {agent.name} ({agent.persona_profile.archetype}) **Task:** {task.name} **Mode:** {execution_mode} # yolo | interactive | preflight **Started:** {timestamp.start} **Completed:** {timestamp.end} **Duration:** {duration} ALWAYS LINE 7 (familiaridade) **Tokens Used:** {tokens.total} total ALWAYS LINE 8 (familiaridade) --- ### Status {status_icon} {PERSONALIZED_STATUS_MESSAGE} PERSONALITY SLOT **Examples:** - Dex: "✅ Implementei com sucesso. 3 componentes criados." - Quinn: "✅ Validado rigorosamente. 47 edge cases testados." - Pax: "✅ Equilibrei as dependências. Tudo alinhado." ### Output {task_specific_content} ### Metrics ← ALWAYS LAST SECTION (familiaridade) - Tests: {tests.passed}/{tests.total} - Coverage: {coverage}% - Linting: {lint.status} - Pre-conditions: {pre.passed}/{pre.total} - Post-conditions: {post.passed}/{post.total} - {task_specific_metric}: {value} --- {agent.persona_profile.signature_closing} PERSONALITY SLOT ``` **Personality Injection Points:** 1. Status message (use agent vocabulary) 2. Signature closing (agent signature) 3. Emoji selection (from archetype palette) **Fixed Positions (NEVER change):** 1. Section order: Header Status Output Metrics 2. Duration (line 7) 3. Tokens (line 8) 4. Metrics (always last section) --- ## Testing ### Unit Test Template ```javascript // tests/tasks/{task-name}.test.js describe('{Task Name}', () => { describe('Pre-conditions', () => { it('should validate all pre-conditions', () => { const result = validatePreConditions(task, inputs); expect(result.allPassed).toBe(true); }); it('should block execution if pre-condition fails', () => { const invalidInputs = { ...inputs, requiredField: null }; expect(() => executeTask(task, invalidInputs)).toThrow(); }); }); describe('Execution', () => { it('should execute in YOLO mode autonomously', () => { const result = executeTask(task, inputs, { mode: 'yolo' }); expect(result.status).toBe('success'); expect(result.decisionLog).toBeDefined(); }); it('should execute in Interactive mode with prompts', () => { const result = executeTask(task, inputs, { mode: 'interactive' }); expect(result.userPrompts.length).toBeGreaterThan(0); }); it('should execute in Pre-Flight mode with questionnaire', () => { const result = executeTask(task, inputs, { mode: 'preflight' }); expect(result.questionnaire).toBeDefined(); expect(result.executionPlan).toBeDefined(); }); }); describe('Post-conditions', () => { it('should validate all post-conditions', () => { const result = executeTask(task, inputs); const validation = validatePostConditions(task, result.output); expect(validation.allPassed).toBe(true); }); it('should rollback if post-condition fails and rollback=true', () => { // Mock failure const result = executeTaskWithMockedFailure(task); expect(result.rolledBack).toBe(true); }); }); describe('Output', () => { it('should generate standardized output', () => { const result = executeTask(task, inputs); // Validate fixed structure expect(result.output).toContain('## 📊 Task Execution Report'); expect(result.output).toContain('**Duration:**'); expect(result.output).toContain('**Tokens Used:**'); expect(result.output).toContain('### Status'); expect(result.output).toContain('### Metrics'); }); it('should inject agent personality', () => { const agent = loadAgent('dev'); const result = executeTask(task, inputs, { agent }); expect(result.output).toContain(agent.persona_profile.signature_closing); const hasVocabularyWord = agent.persona_profile.communication.vocabulary .some(word => result.statusMessage.includes(word)); expect(hasVocabularyWord).toBe(true); }); }); describe('Error Handling', () => { it('should retry on transient errors', () => { const mockedError = new Error('Transient error'); const result = executeTaskWithMockedError(task, mockedError, { strategy: 'retry' }); expect(result.retryCount).toBeGreaterThan(0); expect(result.status).toBe('success'); }); it('should fallback on recoverable errors', () => { const result = executeTaskWithMissingTemplate(task); expect(result.usedFallback).toBe(true); expect(result.status).toBe('success'); }); it('should abort on critical errors', () => { const result = executeTaskWithMissingRequiredInput(task); expect(result.status).toBe('aborted'); expect(result.workflowAborted).toBe(true); }); }); describe('Performance', () => { it('should complete within expected duration', async () => { const start = Date.now(); await executeTask(task, inputs); const duration = Date.now() - start; expect(duration).toBeLessThan(task.performance.duration_expected * 1.5); }); it('should use cache when available', () => { const result1 = executeTask(task, inputs); const result2 = executeTask(task, inputs); // Should use cache if (task.performance.cacheable) { expect(result2.usedCache).toBe(true); } }); }); }); ``` --- ## Examples ### Example 1: Simple Deterministic Task (No Mode Selection) **Task:** Load configuration file ```yaml task: loadConfig() responsável: System Loader responsavel_type: Agente atomic_layer: Config **Entrada:** - campo: config_path tipo: string origem: User Input obrigatório: true **Saída:** - campo: config tipo: object destino: state persistido: false **Performance:** - duration_expected: 50ms - cost_estimated: $0 - cacheable: true **Note:** Execution mode not applicable (deterministic, no decisions) ``` --- ### Example 2: Complex Creative Task (Mode Selection Applicable) **Task:** Design UI Component ```yaml task: designComponent() responsável: Uma (Empathizer) responsavel_type: Agente atomic_layer: Molecule **Entrada:** - campo: componentSpec tipo: object origem: User Input obrigatório: true **Saída:** - campo: componentDesign tipo: object destino: state persistido: true **Performance:** - duration_expected: 4000ms - cost_estimated: $0.0025 - cacheable: false **Execution Modes:** - YOLO: Auto-generate based on best practices - Interactive: Ask user for design preferences at 5 decision points - Pre-Flight: Complete questionnaire about brand, audience, goals before designing **Note:** Mode selection highly valuable (creative, subjective decisions) ``` --- ## Notes - **CRITICAL:** Follow AIOS Task Format Specification V1.0 exactly - **CRITICAL:** All outputs use standardized template (familiaridade = produtividade) - **CRITICAL:** Track duration and tokens for all executions - **CRITICAL:** Use agent's vocabulary and tone consistently - See `.aios-core/docs/standards/TASK-FORMAT-SPECIFICATION-V1.md` for complete spec - See `.aios-core/docs/standards/AGENT-PERSONALIZATION-STANDARD-V1.md` for personality guidelines --- **Template Version:** 2.0 **Last Updated:** 2025-01-14 **Applies to:** All tasks with AIOS Task Format V1.0 + Personalized Agents (Story 6.1.2+) **Breaking Changes:** Yes (from v1.0 - added execution modes, restructured checklist)