Saltar a contenido

Project State - APV Business Observer

Fecha: 2026-06-19

Estado: SOURCE-003 MART LOCAL-DEV CERRADA / PRODUCTION DATA FOUNDATION ABIERTA EN DISENO / PRODUCCION Y SYNC DIARIA SIGUEN BLOQUEADAS

Scope: tenant

tenant_id: alpuntodeventa

Owner: Gabi / Carlos Canu

Estado actual

La capa documental especifica del Business Observer para alpuntodeventa queda creada.

Actualizacion 2026-06-19:

  • PDF-004G DDL business observer staging execution publicado: docs/tenants/alpuntodeventa/business-observer/production/PDF-004G-DDL-BUSINESS-OBSERVER-STAGING-EXECUTION.md;
  • resultado: DDL STAGING REAL EJECUTADO / VALIDACION POST-DDL PASS / NO SECRETS / SANDBOX INTACTO / PRODUCCION NO-GO;
  • scripts ejecutados: 001-create-database-and-roles.candidate.sql, 002-create-schema-and-permissions.candidate.sql, 003-validation-readonly-after-ddl.candidate.sql;
  • controles nuevos: SAFE POINT = 170d6520dfff967155d7c1879d03e7246ff9bb02, staging principal running healthy con HostConfig.PortBindings = {}, DB openclaw_business_observer_staging presente, schema business_observer presente, roles staging de negocio presentes y NOLOGIN, tablas creadas 0, DB prod ausente, sandbox running healthy;
  • decision: GO para preparar carga controlada inicial de SOURCE-003 en staging solo como candidate/preflight; produccion, sync diaria y pipelines siguen NO-GO sin autorizacion separada;

Actualizacion 2026-06-19:

  • PDF-004F DDL business observer staging candidate preflight publicado: docs/tenants/alpuntodeventa/business-observer/production/PDF-004F-DDL-BUSINESS-OBSERVER-STAGING-CANDIDATE-PREFLIGHT.md;
  • resultado: CANDIDATE PREFLIGHT PREPARADO / NO DDL / NO DML / NO SECRETS / GO PDF-004G SOLO CON AUTORIZACION EXPLICITA;
  • paquete SQL candidate: infra/business-observer/staging/postgres/ddl/PDF-004F/;
  • controles nuevos: SAFE POINT = d7cdadd552d2709c106b2a7831898dc43751ae89, staging principal running healthy con HostConfig.PortBindings = {}, backup baseline present, restore drill PASS documentado, sandbox running healthy, catalogo con transaction_read_only=on, DB openclaw_business_observer_staging ausente, schema business_observer ausente, roles staging de negocio ausentes;
  • decision: GO para PDF-004G solo con autorizacion explicita de DDL real; produccion, sync diaria y sandbox siguen NO-GO;

Actualizacion 2026-06-19:

  • PDF-004E staging Postgres restore drill publicado: docs/tenants/alpuntodeventa/business-observer/production/PDF-004E-STAGING-POSTGRES-RESTORE-DRILL.md;
  • resultado: RESTORE DRILL REAL EJECUTADO / CLEANUP COMPLETO / GO PDF-004F PREFLIGHT / NO-GO DDL EJECUCION / NO SECRETS / STAGING INTACT / SANDBOX INTACT;
  • controles nuevos: SAFE POINT = 8f0313d77d8bb64715d3fc98219edff44a44173c, backup baseline validado en /opt/backups/openclaw/business-observer-staging/postgres/baseline/20260619T170037Z/, archivo openclaw-bo-staging-postgres-baseline-20260619T170037Z.dump, tamano 1032 bytes, sha256 402dce45fe93936b12f17a54ee437d637b3c573d02a3ff5c506d83e48a3860c4, pg_restore --list = PASS total_lines=15 metadata_lines=15 toc_entries=0, entorno temporal aislado con red interna y sin host port binding, restore final pg_restore con exit_code=0, validacion temporal postgres 16.14, DB/schema/roles de negocio ausentes, cleanup completo sin recursos temporales remanentes, staging principal running healthy con HostConfig.PortBindings = {}, sandbox running healthy;
  • decision: GO para PDF-004F DDL business observer candidate/preflight; NO-GO para ejecucion DDL sin autorizacion explicita separada; produccion y sync diaria siguen NO-GO;

Actualizacion 2026-06-19:

  • PDF-004D staging Postgres backup baseline execution publicado: docs/tenants/alpuntodeventa/business-observer/production/PDF-004D-STAGING-POSTGRES-BACKUP-BASELINE-EXECUTION.md;
  • resultado: BASELINE BACKUP EJECUTADO / GO PDF-004E RESTORE DRILL / NO-GO DDL NEGOCIO / NO SECRETS / SANDBOX INTACT;
  • controles nuevos: SAFE POINT = ffc2b86ac75ef7ea2d5830226b3094e85b87794c, backup logico real fuera de Git en /opt/backups/openclaw/business-observer-staging/postgres/baseline/20260619T170037Z/, archivo openclaw-bo-staging-postgres-baseline-20260619T170037Z.dump, formato pg_dump -Fc sobre postgres, tamano 1032 bytes, sha256 402dce45fe93936b12f17a54ee437d637b3c573d02a3ff5c506d83e48a3860c4, permisos 700 para directorio y 600 para backup/checksum, pg_restore --list = PASS, staging running healthy, HostConfig.PortBindings = {}, sandbox running healthy, DB/schema/roles de negocio siguen ABSENT;
  • decision: GO para PDF-004E restore drill; NO-GO para PDF-004 DDL de negocio hasta restore drill y autorizacion explicita;

Actualizacion 2026-06-19:

  • PDF-004C staging Postgres real target read-only preflight publicado: docs/tenants/alpuntodeventa/business-observer/production/PDF-004C-STAGING-POSTGRES-REAL-TARGET-READONLY-PREFLIGHT.md;
  • resultado: READ-ONLY PREFLIGHT COMPLETADO / GO BACKUP-RESTORE BASELINE / NO-GO DDL NEGOCIO / NO SECRETS / SANDBOX INTACT;
  • controles nuevos: SAFE POINT = 04feb71ce2d1523e613bbf1ca678493648c95585, target real confirmado openclaw-business-observer-postgres-staging, hostname srv977009, health running healthy, red openclaw-bo-staging-internal, volumen openclaw_bo_postgres_staging_data, HostConfig.PortBindings = {}, secret file confirmado solo por stat con 600 root:root, acceso psql por socket interno con transaction_read_only = on, fingerprint no sensible real publicado, DBs visibles postgres, template0, template1, openclaw_business_observer_staging = ABSENT, openclaw_business_observer_prod = ABSENT, business_observer = ABSENT, roles staging de negocio ABSENT, openclaw-postgres-sandbox sigue healthy e intocado;
  • decision: GO para PDF-004D backup baseline real y PDF-004E restore drill; NO-GO para PDF-004 DDL de negocio hasta backup/restore real y autorizacion explicita;

Actualizacion 2026-06-19:

  • PDF-004B staging Postgres stack provisioning publicado: docs/tenants/alpuntodeventa/business-observer/production/PDF-004B-STAGING-POSTGRES-STACK-PROVISIONING.md;
  • resultado: PROVISIONED / HEALTHY / NO BUSINESS DDL / NO SECRETS / NO HOST PORT / SANDBOX INTACT;
  • controles nuevos: SAFE POINT = 7b07c6e4b7d856224f8ea1bc992c7762fc5d39c2, stack real creado en /opt/stacks/business-observer-staging, contenedor openclaw-business-observer-postgres-staging healthy, volumen openclaw_bo_postgres_staging_data creado, red openclaw-bo-staging-internal creada, secret file fuera de Git con 600 root:root, .env runtime con 600 root:root, bootstrap catalog postgres, host port 5432 no publicado, openclaw_business_observer_staging = ABSENT, business_observer = ABSENT, roles staging de negocio ABSENT, openclaw-postgres-sandbox sigue healthy;
  • decision: la infraestructura staging real ya existe; PDF-004 DDL, produccion y sync diaria siguen bloqueados hasta tarea separada;

Actualizacion 2026-06-19:

  • PDF-004A staging Postgres stack preflight plan publicado: docs/tenants/alpuntodeventa/business-observer/production/PDF-004A-STAGING-POSTGRES-STACK-PREFLIGHT-PLAN.md;
  • resultado: PREFLIGHT + PLAN OPERATIVO + CANDIDATES / NOT EXECUTED / NO SECRETS / PDF-004B PENDING GO;
  • controles nuevos: SAFE POINT = ba941b6562de20e8a65c830aef2c6b2fa8573b73, preflight read-only del VPS srv977009, Docker 29.5.2, disco / con 69G libres, memoria disponible 5.9Gi, openclaw-postgres-sandbox confirmado existente pero excluido como staging real, container propuesto openclaw-business-observer-postgres-staging ausente, volumen openclaw_bo_postgres_staging_data ausente, red openclaw-bo-staging-internal ausente, ruta /opt/stacks/business-observer-staging ausente, sin publicacion host 5432 requerida;
  • candidates creados: infra/business-observer/staging/postgres/docker-compose.business-observer-staging.candidate.yml, infra/business-observer/staging/postgres/.env.business-observer-staging.example;
  • decision: PDF-004B queda pendiente de GO separado y PDF-004 DDL, produccion y sync diaria siguen bloqueados;

Actualizacion 2026-06-19:

  • PDF-003F-B staging fingerprint read-only evidence publicado: docs/tenants/alpuntodeventa/business-observer/production/PDF-003F-B-STAGING-FINGERPRINT-READONLY-EVIDENCE.md;
  • resultado: BLOCKED / READ-ONLY EVIDENCE / NO DDL / NO SECRETS / PDF-004 SIGUE NO-GO;
  • controles nuevos: SAFE POINT = 3656f5ae185520bfa5e038467d9e383102fbf940, ultimo commit docs: record business observer staging target intake, no existe en el workspace evidencia verificable de target real separado de openclaw-postgres-sandbox, no existe en el workspace evidencia verificable de acceso read-only seguro reutilizable, fingerprint real publicable NO DISPONIBLE, alias business-observer-staging-db, DB openclaw_business_observer_staging, schema business_observer y roles logicos staging quedan solo como DECLARADOS / NO VERIFICADOS, DB/schema/roles = UNVERIFIED / BLOCKED, backup/restore baseline real = PENDIENTE / BLOCKED, observabilidad minima operativa = BLOCKED, confirmacion publicada de NO POSTGRES TOUCH, NO SQL, NO DATABASE CHANGES;
  • decision: no corresponde abrir PDF-003F-C ni PDF-004 hasta contar con target real verificable y acceso read-only seguro verificable;

Actualizacion 2026-06-19:

  • PDF-003F-A staging target non-sensitive intake publicado: docs/tenants/alpuntodeventa/business-observer/production/PDF-003F-A-STAGING-TARGET-NON-SENSITIVE-INTAKE.md;
  • resultado: NON-SENSITIVE INTAKE / NO RUNTIME CHANGE / NO SECRETS / PDF-004 SIGUE NO-GO;
  • controles nuevos: SAFE POINT = fa437a748eb7a1694335d1505f111450575bd133, ultimo commit docs: prepare business observer staging target handoff, intake documental publicado con alias no sensible business-observer-staging-db, DB openclaw_business_observer_staging, schema business_observer, responsable operativo APV / OpenClaw Ops, roles logicos, politica de backup, restore drill, observabilidad minima y exclusion explicita de passwords, connection strings, tokens, LOGIN reales sensibles, IPs privadas sensibles y rutas internas sensibles, confirmacion documental publicada de que openclaw-postgres-sandbox no debe usarse como staging real;
  • decision: el siguiente safe point natural es PDF-003F-B para publicar fingerprint no sensible y evidencia documental minima de acceso read-only seguro; PDF-004 sigue NO-GO;

Actualizacion 2026-06-19:

  • PDF-003F blocker staging target operational handoff publicado: docs/tenants/alpuntodeventa/business-observer/production/PDF-003F-BLOCKER-STAGING-TARGET-OPERATIONAL-HANDOFF.md;
  • resultado: HANDOFF / NO RUNTIME CHANGE / PDF-003F SIGUE BLOCKED / PDF-004 SIGUE NO-GO;
  • controles nuevos: SAFE POINT = fdae53fcd446cb7ce33ae918aa8d8f213ee680ea, ultimo commit docs: prepare business observer staging backup restore runbook, handoff operativo publicado para completar fuera de Git: target elegido, alias no sensible del host o servicio, metodo de acceso publicable, DB name, roles logicos, responsable operativo, ventana de cambio, backup location no sensible, restore drill target y monitoreo minimo, politica explicita publicada de no pegar en Git ni en ChatGPT: passwords, connection strings, tokens, LOGIN reales sensibles ni IPs privadas sensibles, checklist publicado para volver solo con datos no sensibles;
  • decision: no corresponde abrir el nuevo preflight real de PDF-003F ni PDF-004 mientras siga faltando target real separado del sandbox, fingerprint publicable, acceso seguro y baseline operativa minima;

