Este documento resume el orden previsto de trabajo del MVP actual del proyecto.
chore/v2-final-cleanup-and-release-notes— Release notes y checklist final V2
Objetivo actual:
- crear release notes de cierre V2
- crear checklist de demo para presentar el proyecto
- dejar README/roadmap/evidencias con estado final claro
- declarar V2 como demo principal y legacy como read-only
- proponer próximos pasos después del cierre V2
- no retirar legacy todavía
Estado real actual:
- todas las integraciones pesadas del MVP legacy están resueltas arquitectónicamente
- bloque de hardening legacy cerrado sobre
devcon PRs #22 a #30 - bloque documental V2 cerrado sobre
devcon PRs #31 a #33 - sanitización de seguridad adicional con PR #34
- reconciliación
main ↔ dev+ promoción amaincompletadas con PRs #35 y #36 - Fases 2, 3, 4 del plan V2 cerradas con PRs #37–#39
- pulido documental post-Fase 4 con PR #40
- Fase 5 cerrada con PR #41: backend Express + TypeScript en
apps/api/ - Fase 6 cerrada con PR #42: PostgreSQL + Prisma + bcrypt + frontend rewire al backend
- PublicProfile V2 cerrado con PR #51: slug gestionable, publicación/despublicación y ruta
/p/:slug - Auditoría de paridad cerrada con PR #52: V2 casi lista, gap principal identificado en landing
- Landing V2 cerrada con PR #53: entrada pública principal en
/y CTAs hacia AuthScreen - Auditoría final V2 cerrada con PR #54: V2 lista como demo principal con observaciones menores
- Legacy read-only cerrado con PR #55: legacy documentado como referencia histórica/read-only sin borrarlo
Ramas cerradas en este bloque:
fix/stabilize-authenticated-app-listeners(#22): listeners separados y re-login sin duplicar bindingschore/remove-claude-local-settings(#23/#24): ignorar settings locales del asistentefix/jobs-proxy-contract-and-security(#25): endurecer el contrato y la seguridad del proxy de empleosecurity/remove-exposed-jooble-key-and-local-docs(#26): retirada de docs locales con API key expuestafix/storage-fallback-and-quota-handling(#27):SafeStorageServicecon fallbacklocalStorage → sessionStorage → memoriay límites de avatarsecurity/remove-reintroduced-local-docs(#28): limpieza secundaria de docs reintroducidosrefactor/extract-project-rendering-utils(#29): extracción dejs/utils/projects.jsy consumo desde los tres rendererschore/add-gitattributes-line-endings(#30):.gitattributesconservador coneol=lfpara archivos de textodocs/add-v2-react-backend-docker-plan(#31): plan técnico explícito de la migración a V2 + README alineadofix/remove-merge-conflict-from-job-offers-service(#32): eliminar conflicto de merge pendiente en el servicio de ofertasdocs/add-v2-stitch-mockups-anexo(#33): anexo de bocetos Stitch, mockups versionados y prompt de arranquesecurity/sanitize-reintroduced-jooble-key(#34): sanitización de la API key de Jooble reintroducida por error endocs/memoria/chore/reconcile-main-before-v2(#35): roadmap actualizado y auditoría pre-baseline V2release: promote MVP baseline pre-V2(#36): promocióndev → maincon tagmvp-baseline-pre-v2feat/v2-react-ts-scaffold(#37): scaffold Vite + React + TypeScript enapps/web/(Fase 2)feat/v2-domain-models-and-storage(#38): modelos dominio y storage TypeScript enapps/web/src/lib/(Fase 3)feat/v2-react-auth-and-editor-shell(#39): auth local, editor de perfil y preview React (Fase 4)chore/v2-fase-4-docs-and-polish(#40): pulido documental post-Fase 4, metadata HTML, limitaciones V2feat/v2-backend-api-foundation(#41): backend Express + TypeScript con endpoints mínimos, CORS, health, auth, users, cvs, jobs (Fase 5)feat/v2-database-persistence(#42): PostgreSQL + Prisma + bcrypt + sesiones en DB + frontend rewire (Fase 6)chore/v2-fase-6-docs-and-safety-audit(#43): documentación post-Fases 5 y 6
feat/v2-database-persistence(#42) — Fase 6 del plan V2
Objetivo cubierto:
- PostgreSQL 16 en Docker Compose (puerto 5435 en host); schema Prisma con
User,CV,PublicProfile,Session - bcryptjs para hashing de contraseñas en registro y verificación en login
- sesiones persistidas en DB con token Bearer; aislamiento garantizado por
ownerIden todas las queries de CV healthendpoint pings DB y devuelve recuento de usuariospublic-profiles/:slugresuelve con Prisma: devuelve CV siisPublic = true, 404 si no- frontend rewire:
App.tsxarranca con bootstrap async (token →/users/me+/cvs/me),AuthScreenllama backend,AuthenticatedShellrecibePublicUser - eliminados
lib/auth/ylib/storage/del frontend (dead code tras rewire) - smoke test multi-usuario verificado: Alice y Bob nunca ven datos del otro
- verificado:
typecheckOK,lintOK,buildOK (ambos,apps/apiyapps/web)
feat/jooble-search-proxy-mvp
Objetivo cubierto:
- añadir un buscador de ofertas en la app autenticada.
- conectar el frontend a un backend proxy local (Express Server).
- consumir la API pública real de Jooble, manteniendo las API Keys completamente ocultas del navegador web.
- aplicar el patrón "Graceful Degradation": en caso de fallo, WAF o límite alcanzado en la API real, el frontend atrapa el error devuelto por la Request silenciosamente e inyecta respuestas "Mock" o clonadas añadiendo un aviso de color naranja debajo de la solicitud para que el sistema del portfolio nunca ceda la experiencia web principal de cara al usuario final.
- nueva capa
js/application/ js/application/AppRuntime.jscomo runtime globaljs/application/AuthenticatedCVApp.jspara la app autenticada- templates UI extraídos desde
index.html index.htmlmás cercano a shell base que a archivo monolítico- separación más clara entre auth, sesión, estado del CV, integración GitHub y sincronización de UI
- renderer específico para impresión PDF
- soporte de avatar híbrido
public.htmlcomo vista local adicional preparada para futura publicación compartible
- cerrar
chore/v2-final-cleanup-and-release-notescon PR adev - recomendado:
chore/v2-demo-manual-browser-pass - opcional técnico:
test/e2e-v2-demo-flow - opcional despliegue:
deploy/v2-staging - considerar
chore/remove-legacy-after-v2-paritysolo con decisión explícita posterior
| Sprint | Rama | Contenido |
|---|---|---|
| UI 1 | feat/v2-tailwind-design-system ✅ PR #46 |
Tailwind + tokens + AuthScreen |
| UI 2 | feat/v2-dashboard-and-editor ✅ PR #47 |
Dashboard + Editor acordeones + preview |
| UI 3 | feat/v2-github-integration ✅ PR #48 |
Sync GitHub: perfil + repos |
| UI 4a | feat/v2-jobs-search ✅ PR #49 |
Job search |
| UI 4b | feat/v2-export-pdf ✅ PR #50 |
Exportar PDF por impresión nativa + QR |
| UI 5 | feat/v2-public-profile ✅ PR #51 |
Perfil público /p/:slug |
| Audit | chore/v2-legacy-parity-audit ✅ PR #52 |
Paridad V2 vs legacy |
| UI 6 | feat/v2-landing-page ✅ PR #53 |
Landing pública |
| Audit final | chore/v2-final-demo-audit ✅ PR #54 |
Preparación final de demo V2 |
| Archive | chore/archive-legacy-readonly ✅ PR #55 |
Legacy read-only documental |
| Release docs | chore/v2-final-cleanup-and-release-notes ← activo |
Release notes + checklist demo |
Objetivo siguiente:
chore/v2-demo-manual-browser-passotest/e2e-v2-demo-flow- usar
docs/releases/v2-demo-checklist.mdpara validar presentación - mantener legacy como read-only sin borrarlo ni moverlo
- mantener custom themes, analytics, SEO avanzado, OpenGraph avanzado y dominio personalizado fuera del siguiente corte salvo decisión explícita
- API key validada con respuesta real
HTTP 200desde el proxy local - configuración esperada de entorno en
server/.env(JOOBLE_API_KEY=...) - comportamiento de respaldo confirmado: si falta credencial, el backend responde
503y el frontend degrada a mock
feat/export-pdf-qr- nueva vista específica de impresión para exportación PDF
- sincronización del renderer de impresión con el borrador actual del editor
- soporte de avatar híbrido con subida local optimizada y fallback GitHub
public.htmlcomo vista local adicional preparada para compartirse más adelante- preparación del terreno para una futura publicación pública real con GitHub Pages y QR
feat/github-pages-public-previewpublic.htmlya desacoplada dellocalStoragedel editor- snapshot público estático en
data/public-cv.json - runtime público modular con
js/public.jsyjs/application/PublicPageRuntime.js - hero pública conectada a datos reales del CV demo
- avatar visible, tecnologías con iconos y proyectos destacados en una página más cercana a una demo pública real
-
feat/export-pdf-qr- nueva vista específica de impresión para exportación PDF
- sincronización del renderer de impresión con el borrador actual del editor
- soporte de avatar híbrido con subida local optimizada y fallback GitHub
- preparación del terreno para una futura publicación pública real con GitHub Pages y QR
-
feat/github-project-sources- persistencia de metadatos mínimos del origen de proyectos importados desde GitHub
- señal visual compacta del origen del proyecto en la preview
- compatibilidad con proyectos manuales y con estado persistido existente
- limpieza del proyecto demo legado para que el empty-state de proyectos sea coherente
-
feat/login-screen- auth local básica para MVP con email + contraseña
- sesión persistida y restaurada desde
localStorage - logout funcional y acceso social todavía no implementado
- consolidación de
app.jscomo composition root mínimo
-
feat/projects-visualization- preview de proyectos conectada a
cvState.projects - cards con nombre, descripción, stack y enlaces visibles
- priorización de proyectos
featuredy empty-state específico - separación limpia entre datos, selección GitHub y render visual
- preview de proyectos conectada a
-
feat/github-integration- consulta pública de perfil y repositorios desde GitHub API
- render de perfil GitHub con badge de estado, feedback y fallback manual
- selección manual de repositorios destacados conectada al estado del CV
- persistencia de
githubUsernamey proyectos GitHub para rehidratación coherente en el MVP
- ✅ Fase 0: reconciliar
main ↔ dev(PRs #35 y #36) - ✅ Fase 2: scaffold React + TypeScript en
apps/web/(PR #37) - ✅ Fase 3: dominio y storage TypeScript (PR #38)
- ✅ Fase 4: auth, editor de perfil y preview React (PR #39)
- ✅ Docs post-Fase 4 (PR #40)
- ✅ Fase 5: backend API foundation (PR #41)
- ✅ Fase 6: PostgreSQL + Prisma + frontend rewire (PR #42)
- ✅ Docs post-Fase 6 (PR #43)
- ✅ Fase 7: Docker Compose local (PR #44)
- cerrar Fase 8:
feat/v2-deployment-readiness← rama activa
Quedan documentadas para no confundirlas con bugs ni con trabajo no hecho:
- Sesiones sin expiración automática: el modelo
Sessionen DB no tiene TTL. Cleanup manual o cron job previsto para Fase 8 (deployment readiness). - Sin rate limit en endpoints sensibles:
/auth/registery/auth/loginson atacables sin límite de intentos. Rate limit en Fase 8. - Sin logs estructurados:
console.log/errorpor ahora. Logger con niveles y formato JSON en Fase 8. - Token Bearer en
localStorage: el token de sesión del frontend vive enlocalStorage. Migración ahttpOnly cookieen Fase 8. - Tipos duplicados frontend/backend:
PortfolioCV,Project, etc. están enapps/web/src/lib/domain/types.tsy enapps/api/src/types.ts. Se moverán a un paquete compartido cuando el coste de duplicación crezca. PublicProfilesin endpoint de gestión: el modelo existe en DB pero no hay UI ni endpoint para que el usuario cree o active su slug. Pendiente de Fase 7+.- Preview sincronizada al guardar: la preview del CV se actualiza al guardar, no en tiempo real al escribir. Live-typing requiere estado más sofisticado.
- Jooble legacy temporal: el buscador de empleo V2 proxea a Jooble desde
apps/api/src/services/joobleProxy.ts. La API key debe rotarse antes de producción. Normalización definitiva en Fase 8. - GitHub OAuth y exportación PDF no portados a V2: disponibles en el legacy; pendientes de portado en Fases siguientes.
- Sin Docker Compose completo: la DB está dockerizada (
apps/api/docker-compose.yml); el frontend y el backend todavía no. Fase 7 resuelve esto.
Verificación de los patrones peligrosos del bloque de hardening antes de promocionar a main:
- ✅
localhost:3001hardcodeado en frontend: no encontrado - ✅
_fallbackWarningmutado sobre arrays: no encontrado - ✅
app.use(cors())abierto sin allowlist: no encontrado (configuración explícita enserver/server.js:21) - ✅ secretos o API keys en archivos trackeados: no encontrados (sanitizado en PR #34)
- ✅ archivos
.envreales trackeados: no encontrados - ✅ documentación local con datos sensibles reintroducida: no encontrada
Resultado: baseline apta para promoción a main.
- backend serio
- base de datos
- publicación real multiusuario
- integraciones más ricas
- la auth actual del MVP no es auth real ni segura para producción
- no hay backend serio ni PostgreSQL en esta fase
- Google y GitHub no implementan OAuth real todavía
feat/github-pages-public-previewno debe abrir todavía persistencia real compartida ni publicación multiusuario- la feature de buscador de empleo no debe convertirse todavía en backend completo
- si la API de empleo elegida requiere secreto, solo se permitirá un proxy mínimo o función serverless, no una arquitectura backend completa
- no hay base de datos ni persistencia compartible real fuera de
localStorageen esta fase - las integraciones externas más ricas quedan para la siguiente etapa del proyecto
Se trabaja una sola feature cada vez.
Cada feature debe cerrarse con validación mínima, documentación actualizada y una recomendación clara del siguiente paso.