Tablero de desarrollo — TheFittClub MVP
Última sincronización: 2026-09-28 (auto via GitHub Action — no editar a mano). Repo:
gala1234/thefittclub— board fuente:_docs/03-tickets/00-board.md. Pipeline:01-pending/→02-active/→03-qa/→04-done/.
🧭 Orden de ejecución (brújula)
Espejo del bloque
compassdel board (_docs/03-tickets/00-board.md). Editar allí, no aquí.
🧭 Septiembre — orden de ejecución (brújula, refrescada 2026-09-21 tras la poda del backlog). Norte, cumplido en su primera mitad: la oleada salió el 17-09 por el grupo de WhatsApp con la dirección
app.thefittclub.com; las tres pantallas del primer día (T699panel,T670cierre,T581evaluación) cerraron con veredicto de comprensión. Lo que manda ahora es la segunda mitad, que ningún criterio de salida escribió: de las 19 que entraron ese día, 18 no han entrenado.MEDIDO EL 17-09 121 socias legacy · 65 con acceso · 19 primeros accesos en un día (antes: 0) · 2 entrenaron LA PODA DEL 21-09 233 pendientes leídos uno a uno: 7 muertos · 4 duplicados · 39 mal etiquetados · 183 vivos — **APLICADA el mismo día** (su go: `implementa todos estos cambios`) informe con la prueba de cada fila: _docs/03-tickets/_nightly-audit/2026-09-21-backlog-pruning.md y su lectura en el vault: 100_Desarrollo/03_Priorizacion_Backlog.md QUEDAN EN SEPTIEMBRE 9 — los ocho que una socia migrada ve o sufre HOY, más T803 (activación), abierto en la poda SALEN (hecho) → Beta: T326 T574 T587 T591 T723 T727 T745 T794 T797 T798 T800 · → Producción: T724 T796 T799 T801 T802
- Los ocho que se quedan, en este orden.
T588(M) — cerrar sesión no cierra nada; una cookie revocada sigue entrando siete días,/adminincluido. Es el P1 sobre cuentas vivas y tu decisión del 15-09: el único de seguridad que no espera. Toca auth: go explícito tuyo al activar. ·T773(S) — el siguiente de la secuencia que fijaste el 17-09 (T771→T703→ T773): seis de siete eventos no distinguen migrada de nueva; es la única forma de saber qué pasó con las 18. ·T777(S) — un login que falla en la red no dice nada; un iPhone real el 18-09 en la puerta por la que pasan todas. ·T775(M) — quince pantallas de error en treinta días delante de socias y Sentry solo guardaUnknownError; diagnóstico primero. ·T790(M) — las de F2/F3 perdieron «Ronda N de M» desde la migración 0094. ·T627(S) — cinco fichas Legacy piden un número que el clip contradice; necesita tus cinco dictámenes. ·T774(S) —/es/soportele vende el método a quien ya pagó. ·T387(M) — la encuesta de Semana 0 aplicada al motor de ~14 socias, con su consentimiento.T803sale de septiembre → Beta (2026-09-24, tu decisión). Tu criterio, que corrige el norte de esta brújula: las socias legacy usan la app según vean, sin empujar a las ~100 — las dudas llegan a tu teléfono personal. Te bastan 5-10 que la usen por su cuenta y te den feedback. «18 de 19 no han entrenado» deja de leerse como un problema a resolver. Orden de ahora:T588· una rama conT777+T738+T732·T773· yT584(el dominio:wwwmuestra «Plan Expired»).- Las tres decisiones, tomadas el 21-09 con el voto del arquitecto y de la PM (informe § 10): (1)
T54sale del camino deT20: lanzamiento solo en euros, T20 se queda la columna de moneda, T54 → Producción con disparador «primera compradora fuera del euro». (2) El ticket de activación se abre ya (T803), con T773 como su medición y no como precondición. (3) La regla de entrada «un hallazgo no es un ticket» está en el harness (00-new-ticket.mdPaso 0, PR #1812 fusionada) con su plantilla de ledger en_docs/ops/. Y T29 se parte: el presupuesto de rendimiento esT804(S, Beta).- Cerrado desde la brújula del 11-09:
T699T670T581T386T771T703T730T772(anulado, absorbido en T386)T569T614T785T786. Ya no queda nada de la oleada por enviar; lo que queda es que entrenen.
🧭 i18n / capa de datos — orden de ejecución (brújula, refrescada 2026-08-25). Norte: un único patrón canónico de almacenamiento i18n (ADR-0010) antes de construir encima, y entrega bilingüe correcta en texto, medios y email. Este carril está prácticamente terminado: de todo lo que la brújula listaba solo queda
T24.
- ✅ Ola 0 — capa de datos saneada y bloqueada:
T173(columnas zombisLocalizedText+physical_focus_translationseliminadas) →T172(medios por idioma + subtítulos mezclables) +T174(gate determinista del patrón de almacenamiento).T96(tirar lasroutineslegacy) también cerró.- ✅ Ola 2 — superficies de contenido bilingüe: la cadena de lead magnets salió bilingüe de día uno y está entera cerrada —
T61→ {T77‖T70‖T73} →T71→T72→T78. Bilingüe dejó de ser trabajo aparte: es invariante de construcción de cada superficie.- ✅ Ola 1 — email bilingüe:
T171(emails transaccionales ES/EN con el idioma de cada socia) cerrado.- Ola 3 — la única que queda:
T24(M, Beta). Y ya no es lo que dice su título. Medido el 25-08: ES y EN tienen 3179 claves cada uno, así que la paridad estructural ya la sostiene el gatetfc-i18n-parityy “faltan claves” dejó de ser el trabajo. Lo que queda son ~141 candidatos a texto escrito a fuego en TSX. No confundir conT288(Beta), que es otra cosa: la calidad de la traducción, y cuyo peso se ha mudado a las 14 tablas*_translationsde la base de datos.- En una línea: el carril i18n está cerrado salvo
T24, yT24es hoy un barrido de textos a fuego, no un problema de claves que falten.
🧭 Beta — orden de ejecución (brújula, refrescada 2026-09-21 tras la poda). Norte: las socias migradas usan la app y lo que vemos con uso real manda. Sin ventas. El hito termina cuando la cohorte lleva seis semanas de uso real y ella ha leído T706. La poda del 21-09 cambia la forma del tablero, no la fecha: en vez de siete carriles por tipo de trabajo, cuatro resultados; cada ticket sirve a uno o se aparca. Beta queda con ~113 specs y eso no es error de etiqueta — 40 nacieron de auditorías de la app viva el 14 y el 18 de septiembre. La palanca no es la etiqueta: es T706.
O1 · LA COHORTE ENTRENA primera sesión en 7 días desde el primer login para la mayoría de las 19; segunda para la mitad AHORA (≤3 activos) T588 · rama única de tres S: T777 + T738 + T732 · ticket de activación (con T773 dentro) DESPUÉS (sept-oct) T775 · T790 · T627 · T774 · T387 · T624 → T628 (como primer tramo de T726) · T493 MEDIR T550 · T551 · T706 a mitad de ventana (cuatro semanas de uso real) O2 · CUENTAS VIVAS SEGURAS T588 → T768 → T764 → T765/T766 → T767 → T763 → T769 (un programa, no siete tickets) · T673 → T589 → T318 · T671 · T753 O3 · UNA MUJER PUEDE COMPRAR es Beta Launch, no Beta: T721 antes de T20 · T394 → T20 (en euros) → T444 → T680 → T277 → T213 · T181 · T410 → T411 · T323 → T700 O4 · EL COSTE DE CAMBIAR T398 ahora (que dashboard.server.ts deje de crecer: 3.464 líneas, +300 en dos semanas) · T162 → T392 → T744 · T587 antes de T584 · T391 antes del 29-10 · T691 como estrangulador, nunca big-bang APARCADO (con disparador) magazine (6) · PWA nativa T105/T164 · retención T207/T209 (cuando O1 pruebe que entrenan) · T412 · T288 · T54 · barridos de lint (el ratchet los sostiene)
- Lo que la poda encontró, aplicado el 21-09 (informe
_nightly-audit/2026-09-21-backlog-pruning.md, lectura en el vault100_Desarrollo/03_Priorizacion_Backlog.md): 7 muertos —T51bT62T273T316T357T544T572, cada uno con el spec cerrado o el fichero que lo mató · 4 duplicados — T692→T723, T788→T645, T367→T754, T549→T721· 39 mal etiquetados (25 de hito, 16 de esfuerzo, 3 sin tilde). Los 7 y los 4 están en04-done/con su nota (precedente del 25-08), las etiquetas cambiadas en cada spec con su línea de decisión, y cada fila movida del tablero lleva su origen y su razón en la tabla «Poda del backlog» de su hito.- Nueve familias que deberían ser un solo spec (los hijos pasan a líneas de checklist): duración T794/796/797/798 →
T798· Paso 8 del harness T692/T755/T802 →T723· pipeline de review IA T367/T789/T453/T654 · corrección de CI T749/T750/T693/T519 · gate de contraste T632/T649/T676 · deriva del design SSOT T716/T717/T718/T720/T528 · magazine · seguridad T763-770 →T769· pipeline de tickets T645/T787. De 222 a ~190 líneas; lo que importa es que 190 por resultado se leen.- Donde el arquitecto y la PM discrepan, y lo decides tú:
T624ahora (promesa rota a una socia que pagó) o tras la estantería deT726(construir una vez). Salida propuesta: T624 como primer tramo de T726, misma pestaña de biblioteca, una faceta nueva.- Meta-trabajo: 78 de 233 son infra y unos cincuenta tratan del propio tooling del agente. Tope: un quinto de la capacidad, consolidado en dos épicos (review IA · pipeline de tickets), para que compita como dos cosas y no como cincuenta.
- Tres pares que eran el mismo ticket dos veces, cerrados como absorbidos el 11-09:
T554→T699,T399→T691,T583→T645. La causa raíz (el Paso 2 del harness no miraba01-pending) se corrigió ese día; la poda del 21-09 encontró cuatro pares más, todos anteriores.
Salud del MVP
Métricas computadas desde el repo en cada push a main. Si un número se ve raro, ajustar la realidad en la fuente correspondiente — no editar este archivo.
Cuadro de mando
| Métrica | Hoy | Fuente |
|---|---|---|
| % MVP realizado (effort) | 71% (1271 de 1783 pts) · 15 tickets sin estimar (asumidos M) | ticket headers Effort: |
| % MVP realizado (count) | 72% (447 de 619) | _docs/01-core/mvp-scope.md |
| % Prod readiness | 52% (14 de 27) | _docs/01-core/production-readiness.md |
| Legacy abierto | 6 (1 TD + 5 LD) | _docs/01-core/legacy-inventory.md |
| Seguridad | ? moderate npm audit · headers present · auth 5/6 ✅ | _docs/01-core/security-baseline.md |
| Velocity real (h/pt) | 6.2 h/pt · 0.161 pts/h (n=453) | spec headers Started: + Closed: |
| Velocity calendar | 76.13 pts/week (n=141, last 4 wks) | board’s Done table 4-col rows |
| Launch range (estimado) | 2026-11-16 (early) – 2026-12-10 (late, +50% buffer) · source: calendar (pts/wk) · 7 semanas (semanas de calendario, últimas 4 semanas cerradas) | computed from velocity + remaining points |
Distribución del backlog pending (MVP)
| Eje | Distribución |
|---|---|
| Effort | XS: 18 · S: 57 · M: 65 · L: 31 · XL: 0 · sin estimar: 0 |
| Modelo LLM | fable: 10 · opus: 129 · mixed: 31 · sin asignar: 1 |
Salud por Hito
Progreso desglosado por hito. Cada fila muestra tickets done/en vuelo/pending y el % completado weighted por effort.
| Hito | Deadline | Done | En vuelo | Pending | Pts done/total | % | Restante |
|---|---|---|---|---|---|---|---|
| Septiembre | 2026-09-15 (-13d) | 306 | 0 | 7 | 875.5/888 pts | 99% | 12.5 pts |
| Beta | 2026-11-30 (63d) | 174 | 2 | 118 | 495.5/787 pts | 63% | 291.5 pts |
| Beta Launch | 2027-01-31 (125d) | 16 | 1 | 18 | 61.5/149.5 pts | 41% | 88 pts |
| Producción | 2027-06-30 (275d) | 22 | 0 | 56 | 56.5/249.5 pts | 23% | 193 pts |
| Deferred | — | 27 | 0 | 26 | 109/206 pts | 53% | 97 pts |
| Sin hito | — | 33 | 0 | 0 | 87/87 pts | 100% | 0 pts |
🎯 Hito Septiembre: 99% completado · 12.5 pts restantes · ETA: 2026-10-05 (early) – 2026-10-08 (late) · 1 semanas · source: calendar (pts/wk).
Contenido real por producto
Derivado del código en cada corrida — la fase cuenta como contenido REAL solo si existe
drizzle/seeds/catalog/products/ritual/<producto>-phase<N>-data.ts. El scaffold dummy (T211) NO cuenta. Dos Ritual Core distintos — no confundirlos.
| Producto | F1 | F2 | F3 | F4 | Real |
|---|---|---|---|---|---|
Ritual Core Legacy (prod_ritual_core_legacy) — el producto de las socias vitalicias — pipeline T65 | ✅ | ✅ | ✅ | ✅ | 4/4 |
Ritual Core nuevo (prod_ritual_core) — futuro: versión del Legacy con varias sesiones por día para elegir duración (express/base/progressive) | ⬜ | ⬜ | ⬜ | ⬜ | 0/4 |
Insight
Código MVP: 71% hecho por effort (72% por count). Producción listo: 52%. La cifra que importa es la weighted; la count es para continuidad histórica. El gap entre código listo y producción listo es la diferencia entre “compila y funciona” y “puedo cobrar dinero sin que se rompa el viernes a las 11pm” — lo que falta para go-live es operaciones, contenido, canales y legal, no código.
Pipeline en estado actual
- WIP (en vuelo): 3 active · 0 QA = 3 abiertos.
- Backlog: 225 pending.
- Done con fecha en el board: 495 entradas registradas (495 con Effort registrado).
Outreach pillars (pre-MVP)
Hitos de audiencia que corren en paralelo al MVP. Detalle + pilares de contenido en _docs/01-core/mvp-scope.md → Outreach pillars.
| Hito | Plazo | Entregable | Ticket |
|---|---|---|---|
| H1 | 3-4 weeks | Pre-MVP lead magnet chosen + produced (PDF / audio / video). Available in R2, signed-URL on form submission. | T61 |
| H2 | 4-6 weeks | Public landing with email capture serving H1. Part of T36 with LEAD_MAGNET_VARIANT=pre-mvp. | T36 (consumes T61) |
| H3 | 6-10 weeks | Public blog /blog with 4-6 evergreen articles, one per pillar. | T53 (promoted to MVP) |
| H4 | 8-14 weeks | Bi-weekly newsletter in production. ≥4 emissions published. Stable workflow (≤2h founder time/emission). | T62 |
Outreach activity (cumulative)
Métricas de trabajo no-dev. Fuente: _docs/01-core/outreach-metrics.md (actualización manual al cerrar cada pieza).
| Categoría | Count | Notas |
|---|---|---|
| Instagram posts publicados | 0 | canal primario — 100% conversiones históricas |
| YouTube videos publicados | 0 | long-form companion (pro setup disponible) |
| Newsletters publicadas | 0 | |
| Blog articles publicados | 0 | |
| Lead magnet downloads (semanas registradas) | 0 | |
| Beta sessions completadas | 0 |
Esta semana (2026-09-28 → 2026-10-04)
Presupuesto: 76.13 pts · fuente: calendar velocity (last 4 wks)
Foco principal (en activo): Ticket 565 — fix: the progressive modality never adds — or holds back — series and repetitions (Effort M, model opus)
También entran si avanza el sprint:
- Ticket 383 — Tap targets: land the system rule, starting with consent parity (3 pts)
- Ticket 326 — Upgrade to Workers Paid: restore cron capacity (post-beta, revenue-gated) (1 pts)
- Ticket 591 — Account and CI credential hardening: 2FA attested, one CI token split by scope, and what an automated attacker meets first (1 pts)
- Ticket 587 — Backups: a second copy of every Ritual Core video outside Cloudflare, and the three gaps around the D1 backup (3 pts)
- Ticket 24 — App bilingual completeness pass (3 pts)
- Ticket 63 — Beta program design + execution (1-2 months free, polish before paid launch) (3 pts)
- Ticket 115 — Journal write surface (member-facing entry creation UI) (3 pts)
- Ticket 181 — Ritual Core: sales page Hito 3 (máxima conversión) (8 pts)
- Ticket 22 — Gifting /
gift_vouchers(3 pts) - Ticket 34 — BO admin: Stripe customer + purchases panel (3 pts)
- Ticket 64 — Friction stacks: compress the IG production loop from 15 to 5 steps (3 pts)
Obligaciones no-dev esta semana (2 pts):
- Instagram — 3 posts/week (primary channel) · rotating 4 pillars (2 pts) — Independent of the bi-monthly cluster. 1 of the 3 can be a teaser/derivative of the cluster in progress.
- Founder energy + journal review · founder (0 pts) — Tracked as 0 pts — habit, not a project deliverable.
Próximas 4 semanas (lookahead)
Proyección de carga por semana. Cada semana consume el presupuesto en obligaciones no-dev primero, después walks la cola de prioridad hasta agotar puntos disponibles.
| Semana | Tickets proyectados | Pts | Obligaciones | Riesgo |
|---|---|---|---|---|
| Wk1 (2026-09-28) | T387 · T383 · T326 · T591 · T587 · T24 · T63 · T115 · T181 · T22 · T34 · T64 | 37/74.13 | Instagram · Founder | ✓ |
| Wk2 (2026-10-05) | (none) | 0/65.13 | Instagram · Bi-monthly · Founder · Monthly | ✓ |
| Wk3 (2026-10-12) | (none) | 0/74.13 | Instagram · Founder | ✓ |
| Wk4 (2026-10-19) | (none) | 0/74.13 | Instagram · Founder | ✓ |
Próximos 3 meses — big rocks
Tickets XL/L proyectados por mes basados en la cola de prioridad + velocity. Los XL definen el ritmo; un mes con XL es un mes que no entra mucho más. Launch range: Sept-26 → Ene-27.
| Mes | Tickets proyectados | Big rocks (XL/L) |
|---|---|---|
| 2026-09 | T387 · T383 · T326 · T591 · T587 · T24 · T63 · T115 · T181 · T22 · T34 · T64 | T181 (L) |
| 2026-10 | (none — fin del backlog actual) | — |
| 2026-11 | (none — fin del backlog actual) | — |
Active (en implementación)
Ticket 565 — fix: the progressive modality never adds — or holds back — series and repetitions
Branch: codex/f1-legacy-integration · Track: mvp · Hito: Beta Launch · Domain: player
La fundadora, 2026-08-30:
si la sesión la evalúa como exigente … no se le añaden series ni repeticiones. Esa lógica está escrita y correcta enprogressive-overload.ts, y no la llama nadie. La pantalla se lo promete igualmente. Solo afecta aprod_ritual_core.
Ticket 613 — Technique cards for Ritual Core Legacy: 27 candidates decided per phase, produced per family
Branch: codex/613-f1-approved-techniques · Track: content-migration · Hito: Beta · Domain: content-migration
T606 D10: 27 técnicas candidatas y solo 3 fichas (las de F1). La hoja D10 fija fase, día y origen; este ticket produce las fichas por familia y las cablea al desbloqueo. El 2026-09-11 aprobó cinco nuevas de F1 y pidió integrarlas ya, con las tres originales tal cual.
Ticket 625 — The phase PDFs re-made with the copy she already corrected, then served as phase material
Branch: codex/625-f1-approved-pdfs · Track: content-migration · Hito: Beta · Domain: content-migration
Los PDF de fase rehechos con el copy que ella corrigió. El 2026-09-11 aprobó los tres de F1 en español e inglés, con sus portadas (
Los pdfs en en y es estan aprovados por mi parte, asi como sus portadas), y los adelanta al resto; la guía extensa de hipopresivos pasa a cápsula.
QA (en verificación)
(vacío — ningún ticket en QA ahora mismo)
Pending (backlog, agrupado por Hito)
Next up: Ticket 387 — Q3 personalization seed: Semana-0 survey → migrated members’ physical profiles ·
content-migration,.
Septiembre (deadline: 2026-09-15) — 7 tickets · 12.5 pts
| # | Ticket | Título | Track | Effort | Model | Domain |
|---|---|---|---|---|---|---|
| 16 | 387 | Q3 personalization seed: Semana-0 survey → migrated members’ physical profiles | content-migration, | M | mixed | content-migration |
| — | 588 | Revoked sessions lose access on the next protected request | infra | M | opus | auth |
| — | 627 | The eleven Legacy counts where the clip says one number and the app asks for another | content-migration | S | fable | content-migration |
| — | 774 | The support page sells the method to a member who already bought, and claims an inbox that does not exist | mvp, | S | mixed | content-migration |
| — | 777 | A login that fails on the network says nothing | mvp | S | opus | auth |
| — | 790 | The player names the round and the series from the rows, not from a repeat counter | mvp | M | mixed | player |
| — | 807 | Count the deploys that strand a member, before fixing them | mvp | XS | opus | infra |
Beta (deadline: 2026-11-30) — 118 tickets · 280.5 pts
| # | Ticket | Título | Track | Effort | Model | Domain |
|---|---|---|---|---|---|---|
| 1 | 383 | Tap targets: land the system rule, starting with consent parity | mvp | M | opus | compliance |
| 4 | 326 | Upgrade to Workers Paid: restore cron capacity (post-beta, revenue-gated) | post-mvp | S | opus | infra |
| 23 | 591 | Account and CI credential hardening: 2FA attested, one CI token split by scope, and what an automated attacker meets first | infra | S | opus | infra |
| 24 | 587 | Backups: a second copy of every Ritual Core video outside Cloudflare, and the three gaps around the D1 backup | infra, | M | opus | infra |
| 29 | 24 | App bilingual completeness pass | mvp | M | opus | other |
| 32 | 63 | Beta program design + execution (1-2 months free, polish before paid launch) | mvp | M | opus | other |
| 40 | 115 | Journal write surface (member-facing entry creation UI) | mvp | M | mixed | dashboard |
| — | 168 | New-device sign-in alert | mvp | M | mixed | auth |
| — | 206 | Retention: action-event emission (T57 slice C) | mvp | M | mixed | analytics |
| — | 207 | Retention: moment-driven celebratory cadence (T57 slice D) | mvp | M | mixed | |
| — | 208 | Retention: in-app surfaces (T57 slice E) | mvp | M | mixed | dashboard |
| — | 318 | Separate the journaling consent from the onboarding consent | mvp | M | fable | compliance |
| — | 328 | BO broadcast body: safe Markdown rendering | post-mvp | S | mixed | |
| — | 339 | Prep-exercise detail sheet: video + why-it-was-added + dosing, with start-session CTA | mvp | M | mixed | dashboard |
| — | 388 | Re-tag legacy session blocks to the resolved product-modality (T358 data follow-up) | infra, | S | opus | schema |
| — | 391 | Extract the shared private-loader preamble | infra | M | opus | infra |
| — | 401 | Focus indicator for .af-link anchors | polish | XS | opus | design |
| — | 443 | One name per phase, across every surface a member can see | polish | M | fable | content-migration |
| — | 453 | Pay the reviewer from the subscription instead of API tokens | infra | M | opus | infra |
| — | 492 | Surface the descent signal | mvp | S | opus | admin |
| — | 493 | Engine-input answers stay changeable after onboarding | mvp | M | opus | onboarding |
| — | 494 | The onboarding stage gets its delivered media, plus the surface’s hygiene sweep | polish | S | opus | onboarding |
| — | 503 | One idempotency key closes the whole double-submit class (absorbs T478 A4 + A5) | mvp | S | opus | player |
| — | 512 | Member transition: PWA reinstall banner + old-host redirect + migration comms | infra, | S | mixed | player |
| — | 519 | The smoke E2E verdict is hostage to a comment write | infra | XS | opus | infra |
| — | 520 | A number is a datum, and nothing in the repo knows it | infra | M | fable | design-system |
| — | 528 | The design workbench still holds the copy and the law T468 deleted | mvp | S | fable | design |
| — | 533 | Dynamic member segments: combinable predicates over the member universe | mvp, | M | opus | |
| — | 534 | BO-curated “what opens in this phase” for the earned-phase ceremony | mvp, | S | opus | admin |
| — | 545 | She chooses to step back a week | post-mvp | M | fable | dashboard |
| — | 550 | Measure phase-screen comprehension with real members | infra | S | opus | dashboard |
| — | 551 | Instrument whether the phase screen changes behaviour | infra | S | opus | analytics |
| — | 555 | The session-close bar may cover the last line of the document | mvp | XS | opus | player |
| — | 557 | The phase screen disappears when the ritual has no progression engine, and says nothing | mvp | S | fable | dashboard |
| — | 589 | Compliance divergences from the 2026-09-03 audit: what the canonical docs say the code does, and it does not | infra | M | fable | compliance |
| — | 593 | Diastasis self-check guide: a fourth lead magnet on the guides page | post-mvp | M | fable | other |
| — | 594 | Guardian: every private route gates itself, member side included (the T585 class, generalised) | infra | S | fable | auth |
| — | 602 | Answer a support message from its own screen, so the conversation lives where the policy can be kept | mvp | M | opus | admin |
| — | 617 | Every exercise carries its granular tags in the database, and the Back Office shows them | post-mvp | M | fable | content-migration |
| — | 624 | What the member opens outside the day’s session: the two self-measurements and the two free breathing practices | content-migration | M | fable | content-migration |
| — | 628 | The phase and evaluation intro videos were cut and never given a home | content-migration | S | fable | content-migration |
| — | 632 | No gate can see contrast on a control that only exists after a click | infra | M | opus | infra |
| — | 645 | Nothing detects two specs sharing a ticket number | infra | S | opus | infra |
| — | 647 | The Google consent screen carries TheFittClub’s real mark | polish | S | opus | auth |
| — | 649 | The contrast gate discards resting-state pseudo-classes in silence | infra | XS | opus | infra |
| — | 650 | The locked CREAR MI CUENTA button never says what unlocks it | mvp, | S | opus | auth |
| — | 654 | fix: on a PR opened by the agent, the design gate never runs at all | infra | S | opus | infra |
| — | 659 | Three background videos carry a burned-in AI-generation watermark | mvp, | S | opus | design |
| — | 661 | fix: the auto-test goes black when the video host is blocked, and per-placement CSS cannot fix it | mvp, | S | opus | design |
| — | 662 | The default family’s third question is carrying the failures | infra | M | mixed | infra |
| — | 663 | fix: the play button flashes for an instant before the still replaces it | mvp, | S | opus | design |
| — | 671 | Should a grant on a superseded consent version re-gate the Art. 9 features? | mvp | S | opus | compliance |
| — | 673 | Nothing ever writes a marketing consent row, so the re-engagement email can never send | infra | S | opus | compliance |
| — | 674 | The suppression list is the authority on who we never write to, and nobody can look at it | infra | M | opus | admin |
| — | 675 | The campaign, and only then the leads hold comes off | infra | M | opus | |
| — | 676 | The token contrast checker passes by omission on anything nobody wrote down | infra | S | opus | infra |
| — | 694 | The player E2E suite has never run against a slug that exists | infra | S | opus | player |
| — | 698 | A program can only say the journal is on or off, never “coming soon” | post-mvp | M | opus | dashboard |
| — | 701 | Broadcast preview follows the recipient language | mvp | S | opus | |
| — | 702 | Account recovery remembers the request language | mvp | M | opus | auth |
| — | 704 | Read every system email in the Back Office | polish | M | opus | |
| — | 706 | Mature the live member journey before expanding the product | post-mvp, | L | mixed | analytics, other |
| — | 715 | «Descargar gratis» does not say it costs an email | mvp, | S | opus | design |
| — | 716 | The 53 frozen drift pairs are measured, not resolved | infra | L | opus | design |
| — | 717 | The shadow family cannot decide its black, and 133 declarations ignore it | infra, | L | mixed | design |
| — | 718 | The handoff package states four rules and enforces none of them | infra | M | opus | infra |
| — | 720 | The design handoff still draws the “Siguiente” card T670 removed | polish | S | opus | design |
| — | 723 | The pre-QA settle gate is unsatisfiable exactly when the reviewer is doing its job | infra | S | opus | infra |
| — | 726 | The library has no shelf for the documents and audios she has unlocked | post-mvp | M | fable | dashboard |
| — | 727 | Connect training prescriptions and observed practice from the first session | infra, | L | mixed | analytics |
| — | 732 | A new common string reaches an installed member as a raw key | mvp | S | opus | infra |
| — | 733 | Member pricing asks a column nobody fills, and a free seat has no name | mvp | M | mixed | billing |
| — | 736 | fix: an agent can widen its own authority and nothing stops the merge | mvp | S | opus | infra |
| — | 737 | fix: the week card says what does NOT subtract and never what does | mvp | XS | opus | dashboard |
| — | 738 | fix: the phase card clips «Fase 1 de 6» on every phone it is read on | mvp | S | opus | dashboard |
| — | 739 | fix: the empty dashboard promises a welcome capsule the catalogue does not have | mvp | S | opus | dashboard |
| — | 740 | Measure what video actually costs the Worker, before moving it anywhere | infra | M | opus | infra |
| — | 744 | Deploy serves code whose schema is not there | infra | L | opus | infra |
| — | 745 | The migration-drift report lands where she looks | infra | S | opus | admin |
| — | 746 | Alerting is dimensioned for volume, so a fully-broken route goes quiet as traffic grows | infra | M | opus | analytics |
| — | 747 | The other Back Office loaders were never audited for the shape T743 fixed | infra | M | opus | admin |
| — | 749 | preflight and CI disagree about coverage, so the local gate trains you to trust it wrongly | infra | S | opus | infra |
| — | 750 | A doc-only head commit leaves a PR with zero checks and a pending status | infra | S | opus | infra |
| — | 751 | A control that cannot run is indistinguishable from one that passes | infra | M | opus | infra |
| — | 752 | The egress backstop reports into a Worker log nobody watches | infra | S | opus | infra |
| — | 753 | The guide download token travels in a query string | infra | L | opus | infra |
| — | 754 | The AI reviewer spends its budget on files the PR does not contain | infra | S | opus | infra |
| — | 755 | Step 8 has no defined way to pass other than the tool agreeing twice | infra | S | opus | infra |
| — | 756 | The invocations script dies on a field Cloudflare removed, and blames the token | infra | S | opus | infra |
| — | 757 | A returning visitor receives an obsolete document | infra | M | opus | infra |
| — | 758 | The self-assessment hides why submission failed | polish | S | opus | onboarding |
| — | 759 | Keyboard focus reaches the hidden shopping bag | polish | S | opus | design |
| — | 760 | Password reset email and landing use different locales | polish | S | fable | |
| — | 761 | Direct image upload selects an unusable reference | polish | S | opus | admin |
| — | 762 | Restrict training extraction without removing public discovery | infra | M | opus | infra |
| — | 763 | Security validation becomes a repeatable regression suite | infra | M | opus | infra |
| — | 764 | Verified mailbox authority for lead mutations | infra | L | opus | auth |
| — | 765 | Pregnancy withdrawal survives anonymous submissions | infra | M | opus | compliance |
| — | 766 | Anonymous lead submissions cannot rewrite an existing contact | infra | L | opus | |
| — | 767 | Public guide flow cannot disclose contact history or assessment | infra | L | opus | auth |
| — | 768 | Email authentication throttling admits attempts atomically | infra | L | opus | auth |
| — | 769 | Security remediation release and evidence closeout | infra | M | opus | infra |
| — | 770 | Revalidate media expiry and webhook claims separated from session revocation | infra | M | opus | infra |
| — | 776 | The dashboard loader fabricates a phase for a ritual it never chose | mvp, | M | opus | dashboard |
| — | 778 | A forwarded server error keeps its cause | infra | S | opus | analytics |
| — | 787 | The board line every parallel PR fights over | infra | M | opus | infra |
| — | 789 | The AI reviewer reads the spec it is reviewing against | infra | S | opus | infra |
| — | 794 | Fix: the minutes recorded for a finished session fall back to the every-mode sum | infra | XS | opus | dashboard |
| — | 797 | Fix: the minutes a chip advertises depend on who is looking at it | infra | XS | opus | dashboard |
| — | 798 | A duration number says which duration it is, so a caller cannot pick the wrong one | infra | S | opus | infra |
| — | 800 | Two binding contracts that no CI run can ever check | infra | S | opus | infra |
| — | 803 | A first login becomes a first session: activation of the migrated cohort | mvp | M | opus | dashboard |
| — | 804 | A performance budget per route, before optimising anything | infra | S | opus | infra |
| — | 808 | A deploy never strands a running client | mvp | M | opus | infra |
| — | 809 | A “no puedes entrar aquí” tells her we broke something | mvp | S | opus | design |
| — | 810 | The admin 500 nobody can diagnose | infra | S | opus | admin |
| — | 816 | Every form is checked against its schema, without a fixture | infra | S | opus | infra |
| — | 821 | A gap with a ticket number accepts itself: the founder decides defects and design, not each gap | infra | M | opus | infra |
Beta Launch (deadline: 2027-01-31) — 18 tickets · 85 pts
| # | Ticket | Título | Track | Effort | Model | Domain |
|---|---|---|---|---|---|---|
| 50 | 181 | Ritual Core: sales page Hito 3 (máxima conversión) | mvp | L | mixed | other |
| — | 20 | Stripe checkout + custom page + webhooks | mvp | L | mixed | schema |
| — | 29 | Pre-launch verification: happy-path E2E theater (the perf budget moved to T804) | mvp | M | opus | other |
| — | 39 | Funnel analytics + event tracking | mvp | M | opus | other |
| — | 213 | Meta CAPI: deduplicated Purchase from app checkout (pixel + server) | mvp | L | mixed | analytics |
| — | 277 | Wire real billing/entitlements to the profile Subscription UI | mvp | L | mixed | billing |
| — | 288 | English translation quality sweep (detect ES-in-EN + translate) | mvp, | L | mixed | content-migration |
| — | 323 | BO drip-sequence controls (enable/disable + cadence) | mvp | M | mixed | email, back-office |
| — | 394 | Pricing SSOT + machine-readable Offer schema on the public sales surface | mvp | M | mixed | billing, infra |
| — | 410 | Public testimonial wall + UI consumption from the SSOT | mvp | L | mixed | design |
| — | 411 | Club points for testimonials: per-product amounts, profile display, in-product prompts | mvp | M | mixed | other |
| — | 444 | The withdrawal-waiver checkbox, and the refund window each product actually gets | mvp | M | fable | compliance |
| — | 470 | The maternity coupon in the postpartum notice, and the settings the sends deserve | mvp | M | opus | |
| — | 566 | Build the progress-photo lock the documentation already promises | mvp | M | opus | dashboard |
| — | 631 | The Sculpt gym session pushes the hero CTA under the fold | polish | S | opus | dashboard |
| — | 680 | Nothing links to a sale until checkout exists | mvp | S | opus | billing |
| — | 700 | Email funnels follow the opening of sales | mvp | M | mixed | |
| — | 712 | /metodo asks for ten screens of scroll on a phone | mvp | L | opus | design |
Producción (deadline: 2027-06-30) — 56 tickets · 193 pts
| # | Ticket | Título | Track | Effort | Model | Domain |
|---|---|---|---|---|---|---|
| 48 | 22 | Gifting / gift_vouchers | mvp | M | opus | schema |
| 51 | 34 | BO admin: Stripe customer + purchases panel | post-mvp | M | ? | admin |
| 55 | 64 | Friction stacks: compress the IG production loop from 15 to 5 steps | infra | M | mixed | other |
| — | 54 | Multi-currency + multi-region pricing strategy (LATAM + EU) | mvp | L | opus | other |
| — | 105 | PWA native UX patterns (push, ⌘K search, FAB empezar sesión) | mvp | L | mixed | pwa, global UI |
| — | 162 | Harden the migration-validation CI job (close the latent-baseline gap) | infra | S | opus | other |
| — | 196 | Per-product Bitácora + Diario (“Tu seguimiento” in module detail) | mvp | M | mixed | dashboard |
| — | 209 | Retention: Back Office dashboard (T57 slice F) | mvp | L | mixed | admin |
| — | 280 | Prensa /prensa · /press: public press surface (net-new) | post-mvp | M | opus | design |
| — | 282 | Leads growth insights (cross-leads analytics) | mvp | M | opus | admin, analytics |
| — | 336 | Dynamic Facebook reviews in Home’s GEO Review schema | post-mvp | L | mixed | infra |
| — | 341 | R2 media key ↔ entity ID divergence (accept + entity-agnostic GC) | infra | S | opus | infra |
| — | 346 | PDF reading-time from auto word count (pdf.js extraction) — dep-bump child of T325 | mvp | XS | opus | admin |
| — | 359 | BO leads list: filter by tag | post-mvp | S | opus | admin |
| — | 385 | Ambassador BO oversight: visibility, leak alerts, code revocation | mvp | L | mixed | admin |
| — | 392 | Deploy the PR preview from CI with wrangler, not the Cloudflare builder | infra | M | mixed | infra |
| — | 395 | Agent-readable catalog endpoint + agentic-commerce readiness | post-mvp, | L | mixed | infra, billing |
| — | 397 | Full specs-vs-code audit (Fable session) | infra | L | fable | other |
| — | 398 | File-size gate (diff-only pre-commit + full-repo trend) | infra | S | opus | infra |
| — | 402 | fix: autonomy-health reports “salud OK” when jq is missing | infra | XS | opus | infra |
| — | 408 | BO content sync: real coverage, one table list, and per-group scope | infra | L | mixed | admin |
| — | 412 | Image and video in testimonials | mvp | L | mixed | other |
| — | 419 | Instagram + Facebook Messenger inbound on the shared AI assistant | mvp | M | mixed | other |
| — | 421 | fix: audit-skills.sh trusts file order for “last used”, so a merge can fake a STALE verdict | infra | XS | opus | infra |
| — | 461 | Lint to zero (1/4): no-unused-vars + stale disable directives | infra | XS | opus | infra |
| — | 462 | Lint to zero (2/4): label-has-associated-control (92 form labels) | mvp | M | opus | admin |
| — | 463 | Lint to zero (3/4): control-has-associated-label (186 — triage first) | mvp | L | mixed | other |
| — | 464 | Lint to zero (4/4): the 22 interaction findings + close the ratchet at 0 | mvp | M | opus | player |
| — | 500 | Seed fixture answers realign with the engine-era onboarding set (+ committed FK-integrity check) | infra | S | opus | infra |
| — | 576 | lint-locale-safety R2: resolve the namespace, and re-scan when a STRING gains a placeholder | infra | S | opus | infra |
| — | 616 | A short symptom questionnaire opens and closes every Legacy phase: the product’s own evidence | post-mvp | L | fable | other |
| — | 641 | Five copies of the same month arithmetic, and the same bug lived in all five | infra | S | opus | infra |
| — | 646 | Social login: Apple (Sign in with Apple) | mvp | M | opus | auth |
| — | 648 | Retire the dead third-party configs from the abandoned stack | infra | XS | opus | infra |
| — | 656 | Nothing stops a relative image URL from leaving our own pages | infra | XS | opus | infra |
| — | 660 | fix: the test guarding the credential scrub runs a stale copy of it | infra | XS | opus | infra |
| — | 678 | Give the repo a formatter, so no session re-wraps code nobody asked it to | infra | S | opus | infra |
| — | 686 | A force-push makes the pre-push gate say it checked when it did not | infra | S | opus | infra |
| — | 687 | The skill-usage log rides in every reviewed diff | infra | S | opus | infra |
| — | 688 | The recovery queue takes the wrong button away without offering the right one | polish | XS | opus | admin |
| — | 691 | dashboard.server.ts is five services wearing one name | infra | L | opus | dashboard |
| — | 693 | ci.yml pays twice for the same answer (T537 phase 2) | infra | S | opus | infra |
| — | 695 | sessionCanvas.server.ts is a second reader of a schema the player already serves | infra | S | opus | player |
| — | 696 | The rest of repo-layout.md: which rules nobody checks, and which are simply false | infra | L | opus | infra |
| — | 721 | React Router 7 → 8 is a migration, not a Dependabot bump | infra | L | opus | infra |
| — | 724 | Two gates can be made to agree with the change they are judging | infra | M | opus | infra |
| — | 725 | Whether a document, audio or theory video is mandatory is a code rule, not a Back Office field | post-mvp | M | opus | admin |
| — | 728 | Refine phase advancement using traceable training evidence | mvp | L | mixed | player |
| — | 729 | The repo still points at a Desktop that moved | infra | S | opus | infra |
| — | 792 | An asset placement has one name, not three | infra | L | opus | schema |
| — | 793 | materials INT→TEXT PK migration (mat_<slug>) | infra | M | opus | schema |
| — | 795 | fix: the seed-password env vars leak from one test file into the next | infra | S | opus | infra |
| — | 796 | Fix: the dashboard card’s progressiveVersion hides its null behind a plausible 1 | infra | XS | opus | dashboard |
| — | 799 | Fix: the seed banner names two phases and emits three | infra | XS | opus | infra |
| — | 801 | A file that says “GENERATED by” is trusted, never checked | infra | M | opus | infra |
| — | 802 | The settle gate excuses a file by its path, never by what changed in it | infra | S | opus | infra |
Deferred — 26 tickets · 97 pts
| # | Ticket | Título | Track | Effort | Model | Domain |
|---|---|---|---|---|---|---|
| — | 18 | Admin routes: tripartite convention + scaffold (strangler, not big-bang) | infra | S | ? | admin |
| — | 19 | Multi-ritual weekly distribution algorithm | post-mvp | M | ? | dashboard |
| — | 53 | Magazine editorial policy + GEO playbook (the rules the publish gate enforces) | mvp | M | mixed | compliance |
| — | 111 | Skill tfc-ai-pulse: structured quarterly AI tooling review (parked) | infra | S | opus | other (meta — Claude Code skill / dev tooling) |
| — | 112 | Migration to a GitHub Organization on the Team plan for branch protection enforcement (parked) | infra | XS | opus | other (infra / devops — repo administration) |
| — | 126 | D1 per-PR branching (PARKED — deferred follow-up) | infra | M | opus | infra |
| — | 127 | OpenTelemetry distributed tracing (PARKED — deferred follow-up) | infra | L | opus | infra |
| — | 130 | Brand / product vocabulary SSOT (with mandatory ADR-0005 investigation) | infra | L | fable | content-migration |
| — | 160 | Remove eslint-plugin-jsx-a11y ESLint-10 peer override (upstream-gated) | infra | XS | opus | other |
| — | 164 | In-app notifications: header badge + center (consumes T98 slot) | mvp | M | mixed | global UI |
| — | 255 | Unify the admin-BO design carve-out into a single shared source | infra | S | opus | infra |
| — | 259 | Fix horizontal overflow on /admin/assets (mobile) | polish | S | opus | infra |
| — | 279 | Magazine: the public surface /es/magazine · /en/magazine from the definitive design | mvp | L | fable | design |
| — | 308 | infra | S | opus | infra | |
| — | 309 | infra | M | opus | infra | |
| — | 310 | Modal .tm-* token-tier visual adoption (surface ticket) | polish | M | mixed | other |
| — | 363 | Membership seniority tiers + phase milestones (recognition, not a losable ladder) | post-mvp | L | fable | account |
| — | 442 | Scope the precache: 686 kB on the first visit | polish | S | opus | infra |
| — | 449 | Receiving photos and videos on WhatsApp | post-mvp | L | opus | compliance |
| — | 456 | PR Autopilot pays the full visual-invariants sweep on every intermediate round, not just the final one | infra | M | opus | infra |
| — | 458 | Magazine content schema in D1 (posts + per-locale translations + authors + media) | mvp | L | opus | schema |
| — | 459 | Back Office: magazine CMS (/admin/magazine) — block composer, state machine, EN pipeline | mvp | L | opus | admin |
| — | 460 | Rename sweep: everything called “blog” becomes “magazine” | mvp | S | opus | other |
| — | 465 | Magazine audio: TTS at publish, real recordings, and the listen surface | post-mvp | L | mixed | other |
| — | 505 | ”Watch on the TV” button in the player (Remote Playback: AirPlay + Cast) | post-mvp | M | mixed | player |
| — | 513 | Break-glass reverse proxy off Cloudflare (block-collision escape hatch) | infra | S | opus | infra |
Done reciente
| Ticket | Título | Cerrado |
|---|---|---|
| 822 | Un spec nuevo es un compromiso, no prosa | 2026-09-27 |
| 819 | Un veredicto solo se lee donde abre su línea | 2026-09-27 |
| 818 | An independent adversarial audit is a QA pre-step for infra tickets — tfc-infra-auditor, the pre-step in 03-qa-ticket.md, R4 in lint-design-review-receipt.mjs, the fourth agent paid in the ratchet | 2026-09-27 |
| 814 | Cada regla es un script, una skill o nada — y un gate nuevo cuesta uno viejo. De 9.684 a 2.998 palabras siempre cargadas, cada regla que sale con su fila en rule-ledger-2026-09.md; presupuesto de scaffolding con ratchet (28 gates · 26 skills · 9 hooks · 3 agents) medido desde git, en pre-commit, pre-push y CI; siete auditorías independientes (PR #1839, #1841, #1849). | 2026-09-26 |
| 817 | Un panel de PostHog que dice quién entra, cuántas socias guardan entrenamientos y cuántas repiten. ritual_completed una vez por fila guardada, ritual_started, identidad y $pageview con consentimiento, URLs saneadas, entorno en app/worker/navegador, 404 sin bots (absorbe T575). Producción desde 2026-09-24 23:12 (Madrid); conciliación D1 ↔ PostHog 4/4. PRs #1836 · #1842. Diferido: residuo de 404 a 7 días (1-10) y segmento tester (sin testers). | 2026-09-26 |
Para histórico completo (incluye tickets pre-redesign sin fecha): _docs/03-tickets/00-board.md en el repo.
Cómo leer este tablero
- Active = lo que estoy construyendo ahora. Cada ticket tiene una rama abierta.
- QA = implementación terminada y commiteada, theater en ejecución (
_docs/06-prompts/03-qa-ticket.md). - Pending = ideas con spec escrito que aún no pueden tocarse sin “go” explícito.
- Done = mergeado a main. El spec está bloqueado en
04-done/con su## Regression contract. - Hito indica el milestone objetivo:
Septiembre(migrar a las socias legacy; se llamóJuniohasta el 2026-09-03) ·Beta(polish) ·Beta Launch(Cápsula Cero) ·Producción(Stripe). - Track clasifica el ticket — ver tabla
## Tracksmás abajo para descripción de cada uno y si cuenta o no al % MVP. - Effort (T-shirt) estima horas de Claude Code: XS<1h (0.5pts) · S<4h (1pt) · M=4-12h (3pts) · L=12-30h (8pts) · XL=30h+ (20pts). Weighted % usa estos puntos.
- Model indica el LLM recomendado para implementar:
opus(por defecto: implementa un spec cerrado, fixes, infra, tests),fable(solo cuando el criterio es el entregable: copy que lee una socia, ley de producto, diseño de una superficie nueva, ADRs, auditorías),mixed(cada fase su modelo). Sonnet se retiró el 2026-09-03.
Tracks
Cada ticket lleva un Track: en el header de su spec. Define la naturaleza del trabajo y si cuenta al % de progreso del Hito.
| Track | Descripción | ¿Cuenta al % MVP? |
|---|---|---|
mvp | Funcionalidad core para lanzamiento (rutas, dominio, UI de producto, autenticación, contenido del MVP). | ✅ sí |
infra | Plataforma, CI, pipelines, harness, observabilidad, hooks. Habilita ritmo seguro. | ✅ sí |
post-mvp | Diferido a Beta o post-launch. No bloquea el lanzamiento del Hito Septiembre. | ❌ no |
polish | Mejoras de pulido (DX, refactor incremental, microcopy) sin cambio de contrato. | ❌ no |
content-migration | Migración / consolidación de contenido (Ritual Core Legacy → MVP, copy bilingüe). | ❌ no — el contenido cuenta caso por caso, no globalmente |
Para detalle técnico de cualquier ticket, abrir el spec en el repo:
~/Desktop/TFC/thefittclub/_docs/03-tickets/<carpeta>/<NN>-<slug>.md
Para detalle de cualquier métrica, abrir la fuente correspondiente en ~/Desktop/TFC/thefittclub/_docs/01-core/.
Auto-generado por scripts/maintenance/generate-vault-dashboard.mjs. Última corrida local/CI: 2026-09-28.