| Restricción | Implicancia en cómo trabajamos |
|---|---|
| Plan Claude Pro (no API / no Max) | Presupuesto de tokens limitado por ventana de 5 h. Toda herramienta que "queme" contexto sin aportar se elimina. |
| Dos personas compartiendo el flujo | El proceso tiene que ser legible por humanos y por Claude sin reuniones: todo vive en archivos versionados. |
| No tenemos Jira / ClickUp | Los tickets son archivos Markdown en el repo + issues de GitHub. Sin tablero externo. |
| No usamos MCP de ClickUp ni de GitHub | Esos MCP inyectan esquemas y respuestas enormes en cada llamada. Usamos gh CLI, que devuelve solo lo que pedimos. |
| No tenemos CI | La verificación corre localmente (Docker + git hooks). Sin CI, la disciplina pre-commit y los fixtures son la red de seguridad. Ver §8. |
Cada decisión de tooling se evalúa por una pregunta: ¿cuántos tokens consume por unidad de valor?
gh issue create / gh pr create hacen lo mismo gastando una fracción.graphify query devuelve un subgrafo acotado en lugar de volcar archivos enteros al contexto (§6).plan/INDEX.md y las reglas de CLAUDE.md indican no cargar la base de conocimiento completa por defecto; solo el archivo que la tarea concreta necesita.haiku; el diseño de propuestas openspec recomienda Opus. Se elige el modelo más barato que sirva.opsx:propose y opsx:apply corremos /compact: la fase de propuesta acumula mucho contexto de diseño que la fase de implementación no necesita arrastrar. Compactar ahí evita el costo de >150k tokens de contexto.No inventamos trabajo. Cada ticket se deriva de dos fuentes:
Cruzar ambos nos dio un flujo para priorizar y dividir tareas importantes que dependen unas de otras. El número de ticket es el orden de construcción (número menor = se hace primero), alineado a la secuencia de plan/knowledge/v10-gaps.md y al ROADMAP.
Cada feature se parte en dos tickets:
| Track | Carpeta | Prefijo | Qué cubre |
|---|---|---|---|
| API (backend) | plan/tickets/api/ | API-NN | Endpoints / capacidades del backend |
| UI (frontend) | plan/tickets/ui/ | UI-NN | Cablear cada pantalla a la API |
El ticket de UI depende de su ticket de API: primero se hace el API. Esto evita construir contra "endpoints fantasma" que todavía no existen.
Cada ticket es un archivo Markdown con metadata fija. Ejemplo real (API-46):
# API-46 — screening auto-close: doc fix + audit-assertion test
**Status:** ✅ done
**GitHub issue:** [#189](https://github.com/Clarolab-Junin/cumplepld/issues/189)
**Size:** XS
**Type:** Bug (doc) + Test gap
**Spotted during:** QA validation of API-44
**Parent:** API-44
## Problem ← qué está mal / qué falta, con refs a file:línea
## Scope ← qué se va a tocar, acotado
## Acceptance criteria ← checklist verificable (incluye `make test` green)
## References ← rutas exactas a código, contratos, specs, QA report
La regla clave: las referencias apuntan a archivo:línea. Eso le permite a Claude ir directo al punto sin explorar a ciegas (otra vez, economía de tokens).
El procedimiento, solo con gh CLI (sin MCP):
gh issue create --title "API-46: screening auto-close doc fix" --body "..."
- **GitHub issue:** #NN al archivo del ticket.README.md del índice correspondiente.Al empezar a trabajar un ticket, se autoasigna el issue: gh issue edit <N> --add-assignee @me.
dev ni main — ni siquiera para docs. Siempre rama desde dev.dev (--base dev); main se promueve aparte.Closes #N / Refs #N. Ojo: como mergeamos a dev (no a la branch default), GitHub no autocierra el issue — se cierra a mano después del merge confirmado.Usamos OpenSpec para que los cambios pasen por un flujo de artefactos antes de tocar código. Vive en openspec/.
| Pieza | Rol |
|---|---|
openspec/config.yaml | Apunta al schema clarolab-workflow (nuestro fork del schema base). |
openspec/schemas/clarolab-workflow/ | El schema forkeado: define los artefactos proposal → specs → design → tasks y sus templates. |
openspec/specs/ | Specs vivas por capacidad (ej. screening-alert-auto-close, action-center-queue). |
openspec/changes/ | Cambios en curso; changes/archive/ guarda los ya aplicados (12 archivados a la fecha). |
Skills dedicadas manejan cada fase: opsx:propose → opsx:apply → opsx:archive (y opsx:explore / opsx:sync de apoyo).
archive/.ExitPlanMode en una sesión opsx, Claude se detiene — no escribe código hasta que corramos /opsx:apply. Separar "proponer" de "aplicar" evita gastar tokens implementando algo que todavía no aprobamos.
/update-openspecNuestro schema clarolab-workflow es un fork del workflow base de OpenSpec (@fission-ai/openspec, antes spec-driven). Como cualquier fork, el upstream sigue mejorando después de que lo bifurcamos. La skill /update-openspec es la herramienta para mantener ese fork sincronizado — no es una skill de "consulta de conocimiento", es de mantenimiento de infraestructura.
Qué hace, paso a paso:
openspec update — regenera los archivos de instrucciones del paquete para la versión instalada.El resultado: el fork se beneficia de las nuevas versiones de OpenSpec de forma controlada, manteniendo nuestras reglas propias (ej. la recomendación de Opus para la fase de propuesta).
El repo tiene un grafo de conocimiento persistente en graphify-out/ (god nodes, detección de comunidades, relaciones cross-file). Sirve para responder preguntas de arquitectura devolviendo un subgrafo acotado en lugar de volcar archivos enteros al contexto.
cost.json), el mantenimiento es gratis: make graph corre graphify update en modo solo-AST, sin costo de LLM. Se paga una vez el armado; después solo se refresca.
graphify query "<pregunta>"; graphify path "<A>" "<B>" para relaciones; graphify explain "<concepto>" para algo puntual.graphify-out/wiki/index.md en vez de browsear el código crudo.GRAPH_REPORT.md solo para revisión de arquitectura amplia.make graph y commitear graph.json + GRAPH_REPORT.md.graphify hook install — reinstala el auto-rebuild que genera conflictos para el equipo. El refresh es manual y deliberado.
En .claude/settings.json hay hooks PreToolUse que, cuando existe graph.json, obligan a orientar con graphify antes de hacer grep o leer archivos de código. Si Claude intenta grepear o leer un .py/.ts directo, el hook inyecta un recordatorio mandatorio de usar graphify primero. Esto baja el consumo de tokens de exploración de forma automática, incluso en subagentes.
Usamos Superpowers (framework de skills) más skills propias del proyecto. La regla: si una skill aplica, se usa antes de responder.
| Categoría | Ejemplos |
|---|---|
| Proceso (Superpowers) | brainstorming, systematic-debugging, test-driven-development, writing-plans, verification-before-completion |
| OpenSpec | opsx:propose, opsx:apply, opsx:archive, opsx:explore, opsx:sync |
| Migraciones (propias) | create-migration, apply-migration, squash-migrations |
| Calidad / QA (propias) | safe-fix, ui-ticket-validator, review / code-review |
| Conocimiento | graphify |
| Mantenimiento de infraestructura | update-openspec (sincroniza nuestro fork del schema con el upstream — ver §5.4) |
Las skills "rígidas" (TDD, debugging sistemático) se siguen al pie de la letra; las "flexibles" se adaptan. La prioridad: skills del usuario/proyecto > skills de Superpowers > comportamiento por defecto.
Lo que la suple:
make (make test, make migrate, make simulate...). Postgres únicamente — no existe fallback a SQLite y no se agrega.| Hook | Cuándo | Qué hace |
|---|---|---|
.husky/pre-commit | cada commit | UI: pnpm lint-staged + typecheck |
.husky/pre-push | cada push | Backend: make test-push (levanta el stack, corre pytest, lo baja) |
make simulate / make populate en el mismo commit. Sin CI, los fixtures son la prueba viva de que el endpoint funciona end-to-end.plan/api/contracts/ son la única fuente de verdad de la API implementada. Sirven para sincronizar la API con el frontend: cuando Claude cablea una pantalla de UI, lee el contrato en vez del código del backend — más barato en tokens y más estable que parsear los controllers. Por eso el contrato tiene que reflejar el código en cada commit.Las reglas viven en archivos versionados y se cargan automáticamente:
| Archivo | Qué fija |
|---|---|
.claude/CLAUDE.md | Reglas base: todo en Docker vía make; Postgres-only; nunca commit directo a dev/main; contratos = fuente de verdad; docs+fixtures en el mismo commit. |
.claude/AXIOMS.md | Principios de diseño (Ousterhout / "Philosophy of Software Design"): minimizar dependencias, módulos profundos, ocultar información, etc. Guían diseño y code review. |
.claude/docs/*.md | Guías puntuales cargadas según la tarea: git-workflow, migrations, docker, docs-maintenance. |
.claude/settings.json | Hooks que fuerzan graphify antes de grep/lectura de código (§6.3). |
api/CLAUDE.md / ui/CLAUDE.md | Reglas de backend y de frontend, autocargadas al tocar esos directorios. Además, cada track tiene sus propias skills: no comparten un único set — API y UI cuentan con skills específicas de su dominio (migraciones, validación de tickets UI, etc.) que se activan según en qué parte del repo se trabaja. |
dev ni main.graphify hook install (rompe al equipo).| Hoy (Pro, tokens escasos, sin CI) | Con presupuesto infinito (hipótesis a debatir) |
|---|---|
Tickets como archivos + gh CLI, sin MCP | ¿MCP de GitHub/ClickUp para sincronización bidireccional automática? A evaluar si el costo en contexto se justifica. |
| Sin CI; hooks locales + fixtures como red | CI real (GitHub Actions): tests, lint, typecheck y make simulate en cada PR; quizás un agente de review automático por PR. |
graphify refresh manual (make graph, AST-only) | Rebuild semántico continuo del grafo + re-extracción profunda; grafo siempre fresco sin pensar en costo. |
| Modelo según fase (haiku para lectura, Opus para diseño) | ¿Opus en todo? — a debatir: ¿conviene Opus para cada paso o el modelo barato sigue siendo mejor en lectura/exploración aunque sobre presupuesto? Lo que sí: subagentes paralelos para explorar varias hipótesis a la vez. |
/compact entre fases; carga de docs bajo demanda | Contexto amplio sin compactar; cargar toda la base de conocimiento relevante de entrada. |
| Tickets S/XS directos, planning pesado solo para L/XL | Planning + grilling formal para todo cambio, con validación adversarial previa a cada edit. |
openspec archive y make graph al último paso del CI, disparados automáticamente después de iniciar el proceso de merge. Hoy esos dos pasos (archivar el change de OpenSpec y refrescar el grafo) los corremos a mano antes de commitear; con CI serían el cierre automático del pipeline, garantizando que graph.json y el archivo de OpenSpec queden siempre sincronizados con lo mergeado, sin depender de que nos acordemos.
Preguntas abiertas para llenar entre los dos:
• ¿Cuánto de la calidad actual viene justamente de que los tokens escasos nos obligan a ser precisos?
• ¿Qué automatizaríamos primero si pudiéramos: CI, sync de issues, o rebuild del grafo?