Actualizacion 2026-06-19:

  • PDF-003E staging backup restore runbook candidate publicado: docs/tenants/alpuntodeventa/business-observer/production/PDF-003E-STAGING-BACKUP-RESTORE-RUNBOOK-CANDIDATE.md;
  • resultado: RUNBOOK CANDIDATE / NOT EXECUTED / STAGING-VPS ONLY / PDF-004 SIGUE NO-GO;
  • controles nuevos: SAFE POINT = f615b777576b9f9d89254548b28d484fb556feac, ultimo commit docs: record business observer staging target decision, runbook marcado como NO SECRETS y REQUIRES EXPLICIT AUTHORIZATION, prerequisitos publicados: target real definido, fingerprint real publicado, acceso seguro fuera de Git, responsable operativo, ventana de cambio y storage de backups fuera de Git, politica candidata de backup publicada con pg_dump custom format, naming sin secretos, checksum SHA256, retencion minima sugerida y evidencia requerida, restore drill candidate publicado con destino separado, criterio PASS/FAIL, validaciones post-restore y evidencia requerida, observabilidad minima publicada: backup age, restore drill age, backup size, last backup status, last restore drill status, comandos candidatos publicados solo como placeholders seguros;
  • decision: no corresponde abrir PDF-003F ni PDF-004 hasta que exista target real, fingerprint real, baseline operativa de backup y restore drill con evidencia real PASS;

Actualizacion 2026-06-19:

  • PDF-003D staging target provisioning decision record publicado: docs/tenants/alpuntodeventa/business-observer/production/PDF-003D-STAGING-TARGET-PROVISIONING-DECISION-RECORD.md;
  • resultado: DECISION RECORD / NO RUNTIME CHANGE / PDF-004 SIGUE NO-GO;
  • controles nuevos: SAFE POINT = 3a3bd0f674b5cf73b367fea91185f8fcac991827, ultimo commit docs: define business observer staging prerequisites, problema consolidado: no existe staging real y solo hay sandbox visible, decision recomendada: staging real separado del sandbox, NO USAR openclaw-postgres-sandbox COMO STAGING REAL, prod-vps futura separada, naming aprobado: openclaw_business_observer_staging, openclaw_business_observer_prod, business_observer, informacion que debe quedar fuera de Git publicada: endpoint real, host/puerto no publico, credenciales, passwords, connection strings, roles LOGIN reales si aplican, criterios GO/NO-GO publicados para reabrir PDF-003;
  • decision: no corresponde reabrir PDF-003 ni abrir PDF-004 mientras el target real no exista, no tenga fingerprint real y siga existiendo dependencia del sandbox;

Actualizacion 2026-06-19:

  • PDF-003C staging prerequisites backup restore access publicado: docs/tenants/alpuntodeventa/business-observer/production/PDF-003C-STAGING-PREREQUISITES-BACKUP-RESTORE-ACCESS.md;
  • resultado: PREREQUISITOS OPERATIVOS DEFINIDOS / TARGET REAL TODAVIA NO PROVISIONADO / PDF-004 SIGUE NO-GO;
  • controles nuevos: SAFE POINT = c8120e31915dd1af0ec048d4e6c12684e3a875ae, ultimo commit docs: define business observer staging target, target real de staging-vps sigue requerido pero aun no provisionado, informacion obligatoria fuera de Git publicada: host/servicio real, puerto/conectividad, nombre DB, roles LOGIN si aplican, secretos fuera de Git, responsable operativo, fingerprint exacto requerido antes de cualquier DDL, politica minima de acceso publicada para owner/admin, writer, reader, reporting_ro, sin SUPERUSER para aplicacion y sin DELETE para writer salvo decision futura explicita, backup previo obligatorio, restore drill obligatorio, observabilidad minima, rollback/restore esperado y checklist GO/NO-GO publicados;
  • decision: no corresponde reabrir PDF-003 ni ejecutar PDF-004 hasta cerrar target real, provisioning, acceso, backup/restore y observabilidad del ambiente correcto;

Actualizacion 2026-06-19:

  • PDF-003B staging target definition publicado: docs/tenants/alpuntodeventa/business-observer/production/PDF-003B-STAGING-TARGET-DEFINITION.md;
  • resultado: TARGET DEFINITION ONLY / PDF-004 SIGUE NO-GO / CERO CAMBIOS RUNTIME;
  • controles nuevos: SAFE POINT = a2b1aa44bda1075fb536e2b8db60a4ce41f23331, ultimo commit docs: preflight business observer staging ddl, problema consolidado desde PDF-003: solo existe/visible openclaw-postgres-sandbox, openclaw_business_observer_staging = NO, openclaw_business_observer_prod = NO, roles staging reales ausentes, backup/restore especifico de staging aun ausente, decision recomendada NO USAR openclaw-postgres-sandbox COMO STAGING REAL, target recomendado staging-vps real separado del sandbox con DB openclaw_business_observer_staging, schema business_observer, roles staging dedicados, backup/restore y acceso propios, prerequisitos publicados para cualquier futuro DDL, checklist GO publicado para reintentar PDF-003;
  • decision: PDF-004 staging DDL execution sigue bloqueado hasta cerrar target real, fingerprint, backup, restore, roles y acceso del ambiente correcto;

Actualizacion 2026-06-19:

  • PDF-003 staging DDL preflight read-only publicado: docs/tenants/alpuntodeventa/business-observer/production/PDF-003-STAGING-DDL-PREFLIGHT-READONLY.md;
  • resultado: PREFLIGHT READ-ONLY COMPLETADO / PDF-004 NO-GO / CERO CAMBIOS;
  • controles nuevos: SAFE POINT = 7838b1061b4c9f290a501eb6924b94507d2339d2, ultimo commit docs: prepare business observer staging ddl candidate, acceso read-only seguro por ssh openclaw-vps + docker exec openclaw-postgres-sandbox psql -U openclaw_admin -d openclaw_sandbox, fingerprint observable srv977009|openclaw-postgres-sandbox|172.24.0.3:5432|no-host-port-binding|openclaw_sandbox|openclaw_admin|PostgreSQL 16.14, DB target openclaw_business_observer_staging = NO, DB futura prod openclaw_business_observer_prod = NO, schema business_observer = NO en el cluster visible, roles staging target ausentes, conflictos de naming ausentes, PUBLIC con privilegios por defecto en el sandbox visible, backup/restore especifico de la futura DB staging aun ausente;
  • decision: el entorno sigue CANDIDATE-ONLY / SANDBOX-VISIBLE; no corresponde abrir PDF-004 staging DDL execution hasta definir DB target real, backup/restore y un nuevo preflight sobre la instancia correcta;

Actualizacion 2026-06-19:

  • PDF-002 staging DB roles/schemas DDL candidate publicado: docs/tenants/alpuntodeventa/business-observer/production/PDF-002-STAGING-DB-ROLES-SCHEMAS-DDL-CANDIDATE.md;
  • SQL candidate no ejecutado publicado: docs/tenants/alpuntodeventa/business-observer/production/sql/PDF-002-staging-db-roles-schemas-candidate.sql;
  • resultado: CANDIDATE PREPARADO / NOT EXECUTED / STAGING-VPS ONLY;
  • controles nuevos: SAFE POINT = 45aaa51a2ff85462a485b841863f0e28c2794dff, ultimo commit docs: plan business observer production data foundation, DB staging recomendada openclaw_business_observer_staging, DB futura prod recomendada openclaw_business_observer_prod, schema recomendado business_observer, roles candidatos openclaw_bo_staging_owner, openclaw_bo_staging_writer, openclaw_bo_staging_reader, openclaw_bo_staging_reporting_ro, roles de grupo NOLOGIN, PUBLIC sin privilegios, ownership exclusivo del owner, sin passwords en SQL, sin SUPERUSER, sin CREATEDB, sin CREATEROLE, fingerprint esperado para PDF-003 documentado;
  • decision: la fundacion staging-vps ya tiene paquete candidato de naming, roles y schema, pero sigue sin ejecucion; el siguiente paso correcto pasa a ser PDF-003 staging DDL preflight en modo read-only y con autorizacion separada;

  • intake oficial de Production Data Foundation / staging VPS publicado: docs/tenants/alpuntodeventa/business-observer/production/PRODUCTION-DATA-FOUNDATION-INTAKE-001.md;

  • resultado: FOUNDATION DESIGN ONLY / STAGING-VPS PLANIFICADO / SIN CAMBIOS RUNTIME;
  • controles nuevos: SAFE POINT = 33d28a11b66ce071a2a60b3f7662e4a358ee29f4, ultimo commit docs: close source 003 mart local dev, ambientes propuestos local-dev, staging-vps, prod-vps futuro, criterio formal de no llamar produccion a un entorno sin backups + restore + monitoreo + idempotencia, fuentes por fases SOURCE-003 -> SOURCE-001 -> SOURCE-002 -> futuras, modelo esperado RAW -> CORE -> MART, daily sync = BLOCKED hasta cierre de staging;
  • decision: el siguiente frente oficial del tenant deja de ser otra tarea local-dev y pasa a ser la fundacion staging-vps; no corresponde crear DB, roles, schemas, tablas ni ejecutar SQL dentro de esta etapa;

  • cierre formal de SOURCE-003 MART local-dev publicado: docs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-BUILD-MART-LOCAL-DEV-CLOSURE-001.md;

  • resultado: CERRADA / LOCAL-DEV COMPLETO / SIN ESCRITURAS NUEVAS;
  • controles nuevos: SAFE POINT = 36b23814021a02f3a5f3aa06aacf654ca45104c5, ultimo commit docs: add source 003 mart rollback candidate, fingerprint aprobado, postgres-sandbox ausente, RAW = 1886, CORE = 1886, MART = 1/25/173/180, batch autorizado presente en MART = 1/25/173/180, filas fuera del batch autorizado 0/0/0/0, duplicados por grain 0/0/0/0, rollback candidate publicado y no ejecutado;
  • decision: el hito SOURCE-003 MART local-dev queda cerrado formalmente; el proximo paso recomendado pasa a ser Production Data Foundation / staging VPS, manteniendo produccion, sync diaria y scheduler bloqueados;

  • rollback candidate de SOURCE-003 build-mart publicado: docs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-BUILD-MART-ROLLBACK-CANDIDATE-001.md;

  • SQL candidate no ejecutado publicado: docs/tenants/alpuntodeventa/business-observer/design/sql/008_source_003_build_mart_rollback_candidate.sql;
  • resultado: CANDIDATE / NOT EXECUTED / LOCAL-DEV ONLY / REQUIRES EXPLICIT AUTHORIZATION;
  • controles nuevos: SAFE POINT = d9b302ce7ad71b590a53f9ee8392e117d24dcc17, ultimo commit docs: validate source 003 mart idempotency execution, batch autorizado 1827f887-9499-4579-b4f3-234d54f41f7f, rollback limitado solo a mart_source_003_sales_by_sku, mart_source_003_sales_by_customer, mart_source_003_sales_by_seller, mart_source_003_sales_daily, orden de borrado sku -> customer -> seller -> daily, prechecks documentados MART = 1/25/173/180, filas fuera del batch 0/0/0/0, duplicados por grain 0/0/0/0, post-checks documentados MART = 0/0/0/0, RAW = 1886, CORE = 1886, transaccion unica y ROLLBACK automatico ante cualquier diferencia;
  • decision: el rollback queda solo como candidate versionado; no corresponde ejecutarlo dentro de esta tarea y el estado actual queda preservado en RAW = 1886, CORE = 1886, MART = 1/25/173/180;

Actualizacion 2026-06-18:

