Skip to content

fix: Sprint 1 — los 3 showstopper de la auditoría (rutas Next, event loop, N-C1)#60

Merged
gonzaloMorenoc merged 3 commits into
mainfrom
fix/mnemo-sprint1-showstoppers
Jul 2, 2026
Merged

fix: Sprint 1 — los 3 showstopper de la auditoría (rutas Next, event loop, N-C1)#60
gonzaloMorenoc merged 3 commits into
mainfrom
fix/mnemo-sprint1-showstoppers

Conversation

@gonzaloMorenoc

Copy link
Copy Markdown
Owner

Contexto

Auditoría profunda (5 lentes) del 2026-07-02 → docs/auditoria/2026-07-02-siguiente-nivel/00-informe.md. Este PR arregla los 3 showstopper que bloquean cualquier piloto/demo con datos reales. Basado en main (no arrastra el trabajo de UX-B).

Cambios

🔴 S1 — El pilar QA-Continuity estaba MUERTO en runtime (404), y el CI verde lo escondía

endpoints.ts invocaba 18 rutas /api/v2/* sin su route.ts proxy en Next → 404 en runtime en Conocimiento, Onboarding, Knowledge Graph, Plan de pruebas, media integración Jira, root-cause, briefing y descarga del PDF del certificado. El backend los implementa todos; faltaba la capa proxy y ningún test la ejercía.

  • 18 route.ts nuevos (patrón proxyToBackend).
  • proxyBinaryToBackend para el PDF (binario, no JSON).
  • Test de paridad automático endpoints.ts ↔ route.ts que falla si vuelve a faltar alguno.

🔴 S3 — El webhook de CI congelaba el único event loop

Era async def pero ejecutaba trabajo bloqueante (embeddings torch + I/O) directamente → un run grande de un cliente bloqueaba a todos los tenants. Pipeline extraído a _process_ci_artifact + run_in_threadpool; Dockerfile con --workers ${WEB_CONCURRENCY:-1} (default 1 por el OOM del embedder, escalable por env).

🔴 S2 (N-C1) — Confused-deputy cross-tenant en la GitHub App

El bind aceptaba installation_id arbitrario sin verificar propiedad → un admin podía apuntar a la instalación de otro cliente y leer/escribir su repo privado. Se añade verificación (la cuenta de la instalación debe coincidir con el owner del repo) + índice único en BD (migración 021) para que un installation_id no lo reclame otra org.

  • Residual honesto: el race del first-mover sobre un tenant aún-no-configurado requiere el flujo de setup-redirect con state firmado — queda como seguimiento (no cerrado del todo).

🧹 Limpieza

Eliminados los archivos/directorios duplicados ... 2 (basura de iCloud sync).

Test plan

  • next build registra las 18 rutas nuevas sin conflicto de params.
  • Frontend: lint:ci limpio, tsc --noEmit EXIT=0, 186 tests (incl. paridad).
  • Backend: tests del webhook (21) y de GitHub/authz (58) en verde, con casos nuevos (mismatch→403, no verificable→403, no configurada→503/self-host, ya vinculada→409).
  • Aplicar la migración 021 a prod (no hay runner versionado): psql "$DATABASE_URL" -f db/migrations/021_github_installation_unique.sql.

https://claude.ai/code/session_01X1fZebDm9ABFwLU2v3mq46

… millones

Informe consolidado: 3 showstopper (pilar QA-Continuity muerto en runtime,
confused-deputy GitHub cross-tenant, webhook que congela el event loop), el
diferenciador (cert firmado) roto de 3 formas, y el análisis de negocio
(facturar por acta como cambio de modelo).

Claude-Session: https://claude.ai/code/session_01X1fZebDm9ABFwLU2v3mq46
…n runtime)

endpoints.ts invocaba /api/v2/* sin su route.ts proxy, dejando muerto en
runtime todo el pilar QA-Continuity (Conocimiento, Onboarding, Knowledge Graph,
Plan de pruebas), media integración Jira, root-cause, briefing y descarga del
PDF del certificado — pese al CI verde (ningún test ejercía el proxy).

- 18 route.ts nuevos siguiendo el patrón proxyToBackend
- proxyBinaryToBackend para el PDF (respuesta binaria, no JSON)
- test de paridad automático endpoints.ts <-> route.ts que falla si falta alguno

Claude-Session: https://claude.ai/code/session_01X1fZebDm9ABFwLU2v3mq46
…ión GitHub

S3 — El webhook de CI era async def pero ejecutaba trabajo bloqueante (embeddings
torch + I/O) directamente, congelando el único event loop y bloqueando a todos
los tenants. Se extrae el pipeline a _process_ci_artifact y se ejecuta con
run_in_threadpool; Dockerfile arranca con --workers ${WEB_CONCURRENCY:-1}.

S2 (N-C1) — El bind de GitHub aceptaba installation_id arbitrario sin verificar
propiedad: un admin podía apuntar a la instalación de otro cliente y leer/escribir
su repo. Se añade verificación (la cuenta de la instalación debe == owner del repo)
e índice único en BD (migración 021) para que un installation_id no lo reclame
otra org. Residual (race del first-mover sobre tenant no configurado) → pendiente
el setup-redirect con state firmado.

Claude-Session: https://claude.ai/code/session_01X1fZebDm9ABFwLU2v3mq46
@vercel

vercel Bot commented Jul 2, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
mnemo Ready Ready Preview, Comment Jul 2, 2026 3:46pm

@gonzaloMorenoc gonzaloMorenoc merged commit 20a57b4 into main Jul 2, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant