ragsolver / docs /PROGRESS.md
CamiloS1111's picture
Upload folder using huggingface_hub
1902e11 verified
|
Raw History Blame Contribute Delete
26.5 kB
# Progreso de implementación — RagSolver
> Se actualiza mientras el agente trabaja. Última actualización: 2026-09-24.
## Estado actual
**Núcleo del proyecto (Fases 0-6 de `docs/PLAN_RAG.md`): completo y ejecutado.** Índice de Mathlib completo (278 160 declaraciones) con ANN IVF_SQ; agentes LangGraph + verificador Lean vía REPL; experimento principal `eval_v1` terminado (300/300 pares): `full` 9/60 (15 %), `no_rag` 9/60, `no_critic` 4/60, línea base A 5/60, línea base B se autoevalúa correcta en 55/60 (11 confirmadas por el kernel); ninguna diferencia significativa tras Bonferroni. Detalle en `docs/eval_report.md` y `docs/final_report.md` (§6-§7). `eval-v1-full` (índice completo, ≈ US$0.30) preparado en `scripts/run_chain.sh`, sin correr — requiere tu aprobación.
**Auditoría técnica (2026-09-23) y su corrección, en curso.** `docs/AUDIT_2026-09-23.md` (diagnóstico completo) y `docs/PLAN_CORRECCIONES.md` (plan por fases). Avance:
- **Fase 1 — verificador seguro (SEC-1, VER-1, BUG-2): ✅ completa.** `lean/verify.py` valida las tácticas del LLM antes de tocar Lean (rechaza comandos, metaprogramación, declaraciones nuevas, `sorry`/`native_decide`/`decide +native`) y audita `#print axioms` tras un veredicto limpio (sólo `propext`/`Classical.choice`/`Quot.sound`). Confirmado con Lean real: el exploit de inyección de la auditoría ya no se ejecuta; `decide +native` ya no pasa como "verificado". Re-verificación offline de `eval_v1` (0 llamadas LLM): **27/27 pruebas antes aceptadas siguen aceptadas, 0 regresiones** — los resultados reportados no cambian. DECISIONS #69-74.
- **Fase 2 — licencias y datos (SEC-2): ✅ completa.** `.gitignore` ampliado (PDF de ejemplo, `blobs/`, `data/eval/runs/`, artefactos de Lean); se encontró y corrigió una fuga no detectada por la auditoría (`docs/qa_ingest_edd3436ca148.md` embebía fórmulas/descripciones del PDF — ahora redactado cuando el documento no es redistribuible); `scripts/publish_hf.py` sube las corridas desde una copia saneada y aborta si encuentra texto del corpus informal en lo que va a subir. Comprobación reutilizable: `scripts/check_no_leaked_content.py` (0 coincidencias sobre el repo). DECISIONS #75-77.
- **Fase 3 — dependencias y documentación de estado: ✅ completa.** `httpx`/`tenacity` declarados, `gradio` en el extra `demo`, `ranx` movido a `dev`; `pandas`/`accelerate` quitados de las dependencias core (confirmado sin ellos: `test_retriever_integration.py` carga el embedder Y el reranker reales en verde). Documentación al día: README, `install.md` (+ tabla de variables de entorno), `interfaces.md`, `architecture.md`, `evaluate.py`, `versions.yaml`, `final_report.md` (limitaciones MET-1/DATA-1/BUG-1 añadidas, "release" atenuado a "prepared for release"). DECISIONS #78-79.
- **Fase 4 — citas, trazas y contabilidad (BUG-1, TRZ-1, LLM-1, ACC-1, BUG-5, BUG-6): ✅ completa.** Los `citation_id` ya no se renumeran en cada búsqueda (se reutilizan por `chunk_id`, sin duplicados tras un replan o una re-recuperación); las trazas del retriever de un par (config, problema) van al mismo archivo que las de sus agentes (antes, un archivo aleatorio por búsqueda); el pin de versiones registra qué tabla sirve `mathlib`; el cliente LLM ya no reintenta un timeout de lectura (podría haberse cobrado igual), baja de 20 a 4 intentos y cuenta cuántos hizo; cualquier excepción dentro de un nodo del grafo (no sólo salida JSON inválida) conserva lo acumulado en vez de perderlo; se corrigieron dos bugs de contabilidad menores (self-consistency, caché de embeddings de consulta sin lock). DECISIONS #80-88. 138 tests en verde (incluidos los de Lean real). El smoke con LLM real (D6, ≈ US$0.001) queda pendiente de tu aprobación.
- **Fases 5-10:** sin empezar. Ver `docs/PLAN_CORRECCIONES.md §7` para el orden y qué necesita una decisión tuya (D1-D8: licencia, commit, `blobs/`, alcance de la ingesta, replan, gasto, token de HF, sandbox).
**Mejora del RAG (2026-10-14): implementada (Fases 0-4 y 2b de `docs/PLAN_MEJORA_RAG.md`), medida sin LLM; falta la re-evaluación pagada (Fase 6, decisión R4).**
- El retrieval de Mathlib consulta con el *goal* de Lean. El Autoformalizador escribe un esqueleto `have … := by sorry` y el REPL devuelve un goal por `sorry`.
- Canal principal: prior de competición (778 lemas de Lean Workbook validados contra Lean, núcleo incluido). Recall@16 por goal 0.327, frente a 0.028 del índice denso, que queda apagado.
- Las premisas se consumen con una batería de tácticas (CLOSE, 0 LLM). Sobre el goal raíz de `eval_v1`: 11/60 sin premisas, 12/60 con premisas, y 4 problemas que no resolvió ninguna configuración anterior. FILL (1 llamada) sólo ve los goals abiertos.
- Los goals probados se conservan entre intentos y replans. El replan recibe el feedback del Crítico (DES-1 cerrado).
- Nuevas configuraciones: `rag_nl` (flujo de eval-v1), `baseline_auto` (0 LLM); `no_rag` usa la misma batería sin premisas.
- Smoke con LLM real (8 problemas, US$0.0145 en total): 5/8 con el prompt 2, que reveló que el modelo no escribe `sorry`. Con la partición mecánica de la prueba en goals (`skeletonize`, prompt 3): **8/8**. Medido sobre el término aceptado, ninguna premisa recuperada se usó en esas 8 pruebas: la mejora viene de la partición y de la automatización. OpenRouter: con el tope de precio actual sólo califica DeepInfra, que da 429 intermitentes (#103).
- Tests: 146 rápidos y 11 con Lean real, en verde. `DECISIONS.md` #89-#108.
- **eval-v2 (2026-10-15), parcial — `docs/eval_report_v2.md`.** Ronda 1 de 4: `full` 6/15, `no_rag` 7/15, `baseline_auto` 5/15 (eval-v1 en los mismos 15: 3 y 4). `baseline_auto` en los 60: **11/60 sin LLM**, más que eval-v1 `full` (9/60). El RAG por goal todavía no muestra efecto medible. El guardia de costo detuvo la cadena: la proyección para las rondas 2-4 (~US$0.34) supera el saldo (US$0.289). Decisión del usuario: opción B (rondas 2-3); ronda 2: 2/15 en las tres configuraciones; ronda 3 detenida para rediseñar.
- **Rediseño (2026-10-15), en evaluación — `docs/PLAN_REDISENO_PROVER.md`.** Demostrador especializado local (Goedel-Prover-V2-8B Q6_K en la GPU, 0 API) como etapa 0 y para los goals abiertos. El RAG corrige nombres de lemas renombrados entre versiones de Mathlib. Salidas ilegibles del Crítico y de FILL ya no matan el problema. Smoke real: 2/2 sin API. `DECISIONS.md` #110-#115.
- **eval-v3 (2026-10-15) — `docs/eval_report_v3.md`: el rediseño resuelve 21/30, frente a 8/30 del sistema anterior** en los mismos problemas (McNemar 13 a 0, p = 0.0002). Dificultad 2-3: de 0/14 a 8/14, con 2 problemas de IMO. Todo lo resuelve el demostrador local sin API; los agentes y el RAG no añaden problemas en su forma actual (`full` = `baseline_prover`). Costo de API: US$0.061; saldo de la key: US$0.059. Limitación: posible contaminación de miniF2F. Próximos pasos propuestos en el §5 del reporte.
**Pendiente del usuario:** LICENSE (sugerido Apache-2.0), commit en git (nada commiteado todavía), si versionar `Propuesta_Proyecto_Final_IA_UPTC.pdf`, token de HF, y si correr `eval-v1-full` (≈ US$0.30; saldo de la key ≈ US$0.42).
## Historial
Lo que sigue es el registro de cómo se llegó al estado de arriba, por fase, escrito mientras se ejecutaba cada una. Se conserva como referencia; para el estado real del proyecto usar la sección anterior.
### Restricciones reales de este sandbox (no son del proyecto, son de este entorno de ejecución)
- **RAM ajustada**: 7.3 GB totales. Con un solo proceso de embeddings/evaluación corriendo ya se usa ~75-90% + algo de swap. Por eso el agente evita correr dos cargas pesadas (embeddings, reranking, MinerU) al mismo tiempo.
- **Filesystem `/mnt/c/` (montaje 9p de WSL2) es lento** para imports de paquetes grandes (torch tardó ~150s en importar la primera vez).
- Con estas limitaciones, el trabajo de esta sesión prioriza **corridas acotadas pero reales** (nunca resultados inventados) sobre corridas completas a escala de producción. (Nota posterior: al momento de escribir esto la GPU AMD todavía no se había probado desde esta sesión — ver más abajo "GPU AMD: ✅ utilizable" — la limitación real nunca fue la falta de GPU, sino RAM/CPU del sandbox.)
### Fase 0 — Cimientos: ✅ completa
- Repo, `pyproject.toml` (Python 3.12 vía `uv`), `.gitignore`.
- `configs/versions.yaml` — pin único de versiones (Lean, Mathlib, modelos).
- `src/ragsolver/rag/schema.py` — contratos Pydantic de §7/§8 del plan + JSON Schema exportado a `docs/interfaces/`.
- Escritor de traza JSONL + tests.
- **Lean 4 (`v4.28.0-rc1`) + Mathlib (`v4.28.0-rc1`, caché precompilado 7873 archivos) instalados y verificados**: `lake build` → "Build completed successfully" — el kernel de Lean aceptó `example : 1 + 1 = 2 := rfl`.
- `docs/DECISIONS.md` con 13 decisiones registradas y su evidencia.
- 19/19 tests pasando en ese momento (ver conteo actualizado más abajo si se agregaron más).
### Fase 1 — Índice de Mathlib: código completo, corrida real en curso
Hecho:
- Descarga del corpus real de LeanSearch v2 (310 579 declaraciones) y normalización → **278 560 chunks** válidos (32 019 excluidos por filtro).
- `embed.py`, `index.py`, `retrieve.py` (con CLI), `evaluate.py` escritos, con tests de integración reales contra LanceDB (que de hecho encontraron y corrigieron 2 incompatibilidades de API con la versión instalada).
- **Hallazgo importante documentado en `DECISIONS.md`**: sólo 117/540 nombres "gold" de los benchmarks propios de LeanSearch v2 (MathlibQR+MathlibMPR) existen en el corpus JSONL que ellos mismos publicaron para esa tag. El recall contra esos benchmarks está acotado por esa cobertura, no sólo por la calidad del retriever.
- Por las limitaciones de cómputo del sandbox, se embebió una **muestra acotada real** (no simulada): 116 declaraciones gold + 3000 distractores aleatorios = 13 736 registros, con Qwen3-Embedding-0.6B en CPU (~5.5 textos/seg, ~42 min de corrida real).
- **Índice LanceDB real construido** sobre esa muestra (13 736 filas, vector + FTS).
- `evaluate.py` (Recall@10/nDCG@10/MRR, denso vs BM25 vs híbrido vs híbrido+rerank sobre MathlibQR) corrido sobre esa muestra acotada de 13 736 filas.
**Estos primeros números (recall condicionado 0.947 con fusión híbrida) quedaron invalidados por un bug de ingesta encontrado en la Fase 3** (`name[0]` en vez del nombre completo, `DECISIONS.md` #31): con el corpus renormalizado, la cobertura real y las métricas correctas son las que aparecen en la entrada de Fase 3 más abajo (recall condicionado real ≈ 0.78-0.79, no 0.947), y más tarde las del índice completo (Fase 5/#56/#68: recall@10 híbrido+rerank 0.45). Se deja esta nota en vez del número original para no repetir el error.
Fase 1 se da por **completa**. Pendiente sólo si el usuario pide explícitamente escalar a las 278 560 declaraciones completas (ver "Bloqueado" más abajo — no es un bloqueo real, es una corrida de ~14h que no se lanzó sin avisar).
### Fase 2 — Ingesta de PDFs: ✅ completa (2026-09-19, segunda sesión)
Resultado sobre `problemas resueltos olimpiadas.pdf` (detalle en `docs/qa_ingest_edd3436ca148.md` y `docs/DECISIONS.md` #15-#22):
- **100/100 problem cards emparejadas** (era 92/100). 98 por vía determinista (numerales absorbidos en ecuaciones recuperados por regex; solución 1 por regla "lo que precede al ítem 2"), la 55 por split con LLM, y la **77 recuperada de un hueco que MinerU se había saltado por completo** (pág. 64: cero bloques en media página). Ese hueco se detecta cruzando la capa de texto del PDF palabra por palabra contra los bboxes de MinerU; 7 regiones así se transcribieron con el VLM (Plan B acotado, no página completa).
- **53 figuras** recortadas (con padding para las etiquetas) y descritas con contexto del enunciado. Red de seguridad vectorial: **0 figuras perdidas por MinerU** (los 36 clusters "sin cubrir" son radicales del Equation Editor, tablas bien clasificadas o clusters fusionados). QA gate del plan: 7/7 problemas con figura; **rúbrica manual 15/15** aprobadas (umbral 13/15).
- QA de fórmulas con VLM: 209 propuestas, **76 aplicadas / 133 rechazadas** por guardas calibradas con casos reales (el VLM mete ruido de puntuación, absorbe texto vecino y a veces recorta contenido real o devuelve LaTeX destrozado). Todo cambio queda registrado para revisión.
- 100 resúmenes contextuales (Contextual Retrieval) + `math_area`, `techniques`, `theorems_used`, `difficulty`, `keywords` por card.
- Corpus: `data/corpus/informal.jsonl` (153 chunks: 100 `problem_card` + 53 `figure`), `figures.jsonl`; embebido con Qwen3-Embedding-0.6B (CPU, 215 s) e indexado en LanceDB (`data/index/lancedb/informal`, FTS incluido).
- **Búsqueda real verificada** (`python -m ragsolver.rag.retrieve "..." --corpus informal --mode exemplar`): 3 consultas en inglés → problema correcto en el puesto 1 (8, 86, 77); la geométrica trae además los chunks de figura.
- Proveedor: **Gemini** (tier gratis). Hallazgo importante: la cuota gratis es **20 solicitudes/día por modelo** en `gemini-3.5-flash` → cadena de fallback por modelo (`configs/versions.yaml: fallback_models`); en la práctica todo el enriquecimiento lo hizo `gemini-3.5-flash-lite` (su cuota diaria aguantó ~250 llamadas). Cada figura/card registra el modelo que la produjo. Caché JSONL por llamada: re-ejecutar la ingesta no repite llamadas.
- Código nuevo: `rag/mineru_blocks.py` (lector/render de bloques MinerU + cross-check capa de texto), `rag/figures.py`, `rag/enrich.py` (cliente Gemini REST con caché, reintentos y cadena de modelos), `rag/ingest_informal.py` (pipeline completo, `--skip-llm` para correr sin API), `scripts/qa_ingest_report.py`. 43 tests pasando (nuevos: `test_mineru_blocks.py`, `test_figures.py`, `test_enrich.py`).
Pendiente de Fase 2 (no bloqueante):
- Gold de OCR de 10 páginas transcritas a mano (tarea 10 del plan): requiere trabajo humano; no se fabricó.
- Chunking en `solution_step`: no hace falta para este PDF (card más larga ≈ 2 900 caracteres, muy por debajo de ~1 500 tokens).
### Fase 3 — Servicio de recuperación y citación: ✅ completa (2026-09-20)
- `Retriever.search(RetrievalRequest) -> RetrievalResult` cubre §6.3/§8: plantillas de consulta por `mode` (`configs/retrieval.yaml`), denso + FTS con **prefiltro SQL** (`doc_ids`, `unit_types`, `kinds`, `math_area`), RRF multi-consulta, rerank contra `rerank_against`, dedupe (figura ↔ su card; `max_per_module` opcional), **figuras adjuntas** desde la tabla `figures`, citas con `snippet`, traza JSONL, caché de embeddings de consulta, flags de ablación (`enabled=false` → vacío con traza).
- **Modo `error`**: identificadores Lean del mensaje → búsqueda exacta fijada al top-1 (verificado con reranker adverso y sobre el índice real).
- `evaluate.py` pasa por `Retriever.search` (misma función que los agentes). CLI `ragsolver search` / `ragsolver ingest`.
- Tests: 10 unitarios con LanceDB temporal + embedder/reranker falsos, 2 de integración sobre el índice real. Suite: 62 tests.
- **Bug grave de Fase 1 detectado y corregido** (`DECISIONS.md` #31-32): `ingest_mathlib.py` usaba `name[0]` cuando `name` es la lista de componentes del nombre → 90 % de las declaraciones con nombre/`docs_url`/`chunk_id` incorrectos y repetidos. Con el corpus renormalizado: 503/540 nombres gold existen (antes "117"); **métricas corregidas (946 consultas, cobertura 83.8 %)**: recall@10 denso 0.665 / BM25 0.594 / híbrido 0.656; nDCG@10 0.565 / 0.472 / 0.538. En 40 consultas al azar con rerank: híbrido+rerank 0.775 > denso 0.75 > híbrido 0.675 > BM25 0.525. La conclusión de Fase 1 ("recall condicionado 0.947") estaba inflada por el bug.
### Fase 4 — Grafo de agentes: ✅ completa y ejecutada (2026-09-20)
**Aceptación cumplida**: los 5 teoremas triviales de referencia se resuelven con el pipeline completo (`f4-trivial-full`: 5/5, 3 llamadas LLM cada uno, citas `used_in_proof` en `triv_add_zero` y `triv_add_comm`), ≤ 20 llamadas por problema en todas las corridas (máx. 11), `llm_calls=0` en todos los eventos del retriever.
- `ragsolver/llm.py`: cliente único Gemini / OpenAI-compatible (**OpenRouter preparado por config**, sin key), cadena de modelos por cuota diaria, contadores de tokens. El Enricher de Fase 2 lo usa.
- Agentes (`agents/agents.py`, contratos en `agents/schemas.py`, prompts en `configs/agents.yaml`): Planificador (con ejemplares del corpus informal), Generador (`used_citations`), Autoformalizador (**sólo tácticas**: el enunciado se empalma desde el problema, el LLM no puede debilitarlo), Crítico (taxonomía + `missing_identifiers` → re-recuperación en modo `error`), líneas base A/B de la propuesta §8.2.
- Orquestador LangGraph (`orchestrator/graph.py`): PLAN → RETRIEVE → GENERATE → FORMALIZE → VERIFY → CRITIQUE con presupuesto RNF-3 (≤ 20 llamadas) dentro del grafo; `SolutionReport` con citas verificadas / usadas en boceto / consultadas.
- Verificador (`lean/verify.py`): REPL persistente con `lean-interact` (`import Mathlib` una vez, ~0.3 s por teorema) usando la caché de Mathlib en ext4 (`~/ragsolver_cache/lean_project`, `DECISIONS.md` #35); respaldo por proceso `lake env lean`.
- Runner de ablaciones (`orchestrator/run.py`): `full`, `no_rag`, `no_critic`, `baseline_a`, `baseline_b` → `data/eval/runs/<run_id>/results.jsonl` + `summary.json` (pass@1 con Wilson, llamadas, tokens, precisión de uso de lemas, re-recuperación, taxonomía).
- 8 tests con LLM/verificador/retriever simulados.
- Problemas: `data/eval/problems/dev_trivial.jsonl` (5 teoremas de referencia) y `dev_minif2f.jsonl` (8 de miniF2F-v2s valid, con cabecera `open ...`).
### Fase 5 — Evaluación: ✅ ejecutada (2026-09-20) — `docs/eval_report.md`
Resultados clave (tabla de muestra de Mathlib con 3 903 filas; 13 problemas dev = 5 triviales + 8 miniF2F-v2s):
- MathlibQR (946 consultas): recall@10 denso 0.662 / BM25 0.595 / híbrido 0.655; en 100 al azar con rerank: denso 0.76 (nDCG@10 0.631), híbrido+rerank 0.71 (0.617), híbrido 0.66, BM25 0.56 — el rerank recupera lo que pierde la fusión con BM25, pero el denso solo sigue siendo el mejor en esta muestra (`DECISIONS.md` #32). Premisas gold de miniF2F (352 problemas): recall@20 0.15 (informal) / 0.18 (formal) — cota inferior, la consulta real es por subobjetivo.
- Gold informal: **30/30 en el top-5, MRR 1.0**; cobertura de entidades en figuras 0.91. Contaminación: 0 pares > 0.9 (máx. 0.818).
- Ablaciones (pass@1): `full` 9/13, `no_rag` 10/13, `no_critic` 6/13, línea base A 8/13, línea base B 0 (se autoevalúa correcta 13/13 → 5 falsos positivos evitados). **El Crítico aporta +0.23**; el RAG no aporta en este dev set (−0.08, p=1.0) y triplica los tokens: los problemas se resuelven con automatización de tácticas y casi no se citan lemas por nombre (precisión de uso de lemas 0.011). Es el resultado honesto del §8.3 con n=13; hace falta el conjunto de 30-60 problemas más difíciles del plan para medir el aporte del RAG donde importa.
- Hallazgo operativo: `ranx` devolvió métricas absurdas en dos corridas largas → métricas propias (`rag/metrics.py`) verificadas contra `ranx` (`DECISIONS.md` #43).
- Premisas gold: `scripts/build_premise_gold.py` → 352 problemas / 402 lemas desde las pruebas verificadas de DeepSeek-Prover-V2 (`DECISIONS.md` #38); `scripts/eval_premises.py` (Recall@8/@20, nDCG@10, consulta informal y formal).
- Gold informal: `data/eval/informal_gold.jsonl` (30 consultas, 15 con figura; anotado por el asistente, `DECISIONS.md` #39); `scripts/eval_informal_gold.py`.
- Contaminación: `scripts/contamination.py` (coseno card ↔ miniF2F-v2s).
- Informe: `scripts/eval_report.py` → `docs/eval_report.md` (ablaciones, IC de Wilson, taxonomía).
### Fase 6 — Empaquetado y documentación: preparada (2026-09-20)
- Documentación: `docs/architecture.md` (arquitectura implementada, flujo por problema, citación), `docs/install.md`, `docs/interfaces.md` (+ JSON Schema de los 8 contratos de agentes en `docs/interfaces/`), `docs/reproduce.md` (comandos y tiempos medidos).
- Demo Gradio `demo/app.py`: pestaña "Buscar" (hits con citas, firma Lean, `docs_url`, recortes y descripciones de figura) y "Resolver" (pipeline completo o líneas base, con presupuesto). Gradio ya estaba instalado (vía MinerU); no se lanzó en esta sesión por memoria.
- Publicación en HF Hub: `scripts/publish_hf.py` (dataset card, índice Mathlib, corpus normalizado, evaluación; **excluye** el PDF, sus recortes y su texto por `redistributable=false`). ✅ Publicado el 2026-10-22 (DECISIONS #129).
- Notebook `notebooks/01_results.ipynb`: tablas de todas las evaluaciones + McNemar exacto entre configuraciones.
### Cumplimiento de la propuesta (mapeo 2026-09-20, tarde)
| Requisito | Estado |
|---|---|
| Obj. 5 — conjunto de evaluación 30-60 estratificado con partición dev/test | ✅ `data/eval/problems/eval_v1.jsonl` (60: 24 dev / 36 test; 3 áreas × 3 niveles) + ficha `README.md`. **Parcial**: 42/60 pares `full` válidos (10 resueltos) con DeepSeek V4 Flash vía OpenRouter, 6 hilos; **detenida a las 03:15 del 21-09 por el tope de US$0.50 de la key** (DECISIONS #47, #50-#54). Se reanuda con `nohup bash scripts/run_eval_v1.sh > data/eval/results/eval_v1.log 2>&1 &` en cuanto se suba el límite (≈ US$0.85 más para todo, incluido el índice completo) |
| RF-7 — decisión por agente e intento en la traza | ✅ `request.decision` en cada `TraceEvent` + evento del verificador |
| RNF-2 — semilla fijada | ✅ `seed: 13` en `versions.yaml`, pasado a Gemini/OpenAI; verificado con llamada real |
| §8.3 — llamadas de recuperación, pass por intento | ✅ `retrieval_calls`, `pass_by_attempt` en `summary.json` |
| §8.4 — bootstrap para costo/latencia | ✅ `*_ci95_bootstrap` en `summary.json` |
| §10.2 — CITATION.cff, CI, LICENSE | ✅ `CITATION.cff` (autores: Camilo Andres Niño Amaya, Jose L. Salamanca), `.github/workflows/ci.yml`, `LICENSE` Apache-2.0 (2026-10-21) |
| §10.3 — guía de usuario, diagrama de secuencia | ✅ `docs/user_guide.md`, `docs/architecture.md` §3 |
| §10.1 — informe final en inglés (IMRaD) | ✅ borrador `docs/final_report.md` con resultados actuales y 24 referencias; §6.3 se completa con `eval_v1` |
| Obj. 7 — HF Hub + Space | ✅ publicado (2026-10-22): código en huggingface.co/CamiloS1111/ragsolver (repositorio de modelo: el Space de Gradio pide PRO, DECISIONS #129), datos en huggingface.co/datasets/CamiloS1111/ragsolver-index; demo en local |
| RF-1 — subobjetivos verificables independientemente | parcial: se verifican dentro de una sola prueba (`have`), no como lemas aislados |
| §6.3 — self-consistency del Generador | ✅ `generator_samples` (apagado por defecto; cuenta en el presupuesto) |
| Corrida principal reanudable | ✅ `scripts/run_eval_v1.sh` (salta lo hecho; corta limpio si se agota la cuota) |
### GPU AMD: ✅ utilizable vía Windows + Vulkan (llama.cpp) para embeddings (2026-09-20)
`llama-server.exe` del lado de Windows con el GGUF de Qwen3-Embedding y `RAGSOLVER_EMBED_BACKEND=llama` en WSL: vectores idénticos (cos ≥ 0.9996), ~48 textos/s (10× la CPU). El corpus completo de Mathlib (278k) se está embebiendo (~96 min) → tabla `mathlib_full` (`DECISIONS.md` #48). ROCm en WSL2 sigue sin funcionar (abajo), pero ya no hace falta para el retriever.
### GPU AMD (ROCm en WSL2): ❌ no viable hoy
La tarjeta real es una **RX 9060 XT (gfx1200)**, no la 9070 XT asumida. `rocminfo` falla con `HSA_STATUS_ERROR_OUT_OF_RESOURCES` incluso con `librocdxg` v1.2.2 y tras reiniciar WSL; es el bug abierto `ROCm/ROCm#6323` (mismo hardware, cerrado por AMD como "not planned"). Todo corre en CPU + API; re-evaluar cuando AMD publique un fix (`docs/DECISIONS.md` #8-#12).
### Bloqueado / decisiones pendientes del usuario (2026-09-23)
1. ~~**LICENSE**~~ ✅ Apache-2.0 (2026-10-21).
2. ~~**Commit en git**~~ ✅ rama `rag`.
3. ✅ (2026-10-22, DECISIONS #129) **Publicación en Hugging Face** (entregable 2 de la propuesta): `HF_TOKEN` con permiso de escritura y nombres de repo; los scripts `publish_hf.py` (dataset: índice muestra + completo con ANN, evaluación, corridas) y `publish_space.py` (demo de búsqueda) ya funcionan en `--dry-run`.
4. **`eval-v1-full`** (repetición de `full`/`no_critic` con el índice completo): ≈ US$0.30; la key tiene US$0.42 libres de su tope de US$2.00. Se lanza con `setsid nohup bash scripts/run_chain.sh > data/eval/results/chain.log 2>&1 < /dev/null &` (salta `eval_v1`, que ya está completo).
5. Opcionales: gold manual de OCR (10 páginas) para la métrica de exactitud de fórmulas; experimento adicional con un modelo local en la GPU (US$0, ~5 h; ver conversación del 22-09); PDF del informe final si el curso lo pide en ese formato.
### Noche del 22→23-09: qué quedó hecho
- **`eval_v1` completo y válido** (300/300 pares, todos consistentes con el código final): `full` 9/60 (15 %), `no_rag` 9/60, `no_critic` 4/60, línea base A 5/60; la B se autoevalúa correcta en 55/60 y el kernel confirma 11. Ninguna diferencia significativa tras Bonferroni; la variación entre corridas es del tamaño de los efectos (mismo primer intento: 7 vs 4 problemas, 2 en común). Tablas en `docs/eval_report.md` y `docs/final_report.md` §6.3.
- **Informe final v0.3** (`docs/final_report.md`): resumen, discusión, limitaciones y conclusión escritos con los resultados reales; Apéndice E con los 7 defectos encontrados durante el experimento; 71 decisiones registradas.
- **Índice ANN** del Mathlib completo validado con consultas reales: mismas métricas que la búsqueda exacta, 60× más rápido. La demo responde en ~0.5 s sobre las 278 160 declaraciones.
- **Defectos corregidos esta noche** (con test): contabilidad perdida con salidas inválidas (#61), enrutamiento caro de OpenRouter (#62, #64), sesgo por reintentos ocultos en 15 pares (#63), esquema de las líneas base (#65, que invalidaba la A: 58/60 pruebas vacías).
- **Gasto**: la key usó US$1.58 de US$2.00 (≈ US$0.9 perdidos por defectos de los días anteriores, ya corregidos). No se gastó en `eval-v1-full`.
- Notebook de resultados ejecutado, docs de instalación/uso/arquitectura/interfaces al día, scripts de publicación en HF listos (dataset y Space, en `--dry-run`), 77 tests en verde.