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/ (11 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://) → 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 > 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 Verificación 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 Exportación 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 ]
                      (11 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)

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.