Corte de horas al 15-sep (94.08 h): 39.25 h del 10-ago al 15-sep reconstruidas con evidencia y Excel de avance; seis sesiones sin bitácora listadas como huecos

- Seguimiento-horas.csv: 30 filas nuevas (sesiones 'Seguimiento PAF' del 21, 24
  y 26-ago y 3, 9 y 10-sep acotadas por los informes de Read AI; bloques de
  desarrollo por commits y mtimes; comunicación con Pedro y Noé). Marcadas
  `reconstruida` salvo la sesión del 12-ago (transcript). Actividades nuevas
  E1-09, E2-02, E2-03, E3-01, E3-02. Etapa 1 32.25 h, Etapa 2 23.75 h, ajuste
  Jira 14.75 h (rebasa las 7–10 aprobadas), Etapa 3 1.50 h.
- Avance-Balam-2026-09-15.xlsx generado desde generar_avance_2026_09_15.py
  (parte del corte 06b; el reparto por fila aborta si no cuadra con el CSV):
  publicación provisional en paputec.mx, cotización individual y en lote,
  prefactura por API bloqueada por BIND.
- Seguimiento-horas.md: sección del corte y criterios de la reconstrucción.
- PENDIENTES.md: huecos de registro del corte (seis sesiones sin REGISTRO,
  publicación del 3-sep y lote del 7-sep sin registrar, validación de horas,
  correos de Noé del 24-ago).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Johann
