Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
a949d1b
docs: Insights from ReAct paper
Mar 30, 2026
432733e
feat(llm): implement AnthropicLLM provider with generate and stream
Mar 30, 2026
c9cb181
test(llm): add unit and integration tests for AnthropicLLM
Mar 30, 2026
6c4bfb1
docs: Summary of key points from March 30, 2026
Mar 30, 2026
f782407
feat(domain): align with clean-agents-template (PromptTemplate, Agent…
Apr 1, 2026
14d1114
docs: Update CLAUDE.md with GIT workflow, add learning and add new RO…
Apr 9, 2026
777e053
test: Test pre-commit tootl
Apr 9, 2026
e2b1b2b
update: update pre-commit file to no commit to master or certificatio…
Apr 9, 2026
a90db6e
docs: update workflow to end session
Apr 9, 2026
0a2208c
docs(work_log): initialize work log with sessions 2026-04-01 and 2026…
Apr 9, 2026
e1ff6dd
feat(data): add arXiv API client with XML parsing and integration test
Apr 13, 2026
f9fe569
feat(notebooks): add ignore notebooks in pre-commit tool
Apr 13, 2026
dfc2e21
feat(ingestion): add PDF download and text extraction service
Apr 13, 2026
44fe069
refactor(ingestion): centralize filesystem paths in paths.py
Apr 13, 2026
63b2454
docs: update work_log.md
Apr 13, 2026
23c3ef9
refactor(ingestion): split into async download/extract, add Ingestion…
Apr 15, 2026
4cecf23
docs: update learnings and work log for april 15 session
Apr 15, 2026
b2144d3
feat(scripts): add arxiv download benchmark sequential vs parallel
Apr 17, 2026
65556a7
feat(retrieval): add fixed chunking with overlap and parametrized tests
Apr 17, 2026
053336f
feat(retrieval): add chunk_to_document converter with unit test
Apr 17, 2026
467d995
feat(retrieval): add ChromaVectorStore and LocalEmbedder with integra…
Apr 17, 2026
50ad866
docs: update learnings and work_log files
Apr 17, 2026
bf2bbb1
chore(deps): make pysqlite3-binary linux-only dependency
Apr 18, 2026
5303342
feat(ingestion): add ingest_papers pipeline orchestrating arxiv, pdf …
Apr 18, 2026
52e8ddc
feat(eval): add evaluation dataset with 20 questions and run_eval script
Apr 18, 2026
1a22a89
docs: update learnings and work_log files
Apr 18, 2026
607a9fe
docs: add and update docstrings
Apr 23, 2026
e40c8d0
docs: Update ROADMAP.md
May 19, 2026
a5fb552
docs(src): add Google-style docstrings to all src/ modules and script…
May 19, 2026
3090f4a
feat(embedder): Add option to load local embedder from pre-dowload model
May 21, 2026
123c6ec
feat(rag): Method to answer question usin full RAG
May 21, 2026
94b82ea
Merge feature/v1-infrastructure-setup local and remote branches
May 21, 2026
9a72a18
data(eval): update eval dataset questions
May 21, 2026
4d7384a
docs(notebooks): reorder notebooks to reflext dependency order
May 21, 2026
2beffbc
chore(deps): add pysqlite3-binary to fix sqlite3 on Linux
May 21, 2026
2eaf394
chore(dev): add pytest-cov with term-missing coverage report
May 21, 2026
3de79d8
refactor(prompts): remove registry.py, consolidate on PromptTemplate
May 21, 2026
19ff6ba
refactor(ingestion): inject VectorStore as optional parameter
May 21, 2026
a012935
feat(retrieval): add Retriever protocol and BM25Retriever implementation
May 21, 2026
8dacca3
docs: update learnings and work_log for 2026-05-21
May 21, 2026
56a5b85
refactor(services): split chunking from retrieval service
Jun 1, 2026
51aafcf
feat(services): Add hybrid search and its tests
Jun 1, 2026
8432ea3
feat(services): add LLM-based reranker and its tests
Jun 1, 2026
4ad3016
feat(services): add hybrid search, reranker, and eval script
Jun 1, 2026
5a54bc8
docs: update learnings and work_log for 2026-06-01
Jun 1, 2026
ce415f8
docs(roadmap): mark T6-T10 complete, V1 done
Jun 1, 2026
218ab3f
chore(notebooks): Workshop to resume development of the project
Jul 27, 2026
c965130
chore(notebooks): Progress in the review workshop
Jul 28, 2026
95404dd
chore(skills): The skill to draw, recreate, or define the project's a…
Jul 29, 2026
0e9ea8e
chore(skills): SKILL is added to manage the flow of commits
Jul 29, 2026
07d9356
chore(system): add concepts tutor system with 15 seed questions
Jul 29, 2026
10bd08f
chore(docs): add missing weekly_drafts and essays/prompts directories
Jul 29, 2026
18279f6
docs: close out 2026-07-29 session (learnings + work_log)
Jul 29, 2026
4e13ee3
chore(skills): add daily-closeout skill
Jul 29, 2026
c27ae20
feat(bot): add Telegram bot adapter wired to vector-only RAG
Aug 10, 2026
f688462
docs: close out 2026-08-10 session (learnings + work_log)
Aug 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .claude/settings.local.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"permissions": {
"allow": [
"Read(//c/Users/mario/Documentos/personal_projects/becomes_ai_engineer/clean-agents-template/**)"
]
}
}
103 changes: 103 additions & 0 deletions .claude/skills/arquitectura-drawio/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
---
name: arquitectura-drawio
description: Genera y edita diagramas de arquitectura en draw.io (.drawio) con el estilo visual de la organización — paleta, cajas por categoría, edges ortogonales animados theme-aware y logos oficiales de la tecnología que sea (GCP, AWS, Azure, LangChain, React, Node, Python, Docker…) con glifo genérico de fallback. Agnóstica del stack. Usar cuando se pida crear, rediseñar o exportar una arquitectura/diagrama en draw.io, o convertir una descripción o boceto en un .drawio con el look de la casa.
---

