SOURCE-003 Sales Items Window Pilot 001¶
Fecha: 2026-06-11
Estado: EJECUTADO / WINDOW PILOT VERDE / PRODUCCION FINAL BLOQUEADA
portal_visible = yes
Scope: tenant
tenant_id: alpuntodeventa
Owner: Gabi / Carlos Canu
Fuente de verdad:
docs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-SALES-ITEMS-WINDOW-PILOT-001.md
Documento padre:
docs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-SALES-ITEMS-PILOT-LOAD.md
1. Objetivo¶
Ejecutar un piloto controlado de ventana movil/backfill corto para
business_observer.source_003_sales_items, usando SOURCE-003 / Tabla 2 V2
contra SGC vivo y cargando en PostgreSQL local con upsert,
source_row_hash_v1 y refresco de last_seen_at.
La ventana piloto solicitada fue:
| Campo | Valor |
|---|---|
| desde | 2026-06-03 |
| hasta | 2026-06-09 |
| dia en curso incluido | NO |
| modo | BUILD + VALIDATE |
El intento original del 2026-06-10 se detuvo por falta de credenciales
utilizables desde la sesion local.
El reintento autorizado del 2026-06-11 avanzo el gate de conectividad:
PostgreSQL SELECT 1 y SGC SELECT 1 pasaron, la tabla destino fue validada
con 1886 filas existentes de 2026-06-09, pero el backup logico previo de
la base gestion_de_negocios_core no pudo confirmarse con el rol local
disponible. Segun el criterio solicitado, la corrida se detuvo antes de
extraccion, snapshot, transformacion, carga, upsert, rollback o validacion
post-carga.
Una revalidacion posterior del mismo dia resolvio el bloqueo operativo de
backup para este piloto mediante Opcion C: backup logico acotado al schema
business_observer, que es la unica superficie modificada por la ventana
movil declarada. El piloto sigue no ejecutado; con el cierre de la etapa local
PostgreSQL Business Observer, esa evidencia queda como gate VERDE del
schema afectado, no como autorizacion automatica para escalar nuevos pilotos
largos dentro de gestion_de_negocios_core.
2. Safe point¶
Safe point previo:
| Control | Resultado |
|---|---|
git status -sb |
## main...origin/main |
git rev-parse HEAD |
be976919322c02c01379d913ef39ba219427f27a |
El repositorio estaba limpio antes de intentar el gate.
Reintento documentado:
| Control | Resultado |
|---|---|
| fecha/hora local | 2026-06-11 08:40:48 -03:00 |
| aprobacion humana | Gabi aprueba explicitamente avanzar con el piloto de ventana movil/backfill corto |
| modo | BUILD + VALIDATE |
3. Alcance aplicado¶
| Control | Resultado |
|---|---|
VPS |
NO TOCADO |
Docker |
NO TOCADO |
OpenClaw runtime |
NO TOCADO |
NPM |
NO TOCADO |
| sync diaria | NO CREADA |
| automatizacion | NO CREADA |
| carga masiva historica | NO EJECUTADA |
| produccion final | NO HABILITADA |
| datos personales documentados | NO |
4. Gate previo¶
Destino previsto:
| Campo | Valor |
|---|---|
| motor | PostgreSQL 15 local |
| host/puerto | localhost:5432 |
| base | gestion_de_negocios_core |
| schema | business_observer |
| tabla | business_observer.source_003_sales_items |
| alias permitido | postgres:postgres-alpuntodeventa-dev-env |
| rol del entorno | local piloto |
| aislamiento aplicado | schema business_observer |
Fuente prevista:
| Campo | Valor |
|---|---|
| alias | mssql:mssql-sgc-ecommerce |
| salida | SOURCE-003 / Tabla 2 V2 |
| SQL autoridad | SOURCE-003-VENTAS-VNEXT-TABLA2-AUTHORITY-V2.sql |
| flags requeridos | Tabla1=0, Tabla2=1, Tabla3=0, Tabla4=0, Tabla5=0, Tabla6=0 |
Resultado del gate:
| Control | Resultado |
|---|---|
| repo limpio | PASS |
.env local existe |
PASS |
.env ignorado por Git |
PASS |
.env versionado por Git |
NO |
conexion PostgreSQL SELECT 1 |
PASS, resultado 1 |
conexion SGC SELECT 1 solo lectura |
PASS, resultado 1 |
| tabla destino existe | PASS |
| filas totales destino | 1886 |
| fechas presentes destino | 2026-06-09: 1886 |
filas ya cargadas de 2026-06-09 |
1886 |
backup logico previo de gestion_de_negocios_core |
FAIL |
| decision de gate | STOP |
Evidencia tecnica sin exponer secretos:
.envlocal existe, esta ignorado por Git y no esta versionado.- las variables
APV_DESTINATION_POSTGRES_*yAPV_SOURCE_002_MSSQL_*existen en.env; no se imprimieron valores ni connection strings. PostgreSQLlocal respondioSELECT 1con el destino esperado.SGC MSSQLrespondioSELECT 1 AS oken conexion de solo lectura y cierre conrollback.pg_dumpexiste enC:\Program Files\PostgreSQL\15\bin\pg_dump.exe.pg_restoreexiste enC:\Program Files\PostgreSQL\15\bin\pg_restore.exe.- no se encontro
pgpass.conf,.pgpassnipg_service.confutilizable. - el rol local disponible para destino es minimo y no tiene permisos de backup sobre todos los schemas de la base.
pg_dump --format=custom --no-owner --no-privilegessobregestion_de_negocios_corefallo conpermission denied for schema cobranzas, al intentar bloquearcobranzas.bank_entity.- no se genero un backup logico verificable de la base completa.
No se extrajeron ni documentaron credenciales.
Preflight posterior de credenciales historico:
| Campo | Resultado |
|---|---|
| evidencia | docs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-CREDENTIALS-PREFLIGHT.md |
| fecha | 2026-06-10 |
| metodo local esperado | .env no versionado desde .env.example |
PostgreSQL SELECT 1 |
FAIL |
SGC SELECT 1 |
FAIL |
| conteo tabla destino | NO VALIDADO |
| decision | ROJO, siguen faltando credenciales locales utilizables |
5. Backup¶
Backup logico completo previo del intento: NO CONFIRMADO.
Backup logico acotado posterior a business_observer: CONFIRMADO.
Motivo: el SELECT 1 de PostgreSQL y de SGC paso, pero el rol
openclaw_writer no puede generar backup logico completo de
gestion_de_negocios_core porque carece de permisos sobre otros schemas de la
base.
Resultado del intento de backup:
| Campo | Resultado |
|---|---|
| herramienta | pg_dump 15 |
| destino del intento | C:\APV\backups_postgres\openclawai\source_003_sales_items_window_pilot_001\ |
| usuario logico | openclaw_writer |
| base | gestion_de_negocios_core |
| resultado | FAIL |
| causa segura | permission denied for schema cobranzas |
| objeto mencionado por PostgreSQL | cobranzas.bank_entity |
pg_restore --list |
NO EJECUTADO, no hubo dump valido |
| backup confirmado | NO |
Segun la instruccion del piloto, al faltar backup confirmado la corrida se
detuvo antes de leer SOURCE-003 / Tabla 2 V2 para la ventana.
Revalidacion posterior de backup acotado:
| Campo | Resultado |
|---|---|
| fecha/hora local | 2026-06-11 08:49:53 -0300 |
| estrategia | Opcion C, backup acotado al schema afectado |
| herramienta | pg_dump 15.15 |
| formato | custom |
| scope | --schema=business_observer |
| usuario usado | openclaw_writer |
usuario openclaw_backup creado |
NO |
| permisos concedidos | NINGUNO |
openclaw_writer ampliado |
NO |
| password expuesto | NO |
| archivo dump | C:\APV\backups_postgres\openclawai\source_003_sales_items_window_pilot_001_schema_gate\20260611-084953-gestion_de_negocios_core-business_observer-pre-window-pilot-001.dump |
| archivo hash | C:\APV\backups_postgres\openclawai\source_003_sales_items_window_pilot_001_schema_gate\20260611-084953-gestion_de_negocios_core-business_observer-pre-window-pilot-001.dump.sha256 |
| archivo TOC | C:\APV\backups_postgres\openclawai\source_003_sales_items_window_pilot_001_schema_gate\20260611-084953-gestion_de_negocios_core-business_observer-pre-window-pilot-001.dump.toc.txt |
| bytes | 382481 |
| sha256 | 90eb1d45c93911b01a85b5545f7ac5529b297750693631fe4b243463cab047cb |
pg_restore --list |
PASS |
| TOC lines | 35 |
Justificacion de alcance:
- este piloto solo modifica
business_observer.source_003_sales_items business_observercontiene1objeto visible para el rol local usado- exigir backup completo vuelve a depender de schemas no tocados por el piloto,
como
cobranzas - ampliar
openclaw_writerpara cubrir esos schemas queda descartado por principio de minimo privilegio - no se ejecuto extraccion, transformacion,
upsert, sync ni carga como parte de esta revalidacion
6. Extraccion controlada¶
Extraccion contra SGC: NO EJECUTADA.
| Control | Resultado |
|---|---|
| SQL autoridad ejecutado | NO |
| flags Tabla 2 forzados | NO EJECUTADO |
| snapshot local generado | NO |
| sha256 snapshot | N/A |
| filas extraidas | N/A |
7. Validacion pre-carga¶
Validacion pre-carga: NO EJECUTADA.
Todos los controles de filas, fechas, importes, CMV, unicos, duplicados,
nulos criticos, negativos, notas de credito, CMV cero, headers y cobertura
de 68 columnas quedaron NO VALIDADO en esta corrida porque no hubo
extraccion.
8. Transformacion¶
Transformacion: NO EJECUTADA.
No se calcularon para esta corrida:
line_sequence_v1line_key_v4source_row_hash_v1sync_batch_idextracted_atlast_seen_atrecord_status
9. Carga / upsert¶
Carga piloto: NO EJECUTADA.
| Control | Resultado |
|---|---|
| transaccion de carga abierta | NO |
INSERT |
NO |
UPSERT |
NO |
UPDATE por hash cambiado |
NO |
refresco de last_seen_at unchanged |
NO |
| hard delete | NO |
missing_from_source |
NO |
| errores unique/check/type | N/A |
| rollback ejecutado | NO |
| motivo de no rollback | no hubo transaccion de carga |
Resultados de carga:
| Metrica | Resultado |
|---|---|
| filas insertadas | 0 |
| filas actualizadas por hash cambiado | 0 |
filas unchanged con last_seen_at refrescado |
0 |
| filas nuevas cargadas por esta corrida | 0 |
10. Validacion post-carga¶
Validacion post-carga: NO EJECUTADA.
No se pudo confirmar en esta corrida:
- filas totales finales
- filas por fecha
- duplicados
line_key source_row_hashno nuloline_sequence_v1no nulosync_batch_idde corrida- importes por fecha
CMVpor fecha- comparacion contra snapshot/extraccion
El ultimo estado documentado previo sigue siendo la carga piloto 001 desde
SOURCE-003-SNAPSHOT-001. El reintento de 2026-06-11 revalido conectividad
y estado agregado de tabla destino, pero no ejecuto post-carga porque no hubo
backup confirmado ni transaccion de carga.
11. Performance¶
No hubo medicion de performance de extraccion, transformacion, upsert ni validacion porque la corrida se detuvo en gate previo antes de esas etapas.
| Etapa | Resultado |
|---|---|
| extraccion | N/A |
| transformacion | N/A |
| upsert | N/A |
| validacion | N/A |
12. Estado final¶
Decision final del intento de piloto: ROJO historico.
Estado operativo actual del gate de backup: VERDE.
Estado actual del piloto de ventana: NO EJECUTADO.
Cierre de etapa local: CERRADO.
Motivo: el intento de piloto se detuvo correctamente por falta de backup completo, pero la revalidacion posterior confirma backup verificable acotado a la unica superficie que modifica el piloto.
| Control | Resultado |
|---|---|
| backup completo confirmado | NO |
backup acotado business_observer confirmado |
SI |
| filas pre-carga | 1886 |
| filas extraidas | N/A |
| inserts | 0 |
| updates | 0 |
| unchanged | 0 |
| filas finales | 1886 |
| rollback ejecutado | NO |
| datos nuevos quedaron cargados | NO |
13. Checklist¶
| Item | Resultado |
|---|---|
PostgreSQL local piloto tocado conscientemente |
SI, solo SELECT 1, metadata/conteos agregados e intento de backup |
SGC solo lectura |
SI, solo SELECT 1 |
sin VPS |
SI |
sin Docker |
SI |
sin OpenClaw |
SI |
sin NPM |
SI |
| sin sync diaria | SI |
| sin produccion final | SI |
| ventana movil probada | NO |
| upsert probado | NO |
source_row_hash probado |
NO |
last_seen_at probado |
NO |
| docs actualizadas | SI |
14. Decision final¶
Decision final del intento: ROJO historico.
Decision final del gate de backup posterior: VERDE.
Estado operativo actual del piloto de ventana:
NO EJECUTADO / CERRADO SIN CARGA.
Lectura:
- la aprobacion humana para el piloto quedo registrada
PostgreSQLdestino ySGCorigen ya no son el bloqueo inmediato- el bloqueo de backup completo de base se resolvio para este piloto por backup acotado verificable del schema afectado
openclaw_writerno fue ampliado y no se creo un rol nuevo- no se ejecuto extraccion de la ventana
2026-06-03a2026-06-09 - no se genero snapshot local de ventana
- no se calcularon
line_key_v4,line_sequence_v1nisource_row_hash_v1 - no se ejecuto
INSERT,UPDATE,UPSERT,DELETE,missing_from_sourceni rollback - los datos existentes del piloto previo quedaron cargados y sin cambios:
1886filas de2026-06-09
15. Cierre de etapa local PostgreSQL¶
Decision documentada al 2026-06-11:
gestion_de_negocios_corefue un entorno local valido para piloto acotado.- El aislamiento real fue por schema
business_observer. - El estado final local conserva
1886filas reales de2026-06-09enbusiness_observer.source_003_sales_items. - El backup logico acotado a
business_observerquedaVERDEy verificable. - El piloto de ventana movil/backfill corto no se ejecuto y no agrego datos.
- No se borraron ni movieron datos.
- No se ejecuto sync.
- No se crearon bases nuevas.
Recomendacion futura:
- No escalar pilotos largos dentro de
gestion_de_negocios_core. - Crear una DB separada
openclaw_business_observer_devpara futuros pilotos locales cuando haya aprobacion para crear bases, o evaluar formalmente el sandboxVPS. - Mantener bloqueadas sync diaria, carga masiva, migraciones adicionales, produccion final y runtime hasta decision explicita.
16. Proximo paso unico recomendado¶
Definir el entorno aislado del siguiente piloto antes de cualquier reintento:
DB local separada openclaw_business_observer_dev o sandbox VPS evaluado
formalmente. No avanzar a sync diaria, carga masiva, migraciones adicionales
ni produccion final sin aprobacion explicita.
17. Ejecucion final de ventana movil - 2026-06-11¶
Esta seccion supera el estado operativo de los intentos anteriores. Gabi
aprobo ejecutar este ultimo piloto ampliado sobre PostgreSQL local legacy
gestion_de_negocios_core antes de pasar a una DB dedicada o sandbox VPS
evaluado.
Ventana ejecutada:
| Campo | Valor |
|---|---|
| desde | 2026-06-03 |
| hasta | 2026-06-09 |
| dia en curso incluido | NO |
| entorno | PostgreSQL local legacy gestion_de_negocios_core |
| schema | business_observer |
| tabla | source_003_sales_items |
| usuario destino | openclaw_writer |
Safe point de la corrida final:
| Control | Resultado |
|---|---|
git status -sb |
## main...origin/main |
git rev-parse HEAD |
64b1c2f50ed81f02ea764069230e183fc5e324ac |
Gate previo:
| Control | Resultado |
|---|---|
| repo limpio | PASS |
.env existe |
PASS |
.env ignorado por Git |
PASS |
.env versionado por Git |
NO |
PostgreSQL SELECT 1 |
PASS |
SGC SELECT 1 solo lectura |
PASS |
| tabla destino existe | PASS |
| filas pre-carga | 1886 |
| fechas presentes pre-carga | 2026-06-09: 1886 |
filas pre-carga de 2026-06-09 |
1886 |
Backup acotado generado para esta corrida:
| Campo | Valor |
|---|---|
| scope | --schema=business_observer |
| archivo dump | C:\APV\backups_postgres\openclawai\source_003_sales_items_window_pilot_001\20260611-123730-gestion_de_negocios_core-business_observer-pre-window-pilot-001.dump |
| sha256 | 4d76c8cd05735691728b46ab4a6f6387e429832d4af8f9db1c11f41ea0481a9f |
| bytes | 382481 |
pg_restore --list |
PASS |
| TOC lines | 35 |
Extraccion controlada:
| Control | Resultado |
|---|---|
| fuente | mssql:mssql-sgc-ecommerce |
| query | SOURCE-003-VENTAS-VNEXT-TABLA2-AUTHORITY-V2 |
| flags | Tabla1=0, Tabla2=1, Tabla3=0, Tabla4=0, Tabla5=0, Tabla6=0 |
| resultsets | 1 |
| columnas | 68 |
| filas extraidas | 9760 |
| snapshot local | C:\APV\openclawai\snapshots\source-003\SOURCE-003-TABLA2-V2-2026-06-03_2026-06-09_20260611-123846-0300.csv |
| snapshot sha256 | 6ead2bb9c7c1f23d3acb7aa49bdcb7ca66ea2fc663874f03fb0a4039ebf97072 |
Agregados pre-carga del snapshot:
| Fecha | Filas | Importe total | CMV total |
|---|---|---|---|
2026-06-03 |
1863 |
48394136.33 |
39851397.6499 |
2026-06-04 |
1898 |
46358561.03 |
38137876.4891 |
2026-06-05 |
1656 |
43101489.39 |
35945901.1977 |
2026-06-06 |
1197 |
40082313.41 |
33434462.2491 |
2026-06-08 |
1261 |
24907990.17 |
19078909.1265 |
2026-06-09 |
1885 |
48121934.32 |
37881269.3026 |
| total | 9760 |
250966424.65 |
204329816.0149 |
Validacion pre-carga:
| Control | Resultado |
|---|---|
| headers esperados | PASS, 68/68 |
| fechas incluidas | 2026-06-03, 2026-06-04, 2026-06-05, 2026-06-06, 2026-06-08, 2026-06-09 |
| clientes unicos | 794 |
| vendedores unicos | 29 |
SKU unicos |
223 |
| comprobantes unicos | 2333 |
Hora vacia |
0 |
Hora formato invalido |
0 |
line_sequence_v1 particiones |
9758 |
line_sequence_v1 maximo |
2 |
empates en ORDER BY tecnico |
1 grupo / 2 filas |
duplicados line_key_v4 |
0 grupos / 0 filas |
| nulos criticos | 0 |
| importes negativos | 1286 |
| unidades negativas | 1286 |
CMV negativo |
1184 |
| notas de credito | 1286 |
CMV cero |
102 |
| decision pre-carga | PASS |
Comparacion pre-upsert contra destino:
| Control | Resultado |
|---|---|
| filas existentes en ventana | 1886 |
| filas extraidas que matchean identidad existente | 1885 |
| inserts candidatos | 7875 |
| updates por hash/valores cambiados | 25 |
unchanged con last_seen_at a refrescar |
1860 |
| filas existentes no vistas en esta corrida | 1 |
La fila existente no vista corresponde al comportamiento esperado de fuente
viva. Por restriccion de la corrida no se marco missing_from_source y no se
ejecuto hard delete.
18. Upsert y validacion post-carga¶
La carga se ejecuto en transaccion con staging temporal y
ON CONFLICT (tenant_id, line_key).
Resultado:
| Control | Resultado |
|---|---|
sync_batch_id |
e0aa281c-00ee-49ba-8119-1bfb91ff8ceb |
extracted_at / last_seen_at de corrida |
2026-06-11T12:38:46-03:00 |
| filas extraidas | 9760 |
| inserts | 7875 |
| updates por hash cambiado | 25 |
unchanged con last_seen_at refrescado |
1860 |
filas con sync_batch_id de corrida |
7900 |
filas con last_seen_at de corrida |
9760 |
| filas no vistas en ventana | 1 |
| filas totales finales | 9761 |
duplicados line_key finales |
0 |
source_row_hash nulo o vacio |
0 |
line_sequence_v1 nulo |
0 |
Filas finales por fecha:
| Fecha | Filas | Importe total | CMV total |
|---|---|---|---|
2026-06-03 |
1863 |
48394136.3300 |
39851397.6499 |
2026-06-04 |
1898 |
46358561.0300 |
38137876.4891 |
2026-06-05 |
1656 |
43101489.3900 |
35945901.1977 |
2026-06-06 |
1197 |
40082313.4100 |
33434462.2491 |
2026-06-08 |
1261 |
24907990.1700 |
19078909.1265 |
2026-06-09 |
1886 |
48087486.8300 |
37881269.3025 |
Comparacion contra snapshot usando filas observadas en esta corrida:
| Control | Snapshot | PostgreSQL observado | Estado |
|---|---|---|---|
| filas | 9760 |
9760 |
PASS |
| importe total | 250966424.65 |
250966424.6500 |
PASS |
CMV total |
204329816.0149 |
204329816.0149 |
PASS |
duplicados line_key |
0 |
0 |
PASS |
Performance:
| Etapa | Segundos |
|---|---|
| extraccion | 13.278 |
| transformacion | 2.223 |
| upsert | 3.475 |
| validacion post-carga | 0.088 |
Rollback:
| Control | Resultado |
|---|---|
| rollback tecnico previo | SI, primer intento de staging detenido antes de insertar por adaptacion UUID; no modifico destino |
| rollback de transaccion final | NO |
| datos quedaron cargados | SI |
19. Decision final actualizada¶
Decision final del piloto de ventana: VERDE.
Lectura:
- la ventana movil/backfill corto quedo probada sobre PostgreSQL local legacy
con
upsert,source_row_hashylast_seen_at SGCse uso en solo lectura y conTabla 2como unico resultset- no se tocaron
VPS,Docker,OpenClawniNPM - no se creo sync diaria, automatizacion, carga masiva ni produccion final
- no se borro ni movio ningun dato
- no se marco
missing_from_source gestion_de_negocios_corequeda documentada como ultimo piloto ampliado sobre esta DB antes de pasar a DB dedicada o sandboxVPSevaluado
20. Proximo paso unico recomendado actualizado¶
No ejecutar otro piloto ampliado sobre gestion_de_negocios_core. El proximo
paso recomendado es preparar una DB dedicada local
openclaw_business_observer_dev o evaluar formalmente un sandbox VPS antes
de cualquier nueva carga, sync diaria, carga masiva o produccion final.
21. Intento de entorno local dedicado - 2026-06-11¶
Se intento preparar la DB local dedicada
openclaw_business_observer_dev para que el piloto de ventana movil ya no
dependa de gestion_de_negocios_core.
Resultado:
| Control | Resultado |
|---|---|
.env local existe |
PASS |
.env ignorado por Git |
PASS |
.env versionado por Git |
NO |
variables APV_LOCAL_POSTGRES_ADMIN_* presentes |
PASS |
admin SELECT 1 |
FAIL |
| clasificacion segura del fallo | authentication |
| DB dedicada creada | NO |
| roles dedicados creados | NO |
| permisos/default privileges configurados | NO |
filas 9761 migradas |
NO |
SOURCE-003 ejecutado |
NO |
gestion_de_negocios_core modificada |
NO |
VPS, Docker, OpenClaw, NPM tocados |
NO |
La evidencia completa queda en
docs/tenants/alpuntodeventa/business-observer/design/POSTGRES-LOCAL-DEV-ENVIRONMENT.md.
Proximo paso unico actualizado: corregir la credencial admin local
APV_LOCAL_POSTGRES_ADMIN_* sin exponer secretos y reintentar solo la
creacion del entorno dedicado antes de cualquier nueva carga o sync.