2026-09-15 08:48:23 -06:00
parent db16f62b28
commit d9047de6fa
5 changed files with 311 additions and 2 deletions
+8 -1
View File
@@ -2,7 +2,14 @@
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-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-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)._
## 🚨 Huecos de registro (detectados en el corte del 15-sep)
- [ ] 🚨 **Seis sesiones con Balam sin entrada en REGISTRO.md** (evidencia: convocatorias de Pedro e informes de Read AI en el buzón): **21-ago 1:00 pm** "Seguimiento - PAF (2)" (homologación de estados del flujo; pendiente prueba de escritura en Jira), **24-ago 7:00 am** (validación cotización→prefactura MXN/USD, IVA 16 %/0 %; Noé condiciona Azure a que las pruebas funcionen), **26-ago 7:00 am** (permisos y flujo remisión/prefactura/factura; el POST se timbró en vivo → [#70](REGISTRO.md)), **3-sep 7:00 am** (datos del tenant de Azure; conceptos de Acuntia por headcount; definición: ítem por código y concepto = título del ticket) y **1:30 pm** (tres tickets de Pedro cotizados desde la plataforma publicada), **9-sep 1:00 pm** "Seguimiento PAF - Prefactura" (Araceli crea una prefactura en la UI de BIND con "Generar venta" mientras se capturan las peticiones: `InvoiceDetails`), **10-sep 1:00 pm** (con Pedro: cotización 1078 de Acuntia y captura de la petición de red de la prefactura).
- [ ] 📝 **Registrar la publicación del 3-sep** (https://paputec.mx/balam/, runbook en `balam-plataforma/deploy/paputec/README.md`) y la **cotización en lote del 7-sep** — hoy solo constan en el CLAUDE.md del repo del cliente y en los commits `03582af`, `ed4c819`, `fbdbd18` (pusheados el 15-sep).
- [ ] ⏱️ **Validar las 39.25 h reconstruidas** del 10-ago al 15-sep en `../planeacion/Seguimiento-horas.csv` (todas marcadas `reconstruida`, con la evidencia en cada fila) y decidir a quién se reporta el corte ahora que el seguimiento es con Pedro. Excel listo: `../planeacion/Avance-Balam-2026-09-15.xlsx`.
- [ ] 📧 **Correos de Noé del 24-ago sin registrar:** "Re: Seguimiento FAC-106" (explica que la prefactura se genera con *Generar venta* en Acciones) y "Acceso a Azure Balam y permisos" (pide los requisitos exactos; Johann respondió el 25-ago con suscripción + grupo de recursos + Contributor).
## 🔥🔴 26-ago — incidente del timbrado y cierre de la investigación ([REGISTRO #70](REGISTRO.md))
Binary file not shown.
+30
View File
@@ -47,3 +47,33 @@ fecha,semana,etapa,actividad_id,actividad,horas,estado_hora,fuente_evidencia,fac
2026-08-06,2026-W32,2,AJ-01,"Bandeja de solicitudes y detalle de ticket fieles al prototipo leyendo FAC en vivo (estatus reales, solo lectura) + adjuntos descargables vía proxy",0.50,confirmada,bitacora/PENDIENTES.md,si,"Sesión asistida por IA; tiempo real de sesión; commits e2c2d18 y 76ad7b1 (cliente)"
2026-08-06,2026-W32,2,E2-01,"Shell con el chrome del prototipo aplicado a toda la app (sidebar con grupos y logo oficial, breadcrumb, chips de sync y módulos próximamente)",0.25,confirmada,prototipo/Prototipo-Etapa0.html,si,"Sesión asistida por IA; tiempo real de sesión; commit e2c2d18 (cliente)"
2026-08-06,2026-W32,2,E2-01,"Wizard de emisión asistida (5 pasos, solo UI) fiel al prototipo: cotizaciones BIND reales seleccionables, datos de factura con PPD/PUE y alerta SAT, IVA por regla con totales reactivos, prefactura simulada con marca de agua y aprobación humana visual; timbrado bloqueado hasta B7",1.00,confirmada,prototipo/Prototipo-Etapa0.html,si,"Sesión asistida por IA; tiempo real de sesión; commits 2164f6c, 90f7633 y 0600f2f (cliente)"
2026-08-10,2026-W33,2,AJ-01,"Verificación por API de las definiciones del 7-ago (Monto sin IVA, changelog, aprobaciones JSM) y correo de respuesta a Noé (molde + fechas de sesión)",1.50,reconstruida,planeacion/Correo-respuesta-Noe-2026-08-10.md,si,"REGISTRO #62; commit cbb2908; por validar por Johann"
2026-08-11,2026-W33,1,E1-05,"Bitácora #62–#63 (merge de las definiciones, respuesta de Noé) y sondeo nocturno de FAC (molde inexistente, FAC-98)",0.75,reconstruida,bitacora/REGISTRO.md#63,si,"commits f28fcc5, a2f338f; por validar"
2026-08-11,2026-W33,2,E2-02,"Capa de escritura mínima ticket→cotización: Quotes_NewQuote en BindClient, POST /api/emision/cotizacion con dry-run/confirmación, pantalla 'Generar cotización en BIND' y script para Balam (73/73 pruebas)",2.50,reconstruida,bitacora/REGISTRO.md#64,si,"commits e854eda y a99eb8b (cliente, 21:28), 2fb230e (21:30); sesión nocturna; por validar"
2026-08-12,2026-W33,2,E2-02,"Madrugada y previo a la sesión: coreografía de la demo (Actualizar sin caché, Cotizar por fila, vista previa automática), sin reintentos en escrituras, tipo de cambio, prefill y selector de cliente",2.00,reconstruida,bitacora/REGISTRO.md#64,si,"commits eafa49b 00:34, 1b062d2 01:33, 2be0432/8228c40 06:55 (cliente); por validar"
2026-08-12,2026-W33,2,AJ-01,"Sesión acompañada de escritura Jira→BIND con Noé, Araceli y Pedro: formulario construido en vivo, decisión de que la plataforma cotiza, primer POST con 500",1.00,confirmada,fuentes/2026-08-12 - Transcript - Sesion prueba de escritura Jira-BIND.txt,si,"Transcript de 52 min; REGISTRO #65; relevo de Erika por Pedro"
2026-08-12,2026-W33,2,AJ-01,"Excel de campos y catálogos de la cotización BIND (67 servicios, 3 productos, 17 clientes) y correo a Pedro (CC Ara, Noé)",0.75,reconstruida,Cotizacion-BIND-campos-y-catalogos.xlsx,si,"correo 8:09 am; REGISTRO #66; por validar"
2026-08-20,2026-W34,1,E1-05,"Coordinación con Pedro por WhatsApp (18–20 ago): 17 categorías, formulario modificado, ticket FAC-106 y convocatoria del 21",0.50,reconstruida,bitacora/REGISTRO.md#67,si,"por validar"
2026-08-20,2026-W34,1,E1-05,"Cruce del buzón contra la bitácora (9 comunicaciones, 2 correcciones), registro #65 desde el transcript y guion de la sesión del 21-ago",2.00,reconstruida,bitacora/REGISTRO.md#65,si,"commits 5d846ec 23:02 → 072a3cd 23:52; por validar"
2026-08-20,2026-W34,2,AJ-01,"Sondeo de FAC-106 por API, diagnóstico del 500 (VATRate como fracción, VAT, PriceListID) y wizard cableado al formulario 'Cotización Bind', verificado e2e (74/74)",1.50,reconstruida,planeacion/Sondeo-FAC-106-y-payload-2026-08-20.md,si,"commits f839d0e 23:41 y eb04e23 23:47 (cliente); por validar"
2026-08-21,2026-W34,2,AJ-01,"Sesión 7:00 am 'Seguimiento - PAF' con Noé, Araceli y Pedro: tres intentos de emisión (500) y pivote a las definiciones",0.25,reconstruida,bitacora/REGISTRO.md#69,si,"Informe Read AI recibido 7:16 am; por validar"
2026-08-21,2026-W34,2,AJ-01,"Investigación posterior: schema del portal, intentos 4–5, PRIMERA COTIZACIÓN REAL (folio 1026), VAT corregido como tasa, registro #69, correo 'Seguimiento FAC-106' a Noé y borrador del correo de causa",3.00,reconstruida,bitacora/REGISTRO.md#69,si,"commits 46fad4c 10:15 (cliente) y d31747d 10:16; correo 7:32 am; por validar"
2026-08-21,2026-W34,2,AJ-01,"Sesión 1:00 pm 'Seguimiento - PAF (2)': homologación de estados del flujo ticket→cotización→prefactura→factura; pendiente prueba de escritura en Jira",0.50,reconstruida,correo Read AI 21-ago 1:34 pm,si,"SIN registro en bitácora; por validar"
2026-08-23,2026-W34,2,E2-03,"Camino cotización→prefactura real: Invoices_AddInvoice con candado, POST /api/emision/prefactura, wizard sin simulación (borrador + aprobación real), herencia de CFDIUse/ServiceID/PriceListID desde factura y cliente",3.00,reconstruida,balam-plataforma commits a893fa9..a07fff6,si,"commits 22:15–23:40 del 23-ago (cliente); por validar"
2026-08-24,2026-W35,2,E2-03,"Sesión 7:00 am 'Seguimiento - PAF': validación del flujo cotización→prefactura (MXN/USD, IVA 16 %/0 %) y ajuste en vivo: false = remisión, columna BIND en la bandeja",1.00,reconstruida,correo Read AI 24-ago 7:44 am,si,"commit 77d3767 7:38 (cliente); SIN registro en bitácora; por validar"
2026-08-25,2026-W35,1,E1-05,"Correo a Noé con los requisitos de Azure (suscripción, grupo de recursos, Contributor) y lectura de su explicación remisión vs prefactura",0.50,reconstruida,correo 25-ago 4:54 pm,si,"por validar"
2026-08-25,2026-W35,2,E2-03,"Camino prefactura→factura: detección del timbrado, revisión de las 130 operaciones del API (sin timbrado), puertas idempotentes, detalle del ticket con el paso siguiente y botón hacia la prefactura en BIND",2.50,reconstruida,balam-plataforma commits 1ad0e27..02cb042,si,"commits 20:03–20:42 (cliente); por validar"
2026-08-26,2026-W35,2,E2-03,"Sesión 7:00 am 'Seguimiento - PAF' con Noé y Pedro: permisos y flujo remisión/prefactura/factura; el POST confirmado se timbró (CFDI 2386)",0.50,reconstruida,correo Read AI 26-ago 7:35 am,si,"REGISTRO #70; por validar"
2026-08-26,2026-W35,2,E2-03,"Contención del incidente: confirmación de prefactura bloqueada (409), candado triple IsFiscalInvoice=false, API en ReadOnly, registro #70",0.75,reconstruida,bitacora/REGISTRO.md#70,si,"commits c5143cf 7:25 y fbb31fc 7:59 (cliente), a48fba0 8:01; por validar"
2026-08-26,2026-W35,2,E2-03,"Investigación de cierre solo lectura: body de Invoices_AddInvoice vs portal y SDK, PDFs de 1000/1001/2384/2386, censo de 58 no fiscales, diff prefactura 2384 vs remisión — adenda al #70",2.50,reconstruida,bitacora/REGISTRO.md#70,si,"commit 2ae6880 21:28; por validar"
2026-08-26,2026-W35,2,E2-03,"Experimentos autorizados en modo Write (folio compartido, 12 sondas de campo, DELETE), dump del APIM (98 ops), script de captura Playwright y adenda 2 al #70",2.50,reconstruida,bitacora/REGISTRO.md#70,si,"commits e7775e0 21:48 (cliente) y db16f62 00:10 del 27-ago; por validar"
2026-09-03,2026-W36,2,AJ-01,"Sesión 7:00 am 'Seguimiento PAF': datos para el tenant de Azure y conceptos de Acuntia (headcount); definición: ítem por código y concepto = título del ticket",0.50,reconstruida,correo Read AI 3-sep 7:28 am,si,"SIN registro en bitácora; por validar"
2026-09-03,2026-W36,2,E2-02,"Catálogo de servicios de BIND en la emisión (GET /api/Services), mapeo categoría Jira → código configurable, selector de ítem, y caché de la bandeja invalidada al cotizar (visto en producción)",1.50,reconstruida,balam-plataforma commit ed4c819,si,"archivos 07:46–07:58 y 12:55 del 3-sep; por validar"
2026-09-03,2026-W36,1,E1-09,"Publicación de la plataforma en https://paputec.mx/balam/ como ambiente provisional: Docker (Postgres + API chiseled read-only), Apache/proxy/SPA, deploy.sh reproducible, seeder de admin, migración al arrancar",2.50,reconstruida,balam-plataforma/deploy/paputec/README.md,si,"archivos 08:36–12:57 del 3-sep; commit 03582af; por validar"
2026-09-03,2026-W36,3,E3-01,"Endurecimiento aplicado en la publicación: CSP/HSTS, rate limit por IP, bloqueo de login, contraseñas 12+, secretos solo en .env root, respaldos diarios con retención",1.00,reconstruida,balam-plataforma/deploy/paputec/README.md,si,"commit 03582af; por validar"
2026-09-03,2026-W36,3,E3-02,"Runbook de publicación, seguridad aplicada, operación y rollback (deploy/paputec/README.md)",0.50,reconstruida,balam-plataforma/deploy/paputec/README.md,si,"commit 03582af; por validar"
2026-09-03,2026-W36,2,AJ-01,"Sesión 1:30 pm 'Seguimiento PAF (2)': tres tickets de Pedro convertidos en cotizaciones reales desde la plataforma publicada; prueba con ticket de Linares",0.25,reconstruida,correo Read AI 3-sep 1:51 pm,si,"SIN registro en bitácora; por validar"
2026-09-07,2026-W37,2,E2-02,"Cotización en lote desde la bandeja: selección de tickets, pantalla cotizar-lote con dry-run y confirmación por ticket en serie, reglas de prellenado compartidas (cotizacion-prefill.ts)",2.00,reconstruida,balam-plataforma commit fbdbd18,si,"archivos 07:27–07:30 del 7-sep; por validar"
2026-09-09,2026-W37,2,E2-03,"Sesión 1:00 pm 'Seguimiento PAF - Prefactura' con Araceli y Pedro: prefactura creada en la UI de BIND ('Generar venta') mientras se capturan las peticiones (InvoiceDetails)",0.50,reconstruida,correo Read AI 9-sep 1:24 pm,si,"SIN registro en bitácora; por validar"
2026-09-10,2026-W37,2,E2-03,"Sesión 1:00 pm con Pedro: análisis de la cotización 1078 (Acuntia) y captura de la petición de red de la prefactura para evaluar su réplica",0.25,reconstruida,correo Read AI 10-sep 1:21 pm,si,"SIN registro en bitácora; por validar"
2026-09-15,2026-W38,1,E1-05,"Corte de horas 6-ago→15-sep (reconstrucción desde commits, correos e informes de reunión), Excel de avance, commits y publicación de ambos repositorios",0.75,reconstruida,planeacion/Seguimiento-horas.csv,si,"sesión asistida por IA; por validar"
1 fecha semana etapa actividad_id actividad horas estado_hora fuente_evidencia facturable notas
47 2026-08-06 2026-W32 2 AJ-01 Bandeja de solicitudes y detalle de ticket fieles al prototipo leyendo FAC en vivo (estatus reales, solo lectura) + adjuntos descargables vía proxy 0.50 confirmada bitacora/PENDIENTES.md si Sesión asistida por IA; tiempo real de sesión; commits e2c2d18 y 76ad7b1 (cliente)
48 2026-08-06 2026-W32 2 E2-01 Shell con el chrome del prototipo aplicado a toda la app (sidebar con grupos y logo oficial, breadcrumb, chips de sync y módulos próximamente) 0.25 confirmada prototipo/Prototipo-Etapa0.html si Sesión asistida por IA; tiempo real de sesión; commit e2c2d18 (cliente)
49 2026-08-06 2026-W32 2 E2-01 Wizard de emisión asistida (5 pasos, solo UI) fiel al prototipo: cotizaciones BIND reales seleccionables, datos de factura con PPD/PUE y alerta SAT, IVA por regla con totales reactivos, prefactura simulada con marca de agua y aprobación humana visual; timbrado bloqueado hasta B7 1.00 confirmada prototipo/Prototipo-Etapa0.html si Sesión asistida por IA; tiempo real de sesión; commits 2164f6c, 90f7633 y 0600f2f (cliente)
50 2026-08-10 2026-W33 2 AJ-01 Verificación por API de las definiciones del 7-ago (Monto sin IVA, changelog, aprobaciones JSM) y correo de respuesta a Noé (molde + fechas de sesión) 1.50 reconstruida planeacion/Correo-respuesta-Noe-2026-08-10.md si REGISTRO #62; commit cbb2908; por validar por Johann
51 2026-08-11 2026-W33 1 E1-05 Bitácora #62–#63 (merge de las definiciones, respuesta de Noé) y sondeo nocturno de FAC (molde inexistente, FAC-98) 0.75 reconstruida bitacora/REGISTRO.md#63 si commits f28fcc5, a2f338f; por validar
52 2026-08-11 2026-W33 2 E2-02 Capa de escritura mínima ticket→cotización: Quotes_NewQuote en BindClient, POST /api/emision/cotizacion con dry-run/confirmación, pantalla 'Generar cotización en BIND' y script para Balam (73/73 pruebas) 2.50 reconstruida bitacora/REGISTRO.md#64 si commits e854eda y a99eb8b (cliente, 21:28), 2fb230e (21:30); sesión nocturna; por validar
53 2026-08-12 2026-W33 2 E2-02 Madrugada y previo a la sesión: coreografía de la demo (Actualizar sin caché, Cotizar por fila, vista previa automática), sin reintentos en escrituras, tipo de cambio, prefill y selector de cliente 2.00 reconstruida bitacora/REGISTRO.md#64 si commits eafa49b 00:34, 1b062d2 01:33, 2be0432/8228c40 06:55 (cliente); por validar
54 2026-08-12 2026-W33 2 AJ-01 Sesión acompañada de escritura Jira→BIND con Noé, Araceli y Pedro: formulario construido en vivo, decisión de que la plataforma cotiza, primer POST con 500 1.00 confirmada fuentes/2026-08-12 - Transcript - Sesion prueba de escritura Jira-BIND.txt si Transcript de 52 min; REGISTRO #65; relevo de Erika por Pedro
55 2026-08-12 2026-W33 2 AJ-01 Excel de campos y catálogos de la cotización BIND (67 servicios, 3 productos, 17 clientes) y correo a Pedro (CC Ara, Noé) 0.75 reconstruida Cotizacion-BIND-campos-y-catalogos.xlsx si correo 8:09 am; REGISTRO #66; por validar
56 2026-08-20 2026-W34 1 E1-05 Coordinación con Pedro por WhatsApp (18–20 ago): 17 categorías, formulario modificado, ticket FAC-106 y convocatoria del 21 0.50 reconstruida bitacora/REGISTRO.md#67 si por validar
57 2026-08-20 2026-W34 1 E1-05 Cruce del buzón contra la bitácora (9 comunicaciones, 2 correcciones), registro #65 desde el transcript y guion de la sesión del 21-ago 2.00 reconstruida bitacora/REGISTRO.md#65 si commits 5d846ec 23:02 → 072a3cd 23:52; por validar
58 2026-08-20 2026-W34 2 AJ-01 Sondeo de FAC-106 por API, diagnóstico del 500 (VATRate como fracción, VAT, PriceListID) y wizard cableado al formulario 'Cotización Bind', verificado e2e (74/74) 1.50 reconstruida planeacion/Sondeo-FAC-106-y-payload-2026-08-20.md si commits f839d0e 23:41 y eb04e23 23:47 (cliente); por validar
59 2026-08-21 2026-W34 2 AJ-01 Sesión 7:00 am 'Seguimiento - PAF' con Noé, Araceli y Pedro: tres intentos de emisión (500) y pivote a las definiciones 0.25 reconstruida bitacora/REGISTRO.md#69 si Informe Read AI recibido 7:16 am; por validar
60 2026-08-21 2026-W34 2 AJ-01 Investigación posterior: schema del portal, intentos 4–5, PRIMERA COTIZACIÓN REAL (folio 1026), VAT corregido como tasa, registro #69, correo 'Seguimiento FAC-106' a Noé y borrador del correo de causa 3.00 reconstruida bitacora/REGISTRO.md#69 si commits 46fad4c 10:15 (cliente) y d31747d 10:16; correo 7:32 am; por validar
61 2026-08-21 2026-W34 2 AJ-01 Sesión 1:00 pm 'Seguimiento - PAF (2)': homologación de estados del flujo ticket→cotización→prefactura→factura; pendiente prueba de escritura en Jira 0.50 reconstruida correo Read AI 21-ago 1:34 pm si SIN registro en bitácora; por validar
62 2026-08-23 2026-W34 2 E2-03 Camino cotización→prefactura real: Invoices_AddInvoice con candado, POST /api/emision/prefactura, wizard sin simulación (borrador + aprobación real), herencia de CFDIUse/ServiceID/PriceListID desde factura y cliente 3.00 reconstruida balam-plataforma commits a893fa9..a07fff6 si commits 22:15–23:40 del 23-ago (cliente); por validar
63 2026-08-24 2026-W35 2 E2-03 Sesión 7:00 am 'Seguimiento - PAF': validación del flujo cotización→prefactura (MXN/USD, IVA 16 %/0 %) y ajuste en vivo: false = remisión, columna BIND en la bandeja 1.00 reconstruida correo Read AI 24-ago 7:44 am si commit 77d3767 7:38 (cliente); SIN registro en bitácora; por validar
64 2026-08-25 2026-W35 1 E1-05 Correo a Noé con los requisitos de Azure (suscripción, grupo de recursos, Contributor) y lectura de su explicación remisión vs prefactura 0.50 reconstruida correo 25-ago 4:54 pm si por validar
65 2026-08-25 2026-W35 2 E2-03 Camino prefactura→factura: detección del timbrado, revisión de las 130 operaciones del API (sin timbrado), puertas idempotentes, detalle del ticket con el paso siguiente y botón hacia la prefactura en BIND 2.50 reconstruida balam-plataforma commits 1ad0e27..02cb042 si commits 20:03–20:42 (cliente); por validar
66 2026-08-26 2026-W35 2 E2-03 Sesión 7:00 am 'Seguimiento - PAF' con Noé y Pedro: permisos y flujo remisión/prefactura/factura; el POST confirmado se timbró (CFDI 2386) 0.50 reconstruida correo Read AI 26-ago 7:35 am si REGISTRO #70; por validar
67 2026-08-26 2026-W35 2 E2-03 Contención del incidente: confirmación de prefactura bloqueada (409), candado triple IsFiscalInvoice=false, API en ReadOnly, registro #70 0.75 reconstruida bitacora/REGISTRO.md#70 si commits c5143cf 7:25 y fbb31fc 7:59 (cliente), a48fba0 8:01; por validar
68 2026-08-26 2026-W35 2 E2-03 Investigación de cierre solo lectura: body de Invoices_AddInvoice vs portal y SDK, PDFs de 1000/1001/2384/2386, censo de 58 no fiscales, diff prefactura 2384 vs remisión — adenda al #70 2.50 reconstruida bitacora/REGISTRO.md#70 si commit 2ae6880 21:28; por validar
69 2026-08-26 2026-W35 2 E2-03 Experimentos autorizados en modo Write (folio compartido, 12 sondas de campo, DELETE), dump del APIM (98 ops), script de captura Playwright y adenda 2 al #70 2.50 reconstruida bitacora/REGISTRO.md#70 si commits e7775e0 21:48 (cliente) y db16f62 00:10 del 27-ago; por validar
70 2026-09-03 2026-W36 2 AJ-01 Sesión 7:00 am 'Seguimiento PAF': datos para el tenant de Azure y conceptos de Acuntia (headcount); definición: ítem por código y concepto = título del ticket 0.50 reconstruida correo Read AI 3-sep 7:28 am si SIN registro en bitácora; por validar
71 2026-09-03 2026-W36 2 E2-02 Catálogo de servicios de BIND en la emisión (GET /api/Services), mapeo categoría Jira → código configurable, selector de ítem, y caché de la bandeja invalidada al cotizar (visto en producción) 1.50 reconstruida balam-plataforma commit ed4c819 si archivos 07:46–07:58 y 12:55 del 3-sep; por validar
72 2026-09-03 2026-W36 1 E1-09 Publicación de la plataforma en https://paputec.mx/balam/ como ambiente provisional: Docker (Postgres + API chiseled read-only), Apache/proxy/SPA, deploy.sh reproducible, seeder de admin, migración al arrancar 2.50 reconstruida balam-plataforma/deploy/paputec/README.md si archivos 08:36–12:57 del 3-sep; commit 03582af; por validar
73 2026-09-03 2026-W36 3 E3-01 Endurecimiento aplicado en la publicación: CSP/HSTS, rate limit por IP, bloqueo de login, contraseñas 12+, secretos solo en .env root, respaldos diarios con retención 1.00 reconstruida balam-plataforma/deploy/paputec/README.md si commit 03582af; por validar
74 2026-09-03 2026-W36 3 E3-02 Runbook de publicación, seguridad aplicada, operación y rollback (deploy/paputec/README.md) 0.50 reconstruida balam-plataforma/deploy/paputec/README.md si commit 03582af; por validar
75 2026-09-03 2026-W36 2 AJ-01 Sesión 1:30 pm 'Seguimiento PAF (2)': tres tickets de Pedro convertidos en cotizaciones reales desde la plataforma publicada; prueba con ticket de Linares 0.25 reconstruida correo Read AI 3-sep 1:51 pm si SIN registro en bitácora; por validar
76 2026-09-07 2026-W37 2 E2-02 Cotización en lote desde la bandeja: selección de tickets, pantalla cotizar-lote con dry-run y confirmación por ticket en serie, reglas de prellenado compartidas (cotizacion-prefill.ts) 2.00 reconstruida balam-plataforma commit fbdbd18 si archivos 07:27–07:30 del 7-sep; por validar
77 2026-09-09 2026-W37 2 E2-03 Sesión 1:00 pm 'Seguimiento PAF - Prefactura' con Araceli y Pedro: prefactura creada en la UI de BIND ('Generar venta') mientras se capturan las peticiones (InvoiceDetails) 0.50 reconstruida correo Read AI 9-sep 1:24 pm si SIN registro en bitácora; por validar
78 2026-09-10 2026-W37 2 E2-03 Sesión 1:00 pm con Pedro: análisis de la cotización 1078 (Acuntia) y captura de la petición de red de la prefactura para evaluar su réplica 0.25 reconstruida correo Read AI 10-sep 1:21 pm si SIN registro en bitácora; por validar
79 2026-09-15 2026-W38 1 E1-05 Corte de horas 6-ago→15-sep (reconstrucción desde commits, correos e informes de reunión), Excel de avance, commits y publicación de ambos repositorios 0.75 reconstruida planeacion/Seguimiento-horas.csv si sesión asistida por IA; por validar
+20 -1
View File
@@ -5,7 +5,7 @@ Fuente local de horas efectivamente trabajadas para el proyecto Balam. Se mantie
**Tarifa contractual:** $600 MXN/h + IVA
**Cadencia:** corte semanal; factura los viernes; pago a 30 días
**Datos tabulares:** [`Seguimiento-horas.csv`](Seguimiento-horas.csv)
**Última actualización:** 2026-07-27
**Última actualización:** 2026-09-15 (corte 6-ago → 15-sep reconstruido, por validar)
## Reglas de captura
@@ -18,6 +18,25 @@ Fuente local de horas efectivamente trabajadas para el proyecto Balam. Se mantie
7. El esfuerzo real de una sesión incluye TODO su alrededor, no solo el desarrollo: el análisis/pensamiento previo para decidir qué se hace, la documentación de cada parte (bitácora, pendientes, investigación), y la comunicación asociada (cada correo, cada mensaje de WhatsApp, minutas y reportes). Definido por Johann el 6-ago.
8. Para proyectar el costo final del proyecto, las horas no comprimibles (sesiones con Balam, pruebas acompañadas, capacitación, demos, gestión y comunicación) son el piso, y el objetivo de cierre es ese piso y un poco más — no el piso pelón ni el rango completo de la propuesta. Los cortes ya reportados a Erika nunca se recalculan retroactivamente (ajustado por Johann el 6-ago).
## Corte al 15-sep (reconstruido, por validar)
Del 10-ago al 15-sep no se capturó nada en el CSV; el 15-sep se reconstruyeron **39.25 h** con evidencia fechada (commits de ambos repos, correos, informes de reunión de Read AI y mtimes de archivos) y quedaron marcadas `reconstruida` (salvo la sesión del 12-ago, `confirmada` por transcript). **Johann debe validarlas** (o ajustarlas) antes de reportarlas; el corte del 6-ago (54.83 h) no se tocó.
| Etapa | Horas al corte | Rango | Estado |
|---|---:|---:|---|
| Etapa 0 | **21.83 h** | 18–22 h | Cerrada y validada |
| Etapa 1 | **32.25 h** | 32–39 h | Capa de escritura implementada; publicación provisional en paputec.mx (3-sep) |
| Etapa 2 (sin ajuste Jira) | **23.75 h** | 38–46 h | Cotización individual y en lote; prefactura por API bloqueada por BIND |
| » Ajuste Jira → BIND | **14.75 h** | 7–10 h | ⚠️ Rebasado: semánticas indocumentadas del API y 5 sesiones acompañadas |
| Etapa 3 | **1.50 h** | 24–29 h | Endurecimiento y runbook hechos en la publicación |
| **Total** | **94.08 h** | | 39.25 h nuevas: 38.25 `reconstruida` + 1.00 `confirmada` (transcript del 12-ago) |
**Criterios usados en la reconstrucción:**
- Sesiones con Balam: duración acotada por la hora de inicio de la convocatoria y la hora en que llegó el informe de Read AI (redondeada a 0.25 h). Sin transcript no se infló nada; Johann puede subirlas si duraron más.
- Bloques de desarrollo: del primer archivo tocado (mtime) o del inicio estimado al último commit del bloque; incluyen la documentación del mismo bloque (regla 7).
- **Seis sesiones no tienen registro en la bitácora** (21-ago 1 pm, 24-ago, 26-ago, 3-sep 7 am y 1:30 pm, 9-sep, 10-sep): están en `PENDIENTES.md` como huecos de registro.
- Actividades nuevas: `E1-09` publicación provisional, `E2-02` creación de cotizaciones desde la plataforma, `E2-03` conversión cotización→prefactura/factura, `E3-01` endurecimiento, `E3-02` documentación técnica. El reparto CSV → filas del Excel vive en `generar_avance_2026_09_15.py`.
## Corte al 27-jul
| Etapa | Horas al corte | Rango estimado de la etapa | Estado |
+253
View File
@@ -0,0 +1,253 @@
"""Genera Avance-Balam-2026-09-15.xlsx a partir del corte del 6-ago (2.º).
Corte del martes 15-sep: cubre del 10-ago al 15-sep. Lo que pasó en el
periodo: capa de escritura real (primera cotización en BIND desde un ticket el
21-ago, folio 1026; cotización en lote el 7-sep), el camino cotización→
prefactura construido y BLOQUEADO por BIND (26-ago: IsFiscalInvoice=true timbra
al crear, false produce remisión, el tipo Prefactura solo existe en su UI),
la plataforma publicada en https://paputec.mx/balam/ el 3-sep como ambiente
provisional mientras llega Azure, y seis sesiones "Seguimiento PAF" con Balam
(21, 24 y 26-ago; 3, 9 y 10-sep). El corte del 6-ago no se toca.
Las horas se leen de `Seguimiento-horas.csv` (fuente de la verdad); el script
aborta si el reparto por fila no cuadra con las horas nuevas del CSV. Las
39.25 h nuevas están marcadas `reconstruida` (evidencia: commits, correos e
informes de reunión) y pendientes de validación por Johann.
"""
import csv
import os
from collections import defaultdict
import openpyxl
from openpyxl.styles import Alignment, Font, PatternFill
BASE = os.path.dirname(os.path.abspath(__file__))
SRC = os.path.join(BASE, "Avance-Balam-2026-08-06b.xlsx")
DST = os.path.join(BASE, "Avance-Balam-2026-09-15.xlsx")
CSV_HORAS = os.path.join(BASE, "Seguimiento-horas.csv")
CAFE, GRIS = "331F0E", "595959"
V_FILL, V_FONT = "C6EFCE", "006100"
A_FILL, A_FONT = "FFEB9C", "9C6500"
R_FILL, R_FONT = "FFC7CE", "9C0006"
G_FILL, G_FONT = "F2F2F2", "595959"
C_PCT, C_EST, C_TRAB, C_STAT = 4, 5, 6, 7
CORTE_ANTERIOR = 54.83 # 2.º corte del 6-ago, ya reportado
# --- CSV: totales por etapa y por actividad -----------------------------------
por_act, por_etapa = defaultdict(float), defaultdict(float)
nuevas = 0.0
with open(CSV_HORAS, encoding="utf-8", newline="") as fh:
for r in csv.DictReader(fh):
if not (r.get("fecha") or "").strip():
continue
h = float(r["horas"])
por_act[r["actividad_id"]] += h
por_etapa[r["etapa"]] += h
if r["fecha"] > "2026-08-06":
nuevas += h
E0, E1, E3 = por_etapa["0"], por_etapa["1"], por_etapa["3"]
AJ = por_act["AJ-01"] # ajuste Jira→BIND (vive dentro de la etapa 2 del CSV)
E2 = por_etapa["2"] - AJ # Etapa 2 propiamente (frontend + emisión)
TOTAL = E0 + E1 + E2 + AJ + E3
assert abs(TOTAL - sum(por_etapa.values())) < 0.01
assert abs(TOTAL - CORTE_ANTERIOR - nuevas) < 0.01, "El CSV no arranca del corte del 6-ago"
PCT_GLOBAL = round(TOTAL / ((119 + 146) / 2), 2)
# --- Reparto por fila de las horas nuevas (10-ago → 15-sep) --------------------
# Trazabilidad CSV → fila del Excel:
# E1-05 +4.50 (bitácora, cruce del buzón, WhatsApp con Pedro, correo Azure,
# corte de horas) → "Demostración semanal + reporte de horas" (gestión)
# E1-09 +2.50 (publicación en paputec.mx) → 2.25 a "Configuración de
# infraestructura en Azure" (ambiente provisional) y 0.25 a "CI/CD"
# (deploy.sh reproducible + secretos fuera del repo)
# AJ-01 +9.25 → 4.50 a "Disparador…" (sondeo FAC-106 + cableado 20-ago 1.50,
# investigación hasta el folio 1026 el 21-ago 3.00) y 4.75 a
# "Trazabilidad… y prueba observada" (definiciones 10-ago 1.50, sesión
# 12-ago 1.00, Excel de campos 0.75, sesiones 21-ago 0.75 y 3-sep 0.75)
# E2-02 +8.00 (capa de escritura de cotización 11/12-ago 4.50, ítem por
# código 3-sep 1.50, lote 7-sep 2.00) → "Creación de cotizaciones"
# E2-03 +13.50 (prefactura 23-ago, prefactura→factura 25-ago, incidente e
# investigación 26-ago, sesiones 24 y 26-ago, 9 y 10-sep) →
# "Conversión cotización→factura"
# E3-01 +1.00 → "Endurecimiento de seguridad"; E3-02 +0.50 → "Documentación técnica"
DELTAS_TRAB = {
"Demostración semanal": 4.50,
"Configuración de infraestructura en Azure": 2.25,
"CI/CD": 0.25,
"Disparador por estatus": 4.50,
"Trazabilidad ticket": 4.75,
"Creación de cotizaciones desde la plataforma": 8.00,
"Conversión cotización→factura": 13.50,
"Endurecimiento de seguridad": 1.00,
"Documentación técnica": 0.50,
}
assert abs(sum(DELTAS_TRAB.values()) - nuevas) < 0.01, (
f"El reparto ({sum(DELTAS_TRAB.values()):.2f}) no suma las {nuevas:.2f} h nuevas del CSV")
ENCABEZADOS = {
"Integracion de plataformas Balam": (TOTAL, PCT_GLOBAL),
"Etapa 0": (E0, 1.0),
"Etapa 1": (E1, 0.95),
"Etapa 2": (E2, 0.70),
"» Ajuste dentro de la Etapa 2": (AJ, 0.85),
"Etapa 3": (E3, 0.05),
}
# (pct, estatus, fill, font, bold) — solo lo que cambió respecto al 6-ago.
FILAS = {
"Demostración semanal": (0.6, "🟡 En curso · el seguimiento pasó a Pedro (sesiones 'Seguimiento PAF' "
"21, 24 y 26-ago; 3, 9 y 10-sep) · corte de horas al 15-sep",
A_FILL, A_FONT, False),
"Capa de escritura controlada": (0.9, "✅ Implementada: dry-run + confirmación humana + auditoría en "
"WriteOperations para cotización (21-ago) y prefactura (23-ago) · "
"el timbrado no existe en el API de BIND (es humano, en su pantalla)",
V_FILL, V_FONT, False),
"Configuración de infraestructura en Azure": (0.5, "🟡 Publicada en https://paputec.mx/balam/ (3-sep) como "
"ambiente provisional · Azure sigue con Balam (requisitos "
"enviados a Noé el 25-ago; datos del tenant revisados el 3-sep)",
A_FILL, A_FONT, False),
"CI/CD": (0.3, "🟡 Publicación reproducible (deploy.sh) con secretos fuera del repo · CI real depende de Azure",
A_FILL, A_FONT, False),
"Disparador por estatus": (0.6, "🟡 Cotización real desde el ticket (21-ago, folio 1026) y en lote (7-sep), "
"con disparo manual · el disparo automático por estatus espera el ambiente definitivo",
A_FILL, A_FONT, False),
"Trazabilidad ticket": (0.6, "🟡 Vínculo ticket→cotización→prefactura en la BD · pruebas observadas con "
"Balam el 12, 21, 24 y 26-ago y el 3-sep",
A_FILL, A_FONT, False),
"Creación de cotizaciones desde la plataforma": (0.9, "✅ Cotización individual y en lote con dry-run y "
"confirmación humana · ítem del catálogo BIND por código y "
"concepto = título del ticket (definición del 3-sep)",
V_FILL, V_FONT, False),
"Conversión cotización→factura": (0.6, "🔴 Prefactura por API bloqueada por BIND: IsFiscalInvoice=true "
"TIMBRA al crear (incidente 26-ago, CFDI 2386) y false produce remisión; "
"el tipo Prefactura solo existe en su UI · en curso la captura del "
"endpoint interno (sesiones 9 y 10-sep)",
R_FILL, R_FONT, True),
"Endurecimiento de seguridad": (0.4, "🟡 Aplicado en la publicación: contenedor de solo lectura, rate limit, "
"bloqueo de login, CSP/HSTS, respaldos diarios",
A_FILL, A_FONT, False),
"Documentación técnica": (0.3, "🟡 Runbook de publicación, operación y rollback (deploy/paputec/README.md)",
A_FILL, A_FONT, False),
}
def pinta(celda, fill, font_color, bold=False, size=9, align="left"):
celda.fill = PatternFill("solid", fgColor=fill)
celda.font = Font(color=font_color, bold=bold, size=size)
celda.alignment = Alignment(horizontal=align, vertical="center", wrap_text=True)
wb = openpyxl.load_workbook(SRC)
ws = wb.active
ws["A2"] = ("Plan y avance al 15-sep-2026 · plataforma publicada en paputec.mx (provisional), cotización real "
"desde el ticket (individual y en lote); prefactura por API bloqueada por BIND · horas del "
"10-ago al 15-sep reconstruidas, pendientes de validar")
ws["A2"].font = Font(size=10, italic=True, color=GRIS)
# Las notas del corte anterior van fusionadas A:G y algunas empiezan con
# "Etapa 1: …", que colisiona con los prefijos de encabezado: se localizan y
# limpian ANTES del bucle principal, y este se detiene donde empezaban.
primera_nota = None
for row in range(5, ws.max_row + 1):
v = str(ws.cell(row=row, column=1).value or "")
if v.startswith("✅ Completada ·"):
primera_nota = row
if primera_nota and row >= primera_nota:
for rango in list(ws.merged_cells.ranges):
if rango.min_row == row:
ws.unmerge_cells(str(rango))
ws.cell(row=row, column=1).value = None
tope = primera_nota if primera_nota else ws.max_row + 1
aplicado = set()
for row in range(5, tope):
nombre = str(ws.cell(row=row, column=1).value or "").strip()
if not nombre:
continue
for prefijo, (trab, pct) in ENCABEZADOS.items():
if nombre.startswith(prefijo):
if trab is not None:
c = ws.cell(row=row, column=C_TRAB, value=round(trab, 2))
c.number_format = "0.00"
p = ws.cell(row=row, column=C_PCT, value=pct)
p.number_format = "0%"
if pct >= 1:
pinta(p, V_FILL, V_FONT, bold=True, size=10, align="center")
elif pct > 0:
pinta(p, A_FILL, A_FONT, bold=True, size=10, align="center")
break
for prefijo, delta in DELTAS_TRAB.items():
if nombre.startswith(prefijo):
actual = ws.cell(row=row, column=C_TRAB).value
actual = float(actual) if isinstance(actual, (int, float)) else 0.0
c = ws.cell(row=row, column=C_TRAB, value=round(actual + delta, 2))
c.number_format = "0.00"
aplicado.add(prefijo)
break
for prefijo, (pct, txt, fill, fcolor, bold) in FILAS.items():
if nombre.startswith(prefijo):
if pct is not None:
p = ws.cell(row=row, column=C_PCT, value=pct)
p.number_format = "0%"
if pct >= 1:
pinta(p, V_FILL, V_FONT, bold=True, size=10, align="center")
elif pct > 0:
pinta(p, A_FILL, A_FONT, bold=True, size=10, align="center")
else:
p.font = Font(size=10, color=GRIS)
s = ws.cell(row=row, column=C_STAT, value=txt)
pinta(s, fill, fcolor, bold)
break
faltan = set(DELTAS_TRAB) - aplicado
assert not faltan, f"Filas no encontradas en el Excel: {faltan}"
# --- Notas: se escribe el bloque del 15-sep donde estaba el del 6-ago ---------
notas = [
("✅ Completada · 🟡 En curso · 🔴 Pendiente/bloqueada · ⚪ Próxima · "
"(adelantada) = ejecutada antes de su fecha plan", True),
(f"Horas trabajadas al 15-sep: Etapa 0 {E0:.2f} h (cerrada y validada) · Etapa 1 {E1:.2f} h "
f"(rango 32–39) · Etapa 2 {E2:.2f} h · ajuste Jira {AJ:.2f} h (de 7–10 aprobadas) · "
f"Etapa 3 {E3:.2f} h · total {TOTAL:.2f} h. Las {nuevas:.2f} h posteriores al corte del 6-ago "
"están reconstruidas con evidencia (commits, correos, informes de reunión) y pendientes de "
"validar. Base de facturación a $600/h + IVA.", True),
("Etapa 1: la capa de escritura quedó implementada (cotización y prefactura con dry-run, "
"confirmación humana y auditoría). Solo Azure y CI/CD siguen dependiendo de Balam; mientras "
"tanto la plataforma está publicada en https://paputec.mx/balam/ desde el 3-sep (BIND y Jira "
"en solo lectura fuera de sesión).", False),
("Integración Jira → BIND: primera cotización real desde un ticket el 21-ago (folio 1026, tras "
"5 intentos por dos semánticas indocumentadas del API: Type=2 y VAT como tasa), tres tickets "
"cotizados en la sesión del 3-sep y cotización en lote desde el 7-sep. Rebasa las 7–10 h "
"aprobadas por las semánticas indocumentadas y las sesiones acompañadas (12, 21-ago, 3-sep).", False),
("Etapa 2: la prefactura por API NO es posible con lo que BIND expone (26-ago: IsFiscalInvoice=true "
"timbra al crear —CFDI 2386, a cancelar— y false produce remisión; el tipo Prefactura solo "
"existe en su UI). Sesiones del 9 y 10-sep con Araceli y Pedro para capturar el endpoint "
"interno y decidir el camino (réplica, detección al timbrado o soporte de BIND).", False),
("En espera de Balam: acceso a Azure (requisitos enviados el 25-ago), cancelación del CFDI 2386 "
"y de la cotización 1026, y la definición del camino de prefactura.", False),
]
r = primera_nota if primera_nota else ws.max_row + 2
for txt, bold in notas:
c = ws.cell(row=r, column=1, value=txt)
c.font = Font(italic=True, size=9, color=CAFE, bold=bold)
c.alignment = Alignment(wrap_text=True, vertical="top")
try:
ws.merge_cells(start_row=r, start_column=1, end_row=r, end_column=7)
except ValueError:
pass # ya estaba fusionada desde el archivo origen
ws.row_dimensions[r].height = 40 if len(txt) > 220 else (28 if len(txt) > 120 else 14)
r += 1
ws.print_area = f"A1:G{r}"
wb.save(DST)
print("OK ->", DST)
print(f" E0 {E0:.2f} · E1 {E1:.2f} · E2 {E2:.2f} · Jira {AJ:.2f} · E3 {E3:.2f} · TOTAL {TOTAL:.2f} h "
f"({nuevas:.2f} nuevas) · avance global {PCT_GLOBAL:.0%}")