# Arquitecturas draw.io con el estilo de la organización

Skill **portable y transversal**: para llevarla a otro repo, copiar la carpeta
`.claude/skills/arquitectura-drawio/` completa. Los scripts son solo stdlib de Python; `gcp_icon.py`
descarga iconos desde URLs públicas de Google (internet una vez, luego cacheado).

## Principio

Un `.drawio` es XML de mxGraph (texto plano). Lo mejor es **generarlo directamente** con el motor
`scripts/drawio_kit.py`, que ya trae los tokens de estilo de la casa, asegura IDs únicos, escapa el
XML y valida el resultado. No hace falta ningún MCP ni servicio online.

## Flujo de trabajo

1. **Entender la arquitectura**: nodos, capas, flujos, qué herramienta es cada nodo. Si es ambiguo,
preguntar antes de dibujar.
2. **Generar** con `drawio_kit` (ver `scripts/ejemplo.py` como plantilla). Escribir un script corto
en el scratchpad que:
- agregue `scripts/` de esta skill a `sys.path` e importe `Diagram, STYLE, EDGE` y, para
iconos, `glyph.logo` (logo oficial de cualquier tecnología) y `glyph.material` (fallback);
- defina nodos con coordenadas en grilla y edges con **anclajes explícitos**
(`exit=`/`entry=`) — clave para que no se traslapen las flechas;
- llame `Diagram.write(ruta)`, que valida (IDs únicos, edges íntegros, XML) y avisa si supera 500 KB.
3. **Agregar la leyenda** (obligatorio, ver sección *Leyenda*): un bloque que explique qué significa
cada color de flecha y de caja antes de dar por terminado el diagrama.
4. **Revisar** abriendo el `.drawio` en VS Code con la extensión *Draw.io Integration*
(`hediet.vscode-drawio`). Iterar con el usuario y confirmar que los iconos rendericen.

