Version 4
Visibility: Open to anyone

    Lineamientos y procesos de IA — CumplePLD

    Documento interno · enfoque exclusivo en cómo trabajamos con IA (Claude Code) — no describe el producto. Última edición: junio 2026.

    Resumen ejecutivo. Construimos CumplePLD con Claude Code sobre el plan Claude Pro, entre dos personas (Claudio y Fer). Ese plan resulta muy acotado para dos desarrolladores: nos quedábamos sin tokens antes de cerrar la ventana de 5 horas. Eso forzó un conjunto de decisiones deliberadas para maximizar cada token: nada de MCPs pesados, tickets como archivos en el repo, un grafo de conocimiento que orienta antes de leer código, y reglas escritas para que Claude sepa exactamente qué usar y qué no tocar. Este documento describe ese sistema.

     

    1. Contexto y restricciones

    RestricciónImplicancia 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 flujoEl proceso tiene que ser legible por humanos y por Claude sin reuniones: todo vive en archivos versionados.
    No tenemos Jira / ClickUpLos tickets son archivos Markdown en el repo + issues de GitHub. Sin tablero externo.
    No usamos MCP de ClickUp ni de GitHubEsos MCP inyectan esquemas y respuestas enormes en cada llamada. Usamos gh CLI, que devuelve solo lo que pedimos.
    No tenemos CILa verificación corre localmente (Docker + git hooks). Sin CI, la disciplina pre-commit y los fixtures son la red de seguridad. Ver §8.

    2. Economía de tokens (principio transversal)

     

    Cada decisión de tooling se evalúa por una pregunta: ¿cuántos tokens consume por unidad de valor?

    • Sin MCPs verbosos. El MCP de ClickUp/GitHub trae payloads grandes en cada turno. gh issue create / gh pr create hacen lo mismo gastando una fracción.
    • Grafo antes que grep. Un graphify query devuelve un subgrafo acotado en lugar de volcar archivos enteros al contexto (§6).
    • Carga bajo demanda.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.
    • Modelo según fase. Subagentes de solo lectura (Explore) corren en haiku; el diseño de propuestas openspec recomienda Opus. Se elige el modelo más barato que sirva.
    • Compactar entre fases de OpenSpec. Concretamente entre 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.
    • Tickets chicos directos. Un ticket S/XS con spec completa se implementa directo, sin subagente de planificación; el peso pesado se reserva para features L/XL con arquitectura genuinamente incierta.

     

    3. Proceso de creación de tickets

     

    3.1 De dónde salen los tickets

     

    No inventamos trabajo. Cada ticket se deriva de dos fuentes:

    • El PRD del cliente — qué necesita el negocio.
    • Los steps del MVP que armó nuestro manager (Pablo) — el orden y los hitos de entrega.

     

    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.

    Reuniones para organizar y dividir. Esta priorización y partición de tickets no salió sola: requirió reuniones entre nosotros para leer el PRD y los steps del MVP, ordenar las dependencias y decidir cómo cortar cada feature en tickets API + UI. El trabajo de coordinación lo hicimos los humanos; Claude ejecuta sobre tickets ya divididos y priorizados.

    3.2 Dos tracks con dependencia explícita

     

    Cada feature se parte en dos tickets:

     

    TrackCarpetaPrefijoQué cubre
    API (backend)plan/tickets/api/API-NNEndpoints / capacidades del backend
    UI (frontend)plan/tickets/ui/UI-NNCablear 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.

    3.3 Anatomía de un ticket

    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).

    3.4 Ticket ↔ GitHub issue (al mismo tiempo)

     

    Regla: todo archivo de ticket nuevo debe tener un issue de GitHub creado en el mismo momento. El issue es el feed de actividad visible para el equipo; el archivo del ticket es la fuente de verdad del detalle.

    El procedimiento, solo con gh CLI (sin MCP):

    gh issue create --title "API-46: screening auto-close doc fix" --body "..."
    1. Crear el issue con contexto, criterios de aceptación y link al archivo del ticket.
    2. Agregar - **GitHub issue:** #NN al archivo del ticket.
    3. Agregar el número de issue a la fila del README.md del índice correspondiente.

    Al empezar a trabajar un ticket, se autoasigna el issue: gh issue edit <N> --add-assignee @me.

     

    4. Flujo de ramas y PRs (sin tablero, sin CI)

    • Nunca commit/push directo a dev ni main — ni siquiera para docs. Siempre rama desde dev.
    • Los PR apuntan a dev (--base dev); main se promueve aparte.
    • Cada PR linkea su issue con 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.
    • Nunca cerrar un issue antes de que su PR esté mergeado.

     

    5. OpenSpec — especificación dirigida por IA

     

    Usamos OpenSpec para que los cambios pasen por un flujo de artefactos antes de tocar código. Vive en openspec/.

     

    5.1 Configuración

     

    PiezaRol
    openspec/config.yamlApunta 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).

    5.2 Flujo de trabajo

     

    Skills dedicadas manejan cada fase: opsx:proposeopsx:applyopsx:archive (y opsx:explore / opsx:sync de apoyo).

    • Propose: genera propuesta + specs delta + design + tasks de una. El schema recomienda Opus para la fase de propuesta (más capaz para diseño).
    • Apply: implementa las tasks del change.
    • Archive: finaliza y mueve el change a archive/.
    Regla nuestra sobre opsx: después de 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.

    5.3 Loop benéfico: el plan genera tickets nuevos

    A veces, mientras corríamos el plan (con Opus), el modelo detectaba partes sin implementar o trabajo parcial que el ticket original no contemplaba. En vez de meterlo todo en el mismo cambio (y reventar el scope y los tokens), eso se delegaba: se creaban tickets nuevos para ese trabajo. Así el propio proceso de planificar alimenta el backlog con gaps reales encontrados en el código — un loop benéfico donde implementar descubre lo que falta, y lo que falta vuelve como ticket priorizado (ej. API-46 nació como follow-up de QA de API-44).

    5.4 Mantener el fork al día: /update-openspec

    Nuestro 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:

    1. openspec update — regenera los archivos de instrucciones del paquete para la versión instalada.
    2. Ubica el commit del fork (snapshot del upstream al momento de bifurcar) y la ruta del upstream actual en el store de pnpm.
    3. Diff de mejoras upstream: compara el upstream-al-forkear contra el upstream-de-hoy → qué mejoró el paquete desde que lo forkeamos.
    4. Diff de nuestra divergencia: compara el baseline del fork contra nuestro schema actual → qué customizamos nosotros.
    5. Merge guiado: muestra los dos diffs lado a lado para incorporar las mejoras upstream sin pisar nuestras customizaciones.

     

    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).

    6. Graphify — grafo de conocimiento del repo

     

    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.

    6.1 Costo inicial vs. mantenimiento

    Si bien la creación inicial de los nodos tiene costo (esa pasada usa el LLM para extraer y etiquetar relaciones — se ve en 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.

    6.2 Cómo lo usamos

    • Para preguntas de código: primero graphify query "<pregunta>"; graphify path "<A>" "<B>" para relaciones; graphify explain "<concepto>" para algo puntual.
    • Para navegación amplia: graphify-out/wiki/index.md en vez de browsear el código crudo.
    • GRAPH_REPORT.md solo para revisión de arquitectura amplia.
    • Tras modificar código: make graph y commitear graph.json + GRAPH_REPORT.md.
    No corremos graphify hook install — reinstala el auto-rebuild que genera conflictos para el equipo. El refresh es manual y deliberado.

    6.3 Forzado por hooks

    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.

     

    7. Superpowers y skills

     

    Usamos Superpowers (framework de skills) más skills propias del proyecto. La regla: si una skill aplica, se usa antes de responder.

     

    CategoríaEjemplos
    Proceso (Superpowers)brainstorming, systematic-debugging, test-driven-development, writing-plans, verification-before-completion
    OpenSpecopsx: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
    Conocimientographify
    Mantenimiento de infraestructuraupdate-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.

    8. Sin CI: qué implica y cómo lo compensamos

    No tenemos CI. No hay pipeline que corra tests/lints en cada push. Sin esa red automática, la verificación tiene que pasar sí o sí localmente y la disciplina pre-commit es obligatoria, no opcional.

    Lo que la suple:

    • Todo corre en Docker vía make (make test, make migrate, make simulate...). Postgres únicamente — no existe fallback a SQLite y no se agrega.
    • Git hooks locales (Husky), que actúan como mini-CI:
      HookCuándoQué hace
      .husky/pre-commitcada commitUI: pnpm lint-staged + typecheck
      .husky/pre-pushcada pushBackend: make test-push (levanta el stack, corre pytest, lo baja)
    • Gate pre-PR (en orden, no se saltea): capturar aprendizajes en docs → checklist de docs → checklist de fixtures → code review del diff → recién ahí commit/push/PR.
    • Fixtures como verificación de capacidad: cualquier cambio de capacidad de la API actualiza make simulate / make populate en el mismo commit. Sin CI, los fixtures son la prueba viva de que el endpoint funciona end-to-end.
    • Docs en el mismo commit que el comportamiento: los contratos en 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.

    9. Reglas que le metimos a Claude

    Las reglas viven en archivos versionados y se cargan automáticamente:

     

    ArchivoQué fija
    .claude/CLAUDE.mdReglas 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.mdPrincipios 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/*.mdGuías puntuales cargadas según la tarea: git-workflow, migrations, docker, docs-maintenance.
    .claude/settings.jsonHooks que fuerzan graphify antes de grep/lectura de código (§6.3).
    api/CLAUDE.md / ui/CLAUDE.mdReglas 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.

    Qué NO tocar / qué evitar

    • No agregar fallback a SQLite — Postgres only.
    • No commitear/pushear a dev ni main.
    • No construir contra endpoints de specs/tickets sin verificarlos en los contratos.
    • No correr graphify hook install (rompe al equipo).
    • No cargar la base de conocimiento completa por defecto.
    • No cerrar issues antes del merge.

    10. Cómo sería esto con tokens y presupuesto infinitos en construcción

    Sección viva — la vamos completando juntos. Idea: registrar qué decisiones tomamos por la restricción de tokens, y qué haríamos si esa restricción desapareciera.

     

    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 redCI 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 demandaContexto amplio sin compactar; cargar toda la base de conocimiento relevante de entrada.
    Tickets S/XS directos, planning pesado solo para L/XLPlanning + grilling formal para todo cambio, con validación adversarial previa a cada edit.

    Qué conservaríamos igual (no es deuda — es así por elección)

    Aun con plata de sobra mantendríamos: el proceso de OpenSpec (propose → apply → archive), graphify, y todo el harness de carga de contexto según el trabajo a realizar (cargar solo el doc/contrato/subgrafo que la tarea concreta necesita). Esto no nació de la restricción de tokens: nos da precisión y trazabilidad, y lo querríamos igual con presupuesto infinito.

    Qué mejoraríamos

    Mover 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?