Actualizacion 2026-06-18:

  • prueba real de idempotencia local-dev de SOURCE-003 build-mart publicada: docs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-BUILD-MART-IDEMPOTENCY-EXECUTION-001.md;
  • resultado: BLOCKED / SIN ESCRITURAS NUEVAS / IDEMPOTENCIA VALIDADA EN LOCAL-DEV;
  • controles nuevos: SAFE POINT = 3f491d80f9d633aaf8ed835c54e1a4fcf2d06dab, ultimo commit docs: preflight source 003 mart idempotency, python -m py_compile scripts/source_003_importer.py = PASS, build-mart = FAIL esperado post-write porque MART ya existe, fingerprint aprobado, postgres-sandbox ausente, RAW = 1886, CORE = 1886, MART = 1/25/173/180, duplicados por grain 0/0/0/0, filas fuera del batch autorizado 0/0/0/0, comando real con doble gate correcto ejecutado exactamente una vez, result = BLOCKED, db_write_attempted = false, transaction_committed = false, data_persisted = false, motivo runtime exacto MART daily row_count 1 != 0, MART seller row_count 25 != 0, MART customer row_count 173 != 0, MART sku row_count 180 != 0;
  • decision: la prueba real de idempotencia queda validada sin persistencia nueva; el retry autorizado sobre MART ya cargada termina BLOCKED y no corresponde reejecutarlo;

  • preflight read-only para futura idempotencia de SOURCE-003 build-mart publicado: docs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-BUILD-MART-IDEMPOTENCY-PREFLIGHT-001.md;

  • resultado: PASS / READ-ONLY IDEMPOTENCY PREFLIGHT / EXECUTE SIGUE BLOQUEADO;
  • controles nuevos: SAFE POINT = 8fab80e6af932ec3d6f32df3c8f109f251ce1f2d, ultimo commit docs: review source 003 mart first persistence, python -m py_compile scripts/source_003_importer.py = PASS, build-mart = FAIL esperado post-write porque MART ya existe, los tres comandos build-mart --execute... pedidos por la consigna no se ejecutaron por prohibicion explicita y quedaron auditados por revision de codigo como BLOCKED, fingerprint aprobado, postgres-sandbox ausente, RAW = 1886, CORE = 1886, MART = 1/25/173/180, duplicados por grain 0/0/0/0, filas fuera del batch autorizado 0/0/0/0, filas del batch autorizado ya existentes en MART = 1/25/173/180, condicion exacta de bloqueo esperada MART inicial no esta vacia: daily=1 seller=25 customer=173 sku=180;
  • decision: cualquier futura prueba de idempotencia con doble gate correcto deberia terminar BLOCKED/ABORTED antes de INSERT; no corresponde reejecutarla dentro de esta tarea;

  • review read-only post-write de SOURCE-003 build-mart publicada: docs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-BUILD-MART-POST-WRITE-REVIEW-001.md;

  • resultado: PASS / READ-ONLY POST-WRITE REVIEW / NO DB WRITES;
  • controles nuevos: SAFE POINT = 10cbf63e165428847ad954a0bd0b7e891924750d, ultimo commit docs: record source 003 mart first persistence, python -m py_compile scripts/source_003_importer.py = PASS, build-mart = FAIL esperado en post-write porque MART ya no esta vacia, build-mart --execute = NO EJECUTADO, fingerprint aprobado, postgres-sandbox ausente, RAW = 1886, CORE = 1886, MART = 1/25/173/180, duplicados por grain 0/0/0/0, filas fuera del batch autorizado 0/0/0/0;
  • comparacion MART vs CORE: units, neto, bruto, CMV y contribution empatan con tolerancia 0.0001, document_count diario 428 = 428;
  • decision: la persistencia real queda auditada correctamente en solo lectura; cualquier prueba de idempotencia o rollback sigue fuera de alcance y requiere tarea separada;

  • primera persistencia real local-dev de SOURCE-003 build-mart publicada: docs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-BUILD-MART-FIRST-PERSISTENCE-001.md;

  • resultado: PASS / FIRST REAL LOCAL-DEV PERSISTENCE COMMITTED / NO REHEARSAL;
  • controles nuevos: SAFE POINT = 4ee4cb42ce0ab3b8c8c750ee4b324116153ef8b9, python -m py_compile scripts/source_003_importer.py = PASS, build-mart = DRY_RUN, fingerprint aprobado, postgres-sandbox ausente, preflight RAW = 1886, CORE = 1886, MART = 0/0/0/0, estimates 1/25/173/180, constraints MART = 43/43, indices MART = 12/12, duplicados por grain 0/0/0/0, filas preexistentes del batch en MART = 0/0/0/0;
  • evidencia runtime: python scripts/source_003_importer.py build-mart --execute --confirm-local-dev-write SOURCE003_MART_LOCAL_DEV_1886 --commit-local-dev-write SOURCE003_MART_LOCAL_DEV_COMMIT_1886 devuelve PASS con execution_status = COMMITTED, transaction_committed = true, data_persisted = true, rollback_rehearsal = false;
  • estado observado: BEFORE = RAW 1886 / CORE 1886 / MART 0/0/0/0, INSIDE_TX = 1/25/173/180, AFTER_COMMIT = RAW 1886 / CORE 1886 / MART 1/25/173/180;
  • verificacion posterior: sin duplicados por batch/grain en MART, sin filas fuera del batch autorizado en MART, RAW y CORE preservados en 1886;
  • decision: la primera persistencia real local-dev queda completada y certificada; produccion y sync diaria siguen bloqueadas, y cualquier prueba de idempotencia o rollback queda para otra tarea separada;

  • auditoria final GO/NO-GO antes de la primera persistencia real local-dev para SOURCE-003 build-mart publicada: docs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-BUILD-MART-PERSISTENCE-GO-NOGO-001.md;

  • resultado: GO LOCAL-DEV CONDICIONAL / SIN EJECUTAR PERSISTENCIA EN ESTA TAREA;
  • controles nuevos: SAFE POINT = a274bc02e62d82175a13c55915718dff8d4cbaff, python -m py_compile scripts/source_003_importer.py = PASS, build-mart = DRY_RUN, build-mart --execute = BLOCKED, WRONG_TOKEN = BLOCKED, token real sin --commit-local-dev-write sigue BLOCKED, commit flag incorrecto sigue BLOCKED;
  • evidencia runtime read-only: fingerprint DB aprobado, postgres-sandbox ausente, RAW = 1886, CORE = 1886, MART = 0/0/0/0, estimates 1/25/173/180, filas preexistentes del batch en MART = 0/0/0/0, duplicados de salida por grain 0/0/0/0, constraints MART = 43/43, indices MART = 12/12;
  • decision: queda GO solo para una futura tarea separada de persistencia real local-dev con doble gate correcto y evidencia propia; produccion y sync diaria siguen bloqueadas;

  • post-commit-gate rehearsal para SOURCE-003 build-mart --execute publicado: docs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-BUILD-MART-POST-COMMIT-GATE-REHEARSAL-001.md;

  • resultado: PASS / ROLLED_BACK / SIN DATOS PERSISTIDOS;
  • controles nuevos: SAFE POINT = 4032fb837cd75e7602b9ce5bf9b70b459d34964e, build-mart sigue DRY_RUN, build-mart --execute sigue BLOCKED, token real sin rollback ni commit sigue BLOCKED, commit flag incorrecto sigue BLOCKED, --rollback-rehearsal y --commit-local-dev-write siguen mutuamente excluyentes;
  • evidencia runtime: python scripts/source_003_importer.py build-mart --execute --confirm-local-dev-write SOURCE003_MART_LOCAL_DEV_1886 --rollback-rehearsal devuelve PASS con execution_status = ROLLED_BACK, db_write_attempted = true, data_persisted = false, rollback_rehearsal = true, transaction_committed = false;
  • estado preservado: BEFORE = RAW 1886 / CORE 1886 / MART 0/0/0/0, INSIDE_TX = 1/25/173/180, AFTER_ROLLBACK = RAW 1886 / CORE 1886 / MART 0/0/0/0;
  • decision: el segundo gate de commit no rompio el rehearsal y cualquier persistencia real sigue fuera de alcance en esta tarea;

  • commit gate mode para SOURCE-003 build-mart --execute publicado: docs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-BUILD-MART-COMMIT-GATE-001.md;

  • resultado: SEGUNDO GATE IMPLEMENTADO / NO EJECUTADO / SIN PERSISTENCIA;
  • controles nuevos: flag futuro --commit-local-dev-write SOURCE003_MART_LOCAL_DEV_COMMIT_1886, persistencia futura solo con ambos tokens correctos, bloqueo si el token real se usa sin commit flag y sin rehearsal, y exclusividad mutua entre --rollback-rehearsal y --commit-local-dev-write;
  • evidencia runtime: python scripts/source_003_importer.py build-mart sigue devolviendo DRY_RUN; python scripts/source_003_importer.py build-mart --execute devuelve BLOCKED; python scripts/source_003_importer.py build-mart --execute --confirm-local-dev-write SOURCE003_MART_LOCAL_DEV_1886 devuelve BLOCKED; python scripts/source_003_importer.py build-mart --execute --confirm-local-dev-write SOURCE003_MART_LOCAL_DEV_1886 --commit-local-dev-write WRONG_TOKEN devuelve BLOCKED;
  • estado preservado: RAW = 1886, CORE = 1886, MART daily/seller/customer/sku = 0/0/0/0;
  • decision: el write path queda listo para un COMMIT futuro local-dev, pero esta tarea no autoriza ejecutarlo;

  • rollback rehearsal mode para SOURCE-003 build-mart --execute publicado: docs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-BUILD-MART-ROLLBACK-REHEARSAL-001.md;

  • resultado: PASS / ROLLED_BACK / SIN DATOS PERSISTIDOS;
  • controles nuevos: flag obligatorio --rollback-rehearsal, token real sin rehearsal sigue BLOCKED, fingerprint DB aprobado revalidado, bloqueo postgres-sandbox, revalidacion RAW = 1886, CORE = 1886, MART = 0/0/0/0, inserts reales dentro de transaccion con rowcounts 1/25/173/180 y ROLLBACK forzado;
  • evidencia runtime: python scripts/source_003_importer.py build-mart --execute --confirm-local-dev-write SOURCE003_MART_LOCAL_DEV_1886 --rollback-rehearsal devuelve PASS con execution_status = ROLLED_BACK, db_write_attempted = true, data_persisted = false, rollback_rehearsal = true;
  • estado preservado: BEFORE = 0/0/0/0, INSIDE_TX = 1/25/173/180, AFTER_ROLLBACK = 0/0/0/0, con RAW = 1886 y CORE = 1886;
  • decision: el ensayo valida la write path real pero no autoriza COMMIT; cualquier gate persistente futuro sigue separado y no aprobado;

  • implementacion en Python del write path futuro para SOURCE-003 build-mart --execute publicada: docs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-BUILD-MART-WRITE-PATH-IMPLEMENTATION-001.md;

  • resultado: IMPLEMENTADO EN PYTHON / NO EJECUTADO / SIN ESCRITURA DB;
  • controles nuevos: gate duro --confirm-local-dev-write, token requerido SOURCE003_MART_LOCAL_DEV_1886, fingerprint DB obligatorio, abort si postgres-sandbox, transaccion unica, revalidacion intra-transaccion, inserts en orden daily -> seller -> customer -> sku, rowcounts esperados 1/25/173/180 y rollback total;
  • evidencia runtime: python scripts/source_003_importer.py build-mart sigue devolviendo DRY_RUN; python scripts/source_003_importer.py build-mart --execute devuelve BLOCKED; python scripts/source_003_importer.py build-mart --execute --confirm-local-dev-write WRONG_TOKEN devuelve BLOCKED;
  • seguridad: no se uso el token real, no hubo INSERT, COPY, UPDATE, DELETE, no se modifico RAW, CORE ni MART, no se genero CSV, no hubo runner, rollback real, produccion ni sync diaria;
  • estado preservado: RAW = 1886, CORE = 1886, MART daily/seller/customer/sku = 0/0/0/0, estimates 1/25/173/180;

  • gate documental del write path futuro para SOURCE-003 build-mart --execute publicado: docs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-BUILD-MART-WRITE-PATH-GATE-001.md;

  • SQL candidato opcional no ejecutado publicado: docs/tenants/alpuntodeventa/business-observer/design/sql/007_source_003_build_mart_write_path_candidate.sql;
  • resultado: GATE WRITE PATH DOCUMENTADO / NO IMPLEMENTADO / NO EJECUTADO;
  • controles nuevos: fingerprint DB obligatorio, abort si postgres-sandbox, revalidacion intra-transaccion de RAW = 1886, CORE = 1886, MART = 0/0/0/0 y estimates 1/25/173/180, abort si cualquier MART ya tiene filas para el mismo batch/grain, idempotencia por batch/grain, orden fijo de inserts daily -> seller -> customer -> sku, ROLLBACK total ante error y evidencia post-write minima esperada;
  • decision: el write path queda disenado pero no implementado; build-mart --execute sigue BLOCKED, produccion sigue bloqueada y la sync diaria sigue bloqueada;

  • preflight read-only para el siguiente paso de SOURCE-003 build-mart --execute publicado: docs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-BUILD-MART-EXECUTE-PREFLIGHT-001.md;

  • resultado: PASS / READ-ONLY PREFLIGHT / EXECUTE SIGUE BLOCKED;
  • evidencia runtime: python scripts/source_003_importer.py build-mart sigue devolviendo DRY_RUN, con fingerprint DB aprobado, business_observer.core_source_003_sales_items como source oficial, batch 1827f887-9499-4579-b4f3-234d54f41f7f, RAW = 1886, CORE = 1886, las cuatro tablas MART en 0 filas y estimates confirmadas 1 diaria, 25 por vendedor, 173 por cliente y 180 por SKU;
  • seguridad: python scripts/source_003_importer.py build-mart --execute sigue devolviendo BLOCKED; no hubo escrituras, no hubo INSERT, COPY, UPDATE, DELETE, no se modifico RAW, CORE ni MART, no se genero CSV, no hubo runner, rollback, VPS, Docker, OpenClaw, NPM, Portainer, push ni deploy;
  • controles nuevos: constraints e indices reales de MART revalidados en DB, sin postgres-sandbox, sin duplicados de salida por batch/grain y sin filas existentes del mismo batch en MART;
  • decision: el siguiente paso sigue siendo una tarea separada para gate/idempotencia y write-path de build-mart --execute; esta evidencia no autoriza escrituras.