Alternativa sin scripts: escribir el XML a mano siguiendo `references/estilo.md` (útil para retoques
puntuales). Estructura mínima por página: `<mxfile><diagram name="…"><mxGraphModel><root>`
`<mxCell id="0"/><mxCell id="1" parent="0"/> … celdas … </root></mxGraphModel></diagram></mxfile>`.

## Estilo

Paleta, strings de estilo, edges y **reglas de layout para evitar traslapes** (fan-out/gather con
anclajes, almacenes pegados a su nodo) están en **`references/estilo.md`**. Rasgo distintivo de la
casa: edges `orthogonalEdgeStyle` con `flowAnimation=1` y color `light-dark(...)` (theme-aware).

## Iconos (agnóstico de tecnología)

Las tecnologías varían por proyecto. **Regla: logo oficial de la tecnología; si no existe, glifo
genérico.** Detalle y ejemplos en **`references/iconos.md`**. Orden:

1. **Logo oficial** — `from glyph import logo; logo(nombre, color)`. Punto de entrada único que
resuelve marcas (simple-icons: `langchain`, `react`, `nodejs`, `python`, `docker`, `awslambda`,
`microsoftazure`…) y productos Google Cloud (`vertex_ai`, `bigquery`, `cloud_run`…).
2. **Glifo genérico de fallback** — si `logo()` no encuentra la tecnología (p. ej. Google ADK,
Langfuse, un componente custom), usa `glyph.material(symbol, color)` en vez de una caja vacía
(`python scripts/glyph.py list-suggested` mapea tipo→glifo).
3. **Librería nativa de draw.io** — más liviana, look distinto, riesgo de icono en blanco.
4. **Imágenes del usuario** — último recurso; al usarla **informar siempre** del peso extra, que
son imágenes pegadas, el riesgo de PII en capturas y las licencias de terceros.

## Legibilidad (evitar traslapes) — obligatorio

El flujo debe leerse claro, sin flechas ni textos superpuestos. `references/estilo.md` tiene las
reglas (separación mínima, anclajes `exit`/`entry`, `points=` para rutear alrededor de nodos). Antes
de entregar, corre el linter y **itera hasta que no queden traslapes duros**:

```bash
python scripts/check_layout.py <archivo>.drawio # nodos/etiquetas/flechas superpuestos
```

`drawio_kit.write()` ya lo ejecuta y avisa. Confirma también visualmente en draw.io.

## Leyenda (obligatorio)

Toda arquitectura entregada **debe incluir una leyenda descriptiva** — sin ella el diagrama no está
terminado. Un diagrama codifica significado en el color de las flechas y de las cajas; la leyenda es
lo que hace ese código legible para quien no lo dibujó. Ubícala en una franja al pie (o en una esquina
libre) y cubre, como mínimo:

- **Color de cada flecha**: qué relación representa. En el estilo de la casa (ver `EDGE` en
`references/estilo.md`) el convenio es: **verde** = flujo de datos; **azul** = orquestación / control
(quién invoca o ejecuta a quién); **gris punteada** = consumo de un servicio o recurso compartido
(lectura/escritura). Si usas otros colores o relaciones, explícalos igual.
- **Color de cada caja**: qué tipo de componente es (p. ej. verde = paso determinista, azul =
servicio/modelo LLM, rojo = orquestador, blanco = almacén de apoyo, amarillo = salida). Describe
solo las categorías que realmente aparezcan en el diagrama.
- **Cualquier otra convención relevante**: iconos sueltos = fuentes/actores externos, que las flechas
van animadas e indican el sentido del flujo, líneas punteadas vs. sólidas, etc.

Dibuja las muestras de flecha como edges reales (con su mismo `style`) para que el color y la animación
coincidan con el diagrama, y usa chips de color con el `fillColor`/`strokeColor` de cada arquetipo de
caja. Mantén la leyenda dentro del `pageHeight` y pásala por el linter como el resto.

## Reglas

