Tablero de desarrollo — TheFittClub MVP
Última sincronización: 2026-08-13 (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í.
🧭 June — execution order (compass, refreshed 2026-07-30). North star RE-TARGETED: the milestone is now deploy the app + migrate the legacy members off Zenler — the original June goal, landing August/September (deadline moved 2026-07-01 → 2026-09-15 after the funnel + compliance work overran). The frame stays “functional, no Stripe”: the funnel is LIVE (
T70/T72/T73closed), foundations are DONE — everything now serves getting the ~135 lifetime members into the app. What remains: the Zenler archive deadline, the legacy content pipeline, the invitation wave, and the first-access polish.
- 🔴 Deadline-driven (external clock — schedule FIRST, do NOT slip): T300 (archive ALL Zenler data before account access lapses ≈2026-08-06; data permanently lost at lapse — re-confirm the exact cancellation date at activation). Enables Q3 personalization. No code dep; purely a calendar gate.
- Critical path — the legacy migration (the heart of the re-targeted hito): T300 → T65 (Zenler content pipeline — F3+F4 remaining; F1+F2 real content DONE, founder-confirmed 2026-07-30, seeds in repo; re-estimate at re-activation) → T386 (NEW 2026-07-30 — go-live: invitation wave + first access) with T381 riding the same wave (Art. 9 outreach; T371 — fixture cleanup, re-hito Junio — lands FIRST: its “26 members” figure is unverified, see traps below). Post-archive: T387 (NEW — Q3 personalization seed, consent-gated; better landing for consenting members, not a wave blocker).
- First-access UX (land before the wave): T382 (verify-email wait state drifted from delivered design) — the auth surfaces are the first thing a migrated member sees.
- Data lane (FIRST after the legacy chain — founder priority 2026-07-30): T71 (residual PDF bonus only, re-estimated L→S — its result page shipped inside
T70) → T78 (lead-magnet event tracking; PostHog EU base fromT55is live, spec re-validated 2026-07-28). The founder restarts content publishing the moment the migration lands and needs numbers from day 1 to iterate — the vault’s own attribution analysis (80_Metricas/Atribucion_IG_Zenler.md, 664 posts vs 581 sales) is correlational-only and names the missing piece: UTM/link tracking into the funnel. T78 + theT320lead origin tags close that gap.- Launch lane (after the data lane; dependency closure 2026-07-30, founder decision): the milestone contains its own blockers — T104 → T38 → T52 (error-page chain: visual → routing → PWA/offline) · T387 (Q3 personalization, post-T300) closes the queue.
- Ordering traps: T214’s backfilled positions span F1–F4 — the FULL-cohort invitation (T386) cannot go out on F1+F2 content alone; either close T65 through F4 first or send wave-per-phase, starting with F1/F2-positioned members (decide at T386 activation) · T381’s “26 members holding Art. 9 data” is unverified: the
undemonstrablequery never filtersis_test_account, production holds 26 E2E fixtures (T365— only 20 flagged), and nobody has been announced to — run the listing command in the T381 spec (or land T371, fixture cleanup, first); do NOT send any email before that check · T277 re-hito’d Beta 2026-07-30 (hard-blocked by T20 — Stripe, Producción; payments-adjacent) — do NOT pull it back before T20 · T381 sequences INSIDE the T386 wave, never as a separate uncoordinated contact · T63 (beta program) recruits NEW users — a different cohort, never mixed into the legacy segment.
🧭 i18n / data-layer — execution order (compass, refreshed 2026-06-20). North star: a single canonical i18n storage pattern (ADR-0010) before building on it, plus correct bilingual delivery across text, media and email. Wave 0 (the data-layer GATE) is CLOSED — the schema is converged and locked.
- ✅ Wave 0 — DONE (data layer sanitized + locked):
T173(dropped zombieLocalizedTextcolumns +physical_focus_translations) →T172(per-locale media + mixable subtitle tracks) +T174(deterministic storage-pattern gate).T96(drop legacyroutines) stays Hito Beta — different tables, never blocked T172/T173.- Wave 2 — bilingual content surfaces (Junio · ON the canonical base): the lead-magnet chain ships bilingual day 1 — this is the same critical path as
compass:junioabove (T61→ {T77∥T70∥T73} →T71→T72→T78). No separate i18n work — bilingual is a build-time invariant of each surface.- Wave 1 — bilingual email (Hito Beta; only needs
users.language, already exists):T171(branded ES/EN transactional emails + per-user locale).- Wave 3 — final copy sweep (Hito Beta, last):
T24(app bilingual completeness — copy strings only), so it also audits the new email + lead-magnet strings.- One-liner: Wave 0 closed · Junio lead-magnet chain ships bilingual (see
compass:junio) ·T171+T24are the remaining Beta i18n waves.
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% (893 de 1266 pts) · 15 tickets sin estimar (asumidos M) | ticket headers Effort: |
| % MVP realizado (count) | 74% (284 de 383) | _docs/01-core/mvp-scope.md |
| % Prod readiness | 7% (2 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 4/6 ✅ | _docs/01-core/security-baseline.md |
| Velocity real (h/pt) | 5.33 h/pt · 0.187 pts/h (n=260) | spec headers Started: + Closed: |
| Velocity calendar | 56.63 pts/week (n=74, last 4 wks) | board’s Done table 4-col rows |
| Launch range (estimado) | 2028-07-11 (early) – 2029-06-25 (late, +50% buffer) · source: real (pts/hour) · 100 semanas (20h working/week) | computed from velocity + remaining points |
Distribución del backlog pending (MVP)
| Eje | Distribución |
|---|---|
| Effort | XS: 8 · S: 18 · M: 48 · L: 23 · XL: 1 · sin estimar: 0 |
| Modelo LLM | sonnet: 42 · opus: 25 · mixed: 30 · 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 |
|---|---|---|---|---|---|---|---|
| Junio | 2026-09-15 (33d) | 160 | 0 | 19 | 560/633 pts | 88% | 73 pts |
| Beta | 2026-07-15 (-29d) | 122 | 1 | 58 | 356.5/572 pts | 62% | 215.5 pts |
| Beta Launch | 2026-09-01 (19d) | 13 | 0 | 13 | 49.5/116.5 pts | 42% | 67 pts |
| Producción | 2026-12-01 (110d) | 5 | 0 | 19 | 10.5/83.5 pts | 13% | 73 pts |
| Deferred | — | 18 | 0 | 22 | 61.5/114.5 pts | 54% | 53 pts |
| Sin hito | — | 32 | 0 | 1 | 84/87 pts | 97% | 3 pts |
🎯 Hito Junio: 88% completado · 73 pts restantes · ETA: 2026-12-28 (early) – 2027-03-06 (late) · 20 semanas · source: real (pts/hour).
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 | ✅ | ✅ | ⬜ | ⬜ | 2/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 (74% por count). Producción listo: 7%. 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): 1 active · 0 QA = 1 abiertos.
- Backlog: 133 pending.
- Done con fecha en el board: 302 entradas registradas (302 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 semanas | Lead magnet pre-MVP elegido + producido (PDF / audio / video). Disponible en R2, signed-URL on form submission. | T61 |
| H2 | 4-6 semanas | Landing pública con email capture sirviendo H1. Forma parte de T36 con LEAD_MAGNET_VARIANT=pre-mvp. | T36 (consumes T61) |
| H3 | 6-10 semanas | Blog público /blog con 4-6 artículos evergreen, uno por pilar. | T53 (promovido a MVP) |
| H4 | 8-14 semanas | Newsletter bi-weekly en producción. ≥4 emisiones publicadas. Workflow estable (≤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-08-10 → 2026-08-16)
Presupuesto: 3.7 pts · fuente: real velocity × 20 working h/wk
Foco principal (en activo): Ticket 453 — Pay the reviewer from the subscription instead of API tokens (Effort M, model opus)
Obligaciones no-dev esta semana (2 pts):
- Instagram — 3 posts/semana (canal primario) · rotating 4 pillars (2 pts) — Independiente del cluster bi-mensual. 1 de los 3 puede ser teaser/derivado del cluster en curso.
- 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-08-10) | T300 | 1/1.7000000000000002 | Instagram · Founder | ✓ |
| Wk2 (2026-08-17) | T65 | 8/1.7000000000000002 | Instagram · Founder | ✓ |
| Wk3 (2026-08-24) | T386 | 3/1.7000000000000002 | Instagram · Founder | ✓ |
| Wk4 (2026-08-31) | T420 | 3/1.7000000000000002 | 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-08 | T300 · T65 · T386 · T420 | T65 (L) |
| 2026-09 | T387 · T379 · T383 · T24 · T29 | — |
| 2026-10 | T63 | — |
Active (en implementación)
Ticket 453 — Pay the reviewer from the subscription instead of API tokens
Branch: claude/monthly-plan-200-dollars-5r3vql (remote-session mandate — override of the · Track: infra · Hito: Beta · Domain: infra
Anthropic documenta la vía:
CLAUDE_CODE_OAUTH_TOKENconclaude-code-actionfactura contra la
QA (en verificación)
(vacío — ningún ticket en QA ahora mismo)
Pending (backlog, agrupado por Hito)
Next up: Ticket 300 — Archive all Zenler data before account access expires (~1 month) ·
content-migration,.
Junio (deadline: 2026-09-15) — 19 tickets · 73 pts
| # | Ticket | Título | Track | Effort | Model | Domain |
|---|---|---|---|---|---|---|
| 1 | 300 | Archive all Zenler data before account access expires (~1 month) | content-migration, | S | sonnet | content-migration |
| 2 | 65 | Zenler Content Pipeline: Ritual Core Legacy → MVP | content-migration | L | mixed | content-pipeline |
| 3 | 386 | Legacy migration go-live: invitation wave + first access | mvp, | M | mixed | |
| 7 | 420 | fix: phase-change modal shows invented track totals and the wrong progress counter (+ presentation pass) | mvp, | M | mixed | dashboard |
| 12 | 387 | Q3 personalization seed: Semana-0 survey → migrated members’ physical profiles | content-migration, | M | mixed | content-migration |
| — | 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 |
| — | 433 | Start a programme over from zero | mvp | M | opus | dashboard |
| — | 434 | Tell her when her effort will not unlock the level test, and why | mvp | L | opus | dashboard |
| — | 457 | The prod content deploy is broken, and the snapshot that protects Back Office edits was never committed | infra | M | opus | infra |
| — | 468 | The result she reads is derived from the number she gets, not from a parallel score | mvp | M | opus | onboarding |
| — | 473 | See and set which engine governs each product, from the Back Office | mvp | M | opus | admin |
| — | 474 | Track thresholds move onto the engine; purge the ghost unlock thresholds | mvp | L | opus | schema |
| — | 475 | Onboarding questions born from the assigned engine, plus the founder’s own extras | mvp | L | opus | onboarding |
| — | 476 | Level-up tests follow the engine: coverage per transition, and no test offered after the last phase | mvp | M | mixed | dashboard |
| — | 477 | The engine seed stops masquerading as the engine: honest degradation, observed | mvp | M | sonnet | onboarding |
| — | 478 | fix: a racing double-submit of a passed evaluation writes duplicate “passed” history rows | mvp | S | sonnet | player |
| — | 479 | The onboarding question library shows and edits visible_in_autotest | mvp | XS | sonnet | admin |
| — | 480 | fix: two phase lookups still match raw sort_order against the phase number | mvp | XS | sonnet | dashboard |
Beta (deadline: 2026-07-15) — 58 tickets · 212.5 pts
| # | Ticket | Título | Track | Effort | Model | Domain |
|---|---|---|---|---|---|---|
| 1 | 379 | Don’t show the journal (or any health feature) to a member who hasn’t consented | mvp | S | opus | compliance |
| 1 | 383 | Tap targets: land the system rule, starting with consent parity | mvp | M | opus | compliance |
| 29 | 24 | App bilingüe completeness pass | mvp | M | sonnet | other |
| 31 | 29 | Pre-launch verification: perf SLA + happy-path E2E theater | mvp | M | sonnet | other |
| 32 | 63 | Beta program design + execution (1-2 months free, polish before paid launch) | mvp | M | sonnet | other |
| 33 | 56 | Status & maintenance surface (EPIC) | mvp | XL | sonnet | other |
| 33 | 56 | 56c — Synthetic checks + alerting + incident email | mvp | M | sonnet | infra |
| 34 | 340 | materials INT→TEXT PK migration (mat_<slug>) | infra | M | sonnet | schema |
| 34 | 341 | R2 media key ↔ entity ID divergence (accept + entity-agnostic GC) | infra | S | sonnet | infra |
| 39 | 105 | PWA native UX patterns (push, ⌘K search, FAB empezar sesión) | mvp | L | mixed | pwa, global UI |
| 39 | 461 | Lint to zero (1/4): no-unused-vars + stale disable directives | infra | S | sonnet | infra |
| 39 | 462 | Lint to zero (2/4): label-has-associated-control (92 form labels) | mvp | M | sonnet | admin |
| 39 | 463 | Lint to zero (3/4): control-has-associated-label (186 — triage first) | mvp | L | mixed | other |
| 39 | 464 | Lint to zero (4/4): the 22 interaction findings + close the ratchet at 0 | mvp | M | opus | player |
| 40 | 115 | Journal write surface (member-facing entry creation UI) | mvp | M | mixed | dashboard |
| 59 | 160 | Remove eslint-plugin-jsx-a11y ESLint-10 peer override (upstream-gated) | infra | XS | sonnet | other |
| 60 | 161 | Back Office admin design-token restyle (retire dark-SaaS chrome) | polish | S | sonnet | other |
| 61 | 162 | Harden the migration-validation CI job (close the latent-baseline gap) | infra | S | sonnet | other |
| — | 51 | 51b — Catalog mutation audit logging | post-mvp | M | sonnet | other |
| — | 54 | Multi-currency + multi-region pricing strategy (LATAM + EU) | mvp | M | sonnet | other |
| — | 168 | Account recovery: email-switch action + new-device sign-in alert | mvp | M | mixed | auth |
| — | 170 | Social login: Google + Apple (activate the dormant OAuth buttons) | mvp | M | mixed | auth |
| — | 196 | Per-product Bitácora + Diario (“Tu seguimiento” in module detail) | mvp | M | mixed | dashboard |
| — | 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 |
| — | 272 | Remove orphaned .tfc-onb-calc-* / .tfc-onb-grid-pattern CSS rules | polish | XS | sonnet | design-system |
| — | 273 | Reconcile the .btn-gradient base atom with the handoff cta.css SSOT | polish | M | sonnet | design |
| — | 277 | Wire real billing/entitlements to the profile Subscription UI | mvp | L | mixed | billing |
| — | 282 | Leads growth insights (cross-leads analytics) | mvp | M | sonnet | admin, analytics |
| — | 288 | English translation quality sweep (detect ES-in-EN + translate) | mvp, | L | mixed | content-migration |
| — | 318 | Separate the journaling consent from the onboarding consent | mvp | M | opus | compliance |
| — | 322 | BO email event analytics (delivered/opened/clicked/bounced) + privacy update | post-mvp | L | mixed | |
| — | 323 | BO drip-sequence controls (enable/disable + cadence) | mvp | M | mixed | email, back-office |
| — | 328 | BO broadcast body: safe Markdown rendering | post-mvp | S | mixed | |
| — | 336 | Dynamic Facebook reviews in Home’s GEO Review schema | post-mvp | L | mixed | infra |
| — | 339 | Prep-exercise detail sheet: video + why-it-was-added + dosing, with start-session CTA | mvp | M | mixed | dashboard |
| — | 346 | PDF reading-time from auto word count (pdf.js extraction) — dep-bump child of T325 | mvp | S | sonnet | admin |
| — | 357 | fix: smoke E2E navigates the branch-alias CF Pages URL, which can serve a stale deployment | infra | S | sonnet | infra |
| — | 359 | BO leads list: filter by tag | post-mvp | S | sonnet | admin |
| — | 362 | dep-bump: React Router 7 → 8 (closes GHSA-qwww-vcr4-c8h2) | infra | L | opus | infra |
| — | 363 | Membership seniority tiers + phase milestones (recognition, not a losable ladder) | post-mvp | L | opus | account |
| — | 367 | fix: the AI review’s incremental diff re-reviews main after a base merge | infra | XS | sonnet | infra |
| — | 369 | fix: the catalog snapshot’s conflict target misses a composite UNIQUE, so db:seed dies on any machine that has one | infra | S | sonnet | infra |
| — | 385 | Ambassador BO oversight: visibility, leak alerts, code revocation | mvp | L | mixed | admin |
| — | 388 | Re-tag legacy session blocks to the resolved product-modality (T358 data follow-up) | infra, | S | sonnet | schema |
| — | 391 | Extract the shared private-loader preamble | infra | M | sonnet | infra |
| — | 392 | Deploy the PR preview from CI with wrangler, not the Cloudflare builder | infra | M | mixed | infra |
| — | 393 | Native chrome in standalone + install invitation on the Dashboard | mvp, | M | mixed | dashboard, design |
| — | 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 |
| — | 417 | The Privacy Policy publishes four retention deadlines that nothing enforces | infra | M | opus | infra |
| — | 419 | Instagram + Facebook Messenger inbound on the shared AI assistant | mvp | M | mixed | other |
| — | 443 | One name per phase, across every surface a member can see | polish | M | opus | content-migration |
| — | 446 | knip’s allowlist has become the place where dead code hides | infra | M | sonnet | infra |
| — | 492 | Surface the descent signal | mvp | S | sonnet | 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 | sonnet | onboarding |
Beta Launch (deadline: 2026-09-01) — 13 tickets · 67 pts
| # | Ticket | Título | Track | Effort | Model | Domain |
|---|---|---|---|---|---|---|
| 44 | 62 | Cross-channel content production workflow (Instagram + YouTube + blog + newsletter) | mvp | L | mixed | other |
| 45 | 25 | Support form backend (tickets + auto-reply) | mvp | M | sonnet | other |
| 50 | 181 | Ritual Core: sales page Hito 3 (máxima conversión) | mvp | L | mixed | other |
| — | 53 | Magazine editorial policy + GEO playbook (the rules the publish gate enforces) | mvp | M | mixed | compliance |
| — | 279 | Magazine: the public surface /es/magazine · /en/magazine from the definitive design | mvp | L | opus | design |
| — | 280 | Prensa /prensa · /press: public press surface (net-new) | post-mvp | M | sonnet | design |
| — | 394 | Pricing SSOT + machine-readable Offer schema on the public sales surface | mvp | M | mixed | billing, infra |
| — | 396 | Knowledge catalog: commercial terms + how progression actually works on /faq | mvp, | M | opus | content-migration, compliance |
| — | 458 | Magazine content schema in D1 (posts + per-locale translations + authors + media) | mvp | L | sonnet | schema |
| — | 459 | Back Office: magazine CMS (/admin/magazine) — block composer, state machine, EN pipeline | mvp | L | sonnet | admin |
| — | 460 | Rename sweep: everything called “blog” becomes “magazine” | mvp | S | sonnet | other |
| — | 465 | Magazine audio: TTS at publish, real recordings, and the listen surface | post-mvp | L | mixed | other |
| — | 470 | The maternity coupon in the postpartum notice, and the settings the sends deserve | mvp | M | sonnet |
Producción (deadline: 2026-12-01) — 19 tickets · 73 pts
| # | Ticket | Título | Track | Effort | Model | Domain |
|---|---|---|---|---|---|---|
| 46 | 20 | Stripe checkout + custom page + webhooks | mvp | L | mixed | schema |
| 48 | 22 | Gifting / gift_vouchers | mvp | M | sonnet | schema |
| 51 | 34 | BO admin: Stripe customer + purchases panel | post-mvp | ? | ? | admin |
| 52 | 39 | Funnel analytics + event tracking | mvp | M | sonnet | other |
| 54 | 19 | Multi-ritual weekly distribution algorithm | post-mvp | ? | ? | dashboard |
| 55 | 64 | Friction stacks: comprimir loop de producción IG de 15 a 5 pasos | infra | M | mixed | other |
| 57 | 213 | Meta CAPI: deduplicated Purchase from app checkout (pixel + server) | mvp | L | mixed | analytics |
| — | 167 | Apply edge WAF rate-limit rule on domain migration | mvp | XS | mixed | infra |
| — | 192 | Custom domain cutover | infra | S | sonnet | infra |
| — | 209 | Retention: Back Office dashboard (T57 slice F) | mvp | L | mixed | admin |
| — | 395 | Agent-readable catalog endpoint + agentic-commerce readiness | post-mvp, | L | mixed | infra, billing |
| — | 397 | Full specs-vs-code audit (Fable session) | infra | L | opus | other |
| — | 398 | File-size gate (diff-only pre-commit + full-repo trend) | infra | S | sonnet | infra |
| — | 399 | Decompose dashboard.server.ts (behavior-preserving) | infra | L | opus | dashboard |
| — | 400 | Knip allowlist mass-expiry cleanup (395 entries) | infra | M | sonnet | infra |
| — | 401 | Focus indicator for .af-link anchors | polish | XS | sonnet | design |
| — | 402 | fix: autonomy-health reports “salud OK” when jq is missing | infra | XS | sonnet | infra |
| — | 421 | fix: audit-skills.sh trusts file order for “last used”, so a merge can fake a STALE verdict | infra | XS | sonnet | infra |
| — | 444 | The withdrawal-waiver checkbox, and the refund window each product actually gets | mvp | M | opus | compliance |
Deferred — 22 tickets · 53 pts
| # | Ticket | Título | Track | Effort | Model | Domain |
|---|---|---|---|---|---|---|
| — | 03 | Member routes: loading skeletons + i18n cleanup | polish | ? | ? | dashboard |
| — | 15 | Admin detach + purge safe flow (product deletion) | post-mvp | ? | ? | admin |
| — | 18 | Admin routes: tripartite convention + scaffold (strangler, not big-bang) | infra | XS | ? | admin |
| — | 111 | Skill tfc-ai-pulse: structured quarterly AI tooling review (parked) | infra | S | opus | other (meta — Claude Code skill / dev tooling) |
| — | 112 | Migración a GitHub Organization con plan Team para branch protection enforcement (parked) | infra | M | 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 | M | opus | infra |
| — | 156 | Eval harness: wire the live agent-runner seam | infra | M | opus | infra |
| — | 164 | In-app notifications: header badge + center (consumes T98 slot) | mvp | M | mixed | global UI |
| — | 189 | Adversarial E2E subagent (tfc-adversarial-e2e) | infra | S | opus | infra |
| — | 255 | Unify the admin-BO design carve-out into a single shared source | infra | S | sonnet | infra |
| — | 259 | Fix horizontal overflow on /admin/assets (mobile) | polish | S | sonnet | infra |
| — | 308 | infra | S | sonnet | infra | |
| — | 309 | infra | S | sonnet | infra | |
| — | 310 | Modal .tm-* token-tier visual adoption (surface ticket) | polish | M | mixed | other |
| — | 316 | polish: SessionHero modality switcher — distinct keyboard focus ring on options | polish | XS | sonnet | dashboard |
| — | 326 | Upgrade to Workers Paid: restore cron capacity (post-beta, revenue-gated) | post-mvp | S | sonnet | infra |
| — | 372 | dep-bump: jsdom 29 → 30 (fix SessionHero DOM-test breakage first) | infra | S | sonnet | infra |
| — | 375 | Audit-log atomicity: batch every BO audit event with the mutation it describes | infra | L | sonnet | admin |
| — | 442 | Scope the precache: 686 kB on the first visit | polish | S | sonnet | 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 | sonnet | infra |
Sin hito — 1 tickets · 3 pts
| # | Ticket | Título | Track | Effort | Model | Domain |
|---|---|---|---|---|---|---|
| — | 306 | --- | untagged | ? | opus | - |
Deferred (migrates to Beta when ADR-0005 lands) — 1 tickets · 8 pts
| # | Ticket | Título | Track | Effort | Model | Domain |
|---|---|---|---|---|---|---|
| — | 130 | Brand / product vocabulary SSOT (with mandatory ADR-0005 investigation) | infra | L | opus | content-migration |
Done reciente
| Ticket | Título | Cerrado |
|---|---|---|
| 472 | Engine grid legibility + the onboarding wizard stops hiding answered questions. It.1: wks · min/wk sub-headers per phase column, the Group saturation law stated where it is read, and a real engines-edit guide whose 7 anchors resolve (the route had been loading the PHASE editor’s guide — help that lied). Zero behaviour change. It.2 (founder-widened mid-flight): the wizard read only unanswered questions and dropped emptied steps — her age was unreachable; new getProductQuestionsWithAnswers, prefilled view, widened action whitelist, entry gate byte-identical. Rubric failed it.2 on a real defect (orphan ✦ heading on settled composites, visible in her own screenshot) → fixed test-first → re-review pass. Two RED→GREEN pairs by tfc-regression-test-writer; theater 33/33 (27 agent + F1–F6 founder browser, «se ve ahora bien»); AI review 4 rounds, Step 8 satisfied on pair r3→r4 (determination in ## Pre-QA gate notes); Effort re-sized S→M at close (the widening). R-T472-1..13 binding. Spawned T493 + T494 from its QA findings; the 472→492 renumbering of the descent spec rode the close. PR #1181. | 2026-08-12 |
| 432 | Member-facing phase descent + free movement within earned phases. The 30-day lock deleted (it gated descending AGAIN, not ascending, and the T333 gate already made oscillation unprofitable); highest_phase_earned high-water mark on evaluation_status (never decreases, R-T432-3); phase_resume_state restores the loop pointer on return (Q2: week counters stay with the calendar week); “Tu fase” panel in the profile, earned phases only; every member move writes a member.phase.move audit row (Q3 → T492). Design rubric fail→fail→pass it.3; found+fixed en route: seeds writing the dropped column, a 1-in-16 sha-collision flake in the AI-review cost test, and the F1 comment sweep (0054-0056 broke fresh-clone local migrate). B1-B6 browser pass deferred at close (founder decision, T366 precedent). PR #1175. | 2026-08-12 |
| 490 | fix: la guía de embarazo no tenía fila en el catálogo, así que el envío prometido no podía dispararse nunca. guia-embarazo no existía ni en la semilla ni en producción, y el fallo era mudo: resolveGuideAssets devuelve null, el barrido salta, y se ve igual que «aún no he subido el PDF». Siembra la fila con el Vol. 00 real en ES y EN, coming_soon + listed:false, con el pdfKey pre-rellenado a la clave que acuña el propio BO. Slug fijado por test contra PREGNANCY_GUIDE_SLUG. Al escribir ese test saltó una aserción vecina que codificaba «unlisted == bonus-*»: ampliada por mecanismo de entrega, no borrada. La fila de producción no la crea la semilla — el runbook va en la spec. Renumerado 471→472→477→490 por TRES colisiones el mismo día. | 2026-08-12 |
| 491 | El encuadre de la guía: veredicto, catálogo aplicado, PDF pendiente. El AI review preguntó si «rutinas para las molestias» cruzaba el RD 1907/1996. Verificado: el encuadre era del PDF de la fundadora, no del agente. Pase con thefittclub-eu-compliance-advisor → CAUTION, no BLOCKER (sin verbo prohibido, sin condición nombrada, sin promesa de prevención, y la ficha 09 dice «cuando el dolor baja por la pierna» en vez de nombrar la ciática). La zona gris era una preposición. La fundadora aportó la mitigación que el marco pide —suelen funcionar pero no siempre, y solo incomodidades no graves— y reescribió el copy; aplicado ES+EN. Registrado que tfc-brand-vocab-lint pasó en verde y eso no era prueba de nada: mira vocabulario, no encuadre. Cierra con el PDF sin actualizar y lo dice: el brief para portada y antetítulo vive en la spec. | 2026-08-12 |
| 471 | fix: persistEngine is atomic on D1 — rule ids assigned up front and the whole engine rewrite (update + deletes + inserts) rides one db.batch([...]), so a mid-save failure leaves the previous definition fully intact instead of a half-written engine served live (T429). createProxyTestDb gains the batch BEGIN/ROLLBACK mirror + onStatement injection seam. Test-first: RED 6f47215 (23 → 3 rules) → GREEN f6a9783. PR #1172 · R-T471-1..3 binding · theater closed-passed · surfaced by the T469 session’s review post-close of T430 | 2026-08-12 |
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:
Junio(lead magnets + legacy) ·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:
sonnet(mecánico, sigue spec),opus(síntesis arquitectural / branding),mixed(cada fase su modelo).
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 Junio. | ❌ 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-08-13.