Actualizacion 2026-06-17:

  • implementacion safe mode de SOURCE-003 build-mart publicada: docs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-IMPORTER-BUILD-MART-SAFE-MODE-001.md;
  • resultado: BUILD-MART SAFE MODE IMPLEMENTADO / DRY_RUN PASS / EXECUTE BLOCKED;
  • evidencia runtime: python scripts/source_003_importer.py build-mart valida fingerprint DB aprobado, CORE source business_observer.core_source_003_sales_items, batch 1827f887-9499-4579-b4f3-234d54f41f7f, CORE total rows = 1886, CORE batch rows = 1886, y las cuatro MART target existentes con row_count = 0; estima 1 fila diaria, 25 por vendedor, 173 por cliente y 180 por SKU, sin claves vacias observadas;
  • seguridad: build-mart --execute queda BLOCKED, postgres-sandbox sigue prohibido, db_write=false, data_written=false, sync_enabled=false; no hubo INSERT, COPY, UPDATE, DELETE, carga MART, modificacion RAW/CORE, runner, CSV, VPS, Docker, OpenClaw, NPM, Portainer, push ni deploy.

  • review documental post-forward MART local-dev de SOURCE-003 publicada: docs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-MART-DDL-LOCAL-DEV-POST-FORWARD-REVIEW.md;

  • resultado: MART LOCAL-DEV POST-FORWARD REVIEW PASS / APTO PARA IMPLEMENTAR BUILD-MART SAFE MODE / NO APTO PARA PRODUCCION / NO APTO PARA SYNC DIARIA;
  • evidencia consolidada: forward local-dev ejecutado correctamente, cuatro tablas MART existentes y vacias, RAW final business_observer.raw_source_003_sales_items = 1886, CORE business_observer.core_source_003_sales_items = 1886, tabla piloto business_observer.source_003_sales_items distinguida como PILOTO, y owner/grants/constraints/indexes ya validados por evidencia previa;
  • alcance preservado: no hubo carga MART, no hubo build-mart, no hubo produccion, no hubo sync diaria, no se modifico Python, no se ejecuto SQL ni psql, no se toco PostgreSQL, no se generaron CSV, no hubo runner, VPS, Docker, OpenClaw, NPM, Portainer, push ni deploy;
  • riesgos vigentes: territory_key no implica vendedor responsable; CMV, costos y contribution_amount mantienen advertencia semantica; dashboards y consultas LLM productivas siguen bloqueadas.

Actualizacion 2026-06-16:

  • preflight local-dev del paquete DDL MART candidato de SOURCE-003 ejecutado: docs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-MART-DDL-LOCAL-DEV-PREFLIGHT-001.md;
  • resultado: PREFLIGHT PASS / DDL MART FORWARD NO EJECUTADO;
  • controles confirmados: DB openclaw_business_observer_dev, schema business_observer, roles requeridos, CORE source table business_observer.core_source_003_sales_items, CORE total 1886, batch piloto 1827f887-9499-4579-b4f3-234d54f41f7f con 1886 filas, campos criticos malos 0, duplicados 0, cuatro MART candidatas ausentes y PUBLIC sin privilegios;
  • seguridad: se ejecuto solo 006_source_003_mart_ddl_candidate_preflight.sql; no se ejecuto forward, rollback, post-checks, CREATE TABLE, DML, Python, runner, CSV, sync, VPS, Docker, OpenClaw, NPM, Portainer, push ni deploy; RAW, CORE y MART real no fueron modificados y postgres-sandbox no fue usado.

  • revision tecnica del paquete DDL MART candidato de SOURCE-003 publicada: docs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-MART-DDL-CANDIDATE-TECHNICAL-REVIEW.md;

  • resultado: APTO PARA PREFLIGHT LOCAL-DEV / NO APTO PARA PRODUCCION / NO APTO PARA SYNC DIARIA / NO APTO PARA BUILD-MART AUN;
  • controles confirmados: origen CORE business_observer.core_source_003_sales_items, batch piloto 1827f887-9499-4579-b4f3-234d54f41f7f, CORE 1886 filas, cuatro MART candidatas, owner openclaw_bo_admin, grants esperados, PUBLIC sin privilegios, writer sin DELETE, rollback que aborta si cualquier MART tiene filas y post-checks con row_count = 0;
  • seguridad: review documental sin ejecutar SQL, sin usar psql, sin tocar PostgreSQL, sin crear tablas reales, sin modificar Python, sin cargar datos, sin generar CSV, sin runner, sin tocar RAW/CORE/MART real, sin VPS, Docker, OpenClaw, NPM, Portainer, push ni deploy.

  • paquete DDL MART candidato de SOURCE-003 publicado: docs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-MART-DDL-CANDIDATE.md;

  • SQL candidatos: 006_source_003_mart_ddl_candidate_preflight.sql, 006_source_003_mart_ddl_candidate_forward.sql, 006_source_003_mart_ddl_candidate_rollback.sql, 006_source_003_mart_ddl_candidate_post_checks.sql;
  • objetivo: disenar tablas MART agregadas candidatas desde business_observer.core_source_003_sales_items, usando como referencia el batch piloto 1827f887-9499-4579-b4f3-234d54f41f7f y preservando CORE con 1886 filas;
  • alcance: business_observer.mart_source_003_sales_daily, business_observer.mart_source_003_sales_by_seller, business_observer.mart_source_003_sales_by_customer y business_observer.mart_source_003_sales_by_sku, con trazabilidad minima, metricas candidatas, owner openclaw_bo_admin, writer SELECT/INSERT/UPDATE sin DELETE, reader SELECT, PUBLIC sin privilegios, rollback que aborta si cualquier MART candidata tiene filas y post-checks con row_count = 0;
  • riesgos: territory_key no debe inferir vendedor responsable; CMV, costos y contribucion requieren revision semantica; no habilita dashboards, reportes ni consultas LLM productivas;
  • decision: DDL MART CANDIDATO / NO EJECUTADO / NO IMPLEMENTADO EN DB;
  • seguridad: no se ejecuto SQL, no se uso psql, no se toco PostgreSQL, no se crearon tablas reales, no se modifico Python, no se cargaron datos, no se genero CSV, no se ejecuto runner, no se toco RAW/CORE/MART real, no se uso VPS, Docker, OpenClaw, NPM, Portainer, push ni deploy.

  • plan documental del futuro SOURCE-003 build-mart publicado: docs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-IMPORTER-BUILD-MART-PLAN.md;

  • resultado: BUILD-MART PLAN DOCUMENTADO / NO IMPLEMENTADO / NO EJECUTADO;
  • base: CORE local-dev PASS, origen futuro business_observer.core_source_003_sales_items, batch 1827f887-9499-4579-b4f3-234d54f41f7f, 1886 filas RAW y 1886 filas CORE conciliadas;
  • alcance: MART V1 candidato para ventas por dia, vendedor, cliente, SKU/producto, zona/territorio si aplica y rentabilidad/CMV si aplica; define metricas, dimensiones, granularidad, trazabilidad, idempotencia, rebuild por batch, validaciones pre/post y relacion futura con dashboards, reportes y LLM;
  • conclusion: APTO PARA DISENAR DDL MART CANDIDATO / NO APTO PARA PRODUCCION / NO APTO PARA SYNC DIARIA;
  • seguridad: no se modifico Python, no se toco PostgreSQL, no se ejecuto SQL, no se crearon tablas, no se cargaron datos, no se genero CSV, no se ejecuto runner, no se toco RAW/CORE/MART real, no se uso VPS, Docker, OpenClaw, NPM, Portainer, push ni deploy.

  • promote real local-dev ejecutado para SOURCE-003 promote-core --execute: docs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-PROMOTE-CORE-LOCAL-DEV-EXECUTION-001.md;

  • resultado: PASS, data_written=true, inserted_rows=1886, CORE total 1886, CORE batch 1886, RAW batch sigue 1886;
  • controles: DB openclaw_business_observer_dev, RAW source business_observer.raw_source_003_sales_items, CORE target business_observer.core_source_003_sales_items, batch 1827f887-9499-4579-b4f3-234d54f41f7f, fingerprint aprobado, postgres-sandbox no usado;
  • post-checks: duplicados CORE 0, line_key vacio 0, source_row_hash vacio 0, promoted_at nulo 0, raw_loaded_at nulo 0, sync_enabled=false, produccion false;
  • idempotencia: reintento con el mismo batch quedo BLOCKED por CORE ya cargada, data_written=false, CORE final 1886;
  • seguridad: se corrigio el gate del importer para aceptar 0 como valor explicito en confirmaciones numericas; no se modifico RAW, no se toco MART, no se genero CSV, no hubo runner, VPS, Docker, OpenClaw, NPM, Portainer, push ni deploy.

  • write real local-dev implementado para SOURCE-003 promote-core --execute: docs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-PROMOTE-CORE-WRITE-IMPLEMENTATION-001.md;

  • resultado: promote-core conserva DRY_RUN; promote-core --execute sin confirmaciones y con confirmaciones incompletas queda BLOCKED; no se ejecutaron confirmaciones completas;
  • controles: write_path_enabled=true solo detras de confirmaciones completas, transaccion RAW -> CORE, INSERT controlado en CORE, sin modificar RAW, bloqueo por batch duplicado, rollback automatico ante error, fingerprint DB obligatorio, postgres-sandbox prohibido, id CORE deterministico gobernado, raw_loaded_at preservado y timestamps gobernados;
  • post-check esperado: CORE batch rows = 1886, CORE total rows = 1886, duplicates_core = 0, line_key vacio 0, source_row_hash vacio 0;
  • seguridad: data_written=false, sync_enabled=false; CORE conserva row_count = 0; no se modifico RAW, no se genero CSV, no hubo runner, rollback real, VPS, Docker, OpenClaw, NPM, Portainer, push ni deploy.

  • ruta futura de escritura preparada para SOURCE-003 promote-core --execute: docs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-PROMOTE-CORE-WRITE-PATH-IMPLEMENTATION-001.md;

  • resultado: promote-core conserva DRY_RUN; promote-core --execute sigue BLOCKED; future_write_path.write_path_prepared=true y future_write_path.write_path_enabled=false;
  • controles: fingerprint obligatorio, bloqueo postgres-sandbox, bloqueo de batch duplicado CORE, transaccion futura, idempotencia, preservacion de source_row_hash y line_key, post-check CORE batch rows = 1886, timestamps gobernados y rollback/rebuild documentado;
  • seguridad: db_write=false, data_written=false, sync_enabled=false; CORE conserva row_count = 0; no se modifico RAW, no se genero CSV, no hubo runner, rollback real, VPS, Docker, OpenClaw, NPM, Portainer, push ni deploy.

  • gate execute implementado para SOURCE-003 promote-core --execute: docs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-PROMOTE-CORE-EXECUTE-GATE-IMPLEMENTATION-001.md;

  • resultado: promote-core conserva DRY_RUN; promote-core --execute queda BLOCKED por confirmaciones explicitas y sin ruta de escritura CORE;
  • controles: DB permitida openclaw_business_observer_dev, RAW source business_observer.raw_source_003_sales_items, CORE target business_observer.core_source_003_sales_items, batch 1827f887-9499-4579-b4f3-234d54f41f7f, RAW batch rows = 1886, CORE row_count = 0, candidate_rows = 1886, target_columns = 66, duplicates_core = 0, fingerprint DB obligatorio y postgres-sandbox prohibido;
  • seguridad: db_write=false, data_written=false, sync_enabled=false; no se implemento escritura real, no se cargo CORE, no se modifico RAW, no hubo runner, CSV, rollback real, VPS, Docker, OpenClaw, NPM, Portainer, push ni deploy.

  • gate documental para futuro promote-core --execute local-dev: docs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-PROMOTE-CORE-LOCAL-DEV-EXECUTION-GATE.md;

  • decision: GATE PROMOTE-CORE DOCUMENTADO / NO IMPLEMENTADO / NO EJECUTADO;
  • alcance: DB permitida openclaw_business_observer_dev, RAW source business_observer.raw_source_003_sales_items, CORE target business_observer.core_source_003_sales_items, batch permitido 1827f887-9499-4579-b4f3-234d54f41f7f, RAW batch rows = 1886, CORE row_count inicial = 0, 1886 filas esperadas a promover y 66 columnas CORE destino;
  • controles: fingerprint DB obligatorio, postgres-sandbox prohibido, confirmaciones futuras requeridas, transformacion RAW -> CORE, idempotencia, bloqueo por batch duplicado, transaccion esperada, validaciones pre-write/post-write, rollback/rebuild por batch, evidencia minima y criterio PASS/FAIL/BLOCKED;
  • conclusion: sirvio de base para implementar el gate execute local-dev; no apto para produccion; no apto para sync diaria;
  • no se modifico Python, no se toco PostgreSQL, no se ejecuto SQL, no se escribio en CORE, no se modifico RAW, no se cargo dato, no se genero CSV, no se ejecuto runner, no se uso VPS, Docker, OpenClaw, NPM, Portainer, push ni deploy.

  • importer SOURCE-003 con promote-core safe mode: docs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-IMPORTER-PROMOTE-CORE-SAFE-MODE-001.md;

  • resultado: DRY_RUN PASS; promote-core --execute devuelve BLOCKED;
  • controles: validate-prepared PASS, fingerprint DB aprobado, postgres-sandbox prohibido, RAW source business_observer.raw_source_003_sales_items, CORE target business_observer.core_source_003_sales_items, batch 1827f887-9499-4579-b4f3-234d54f41f7f, RAW batch rows = 1886, CORE row_count = 0, candidate_rows = 1886, target_columns = 66, duplicates CORE = 0;
  • seguridad: db_write=false, data_written=false, sync_enabled=false; no se cargo CORE, no se modifico RAW, no hubo INSERT, COPY, UPDATE, DELETE, runner, CSV, VPS, Docker, OpenClaw, NPM, Portainer, push ni deploy.

  • forward local-dev del paquete DDL CORE candidato de SOURCE-003: docs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-CORE-DDL-LOCAL-DEV-FORWARD-001.md;

  • resultado: PREFLIGHT PASS / FORWARD OK / POST-CHECKS PASS;
  • tabla creada: business_observer.core_source_003_sales_items en openclaw_business_observer_dev, vacia con row_count = 0;
  • controles: owner openclaw_bo_admin, 66 columnas, 22 constraints, 10 indices, writer con SELECT/INSERT/UPDATE sin DELETE, reader read-only y PUBLIC sin privilegios;
  • RAW: business_observer.raw_source_003_sales_items existente; preflight confirmo 1886 filas del batch autorizado 1827f887-9499-4579-b4f3-234d54f41f7f, campos criticos malos 0 y duplicados 0; el forward no contiene escrituras contra RAW;
  • no se cargo data, no se ejecuto INSERT, COPY, UPDATE, DELETE, rollback, promote-core, runner/importer, Python, CSV, VPS, Docker, OpenClaw, NPM, Portainer, push ni deploy.

  • revision tecnica documental del paquete DDL CORE candidato de SOURCE-003: docs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-CORE-DDL-CANDIDATE-TECHNICAL-REVIEW.md;

  • resultado: APTO PARA PREFLIGHT LOCAL-DEV / NO APTO PARA PRODUCCION / NO APTO PARA SYNC DIARIA / NO APTO PARA PROMOTE-CORE AUN;
  • hallazgos: tabla candidata business_observer.core_source_003_sales_items, RAW sin modificaciones, batch piloto 1827f887-9499-4579-b4f3-234d54f41f7f, 66 columnas, 22 constraints, 10 indices, clave tecnica id, trazabilidad por tenant_id, sync_batch_id, line_key y source_row_hash, owner/grants correctos, PUBLIC sin privilegios, writer sin DELETE, rollback que aborta si hay filas y post-checks con row_count = 0;
  • riesgos preservados: channel_normalized requiere catalogo aprobado, contribution_amount conserva semantica de margen pendiente, id debera ser provisto por el futuro promote-core, y no hay condiciones productivas de RLS, particionado, observabilidad ni operacion;
  • no se ejecuto SQL, no se uso psql, no se toco PostgreSQL, no se creo tabla real, no se modifico Python, no se cargo data, no se genero CSV, no se ejecuto runner, no se toco RAW/CORE/MART real, no se uso VPS, Docker, OpenClaw, NPM, Portainer, push ni deploy.

  • paquete DDL CORE candidato de SOURCE-003: docs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-CORE-DDL-CANDIDATE.md;

  • SQL candidatos: 005_source_003_core_ddl_candidate_preflight.sql, 005_source_003_core_ddl_candidate_forward.sql, 005_source_003_core_ddl_candidate_rollback.sql, 005_source_003_core_ddl_candidate_post_checks.sql;
  • objetivo: disenar business_observer.core_source_003_sales_items como tabla CORE candidata normalizada desde business_observer.raw_source_003_sales_items;
  • base autorizada: RAW local-dev con 1886 filas validadas para el batch 1827f887-9499-4579-b4f3-234d54f41f7f;
  • decision: DDL CORE CANDIDATO / NO EJECUTADO / NO IMPLEMENTADO EN DB;
  • alcance: 66 columnas candidatas, clave tecnica id, claves de trazabilidad tenant_id, sync_batch_id, line_key y source_row_hash, constraints, indices, owner openclaw_bo_admin, grants sin PUBLIC, writer sin DELETE, rollback que aborta si hay filas y post-checks con row_count = 0;
  • no se ejecuto SQL, no se uso psql, no se toco PostgreSQL, no se creo tabla real, no se modifico Python, no se cargo data, no se genero CSV, no se ejecuto runner, no se toco RAW/CORE/MART real, no se uso VPS, Docker, OpenClaw, NPM, Portainer, push ni deploy.

  • plan documental del futuro promote-core del importer SOURCE-003: docs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-IMPORTER-PROMOTE-CORE-PLAN.md;

  • objetivo: definir el flujo futuro python scripts/source_003_importer.py promote-core desde business_observer.raw_source_003_sales_items hacia la tabla candidata business_observer.core_source_003_sales_items;
  • base autorizada: RAW local-dev con 1886 filas validadas para el batch 1827f887-9499-4579-b4f3-234d54f41f7f;
  • alcance: precondiciones, RAW source table, futura CORE target table, reglas raw -> core, normalizacion, tipos, claves logicas, idempotencia, deduplicacion, rollback/rebuild por batch, validaciones pre/post y relacion futura con mart;
  • decision: PROMOTE-CORE PLAN DOCUMENTADO / NO IMPLEMENTADO / NO EJECUTADO;
  • resultado: apto para disenar DDL CORE candidato; no apto para produccion; no apto para sync diaria;
  • no se modifico Python, no se toco PostgreSQL, no se ejecuto SQL, no se crearon tablas, no se cargaron datos, no se genero CSV, no se ejecuto runner, no se toco CORE/MART real, no se uso VPS, Docker, OpenClaw, NPM, Portainer, push ni deploy.

  • gate documental de ejecucion local-dev para futuro load-raw --execute: docs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-LOAD-RAW-LOCAL-DEV-EXECUTION-GATE.md;

  • decision: GATE DOCUMENTADO / NO IMPLEMENTADO / NO EJECUTADO;
  • apto para implementar load-raw --execute en una tarea futura local-dev separada, con SAFE POINT nuevo, autorizacion humana explicita, fingerprint DB, flags exactos, transaccion, validaciones pre-write/post-write, idempotencia y rollback por batch separado;
  • no apto para produccion;
  • no apto para sync diaria;
  • no se modifico Python, no se ejecuto load-raw --execute, no se toco PostgreSQL, no se genero CSV, no hubo INSERT, COPY, UPDATE, DELETE, runner, VPS, Docker, OpenClaw, NPM, Portainer, push ni deploy.

  • importer SOURCE-003 con load-raw seguro implementado en scripts/source_003_importer.py;

  • evidencia: docs/tenants/alpuntodeventa/business-observer/design/SOURCE-003-IMPORTER-LOAD-RAW-SAFE-MODE-001.md;
  • python scripts/source_003_importer.py load-raw devuelve DRY_RUN;
  • validate-prepared PASS;
  • batch esperado: 1827f887-9499-4579-b4f3-234d54f41f7f;
  • 1886 filas candidatas;
  • tabla RAW: business_observer.raw_source_003_sales_items;
  • row_count RAW = 0;
  • columnas destino RAW: 84;
  • db_write=false, sql_write=false, data_written=false, sync_enabled=false;
  • load-raw --execute queda BLOCKED;
  • no hubo carga, runner, rollback, CSV nuevo, DDL, postgres-sandbox, VPS, Docker, OpenClaw, NPM, Portainer, push ni deploy.