- **Todos los conectores van animados** (`flowAnimation=1`); el kit lo garantiza en `EDGE`.
- **Incluye siempre una leyenda descriptiva** de colores de flecha y de caja (ver sección *Leyenda*);
un diagrama sin leyenda está incompleto.
- **Esquinas con radio fijo** (no la curva grande por defecto de `rounded=1`, que tapa el texto): dos
niveles, ya incluidos en `STYLE` (`ARC` y `ARC_ZONE`) — cajas de componente `absoluteArcSize=1` (muy
sutil) y contenedores/zonas azules punteados `absoluteArcSize=2` (esquina algo más marcada).
- Sin PII ni datos internos sensibles en etiquetas, notas o imágenes embebidas.
- Mantener el `.drawio` liviano (iconos SVG, no PNG pesados): el pre-commit típico bloquea > 500 KB.
- No prometer que rendericen los iconos sin que el usuario lo confirme en draw.io; si alguno sale en
blanco, revisar el data URI (ver `references/iconos.md`).
169 changes: 169 additions & 0 deletions .claude/skills/arquitectura-drawio/references/estilo.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
# Tokens de estilo — arquitecturas draw.io de la organización

Destilado de los diagramas de referencia de la organización. `scripts/drawio_kit.py` ya trae estos
tokens en los dicts `STYLE` y `EDGE`; este documento es para consulta o para escribir el XML a mano.

## Paleta

| Rol | Color |
|---|---|
| Texto primario | `#4B5259` |
| Texto atenuado | `#9E9E9E` / `#999999` / `#777777` |
| Azul de marca (bordes, edges) | `#4284F3` |
| Azul secundario (acentos/iconos) | `#5184F3` |
| Azul banner (relleno sólido, texto blanco) | `#4DA1F5` |
| Azul icono (actor ios7) | `#0080F0` |
| Verde datos / éxito | `#66CC00` (edges) · `#82b366` (bordes) |
| Borde neutro | `#dddddd` (con `shadow=1`) |

Pasteles estándar de draw.io para categorizar cajas: azul `#dae8fc` (LLM/servicio), verde `#d5e8d4`
(determinista), rojo `#f8cecc` (crítico/PII), naranja `#ffe6cc` (gate), amarillo `#fff2cc` (salida).

## Tipografía y tamaños

Fuente por defecto de draw.io. `fontSize` 12 en nodos, 15 en banners, 10–11 en detalles/almacenes.
Tamaños de caja habituales: tarjeta **160×60** o **170×60**, almacén **≈190×44**, actor **48×60**.

## Esquinas redondeadas fijas (dos niveles)

Las cajas redondeadas llevan un **radio fijo en píxeles** (`absoluteArcSize`), no la curva grande y
**proporcional al tamaño** que aplica `rounded=1` a secas — esa curva, en cajas anchas o de poca
altura, tapa el texto alineado a la izquierda o lo saca por las esquinas. Se usan **dos niveles**:

- **Cajas de componente** (tarjeta, LLM, determinista, crítico, salida): `arcSize=6;absoluteArcSize=1;`
— radio muy sutil.
- **Contenedores / zonas** (los recuadros azules punteados grandes): `arcSize=6;absoluteArcSize=2;`
— un poco más marcado para que la esquina se note en las cajas grandes.

`drawio_kit` ya lo inyecta en `STYLE` (constantes `ARC` y `ARC_ZONE`); si escribes el XML a mano, añádelo.

## Strings de estilo (copiar en draw.io con Ctrl+E)

