Registro #85: el webhook de Jira FAC queda en producción (paputec) — publicación de 5145801, secreto nuevo, PUT del webhook id 1 y prueba e2e con FAC-170 detectada en 1.05 s (HMAC, verificada) y borrada; producción sigue en Bind__Mode=Write por decisión de Johann

This commit is contained in:
Johann
2026-09-30 00:31:55 -06:00
parent e88b5e1eb8
commit 7e50c71791
3 changed files with 63 additions and 16 deletions
+32 -2
View File
@@ -1803,11 +1803,41 @@ La bandeja permite marcar varios tickets (solo los que aún no tienen cotizació
---
## 85 · Sep 30, 2026 — madrugada (≈12:10–12:45 AM) · Despliegue · El webhook de Jira FAC queda EN PRODUCCIÓN (paputec): publicado, secreto nuevo, webhook id 1 movido y prueba de punta a punta con FAC-170 en 1.05 s ⭐
> Contexto: sesión de Johann con Claude Code, continuación del [#84](REGISTRO.md) en la otra máquina (la que tiene la llave SSH de paputec). **Autorizaciones de Johann dadas en la sesión, una por una:** ejecutar el plan (pull, publicación, secreto), el `PUT` del webhook, y crear + borrar el ticket de prueba. Evidencia: commit `9351aa4` del repo del cliente, fila id 1 de `JiraTicketEvents` en la BD de paputec y log del contenedor `balam-api`.
**1. Las dos bitácoras del 29-sep chocaban.** Esta máquina tenía sin publicar los registros [#71](REGISTRO.md)–[#83](REGISTRO.md) (commit `3de2739`); la otra publicó la sesión del webhook también como "#71". Al fusionar (commit `e88b5e1`) la del webhook pasó a ser el [#84](REGISTRO.md), con nota de renumeración. Lección: antes de numerar un registro, `git pull`.
**2. Publicación en paputec.** Plataforma en `5145801` (cuatro commits nuevos para producción: `4d6b3d8` puente a la UI de BIND, `d7238da` webhook, `8479e96`, `5145801`). Antes de publicar: **116 pruebas en verde** (13 + 14 + 51 + 38), respaldo manual de la BD (`balam-20260930-062117.sql.gz`) y la imagen anterior etiquetada `balam-api:pre-webhook-20260930` para rollback. `deploy/paputec/deploy.sh` completo (frontend + API) → API sana, frontend 200. La migración `20260930005018_JiraTicketEvents` se aplicó al arrancar (la última aplicada era la del 12-ago). Log de arranque: solo los dos mensajes benignos del runbook. **El puente a la UI de BIND queda apagado en producción** (no hay `Bind__Ui__*` en el `.env`; default `Enabled=false`).
**3. Secreto nuevo.** `openssl rand -base64 32`, guardado en `~/jira-webhook-secret.txt` (0600) de esta máquina y agregado a `/opt/balam/.env` como **`Jira__Webhook__Secret`** (doble guion bajo: la clave de configuración es `Jira:Webhook:Secret`). Nunca se imprimió; se compararon los sha256 de ambos lados y coinciden. `docker compose up -d api`. El secreto del piloto del 29-sep (el que iba en la URL de ngrok) queda sin uso.
**4. Verificación sin tocar Jira, a través de Apache** (`https://paputec.mx/balam/api/jira/webhook`): antes del secreto → 404 (receptor apagado); con `?token=malo` → **401**; sin credencial → 401; `X-Hub-Signature` inventada → 401; firma HMAC correcta con un evento no suscrito → **202 ignorado** (no toca Jira ni la BD), también con un cuerpo de 280 KB; GET → 405. **Apache no bloquea el POST anónimo**; el cuerpo grande, con HTML y SQL en el texto, pasó sin filtro.
**5. Escrituras en el Jira del cliente (continúan la numeración del [#84](REGISTRO.md)):**
- **Jira-op 4 (00:25:18):** `PUT /rest/webhooks/1.0/webhook/1` → **200** (el PUT existe; no hizo falta borrar y registrar). Releído por GET: nombre "Balam plataforma · FAC ticket creado", destino `https://paputec.mx/balam/api/jira/webhook` **sin query** (solo HMAC), habilitado, `jira:issue_created`, filtro `project = FAC`.
- **Jira-op 5 (00:28:29):** ticket de prueba **FAC-170** (id 17865) creado por API, asignado a Pedro → producción lo registró como **evento id 1: `Verified = true`, `AuthMethod = hmac`, estatus Open, 1.05 s** después del timestamp del evento (emitido 00:28:29.530, recibido 00:28:30.579). Log: `[jira-webhook] jira:issue_created FAC-170 detectado · verificado=True · auth=hmac · retraso=1.0s`.
- **Jira-op 6 (00:28:38):** FAC-170 **borrado** (204; GET posterior → 404). Vivió 9 segundos. Como con FAC-169, a Pedro le llega el correo de la regla "Confirmación ticket creado - FACT".
**6. Hallazgo: producción corre con `Bind__Mode=Write`.** Así estaba `/opt/balam/.env` (el contenedor reemplazado llevaba 3 semanas arriba), contra lo que dicen el runbook y el [#77](REGISTRO.md). No se tocó. **Johann decidió dejarlo en Write** (30-sep). El receptor del webhook no escribe en BIND en ningún caso, y `Jira__Mode` sigue en ReadOnly.
**7. Script de operación** ([`../planeacion/jira-webhook-prueba.py`](../planeacion/jira-webhook-prueba.py)): `esperar CLAVE paputec` consulta la BD de producción por ssh (antes solo el contenedor local), y la fecha del ticket de prueba ya no va fija en 29-sep.
**Estado al cierre:** la detección de tickets creados en FAC funciona en producción y ya no depende de ninguna máquina encendida. Ninguna escritura en BIND. Sigue abierto lo urgente del [#84](REGISTRO.md): el API público de BIND en 500 (sync detenido desde el 10-sep) y la prefactura 2467 por confirmar con Balam.
> **Lectura estratégica:**
> - **El primer eslabón de "ticket creado → cotización" ya es infraestructura, no demo.** Falta lo que le da valor: que cada detección arme sola la vista previa (dry-run) y el ticket aparezca como "lista para revisar". La confirmación sigue siendo humana (ADR-001).
> - ⚠️ **Ese siguiente paso choca con el bloqueo del API de BIND:** el prellenado de la cotización resuelve moneda, ubicación, almacén y servicio con los catálogos del API público (`GET /api/emision/catalogos`), que hoy responde 500. Sin la API key del usuario `CTO` (o el acceso de Arturo reparado), la vista previa automática se puede construir y probar con `FakeHandler`, pero no validar contra BIND.
> - **El webhook es de un solo intento útil:** sin el poller de respaldo, un aviso que Jira no logre entregar (paputec caído, despliegue en curso) se pierde. Conviene construirlo junto con la vista previa.
---
## Resumen ejecutivo del hilo (para contexto rápido)
### Estado actual (al 29-sep-2026 — Etapa 2 en producción provisional)
### Estado actual (al 30-sep-2026 — Etapa 2 en producción provisional)
**La plataforma está publicada en https://paputec.mx/balam/** desde el 3-sep (ambiente provisional propio; Azure sigue sin entregarse, [#74](REGISTRO.md)/[#76](REGISTRO.md)) y Balam ya la opera en sesiones acompañadas: cotizaciones reales desde tickets, individuales y en lote, con `Bind:Mode=ReadOnly` fuera de sesión ([#77](REGISTRO.md)–[#79](REGISTRO.md)). **La cadena termina hoy en la cotización.** La prefactura por el API público es imposible — `false` = remisión, `true` = CFDI timbrado; incidente 2386 del 26-ago ([#70](REGISTRO.md)) — y el SDK oficial lo confirma ([#83](REGISTRO.md)). El camino es el **endpoint interno de la UI** (*Generar Venta → Prefactura*, petición `InvoiceDetails`, [#80](REGISTRO.md)), para el que Balam entregó **login web** el 29-sep. **Siguiente hito:** especificar ese endpoint con la sesión propia y construir `BindUiClient` bajo ADR-001. **Seguimiento con Pedro** (sesiones "Seguimiento PAF" a las 7:00 am o 1:00 pm; informes de Read AI de Noé). Horas al 16-sep: 94.58 h; Excel de avance en Google Sheets ([#82](REGISTRO.md)). **Abiertos:** cancelación SAT de la 2386, remisiones 1000/1001, Azure, a quién se reportan horas, y el error al cargar la solicitud al crear cotización visto el 29-sep.
**La plataforma está publicada en https://paputec.mx/balam/** desde el 3-sep (ambiente provisional propio; Azure sigue sin entregarse, [#74](REGISTRO.md)/[#76](REGISTRO.md)) y Balam ya la opera en sesiones acompañadas: cotizaciones reales desde tickets, individuales y en lote ([#77](REGISTRO.md)–[#79](REGISTRO.md)). Producción corre con `Bind__Mode=Write` por decisión de Johann del 30-sep ([#85](REGISTRO.md)). **La cadena ya llegó a la prefactura:** por el API público es imposible — `false` = remisión, `true` = CFDI timbrado; incidente 2386 del 26-ago ([#70](REGISTRO.md)), confirmado con el SDK oficial ([#83](REGISTRO.md)) — pero el puente a la UI de BIND (`BindUiClient`, *Generar Venta → Prefactura*, con el login web que Balam entregó el 29-sep) creó ese mismo día la **primera prefactura real, folio 2467** ([#84](REGISTRO.md)); en paputec el puente sigue apagado. **Y la cadena ya arranca sola:** desde el 30-sep el webhook de Jira avisa a producción cada ticket creado en FAC ([#85](REGISTRO.md)). **Siguiente hito:** con cada detección, armar la vista previa (dry-run) de la cotización y marcar el ticket "lista para revisar"; la confirmación sigue siendo humana (ADR-001). **Seguimiento con Pedro** (sesiones "Seguimiento PAF" a las 7:00 am o 1:00 pm; informes de Read AI de Noé). Horas al 16-sep: 94.58 h; Excel de avance en Google Sheets ([#82](REGISTRO.md)). **Abiertos:** API público de BIND en 500 con la key de Arturo (sync detenido desde el 10-sep), prefactura 2467 por confirmar con Balam, cancelación SAT de la 2386, remisiones 1000/1001, Azure, a quién se reportan horas, y el error al cargar la solicitud al crear cotización visto el 29-sep.
### Datos duros confirmados por Balam
- **BIND ERP:** API existe y es viable (confirmado 25-may). Límite 20K req/día. PAC para CFDI integrado en BIND.