aios-core
Version:
Synkra AIOS: AI-Orchestrated System for Full Stack Development - Core Framework
516 lines (371 loc) • 11.5 kB
Markdown
# Task: Verify DDL Ordering
**Purpose**: Lint DDL for safe execution order to avoid dependency errors
**Elicit**: true
## Execution Modes
**Choose your execution mode:**
### 1. YOLO Mode - Fast, Autonomous (0-1 prompts)
- Autonomous decision making with logging
- Minimal user interaction
- **Best for:** Simple, deterministic tasks
### 2. Interactive Mode - Balanced, Educational (5-10 prompts) **[DEFAULT]**
- Explicit decision checkpoints
- Educational explanations
- **Best for:** Learning, complex decisions
### 3. Pre-Flight Planning - Comprehensive Upfront Planning
- Task analysis phase (identify all ambiguities)
- Zero ambiguity execution
- **Best for:** Ambiguous requirements, critical work
**Parameter:** `mode` (optional, default: `interactive`)
## Task Definition (AIOS Task Format V1.0)
```yaml
task: dbVerifyOrder()
responsável: Dara (Sage)
responsavel_type: Agente
atomic_layer: Strategy
**Entrada:**
- campo: query
tipo: string
origem: User Input
obrigatório: true
validação: Valid SQL query
- campo: params
tipo: object
origem: User Input
obrigatório: false
validação: Query parameters
- campo: connection
tipo: object
origem: config
obrigatório: true
validação: Valid PostgreSQL connection via Supabase
**Saída:**
- campo: query_result
tipo: array
destino: Memory
persistido: false
- campo: records_affected
tipo: number
destino: Return value
persistido: false
- campo: execution_time
tipo: number
destino: Memory
persistido: false
```
## Pre-Conditions
**Purpose:** Validate prerequisites BEFORE task execution (blocking)
**Checklist:**
```yaml
pre-conditions:
- [ ] Database connection established; query syntax valid
tipo: pre-condition
blocker: true
validação: |
Check database connection established; query syntax valid
error_message: "Pre-condition failed: Database connection established; query syntax valid"
```
## Post-Conditions
**Purpose:** Validate execution success AFTER task completes
**Checklist:**
```yaml
post-conditions:
- [ ] Query executed; results returned; transaction committed
tipo: post-condition
blocker: true
validação: |
Verify query executed; results returned; transaction committed
error_message: "Post-condition failed: Query executed; results returned; transaction committed"
```
## Acceptance Criteria
**Purpose:** Definitive pass/fail criteria for task completion
**Checklist:**
```yaml
acceptance-criteria:
- [ ] Data persisted correctly; constraints respected; no orphaned data
tipo: acceptance-criterion
blocker: true
validação: |
Assert data persisted correctly; constraints respected; no orphaned data
error_message: "Acceptance criterion not met: Data persisted correctly; constraints respected; no orphaned data"
```
## Tools
**External/shared resources used by this task:**
- **Tool:** supabase
- **Purpose:** PostgreSQL database connection via Supabase client
- **Source:** @supabase/supabase-js
- **Tool:** query-validator
- **Purpose:** SQL query syntax validation
- **Source:** .aios-core/utils/db-query-validator.js
## Scripts
**Agent-specific code for this task:**
- **Script:** db-query.js
- **Purpose:** Execute PostgreSQL queries with error handling via Supabase
- **Language:** JavaScript
- **Location:** .aios-core/scripts/db-query.js
## Error Handling
**Strategy:** retry
**Common Errors:**
1. **Error:** Connection Failed
- **Cause:** Unable to connect to Neo4j database
- **Resolution:** Check connection string, credentials, network
- **Recovery:** Retry with exponential backoff (max 3 attempts)
2. **Error:** Query Syntax Error
- **Cause:** Invalid Cypher query syntax
- **Resolution:** Validate query syntax before execution
- **Recovery:** Return detailed syntax error, suggest fix
3. **Error:** Transaction Rollback
- **Cause:** Query violates constraints or timeout
- **Resolution:** Review query logic and constraints
- **Recovery:** Automatic rollback, preserve data integrity
## Performance
**Expected Metrics:**
```yaml
duration_expected: 5-20 min (estimated)
cost_estimated: $0.003-0.015
token_usage: ~2,000-8,000 tokens
```
**Optimization Notes:**
- Iterative analysis with depth limits; cache intermediate results; batch similar operations
## Metadata
```yaml
story: N/A
version: 1.0.0
dependencies:
- N/A
tags:
- database
- infrastructure
updated_at: 2025-11-17
```
## Inputs
- `path` (string): Path to SQL migration file
## Process
### 1. Extract DDL Sections
Parse migration file and identify sections:
```bash
awk 'BEGIN{IGNORECASE=1}
/create extension|alter extension/ {print "EXT:", NR, $0}
/create table/ {print "TAB:", NR, $0}
/create or replace function|create function/ {print "FUN:", NR, $0}
/create trigger/ {print "TRG:", NR, $0}
/enable row level security|create policy/ {print "RLS:", NR, $0}
/create .* view/ {print "VIEW:", NR, $0}
' {path} > /tmp/ddl_order.txt
echo "=== DDL Section Analysis ==="
cat /tmp/ddl_order.txt
```
### 2. Analyze Ordering
Show recommended order and actual order:
```
Recommended Execution Order:
1. Extensions (CREATE EXTENSION)
2. Tables & Constraints (CREATE TABLE, ALTER TABLE)
3. Functions (CREATE FUNCTION)
4. Triggers (CREATE TRIGGER)
5. RLS (ENABLE RLS, CREATE POLICY)
6. Views & Materialized Views (CREATE VIEW)
Actual Order in File:
[output from grep above]
```
### 3. Run Heuristic Checks
Detect common ordering problems:
```bash
# Check: Functions before tables
FIRST_TAB=$(grep '^TAB:' /tmp/ddl_order.txt | head -1 | cut -d: -f2)
FIRST_FUN=$(grep '^FUN:' /tmp/ddl_order.txt | head -1 | cut -d: -f2)
if [ -n "$FIRST_TAB" ] && [ -n "$FIRST_FUN" ] && [ "$FIRST_FUN" -lt "$FIRST_TAB" ]; then
echo "❌ Functions appear before tables. Reorder recommended."
exit 2
fi
# Check: RLS before tables exist
FIRST_RLS=$(grep '^RLS:' /tmp/ddl_order.txt | head -1 | cut -d: -f2)
if [ -n "$FIRST_RLS" ] && [ -n "$FIRST_TAB" ] && [ "$FIRST_RLS" -lt "$FIRST_TAB" ]; then
echo "❌ RLS commands before table creation. Reorder required."
exit 2
fi
# Check: Triggers before functions
FIRST_TRG=$(grep '^TRG:' /tmp/ddl_order.txt | head -1 | cut -d: -f2)
if [ -n "$FIRST_TRG" ] && [ -n "$FIRST_FUN" ] && [ "$FIRST_TRG" -lt "$FIRST_FUN" ]; then
echo "⚠️ Triggers before functions. May fail if trigger calls function."
fi
echo "✓ Ordering looks reasonable by heuristics"
```
### 4. Report Results
**If all checks pass:**
```
✅ DDL Ordering Validation Passed
Sections found:
- Extensions: X
- Tables: Y
- Functions: Z
- Triggers: N
- RLS: M
- Views: V
Order appears correct. Safe to proceed with:
*dry-run {path}
```
**If issues found:**
```
❌ DDL Ordering Issues Detected
Problems:
- Functions defined before tables (line X vs line Y)
- Triggers reference functions not yet created
Recommended fixes:
1. Move CREATE EXTENSION to top
2. Group CREATE TABLE statements
3. Then CREATE FUNCTION
4. Then CREATE TRIGGER
5. Then ENABLE RLS + policies
6. Finally CREATE VIEW
After fixing, re-run: *verify-order {path}
```
## Correct Ordering Examples
### ✅ Good Order
```sql
-- 1. Extensions first
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
-- 2. Tables and constraints
CREATE TABLE users (...);
CREATE TABLE fragments (...);
ALTER TABLE fragments ADD CONSTRAINT fk_user ...;
-- 3. Functions
CREATE OR REPLACE FUNCTION current_user_id() ...;
CREATE OR REPLACE FUNCTION update_timestamp() ...;
-- 4. Triggers
CREATE TRIGGER set_timestamp
BEFORE UPDATE ON users ...;
-- 5. RLS
ALTER TABLE users ENABLE ROW LEVEL SECURITY;
CREATE POLICY "users_all" ON users ...;
-- 6. Views
CREATE VIEW user_fragments_view AS ...;
```
### ❌ Bad Order (Will Fail)
```sql
-- ❌ Function before table it references
CREATE FUNCTION get_user_name(user_id UUID)
RETURNS TEXT AS $$
SELECT name FROM users WHERE id = user_id; -- users doesn't exist yet!
$$ LANGUAGE sql;
-- ❌ Table created after function
CREATE TABLE users (...);
-- ❌ RLS before table
CREATE POLICY "users_policy" ON users ...; -- Can't create policy on non-existent table
```
## Common Dependency Patterns
### Pattern 1: Functions Calling Other Functions
**Order**: Base functions → Composite functions
```sql
-- First: Base function
CREATE FUNCTION base_func() ...;
-- Second: Function that calls base_func
CREATE FUNCTION composite_func() AS $$
BEGIN
RETURN base_func(); -- Safe, base_func exists
END;
$$ LANGUAGE plpgsql;
```
### Pattern 2: Tables with Foreign Keys
**Order**: Referenced tables → Referencing tables
```sql
-- First: Parent table
CREATE TABLE users (id UUID PRIMARY KEY);
-- Second: Child table
CREATE TABLE posts (
user_id UUID REFERENCES users(id) -- Safe, users exists
);
```
### Pattern 3: Views on Views
**Order**: Base views → Derived views
```sql
-- First: Base view
CREATE VIEW active_users AS
SELECT * FROM users WHERE deleted_at IS NULL;
-- Second: View on view
CREATE VIEW active_users_with_posts AS
SELECT u.*, COUNT(p.id)
FROM active_users u -- Safe, active_users exists
LEFT JOIN posts p ON p.user_id = u.id;
```
### Pattern 4: RLS Using Functions
**Order**: Tables → Functions → RLS Policies
```sql
-- First: Table
CREATE TABLE data (...);
-- Second: Helper function
CREATE FUNCTION user_can_access(data_id UUID) ...;
-- Third: RLS policy using function
CREATE POLICY "access_check" ON data
USING (user_can_access(id)); -- Safe, function exists
```
## Manual Review Checklist
After automated checks, manually verify:
- [ ] All CREATE EXTENSION at top
- [ ] Foreign key references come after parent tables
- [ ] Triggers reference existing functions
- [ ] RLS policies reference existing tables
- [ ] Views reference existing tables/views
- [ ] Functions called by other functions defined first
- [ ] No circular dependencies
## Integration with Workflow
Typical validation workflow:
1. Write migration
2. `*verify-order migration.sql` - Check ordering
3. Fix any issues found
4. `*dry-run migration.sql` - Test execution
5. `*apply-migration migration.sql` - Apply if dry-run passes
## Advanced: Dependency Graph
For complex migrations, visualize dependencies:
```bash
# Extract CREATE statements
grep -i "create" {path} | \
grep -E "(table|function|view|trigger)" > /tmp/creates.txt
# Manual review of dependencies
cat /tmp/creates.txt
```
Look for:
- Table → Foreign Key → Other Table
- Function → Calls → Other Function
- Trigger → Calls → Function
- View → Selects → Table/View
- Policy → Uses → Function
## Why This Matters
**Problem**: Wrong order causes migration failures
```
ERROR: relation "users" does not exist
ERROR: function "user_can_access" does not exist
ERROR: table "data" does not exist for policy creation
```
**Solution**: Verify order before running
- Catch issues in seconds (not after failed migration)
- No partial schema state
- No rollback needed for ordering errors
- Faster development cycle
## Limitations
This is a heuristic check, not a full parser:
✅ **Catches**: Most common ordering issues
✅ **Fast**: Runs in < 1 second
✅ **Safe**: No database connection needed
❌ **Misses**: Complex cross-file dependencies
❌ **Misses**: Dynamic SQL
❌ **Misses**: Subtle type dependencies
For 100% validation, use: `*dry-run {path}`