```
# Banner / cabecera
rounded=0;whiteSpace=wrap;html=1;fillColor=#4DA1F5;strokeColor=none;shadow=1;fontColor=#ffffff;fontSize=15;fontStyle=1;align=center;

# Tarjeta neutra
rounded=1;arcSize=6;absoluteArcSize=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#dddddd;shadow=1;strokeWidth=1;fontColor=#4B5259;fontSize=12;

# Servicio / agente LLM (azul)
rounded=1;arcSize=6;absoluteArcSize=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;shadow=1;fontColor=#4B5259;fontSize=12;

# Núcleo determinista (verde)
rounded=1;arcSize=6;absoluteArcSize=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;shadow=1;fontColor=#4B5259;fontSize=12;

# Paso crítico / advertencia (rojo)
rounded=1;arcSize=6;absoluteArcSize=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;shadow=1;fontColor=#4B5259;fontSize=12;fontStyle=1;

# Salida / revisión humana (amarillo)
rounded=1;arcSize=6;absoluteArcSize=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;shadow=1;fontColor=#4B5259;fontSize=12;

# Gate condicional (rombo naranja)
rhombus;whiteSpace=wrap;html=1;fillColor=#ffe6cc;strokeColor=#d79b00;shadow=1;fontColor=#4B5259;fontSize=11;

# Contenedor / zona (borde azul punteado, fondo transparente) — esquina algo más marcada (arcSize 2)
rounded=1;arcSize=6;absoluteArcSize=2;whiteSpace=wrap;html=1;fillColor=none;strokeColor=#4284F3;dashed=1;verticalAlign=top;align=left;fontColor=#4284F3;fontSize=13;fontStyle=1;spacingLeft=12;spacingTop=6;

# Actor / usuario · Almacén-BD (cilindro, etiqueta DEBAJO, estándar ~120x50) · Documento
shape=mxgraph.ios7.icons.user;html=1;strokeColor=#0080F0;strokeWidth=2;verticalLabelPosition=bottom;verticalAlign=top;align=center;fontColor=#4B5259;
shape=cylinder3;whiteSpace=wrap;html=1;fillColor=#f5f5f5;strokeColor=#999999;verticalLabelPosition=bottom;verticalAlign=top;align=center;fontColor=#4B5259;fontSize=10;
shape=document;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#999999;boundedLbl=1;fontColor=#4B5259;fontSize=11;
```

## Conexiones (la firma de la casa)

Edges **ortogonales y animados** con color **theme-aware** (`light-dark(claro,oscuro)`).
**Obligatorio: TODOS los conectores llevan `flowAnimation=1`** (animación de flujo) — es la firma de
la casa; también las variantes punteadas. El kit ya lo garantiza en `EDGE`.

```
# Flujo principal (animado)
edgeStyle=orthogonalEdgeStyle;flowAnimation=1;rounded=0;html=1;strokeColor=light-dark(#4284F3,#6671E3);strokeWidth=2;

# Datos / RAG (verde) · Excepción/humano (rojo punteado) · Auxiliar (gris punteado) — TODOS animados
edgeStyle=orthogonalEdgeStyle;flowAnimation=1;rounded=0;html=1;strokeColor=#66CC00;strokeWidth=2;
edgeStyle=orthogonalEdgeStyle;flowAnimation=1;rounded=0;html=1;dashed=1;strokeColor=#b85450;strokeWidth=2;
edgeStyle=orthogonalEdgeStyle;flowAnimation=1;rounded=0;html=1;dashed=1;strokeColor=#9E9E9E;strokeWidth=1;
```

## Leyenda descriptiva (obligatoria)

Todo diagrama entregado incluye una leyenda que traduce el color a significado. Convenio de la casa
para las **flechas** (mismo `EDGE` del kit):

| Color | `EDGE` | Significado |
|---|---|---|
| Verde `#66CC00` | `data` | Flujo de datos (lo que se transforma y avanza entre pasos) |
| Azul `light-dark(#4284F3,#6671E3)` | `flow` | Orquestación / control (quién invoca o ejecuta a quién) |
| Gris punteada `#9E9E9E` | `aux` | Consumo de un servicio o recurso compartido (lectura/escritura) |
| Rojo punteado `#b85450` | `warn` | Excepción / intervención humana |

Y para las **cajas**, describe solo los arquetipos que uses (verde = determinista, azul = servicio/LLM,
rojo = orquestador/crítico, blanco = almacén de apoyo, amarillo = salida). Añade las convenciones
extra que apliquen (iconos sueltos = fuentes externas; flechas animadas = sentido del flujo).

Dibújala en una franja al pie (dentro del `pageHeight`) con **edges de muestra reales** — mismo `style`
que en el diagrama, con `sourcePoint`/`targetPoint` en la geometría en lugar de `source`/`target` — y
**chips** de color usando el `fillColor`/`strokeColor` de cada arquetipo:

