Registro #86, adenda: push y publicación de la vista previa automática; la causa del 500 de BIND es la key de arturo (la de cto responde 200) y falta cambiarla en paputec — Claude Code no pudo escribir ese secreto

This commit is contained in:
Johann
2026-09-30 00:55:16 -06:00
parent daa6a62e86
commit 085e9037e8
2 changed files with 15 additions and 5 deletions
+6 -3
View File
@@ -2,12 +2,15 @@
Acciones vivas del proyecto. Formato: `[ ]` abierta · `[x]` cerrada (no se borran, dejan rastro). Cada una con responsable y, si aplica, fecha. Ver contexto en [REGISTRO.md](REGISTRO.md). Acciones vivas del proyecto. Formato: `[ ]` abierta · `[x]` cerrada (no se borran, dejan rastro). Cada una con responsable y, si aplica, fecha. Ver contexto en [REGISTRO.md](REGISTRO.md).
_Última actualización: **2026-09-30** — ⭐ 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 ([REGISTRO #85](REGISTRO.md)); y la vista previa automática de la cotización queda **construida en local, sin publicar** ([#86](REGISTRO.md)). Además, fusión de las dos sesiones paralelas del 29-sep: la del webhook pasa a ser el [#84](REGISTRO.md) (nació como #71 en la otra máquina). Anterior: **2026-09-29** — ⭐ Balam entrega **login web a BIND** con permisos de prefactura; endpoint interno de la UI confirmado (*Generar Venta → Prefactura*, petición `InvoiceDetails`) y el modelo de dos endpoints corroborado con el SDK oficial ([REGISTRO #83](REGISTRO.md)). **Huecos de registro cerrados:** las sesiones del 21-ago al 10-sep se reconstruyeron desde el buzón ([#71](REGISTRO.md)–[#82](REGISTRO.md)). Anterior: **2026-09-15** — corte de horas 10-ago→15-sep reconstruido y huecos de registro listados (seis sesiones sin bitácora). Anterior: **2026-08-21, mediodía** — ⭐ primera cotización real emitida (folio 1026; la 2.ª, corregida, pendiente de confirmar). Anterior: **2026-08-20, noche.** Cruce completo del buzón contra la bitácora (MCP ms365): se incorporaron 9 comunicaciones faltantes y se corrigieron 2 errores de registro. **Hay sesión mañana viernes 21-ago, 7:00 am** con Noé, Ara y Pedro sobre el formulario modificado y `FAC-106`. Ver [REGISTRO #65](REGISTRO.md)–[#68](REGISTRO.md)._ _Última actualización: **2026-09-30** — ⭐ 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 ([REGISTRO #85](REGISTRO.md)); y la vista previa automática de la cotización queda **publicada** ([#86](REGISTRO.md)). 🔥 **Causa del 500 de BIND encontrada:** la key de `arturo` dejó de servir; la de `cto` responde 200 y falta ponerla en paputec. Además, fusión de las dos sesiones paralelas del 29-sep: la del webhook pasa a ser el [#84](REGISTRO.md) (nació como #71 en la otra máquina). Anterior: **2026-09-29** — ⭐ Balam entrega **login web a BIND** con permisos de prefactura; endpoint interno de la UI confirmado (*Generar Venta → Prefactura*, petición `InvoiceDetails`) y el modelo de dos endpoints corroborado con el SDK oficial ([REGISTRO #83](REGISTRO.md)). **Huecos de registro cerrados:** las sesiones del 21-ago al 10-sep se reconstruyeron desde el buzón ([#71](REGISTRO.md)–[#82](REGISTRO.md)). Anterior: **2026-09-15** — corte de horas 10-ago→15-sep reconstruido y huecos de registro listados (seis sesiones sin bitácora). Anterior: **2026-08-21, mediodía** — ⭐ primera cotización real emitida (folio 1026; la 2.ª, corregida, pendiente de confirmar). Anterior: **2026-08-20, noche.** Cruce completo del buzón contra la bitácora (MCP ms365): se incorporaron 9 comunicaciones faltantes y se corrigieron 2 errores de registro. **Hay sesión mañana viernes 21-ago, 7:00 am** con Noé, Ara y Pedro sobre el formulario modificado y `FAC-106`. Ver [REGISTRO #65](REGISTRO.md)–[#68](REGISTRO.md)._
## ⭐ 30-sep — webhook de Jira en producción ([REGISTRO #85](REGISTRO.md)) y vista previa automática ([#86](REGISTRO.md)) ## ⭐ 30-sep — webhook de Jira en producción ([REGISTRO #85](REGISTRO.md)) y vista previa automática ([#86](REGISTRO.md))
- [x] ~~🔧 **Siguiente meta:** con cada `JiraTicketEvent` verificado, armar la vista previa (dry-run) de la cotización y marcar el ticket "lista para revisar" en la bandeja.~~ → **CONSTRUIDA el 30-sep** (commits locales `1c37eaa` y `287cb65`, 147 pruebas en verde, [#86](REGISTRO.md)). La confirmación sigue siendo humana (ADR-001). - [x] ~~🔧 **Siguiente meta:** con cada `JiraTicketEvent` verificado, armar la vista previa (dry-run) de la cotización y marcar el ticket "lista para revisar" en la bandeja.~~ → **CONSTRUIDA el 30-sep** (commits locales `1c37eaa` y `287cb65`, 147 pruebas en verde, [#86](REGISTRO.md)). La confirmación sigue siendo humana (ADR-001).
- [ ] 🚀 **Johann — decidir push + publicación de la vista previa automática** (`1c37eaa` + `287cb65`: migración aditiva de 5 columnas). ⚠️ Con el API público de BIND en 500, en producción toda vista previa quedará en "Vista previa pendiente" hasta que vuelva; conviene publicarla junto con la API key del usuario `CTO`. Al publicar: abrir la bandeja en el navegador (el chip no se ha visto en pantalla) y, con autorización, un ticket de prueba. - [x] ~~🚀 **Johann — decidir push + publicación de la vista previa automática**~~ → **HECHO el 30-sep por orden de Johann:** push de `1c37eaa` + `287cb65` y publicación en paputec (migración aplicada, trabajador activo, FAC-170 → `NoAplica`). Ver adenda del [#86](REGISTRO.md).
- [ ] 🔥🔑 **Johann — poner la API key del usuario `cto` en `Bind__ApiKey` de `/opt/balam/.env`** y `docker compose up -d api` (rotación de secreto del runbook). La key está en `backend/appsettings.local.json` de la Mac de desarrollo y **ya se probó: 200** en `/api/Currencies` y `/api/Clients`; la de `arturo`, la que hoy usa producción, es la que responde 500. Claude Code no pudo hacerlo (escritura de secretos bloqueada por permisos). Al entrar: verificar `[sync] Ciclo OK` en el log, y el barrido preparará solo las vistas previas pendientes.
- [ ] 🧪 Con la key nueva en producción: abrir la bandeja en el navegador (el chip no se ha visto en pantalla) y, con autorización, un ticket de prueba para ver una vista previa real de punta a punta.
- [ ] 🧹 Imagen de rollback `balam-api:pre-vistaprevia-20260930` en paputec (además de la `pre-webhook`): borrarlas cuando la versión lleve unos días estable.
- [ ] 🔧 **Deuda:** las reglas de prellenado viven dos veces (`cotizacion-prefill.ts` y `CotizacionPrefill.cs`). Que las pantallas de cotización (individual y lote) consuman el prellenado y el dry-run ya preparado del servidor. - [ ] 🔧 **Deuda:** las reglas de prellenado viven dos veces (`cotizacion-prefill.ts` y `CotizacionPrefill.cs`). Que las pantallas de cotización (individual y lote) consuman el prellenado y el dry-run ya preparado del servidor.
- [ ] 🔧 Suscribir `jira:issue_updated` (o repetir la vista previa al abrir el ticket) para que "Faltan datos" se actualice cuando alguien completa el ticket en Jira. - [ ] 🔧 Suscribir `jira:issue_updated` (o repetir la vista previa al abrir el ticket) para que "Faltan datos" se actualice cuando alguien completa el ticket en Jira.
- [ ] ⚠️ **Producción corre con `Bind__Mode=Write`** (así estaba en `/opt/balam/.env`; el contenedor anterior llevaba 3 semanas arriba). **Johann decidió dejarlo así el 30-sep.** El runbook y el `CLAUDE.md` de la plataforma siguen diciendo que producción corre en ReadOnly: falta alinear esa documentación con la decisión, o regresarlo a ReadOnly cuando Johann lo indique. - [ ] ⚠️ **Producción corre con `Bind__Mode=Write`** (así estaba en `/opt/balam/.env`; el contenedor anterior llevaba 3 semanas arriba). **Johann decidió dejarlo así el 30-sep.** El runbook y el `CLAUDE.md` de la plataforma siguen diciendo que producción corre en ReadOnly: falta alinear esa documentación con la decisión, o regresarlo a ReadOnly cuando Johann lo indique.
@@ -38,7 +41,7 @@ _Última actualización: **2026-09-30** — ⭐ el webhook de Jira FAC queda **e
- [x] ~~🔧 **Siguiente paso de la meta:** vista previa (dry-run) de la cotización por cada detección.~~ → **Construida el 30-sep** ([#86](REGISTRO.md)); su publicación está en el bloque del 30-sep, arriba. - [x] ~~🔧 **Siguiente paso de la meta:** vista previa (dry-run) de la cotización por cada detección.~~ → **Construida el 30-sep** ([#86](REGISTRO.md)); su publicación está en el bloque del 30-sep, arriba.
- [x] ~~☁️ **Destino productivo del webhook:** ngrok con dominio fijo (de pago) vs Azure (sigue bloqueado por el cliente).~~ → **Resuelto por ahora con paputec** (30-sep), el mismo ambiente provisional de la plataforma. Cuando exista Azure, el webhook se mueve con otro `PUT`. - [x] ~~☁️ **Destino productivo del webhook:** ngrok con dominio fijo (de pago) vs Azure (sigue bloqueado por el cliente).~~ → **Resuelto por ahora con paputec** (30-sep), el mismo ambiente provisional de la plataforma. Cuando exista Azure, el webhook se mueve con otro `PUT`.
- [ ] ⚠️ **Una sola sesión de Claude Code dueña de la API** en sesiones de escritura (el 29-sep otra sesión la relanzó en ReadOnly). - [ ] ⚠️ **Una sola sesión de Claude Code dueña de la API** en sesiones de escritura (el 29-sep otra sesión la relanzó en ReadOnly).
- [ ] 🔥 **API público de BIND en 500 en todos los endpoints** (key de Arturo) — sync detenido desde el 10-sep. Pedir a Balam la API key del usuario `CTO` o revisar el acceso de Arturo. - [ ] 🔥 **API público de BIND en 500 en todos los endpoints** (key de Arturo) — sync detenido desde el 10-sep. Pedir a Balam la API key del usuario `CTO` o revisar el acceso de Arturo. **→ 30-sep: causa encontrada.** El API no está caído: la key de `arturo` es la que falla; la de `cto` responde 200. Falta cambiarla en paputec (bloque del 30-sep, arriba).
- [ ] 🔥 **Prefactura 2467 ($777,777 MXN, ACUNTIA, FAC-166):** confirmar con Balam si es prueba (cancelar/borrar antes de que alguien la timbre) o real; revisar que al timbrar quede **PPD**, no el PUE que BIND le puso. - [ ] 🔥 **Prefactura 2467 ($777,777 MXN, ACUNTIA, FAC-166):** confirmar con Balam si es prueba (cancelar/borrar antes de que alguien la timbre) o real; revisar que al timbrar quede **PPD**, no el PUE que BIND le puso.
- [ ] 📧 **Avisar a Pedro de la cotización 1079 marcada como Surtida por error** (`QuotesAPI/FillQuote` escribe por GET); sin efecto fiscal, irreversible desde la UI. - [ ] 📧 **Avisar a Pedro de la cotización 1079 marcada como Surtida por error** (`QuotesAPI/FillQuote` escribe por GET); sin efecto fiscal, irreversible desde la UI.
- [ ] 🔧 Tomar el bloque `Client` de `ClientsAPI/GetClientSelectedById` (hoy `CFDI_Use` puede heredarse de la factura de OTRO cliente) y que el wizard no muestre G03/16% cuando el puente manda lo de BIND. - [ ] 🔧 Tomar el bloque `Client` de `ClientsAPI/GetClientSelectedById` (hoy `CFDI_Use` puede heredarse de la factura de OTRO cliente) y que el wizard no muestre G03/16% cuando el puente manda lo de BIND.
+9 -2
View File
@@ -1833,7 +1833,7 @@ La bandeja permite marcar varios tickets (solo los que aún no tienen cotizació
--- ---
## 86 · Sep 30, 2026 — madrugada (≈12:35–12:50 AM) · Desarrollo · Vista previa AUTOMÁTICA de la cotización por cada ticket detectado: "Lista para revisar" en la bandeja — construida y probada en local, SIN publicar ## 86 · Sep 30, 2026 — madrugada (≈12:35–12:50 AM) · Desarrollo · Vista previa AUTOMÁTICA de la cotización por cada ticket detectado: "Lista para revisar" en la bandeja — construida, probada y PUBLICADA (ver adenda); le falta la API key nueva de BIND para servir
> Contexto: misma sesión del [#85](REGISTRO.md); es la "siguiente meta" del plan del webhook ([#84](REGISTRO.md)). Evidencia: commits locales `1c37eaa` y `287cb65` del repo del cliente (**sin push y sin desplegar**: eso espera la orden de Johann). No se tocó Jira, BIND ni producción. > Contexto: misma sesión del [#85](REGISTRO.md); es la "siguiente meta" del plan del webhook ([#84](REGISTRO.md)). Evidencia: commits locales `1c37eaa` y `287cb65` del repo del cliente (**sin push y sin desplegar**: eso espera la orden de Johann). No se tocó Jira, BIND ni producción.
@@ -1854,13 +1854,20 @@ La bandeja permite marcar varios tickets (solo los que aún no tienen cotizació
> - **Deuda consciente:** las reglas de prellenado viven dos veces (TypeScript y C#). Hay pruebas del lado del servidor y avisos en ambos archivos, pero lo correcto es que las pantallas consuman el prellenado del servidor. > - **Deuda consciente:** las reglas de prellenado viven dos veces (TypeScript y C#). Hay pruebas del lado del servidor y avisos en ambos archivos, pero lo correcto es que las pantallas consuman el prellenado del servidor.
> - **Limitación:** el estado es una foto del momento de la creación. Si alguien completa el ticket en Jira después, "Faltan datos" no se entera (el webhook solo escucha `issue_created`); se repite a mano o al abrir la pantalla. > - **Limitación:** el estado es una foto del momento de la creación. Si alguien completa el ticket en Jira después, "Faltan datos" no se entera (el webhook solo escucha `issue_created`); se repite a mano o al abrir la pantalla.
**ADENDA (30-sep, ≈12:50–1:00 AM) — push, publicación y la causa del 500 de BIND.** Johann ordenó *"haz push y publica"* y dio la pista: el 500 se debe a que producción usa la API key vieja; la nueva está en el `appsettings.local.json` de desarrollo.
- **Push** de los dos repos (`1c37eaa` y `287cb65` al repo del cliente; la bitácora a `git.paputec.mx`).
- ⭐ **La pista era correcta.** La key del archivo local es de **`cto|128469`** (emitida el 29-sep; la de producción es otra, comparadas por huella sin imprimirlas) y **responde 200**: `GET /api/Currencies` → 4 monedas, `GET /api/Clients?$top=1` → 1 fila. Dos lecturas, nada más. La key de `arturo` sigue en 500 en todos los endpoints: **el API público de BIND no está caído; lo que dejó de servir es esa key.**
- **Publicación** (00:53): respaldo manual (`balam-20260930-065306.sql.gz`), imagen anterior etiquetada `balam-api:pre-vistaprevia-20260930`, `deploy.sh` completo → API sana. Migración `20260930063914_JiraTicketEventsVistaPrevia` aplicada. El trabajador arrancó (`[vista-previa] Activa: barrido de pendientes cada 15 min`) y su primer barrido resolvió el único evento que había: **FAC-170 → `NoAplica`** ("El ticket ya no existe en Jira"), lo esperado para el ticket de prueba borrado. El webhook sigue respondiendo (401 con token malo, 202 con firma válida).
- ⛔ **Lo que NO se hizo: cambiar `Bind__ApiKey` en `/opt/balam/.env`.** El control de permisos de Claude Code bloqueó la escritura de ese secreto y no se intentó por otra vía; el servidor quedó intacto. Producción sigue con la key de `arturo`: **el sync sigue fallando con 500** (visto en el log tras publicar) y toda vista previa nueva quedará en "Vista previa pendiente". Queda como acción de Johann (rotación de secreto del runbook: editar el `.env` y `up -d api`); al entrar la key nueva, el sync se reanuda solo y el barrido prepara lo pendiente de los últimos 7 días.
- ⚠️ El `appsettings.local.json` de esta máquina está en `backend/` y el API lo busca en `backend/src/Balam.Api/appsettings.Local.json`: donde está, no se carga. Y trae `Bind:Mode=Write` y `Bind:Ui:Mode=Write`: al moverlo, la instancia local arrancaría en escritura.
--- ---
## Resumen ejecutivo del hilo (para contexto rápido) ## Resumen ejecutivo del hilo (para contexto rápido)
### Estado actual (al 30-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 ([#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:** publicar la vista previa automática de la cotización ("Lista para revisar" en la bandeja), ya construida en local ([#86](REGISTRO.md)) — depende de que el API público de BIND vuelva; 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. **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)). La vista previa automática de la cotización ("Lista para revisar" en la bandeja) también quedó publicada el 30-sep ([#86](REGISTRO.md)); la confirmación sigue siendo humana (ADR-001). **Siguiente hito:** poner en paputec la API key del usuario `cto` — la de `arturo` es la que responde 500; la de `cto` ya se probó con 200 — para que vuelvan el sync y los catálogos, y entonces validar una vista previa real de punta a punta. **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:** cambiar en paputec la API key de BIND por la de `cto` (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 ### 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. - **BIND ERP:** API existe y es viable (confirmado 25-may). Límite 20K req/día. PAC para CFDI integrado en BIND.