Skip to content

feat(frontend): interfaz de documentos, listado y chat con citas clicables - #20

Merged
ErgoCodes merged 1 commit into
mainfrom
feat/frontend-documents-chat-ui
Sep 28, 2026
Merged

ErgoCodes merged 1 commit into
mainfrom
feat/frontend-documents-chat-ui

Conversation

@ErgoCodes

Copy link
Copy Markdown
Owner

Resumen

Construye la interfaz completa de DocQA sobre un frontend hasta ahora vacío (RF-02, RF-04, RF-05, RF-06, RF-08, RF-09):

  • Login / registro contra la API real.
  • Subida de PDF con validación de tipo real en cliente (sniffing de bytes %PDF-).
  • Listado de documentos propios con estado, páginas y fecha (polling mientras hay documentos processing).
  • Conversaciones sobre un documento o todos los propios, con estado optimista de la pregunta pendiente.
  • Citas clicables: al pulsarlas se ve el texto exacto del fragmento (GET /chunks/:id).
  • Renderizado de markdown seguro para las respuestas del LLM (react-markdown sin rehype-raw, sin dangerouslySetInnerHTML en ningún componente — el contenido del LLM se trata como dato no confiable, RNF-05).
  • Mutex real de un solo vuelo para la rotación de refresh tokens: Web Locks API entre pestañas, con un fallback de coalescing de promesa en memoria (no un passthrough) para navegadores sin esa API — evita que dos pestañas disparen una revocación de familia de tokens en el backend al refrescar a la vez.

Cómo se construyó

Plan revisado adversarialmente por Gemini 3.1 Pro (vía agy, modo solo lectura) durante varias rondas de corrección de raíz, hasta quedar aprobado salvo un último gap preciso: el fallback del mutex de refresh (fallbackSingleTabLock) estaba descrito como un mutex pero implementado como un passthrough sin bloqueo real. Se corrigió esa causa de raíz (mutex real por coalescing de promesa) antes de implementar — no un workaround.

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, typecheck, test y build en verde, y revisión manual de que no exista ningún dangerouslySetInnerHTML ni rehype-raw en el árbol de componentes.

Test plan

  • pnpm --filter frontend lint (0 errores, 5 warnings preexistentes de fast-refresh en archivos con exports mixtos)
  • pnpm --filter frontend typecheck
  • pnpm --filter frontend test (12/12 archivos, 45/45 tests)
  • pnpm --filter frontend build (build de producción de Vite exitoso)
  • Verificación manual: sin dangerouslySetInnerHTML ni rehype-raw en ningún componente

🤖 Generated with Claude Code

https://claude.ai/code/session_01BoVKssKAe1Z1vGJAEBEzvy

…ables (RF-02, RF-04, RF-05, RF-06, RF-08, RF-09)

Construye la interfaz completa sobre el frontend vacio: login/registro,
subida de PDF, listado de documentos con estado, creacion de
conversaciones sobre uno o todos los documentos propios, envio de
preguntas con estado optimista que sobrevive a la navegacion (vive en
la cache de mutaciones de TanStack Query, no en estado local de
componente), citas clicables que muestran el fragmento citado, y
renderizado de markdown seguro (react-markdown sin rehype-raw, sin
dangerouslySetInnerHTML) para el contenido del LLM que RNF-05 trata
como dato no confiable.

Incluye un mutex real de un solo vuelo para la rotacion de refresh
tokens (Web Locks API entre pestanas, coalescing de promesa en memoria
como fallback) para evitar que peticiones concurrentes disparen una
revocacion de familia en el backend.

Diseño y plan revisados adversarialmente por Gemini 3.1 Pro via agy en
varias rondas hasta quedar aprobado salvo un ultimo gap preciso (el
fallback del mutex era un passthrough sin bloqueo real); corregido de
raiz antes de implementar, no como parche. Implementacion delegada a
agy (Gemini 3.7 Flash medium), orquestado y verificado por Claude Code:
lint, typecheck, test (45/45) y build 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 01:00
@ErgoCodes
ErgoCodes merged commit 29c89f9 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