Pipeline

intake procesa requisitos a traves de un pipeline de 5 fases. Cada fase transforma los datos y los pasa a la siguiente.

Fuentes             Fase 1        Fase 2        Fase 3         Fase 4          Fase 5
(archivos/URLs) --> INGEST -----> ANALYZE ----> GENERATE ----> VERIFY -------> EXPORT
                    (parsers)     (LLM)        (templates)    (checks)        (output)
                       |             |              |              |               |
                 ParsedContent  AnalysisResult  Spec files   VerifyReport   Agent output
                                     |              |
                              Complexity      Adaptive
                             Assessment      Generation

Fase 1: Ingest

Modulo: ingest/ (12 parsers) Requiere LLM: No (excepto ImageParser)

Que hace

Toma archivos de requisitos en cualquier formato y los convierte en una estructura normalizada (ParsedContent). Soporta archivos locales, URLs, y stdin.

Flujo

Fuente --> parse_source() --> Registry --> Detecta formato --> Selecciona parser --> ParsedContent
  1. Resolucion de fuente: parse_source() determina el tipo de fuente:
    • Archivos locales -> pasan al registry
    • URLs HTTP/HTTPS -> se procesan con UrlParser
    • URIs de esquema (jira://, confluence://, github://, gitlab://) -> se resuelven via conectores API (descargan a archivos temporales)
    • Stdin (-) -> se lee como plaintext
    • Texto libre -> se trata como plaintext
  2. El Registry recibe la ruta del archivo
  3. Auto-detecta el formato por extension y contenido:
    • Extension directa: .md -> markdown, .pdf -> pdf, .docx -> docx
    • Subtipos JSON: Jira > GitLab Issues > GitHub Issues > Slack > YAML generico
    • Subtipos HTML: si contiene “confluence” o “atlassian” -> confluence
    • Fallback: plaintext
  4. Selecciona el parser registrado para ese formato (via plugin discovery o registro manual)
  5. El parser produce un ParsedContent normalizado

ParsedContent

Cada fuente parseada produce:

CampoTipoDescripcion
textstringTexto limpio extraido
formatstringIdentificador del formato (ej: "jira", "markdown")
sourcestringPath al archivo original
metadatadictPares clave-valor (autor, fecha, prioridad, etc.)
sectionslist[dict]Secciones estructuradas (titulo, nivel, contenido)
relationslist[dict]Relaciones entre items (blocks, depends on, relates to)

Validaciones

Antes de parsear, cada archivo pasa por validaciones centralizadas:

  • El archivo debe existir y ser un archivo regular (no directorio)
  • Tamano maximo: 50 MB (MAX_FILE_SIZE_BYTES)
  • Si el archivo esta vacio o solo tiene whitespace: error EmptySourceError
  • Encoding: intenta UTF-8 primero, fallback a latin-1

Ver Formatos de entrada para detalles de cada parser.


Fase 2: Analyze

Modulo: analyze/ Requiere LLM: Si (async via litellm.acompletion)

Que hace

Toma los ParsedContent de todas las fuentes y usa el LLM para extraer requisitos estructurados, detectar conflictos, evaluar riesgos y producir un diseno tecnico.

Sub-fases

ParsedContent[] --> Combine --> Extraction --> Dedup --> Validate --> Risk --> Design --> AnalysisResult

1. Combinar fuentes

Concatena el texto de todas las fuentes con separadores:

=== SOURCE 1: path/to/file.md (format: markdown) ===
[contenido]

---

=== SOURCE 2: path/to/jira.json (format: jira) ===
[contenido]

2. Extraccion (llamada LLM)

Envia el texto combinado al LLM con EXTRACTION_PROMPT. El LLM retorna JSON con:

  • Requisitos funcionales (FR-01, FR-02, …)
  • Requisitos no funcionales (NFR-01, NFR-02, …)
  • Conflictos entre fuentes (CONFLICT-01, …)
  • Preguntas abiertas (Q-01, Q-02, …)

El prompt se configura con: numero de fuentes, idioma, formato de requisitos (ears, user-stories, etc.).

3. Deduplicacion

Compara titulos de requisitos usando similaridad Jaccard (interseccion de palabras / union de palabras):

  • Threshold: 0.75 (75% de palabras en comun = duplicado)
  • Normaliza: lowercase, strip, colapsa whitespace
  • Deduplica funcionales y no funcionales por separado
  • Conserva la primera ocurrencia

4. Validacion

  • Conflictos: se filtran los que no tienen descripcion, fuentes, o recomendacion
  • Preguntas abiertas: se filtran las que no tienen texto de pregunta o contexto

5. Evaluacion de riesgos (opcional)

Si config.spec.risk_assessment = true, hace otra llamada LLM con RISK_ASSESSMENT_PROMPT. Produce una lista de riesgos (RISK-01, …) con:

  • IDs de requisitos asociados
  • Probabilidad e impacto (low/medium/high)
  • Categoria (technical, scope, integration, security, performance)
  • Mitigacion sugerida

6. Diseno (llamada LLM)

Tercera llamada LLM con DESIGN_PROMPT. Produce:

  • Componentes de arquitectura
  • Archivos a crear y modificar (path + descripcion + accion)
  • Decisiones tecnicas (decision, justificacion, requisito asociado)
  • Tareas con dependencias (DAG), estimacion en minutos, archivos, checks
  • Checks de aceptacion (command, files_exist, pattern_present, pattern_absent)
  • Dependencias externas del proyecto

AnalysisResult

El resultado completo contiene:

CampoTipoDescripcion
functional_requirementslist[Requirement]Requisitos funcionales (FR-XX)
non_functional_requirementslist[Requirement]Requisitos no funcionales (NFR-XX)
conflictslist[Conflict]Conflictos entre fuentes
open_questionslist[OpenQuestion]Preguntas sin responder
riskslist[RiskItem]Evaluacion de riesgos
designDesignResultDiseno tecnico con tareas y checks
duplicates_removedintCantidad de duplicados eliminados
total_costfloatCosto total del analisis en USD
model_usedstringModelo LLM utilizado

Control de costos

El LLMAdapter rastrea el costo de cada llamada:

  • Acumula total_cost, total_input_tokens, total_output_tokens
  • Despues de cada llamada, compara con max_cost_per_spec
  • Si se excede el presupuesto, lanza CostLimitError y el analisis se detiene
  • El costo se calcula via litellm.completion_cost()

Fase 2.5: Clasificacion de complejidad

Modulo: analyze/complexity.py Requiere LLM: No

Que hace

Antes de generar, se clasifica la complejidad de las fuentes para seleccionar el modo de generacion optimo. Esta clasificacion es heuristica (no usa LLM).

Criterios

ModoCondicionesConfianza
quick<500 palabras AND 1 fuente AND sin contenido estructuradoAlta
enterprise4+ fuentes O >5000 palabrasAlta
standardTodo lo que no es quick ni enterpriseMedia

Contenido estructurado incluye formatos como jira, confluence, yaml, github_issues, slack.

La clasificacion se puede sobreescribir con --mode en la CLI.


Fase 3: Generate

Modulo: generate/ Requiere LLM: No

Que hace

Toma el AnalysisResult y renderiza archivos Markdown/YAML usando templates Jinja2, mas un spec.lock.yaml para reproducibilidad. La cantidad de archivos generados depende del modo.

Generacion adaptativa

El AdaptiveSpecBuilder envuelve al SpecBuilder estandar y filtra los archivos segun el modo:

ModoArchivos generados
quickcontext.md, tasks.md
standardLos 6 archivos completos
enterpriseLos 6 archivos + riesgos detallados

Templates

Archivo generadoTemplateContenido principal
requirements.mdrequirements.md.j2FR, NFR, conflictos, preguntas abiertas
design.mddesign.md.j2Componentes, archivos, decisiones, dependencias
tasks.mdtasks.md.j2Tabla resumen + detalle por tarea
acceptance.yamlacceptance.yaml.j2Checks ejecutables por tipo
context.mdcontext.md.j2Info del proyecto, stack, riesgos
sources.mdsources.md.j2Fuentes, trazabilidad, conflictos

spec.lock.yaml

Archivo de reproducibilidad con:

CampoDescripcion
versionVersion del formato del lock (actualmente “1”)
created_atTimestamp ISO de creacion
modelModelo LLM utilizado
config_hashHash de la configuracion usada
source_hashesMapa de archivo -> SHA-256 (primeros 16 hex chars)
spec_hashesMapa de archivo spec -> SHA-256
total_costCosto total del analisis en USD
requirement_countCantidad de requisitos
task_countCantidad de tareas

Se usa para detectar si las fuentes cambiaron desde la ultima generacion (is_stale()).


Fase 4: Verify

Modulo: verify/ Requiere LLM: No

Que hace

Ejecuta los checks definidos en acceptance.yaml contra el directorio del proyecto. Produce un reporte con resultados.

Tipos de checks

TipoQue verificaCampos usados
commandEjecuta un comando shell y verifica exit code == 0command
files_existVerifica que todos los paths listados existenpaths
pattern_presentVerifica que patrones regex existen en archivos que matchean el globglob, patterns
pattern_absentVerifica que patrones regex NO existen en archivos que matchean el globglob, patterns

Formatos de reporte

FormatoClaseUso
terminalTerminalReporterTabla Rich con colores en la terminal
jsonJsonReporterJSON machine-readable
junitJunitReporterXML JUnit para CI (GitHub Actions, Jenkins)

Ver Verificacion para detalles completos.


Fase 5: Export

Modulo: export/ Requiere LLM: No

Que hace

Toma los archivos spec generados y los transforma en un formato listo para un agente IA especifico.

Formatos disponibles

FormatoQue generaMejor para
architectpipeline.yaml + copia de specAgentes basados en Architect
genericSPEC.md + verify.sh + copia de specCualquier agente / uso manual
claude-codeCLAUDE.md + .intake/tasks/ + verify.shClaude Code
cursor.cursor/rules/intake-spec.mdcCursor
kirorequirements.md + design.md + tasks.md (formato nativo)Kiro
copilot.github/copilot-instructions.mdGitHub Copilot

Ver Exportacion para detalles completos.


Flujo de datos completo

.md / .json / .pdf / .docx / .html / .yaml / .txt / .png / URLs
                           |
                   [ SOURCE RESOLUTION ]
                   (parse_source -> file, url, stdin, text)
                           |
                      [ INGEST ]
                      (12 parsers via plugin discovery)
                           |
                   list[ParsedContent]
                           |
                  [ COMPLEXITY CLASSIFICATION ]
                  (quick / standard / enterprise)
                           |
                      [ ANALYZE ]
                      (3 LLM calls)
                           |
                     AnalysisResult
                           |
                  [ ADAPTIVE GENERATE ]
                  (2-6 templates segun modo)
                           |
              specs/mi-feature/
              ├── requirements.md    (standard, enterprise)
              ├── design.md          (standard, enterprise)
              ├── tasks.md           (siempre)
              ├── acceptance.yaml    (standard, enterprise)
              ├── context.md         (siempre)
              ├── sources.md         (standard, enterprise)
              └── spec.lock.yaml
                           |
                      [ VERIFY ]         [ EXPORT ]
                           |                  |
                  VerificationReport     output/
                  (pass/fail/skip)       ├── pipeline.yaml  (architect)
                                         ├── SPEC.md        (generic)
                                         ├── verify.sh      (generic)
                                         ├── CLAUDE.md      (claude-code)
                                         ├── .cursor/rules/ (cursor)
                                         ├── .github/       (copilot)
                                         └── spec/          (copia)
                                                |
                                         [ FEEDBACK ]  (opcional)
                                                |
                                        FeedbackResult
                                        (sugerencias + enmiendas)

                                                |
                                         [ MCP SERVER ]  (opcional)
                                                |
                                        Agentes IA consumen specs
                                        via tools, resources, prompts

MCP Server (opcional)

Modulo: mcp/ Requiere LLM: No (excepto intake_feedback tool)

Que hace

Expone las specs como un servidor MCP (Model Context Protocol) para que cualquier agente IA compatible pueda consumirlas programaticamente. No es una fase del pipeline en si, sino una capa de consumo que se ubica despues del export.

Que expone

TipoCantidadDescripcion
Tools9Operaciones sobre specs (show, verify, validate, estimate, feedback, tasks, etc.)
Resources6Acceso directo a archivos spec via URIs intake://specs/{name}/{section}
Prompts2Templates estructurados para agentes (implement_next_task, verify_and_fix)

Transportes

TransporteUso
stdioAgentes locales (Claude Code, Claude Desktop). Default.
sseAgentes remotos via HTTP (Server-Sent Events).

Ver MCP Server para documentacion completa.


Watch Mode (opcional)

Modulo: watch/ Requiere LLM: No

Que hace

Monitorea el directorio del proyecto y re-ejecuta automaticamente los checks de verificacion cuando detecta cambios en archivos. Complementa la fase de Verify con un ciclo continuo durante el desarrollo.

Flujo

                    [ WATCH ]
                        |
    Detecta cambios --> Filtra ignorados --> Re-ejecuta verify --> Muestra resultado
         ^                                                              |
         └──────────────────────────────────────────────────────────────┘

Usa watchfiles (Rust-based) con debouncing configurable y patrones de exclusion.

Ver Watch Mode para documentacion completa.


Feedback Loop (opcional)

Modulo: feedback/ Requiere LLM: Si (async via litellm.acompletion)

Que hace

Cierra el ciclo entre verificacion e implementacion. Cuando checks fallan, analiza las causas y sugiere correcciones tanto a la implementacion como a la spec.

Flujo

VerificationReport (checks fallidos)
         |
   [ ANALYZE FAILURES ]     (llamada LLM)
         |
   FeedbackResult
   ├── FailureAnalysis[]     (causa raiz + sugerencia por cada fallo)
   ├── SpecAmendment[]       (enmiendas propuestas a la spec)
   ├── summary               (resumen general)
   └── estimated_effort      (small / medium / large)
         |
   [ APPLY? ]               (si --apply o auto_amend_spec)
         |
   Spec actualizada

Componentes

ComponenteQue hace
FeedbackAnalyzerAnaliza fallos con LLM, produce FeedbackResult
SuggestionFormatterFormatea sugerencias para terminal o agente (generic, claude-code, cursor)
SpecUpdaterPreview y aplicacion de enmiendas a los archivos spec

Modelo de datos

DataclassCampos principales
FailureAnalysischeck_name, root_cause, suggestion, severity, affected_tasks, spec_amendment
SpecAmendmenttarget_file, section, action (add/modify/remove), content
FeedbackResultfailures, summary, estimated_effort, total_cost
AmendmentPreviewamendment, current_content, proposed_content, applicable, reason
ApplyResultapplied, skipped, details

Ver Feedback para documentacion completa.