Skip to content

Orquestación de fases SDD

Este dominio cubre cómo el orquestador decide qué secuencia de fases ejecutar para un cambio dado, cómo esas fases se implementan como agentes/skills delegables, y cómo el catálogo de skills se resuelve en tiempo de sesión.

propose → spec → design → tasks → apply → verify → archive

No todo cambio necesita el ciclo entero. El orquestador (agents/sdd-orchestrator.agent.md) evalúa la tabla routing de openspec/config.yaml de arriba a abajo y activa la primera ruta que coincide con la clasificación del cambio y el estado del proyecto.

scripts/lib/route-dispatcher.js es el corazón puro (sin IO) de esta lógica: exporta funciones puras y listas de constantes conocidas (KNOWN_PHASES, KNOWN_GATES, KNOWN_REVIEWERS, KNOWN_CLASSES, KNOWN_COSTS) que actúan como allowlist de validación para openspec/config.yaml.

ConceptoDefinición
RoutePerfil de flujo con una lista ordenada de fases y gates. Representa una intención de usuario distinta.
PhaseSub-agente SDD delegado que produce un artefacto. Corre en el orden declarado dentro de la ruta.
GateChequeo o advertencia en un punto específico de la ruta; no produce artefacto principal, registra su resultado en state.yaml.gates.
Context (ctx)Objeto con señales del entorno del cambio actual, provisto por el orquestador.
Derived signalClave booleana de ctx calculada determinísticamente (p. ej. specs_empty_with_code).
RutaClasificaciónCuándoFases
foundationnormal, high-riskProyecto vacíosdd-foundation
federatednormal, high-riskWorkspace multi-reposdd-workspace → propose → spec → design → tasks → apply → verify → archive
bugfixsmall, normalIntención explícita de bugfixsdd-explore → tasks → apply → verify → archive
brownfieldnormal, high-riskCódigo sin specssdd-baseline (en tandas por dominio)
refactorsmall, normalIntención explícita de refactordesign → tasks → apply → verify → archive
hotfixtrivial, smallParche de emergenciaapply → verify → archive
standardnormal, high-riskProyecto activo (default)propose → spec → design → tasks → apply → verify → archive
litetrivial, smallCambio pequeño, bajo riesgopropose → tasks → apply → verify → archive

Una ruta NUNCA debe agregarse para variar un solo toggle de configuración — para eso existen los gates o las opciones de fase.

  • clarify — el orquestador detecta ambigüedad con señales estructuradas (preguntas abiertas, falta de scope, cambios contraditorios) antes de continuar. Solo activa cuando hay evidencia real de ambigüedad; no a la primera duda.
  • 4r-review-gate — tras un sdd-verify exitoso, el flujo selectivo 4R:
    1. La compuerta generalista (review-change) normaliza la evidencia del cambio (diff, paths, capabilities, findings) mediante review-dimensions.js.
    2. Despacha solo los sub-agentes revisores justificados: cambios normales activan máximo dos (review-risk, review-readability, review-reliability, review-resilience); cambios high-risk activan los cuatro.
    3. review-gate-state.js gestiona el estado de la compuerta; review-lineage.js congela linaje, findings inmutables y presupuesto de correcciones.
  • impact — en rutas federadas, evalúa impacto cross-repo antes de implementar.
  • brownfield-advisory — informa sobre el estado de baseline antes de ejecutar sdd-baseline.
  • review-workload — guarda el presupuesto de revisión de ~400 líneas por PR.

Agentes y skills: dos capas de la misma unidad de trabajo

Section titled “Agentes y skills: dos capas de la misma unidad de trabajo”

Cada fase SDD tiene dos artefactos fuente (el detalle completo del dominio vive en Agentes y Skills):

  • agents/{phase}.agent.md — definición del agente (frontmatter + comportamiento).
  • skills/{phase}/SKILL.md — el procedimiento detallado que el agente ejecutor debe seguir al pie de la letra.
  • commands/{phase}.prompt.md — comando slash visible que rutea al orquestador.

