aios-core
Version:
Synkra AIOS: AI-Orchestrated System for Full Stack Development - Core Framework
1,415 lines (1,121 loc) • 34.5 kB
Markdown
# AIOS Task Format Specification V1.0
**Date:** 2025-11-13
**Version:** 1.0.0
**Status:** Standard
**Author:** Brad Frost Cognitive Clone
## Purpose
This document defines the UNIVERSAL format for AIOS Tasks, ensuring consistency, scalability, and reusability across workflows, executors, and teams.
## Task Format Overview
Every AIOS Task MUST follow this structure:
```yaml
#### Step X: [Task Name]
task: taskIdentifier()
responsável: [Role or Service Name]
responsavel_type: Agente | Worker | Humano | Clone
atomic_layer: [Atom | Molecule | Organism | Template | Page | Config | Strategy | Content | Media | Layout | Analysis]
**Entrada:**
- campo: [name]
tipo: [type]
origem: [source step]
obrigatório: [true|false]
padrão: [default value] (optional)
**Saída:**
- campo: [name]
tipo: [type]
destino: [destination step(s)]
persistido: [true|false]
**Checklist:**
pre-conditions:
- [ ] [condition description]
tipo: pre-condition
blocker: [true|false]
validação: [validation logic or test path]
post-conditions:
- [ ] [condition description]
tipo: post-condition
blocker: [true|false]
validação: [validation logic or test path]
acceptance-criteria:
- [ ] [acceptance description]
tipo: acceptance
blocker: [false]
story: [STORY-XXX]
manual_check: [true|false]
**Template:** (optional)
- path: [relative path to template file]
- type: [input|output|prompt|ui|script]
- version: [X.Y.Z]
- variables: [array of variable names]
**Tools:** (optional)
- [tool_name]:
version: [X.Y.Z]
used_for: [description]
shared_with: [array of step IDs]
**Scripts:** (optional)
- [script_path]:
description: [what it does]
language: [javascript|python|bash|etc]
**Performance:**
- duration_expected: [X]ms
- cost_estimated: $[Y] (for AI executors)
- cacheable: [true|false]
- cache_key: [cache identifier] (if cacheable)
- parallelizable: [true|false]
- parallel_with: [array of step IDs] (if parallelizable)
- skippable_when: [array of conditions]
**Error Handling:**
- strategy: [retry|fallback|abort]
- fallback: [description or default value] (if strategy=fallback)
- retry:
max_attempts: [N]
backoff: [linear|exponential]
backoff_ms: [initial backoff in milliseconds]
- abort_workflow: [true|false]
- notification: [log|email|slack|etc]
**Metadata:**
- story: [STORY-XXX]
- version: [X.Y.Z]
- dependencies: [array of step IDs]
- breaking_changes: [array of changes from previous version]
- author: [name]
- created_at: [YYYY-MM-DD]
- updated_at: [YYYY-MM-DD]
```
## Field Definitions
### Required Fields
#### 1. `task`
**Type:** `string` (function name)
**Required:** ✅ Yes
**Format:** `camelCase()` with parentheses
**Purpose:** Unique identifier for the task function.
**Validation:**
- Must be unique across workflow
- Must be valid JavaScript function name
- Must end with `()`
**Examples:**
```yaml
task: loadFormatConfig()
task: analyzeBrief()
task: designCTAComponent()
```
#### 2. `responsável`
**Type:** `string`
**Required:** ✅ Yes
**Format:** Free text (role or service name)
**Purpose:** Human-readable name of the responsible entity.
**Examples:**
```yaml
responsável: Creative Director
responsável: format-loader.js
responsável: OpenRouter Vision Model
responsável: Brad Frost Clone
```
#### 3. `responsavel_type`
**Type:** `enum`
**Required:** ✅ Yes
**Values:** `Agente | Worker | Humano | Clone`
**Purpose:** Defines the executor type for orchestration, cost tracking, and error handling.
**Validation:**
- Must be one of the 4 allowed values
- Determines execution environment
**Decision Tree:** See `EXECUTOR-DECISION-TREE.md`
**Examples:**
```yaml
responsavel_type: Agente # AI-powered execution
responsavel_type: Worker # Script-based execution
responsavel_type: Humano # Manual human execution
responsavel_type: Clone # Mind emulation with heuristics
```
#### 4. `atomic_layer`
**Type:** `enum`
**Required:** ✅ Yes (for design-related tasks), ⚠️ Optional (for config/strategy)
**Values:**
- **Atomic Design:** `Atom | Molecule | Organism | Template | Page`
- **Other Layers:** `Config | Strategy | Content | Media | Layout | Analysis`
**Purpose:** Maps task to Atomic Design layer for architecture validation.
**Validation:**
- Design tasks MUST specify Atomic Design layer
- Non-design tasks SHOULD specify functional layer
**Examples:**
```yaml
atomic_layer: Atom # Step 7a: Design CTA (single component)
atomic_layer: Molecule # Step 8a: Compose Text Group (title + body + cta)
atomic_layer: Organism # Step 8c: Content Area (complete section)
atomic_layer: Template # Step 13: Render HTML (structure)
atomic_layer: Page # Step 14: Export PNG (final instance)
atomic_layer: Config # Step 1: Load Format Config
atomic_layer: Strategy # Step 3: Analyze Brief
```
#### 5. `Entrada` (Inputs)
**Type:** `array of objects`
**Required:** ✅ Yes (can be empty array if no inputs)
**Purpose:** Defines all inputs required by the task, with types, sources, and constraints.
**Structure:**
```yaml
**Entrada:**
- campo: [field name]
tipo: [type definition]
origem: [source step or config]
obrigatório: [true|false]
padrão: [default value] (optional)
validação: [validation rule] (optional)
```
**Field Details:**
| Sub-field | Type | Required | Description |
|-----------|------|----------|-------------|
| `campo` | string | ✅ Yes | Field name (camelCase) |
| `tipo` | string | ✅ Yes | Type definition (see Type System below) |
| `origem` | string | ✅ Yes | Source step ID or "config" or "user input" |
| `obrigatório` | boolean | ✅ Yes | Whether field is required |
| `padrão` | any | ⚠️ Optional | Default value if not provided |
| `validação` | string | ⚠️ Optional | Validation rule or JSON Schema reference |
**Examples:**
```yaml
**Entrada:**
- campo: adCopy
tipo: object { title: string, body: string, cta: string }
origem: Step 5 (craftCopy)
obrigatório: true
validação: |
title.length >= 1 && title.length <= 100
body.length >= 1 && body.length <= 500
cta.length >= 1 && cta.length <= 30
- campo: brand
tipo: object (Brand schema)
origem: Step 2 (loadBrand)
obrigatório: true
- campo: ready_copy
tipo: object { title?, body?, cta? } | null
origem: User Input (config)
obrigatório: false
padrão: null
```
#### 6. `Saída` (Outputs)
**Type:** `array of objects`
**Required:** ✅ Yes (can be empty array if no outputs)
**Purpose:** Defines all outputs produced by the task, with types, destinations, and persistence.
**Structure:**
```yaml
**Saída:**
- campo: [field name]
tipo: [type definition]
destino: [destination step(s) or state]
persistido: [true|false]
cache_key: [key] (if cacheable)
```
**Field Details:**
| Sub-field | Type | Required | Description |
|-----------|------|----------|-------------|
| `campo` | string | ✅ Yes | Field name (camelCase) |
| `tipo` | string | ✅ Yes | Type definition |
| `destino` | string or array | ✅ Yes | Destination step(s) or "state" or "output" |
| `persistido` | boolean | ✅ Yes | Whether saved to ad-spec.json or DB |
| `cache_key` | string | ⚠️ Optional | Cache key if output is cacheable |
**Examples:**
```yaml
**Saída:**
- campo: formatConfig
tipo: object { formatId, canvas, safeZones, contentArea }
destino: [Step 8, Step 10, Step 11, Step 12, Step 13, Step 14]
persistido: false # Kept in memory only
- campo: adAnalysis
tipo: object { goal, targetAudience, urgencyLevel, emotionalTriggers }
destino: state (ad-spec.json)
persistido: true
- campo: designTokens
tipo: object { spacing, typography, colors, radius, shadows }
destino: Step 13 (renderHTML)
persistido: false
cache_key: format_${formatConfig.formatId}_${formatConfig.orientation}
```
### Optional Fields
#### 7. `Checklist`
**Type:** `object with arrays`
**Required:** ⚠️ Recommended
**Purpose:** Defines validations (pre-conditions, post-conditions, acceptance criteria) for automated and manual testing.
**Structure:**
```yaml
**Checklist:**
pre-conditions:
- [ ] [description]
tipo: pre-condition
blocker: [true|false]
validação: [logic or test path]
error_message: [message if fails]
post-conditions:
- [ ] [description]
tipo: post-condition
blocker: [true|false]
validação: [logic or test path]
rollback: [true|false]
acceptance-criteria:
- [ ] [description]
tipo: acceptance
blocker: false
story: [STORY-XXX]
manual_check: [true|false]
test: [test file path]
```
**Checklist Types:**
1. **Pre-conditions** (Run BEFORE task)
- Validate inputs exist and are valid
- Check dependencies are met
- Verify environment is ready
- **Blocking:** Task aborts if pre-condition fails
2. **Post-conditions** (Run AFTER task)
- Validate outputs match schema
- Check business rules
- Verify no side effects
- **Blocking:** Task rolls back if post-condition fails
3. **Acceptance Criteria** (Run AFTER workflow)
- Validate Story requirements
- Can be manual (human review)
- Can be automated (integration tests)
- **Non-blocking:** Log failure, continue workflow
**Examples:**
```yaml
**Checklist:**
pre-conditions:
- [ ] brand.typography exists and is valid
tipo: pre-condition
blocker: true
validação: |
if (!brand.typography || !brand.typography.primaryFont) {
throw new Error("Brand typography not loaded");
}
error_message: "Brand typography missing or invalid"
- [ ] adCopy.title is not empty
tipo: pre-condition
blocker: true
validação: "expect(adCopy.title).toBeTruthy()"
error_message: "Copy title is required"
post-conditions:
- [ ] typography.title.htmlContent is valid HTML
tipo: post-condition
blocker: true
validação: |
const isValid = await validateHTML(typography.title.htmlContent);
if (!isValid) throw new Error("Invalid HTML");
rollback: false
- [ ] All required transformations applied
tipo: post-condition
blocker: true
validação: |
expect(typography.title.transformations).toBeInstanceOf(Array);
expect(typography.title.transformations.length).toBeGreaterThan(0);
rollback: false
acceptance-criteria:
- [ ] Typography matches brand voice (bold, uppercase for urgent CTAs)
tipo: acceptance
blocker: false
story: STORY-006
manual_check: false
test: "tests/typography-brand-voice.test.js"
- [ ] Transformations are visually appealing
tipo: acceptance
blocker: false
story: STORY-006
manual_check: true
```
#### 8. `Template`
**Type:** `object`
**Required:** ⚠️ Optional (but recommended for Agente executors)
**Purpose:** References template files that define input/output schemas, prompts, or UI forms.
**Structure:**
```yaml
**Template:**
- path: [relative path]
type: [input|output|prompt|ui|script]
version: [X.Y.Z]
variables: [array of variable names used in template]
schema: [JSON Schema reference] (optional)
```
**Template Types:**
| Type | Purpose | Example |
|------|---------|---------|
| `input` | Validates input schema | `templates/input-schemas/analyze-brief.json` |
| `output` | Validates output schema | `templates/output-schemas/analyze-brief.json` |
| `prompt` | AI agent prompt structure | `Squads/.../analyze-ad-brief.md` |
| `ui` | Human interface form | `templates/ui-forms/manual-approval.html` |
| `script` | Worker script template | `templates/scripts/image-processor.sh` |
**Examples:**
```yaml
# Agente executor with prompt template
**Template:**
- path: Squads/instagram-content-creator/tasks/ads/analyze-ad-brief.md
type: prompt
version: 2.1.0
variables: [brief_text, brand_id, campaign_goal, ready_copy]
schema: Squads/instagram-content-creator/schemas/analyze-brief-output.json
# Worker executor with script template
**Template:**
- path: scripts/utils/format-loader.js
type: script
version: 1.0.0
variables: [format_id, orientation]
# Humano executor with UI form
**Template:**
- path: templates/ui-forms/manual-review-ad-quality.html
type: ui
version: 1.0.0
variables: [ad_preview_url, quality_criteria]
```
#### 9. `Tools`
**Type:** `object`
**Required:** ⚠️ Recommended (to document reusability)
**Purpose:** Catalogs reusable tools/functions used by the task, enabling:
- **Reusability tracking** (which tasks share tools)
- **Versioning** (tool updates affect which tasks)
- **Cost tracking** (tool API costs)
**Structure:**
```yaml
**Tools:**
- [tool_name]:
version: [X.Y.Z]
used_for: [description]
shared_with: [array of step IDs or "global"]
cost: $[Y] per call (optional)
cacheable: [true|false] (optional)
```
**Examples:**
```yaml
**Tools:**
- callAgent:
version: 1.0.0
used_for: AIOS agent caller with retry logic
shared_with: [Step 3, Step 4, Step 5, Step 6, Step 7, Step 8, Step 9, Step 11]
cost: varies by agent
- validateHTML:
version: 2.1.0
used_for: HTML validation using htmlhint
shared_with: [Step 6, Step 13]
- detectFaces:
version: 1.0.0
used_for: Face detection via OpenRouter Gemini 2.5 Flash
shared_with: [Step 10]
cost: $0.002 per image
- validateContrast:
version: 1.0.0
used_for: WCAG AA color contrast validation
shared_with: [Step 2, Step 7]
```
#### 10. `Scripts`
**Type:** `object`
**Required:** ⚠️ Optional (for Worker executors primarily)
**Purpose:** References custom scripts executed by the task.
**Structure:**
```yaml
**Scripts:**
- [script_path]:
description: [what it does]
language: [javascript|python|bash|etc]
version: [X.Y.Z] (optional)
```
**Examples:**
```yaml
**Scripts:**
- scripts/utils/format-loader.js:
description: Loads format configuration from JSON file
language: javascript
version: 1.0.0
- scripts/utils/face-detection.js:
description: Wrapper for OpenRouter face detection API
language: javascript
version: 1.2.0
- scripts/export/puppeteer-renderer.js:
description: Renders HTML to PNG using Puppeteer
language: javascript
version: 2.0.0
```
#### 11. `Performance`
**Type:** `object`
**Required:** ⚠️ Recommended (for optimization)
**Purpose:** Documents expected performance metrics and optimization opportunities.
**Structure:**
```yaml
**Performance:**
- duration_expected: [X]ms
- cost_estimated: $[Y] (for AI)
- cacheable: [true|false]
- cache_key: [identifier] (if cacheable)
- parallelizable: [true|false]
- parallel_with: [array of step IDs]
- skippable_when: [array of conditions]
```
**Examples:**
```yaml
# AI task (expensive, slow, not cacheable)
**Performance:**
- duration_expected: 3500ms
- cost_estimated: $0.0015
- cacheable: false
- parallelizable: false
# Config load (fast, cacheable)
**Performance:**
- duration_expected: 100ms
- cost_estimated: $0
- cacheable: true
- cache_key: format_${format_id}_${orientation}
- parallelizable: false
# Image selection (can run in parallel with template selection)
**Performance:**
- duration_expected: 2500ms
- cost_estimated: $0.001
- cacheable: false
- parallelizable: true
- parallel_with: [Step 4]
# Brief analysis (skippable in ready_copy mode)
**Performance:**
- duration_expected: 4000ms
- cost_estimated: $0.0025
- cacheable: false
- parallelizable: false
- skippable_when: [ready_copy=true]
```
#### 12. `Error Handling`
**Type:** `object`
**Required:** ⚠️ Recommended (for robustness)
**Purpose:** Defines error handling strategy for resilience.
**Structure:**
```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]
```
**Strategies:**
| Strategy | When to Use | Example |
|----------|-------------|---------|
| `retry` | Transient errors (API timeout, rate limit) | AI agent call failed with 429 |
| `fallback` | Recoverable errors (AI failed, use default) | Template selection → fallback to default |
| `abort` | Critical errors (invalid brand_id, missing template) | Brand not found → abort workflow |
**Examples:**
```yaml
# AI task with retry + fallback
**Error Handling:**
- strategy: fallback
- fallback: |
If AI fails, use config.ready_copy as analysis.
If ready_copy not available, use default analysis:
{ goal: "conversion", urgencyLevel: "medium", targetAudience: "general" }
- retry:
max_attempts: 3
backoff: exponential
backoff_ms: 1000
- abort_workflow: false
- notification: log
# Config load (critical - abort on failure)
**Error Handling:**
- strategy: abort
- retry:
max_attempts: 2
backoff: linear
backoff_ms: 500
- abort_workflow: true
- notification: email + slack
```
#### 13. `Metadata`
**Type:** `object`
**Required:** ⚠️ Recommended (for traceability)
**Purpose:** Links task to Stories, versions, and dependencies for project management.
**Structure:**
```yaml
**Metadata:**
- story: [STORY-XXX]
- version: [X.Y.Z]
- dependencies: [array of step IDs]
- breaking_changes: [array of changes]
- author: [name]
- created_at: [YYYY-MM-DD]
- updated_at: [YYYY-MM-DD]
```
**Examples:**
```yaml
**Metadata:**
- story: STORY-010.1
- version: 2.1.0
- dependencies: [Step 10]
- breaking_changes:
- Output format changed: added computedSpacing object
- Removed nested fallback (SMELL 1 fix)
- author: Brad Frost Clone
- created_at: 2025-11-10
- updated_at: 2025-11-13
```
## Type System
### Basic Types
```yaml
string # Text
number # Number (integer or float)
boolean # true or false
null # Null value
any # Any type (avoid when possible)
```
### Complex Types
```yaml
array # Array of items
array<string> # Array of strings
array<number> # Array of numbers
object # Generic object
object { key: type, key: type } # Object with defined keys
```
### Optional Types
```yaml
string | null # String or null
object { key?: type } # Object with optional key (? suffix)
```
### Custom Types (Reference Schemas)
```yaml
Brand # References schemas/Brand.json
FormatConfig # References schemas/FormatConfig.json
AdAnalysis # References schemas/AdAnalysis.json
```
**Examples:**
```yaml
- campo: adCopy
tipo: object { title: string, body: string, cta: string }
- campo: faces
tipo: array<object { top: number, left: number, bottom: number, right: number }>
- campo: ready_copy
tipo: object { title?: string, body?: string, cta?: string } | null
- campo: brand
tipo: Brand # References schemas/Brand.json
```
## Validation Rules
### Required Field Validation
```javascript
function validateTask(task) {
const required = ['task', 'responsável', 'responsavel_type', 'atomic_layer', 'Entrada', 'Saída'];
for (const field of required) {
if (!task[field]) {
throw new Error(`Missing required field: ${field}`);
}
}
// Validate executor type
const validExecutors = ['Agente', 'Worker', 'Humano', 'Clone'];
if (!validExecutors.includes(task.responsavel_type)) {
throw new Error(`Invalid responsavel_type: ${task.responsavel_type}`);
}
// Validate atomic layer
const validLayers = ['Atom', 'Molecule', 'Organism', 'Template', 'Page', 'Config', 'Strategy', 'Content', 'Media', 'Layout', 'Analysis'];
if (!validLayers.includes(task.atomic_layer)) {
throw new Error(`Invalid atomic_layer: ${task.atomic_layer}`);
}
return true;
}
```
### Input/Output Validation
```javascript
function validateInputOutput(io, type) {
const required = ['campo', 'tipo', 'origem', 'obrigatório'];
for (const item of io) {
for (const field of required) {
if (!item[field] && field !== 'origem') { // origem not required for output
throw new Error(`${type} missing required field: ${field}`);
}
}
}
return true;
}
```
## Examples by Executor Type
### Agente (AI-Powered)
```yaml
#### Step 3: Analyze Brief
task: analyzeBrief()
responsável: Ad Strategist
responsavel_type: Agente
atomic_layer: Strategy
**Entrada:**
- campo: brief_text
tipo: string
origem: User Input (config)
obrigatório: true
validação: "length >= 50"
- campo: brand
tipo: Brand
origem: Step 2 (loadBrand)
obrigatório: true
- campo: ready_copy
tipo: object { title?, body?, cta? } | null
origem: User Input (config)
obrigatório: false
padrão: null
**Saída:**
- campo: adAnalysis
tipo: object { goal, targetAudience, urgencyLevel, emotionalTriggers, keyMessage }
destino: state (ad-spec.json)
persistido: true
**Checklist:**
pre-conditions:
- [ ] brief_text has minimum 50 characters
tipo: pre-condition
blocker: true
validação: "expect(brief_text.length).toBeGreaterThanOrEqual(50)"
post-conditions:
- [ ] adAnalysis contains all required fields
tipo: post-condition
blocker: true
validação: |
expect(adAnalysis.goal).toBeTruthy();
expect(adAnalysis.urgencyLevel).toMatch(/high|medium|low/);
acceptance-criteria:
- [ ] Analysis aligns with brand voice
tipo: acceptance
blocker: false
story: STORY-003
manual_check: false
test: "tests/brief-analysis-brand-alignment.test.js"
**Template:**
- path: Squads/instagram-content-creator/tasks/ads/analyze-ad-brief.md
type: prompt
version: 2.1.0
variables: [brief_text, brand_id, campaign_goal, ready_copy]
**Tools:**
- callAgent:
version: 1.0.0
used_for: Execute AI agent with retry
shared_with: [Step 4, Step 5, Step 6, Step 7, Step 8, Step 9, Step 11]
**Scripts:**
- N/A
**Performance:**
- duration_expected: 4000ms
- cost_estimated: $0.0025
- cacheable: false
- parallelizable: false
- skippable_when: [ready_copy=true]
**Error Handling:**
- strategy: fallback
- fallback: |
Use config.ready_copy as analysis if available.
Otherwise, use default analysis: { goal: "conversion", urgencyLevel: "medium", targetAudience: "general" }
- retry:
max_attempts: 3
backoff: exponential
backoff_ms: 1000
- abort_workflow: false
- notification: log
**Metadata:**
- story: STORY-003
- version: 2.0.0
- dependencies: [Step 2]
- breaking_changes: []
- author: Creative Team
- created_at: 2025-10-01
- updated_at: 2025-11-10
```
### Worker (Script-Based)
```yaml
#### Step 1: Load Format Configuration
task: loadFormatConfig()
responsável: format-loader.js
responsavel_type: Worker
atomic_layer: Config
**Entrada:**
- campo: format_id
tipo: string
origem: User Input (config)
obrigatório: true
validação: "format_id in ['instagram-stories', 'instagram-reels', 'instagram-feed-square', 'instagram-feed-portrait']"
- campo: orientation
tipo: string
origem: User Input (config)
obrigatório: false
padrão: "portrait"
validação: "orientation in ['portrait', 'landscape']"
**Saída:**
- campo: formatConfig
tipo: FormatConfig
destino: [Step 8, Step 10, Step 11, Step 12, Step 13, Step 14]
persistido: false
**Checklist:**
pre-conditions:
- [ ] format_id is valid
tipo: pre-condition
blocker: true
validação: |
const validFormats = ['instagram-stories', 'instagram-reels', 'instagram-feed-square', 'instagram-feed-portrait'];
if (!validFormats.includes(format_id)) {
throw new Error(`Invalid format_id: ${format_id}`);
}
post-conditions:
- [ ] formatConfig.safeZones are defined
tipo: post-condition
blocker: true
validação: |
expect(formatConfig.safeZones).toBeDefined();
expect(formatConfig.safeZones.top).toBeGreaterThan(0);
- [ ] formatConfig.contentArea.height calculated correctly
tipo: post-condition
blocker: true
validação: |
const expectedHeight = formatConfig.canvas.height - formatConfig.safeZones.top - formatConfig.safeZones.bottom;
expect(formatConfig.contentArea.height).toBe(expectedHeight);
**Template:**
- path: config/ad-formats.json
type: input
version: 1.0.0
variables: [format_id, orientation]
schema: schemas/FormatConfig.json
**Tools:**
- N/A
**Scripts:**
- scripts/utils/format-loader.js:
description: Reads format JSON and calculates content area
language: javascript
version: 1.0.0
**Performance:**
- duration_expected: 50ms
- cost_estimated: $0
- cacheable: true
- cache_key: format_${format_id}_${orientation}
- parallelizable: true
- parallel_with: [Step 2]
- skippable_when: []
**Error Handling:**
- strategy: abort
- retry:
max_attempts: 2
backoff: linear
backoff_ms: 100
- abort_workflow: true
- notification: log + email
**Metadata:**
- story: DECISION-02
- version: 1.0.0
- dependencies: []
- breaking_changes: []
- author: Brad Frost Clone
- created_at: 2025-11-10
- updated_at: 2025-11-10
```
### Humano (Manual Review)
```yaml
#### Step 15: Quality Review (Optional)
task: reviewAdQuality()
responsável: Quality Assurance Team
responsavel_type: Humano
atomic_layer: Page
**Entrada:**
- campo: final_ad_png
tipo: string (file path)
origem: Step 14 (exportPNG)
obrigatório: true
- campo: ad_spec
tipo: object (complete ad specification)
origem: state (ad-spec.json)
obrigatório: true
- campo: quality_criteria
tipo: array<string>
origem: config
obrigatório: true
padrão: ["brand_alignment", "text_legibility", "visual_appeal", "no_face_coverage"]
**Saída:**
- campo: quality_review
tipo: object { approved: boolean, score: number, feedback: string, reviewer: string }
destino: state (ad-spec.json)
persistido: true
**Checklist:**
pre-conditions:
- [ ] final_ad_png file exists
tipo: pre-condition
blocker: true
validação: |
const fs = require('fs');
if (!fs.existsSync(final_ad_png)) {
throw new Error(`Ad PNG not found: ${final_ad_png}`);
}
acceptance-criteria:
- [ ] Ad meets all quality criteria
tipo: acceptance
blocker: false
story: STORY-QA
manual_check: true
- [ ] Reviewer provided detailed feedback
tipo: acceptance
blocker: false
story: STORY-QA
manual_check: true
**Template:**
- path: templates/ui-forms/quality-review-form.html
type: ui
version: 1.0.0
variables: [final_ad_png, ad_spec, quality_criteria]
**Tools:**
- N/A
**Scripts:**
- N/A
**Performance:**
- duration_expected: 180000ms # 3 minutes (manual review)
- cost_estimated: $5 # Human labor cost
- cacheable: false
- parallelizable: false
- skippable_when: [skip_qa=true, batch_mode=true]
**Error Handling:**
- strategy: fallback
- fallback: Auto-approve if reviewer doesn't respond within 10 minutes
- retry:
max_attempts: 1
backoff: linear
backoff_ms: 600000 # 10 minutes
- abort_workflow: false
- notification: slack
**Metadata:**
- story: STORY-QA
- version: 1.0.0
- dependencies: [Step 14]
- breaking_changes: []
- author: QA Team
- created_at: 2025-11-13
- updated_at: 2025-11-13
```
### Clone (Mind Emulation)
```yaml
#### Step 7c: Validate Components (Brad Frost Clone)
task: validateComponentsAtomicDesign()
responsável: Brad Frost Clone
responsavel_type: Clone
atomic_layer: Atom
**Entrada:**
- campo: ctaComponent
tipo: object { text, style, colors }
origem: Step 7a (designCTAComponent)
obrigatório: true
- campo: badgeComponent
tipo: object { text, style, colors } | null
origem: Step 7b (designBadgeComponent)
obrigatório: false
**Saída:**
- campo: validation_result
tipo: object { valid: boolean, violations: array<object { rule, severity, message }> }
destino: state (ad-spec.json)
persistido: true
**Checklist:**
pre-conditions:
- [ ] ctaComponent exists
tipo: pre-condition
blocker: true
validação: "expect(ctaComponent).toBeDefined()"
post-conditions:
- [ ] No Atomic Design violations detected
tipo: post-condition
blocker: true
validação: |
if (!validation_result.valid) {
const criticalViolations = validation_result.violations.filter(v => v.severity === 'critical');
if (criticalViolations.length > 0) {
throw new Error(`Atomic Design violations: ${criticalViolations.map(v => v.message).join(', ')}`);
}
}
- [ ] All components are context-agnostic (no positioning)
tipo: post-condition
blocker: true
validação: |
if (ctaComponent.position || ctaComponent.size) {
throw new Error("CTA component has positioning data (DECISION-03 violation)");
}
if (badgeComponent && (badgeComponent.position || badgeComponent.size)) {
throw new Error("Badge component has positioning data (DECISION-03 violation)");
}
acceptance-criteria:
- [ ] Components follow Brad Frost's Atomic Design principles
tipo: acceptance
blocker: false
story: DECISION-03
manual_check: false
**Clone Configuration:**
- heuristics: clones/brad_frost/heuristics.yaml
- axioms: clones/brad_frost/axioms.yaml
- ai_fallback: true
**Tools:**
- callAgent:
version: 1.0.0
used_for: AI validation when heuristics are inconclusive
shared_with: [Step 3, Step 4, Step 5, Step 6, Step 7, Step 8, Step 9, Step 11]
- validateHeuristics:
version: 1.0.0
used_for: Apply Brad Frost's design heuristics
shared_with: [Step 7c only]
- validateAxioms:
version: 1.0.0
used_for: Validate against Atomic Design axioms
shared_with: [Step 7c only]
**Scripts:**
- clones/brad_frost/validate-atomic-design.js:
description: Atomic Design validation with heuristics + axioms
language: javascript
version: 1.0.0
**Performance:**
- duration_expected: 1500ms
- cost_estimated: $0.001 # Mostly heuristics, minimal AI
- cacheable: false
- parallelizable: false
- skippable_when: [skip_validation=true]
**Error Handling:**
- strategy: abort
- fallback: N/A (validation must pass)
- retry:
max_attempts: 1
backoff: linear
backoff_ms: 0
- abort_workflow: true
- notification: log + slack
**Metadata:**
- story: DECISION-03
- version: 1.0.0
- dependencies: [Step 7a, Step 7b]
- breaking_changes: []
- author: Brad Frost Clone
- created_at: 2025-11-13
- updated_at: 2025-11-13
```
## Validation Checklist
Use this checklist to validate any AIOS Task:
### Required Fields
- [ ] `task` is defined and unique
- [ ] `responsável` is defined
- [ ] `responsavel_type` is one of: Agente, Worker, Humano, Clone
- [ ] `atomic_layer` is defined (or explicitly marked N/A)
- [ ] `Entrada` is defined (array, can be empty)
- [ ] `Saída` is defined (array, can be empty)
### Input/Output Quality
- [ ] All inputs have: campo, tipo, origem, obrigatório
- [ ] All outputs have: campo, tipo, destino, persistido
- [ ] Types are well-defined (not just "object" or "any")
- [ ] Sources/destinations reference valid steps
### Checklist Quality
- [ ] Pre-conditions validate inputs
- [ ] Post-conditions validate outputs
- [ ] Acceptance criteria link to Stories
- [ ] Blocking conditions are appropriate
- [ ] Validation logic is executable
### Templates & Tools
- [ ] Template referenced (if applicable)
- [ ] Tools cataloged (if applicable)
- [ ] Scripts listed (if applicable)
- [ ] All references are valid paths
### Performance & Error Handling
- [ ] Duration expected is realistic
- [ ] Cost estimated (for AI)
- [ ] Cacheability considered
- [ ] Parallelization opportunities identified
- [ ] Error handling strategy defined
- [ ] Retry logic appropriate
### Metadata
- [ ] Story linked (if applicable)
- [ ] Version defined
- [ ] Dependencies listed
- [ ] Breaking changes documented
## Migration Guide (v2.0 → v3.0)
### Step 1: Add Missing Required Fields
```yaml
# BEFORE (v2.0 - incomplete)
#### Step 3: Analyze Brief
task: analyzeBrief()
responsável: Ad Strategist
**Entrada:**
**Saída:**
# AFTER (v3.0 - complete)
#### Step 3: Analyze Brief
task: analyzeBrief()
responsável: Ad Strategist
responsavel_type: Agente # ← ADDED
atomic_layer: Strategy # ← ADDED
**Entrada:**
- campo: brief_text
tipo: string
origem: User Input (config)
obrigatório: true
**Saída:**
- campo: adAnalysis
tipo: object { ... }
destino: state (ad-spec.json)
persistido: true
```
### Step 2: Structure Checklists
```yaml
# BEFORE (v2.0 - inline validations)
**Validações:**
- ✅ brief_text has minimum 50 characters
- ✅ adAnalysis contains required fields
# AFTER (v3.0 - structured checklist)
**Checklist:**
pre-conditions:
- [ ] brief_text has minimum 50 characters
tipo: pre-condition
blocker: true
validação: "expect(brief_text.length).toBeGreaterThanOrEqual(50)"
post-conditions:
- [ ] adAnalysis contains all required fields
tipo: post-condition
blocker: true
validação: |
expect(adAnalysis.goal).toBeTruthy();
expect(adAnalysis.urgencyLevel).toMatch(/high|medium|low/);
```
### Step 3: Add Performance Metrics
```yaml
# BEFORE (v2.0 - no metrics)
(no performance section)
# AFTER (v3.0 - with metrics)
**Performance:**
- duration_expected: 4000ms
- cost_estimated: $0.0025
- cacheable: false
- parallelizable: false
- skippable_when: [ready_copy=true]
```
### Step 4: Add Error Handling
```yaml
# BEFORE (v2.0 - implicit)
(no error handling section)
# AFTER (v3.0 - explicit)
**Error Handling:**
- strategy: fallback
- fallback: Use default analysis
- retry:
max_attempts: 3
backoff: exponential
backoff_ms: 1000
- abort_workflow: false
- notification: log
```
## Version History
| Version | Date | Author | Changes |
|---------|------|--------|---------|
| 1.0.0 | 2025-11-13 | Brad Frost Clone | Initial specification |
**END OF TASK FORMAT SPECIFICATION**
**Related Documents:**
- `EXECUTOR-DECISION-TREE.md` - How to choose executor type
- `TEMPLATE-SYSTEM-GUIDE.md` - Template design patterns
- `TOOLS-AND-SCRIPTS-CATALOG.md` - Available tools reference