El documento BUSINESS-OBSERVER-GOVERNANCE-MODEL.md queda definido como autoridad funcional principal del observer APV.

El tenant APV ya tiene un espacio propio para separar:

  • capacidades Core reutilizables de OpenClaw
  • reglas y decisiones comerciales especificas de APV

Documentos base ya creados

  • Use Case 001 creado en la capa global: clientes en riesgo comercial
  • reglas del Use Case 001 creadas en la capa global
  • Use Case 002 creado en la capa global: crecimiento y colocacion estrategica
  • reglas del Use Case 002 creadas en la capa tenant: GROWTH-PLACEMENT-RULES.md
  • Use Case 003 creado en la capa tenant: impacto y aprendizaje comercial
  • Use Case 004 creado en la capa tenant: demanda no atendida y oportunidad economica perdida
  • Use Case 005 creado en la capa tenant: calendario operativo e inteligencia temporal
  • Use Case 006 creado en la capa tenant: inteligencia de mercado y pricing
  • Use Case 007 creado en la capa tenant: recomendaciones comerciales priorizadas
  • Use Case 008 creado en la capa tenant: inteligencia de surtido y mix
  • Use Case 009 creado en la capa tenant: inteligencia de proveedores y abastecimiento
  • capa tenant business-observer/ creada para alpuntodeventa

Etapa actual

