Saltar a contenido

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:

  • .env local existe, esta ignorado por Git y no esta versionado.
  • las variables APV_DESTINATION_POSTGRES_* y APV_SOURCE_002_MSSQL_* existen en .env; no se imprimieron valores ni connection strings.
  • PostgreSQL local respondio SELECT 1 con el destino esperado.
  • SGC MSSQL respondio SELECT 1 AS ok en conexion de solo lectura y cierre con rollback.
  • pg_dump existe en C:\Program Files\PostgreSQL\15\bin\pg_dump.exe.
  • pg_restore existe en C:\Program Files\PostgreSQL\15\bin\pg_restore.exe.
  • no se encontro pgpass.conf, .pgpass ni pg_service.conf utilizable.
  • 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-privileges sobre gestion_de_negocios_core fallo con permission denied for schema cobranzas, al intentar bloquear cobranzas.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_observer contiene 1 objeto visible para el rol local usado
  • exigir backup completo vuelve a depender de schemas no tocados por el piloto, como cobranzas
  • ampliar openclaw_writer para 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_v1
  • line_key_v4
  • source_row_hash_v1
  • sync_batch_id
  • extracted_at
  • last_seen_at
  • record_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_hash no nulo
  • line_sequence_v1 no nulo
  • sync_batch_id de corrida
  • importes por fecha
  • CMV por 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
  • PostgreSQL destino y SGC origen 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_writer no fue ampliado y no se creo un rol nuevo
  • no se ejecuto extraccion de la ventana 2026-06-03 a 2026-06-09
  • no se genero snapshot local de ventana
  • no se calcularon line_key_v4, line_sequence_v1 ni source_row_hash_v1
  • no se ejecuto INSERT, UPDATE, UPSERT, DELETE, missing_from_source ni rollback
  • los datos existentes del piloto previo quedaron cargados y sin cambios: 1886 filas de 2026-06-09

15. Cierre de etapa local PostgreSQL

Decision documentada al 2026-06-11:

  • gestion_de_negocios_core fue un entorno local valido para piloto acotado.
  • El aislamiento real fue por schema business_observer.
  • El estado final local conserva 1886 filas reales de 2026-06-09 en business_observer.source_003_sales_items.
  • El backup logico acotado a business_observer queda VERDE y 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_dev para futuros pilotos locales cuando haya aprobacion para crear bases, o evaluar formalmente el sandbox VPS.
  • 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_hash y last_seen_at
  • SGC se uso en solo lectura y con Tabla 2 como unico resultset
  • no se tocaron VPS, Docker, OpenClaw ni NPM
  • 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_core queda documentada como ultimo piloto ampliado sobre esta DB antes de pasar a DB dedicada o sandbox VPS evaluado

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.