Skip to content

test(api): aislamiento entre usuarios de extremo a extremo (RNF-01) - #19

Merged
ErgoCodes merged 1 commit into
mainfrom
test/user-isolation-rnf-01
Sep 28, 2026
Merged

ErgoCodes merged 1 commit into
mainfrom
test/user-isolation-rnf-01

Conversation

@ErgoCodes

Copy link
Copy Markdown
Owner

Resumen

Test de extremo a extremo (RNF-01) que registra dos usuarios reales (A y B), crea datos completos para A (documento, chunks con embeddings, conversación) y demuestra que B no puede:

  • Listar los documentos de A
  • Ver el detalle de un documento de A
  • Borrar un documento de A (que sobrevive intacto)
  • Recuperar un chunk de A por id
  • Crear o leer una conversación sobre un documento de A
  • Recibir fragmentos de A en una búsqueda vectorial semánticamente coincidente, ni en caché
  • Ver los chunks de A aunque haya 200 señuelos con score superior a los suyos (control de numCandidates)

Cómo se construyó

Plan revisado adversarialmente por Gemini 3.1 Pro (vía agy, modo solo lectura) en varias rondas hasta quedar aprobado sin gaps — la ronda final incluyó corregir un falso positivo del propio diseño (una diferencia de generation en la clave de caché enmascaraba una fuga real por userId).

Implementación delegada a Gemini 3.7 Flash (medium) vía agy, orquestado por Claude Code. Verificación propia además de la del agente: lint y typecheck en verde, suite completa de integración (35 archivos, 314 tests) en verde, y 6 mutation checks manuales — cada uno reintroduciendo un bug real (quitar el filtro userId de una consulta, mover el filtro fuera del $vectorSearch, etc.), confirmando que el test falla como se espera, y revirtiendo.

Test plan

  • pnpm --filter @docqa/api lint
  • pnpm --filter @docqa/api typecheck
  • pnpm --filter @docqa/api test:integration (314/314 tests, contra MongoDB real)
  • 6/6 mutation checks confirmados en rojo antes de revertir

🤖 Generated with Claude Code

https://claude.ai/code/session_01BoVKssKAe1Z1vGJAEBEzvy

Prueba que el usuario B no puede listar, ver, borrar ni recuperar
documentos/chunks/conversaciones de A, ni recibir sus fragmentos en
una busqueda vectorial semanticamente coincidente ni en cache. Diseño
y plan revisados adversarialmente por Gemini 3.1 Pro via agy antes de
implementar; implementacion delegada a agy (Gemini 3.7 Flash medium),
verificada con 6 mutation checks manuales (cada uno confirmado en rojo
antes de revertir) y con la suite completa de integracion en verde.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BoVKssKAe1Z1vGJAEBEzvy
@ErgoCodes
ErgoCodes marked this pull request as ready for review September 28, 2026 00:57
@ErgoCodes
ErgoCodes merged commit c1083ed into main Sep 28, 2026
2 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