Etapa actual:

  • estructura tenant del Business Observer
  • vision APV del observer
  • consolidacion de reglas APV ya aprobadas
  • cierre documental de reglas comerciales del Use Case 002
  • definicion conceptual del Use Case 003
  • definicion funcional del Use Case 004
  • definicion funcional del Use Case 005
  • definicion funcional del Use Case 006
  • definicion funcional del Use Case 007
  • definicion funcional del Use Case 008
  • definicion funcional del Use Case 009
  • auditoria de fundacion de datos para UC001 a UC009
  • contrato funcional de datos para UC001 a UC009
  • primera fuente real documentada: SOURCE-001 - SGC / VCLIENTES / Clientes
  • fuente real documentada para productos: SOURCE-002 - Maestro de productos / ecommerce.dbo.PRODUCTS
  • fuente complementaria real documentada para imagenes: SOURCE-002B - WooCommerce / featured image por SKU
  • fuente real calculada documentada para ventas y comprobantes: SOURCE-003 - query sagrada vNext candidate / Tabla 2 / BalanceCtaCteFinal
  • preservacion documental cerrada para SOURCE-003: autoridad anterior retenida + nueva query completa vNext candidate
  • decision documental cerrada para SOURCE-003: solo Tabla 2 se sincroniza; Tabla 1/3/4/5/6 quedan como reportes derivados desde Tabla 2
  • decision documental cerrada para SOURCE-003 vNext: source_003_sales_items queda como tabla base conceptual futura para sync itemizada hacia PostgreSQL / OpenClaw
  • diseno DDL documental cerrado para SOURCE-003: source_003_sales_items queda especificada documentalmente con tenant_id + line_key, source_row_hash, checks, indices sugeridos y estrategia futura de carga
  • migracion piloto controlada ejecutada para SOURCE-003: business_observer.source_003_sales_items queda creada y validada en PostgreSQL local, base gestion_de_negocios_core, con backup logico previo, tabla final vacia, insert sintetico borrado y rollback preparado no ejecutado; no habilita produccion final
  • intento de carga piloto real detenido para SOURCE-003: la extraccion de Tabla 2 vNext para 2026-06-08 dio 1262 filas contra 1269 esperadas y fallo la conciliacion de importe total / CMV; no se insertaron filas y business_observer.source_003_sales_items quedo vacia
  • inventario documental posterior de SOURCE-003 / Tabla 2 V2: el snapshot 2026-06-09 confirma 68 columnas reales, identifica 31 columnas faltantes o solo consolidadas en el DDL piloto previo, crea diccionario completo y mapping CSV/PostgreSQL; aprobacion humana posterior de Gabi acepta las 68 columnas reales para persistencia en piloto controlado y habilita la preparacion de carga desde SOURCE-003-SNAPSHOT-001 contra PostgreSQL local, sin produccion final
  • carga piloto controlada 001 ejecutada para SOURCE-003: SOURCE-003-SNAPSHOT-001 se cargo desde el CSV congelado hacia business_observer.source_003_sales_items en PostgreSQL local; quedaron 1886 filas persistidas, 68/68 columnas de negocio contempladas, line_key_v4 sin duplicados, source_row_hash_v1 calculado con las 68 columnas y conciliacion de importe total / CMV en verde; no se consulto SGC vivo, no se ejecuto sync diaria y no se habilito produccion final
  • paquete DDL piloto revisable preparado para SOURCE-003 sobre la DB local dedicada openclaw_business_observer_dev: design/SOURCE-003-DEDICATED-DB-DDL-PILOT-PACKAGE.md, SQL forward, rollback y post-checks quedan listos para revision humana como NO EJECUTAR; no se ejecuto SQL, DDL, DML, carga, sync, Docker, VPS, OpenClaw, NPM ni deploy
  • preflight autorizado de artefacto y DB ejecutado para futura carga piloto minima dedicada de SOURCE-003: design/SOURCE-003-PILOT-LOAD-PREFLIGHT-001.md; SAFE POINT exacto, CSV preparado local de 83 columnas y 1886 filas validado con sha256 3f16a957a79fc84d4ca37930988287cb81f05166210d057fcf8b45007f184afe, sync_batch_id 1827f887-9499-4579-b4f3-234d54f41f7f, CSV fuera de Git, DB dedicada validada en solo lectura y SQL preflight autorizado pasado con ON_ERROR_STOP=1; tabla final sigue vacia con 0 filas; no se ejecuto candidate, INSERT, COPY, rollback, sync diaria, carga masiva ni produccion final
  • candidate load piloto autorizado de SOURCE-003 sobre la DB dedicada openclaw_business_observer_dev: design/SOURCE-003-PILOT-LOAD-EXECUTION-001.md; SAFE POINT exacto en 9d7d622354176daa34ce0762bb97da8eb993695d; CSV preparado local de 83 columnas y 1886 filas revalidado con sha256 3f16a957a79fc84d4ca37930988287cb81f05166210d057fcf8b45007f184afe y batch 1827f887-9499-4579-b4f3-234d54f41f7f; DB destino validada vacia; el SQL preflight paso, pero el candidate fallo en la linea 104 por \copy; decision CARGA PILOTO FALLIDA / ROJO, sin post-checks, sin rollback aplicado, 0 filas finales y sin sync diaria, carga masiva ni produccion final
  • generador Python local creado para SOURCE-003 raw -> prepared CSV: scripts/source_003_prepare_csv.py; la corrida strict contra el snapshot raw vigente genero un CSV de prueba fuera de Git con 1886 filas, 83 columnas y sha256 6fb44d9870a567e728df9bbdcc6b83279d84791bd732626c9e19ccf3a28dc903; comparado contra el CSV preparado validado sha256 3f16a957a79fc84d4ca37930988287cb81f05166210d057fcf8b45007f184afe, queda REPRODUCIBLE ESTRUCTURAL / SHA DIFERENTE, con diferencias acotadas a id en 1886 filas y 82/83 columnas coincidentes celda por celda; no se toco PostgreSQL, no se ejecuto SQL, no se cargaron datos y no se reemplazo el CSV validado
  • runner Python controlado creado para la futura orquestacion de SOURCE-003: scripts/source_003_pilot_load_runner.py, documentado en design/SOURCE-003-PILOT-LOAD-PYTHON-RUNNER-001.md; implementa plan, validate-files, dry-run, preflight, status, verify-existing-pilot, post-checks, load, rollback y full, pero en esta tarea solo se permiten y ejecutan modos seguros sin DB; los modos que tocarian DB exigen confirmaciones exactas de DB, batch y CSV sha256, y los modos de escritura quedan bloqueados en esta revision porque la evidencia vigente dice que la tabla dedicada ya contiene 1886 filas del batch piloto verde; no se toco PostgreSQL, no se ejecuto SQL, no se cargaron datos y no se ejecuto rollback
  • semantica read-only del runner definida para SOURCE-003: preflight-before-load queda reservado para validar tabla vacia antes de una carga nueva, mientras que status / verify-existing-pilot quedan definidos como lectura de salud del piloto ya cargado con 1886 filas exactas, fecha 2026-06-09, metadata exacta, 0 nulos criticos, 0 duplicados y line_key / source_row_hash validos; post-checks queda como alias legacy; ningun PASS de lectura habilita load, full ni rollback
  • arquitectura futura de capas documentada para Business Observer APV: design/BUSINESS-OBSERVER-DATA-LAYERS-ARCHITECTURE.md define el flujo objetivo raw -> prepared CSV -> core -> mart -> Python importer/runner -> OpenClaw executor -> sync futura, fija responsabilidades por capa y deja el patron reutilizable para clientes/productos; decision ARQUITECTURA FUTURA DOCUMENTADA / NO EJECUTIVA, sin habilitar sync diaria, carga masiva, produccion final ni OpenClaw executor
  • contrato formal de la capa RAW para SOURCE-003: design/SOURCE-003-RAW-LAYER-CONTRACT.md define la responsabilidad de preservar evidencia del origen, diferencia entre raw snapshot, prepared CSV y raw table futura, columnas minimas, metadata obligatoria, batch, idempotencia, deduplicacion, validaciones, errores, rollback por batch y relacion futura raw -> core; decision CONTRATO RAW DOCUMENTADO / NO IMPLEMENTADO, sin tabla raw, sin DDL, sin SQL, sin PostgreSQL, sin runner, sin CSV generado, sin carga y sin habilitar sync diaria, carga masiva, produccion final ni OpenClaw executor
  • contrato formal de la capa CORE para SOURCE-003: design/SOURCE-003-CORE-LAYER-CONTRACT.md define la responsabilidad de normalizar negocio desde evidencia raw y artefactos prepared CSV, criterios de promocion raw -> core, columnas core candidatas, claves logicas (tenant_id, line_key, source_row_hash, sync_batch_id), reglas de normalizacion, tipos, deduplicacion, idempotencia, validaciones, errores esperados, rollback logico por batch y relacion core -> mart; decision CONTRATO CORE DOCUMENTADO / NO IMPLEMENTADO, sin tabla core, sin DDL, sin SQL, sin PostgreSQL, sin runner, sin CSV generado, sin carga y sin habilitar sync diaria, carga masiva, produccion final ni OpenClaw executor
  • contrato formal de la capa MART para SOURCE-003: design/SOURCE-003-MART-LAYER-CONTRACT.md define la responsabilidad de consumo analitico gobernado desde core, diferencia entre raw, core y mart, criterios de promocion core -> mart, marts candidatos iniciales, metricas, dimensiones, granularidad, claves, trazabilidad por sync_batch_id, source_row_hash y line_key, validaciones, errores, refresh/rebuild futuro, rollback logico o rebuild por batch y relacion con dashboards, reportes y consultas LLM futuras; decision CONTRATO MART DOCUMENTADO / NO IMPLEMENTADO, sin tabla mart, sin DDL, sin SQL, sin PostgreSQL, sin runner, sin CSV generado, sin carga y sin habilitar sync diaria, carga masiva, produccion final ni OpenClaw executor
  • hito SOURCE-003 Data Layers publicado: design/SOURCE-003-DATA-LAYERS-MILESTONE.md consolida que RAW, CORE y MART estan disenados y publicados documentalmente sobre HEAD 8d08ec8f34dd5347833ff7e1cd632a88c0a04cb0, con estado DOCUMENTADO / PUBLICADO / NO IMPLEMENTADO EN DB; deja trazada la separacion raw / prepared CSV / core / mart, la trazabilidad por batch, line_key y source_row_hash, las validaciones, la idempotencia y la relacion futura con dashboards, reportes y consultas LLM; no implementa tablas, no crea DDL, no ejecuta SQL, no toca PostgreSQL, no ejecuta runner, no genera CSV y no carga datos
  • contrato documental del futuro Python importer formal para SOURCE-003: design/SOURCE-003-PYTHON-IMPORTER-CONTRACT.md define comandos futuros, entradas, salidas, gates, logs, errores, idempotencia, rollback por batch y relacion con OpenClaw executor; decision CONTRATO IMPORTER DOCUMENTADO / NO IMPLEMENTADO, sin implementar importer, sin tocar Python, sin SQL, sin PostgreSQL, sin runner, sin CSV y sin habilitar sync diaria, carga masiva ni produccion final
  • importer Python seguro actualizado para SOURCE-003: scripts/source_003_importer.py, documentado en design/SOURCE-003-PYTHON-IMPORTER-SKELETON-001.md; implementa solo comandos seguros plan, validate-contract, dry-run, inspect-source, generate-prepared y validate-prepared, valida la existencia del contrato importer, generator script, runner script y arquitectura data layers, y mantiene bloqueados load-raw, promote-core, build-mart, status y rollback-batch; generate-prepared genera un CSV en snapshots/source-003/prepared/generated/, fuera de Git, con 1886 filas, 83 columnas y comparacion REPRODUCIBLE ESTRUCTURAL ACEPTADO contra el prepared validado (82/83 columnas coincidentes, diferencia esperada en id por UUID v5 deterministico); validate-prepared valida prepared historico y generated existente sin generar CSV nuevo, con SHA256 esperados, ambos fuera de Git, source_row_hash y line_key no vacios y comparacion REPRODUCIBLE ESTRUCTURAL ACEPTADO; decision IMPORTER SEGURO CON VALIDATE-PREPARED / NO DB, con db_touched=false, sql_executed=false, data_written=false y sync_enabled=false; no se toco PostgreSQL, no se ejecuto SQL, no se llamo al runner, no se reemplazo el CSV validado y no se habilito sync
  • plan controlado del futuro load-raw del importer SOURCE-003: design/SOURCE-003-IMPORTER-LOAD-RAW-PLAN.md define objetivo futuro, alcance solo local-dev o DB dedicada, prohibicion de usar postgres-sandbox como produccion, precondiciones obligatorias, comportamiento seguro por defecto, --execute requerido para escritura, fingerprint DB, batch explicito, target table gobernada, relacion con la tabla piloto business_observer.source_003_sales_items, validaciones previas, transaccion con staging y checks pre-commit, idempotencia, deduplicacion, rollback por batch, logs/auditoria, outputs, riesgos y criterios de aceptacion; decision LOAD-RAW PLAN DOCUMENTADO / NO IMPLEMENTADO / NO EJECUTABLE; no se toco PostgreSQL, no se ejecuto SQL, no se modifico Python, no se creo DDL, no se genero CSV y no se habilito sync diaria, carga masiva, produccion, OpenClaw executor ni jobs automaticos
  • plan controlado del futuro promote-core del importer SOURCE-003: design/SOURCE-003-IMPORTER-PROMOTE-CORE-PLAN.md define la promocion futura desde RAW local-dev validado hacia CORE candidato, limita el batch permitido a 1827f887-9499-4579-b4f3-234d54f41f7f, propone como destino futuro business_observer.core_source_003_sales_items, y documenta precondiciones, reglas raw -> core, normalizacion, tipos, claves logicas, idempotencia, deduplicacion, rollback/rebuild por batch, validaciones pre/post y relacion futura con mart; decision PROMOTE-CORE PLAN DOCUMENTADO / NO IMPLEMENTADO / NO EJECUTADO; apto para disenar DDL CORE candidato, no apto para produccion ni sync diaria; no se modifico Python, no se toco PostgreSQL, no se ejecuto SQL, no se crearon tablas, no se cargaron datos, no se genero CSV y no se toco CORE/MART real
  • paquete DDL CORE candidato de SOURCE-003: design/SOURCE-003-CORE-DDL-CANDIDATE.md y SQL candidatos 005_source_003_core_ddl_candidate_* definen business_observer.core_source_003_sales_items como tabla CORE candidata, normalizada desde business_observer.raw_source_003_sales_items, con clave tecnica id, clave logica tenant_id + line_key, clave de promocion tenant_id + sync_batch_id + line_key, 66 columnas, 22 constraints, 10 indices, owner openclaw_bo_admin, grants sin PUBLIC, writer sin DELETE, rollback que aborta si hay filas y post-checks con row_count = 0; no se ejecuto SQL, no se toco PostgreSQL, no se creo tabla real, no se modifico Python, no se ejecuto runner y no se genero CSV
  • revision tecnica documental del contrato load-raw de SOURCE-003: design/SOURCE-003-LOAD-RAW-TECHNICAL-REVIEW.md confirma consistencia entre plan, contrato RAW, contratos CORE/MART, importer, skeleton, comandos seguros y auditoria VPS PostgreSQL; resultado APTO PARA DISENAR DDL RAW / NO APTO PARA IMPLEMENTAR LOAD-RAW TODAVIA; mantiene bloqueados Python, DDL, SQL, PostgreSQL, runner, CSV, carga, sync diaria, carga masiva, produccion, OpenClaw executor, VPS, Docker, OpenClaw, NPM, push y deploy
  • paquete DDL RAW candidato de SOURCE-003: design/SOURCE-003-RAW-DDL-CANDIDATE.md y SQL candidatos 004_source_003_raw_ddl_candidate_* definen business_observer.raw_source_003_sales_items como tabla RAW candidata, preservan que business_observer.source_003_sales_items es PILOTO, incluyen columnas del prepared CSV mas loaded_at, clave tecnica id, clave logica por batch tenant_id + sync_batch_id + line_key, constraints, indices, owner openclaw_bo_admin, grants sin PUBLIC, writer sin DELETE, rollback que aborta si hay filas y post-checks con row_count = 0; no se ejecuto SQL, no se toco PostgreSQL, no se creo tabla real, no se modifico Python, no se ejecuto runner y no se genero CSV
  • revision tecnica del paquete DDL RAW candidato de SOURCE-003: design/SOURCE-003-RAW-DDL-CANDIDATE-TECHNICAL-REVIEW.md concluye APTO PARA EJECUCION LOCAL-DEV / NO APTO PARA PRODUCCION / NO APTO PARA IMPLEMENTAR LOAD-RAW TODAVIA; valida tabla candidata business_observer.raw_source_003_sales_items, separacion con tabla piloto, metadata RAW obligatoria, columnas prepared CSV mas loaded_at, clave tecnica id, clave logica por batch, constraints, indices, ownership/grants, PUBLIC sin privilegios, writer sin DELETE, preflight, forward, rollback que aborta si hay filas y post-checks con row_count = 0; no se ejecuto SQL, no se uso psql, no se toco PostgreSQL, no se creo tabla real, no se modifico Python, no se ejecuto runner y no se genero CSV
  • forward local-dev del DDL RAW candidato de SOURCE-003: design/SOURCE-003-RAW-DDL-LOCAL-DEV-FORWARD-001.md registra la ejecucion controlada contra openclaw_business_observer_dev: preflight PASS, forward OK, post-checks PASS; queda creada vacia business_observer.raw_source_003_sales_items con owner openclaw_bo_admin, 84 columnas, 21 constraints, 9 indices, row_count = 0, writer sin DELETE, reader read-only y PUBLIC sin privilegios; la tabla piloto business_observer.source_003_sales_items no fue tocada por escritura; no se cargo dato, no se modifico Python, no se ejecuto runner/importer load-raw, no se genero CSV y siguen bloqueadas sync diaria, carga masiva y produccion final
  • gate documental de ejecucion local-dev de SOURCE-003 load-raw --execute: design/SOURCE-003-LOAD-RAW-LOCAL-DEV-EXECUTION-GATE.md define las precondiciones obligatorias para una futura implementacion local-dev: DB permitida openclaw_business_observer_dev, tabla business_observer.raw_source_003_sales_items, batch 1827f887-9499-4579-b4f3-234d54f41f7f, prepared/generated CSV validados, row_count RAW = 0, 1886 filas esperadas, 84 columnas destino, fingerprint DB obligatorio, flags de autorizacion, transaccion, validaciones pre-write/post-write, rollback por batch separado, idempotencia, evidencia minima y criterio PASS/FAIL/BLOCKED; decision GATE DOCUMENTADO / NO IMPLEMENTADO / NO EJECUTADO, apto para implementar load-raw --execute en tarea futura local-dev separada, no apto para produccion ni sync diaria
  • fuente funcional futura documentada para snapshot diario: SOURCE-002C - stock diario al cierre aproximado de 17:00
  • fuente funcional futura documentada para stock actual liviano: SOURCE-002D - stock intradiario liviano cada 10 minutos
  • mapeo conceptual futuro documentado para separar SOURCE-002 en capas de producto, stock y valores economicos: SOURCE-002-FUTURE-LAYER-MAPPING
  • decision documental futura cerrada para la capa economica de SOURCE-002 y para modelar listas de precios como filas normalizadas por SKU + lista_codigo: SOURCE-002-ECONOMIC-LAYER
  • regla canonica de dominio producto cerrada documentalmente para SOURCE-002: tenant_id + SKU
  • regla documental cerrada: todo dato de SOURCE-002 debe leerse como atributo, medicion, relacion vigente o relacion historica del SKU
  • regla documental cerrada para proveedor y marca: Cod Proveedor como identificador de negocio, Proveedor como nombre legible asociado al SKU y Marca como atributo comercial asociado al SKU
  • regla canonica de dominio cliente cerrada documentalmente para SOURCE-001: tenant_id + codigo_cliente
  • canonicalizacion recomendada cerrada para SOURCE-001: codigo_cliente = NULLIF(LTRIM(RTRIM([Codigo])), '')
  • regla documental cerrada: todo grupo derivado de SOURCE-001 pertenece al mismo cliente SGC y no debe leerse como cliente independiente
  • separacion logica futura explicitada para SOURCE-001: customers_core, customers_contact, customers_address, customers_tax, customers_commercial, customers_sales_owner y customers_visit_schedule son grupos logicos del mismo cliente
  • regla futura de sync cerrada para SOURCE-001: la extraccion base no debe agregar WHERE Estado = 'CLIENTE ACTIVO'
  • regla futura de preservacion cerrada para SOURCE-001: la base sincronizada debe conservar CLIENTE ACTIVO, CLIENTE SUSPENDIDO y CLIENTE DE BAJA
  • regla futura de consumo cerrada para SOURCE-001: filtros de venta o facturacion solo en vistas o capas de consumo y no en la base sincronizada
  • regla futura de modelado cerrada para SOURCE-001: Estado del SGC debe preservarse como estado_raw
  • regla futura anti hard-delete cerrada para SOURCE-001: baja comercial o suspension no habilitan hard delete en el futuro diseno Postgres
  • regla futura de interpretacion cerrada para SOURCE-001: desaparicion de una extraccion completa no equivale a Estado = CLIENTE DE BAJA
  • regla documental transversal cerrada: historicos por valor de decision para costo, precio, listas, IVA, margen, descuento, quiebres, recuperaciones, ingresos y snapshots utiles
  • validacion documental agregada con ejemplo real de listas normalizadas: L7 para SKU 0135 y SKU 0128
  • confirmacion estructural agregada: L1..L9 son una repeticion horizontal del mismo bloque economico del ERP / SGC y no deben modelarse como columnas fijas de destino
  • confirmacion de normalizacion agregada: SOURCE-002 requiere higiene analitica porque el ERP / SGC expone datos con formatos poco prolijos y la autoridad ya documenta CAST, ROUND, RTRIM, calculos de IVA, stock en bultos, palletizado, conversion de fechas y exclusiones configurables de SKU
  • inventario real parcial ya evidenciado para SOURCE-001: distribucion de Estado validada en consulta real de solo lectura, con solo CLIENTE ACTIVO, CLIENTE DE BAJA y CLIENTE SUSPENDIDO, sin valores inesperados y con Fecha_Baja totalmente alineada con CLIENTE DE BAJA
  • inventario real parcial ya evidenciado para SOURCE-001: unicidad de Codigo normalizado validada en consulta real de solo lectura, con 11401 filas, 11401 codigos distintos, 0 nulos o vacios y 0 duplicados, reforzando tenant_id + codigo_cliente como clave logica fuerte
  • inventario real parcial ya evidenciado para SOURCE-001: calidad de WhatsApp validada en consulta real de solo lectura con 7107 informados, 4294 vacios, 350 telefonos repetidos entre clientes distintos y semaforo recomendado AMARILLO por cobertura incompleta y heterogeneidad de formato
  • inventario real ampliado ya evidenciado para SOURCE-001: vendedor validado en consulta real de solo lectura con 11404/11404 Codigo_vendedor y Nombre_Vendedor informados, 76 pares codigo + nombre distintos y relacion 1:1 sin inconsistencias
  • inventario real ampliado ya evidenciado para SOURCE-001: frecuencia validada en consulta real de solo lectura con 11404/11404 CodFrec y Frecuencia informados, 4 pares cod_frec + frecuencia consistentes y campos diarios observados solo como S, N y NULL/VACIO
  • inventario real ampliado ya evidenciado para SOURCE-001: territorialidad validada en consulta real de solo lectura con 11404/11404 Localidad y Provincia informadas, 11403/11404 Zona informada, 24 provincias, 516 localidades y 365 zonas distintas, con semaforo recomendado AMARILLO por dispersion textual y mezcla multi-provincia en parte del catalogo de zonas
  • estrategia territorial canonica ya documentada para SOURCE-001: territory/TERRITORY-NORMALIZATION-STRATEGY.md
  • catalogo documental inicial de alias territoriales ya documentado para SOURCE-001: territory/TERRITORY-ALIAS-CATALOG-001.md
  • paquete de revision humana ya documentado para SOURCE-001: territory/TERRITORY-HUMAN-REVIEW-001.md
  • decision documental cerrada para territorio: Provincia y Localidad quedan como senales fuertes con raw + normalized y Zona queda como zona logistica con zona_raw + zona_type + zona_normalized
  • decision documental cerrada para ownership: Zona no define vendedor responsable; el vendedor responsable sale de Codigo_vendedor / Nombre_Vendedor
  • decision documental cerrada para territorio comercial: la pregunta por territorio del vendedor debe resolverse con clientes asignados + geografia + ventas + productos, no con Zona
  • vista analitica conceptual futura documentada para territorio comercial del vendedor: analytics/SELLER-COMMERCIAL-TERRITORY-VIEW.md
  • documento conceptual futuro documentado para reconciliacion entre vendedor asignado y vendedor transaccional: analytics/SELLER-RECONCILIATION-RULES.md
  • decision documental cerrada para esa vista futura: debe tratarse como capa derivada de analytics y no como fuente primaria
  • decision documental cerrada para granularidad recomendada de esa vista futura: tenant_id + periodo + vendedor + cliente + SKU
  • decision documental cerrada para restricciones de esa vista futura: no usar Zona para inferir vendedor, no excluir clientes de baja del historico, no usar WhatsApp como identificador y preservar raw + normalized
  • decision documental cerrada para reconciliacion de vendedor: SOURCE-001 define seller_assigned, SOURCE-003 define seller_transactional, la atribucion real de ventas usa seller_transactional y la diferencia entre ambos debe preservarse como senal analitica
  • validacion real exploratoria agregada al 2026-06-09 para reconciliacion assigned vs transactional: ventana 90 dias con 97885 ventas validas exploratorias, 97885/97885 clientes mapeados a SOURCE-001, 95690 coincidencias, 2195 mismatch (2.24%), 47 clientes con ultima venta hecha por otro vendedor y semaforo recomendado AMARILLO por taxonomia de canal aun no cerrada del todo
  • taxonomia funcional parcial de canal agregada al 2026-06-09 para SOURCE-003: TRADIC y KIOSCO utilizables como traditional_seller, NULL/VACIO -> SIN ASIGNAR utilizable como unassigned, OTROS utilizable solo con apoyo de Ramo, sin evidencia suficiente todavia para cerrar ecommerce o shared_channel a nivel de canal completo
  • documento conceptual futuro documentado para customer ownership analytics: analytics/CUSTOMER-OWNERSHIP-ANALYTICS.md
  • decision documental cerrada para customer ownership analytics: ownership_assigned queda gobernado por SOURCE-001, ownership_last_sale y la autoria real de venta quedan gobernados por SOURCE-003, ownership_growth debe cruzar SOURCE-003 + SOURCE-002 y ownership_effective queda como lectura derivada futura sin reemplazo automatico del vendedor asignado
  • decision documental cerrada adicional para customer ownership analytics: la capa debe responder abandono, recuperacion, crecimiento, riesgo y cuentas trabajadas por terceros antes de cualquier SQL, vista fisica, automatizacion o ML
  • validacion real exploratoria agregada al 2026-06-09 para ownership: en la misma ventana de 90 dias, 1851 clientes tuvieron ultima venta del vendedor asignado, 47 la tuvieron con otro vendedor, 0 quedaron ambiguos en la ultima fecha y no se observaron casos manual_review por cliente no mapeado o vendedor faltante
  • decision documental cerrada para aliases y clasificacion de Zona: JOSE C. PAZ -> JOSE C PAZ, NO DEFINIDA -> undefined, NULL/VACIO -> unknown, con niveles automatic, suggested y manual_review
  • decision documental adicional cerrada: Zona queda fijada como logistic_zone, undefined o unknown para SOURCE-001; la revision humana pendiente queda concentrada en aliases y casos ambiguos
  • primer mapeo origen-destino documentado para SOURCE-001: mappings/SOURCE-001-CLIENTES-MAPPING.md
  • aplicacion explicita de DATA-DESIGN-STANDARD en SOURCE-001: bloques logicos customers_core, customers_contact, customers_address, customers_tax, customers_commercial, customers_sales_owner, customers_visit_schedule y source_001_customer_audit, con reglas documentales de source_row_hash, sync_batch_id, extracted_at, last_seen_at, created_at y updated_at
  • capa funcional futura documentada para eventos de inventario: Inventory Events Layer - eventos derivados de stock