```
# Línea de muestra (sin nodos): reutiliza el EDGE real, solo cambia los puntos
<mxCell id="lg-e-green" style="edgeStyle=none;html=1;flowAnimation=1;strokeColor=#66CC00;strokeWidth=3;startArrow=none;endArrow=classic;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="60" y="1080" as="sourcePoint"/><mxPoint x="104" y="1080" as="targetPoint"/>
</mxGeometry>
</mxCell>
# Chip de color de caja (usa el fillColor/strokeColor del arquetipo)
rounded=1;arcSize=6;absoluteArcSize=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;
```

## Claridad y anti-traslape (lo más importante para que se entienda)

Reglas de diseño:

- **Separación mínima**: deja ≥ 40 px entre cajas de nodos distintos. Recuerda que la etiqueta de un
icono se dibuja **debajo** de él (con `verticalLabelPosition=bottom`) y ocupa ~15 px por línea: no
pongas otro nodo pegado abajo o la etiqueta lo pisará.
- **Fijar los anclajes** con `exit=(fx,fy)` y `entry=(fx,fy)` (fracciones 0–1). Es lo que separa un
diagrama legible de un enredo de flechas.
- **Fan-out**: salir del origen a distinta Y por rama (`exit=(1,0.3)`, `(1,0.5)`, `(1,0.7)`); entrar
por el mismo lado del destino → peine paralelo. **Gather**: entrar al destino a distinta Y
(`entry=(0,0.2)`, `(0,0.5)`, `(0,0.8)`).
- **Almacenes de apoyo** pegados **junto** al nodo que los consume (edge corto), no al otro extremo.
- **Flechas que cruzarían un nodo** → usa `points=[(x,y),...]` en `edge()` para sacar la ruta por
encima/alrededor (un carril libre), o reubica los nodos. No dejes una flecha atravesando un icono.
- **Etiquetas de flecha** (`202`, `Post`): ponlas donde el tramo esté libre; si caen sobre un nodo,
mueve el nodo o añade un waypoint para desplazar el punto medio.
- **Contenedor/zona**: dibújalo primero (queda detrás), `fillColor=none`; el título va en una esquina
(`align=left`), no centrado sobre el paso de las flechas.

### Verificar con el linter (obligatorio antes de entregar)

`drawio_kit.write()` corre `check_layout` y avisa. Para el detalle:

```bash
python scripts/check_layout.py <archivo>.drawio
```

Reporta **nodos-superpuestos**, **etiqueta-sobre-nodo**, **flecha-cruza-nodo** y
**etiqueta-flecha-sobre-nodo**. Itera reubicando nodos / añadiendo waypoints hasta que no queden
traslapes **duros** (nodos-superpuestos, flecha-cruza-nodo). Es heurístico (el ruteo real de draw.io
difiere), así que confirma también visualmente en draw.io.

## Etiquetas: pasar texto crudo (evitar doble escape)

`drawio_kit` ya escapa el XML por ti. En `label` pasa **texto crudo**, no entidades:

- salto de línea → `"\n"` (no `"&#xa;"`);
- `<`, `>`, `&` literales → escríbelos tal cual (`"</> MicroComponent"`, `"Search & Chat"`), no
`"&lt;"`/`"&amp;"`.

Si pre-codificas entidades, el kit las vuelve a escapar (`&amp;lt;`, `&amp;#xa;`) y draw.io muestra
el texto literal en vez de interpretarlo.

## Higiene de git

- El pre-commit típico **bloquea archivos > 500 KB**. Con iconos SVG embebidos un diagrama pesa
decenas de KB; no embeber PNG pesados ni cientos de imágenes.
- Tratar las arquitecturas como documentación interna; sin PII ni datos sensibles en etiquetas/notas.
- Revisar y editar el `.drawio` en VS Code con la extensión *Draw.io Integration* (`hediet.vscode-drawio`).
Loading
Loading