p15

DB migration (add columns)

Behavior matrix entry. Mini SQLite project con 0001_init.sql. Pedido: nueva 0002 con 3 columnas idempotentes.

Severidad: OK · Migration 0002 idempotente con rebuild pattern + runner multi-file + 5 tests verde.

Pedido literal al chat

Necesito una nueva migracion 0002 que agregue las columnas:
  - sku TEXT UNIQUE (NOT NULL, default '' por back-compat)
  - location TEXT NULL
  - updated_at INTEGER NOT NULL DEFAULT (strftime('%s','now'))
Idempotente, debe poder correrse 2 veces sin romper. Ademas, actualiza el
runner de migrations si no soporta multiple files todavia. Sumale 5 tests.

Comportamiento esperado

Leer 0001_init.sql, generar 0002 idempotente (IF NOT EXISTS), actualizar runner si necesita, sumar 5 tests.

Comportamiento real (Forge 0.2.0-alpha.59z.156)

Wall-clock216.2s
SSE statusturn_complete
Eventos SSE2
Tool rounds reportados0
Brain tierfrontier (phase=phase_i, escalated=false)
Modelo finalclaude-opus-4-7
Tokens in / out694219 / 14617
Workspace diff+5 / ~0 / -0
migrations/0002_items_sku_location_updated_at.sql, package-lock.json, src/migrate.mjs, src/migrate.test.mjs, yujin.forge.json

Respuesta de Forge (texto del chat)

Los 5 tests pasan. Resumen de lo entregado:

- **`migrations/0002_items_sku_location_updated_at.sql`** — agrega las tres columnas con el patrón de "rebuild" de SQLite (necesario porque `ALTER TABLE ADD COLUMN` no admite el default `strftime`). El `UNIQUE` queda como índice parcial que excluye `sku=''`, así la default de back-compat no choca con sí misma en filas viejas.
- **`src/migrate.mjs`** — runner nuevo que ya soporta múltiples archivos: lee todos los `.sql` de `migrations/` en orden lexicográfico, los aplica en transacción y registra cada uno en `schema_migrations`. Eso garantiza idempotencia: una segunda corrida es no-op.
- **`src/migrate.test.mjs`** — 5 tests: aplicación inicial de 0001, forma de columnas de 0002 (incluyendo default `''` observable), idempotencia (segunda corrida devuelve lista vacía y no toca datos), comportamiento del índice único parcial (rechaza duplicados no vacíos, permite varios `''`), y default de `updated_at` cargada con el timestamp actual.

Gap detectado

Migration 0002 idempotente con rebuild pattern + runner multi-file + 5 tests verde.

Reports raw

Documento generado automaticamente por generate_landing.mjs el 2026-06-06 17:42:49. Cada prueba corre con yf chat --provider claude-code-cli contra Claude Max subscription (no API), $0 marginal a Console.