Que queda cerrado

  • separacion documental Core vs APV
  • referencia explicita a alpuntodeventa como primer tenant piloto
  • referencia explicita a La Directa como tenant futuro separado
  • visibilidad de los casos de uso activos de APV
  • consolidacion de reglas APV ya aprobadas en un documento del tenant
  • reglas comerciales oficiales del Use Case 002 para crecimiento y colocacion estrategica
  • documento oficial del Use Case 003 para impacto y aprendizaje comercial
  • documento oficial del Use Case 004 para demanda no atendida y oportunidad economica perdida
  • documento oficial del Use Case 005 para calendario operativo e inteligencia temporal
  • documento oficial del Use Case 006 para inteligencia de mercado y pricing
  • documento oficial del Use Case 007 para recomendaciones comerciales priorizadas
  • documento oficial del Use Case 008 para inteligencia de surtido y mix
  • documento oficial del Use Case 009 para inteligencia de proveedores y abastecimiento
  • auditoria de fundacion de datos creada para UC001 a UC009
  • DATA-NEEDS.md alineado con la auditoria
  • contrato funcional de datos creado como puente entre auditoria, dataset tenant, futuro Postgres y futura sincronizacion
  • modelo de gobierno funcional oficial del observer APV
  • documento fuente real inicial para clientes: sources/SOURCE-001-SGC-CLIENTES.md
  • documento fuente real para productos: sources/SOURCE-002-SGC-PRODUCTOS.md
  • documento fuente complementaria real para imagenes: sources/SOURCE-002B-WOOCOMMERCE-IMAGENES.md
  • documento fuente real calculada para ventas y comprobantes: sources/SOURCE-003-SGC-VENTAS-COMPROBANTES.md
  • piloto fisico controlado de source_003_sales_items: design/SOURCE-003-SALES-ITEMS-PILOT-MIGRATION.md
  • intento de carga piloto real detenido de source_003_sales_items: design/SOURCE-003-SALES-ITEMS-PILOT-LOAD.md
  • carga piloto controlada exitosa de source_003_sales_items: design/SOURCE-003-SALES-ITEMS-PILOT-LOAD-001.md
  • paquete DDL piloto revisable para DB dedicada de source_003_sales_items: design/SOURCE-003-DEDICATED-DB-DDL-PILOT-PACKAGE.md
  • arquitectura futura de capas raw / prepared CSV / core / mart / Python importer-runner / OpenClaw executor / sync futura: design/BUSINESS-OBSERVER-DATA-LAYERS-ARCHITECTURE.md
  • contrato RAW formal de SOURCE-003: design/SOURCE-003-RAW-LAYER-CONTRACT.md
  • contrato CORE formal de SOURCE-003: design/SOURCE-003-CORE-LAYER-CONTRACT.md
  • contrato MART formal de SOURCE-003: design/SOURCE-003-MART-LAYER-CONTRACT.md
  • hito SOURCE-003 Data Layers publicado: design/SOURCE-003-DATA-LAYERS-MILESTONE.md
  • contrato documental del Python importer futuro para SOURCE-003: design/SOURCE-003-PYTHON-IMPORTER-CONTRACT.md
  • skeleton Python importer para SOURCE-003: design/SOURCE-003-PYTHON-IMPORTER-SKELETON-001.md
  • plan controlado del futuro load-raw del importer SOURCE-003: design/SOURCE-003-IMPORTER-LOAD-RAW-PLAN.md
  • plan controlado del futuro promote-core del importer SOURCE-003: design/SOURCE-003-IMPORTER-PROMOTE-CORE-PLAN.md
  • plan controlado del futuro build-mart del importer SOURCE-003: design/SOURCE-003-IMPORTER-BUILD-MART-PLAN.md
  • revision tecnica del paquete DDL RAW candidato de SOURCE-003: design/SOURCE-003-RAW-DDL-CANDIDATE-TECHNICAL-REVIEW.md
  • documento fuente funcional futura para snapshot diario: sources/SOURCE-002C-STOCK-DAILY-SNAPSHOT.md
  • documento fuente funcional futura para stock actual liviano: sources/SOURCE-002D-STOCK-CURRENT-10MIN.md
  • documento conceptual futuro de capas para SOURCE-002: SOURCE-002-FUTURE-LAYER-MAPPING.md
  • documento de mapeo campo por campo para SOURCE-001: mappings/SOURCE-001-CLIENTES-MAPPING.md
  • documento especifico futuro para la capa economica de SOURCE-002: SOURCE-002-ECONOMIC-LAYER.md
  • ejemplo real documentado para validar listas normalizadas en SOURCE-002-ECONOMIC-LAYER.md: L7 para SKU 0135 y SKU 0128
  • documento fuente funcional futura para eventos de inventario: sources/INVENTORY-EVENTS-LAYER-FUTURE.md
  • reporte de recuperacion de query: sources/SOURCE-002-QUERY-RECOVERY-REPORT.md
  • registro oficial de autoridad de fuentes: source-authority/SOURCE-AUTHORITY-REGISTRY.md
  • preservacion documental de autoridad SOURCE-001, SOURCE-002 y SOURCE-003: source-authority/
  • cierre de evidencia completa para SOURCE-001 usando la SELECT_CUSTOMERS_SQL del script de sincronizacion de clientes aportado por Gabi
  • cierre documental de SOURCE-002 como maestro de productos completo con proveedor, costos, precios, IVA, stock, bultos, palletizado y fechas operativas preservadas desde la query vigente aportada por Gabi
  • cierre documental de la capa economica de SOURCE-002 con validacion real de listas L1..L9 como bloque repetible horizontal del ERP / SGC
  • decision vigente cerrada para modelar listas como filas normalizadas por SKU + lista_codigo y no como columnas fijas de destino principal
  • decision vigente cerrada para tratar tenant_id + SKU como clave canonica del dominio producto en todo SOURCE-002
  • decision vigente cerrada para derivar analisis por proveedor o marca desde los SKU asociados y no desde textos sueltos
  • regla documental vigente cerrada para contemplar historicos cuando el dato sirva para indicadores, patrones, tendencias, alertas, decisiones o aprendizaje futuro, sin guardar todo sin criterio
  • decision vigente cerrada para SOURCE-003: la autoridad real es la query completa preservada y no V_VENTAS sola
  • decision vigente cerrada para SOURCE-003: la logica documental ya contempla comprobantes que corrigen o anulan segun tipo de comprobante y reglas de signo
  • decision vigente cerrada para SOURCE-003: la futura sync debe preservar precision suficiente y contexto historico de transaccion para no depender luego del maestro actual
  • decision vigente cerrada para SOURCE-003: la query actual queda registrada como vNext candidate y no como autoridad final cerrada hasta ejecutar validacion real de Tabla 2
  • decision vigente cerrada para SOURCE-003: el archivo nuevo de autoridad candidata es source-authority/SOURCE-003-VENTAS-VNEXT-TABLA2-AUTHORITY.sql y la autoridad anterior queda preservada en source-authority/SOURCE-003-VENTAS-TABLA2-AUTHORITY.sql
  • confirmacion humana cerrada para SOURCE-002: Gabi confirma que la query nueva es la autoridad vigente y que SKU NOT IN ('0124', '3857', '3998', '3793') es la primera lista conocida de exclusiones operativas por articulos internos o no tradicionales

