Tablero de desarrollo — TheFittClub MVP
Última sincronización: 2026-06-25 (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-06-20). North star unchanged: a bilingual app functional without payments — landing → lead-magnet funnel (email capture) → signup → onboarding → dashboard + player, with legal/compliance and analytics. No Stripe. Foundations are DONE — auth (
T97), dashboard (T99), player (T100), landing (T102), leads schema+API (T69/T74), analytics (T55), legal pages (T35), auth hardening (T40), audit log (T51), EU advisor skill (T60), de-medicalise copy (T152), and the whole i18n data layer (T172/T173/T174). What remains for the 07-01 launch is the funnel surfaces, onboarding+safety, the compliance umbrella, and the content-archival deadline.
- 🔴 Deadline-driven (external clock — schedule FIRST, do NOT slip): T300 (archive ALL Zenler data before account access expires ~1mo; renumbered from T215) — enables T65 + Q3 personalization. No code dep; purely a calendar gate.
- Critical path — the funnel (still the heart, mostly unbuilt): T61 (decision + production) → { T77 (PDFs→R2) ∥ T70 (
/auto-test) ∥ T73 (Ritual Core waitlist) } → T71 (/auto-test/resultado) → T72 (/guias) → T78 (lead-magnet analytics). Every upstream blocker (T69, T74, T55) is already closed.- Onboarding + safety gate (compliance pre-launch): T101 (rebrand onboarding) → T197 (consent coherence + skip-to-generic escape) → T200 (postpartum safe-start floor). T239 (BO configurable step groups) supports but is off the launch-critical line. Legal sign-off gates T197/T200 copy.
- Compliance / security lane (must land before launch): T49 (EU umbrella — DPIA + DPAs + VAT + cascade) · T52 (PWA contract + service worker + Lighthouse).
- Rebrand tail (parallel): T103 (account/profile — ACTIVE) → T222 (módulo/cápsula detail). T104 (error pages) reclassified Beta; T221/T261/T262/T263 already in QA/done.
- Content pipeline: T300 (ex-T215) → T65 (Zenler Ritual Core Legacy → MVP — needs re-activation) → T271 (legacy completion not surfaced in library — fix).
- Stabilise the harness (fixes — noise hides real regressions): T187 (nightly full-E2E always red) · T188 (auth E2E register→login) · T267 (profile mutation 500) · T225 (password show/hide toggle dead under iOS autofill).
- Retention foundation: T57 (contract-only
retention-model.md+ lint gate; T205 already active).- Ordering traps: T54 (multi-currency) is payments-adjacent — keep OUT of June unless the waitlist needs it, and never start before T73 · T180 (Modal consolidation) is polish — land after the funnel · T78 needs T70-T73 live first · i18n data-layer Wave 0 (T172/T173/T174) is CLOSED — the
compass:i18nblock below now only drives the Wave 2 lead-magnet chain.
🧭 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) | 66% (549 de 832 pts) · 15 tickets sin estimar (asumidos M) | ticket headers Effort: |
| % MVP realizado (count) | 70% (179 de 255) | _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) | 4.58 h/pt · 0.219 pts/h (n=160) | spec headers Started: + Closed: |
| Velocity calendar | 108.13 pts/week (n=128, last 4 wks) | board’s Done table 4-col rows |
| Launch range (estimado) | 2027-09-21 (early) – 2028-05-04 (late, +50% buffer) · source: real (pts/hour) · 65 semanas (20h working/week) | computed from velocity + remaining points |
Distribución del backlog pending (MVP)
| Eje | Distribución |
|---|---|
| Effort | XS: 6 · S: 15 · M: 34 · L: 20 · XL: 0 · sin estimar: 0 |
| Modelo LLM | sonnet: 33 · opus: 13 · mixed: 29 · sin asignar: 0 |
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-07-01 (6d) | 110 | 0 | 17 | 385/467.5 pts | 82% | 82.5 pts |
| Beta | 2026-07-15 (20d) | 60 | 1 | 34 | 168.5/269 pts | 63% | 100.5 pts |
| Beta Launch | 2026-09-01 (68d) | 3 | 0 | 11 | 14/65 pts | 22% | 51 pts |
| Producción | 2026-12-01 (159d) | 4 | 0 | 12 | 7.5/59 pts | 13% | 51.5 pts |
| Deferred | — | 12 | 0 | 21 | 42.5/92 pts | 46% | 49.5 pts |
| Sin hito | — | 32 | 0 | 1 | 84/87 pts | 97% | 3 pts |
🎯 Hito Junio: 82% completado · 82.5 pts restantes · ETA: 2026-11-04 (early) – 2027-01-09 (late) · 19 semanas · source: real (pts/hour).
Insight
Código MVP: 66% hecho por effort (70% 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: 97 pending.
- Done con fecha en el board: 190 entradas registradas (190 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-06-22 → 2026-06-28)
Presupuesto: 4.4 pts · fuente: real velocity × 20 working h/wk
Foco principal (en activo): Ticket 156 — Eval harness: wire the live agent-runner seam (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-06-22) | T52 | 8/2.4000000000000004 | Instagram · Founder | ✓ |
| Wk2 (2026-06-29) | T65 | 8/2.4000000000000004 | Instagram · Founder | ✓ |
| Wk3 (2026-07-06) | T70 | 8/1.4000000000000004 | Instagram · Founder · Monthly | ✓ |
| Wk4 (2026-07-13) | T71 | 8/2.4000000000000004 | 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-06 | T52 · T65 | T52 (L) · T65 (L) |
| 2026-07 | T78 · T300 · T24 · T28 | T28 (L) |
| 2026-08 | T29 · T63 · T56 · T14 · T30 | — |
Active (en implementación)
Ticket 156 — Eval harness: wire the live agent-runner seam
Branch: claude/ticket-t156-am7po8 (remote-session branch overrides the feat/156-* convention — precedent T124/T163; recorded in the board row) · Track: infra · Hito: Beta · Domain: infra
Wire the real “engine” of the agent regression eval (T125): today the plumbing is tested but the agent never actually runs — the SDK connector is still a placeholder. This change makes it run live.
QA (en verificación)
(vacío — ningún ticket en QA ahora mismo)
Pending (backlog, agrupado por Hito)
Next up: Ticket 52 — PWA contract + service worker strategy + Lighthouse gate ·
mvp.
Junio (deadline: 2026-07-01) — 17 tickets · 82.5 pts
| # | Ticket | Título | Track | Effort | Model | Domain |
|---|---|---|---|---|---|---|
| 5 | 52 | PWA contract + service worker strategy + Lighthouse gate | mvp | L | mixed | other |
| 7 | 65 | Zenler Content Pipeline: Ritual Core Legacy → MVP | content-migration | L | mixed | content-pipeline |
| 18 | 70 | Pagina /auto-test (UI + logica) | mvp | L | mixed | other |
| 19 | 71 | /auto-test/resultado (3 variantes dinamicas) | mvp | L | mixed | other |
| 26 | 78 | Analytics tracking (lead magnets) | mvp | M | sonnet | other |
| 300 | 300 | Archive all Zenler data before account access expires (~1 month) | content-migration, | S | sonnet | content-migration |
| — | 200 | Safe-start gate: no active program before postpartum-readiness floor | mvp | M | opus | onboarding |
| — | 222 | Rebrand: module & capsule detail | mvp | M | mixed | design |
| — | 225 | Fix: password show/hide toggle dead until field interaction under iOS autofill | mvp | S | sonnet | auth |
| — | 239 | BO-configurable onboarding step groups (data-driven wizard, per product) | mvp | L | mixed | onboarding |
| — | 271 | fix: completed prod_ritual_core_legacy sessions don’t appear in “Your library” | mvp | S | sonnet | other |
| — | 274 | Account credential: role/tier badge + member number | mvp | M | sonnet | account |
| — | 275 | Account privacy section: GDPR export + delete logic | mvp | L | opus | account |
| — | 276 | Account physical: wire the stimulus readout to the real derived plan | mvp | M | sonnet | account |
| — | 277 | Wire real billing/entitlements to the profile Subscription UI | mvp | L | mixed | billing |
| — | 298 | Dashboard welcome row: mobile edge/border-radius clipping of kicker + switcher | mvp | XS | sonnet | dashboard |
| — | 319 | Profile ambassador programme (referral code + discount + points ledger + waitlist) | mvp | L | mixed | account |
Beta (deadline: 2026-07-15) — 34 tickets · 97.5 pts
| # | Ticket | Título | Track | Effort | Model | Domain |
|---|---|---|---|---|---|---|
| 29 | 24 | App bilingüe completeness pass | mvp | M | sonnet | other |
| 30 | 28 | D1 disaster recovery: tested backup/restore tooling + secrets rotation | mvp | L | opus | 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 page + maintenance mode surface | mvp | M | sonnet | other |
| 34 | 14 | BO ID normalization (mass migration, pre-prod) | infra | S | sonnet | schema |
| 35 | 30 | Operational emergency runbook | mvp | S | sonnet | other |
| 39 | 93 | A11y retrofit: tighten jsx-a11y warnings to errors | mvp | L | sonnet | other |
| 39 | 105 | PWA native UX patterns (push, ⌘K search, FAB empezar sesión) | mvp | L | mixed | pwa, global UI |
| 40 | 115 | Journal write surface (member-facing entry creation UI) | mvp | M | mixed | dashboard |
| 51 | 143 | Nightly E2E failure escalation policy (auto-page / auto-disable after N consecutive failures) | infra | XS | sonnet | infra |
| 56 | 155 | Eliminate the separate close PR (collapse lifecycle to ≤2 PRs) | infra | M | opus | other (infra / devops — ticket lifecycle harness) |
| 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 |
| — | 104 | Rebrand: error pages (404 / 500 / offline) | mvp | S | mixed | error |
| — | 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 |
| — | 242 | Surface Playwright Chromium install failure in SessionStart hook | infra | XS | sonnet | infra |
| — | 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 |
| — | 281 | Email unsubscribe endpoint (GDPR/CAN-SPAM one-click) | mvp | S | sonnet | email, compliance |
| — | 282 | Leads growth insights (cross-leads analytics) | mvp | M | sonnet | admin, analytics |
| — | 284 | Back-Office email dashboard (thin layer over Resend API) | mvp | M | sonnet | email, back-office |
| — | 288 | English translation quality sweep (detect ES-in-EN + translate) | mvp, | L | mixed | content-migration |
| — | 307 | Library seal: “discharge” farewell flash when the acquisition ceremony is witnessed | mvp | XS | sonnet | player |
| — | 315 | Tier the heavy audit CI job off every PR sync (replicate the ADR-0006 E2E pattern) | infra | M | opus | other |
| — | 318 | Separate the journaling consent from the onboarding consent | mvp | M | opus | compliance |
Beta Launch (deadline: 2026-09-01) — 11 tickets · 51 pts
| # | Ticket | Título | Track | Effort | Model | Domain |
|---|---|---|---|---|---|---|
| 39 | 36 | Public landing + pricing pages + Cápsula Cero entry | mvp | L | mixed | other |
| 40 | 53 | Blog /blog for SEO + GEO with strict wellness/fitness editorial guardrails | mvp | M | mixed | other |
| 41 | 37 | Member account self-service (cancel, password, data export, delete) | mvp | M | sonnet | auth |
| 42 | 38 | Branded error pages: routing + HTTP layer (404, 500, offline) | mvp | S | mixed | other |
| 43 | 31 | Embajadoras: códigos + tracking + descuento amiga + ledger de puntos | mvp | L | mixed | schema |
| 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 |
| — | 32 | Embajadoras: dashboard, share links, redemption UX | post-mvp | ? | ? | dashboard |
| — | 279 | Diario /blog: build the public surface from the closed Main Style design | post-mvp | M | sonnet | design |
| — | 280 | Prensa /prensa · /press: public press surface (net-new) | post-mvp | M | sonnet | design |
Producción (deadline: 2026-12-01) — 12 tickets · 51.5 pts
| # | Ticket | Título | Track | Effort | Model | Domain |
|---|---|---|---|---|---|---|
| 46 | 20 | Stripe checkout + custom page + webhooks | mvp | L | mixed | schema |
| 47 | 21 | Oferta urgencia 72h | mvp | M | sonnet | dashboard |
| 48 | 22 | Gifting / gift_vouchers | mvp | M | sonnet | schema |
| 50 | 33 | WhatsApp Business + AI inbound assist | mvp | L | mixed | other |
| 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 |
Deferred — 21 tickets · 49.5 pts
| # | Ticket | Título | Track | Effort | Model | Domain |
|---|---|---|---|---|---|---|
| — | 03 | Member routes: loading skeletons + i18n cleanup | polish | ? | ? | dashboard |
| — | 10 | Onboarding / dashboard UI handoff (UI-only addendum) | post-mvp | ? | ? | onboarding |
| — | 15 | Admin detach + purge safe flow (product deletion) | post-mvp | ? | ? | admin |
| — | 17 | R2 Media Browser | post-mvp | ? | ? | admin |
| — | 18 | Admin routes: tripartite pattern refactor | polish | ? | ? | 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 |
| — | 164 | In-app notifications: header badge + center (consumes T98 slot) | mvp | M | mixed | global UI |
| — | 165 | Post-T98 unlinked public pages: keep/delete decision | polish | S | sonnet | other |
| — | 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 |
| — | 285 | Resend marketing layer (the never-built half of T153) | mvp | L | sonnet | |
| — | 290 | Content-only seed mode: populate prod (catalog + guides + media) without users / payments / leads | mvp | M | sonnet | infra |
| — | 301 | Auto-derive active-goal.md from board + queue state (retire the hand-maintained handoff) | infra | S | opus | 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 |
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 |
|---|---|---|
| 278 | Profile avatar upload (member photo, R2-backed) — enable the disabled control with updateAvatar/removeAvatar (R2 MEDIA_PUBLIC, no migration) + multipart action intents + AvatarUploadField + RRSS square-crop modal (AvatarCropModal + react-easy-crop + avatar-crop canvas util, WEBP optimize). QA defects fixed live: CSP img-src blob: (R-T278-9) + oval credential ring display:flex (R-T278-10, headless-measured). design-reviewer 7/7 ×2; theater PASSED (founder-confirmed live); R-T278-1..10 binding. Ambassador half spun out → T319. PR #712. | 2026-06-25 |
| 314 | fix: SessionHero switcher listbox a11y — collapsed <li role="option">+<Button> into one focusable option (nested-interactive) + aria-label on <ul role="listbox"> (aria-input-field-name); both axe rule-disables re-enabled as live assertions. Zero visual change (old .btn-text computed box reproduced exactly, verified via compiled-CSS headless measurement → R-T314-5). Test-first (RED e7bc9d2 before fix). Design-reviewer 7/7; theater passed; R-T314-1..5 binding. PR #701. | 2026-06-25 |
| 313 | fix: decorative DashboardMediaImage fallback no longer exposes <div role="img" aria-label=""> (axe role-img-alt) — decorative alt="" graphic hidden from the a11y tree (aria-hidden); named case unchanged. Test-first (RED before fix); re-enables the rule-disabled axe assertion in BentoHeroCard + SessionHero DOM tests. Design-reviewer 7/7; theater 12/12; R-T313-1 binding. PR #699. | 2026-06-25 |
| 312 | DOM test coverage for the 20 T311-flagged interactive components — a tests/component-dom/<Component>.test.tsx for every focus/keyboard/aria component the tfc-dom-interaction-coverage --mode=full gate reported uncovered (ui→layout→dashboard→library→player), driving the uncovered count 20→0. Each test exercises the real interactive contract (managed/initial focus, Tab/Shift+Tab trap, restore-focus, Escape/close, aria state) + a WCAG-tag-scoped vitest-axe pass, modelled on Modal.test.tsx. dom project testTimeout→20s (axe CPU contention). Test-only (no production code). 3 pre-existing a11y violations isolated behind documented per-assertion rule-disables → T313/T314. Theater 14/14; R-T312-1..3 binding. PR #697. | 2026-06-25 |
| 311 | DOM testing infrastructure — second vitest project (dom, jsdom) alongside the untouched node project, with @testing-library/react + user-event + vitest-axe and a shared tests/setup/dom.ts. Proof-of-value tests/component-dom/Modal.test.tsx (7/7) locks the T180 a11y contract in a real DOM — initial-focus, Tab/Shift+Tab trap-wrap, single-focusable no-churn (PR #694 CONCERN #1), restore-focus, Escape, WCAG axe. Wired into preflight + CI (node-scoped coverage + dedicated DOM step). Adoption gate tfc-dom-interaction-coverage (WARN-only: pre-commit §13 diff nudge + audit-design-ci.sh §11 full-repo trend) makes the layer self-adopting; 20-component backlog → T312. dep-bump (5 test-only devDeps, no runtime/bundle impact). Theater iteration 1 PASSED; R-T311-1..4 binding. PR #696. | 2026-06-24 |
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-06-25.