cdev-monorepo · git:20260815.1fe0773 · 2026-08-15 · sha256 e4001006c18dfb14
cdev-monorepo git:20260815.1fe0773A
Immutable. This exact content is served forever at /api/v1/blob/e4001006c18dfb14.
---
name: cdev-monorepo
description: Úsala cuando el usuario invoque /cdev-monorepo (con o sin argumentos) en un workspace multi-repo condicionado (tiene workspace/repos.yaml y docs/develop/ global) — ejecuta de forma autónoma el SYSTEM_BATCH activo coordinando en paralelo los CDev locales de los repos afectados, reconcilia estados y cierra batches con verificación global.
---
# CDev Monorepo — bucle orquestador
Equivalente global de `/cdev` para un workspace multi-repo condicionado por `bootstrap-monorepo`.
Mandato de **autonomía elevada**: trabaja hasta bloqueo real, nunca para a preguntar "¿y ahora
qué?". El workspace es la memoria: `SPRINTS.md` global = plan · `AGENT_PROGRESS.md` global =
handoff · `state.lock.json` = snapshot · el estado local vive en cada repo.
Invocación: `/cdev-monorepo` (reanudar) · `/cdev-monorepo sprint 02` · `/cdev-monorepo batch SYS-02-B01`.
## Invariante que protege todo el mecanismo
```text
Trabajo global no rompe continuidad local.
Trabajo local no rompe visibilidad global.
```
Tras una sesión de workspace, `cd repo && /cdev` debe poder continuar normal. Tras trabajo
independiente en un repo, la siguiente sesión de workspace **detecta y reconcilia** ese progreso.
## Arranque + reconciliación (cada invocación)
1. Lee en orden: `CLAUDE.md` global → `docs/develop/AGENT_EXECUTION_PROTOCOL.md` → `SPRINTS.md`
→ `AGENT_PROGRESS.md` (última entrada) → `workspace/repos.yaml` → `repo-graph.yaml` →
`state.lock.json`.
2. Para cada repo **relevante al sprint/batch activo** (no cargues repos que no participan):
su `CLAUDE.md`, `SPRINTS.md`, `AGENT_PROGRESS.md`, `git status/branch/log`.
3. Reconcilia. **El repo es la fuente de verdad de su estado local**: sprint renumerado, batch
terminado fuera del workspace, commits nuevos, rama distinta, bloqueo local → el workspace
se actualiza; jamás al revés. Divergencia (workspace dice DONE, repo dice IN_PROGRESS) →
gana el repo. El workspace nunca falsifica estado local para cuadrar su plan.
## Bucle (repetir hasta bloqueo real)
1. **Selecciona**: primer SYSTEM_BATCH `READY`/`IN_PROGRESS` del SYSTEM Sprint `ACTIVE` — y
todos los demás cuyo DAG los haga runnables ya (ejecución por olas, no batch a batch).
Si un batch está `PLANNED` (referencias o sync points sin resolver) → invoca la skill
`cdev-monorepo-planner` antes de ejecutarlo.
2. **Resuelve referencias**: cada referencia local requerida existe en el `SPRINTS.md` del repo,
con numeración válida que respeta la secuencia local y sus `Wait-for` declarados (artefactos
de sync del planner). Referencia rota → reparar vía planner, no improvisar.
3. **Construye el DAG** del batch/ola con los `depends_on` de sus referencias (solo referencias
del batch; repos no referenciados no aparecen). Un ciclo en el DAG = error de planificación:
parar ese batch y reportarlo, no desempatar a ojo.
4. **Ejecuta en paralelo por repo**: despacha un agente `monorepo-repo-runner` por cada
referencia runnable, **en paralelo solo cuando son de repos distintos**; **un único runner
por repo, siempre**. Dos niveles de paralelismo, y solo dos:
- **Entre repos**: referencias sin dependencia mutua corren a la vez (olas del DAG).
- **Dentro del repo**: los batches son SIEMPRE secuenciales (el orden local es sagrado;
jamás dos batches del mismo repo a la vez). Lo que sí se paraleliza dentro del batch son
**tareas heterogéneas vía subagentes del cdev local**: p.ej. un subagente investigando
read-only en el working tree del repo productor los endpoints reales, otro inventariando
componentes reutilizables del propio repo, y el principal construyendo — que al integrar
consume el informe del investigador, no su imaginación. Testing funcional o búsqueda en
fuentes externas siguen el mismo patrón. La decisión de crear esos subagentes es del
`/cdev` local; el workspace no reparte ese trabajo.
- **Guardrail autobloqueante** (aplica a todo subagente y al principal): ningún endpoint,
campo, tipo o estructura cross-repo se integra sin estar confirmado por artefacto
`Wait-for`, contrato del workspace o código real leído del repo productor. Falta la
confirmación → se espera o se rota de tarea; inventarla "para avanzar" está prohibido.
Los subagentes investigadores en repos vecinos son **solo lectura**: escribir en otro
repo sigue siendo gate absoluto.
Reglas del despacho:
- El runner ejecuta SIEMPRE **el `/cdev` propio del repo** acotado a la referencia — nunca
implementa por su cuenta.
- El prompt del runner incluye: referencia (sprint/batch local), `system_batch`, contrato
aplicable, sus `Wait-for` (qué artefacto buscar, en qué path de qué repo) y la política
de ramas (§ abajo).
- Runner que devuelve `WAITING` (su Wait-for no existe aún): reasigna ese slot a otra
referencia runnable de otro repo y reintenta la que espera cuando su productor cierre —
nunca dejes el slot ocioso si hay trabajo runnable (blocked-but-not-idle también aquí).
5. **Recoge evidencia** al terminar cada runner (no esperes a toda la ola para registrar):
status/branch/SHA/verificación por referencia → `AGENT_PROGRESS.md` global +
`state.lock.json` + `workspace/snapshots/` si aplica.
6. **Verifica globalmente** con `monorepo-system-tester` al nivel que el batch declara
(L0 evidencia local · L1 contratos · L2 integración parcial · L3 end-to-end). Batch de un
solo repo con acceptance demostrable local → L0, sin pruebas cross-repo artificiales.
7. **Cierra**:
```text
SYSTEM_BATCH DONE = ALL(referencias requeridas == DONE) AND acceptance global == PASS
```
Repos no referenciados no participan, no bloquean, no se abren "por si acaso".
8. **Auto-avanza**: siguiente ola runnable. Sprint de sistema completo → reporte global, Sprint
`DONE`, promueve el siguiente `PENDING`→`ACTIVE` si corresponde, sigue. Plan agotado →
invoca `cdev-monorepo-planner` en modo gap-analysis y deja el resultado como `PROPOSAL`
para ratificación humana; mientras tanto ejecuta trabajo global no gateado.
## Sincronización entre repos (pull, no push — y jamás mockear)
- Toda dependencia productor→consumidor se satisface con un **artefacto en disco** (reporte
técnico del batch productor, path declarado por el planner en el `Wait-for` de la referencia
consumidora). El productor lo publica como parte de su acceptance; el consumidor **va a
buscarlo** al working tree del repo productor y lo lee antes de integrar.
- Consumidor sin su artefacto: **no mockea el contrato del otro repo** para avanzar ni fabrica
evidencia de integración — devuelve `WAITING` y el orquestador lo reprograma. (Los stubs de
tests unitarios internos del propio repo siguen siendo legítimos; lo prohibido es fingir la
integración cross-repo.)
- La comunicación entre agentes va SIEMPRE por disco (repos + workspace), nunca por memoria
conversacional: cualquier runner puede morir y reanudarse leyendo el repo.
## Ramas y push (política del workspace)
- **Derivación**: la primera rama de trabajo de cada repo dentro de un SYSTEM Sprint se crea
**desde `develop`** de ese repo; los batches siguientes encadenan según la convención del
CDev local (típico: nueva rama desde la rama del batch anterior). El workspace no redefine
nombres de rama locales.
- **Push: nunca automático.** Al cerrar el SYSTEM Sprint, el push de las ramas resultantes lo
hace el humano. Si el usuario pide explícitamente "sube", se pushea **solo la rama de
trabajo** correspondiente — nunca `develop`/`main`, nunca con `--force`.
- Merge/PR/deploy: siempre gate humano.
## Blocked-but-not-idle (global)
Referencia `BLOCKED` → SYSTEM_BATCH `BLOCKED` con razón + decisión mínima que necesita el
humano. Continúa con: otra referencia independiente del mismo batch → otro SYSTEM_BATCH sin
dependencia → otro trabajo global no gateado. Nunca marcar como terminado lo bloqueado.
## Solo se para cuando
- Ningún trabajo global no gateado queda — di qué aprobaciones desbloquearían qué.
- Un gate humano bloquea y todo depende de él.
- Producto ausente: **prohibido inventar requisitos**; pregunta abierta en DECISIONS.
- Límite de cuota: actualizar `AGENT_PROGRESS.md` + `state.lock.json`, commit del workspace,
salir limpio. La reanudación retoma del workspace, no de memoria conversacional.
## Gates de seguridad (nunca elevados; gana siempre el más estricto)
Los gates de cada repo hijo prevalecen íntegros — este skill jamás los reduce. Una decisión
histórica documentada en un repo ("vía autorizada", DECISIONS antiguos) NUNCA cuenta como
aprobación viva de un gate en la sesión actual: el gate exige autorización humana presente. Además, a nivel
workspace: push a `main`/`develop` de cualquier repo · merge · deploy · migraciones/schema
remoto · secretos live · pagos reales · reescritura de historial · borrado de datos. Preparar
sí (drafts, comandos, manifests); ejecutar no. El workspace tampoco puede: alterar numeración
local, saltarse sprints locales por prisa del sistema, marcar DONE trabajo no demostrado, ni
convertir cambio local en global sin evidencia.