Que sigue pendiente

  • continuar inventario de fuentes reales de datos existentes
  • ejecutar revision humana real de aliases territoriales y formatos ambiguos de Zona con Gabi
  • confirmar con Gabi la ventana movil futura de 7 dias para SOURCE-003
  • revisar humanamente la evidencia de la carga piloto 001 de SOURCE-003-SNAPSHOT-001
  • revisar humanamente la evidencia verde de la carga piloto dedicada de SOURCE-003 sobre openclaw_business_observer_dev
  • abrir un nuevo gate explicito si alguna vez se necesitara volver a tocar la DB dedicada mediante el runner controlado
  • si se necesita volver a verificar el piloto ya cargado en la DB dedicada, usar status / verify-existing-pilot y reservar preflight para tabla vacia antes de una carga nueva
  • aprobar o bloquear el diseno del siguiente piloto de ventana movil/backfill para SOURCE-003
  • comparar totales de Tabla 2 contra Tabla 1/3/4/5/6
  • no avanzar con sync diaria, carga masiva ni produccion final de SOURCE-003
  • si se aprueba implementar load-raw --execute, abrir una tarea separada local-dev con SAFE POINT nuevo, autorizacion humana explicita y cumplimiento completo de design/SOURCE-003-LOAD-RAW-LOCAL-DEV-EXECUTION-GATE.md; mantener produccion y sync diaria bloqueadas
  • si se aprueba implementar escritura real RAW -> CORE, abrir una tarea separada local-dev con SAFE POINT nuevo, autorizacion humana explicita, transaccion y post-checks sobre el gate promote-core --execute ya creado; mantener produccion y sync diaria bloqueadas
  • disenar DDL MART candidato para SOURCE-003 en una tarea separada, partiendo del plan build-mart; requiere review, preflight local-dev y forward local-dev antes de cualquier implementacion Python o carga MART
  • confirmar particionado por fecha, permisos de consumo y RLS antes de produccion final
  • definir estrategia de auditoria y comparacion por source_row_hash_v1 para una ventana movil futura de source_003_sales_items
  • confirmar si WooCommerce sigue siendo fuente vigente y confiable de imagenes por SKU
  • no cerrar diseno fisico de SOURCE-001 mientras falte evidencia de normalizacion definitiva de WhatsApp, catalogo real de alias territoriales, decision de geocodificacion futura, estrategia final de tablas fisicas y definicion fisica de vistas analiticas de territorio comercial
  • no cerrar todavia formulas, SQL, materializacion, permisos ni performance real de la vista analitica de territorio comercial del vendedor
  • no cerrar todavia umbrales de abandono, reactivacion ni ventana temporal de cuenta trabajada
  • no cerrar todavia reglas finales para ecommerce o canales compartidos dentro de la reconciliacion de vendedor mas alla del cierre parcial documentado en sources/SOURCE-003-CHANNEL-TAXONOMY.md
  • no cerrar todavia ventana temporal ni umbrales de ownership_effective, abandono, recuperacion o crecimiento para customer ownership analytics
  • validar con Gabi el horario funcional de SOURCE-002C
  • validar con Gabi la frecuencia funcional de SOURCE-002D
  • confirmar si ambas capas deben trabajar con todos los SKU o solo activos
  • confirmar si se requiere lectura por deposito en ambas capas
  • definir como un futuro script tratara en forma configurable la primera lista de exclusiones operativas de SOURCE-002
  • llevar el mapeo conceptual ya documentado a diseno posterior sin romper la separacion entre producto maestro, stock intradiario, snapshot diario y capas economicas
  • sostener en ese diseno posterior la decision ya documentada de no modelar L1..L9 como columnas fijas de destino principal
  • definir criterios futuros de deteccion simple para eventos de inventario
  • definir criterio futuro de severidad, criticidad y control de ruido para eventos de inventario
  • mapear fuentes reales contra el contrato funcional de datos
  • decidir prioridades comerciales pendientes que hoy no estan cerradas
  • definir catalogo oficial de acciones comerciales y criterios de medicion
  • cerrar catalogo oficial de objetivos, metas, owners, ventanas y semaforos
  • bajar reglas de priorizacion especificas de UC007
  • bajar reglas comerciales especificas de UC004
  • bajar reglas temporales especificas de UC005
  • bajar reglas comerciales especificas de UC006
  • bajar reglas comerciales especificas de UC008
  • bajar reglas comerciales especificas de UC009
  • precisar captura comercial de demanda no atendida e inventario historico
  • precisar separacion futura entre snapshot historico y stock intradiario liviano
  • precisar calendario operativo, feriados y dias efectivamente trabajados
  • precisar relevamientos de mercado, comparabilidad de precio y contexto temporal de costo y oferta
  • precisar criterios de cliente subdesarrollado, SKU natural siguiente y comparacion entre clientes similares
  • precisar trazabilidad entre recomendado, ejecutado y resultado
  • bajar a documento futuro el diseno de replicacion SOURCE-003-PYTHON-POSTGRES-REPLICATION-DESIGN.md
  • formalizar contrato OpenClaw executor, gates, observabilidad, reintentos, calidad y secretos antes de cualquier sync futura

Que no se debe hacer todavia

  • no implementar runtime
  • no mover infraestructura
  • no tocar Docker
  • no tocar OpenClaw runtime
  • no crear nuevas migraciones ni tablas fisicas sin aprobacion explicita
  • no disenar APIs
  • no disenar IA
  • no conectar fuentes reales
  • no declarar observer operativo
  • no declarar implementada la Inventory Events Layer

Proximos pasos

  1. cerrar la vision APV del observer
  2. abrir, si Gabi lo aprueba, una tarea separada para implementar escritura real RAW -> CORE sobre el gate promote-core --execute ya creado
  3. mantener separado lo que es Core de lo que es APV
  4. usar el Governance Model como referencia oficial para nuevos cambios
  5. inventariar fuentes reales existentes para validar auditoria y contrato de datos
  6. ampliar el inventario real iniciado con SOURCE-001 - VCLIENTES
  7. preparar mapeo origen-destino sobre ese inventario real
  8. decidir listas oficiales y cadencia de revision de prioridades comerciales
  9. cerrar glosario oficial de objetivos, metas, owners y cumplimiento
  10. bajar el ciclo de aprendizaje comercial a criterios operativos observables
  11. bajar reglas y necesidades funcionales especificas del Use Case 004
  12. bajar reglas y necesidades funcionales especificas del Use Case 005
  13. bajar reglas y necesidades funcionales especificas del Use Case 006
  14. bajar reglas y necesidades funcionales especificas del Use Case 008
  15. bajar reglas y necesidades funcionales especificas del Use Case 009
  16. mantener la Inventory Events Layer como roadmap futuro, separada de snapshot diario y stock vivo

Criterio de cierre actual

Esta etapa se considera cerrada cuando existe una estructura documental clara, navegable y consistente para alpuntodeventa, sin duplicar en exceso la capa global, sin mezclar reglas de otros tenants y con reglas oficiales ya documentadas para Use Case 001 y Use Case 002, y con Use Case 003 cerrado en definicion conceptual tenant, y Use Case 004 y Use Case 005 cerrados en definicion funcional tenant, y Use Case 006 cerrado en definicion funcional tenant, y Use Case 007 cerrado en definicion funcional tenant, y Use Case 008 cerrado en definicion funcional tenant, y Use Case 009 cerrado en definicion funcional tenant, y una auditoria de fundacion de datos creada para sostener UC001 a UC009, y un contrato funcional de datos creado para ordenar futura implementacion documental, y una capa futura documentada para Inventory Events Layer, sin declarar operacion, sin SQL, sin APIs y sin IA.