aios-core
Version:
Synkra AIOS: AI-Orchestrated System for Full Stack Development - Core Framework
382 lines (266 loc) • 8.21 kB
Markdown
# Task: Apply Migration (with snapshot + advisory lock)
**Purpose**: Safely apply a migration with pre/post snapshots and exclusive lock
**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: dbApplyMigration()
responsável: Dara (Sage)
responsavel_type: Agente
atomic_layer: Organism
**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:** neo4j-driver
- **Purpose:** Neo4j database connection and query execution
- **Source:** npm: neo4j-driver
- **Tool:** query-validator
- **Purpose:** Cypher query syntax validation
- **Source:** .aios-core/utils/db-query-validator.js
## Scripts
**Agent-specific code for this task:**
- **Script:** db-query.js
- **Purpose:** Execute Neo4j queries with error handling
- **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-15 min (estimated)
cost_estimated: $0.003-0.010
token_usage: ~3,000-10,000 tokens
```
**Optimization Notes:**
- Break into smaller workflows; implement checkpointing; use async processing where possible
## 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. Pre-Flight Checks
Ask user to confirm:
- Migration file: `{path}`
- Database: `$SUPABASE_DB_URL` (redacted)
- Dry-run completed? (yes/no)
- Backup/snapshot taken? (will be done automatically)
**CRITICAL**: If user says dry-run not done, stop and recommend: `*dry-run {path}`
### 2. Acquire Advisory Lock
Ensure no concurrent migrations:
```bash
psql "$SUPABASE_DB_URL" -v ON_ERROR_STOP=1 -c \
"SELECT pg_try_advisory_lock(hashtext('dbsage:migrate')) AS got" \
| grep -q t || { echo "❌ Another migration is running"; exit 1; }
echo "✓ Migration lock acquired"
```
### 3. Pre-Migration Snapshot
Create schema-only snapshot before changes:
```bash
TS=$(date +%Y%m%d%H%M%S)
mkdir -p supabase/snapshots supabase/rollback
pg_dump "$SUPABASE_DB_URL" --schema-only --clean --if-exists \
> "supabase/snapshots/${TS}_before.sql"
echo "✓ Pre-migration snapshot: supabase/snapshots/${TS}_before.sql"
echo $TS > /tmp/dbsage_migration_ts
```
### 4. Apply Migration
Run migration in transaction:
```bash
echo "Applying migration..."
psql "$SUPABASE_DB_URL" -v ON_ERROR_STOP=1 -f {path}
if [ $? -eq 0 ]; then
echo "✓ Migration applied successfully"
else
echo "❌ Migration failed - rolling back..."
# Advisory lock will be released on disconnect
exit 1
fi
```
### 5. Post-Migration Snapshot
Create snapshot after changes:
```bash
TS=$(cat /tmp/dbsage_migration_ts)
pg_dump "$SUPABASE_DB_URL" --schema-only --clean --if-exists \
> "supabase/snapshots/${TS}_after.sql"
echo "✓ Post-migration snapshot: supabase/snapshots/${TS}_after.sql"
```
### 6. Generate Diff (Optional)
```bash
diff -u "supabase/snapshots/${TS}_before.sql" \
"supabase/snapshots/${TS}_after.sql" \
> "supabase/snapshots/${TS}_diff.patch" || true
echo "✓ Diff saved: supabase/snapshots/${TS}_diff.patch"
```
### 7. Release Advisory Lock
```bash
psql "$SUPABASE_DB_URL" -v ON_ERROR_STOP=1 -c \
"SELECT pg_advisory_unlock(hashtext('dbsage:migrate'));"
echo "✓ Migration lock released"
```
### 8. Post-Migration Actions
Present options to user:
**1. Run smoke tests** - `*smoke-test`
**2. Check RLS coverage** - `*rls-audit`
**3. Verify query performance** - `*analyze-hotpaths`
**4. Done for now**
## Success Output
```
✅ Migration Applied Successfully
Timestamp: {TS}
Migration: {path}
Snapshots:
- Before: supabase/snapshots/{TS}_before.sql
- After: supabase/snapshots/{TS}_after.sql
- Diff: supabase/snapshots/{TS}_diff.patch
Next steps:
*smoke-test - Validate migration
*rls-audit - Check security
*rollback {TS} - Undo if needed
```
## Rollback Instructions
If migration needs to be undone:
```bash
*rollback supabase/snapshots/{TS}_before.sql
```
Or create manual rollback script in `supabase/rollback/{TS}_rollback.sql`
## Error Handling
### Migration Fails Mid-Execution
1. PostgreSQL transaction is rolled back automatically
2. Advisory lock released on disconnect
3. Pre-migration snapshot still available
4. Database unchanged
### Lock Already Held
```
❌ Another migration is running
Wait for completion or check for stuck locks:
SELECT * FROM pg_locks WHERE locktype = 'advisory';
```
### Snapshot Creation Fails
- Check disk space
- Verify pg_dump version compatibility
- Check database permissions
## Safety Features
✅ Advisory lock prevents concurrent migrations
✅ Pre/post snapshots for comparison
✅ ON_ERROR_STOP prevents partial application
✅ Transaction-wrapped execution
✅ Automatic diff generation
✅ Rollback instructions provided