Repository navigation
v0.7.0 — sql-write: persistir resultados con guardrails
ADR-002 Nivel 3 cerrado: end-to-end-delivery
Este release agrega sql-write en modo conservador, que cierra el circulo: el data analyst ya no solo consulta y reporta — ahora puede persistir resultados de analisis en una DB de manera segura.
Skill nueva (1)
**sql-write**\ — Carga opcional de sql-analyst, SOLO si el usuario pide persistir resultados. Implementa el patron "dry-run + doble confirmacion + audit log" del ADR-002.
Operaciones permitidas:
CREATE TABLE [IF NOT EXISTS](incluidoCREATE TEMPORARY TABLE)CREATE INDEX,CREATE UNIQUE INDEXCREATE VIEW,CREATE OR REPLACE VIEWINSERT INTO ... VALUES (...)INSERT INTO ... SELECT ...WITH cte AS (...) INSERT INTO ...
Operaciones BLOQUEADAS (BlockedOperationError con mensaje accionable):
DROP TABLE/DATABASE/SCHEMA/INDEX/VIEWUPDATE,DELETE,TRUNCATEALTER TABLE ... DROP COLUMN/RENAMEGRANT,REVOKE
Guardrails obligatorios
- Validacion estatica del SQL antes de ejecutar (regex sobre tokens).
- Dry-run obligatorio: genera el DDL + muestra preview de las primeras 5 filas. El caller debe pedir confirmacion #1 al usuario.
- Doble confirmacion:
execute_insertrequiereauto_confirm=True. Sin eso, levantaSqlWriteError. - Auditoria append-only en
~/.agents/audit/sql-write.log(formato JSONL). Cada escritura registra timestamp, action, engine, target, n_rows, duration_ms, sql_preview. - Rotacion automatica cuando el log supera 1MB (mantiene hasta 10 archivos historicos).
- Rollback automatico si la transaccion SQLAlchemy falla.
Soporte de engines
| Engine | Soporte | Dep |
|---|---|---|
| SQLite local | v1 ✅ | stdlib |
| Snowflake | v1 ✅ (peerDep opcional) | snowflake-connector-python |
| BigQuery | v1 ✅ (peerDep opcional) | sqlalchemy-bigquery + google-cloud-bigquery |
| Redshift | v1 ✅ (peerDep opcional) | sqlalchemy-redshift + redshift-connector |
| Postgres / MySQL | follow-up (sin escribir en v1) | — |
Inferencia de tipos
Mapeo automatico de pandas dtypes al dialecto:
| Pandas | SQLite | Postgres | Snowflake | BigQuery |
|---|---|---|---|---|
| int64 / int32 | INTEGER | BIGINT / INTEGER | NUMBER(38,0) | INT64 |
| float64 / float32 | REAL | DOUBLE PRECISION | FLOAT | FLOAT64 |
| bool | BOOLEAN | BOOLEAN | BOOLEAN | BOOL |
| datetime64[ns] | TIMESTAMP | TIMESTAMP | TIMESTAMP_NTZ | TIMESTAMP |
| object (str) | TEXT | TEXT | TEXT | STRING |
Verificado
```bash
make test-sql-write
-> 5 filas insertadas en SQLite
-> Audit log escrito correctamente
-> DROP/UPDATE/DELETE bloqueados con error accionable
-> 17/17 tests del validator (10 permitidas + 7 bloqueadas)
```
Workflow end-to-end completo para una pega de data analytics
| Dia | Skill |
|---|---|
| Lunes: Excel corporativo sucio | excel-profiler |
| Martes: limpieza + EDA | csv-profiler + pandas-cleaning |
| Miercoles: warehouse cloud | sql-cloud-warehouse |
| Jueves: insights | insight-synthesis |
| Viernes: reporte ejecutivo | report-export |
| Viernes (deploy): API REST | api-builder |
| Viernes (persistir): tabla con resultados | sql-write (este release) |
ADR-002 — estado
- ✅ excel-formulas (v0.6.0) — auditoria de formulas
- ✅ sql-write (v0.7.0) — escribir con guardrails
- ⏳ audit-log — transversal (siguiente)
- ⏳ sql-write modo full (ADR-003) — DROP/UPDATE/DELETE con rollback