Todos los agentes son artefactos fuente para el generador (dominio Arquitectura y generador multi-target): se transforman al layout nativo de cada target sin reescribir su contenido de comportamiento.

El catálogo de skills se organiza en tiers bajo skills/:

  1. Skills de fase SDD (skills/sdd-{phase}/SKILL.md) — un procedimiento por fase.
  2. skills/_shared/ — protocolo común (sdd-phase-common.md) que todo agente de fase carga: envelope de retorno, contrato de memoria operativa, guardas de revisión, idioma/mentoría.
  3. Skills de stack (stack-react, stack-go, stack-python, etc.) — reglas compactas inyectadas cuando el proyecto declara esas capacidades.
  4. Skills de utilidad (caveman-*, chained-pr, branch-pr, gh-release-notes, harness-audit, etc.) — herramientas invocables bajo demanda, no atadas a una fase SDD.

Toda skill de fase SDD (skills/sdd-*) declara un ORCHESTRATOR GATE: si el orquestador carga la skill directamente, debe detenerse y delegar a un sub-agente ejecutor en vez de ejecutar las instrucciones inline. Cada sub-agente ejecutor sigue su propia skill sin lanzar más sub-agentes.

El árbol skills/ se compila en un artefacto JSON compacto (.ospec/cache/skill-registry.cache.json) que agentes y hooks leen sin reescanear el sistema de archivos. El detalle de su compilación, su ciclo de vida y el mecanismo de fingerprint que gestiona SessionStart vive en Agentes y Skills.

Por qué la arquitectura está diseñada así

Section titled “Por qué la arquitectura está diseñada así”

Separar el routing declarativo (openspec/config.yaml) de su motor de evaluación puro (route-dispatcher.js) permite testear cada ruta con fixtures de configuración sin montar un orquestador completo, y permite que un usuario agregue/edite rutas propias sin tocar código. Las constantes KNOWN_* actúan como contrato de validación temprana: una ruta con un nombre de fase o gate no reconocido falla rápido en vez de comportarse de forma impredecible en producción.

  • Agregar una ruta: añadir una entrada en openspec/config.yaml::routing con name, classification, conditions, phases, gates, description, cost — usando solo nombres de KNOWN_PHASES/KNOWN_GATES.
  • Agregar una fase nueva: crear agents/{phase}.agent.md, skills/{phase}/SKILL.md, y añadir el nombre a KNOWN_PHASES en route-dispatcher.js.
  • Agregar un gate: implementarlo como módulo evaluado en el hook point correspondiente y registrarlo en KNOWN_GATES.
  • El orden de evaluación de rutas importa: la primera coincidencia gana. Rutas más específicas deben ir antes que rutas genéricas como standard.
  • Cambiar el contrato del envelope de retorno (skills/_shared/sdd-phase-common.md) afecta a todos los agentes de fase simultáneamente — requiere revisar scripts/lib/result-envelope.js y su espejo Go (internal/resultenvelope).
  • Los agentes de fase son ejecutores, no orquestadores: no deben delegar en más sub-agentes salvo instrucción explícita del skill.
  • Cambiar el esquema de evidencia de review-dimensions.js invalida el fingerprint de evidencias previas — requiere versionado del schema.
  • /scripts/lib/route-dispatcher.jsgit log: 1814f01 (4R selectivo + generalista), f902f13 (clarify condicionado)
  • /openspec/config.yaml (bloque routing)
  • /agents/sdd-orchestrator.agent.md, /agents/*.agent.md
  • /skills/_shared/sdd-phase-common.md, /skills/sdd-*/SKILL.md
  • /scripts/lib/review-dimensions.js — normaliza evidencia y deriva especialistas 4R
  • /scripts/lib/review-gate-state.js — estado de la compuerta de revisión
  • /scripts/lib/review-lineage.js — linaje, findings inmutables, presupuesto correcciones
  • /scripts/lib/skill-registry.js, /scripts/hooks/session-start.js
  • /openspec/specs/routing/spec.md, /openspec/specs/agents/spec.md, /openspec/specs/skills/spec.md, /openspec/specs/skill-registry/spec.md