Saltar a contenido

PDF-012E - Outbox Worker Dry-Run Local Dev

Objetivo

PDF-012E crea y ejecuta en local/dev un worker dry-run que lee una notification outbox READY_BLOCKED, evalua si podria enviarse, confirma que esta bloqueada por defecto y registra una decision segura sin enviar email.

Precondiciones

  • DB local/dev: gestion_de_negocios_core.
  • Usuario: openclaw_bo_admin.
  • Schema: business_observer.
  • Tablas: business_observer.ecommerce_customer_requests, business_observer.ecommerce_customer_request_audit, business_observer.ecommerce_notification_outbox y business_observer.ecommerce_notification_event_log.
  • Notification: PDF-012D:BILLING_CUSTOMER_REQUEST:TEST001.
  • Estado: READY_BLOCKED.
  • Recipient: facturacion@ladirecta.com.ar.
  • Bloqueo: send_blocked_by_default=true.

Worker dry-run

El worker corre solo como script local/dev: execute_pdf_012e_outbox_worker_dry_run.py.

Evalua recipient permitido, idempotencia, rate-limit conceptual, status elegible y bloqueo por defecto. No queda worker real persistente ni scheduler.

Notification evaluada

  • idempotency_key=PDF-012D:BILLING_CUSTOMER_REQUEST:TEST001.
  • notification_type=BILLING_CUSTOMER_REQUEST.
  • recipient_email=facturacion@ladirecta.com.ar.
  • status=READY_BLOCKED.
  • send_blocked_by_default=true.

Decision

  • worker_mode=DRY_RUN.
  • worker_decision=SEND_ELIGIBLE_BUT_BLOCKED.
  • target_status=READY_BLOCKED.
  • email_sent=false.
  • smtp_send_commands_executed=false.

La decision se guarda en business_observer.ecommerce_notification_event_log con event_type=SEND_BLOCKED, event_status=BLOCKED y event_payload_sanitized.semantic_event=WORKER_DRY_RUN_EVALUATED.

Idempotencia

El script se reejecuta para simular reintento. La decision no se duplica: queda como maximo un evento activo por notification, source PDF-012E y semantic_event=WORKER_DRY_RUN_EVALUATED.

Rate-limit y bloqueo

El gate confirma:

  • recipient permitido;
  • send_blocked_by_default=true;
  • no envio si el status no es elegible;
  • no envio si el recipient no es permitido;
  • no envio si la decision dry-run ya existe.

SQL write local/dev exacto

SQL write autorizado y ejecutado:

  • INSERT idempotente en business_observer.ecommerce_notification_event_log.

No se actualizo status de outbox. La notification sigue READY_BLOCKED.

Que NO se hizo

No se enviaron emails reales. No se ejecuto --confirm-send. No se ejecuto MAIL FROM, RCPT TO ni DATA. No se conecto SMTP para envio. No se toco WooCommerce API. No se escribio en SGC. No se usaron datos reales. No se imprimieron secrets/passwords. No se toco VPS/prod con datos. No se activo runtime, sync, scheduler, cron ni pipelines.

Proximo paso hacia produccion

El proximo gate recomendado es PDF-012F: envio real controlado desde outbox, con autorizacion explicita, single-send, evidencia SMTP sanitizada, idempotencia persistente y rollback operativo.