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 compass del 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 (T699 panel, T670 cierre, T581 evaluació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, /admin incluido. 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 guarda UnknownError; 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/soporte le vende el método a quien ya pagó. · T387(M) — la encuesta de Semana 0 aplicada al motor de ~14 socias, con su consentimiento.
  • T803 sale 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 con T777+T738+T732 · T773 · y T584 (el dominio: www muestra «Plan Expired»).
  • Las tres decisiones, tomadas el 21-09 con el voto del arquitecto y de la PM (informe § 10): (1) T54 sale del camino de T20: 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.md Paso 0, PR #1812 fusionada) con su plantilla de ledger en _docs/ops/. Y T29 se parte: el presupuesto de rendimiento es T804(S, Beta).
  • Cerrado desde la brújula del 11-09: T699 T670 T581 T386 T771 T703 T730 T772 (anulado, absorbido en T386) T569 T614 T785 T786. 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 zombis LocalizedText + physical_focus_translations eliminadas) → T172 (medios por idioma + subtítulos mezclables) + T174 (gate determinista del patrón de almacenamiento). T96 (tirar las routines legacy) 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 gate tfc-i18n-parity y “faltan claves” dejó de ser el trabajo. Lo que queda son ~141 candidatos a texto escrito a fuego en TSX. No confundir con T288 (Beta), que es otra cosa: la calidad de la traducción, y cuyo peso se ha mudado a las 14 tablas *_translations de la base de datos.
  • En una línea: el carril i18n está cerrado salvo T24, y T24 es 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 vault 100_Desarrollo/03_Priorizacion_Backlog.md): 7 muertos — T51b T62 T273 T316 T357 T544 T572, 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 en 04-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ú: T624 ahora (promesa rota a una socia que pagó) o tras la estantería de T726 (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 miraba 01-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étricaHoyFuente
% 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 readiness52% (14 de 27)_docs/01-core/production-readiness.md
Legacy abierto6 (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 calendar76.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)

EjeDistribución
EffortXS: 18 · S: 57 · M: 65 · L: 31 · XL: 0 · sin estimar: 0
Modelo LLMfable: 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.

HitoDeadlineDoneEn vueloPendingPts done/total%Restante
Septiembre2026-09-15 (-13d)30607875.5/888 pts99%12.5 pts
Beta2026-11-30 (63d)1742118495.5/787 pts63%291.5 pts
Beta Launch2027-01-31 (125d)1611861.5/149.5 pts41%88 pts
Producción2027-06-30 (275d)2205656.5/249.5 pts23%193 pts
Deferred—27026109/206 pts53%97 pts
Sin hito—330087/87 pts100%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.

ProductoF1F2F3F4Real
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.

HitoPlazoEntregableTicket
H13-4 weeksPre-MVP lead magnet chosen + produced (PDF / audio / video). Available in R2, signed-URL on form submission.T61
H24-6 weeksPublic landing with email capture serving H1. Part of T36 with LEAD_MAGNET_VARIANT=pre-mvp.T36 (consumes T61)
H36-10 weeksPublic blog /blog with 4-6 evergreen articles, one per pillar.T53 (promoted to MVP)
H48-14 weeksBi-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íaCountNotas
Instagram posts publicados0canal primario — 100% conversiones históricas
YouTube videos publicados0long-form companion (pro setup disponible)
Newsletters publicadas0
Blog articles publicados0
Lead magnet downloads (semanas registradas)0
Beta sessions completadas0

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.

SemanaTickets proyectadosPtsObligacionesRiesgo
Wk1 (2026-09-28)T387 · T383 · T326 · T591 · T587 · T24 · T63 · T115 · T181 · T22 · T34 · T6437/74.13Instagram · Founder✓
Wk2 (2026-10-05)(none)0/65.13Instagram · Bi-monthly · Founder · Monthly✓
Wk3 (2026-10-12)(none)0/74.13Instagram · Founder✓
Wk4 (2026-10-19)(none)0/74.13Instagram · 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.

MesTickets proyectadosBig rocks (XL/L)
2026-09T387 · T383 · T326 · T591 · T587 · T24 · T63 · T115 · T181 · T22 · T34 · T64T181 (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 en progressive-overload.ts, y no la llama nadie. La pantalla se lo promete igualmente. Solo afecta a prod_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

#TicketTítuloTrackEffortModelDomain
16387Q3 personalization seed: Semana-0 survey → migrated members’ physical profilescontent-migration,Mmixedcontent-migration
—588Revoked sessions lose access on the next protected requestinfraMopusauth
—627The eleven Legacy counts where the clip says one number and the app asks for anothercontent-migrationSfablecontent-migration
—774The support page sells the method to a member who already bought, and claims an inbox that does not existmvp,Smixedcontent-migration
—777A login that fails on the network says nothingmvpSopusauth
—790The player names the round and the series from the rows, not from a repeat countermvpMmixedplayer
—807Count the deploys that strand a member, before fixing themmvpXSopusinfra

Beta (deadline: 2026-11-30) — 118 tickets · 280.5 pts

#TicketTítuloTrackEffortModelDomain
1383Tap targets: land the system rule, starting with consent paritymvpMopuscompliance
4326Upgrade to Workers Paid: restore cron capacity (post-beta, revenue-gated)post-mvpSopusinfra
23591Account and CI credential hardening: 2FA attested, one CI token split by scope, and what an automated attacker meets firstinfraSopusinfra
24587Backups: a second copy of every Ritual Core video outside Cloudflare, and the three gaps around the D1 backupinfra,Mopusinfra
2924App bilingual completeness passmvpMopusother
3263Beta program design + execution (1-2 months free, polish before paid launch)mvpMopusother
40115Journal write surface (member-facing entry creation UI)mvpMmixeddashboard
—168New-device sign-in alertmvpMmixedauth
—206Retention: action-event emission (T57 slice C)mvpMmixedanalytics
—207Retention: moment-driven celebratory cadence (T57 slice D)mvpMmixedemail
—208Retention: in-app surfaces (T57 slice E)mvpMmixeddashboard
—318Separate the journaling consent from the onboarding consentmvpMfablecompliance
—328BO broadcast body: safe Markdown renderingpost-mvpSmixedemail
—339Prep-exercise detail sheet: video + why-it-was-added + dosing, with start-session CTAmvpMmixeddashboard
—388Re-tag legacy session blocks to the resolved product-modality (T358 data follow-up)infra,Sopusschema
—391Extract the shared private-loader preambleinfraMopusinfra
—401Focus indicator for .af-link anchorspolishXSopusdesign
—443One name per phase, across every surface a member can seepolishMfablecontent-migration
—453Pay the reviewer from the subscription instead of API tokensinfraMopusinfra
—492Surface the descent signalmvpSopusadmin
—493Engine-input answers stay changeable after onboardingmvpMopusonboarding
—494The onboarding stage gets its delivered media, plus the surface’s hygiene sweeppolishSopusonboarding
—503One idempotency key closes the whole double-submit class (absorbs T478 A4 + A5)mvpSopusplayer
—512Member transition: PWA reinstall banner + old-host redirect + migration commsinfra,Smixedplayer
—519The smoke E2E verdict is hostage to a comment writeinfraXSopusinfra
—520A number is a datum, and nothing in the repo knows itinfraMfabledesign-system
—528The design workbench still holds the copy and the law T468 deletedmvpSfabledesign
—533Dynamic member segments: combinable predicates over the member universemvp,Mopusemail
—534BO-curated “what opens in this phase” for the earned-phase ceremonymvp,Sopusadmin
—545She chooses to step back a weekpost-mvpMfabledashboard
—550Measure phase-screen comprehension with real membersinfraSopusdashboard
—551Instrument whether the phase screen changes behaviourinfraSopusanalytics
—555The session-close bar may cover the last line of the documentmvpXSopusplayer
—557The phase screen disappears when the ritual has no progression engine, and says nothingmvpSfabledashboard
—589Compliance divergences from the 2026-09-03 audit: what the canonical docs say the code does, and it does notinfraMfablecompliance
—593Diastasis self-check guide: a fourth lead magnet on the guides pagepost-mvpMfableother
—594Guardian: every private route gates itself, member side included (the T585 class, generalised)infraSfableauth
—602Answer a support message from its own screen, so the conversation lives where the policy can be keptmvpMopusadmin
—617Every exercise carries its granular tags in the database, and the Back Office shows thempost-mvpMfablecontent-migration
—624What the member opens outside the day’s session: the two self-measurements and the two free breathing practicescontent-migrationMfablecontent-migration
—628The phase and evaluation intro videos were cut and never given a homecontent-migrationSfablecontent-migration
—632No gate can see contrast on a control that only exists after a clickinfraMopusinfra
—645Nothing detects two specs sharing a ticket numberinfraSopusinfra
—647The Google consent screen carries TheFittClub’s real markpolishSopusauth
—649The contrast gate discards resting-state pseudo-classes in silenceinfraXSopusinfra
—650The locked CREAR MI CUENTA button never says what unlocks itmvp,Sopusauth
—654fix: on a PR opened by the agent, the design gate never runs at allinfraSopusinfra
—659Three background videos carry a burned-in AI-generation watermarkmvp,Sopusdesign
—661fix: the auto-test goes black when the video host is blocked, and per-placement CSS cannot fix itmvp,Sopusdesign
—662The default family’s third question is carrying the failuresinfraMmixedinfra
—663fix: the play button flashes for an instant before the still replaces itmvp,Sopusdesign
—671Should a grant on a superseded consent version re-gate the Art. 9 features?mvpSopuscompliance
—673Nothing ever writes a marketing consent row, so the re-engagement email can never sendinfraSopuscompliance
—674The suppression list is the authority on who we never write to, and nobody can look at itinfraMopusadmin
—675The campaign, and only then the leads hold comes offinfraMopusemail
—676The token contrast checker passes by omission on anything nobody wrote downinfraSopusinfra
—694The player E2E suite has never run against a slug that existsinfraSopusplayer
—698A program can only say the journal is on or off, never “coming soon”post-mvpMopusdashboard
—701Broadcast preview follows the recipient languagemvpSopusemail
—702Account recovery remembers the request languagemvpMopusauth
—704Read every system email in the Back OfficepolishMopusemail
—706Mature the live member journey before expanding the productpost-mvp,Lmixedanalytics, other
—715«Descargar gratis» does not say it costs an emailmvp,Sopusdesign
—716The 53 frozen drift pairs are measured, not resolvedinfraLopusdesign
—717The shadow family cannot decide its black, and 133 declarations ignore itinfra,Lmixeddesign
—718The handoff package states four rules and enforces none of theminfraMopusinfra
—720The design handoff still draws the “Siguiente” card T670 removedpolishSopusdesign
—723The pre-QA settle gate is unsatisfiable exactly when the reviewer is doing its jobinfraSopusinfra
—726The library has no shelf for the documents and audios she has unlockedpost-mvpMfabledashboard
—727Connect training prescriptions and observed practice from the first sessioninfra,Lmixedanalytics
—732A new common string reaches an installed member as a raw keymvpSopusinfra
—733Member pricing asks a column nobody fills, and a free seat has no namemvpMmixedbilling
—736fix: an agent can widen its own authority and nothing stops the mergemvpSopusinfra
—737fix: the week card says what does NOT subtract and never what doesmvpXSopusdashboard
—738fix: the phase card clips «Fase 1 de 6» on every phone it is read onmvpSopusdashboard
—739fix: the empty dashboard promises a welcome capsule the catalogue does not havemvpSopusdashboard
—740Measure what video actually costs the Worker, before moving it anywhereinfraMopusinfra
—744Deploy serves code whose schema is not thereinfraLopusinfra
—745The migration-drift report lands where she looksinfraSopusadmin
—746Alerting is dimensioned for volume, so a fully-broken route goes quiet as traffic growsinfraMopusanalytics
—747The other Back Office loaders were never audited for the shape T743 fixedinfraMopusadmin
—749preflight and CI disagree about coverage, so the local gate trains you to trust it wronglyinfraSopusinfra
—750A doc-only head commit leaves a PR with zero checks and a pending statusinfraSopusinfra
—751A control that cannot run is indistinguishable from one that passesinfraMopusinfra
—752The egress backstop reports into a Worker log nobody watchesinfraSopusinfra
—753The guide download token travels in a query stringinfraLopusinfra
—754The AI reviewer spends its budget on files the PR does not containinfraSopusinfra
—755Step 8 has no defined way to pass other than the tool agreeing twiceinfraSopusinfra
—756The invocations script dies on a field Cloudflare removed, and blames the tokeninfraSopusinfra
—757A returning visitor receives an obsolete documentinfraMopusinfra
—758The self-assessment hides why submission failedpolishSopusonboarding
—759Keyboard focus reaches the hidden shopping bagpolishSopusdesign
—760Password reset email and landing use different localespolishSfableemail
—761Direct image upload selects an unusable referencepolishSopusadmin
—762Restrict training extraction without removing public discoveryinfraMopusinfra
—763Security validation becomes a repeatable regression suiteinfraMopusinfra
—764Verified mailbox authority for lead mutationsinfraLopusauth
—765Pregnancy withdrawal survives anonymous submissionsinfraMopuscompliance
—766Anonymous lead submissions cannot rewrite an existing contactinfraLopusemail
—767Public guide flow cannot disclose contact history or assessmentinfraLopusauth
—768Email authentication throttling admits attempts atomicallyinfraLopusauth
—769Security remediation release and evidence closeoutinfraMopusinfra
—770Revalidate media expiry and webhook claims separated from session revocationinfraMopusinfra
—776The dashboard loader fabricates a phase for a ritual it never chosemvp,Mopusdashboard
—778A forwarded server error keeps its causeinfraSopusanalytics
—787The board line every parallel PR fights overinfraMopusinfra
—789The AI reviewer reads the spec it is reviewing againstinfraSopusinfra
—794Fix: the minutes recorded for a finished session fall back to the every-mode suminfraXSopusdashboard
—797Fix: the minutes a chip advertises depend on who is looking at itinfraXSopusdashboard
—798A duration number says which duration it is, so a caller cannot pick the wrong oneinfraSopusinfra
—800Two binding contracts that no CI run can ever checkinfraSopusinfra
—803A first login becomes a first session: activation of the migrated cohortmvpMopusdashboard
—804A performance budget per route, before optimising anythinginfraSopusinfra
—808A deploy never strands a running clientmvpMopusinfra
—809A “no puedes entrar aquí” tells her we broke somethingmvpSopusdesign
—810The admin 500 nobody can diagnoseinfraSopusadmin
—816Every form is checked against its schema, without a fixtureinfraSopusinfra
—821A gap with a ticket number accepts itself: the founder decides defects and design, not each gapinfraMopusinfra

Beta Launch (deadline: 2027-01-31) — 18 tickets · 85 pts

#TicketTítuloTrackEffortModelDomain
50181Ritual Core: sales page Hito 3 (máxima conversión)mvpLmixedother
—20Stripe checkout + custom page + webhooksmvpLmixedschema
—29Pre-launch verification: happy-path E2E theater (the perf budget moved to T804)mvpMopusother
—39Funnel analytics + event trackingmvpMopusother
—213Meta CAPI: deduplicated Purchase from app checkout (pixel + server)mvpLmixedanalytics
—277Wire real billing/entitlements to the profile Subscription UImvpLmixedbilling
—288English translation quality sweep (detect ES-in-EN + translate)mvp,Lmixedcontent-migration
—323BO drip-sequence controls (enable/disable + cadence)mvpMmixedemail, back-office
—394Pricing SSOT + machine-readable Offer schema on the public sales surfacemvpMmixedbilling, infra
—410Public testimonial wall + UI consumption from the SSOTmvpLmixeddesign
—411Club points for testimonials: per-product amounts, profile display, in-product promptsmvpMmixedother
—444The withdrawal-waiver checkbox, and the refund window each product actually getsmvpMfablecompliance
—470The maternity coupon in the postpartum notice, and the settings the sends deservemvpMopusemail
—566Build the progress-photo lock the documentation already promisesmvpMopusdashboard
—631The Sculpt gym session pushes the hero CTA under the foldpolishSopusdashboard
—680Nothing links to a sale until checkout existsmvpSopusbilling
—700Email funnels follow the opening of salesmvpMmixedemail
—712/metodo asks for ten screens of scroll on a phonemvpLopusdesign

Producción (deadline: 2027-06-30) — 56 tickets · 193 pts

#TicketTítuloTrackEffortModelDomain
4822Gifting / gift_vouchersmvpMopusschema
5134BO admin: Stripe customer + purchases panelpost-mvpM?admin
5564Friction stacks: compress the IG production loop from 15 to 5 stepsinfraMmixedother
—54Multi-currency + multi-region pricing strategy (LATAM + EU)mvpLopusother
—105PWA native UX patterns (push, ⌘K search, FAB empezar sesión)mvpLmixedpwa, global UI
—162Harden the migration-validation CI job (close the latent-baseline gap)infraSopusother
—196Per-product Bitácora + Diario (“Tu seguimiento” in module detail)mvpMmixeddashboard
—209Retention: Back Office dashboard (T57 slice F)mvpLmixedadmin
—280Prensa /prensa · /press: public press surface (net-new)post-mvpMopusdesign
—282Leads growth insights (cross-leads analytics)mvpMopusadmin, analytics
—336Dynamic Facebook reviews in Home’s GEO Review schemapost-mvpLmixedinfra
—341R2 media key ↔ entity ID divergence (accept + entity-agnostic GC)infraSopusinfra
—346PDF reading-time from auto word count (pdf.js extraction) — dep-bump child of T325mvpXSopusadmin
—359BO leads list: filter by tagpost-mvpSopusadmin
—385Ambassador BO oversight: visibility, leak alerts, code revocationmvpLmixedadmin
—392Deploy the PR preview from CI with wrangler, not the Cloudflare builderinfraMmixedinfra
—395Agent-readable catalog endpoint + agentic-commerce readinesspost-mvp,Lmixedinfra, billing
—397Full specs-vs-code audit (Fable session)infraLfableother
—398File-size gate (diff-only pre-commit + full-repo trend)infraSopusinfra
—402fix: autonomy-health reports “salud OK” when jq is missinginfraXSopusinfra
—408BO content sync: real coverage, one table list, and per-group scopeinfraLmixedadmin
—412Image and video in testimonialsmvpLmixedother
—419Instagram + Facebook Messenger inbound on the shared AI assistantmvpMmixedother
—421fix: audit-skills.sh trusts file order for “last used”, so a merge can fake a STALE verdictinfraXSopusinfra
—461Lint to zero (1/4): no-unused-vars + stale disable directivesinfraXSopusinfra
—462Lint to zero (2/4): label-has-associated-control (92 form labels)mvpMopusadmin
—463Lint to zero (3/4): control-has-associated-label (186 — triage first)mvpLmixedother
—464Lint to zero (4/4): the 22 interaction findings + close the ratchet at 0mvpMopusplayer
—500Seed fixture answers realign with the engine-era onboarding set (+ committed FK-integrity check)infraSopusinfra
—576lint-locale-safety R2: resolve the namespace, and re-scan when a STRING gains a placeholderinfraSopusinfra
—616A short symptom questionnaire opens and closes every Legacy phase: the product’s own evidencepost-mvpLfableother
—641Five copies of the same month arithmetic, and the same bug lived in all fiveinfraSopusinfra
—646Social login: Apple (Sign in with Apple)mvpMopusauth
—648Retire the dead third-party configs from the abandoned stackinfraXSopusinfra
—656Nothing stops a relative image URL from leaving our own pagesinfraXSopusinfra
—660fix: the test guarding the credential scrub runs a stale copy of itinfraXSopusinfra
—678Give the repo a formatter, so no session re-wraps code nobody asked it toinfraSopusinfra
—686A force-push makes the pre-push gate say it checked when it did notinfraSopusinfra
—687The skill-usage log rides in every reviewed diffinfraSopusinfra
—688The recovery queue takes the wrong button away without offering the right onepolishXSopusadmin
—691dashboard.server.ts is five services wearing one nameinfraLopusdashboard
—693ci.yml pays twice for the same answer (T537 phase 2)infraSopusinfra
—695sessionCanvas.server.ts is a second reader of a schema the player already servesinfraSopusplayer
—696The rest of repo-layout.md: which rules nobody checks, and which are simply falseinfraLopusinfra
—721React Router 7 → 8 is a migration, not a Dependabot bumpinfraLopusinfra
—724Two gates can be made to agree with the change they are judginginfraMopusinfra
—725Whether a document, audio or theory video is mandatory is a code rule, not a Back Office fieldpost-mvpMopusadmin
—728Refine phase advancement using traceable training evidencemvpLmixedplayer
—729The repo still points at a Desktop that movedinfraSopusinfra
—792An asset placement has one name, not threeinfraLopusschema
—793materials INT→TEXT PK migration (mat_<slug>)infraMopusschema
—795fix: the seed-password env vars leak from one test file into the nextinfraSopusinfra
—796Fix: the dashboard card’s progressiveVersion hides its null behind a plausible 1infraXSopusdashboard
—799Fix: the seed banner names two phases and emits threeinfraXSopusinfra
—801A file that says “GENERATED by” is trusted, never checkedinfraMopusinfra
—802The settle gate excuses a file by its path, never by what changed in itinfraSopusinfra

Deferred — 26 tickets · 97 pts

#TicketTítuloTrackEffortModelDomain
—18Admin routes: tripartite convention + scaffold (strangler, not big-bang)infraS?admin
—19Multi-ritual weekly distribution algorithmpost-mvpM?dashboard
—53Magazine editorial policy + GEO playbook (the rules the publish gate enforces)mvpMmixedcompliance
—111Skill tfc-ai-pulse: structured quarterly AI tooling review (parked)infraSopusother (meta — Claude Code skill / dev tooling)
—112Migration to a GitHub Organization on the Team plan for branch protection enforcement (parked)infraXSopusother (infra / devops — repo administration)
—126D1 per-PR branching (PARKED — deferred follow-up)infraMopusinfra
—127OpenTelemetry distributed tracing (PARKED — deferred follow-up)infraLopusinfra
—130Brand / product vocabulary SSOT (with mandatory ADR-0005 investigation)infraLfablecontent-migration
—160Remove eslint-plugin-jsx-a11y ESLint-10 peer override (upstream-gated)infraXSopusother
—164In-app notifications: header badge + center (consumes T98 slot)mvpMmixedglobal UI
—255Unify the admin-BO design carve-out into a single shared sourceinfraSopusinfra
—259Fix horizontal overflow on /admin/assets (mobile)polishSopusinfra
—279Magazine: the public surface /es/magazine · /en/magazine from the definitive designmvpLfabledesign
—308infraSopusinfra
—309infraMopusinfra
—310Modal .tm-* token-tier visual adoption (surface ticket)polishMmixedother
—363Membership seniority tiers + phase milestones (recognition, not a losable ladder)post-mvpLfableaccount
—442Scope the precache: 686 kB on the first visitpolishSopusinfra
—449Receiving photos and videos on WhatsApppost-mvpLopuscompliance
—456PR Autopilot pays the full visual-invariants sweep on every intermediate round, not just the final oneinfraMopusinfra
—458Magazine content schema in D1 (posts + per-locale translations + authors + media)mvpLopusschema
—459Back Office: magazine CMS (/admin/magazine) — block composer, state machine, EN pipelinemvpLopusadmin
—460Rename sweep: everything called “blog” becomes “magazine”mvpSopusother
—465Magazine audio: TTS at publish, real recordings, and the listen surfacepost-mvpLmixedother
—505”Watch on the TV” button in the player (Remote Playback: AirPlay + Cast)post-mvpMmixedplayer
—513Break-glass reverse proxy off Cloudflare (block-collision escape hatch)infraSopusinfra

Done reciente

TicketTítuloCerrado
822Un spec nuevo es un compromiso, no prosa2026-09-27
819Un veredicto solo se lee donde abre su línea2026-09-27
818An 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 ratchet2026-09-27
814Cada 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
817Un 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ó Junio hasta el 2026-09-03) · Beta (polish) · Beta Launch (Cápsula Cero) · Producción (Stripe).
  • Track clasifica el ticket — ver tabla ## Tracks má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.

TrackDescripción¿Cuenta al % MVP?
mvpFuncionalidad core para lanzamiento (rutas, dominio, UI de producto, autenticación, contenido del MVP).✅ sí
infraPlataforma, CI, pipelines, harness, observabilidad, hooks. Habilita ritmo seguro.✅ sí
post-mvpDiferido a Beta o post-launch. No bloquea el lanzamiento del Hito Septiembre.❌ no
polishMejoras de pulido (DX, refactor incremental, microcopy) sin cambio de contrato.❌ no
content-migrationMigració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.