@imolko/ultra-agent 0.1.0-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +93 -0
- package/bin/cli.js +2 -0
- package/dist-node/bin.d.ts +2 -0
- package/dist-node/bin.d.ts.map +1 -0
- package/dist-node/bin.js +5 -0
- package/dist-node/bin.js.map +1 -0
- package/dist-node/cli.d.ts +41 -0
- package/dist-node/cli.d.ts.map +1 -0
- package/dist-node/cli.js +170 -0
- package/dist-node/cli.js.map +1 -0
- package/dist-node/index.d.ts +14 -0
- package/dist-node/index.d.ts.map +1 -0
- package/dist-node/index.js +40 -0
- package/dist-node/index.js.map +1 -0
- package/dist-node/init-lint.d.ts +43 -0
- package/dist-node/init-lint.d.ts.map +1 -0
- package/dist-node/init-lint.js +84 -0
- package/dist-node/init-lint.js.map +1 -0
- package/dist-node/manifest.d.ts +33 -0
- package/dist-node/manifest.d.ts.map +1 -0
- package/dist-node/manifest.js +59 -0
- package/dist-node/manifest.js.map +1 -0
- package/dist-node/materializer.d.ts +52 -0
- package/dist-node/materializer.d.ts.map +1 -0
- package/dist-node/materializer.js +194 -0
- package/dist-node/materializer.js.map +1 -0
- package/dist-node/package-root.d.ts +5 -0
- package/dist-node/package-root.d.ts.map +1 -0
- package/dist-node/package-root.js +17 -0
- package/dist-node/package-root.js.map +1 -0
- package/dist-node/payload.d.ts +22 -0
- package/dist-node/payload.d.ts.map +1 -0
- package/dist-node/payload.js +49 -0
- package/dist-node/payload.js.map +1 -0
- package/dist-node/pointer-hub.d.ts +22 -0
- package/dist-node/pointer-hub.d.ts.map +1 -0
- package/dist-node/pointer-hub.js +50 -0
- package/dist-node/pointer-hub.js.map +1 -0
- package/dist-node/publication.cli.d.ts +9 -0
- package/dist-node/publication.cli.d.ts.map +1 -0
- package/dist-node/publication.cli.js +17 -0
- package/dist-node/publication.cli.js.map +1 -0
- package/dist-node/publication.d.ts +23 -0
- package/dist-node/publication.d.ts.map +1 -0
- package/dist-node/publication.js +47 -0
- package/dist-node/publication.js.map +1 -0
- package/dist-node/reconcile.cli.d.ts +11 -0
- package/dist-node/reconcile.cli.d.ts.map +1 -0
- package/dist-node/reconcile.cli.js +39 -0
- package/dist-node/reconcile.cli.js.map +1 -0
- package/dist-node/reconcile.d.ts +30 -0
- package/dist-node/reconcile.d.ts.map +1 -0
- package/dist-node/reconcile.js +51 -0
- package/dist-node/reconcile.js.map +1 -0
- package/dist-node/ship/prompts/fix.md +22 -0
- package/dist-node/ship/prompts/implement.md +34 -0
- package/dist-node/ship/prompts/review.md +28 -0
- package/dist-node/ship/ship.agent.d.ts +22 -0
- package/dist-node/ship/ship.agent.d.ts.map +1 -0
- package/dist-node/ship/ship.agent.js +142 -0
- package/dist-node/ship/ship.agent.js.map +1 -0
- package/dist-node/ship/ship.args.d.ts +15 -0
- package/dist-node/ship/ship.args.d.ts.map +1 -0
- package/dist-node/ship/ship.args.js +93 -0
- package/dist-node/ship/ship.args.js.map +1 -0
- package/dist-node/ship/ship.context.d.ts +12 -0
- package/dist-node/ship/ship.context.d.ts.map +1 -0
- package/dist-node/ship/ship.context.js +3 -0
- package/dist-node/ship/ship.context.js.map +1 -0
- package/dist-node/ship/ship.d.ts +4 -0
- package/dist-node/ship/ship.d.ts.map +1 -0
- package/dist-node/ship/ship.js +221 -0
- package/dist-node/ship/ship.js.map +1 -0
- package/dist-node/ship/ship.mr.d.ts +9 -0
- package/dist-node/ship/ship.mr.d.ts.map +1 -0
- package/dist-node/ship/ship.mr.js +171 -0
- package/dist-node/ship/ship.mr.js.map +1 -0
- package/dist-node/ship/ship.output.d.ts +9 -0
- package/dist-node/ship/ship.output.d.ts.map +1 -0
- package/dist-node/ship/ship.output.js +21 -0
- package/dist-node/ship/ship.output.js.map +1 -0
- package/dist-node/ship/ship.tracker.d.ts +37 -0
- package/dist-node/ship/ship.tracker.d.ts.map +1 -0
- package/dist-node/ship/ship.tracker.js +220 -0
- package/dist-node/ship/ship.tracker.js.map +1 -0
- package/dist-node/version.cli.d.ts +9 -0
- package/dist-node/version.cli.d.ts.map +1 -0
- package/dist-node/version.cli.js +30 -0
- package/dist-node/version.cli.js.map +1 -0
- package/dist-node/version.d.ts +24 -0
- package/dist-node/version.d.ts.map +1 -0
- package/dist-node/version.js +76 -0
- package/dist-node/version.js.map +1 -0
- package/docs/adr/ADR-0000-proceso-y-formato-de-adrs.md +115 -0
- package/docs/adr/foundational/A-001-clean-architecture-4-capas.md +88 -0
- package/docs/adr/foundational/A-002-cqrs-semantico.md +58 -0
- package/docs/adr/foundational/A-003-tdd.md +97 -0
- package/docs/adr/foundational/A-005-either-return-custom-methods.md +80 -0
- package/docs/adr/foundational/A-006-feature-completion-criteria.md +47 -0
- package/docs/adr/foundational/A-007-data-contract-fail-fast.md +109 -0
- package/docs/adr/foundational/A-008-bounded-context-decomposition.md +130 -0
- package/docs/adr/foundational/A-009-use-case-taxonomy.md +99 -0
- package/docs/adr/foundational/A-010-propiedad-emision-eventos-dominio.md +95 -0
- package/docs/adr/foundational/A-011-characterization-first-refactoring.md +90 -0
- package/docs/adr/foundational/A-012-helm-mecanismo-primario-despliegue.md +67 -0
- package/docs/adr/foundational/A-013-contrato-settings-unica-fuente-configuracion.md +74 -0
- package/docs/adr/foundational/A-014-generacion-artefactos-despliegue-desde-contrato-settings.md +75 -0
- package/docs/adr/foundational/A-015-cloudevents-estandar-eventos.md +85 -0
- package/docs/adr/foundational/A-016-cicd-gitlab-pipeline-raiz-pipelines-modulares.md +92 -0
- package/docs/adr/foundational/A-017-taxonomia-repositorios-librerias-sistemas.md +93 -0
- package/docs/adr/foundational/A-018-practicas-build-imagenes-docker.md +85 -0
- package/docs/adr/foundational/A-019-convenciones-autoria-helm-charts.md +97 -0
- package/docs/adr/foundational/A-020-entorno-desarrollo-estandarizado-devcontainer.md +58 -0
- package/docs/adr/foundational/A-022-formato-reporte-tests-ctrf.md +55 -0
- package/docs/adr/foundational/A-023-composicion-bloques-prompt-agentes.md +65 -0
- package/docs/adr/foundational/A-024-features-slices-verticales-portables.md +41 -0
- package/docs/adr/foundational/A-025-anatomia-mecanica-feature-puertos-adaptadores-drivers.md +104 -0
- package/docs/adr/foundational/A-026-infraestructura-compartida.md +44 -0
- package/docs/adr/foundational/A-027-patron-wiring-entry-point.md +67 -0
- package/docs/adr/foundational/A-029-verbos-intencion-metodos-lado-negocio.md +54 -0
- package/docs/adr/foundational/A-030-global-development-tooling.md +52 -0
- package/docs/adr/foundational/A-031-ubiquitous-language.md +64 -0
- package/docs/adr/foundational/A-032-domain-artifact-documentation-format.md +128 -0
- package/docs/adr/foundational/A-033-estandar-mensajes-commit.md +127 -0
- package/docs/adr/foundational/A-034-canonical-skill-set.md +64 -0
- package/docs/adr/foundational/A-035-captura-ideas-reanclaje-candies.md +51 -0
- package/docs/adr/foundational/A-036-adopcion-wayfinder-ortogonalidad-labels.md +37 -0
- package/docs/adr/foundational/A-037-formalizacion-taxonomia-labels.md +98 -0
- package/docs/adr/foundational/A-038-issues-referencian-skills-nombre.md +54 -0
- package/docs/adr/foundational/A-039-pipeline-ship-issues-hijos-spec.md +64 -0
- package/docs/adr/foundational/A-040-punteros-configuracion-repo-skills.md +44 -0
- package/docs/adr/foundational/A-041-estrategia-de-ramas.md +45 -0
- package/docs/adr/foundational/A-042-formato-documentos-issue-tracker.md +78 -0
- package/docs/adr/foundational/A-043-vocabulario-etiquetas-adrs.md +42 -0
- package/docs/adr/foundational/A-044-composicion-funcional-procesos-operaciones.md +44 -0
- package/docs/adr/foundational/A-045-guardrails-aplicables-no-directrices.md +48 -0
- package/docs/adr/foundational/A-046-metricas-de-forma-y-legibilidad-del-codigo.md +50 -0
- package/docs/adr/foundational/A-047-dependencias-explicitas-sin-globales-ambientales.md +40 -0
- package/docs/adr/foundational/A-048-cobertura-minima-codigo.md +39 -0
- package/docs/adr/foundational/A-049-materializacion-bucle-guardrails-extension-nativa-pi.md +49 -0
- package/docs/adr/foundational/A-050-el-caso-de-uso-pide-al-dominio-no-lee-su-representacion.md +50 -0
- package/docs/adr/foundational/A-051-orden-imports-por-distancia.md +47 -0
- package/docs/adr/foundational/A-052-distribucion-metodologia-paquete-versionado.md +42 -0
- package/docs/adr/foundational/A-053-errores-compartidos-entre-features-dos-hogares-por-capa.md +43 -0
- package/docs/adr/foundational/A-054-contrato-costura-driver-port-raw-data-canal-error.md +65 -0
- package/docs/adr/foundational/index.md +98 -0
- package/docs/adr/index.md +19 -0
- package/docs/adr/python/P-001-dependencias-por-feature-fastapi-depends.md +63 -0
- package/docs/adr/python/P-002-inyeccion-token-por-request-sin-persistirlo.md +35 -0
- package/docs/adr/python/P-003-sqlalchemy-async-connection-pooling.md +59 -0
- package/docs/adr/python/P-004-serializer-json-custom-modelos-pydantic.md +47 -0
- package/docs/adr/python/P-005-patrones-pitfalls-nicegui.md +148 -0
- package/docs/adr/python/P-006-convenciones-pytest.md +96 -0
- package/docs/adr/python/P-007-ci-python-alineacion-poetry-version-unica.md +55 -0
- package/docs/adr/python/P-008-empaquetado-infraestructura-compartida-por-tecnologia.md +38 -0
- package/docs/adr/python/index.md +14 -0
- package/docs/adr/typescript/T-001-ddd-artifact-validation-zod-primitives.md +136 -0
- package/docs/adr/typescript/T-002-test-documentation-jsdoc.md +133 -0
- package/docs/adr/typescript/T-003-readme-formatting-domain-artifacts.md +51 -0
- package/docs/adr/typescript/T-005-input-optionality-use-case-not-entity.md +130 -0
- package/docs/adr/typescript/T-006-small-enums-inlined-zod-regex.md +77 -0
- package/docs/adr/typescript/T-007-controller-input-zod-schema.md +79 -0
- package/docs/adr/typescript/T-008-expressive-use-case-pipe.md +207 -0
- package/docs/adr/typescript/T-009-mdx-brace-escaping.md +80 -0
- package/docs/adr/typescript/T-010-stack-tooling-typescript-dominio.md +53 -0
- package/docs/adr/typescript/T-011-ultra-reporter-herramienta-canonica-documentacion.md +52 -0
- package/docs/adr/typescript/T-012-npm-workspaces-estructura-monorepo-clean-architecture.md +54 -0
- package/docs/adr/typescript/T-013-definicion-eventos-versionados-ultra-ddd.md +45 -0
- package/docs/adr/typescript/T-014-publicacion-distribucion-librerias-npm-semver.md +53 -0
- package/docs/adr/typescript/T-015-method-placement-definition.md +35 -0
- package/docs/adr/typescript/T-016-contrato-settings-zod.md +34 -0
- package/docs/adr/typescript/T-017-characterization-tests-golden-files.md +39 -0
- package/docs/adr/typescript/T-018-procedencia-campos-frontmatter.md +55 -0
- package/docs/adr/typescript/T-019-ultra-generator-herramienta-canonica-generacion.md +35 -0
- package/docs/adr/typescript/T-020-ultra-settings-herramienta-canonica-exportacion-despliegue.md +36 -0
- package/docs/adr/typescript/T-021-pipe-flujo-datos-operadores-semantica-contexto-inmutable.md +105 -0
- package/docs/adr/typescript/T-022-construction-is-execution-single-boundary.md +112 -0
- package/docs/adr/typescript/T-023-registry-cli-declara-dependencias-reales.md +84 -0
- package/docs/adr/typescript/T-024-paquete-ultra-agent-manifiesto-pi-peers-cli.md +39 -0
- package/docs/adr/typescript/T-025-publicacion-npm-trusted-publishing-procedencia.md +59 -0
- package/docs/adr/typescript/index.md +30 -0
- package/eslint/index.mjs +721 -0
- package/package.json +94 -0
- package/pi/extensions/handoff/README.md +92 -0
- package/pi/extensions/handoff/handoff-prompt.txt +9 -0
- package/pi/extensions/handoff/index.ts +296 -0
- package/pi/extensions/handoff/package.json +12 -0
- package/pi/extensions/qa-guardrail/README.md +108 -0
- package/pi/extensions/qa-guardrail/adapters/cli.ts +100 -0
- package/pi/extensions/qa-guardrail/adapters/eslint.ts +90 -0
- package/pi/extensions/qa-guardrail/adapters/registry.ts +45 -0
- package/pi/extensions/qa-guardrail/baseline.ts +74 -0
- package/pi/extensions/qa-guardrail/cerco.ts +134 -0
- package/pi/extensions/qa-guardrail/check.ts +185 -0
- package/pi/extensions/qa-guardrail/config.ts +189 -0
- package/pi/extensions/qa-guardrail/delta.ts +52 -0
- package/pi/extensions/qa-guardrail/feedback.ts +26 -0
- package/pi/extensions/qa-guardrail/index.ts +311 -0
- package/pi/extensions/qa-guardrail/nstop.ts +82 -0
- package/pi/extensions/qa-guardrail/package.json +12 -0
- package/pi/extensions/qa-guardrail/selection.ts +98 -0
- package/pi/extensions/qa-guardrail/types.ts +64 -0
- package/scripts/copy-assets.sh +10 -0
- package/scripts/reconcile-tags.sh +94 -0
- package/scripts/release-beta.sh +64 -0
- package/scripts/release-build.sh +53 -0
- package/scripts/release.sh +51 -0
- package/scripts/verify-adr-consistency.py +217 -0
- package/skills/code-review/SKILL.md +66 -0
- package/skills/codebase-design/SKILL.md +46 -0
- package/skills/configure-repo/SKILL.md +33 -0
- package/skills/diagnose-bug/SKILL.md +63 -0
- package/skills/domain-modeling/SKILL.md +56 -0
- package/skills/grill-me/SKILL.md +34 -0
- package/skills/i-have-an-idea/SKILL.md +166 -0
- package/skills/implement/SKILL.md +22 -0
- package/skills/research/SKILL.md +17 -0
- package/skills/ship/SKILL.md +26 -0
- package/skills/spike/SKILL.md +27 -0
- package/skills/tdd/SKILL.md +68 -0
- package/skills/tdd/references/deep-modules.md +53 -0
- package/skills/tdd/references/interface-design.md +74 -0
- package/skills/tdd/references/mocking.md +80 -0
- package/skills/tdd/references/refactoring.md +49 -0
- package/skills/tdd/references/tests.md +184 -0
- package/skills/to-specs/SKILL.md +141 -0
- package/skills/to-tasks/SKILL.md +143 -0
- package/skills/triage/SKILL.md +73 -0
- package/skills/ultra-generator/SKILL.md +263 -0
- package/skills/ultra-generator/references/aggregate-root.md +149 -0
- package/skills/ultra-generator/references/domain-event.md +174 -0
- package/skills/ultra-generator/references/entity.md +133 -0
- package/skills/ultra-generator/references/service.md +92 -0
- package/skills/ultra-generator/references/value-object.md +135 -0
- package/skills/wayfinder/SKILL.md +201 -0
- package/skills/workflow/SKILL.md +31 -0
- package/skills/writing-for-agents/SKILL-MECHANICS.md +32 -0
- package/skills/writing-for-agents/SKILL.md +86 -0
- package/skills/writing-for-agents/references/adrs.md +19 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# A-037: Formalización de la taxonomía de labels del issue tracker
|
|
2
|
+
|
|
3
|
+
**Estado**: Aceptado
|
|
4
|
+
|
|
5
|
+
**Fecha**: 2026-08-17
|
|
6
|
+
|
|
7
|
+
**originally**: imolko
|
|
8
|
+
|
|
9
|
+
**tags**: agentes, tooling
|
|
10
|
+
|
|
11
|
+
## Contexto
|
|
12
|
+
|
|
13
|
+
Las labels del issue tracker describen el trabajo. Cada label responde exactamente una pregunta, en un namespace con `::`.
|
|
14
|
+
|
|
15
|
+
Sin una taxonomía formal, esa disciplina se pierde: las labels se acumulan sueltas (una pregunta real sin namespace) u huérfanas (nombran un entregable o un sistema, no una pregunta sobre el trabajo), y el ciclo de vida queda con estados sin label o labels que funden dos preguntas ("¿está listo?" y "¿quién lo ejecuta?") — una máquina no determinista.
|
|
16
|
+
|
|
17
|
+
La ortogonalidad ([A-036](./A-036-adopcion-wayfinder-ortogonalidad-labels.md)) fija ese criterio para las labels de wayfinding; las demás dimensiones lo requieren igual.
|
|
18
|
+
|
|
19
|
+
## Decisión
|
|
20
|
+
|
|
21
|
+
Formalizar la taxonomía como **seis dimensiones ortogonales**. Cada label responde exactamente una pregunta y va namespaced con `::`.
|
|
22
|
+
|
|
23
|
+
### Las seis dimensiones
|
|
24
|
+
|
|
25
|
+
| Dimensión | Pregunta | Valores |
|
|
26
|
+
|-----------|----------|---------|
|
|
27
|
+
| `type::` | ¿qué clase de trabajo? | `bug`, `enhancement`, `idea` |
|
|
28
|
+
| `candy::` | ¿cuánto pesa? | `1`, `2`, `4`, `8` |
|
|
29
|
+
| `exec::` | ¿quién lo ejecuta? | `AFK`, `HITL` |
|
|
30
|
+
| `state::` | ¿en qué fase está? | `needs-info`, `ready`, `in-development`, `completed`, `approved`, `rejected`, `wontfix` |
|
|
31
|
+
| `priority::` | ¿qué urgencia? | `hot`, `warm` |
|
|
32
|
+
| `wayfinder::` | ¿qué artefacto de planificación? | los define [A-036](./A-036-adopcion-wayfinder-ortogonalidad-labels.md) |
|
|
33
|
+
|
|
34
|
+
### Reglas de gobierno
|
|
35
|
+
|
|
36
|
+
1. **Una pregunta por dimensión**: una label responde exactamente una pregunta; ninguna label carga dos significados.
|
|
37
|
+
2. **La ausencia es el estado por defecto**, nunca una label explícita: sin `state::` = sin ingesta; sin `candy::` = `?` (no estimable → wayfinding, [A-035](./A-035-captura-ideas-reanclaje-candies.md)); sin `priority::` = backlog. `candy::16` es vocabulario verbal ("partir"), nunca una label: un issue de 16 debe partirse o ir a wayfinding, no quedarse.
|
|
38
|
+
3. **Un issue es un work item**: las labels describen el trabajo, nunca el entregable. Por eso `documentation` no es un `type::` (la documentación es un *output* que vive en los READMEs de `domain/`, [A-031](./A-031-ubiquitous-language.md) y [A-032](./A-032-domain-artifact-documentation-format.md)) y `system::*` no es una dimensión (el sistema externo ya lo nombra la feature o el título).
|
|
39
|
+
4. **`wayfinder::*` sigue el principio de ortogonalidad** ([A-036](./A-036-adopcion-wayfinder-ortogonalidad-labels.md)).
|
|
40
|
+
5. **open/closed nativo solo en los terminales**: `state::approved` (verificado → despliegue) y `state::wontfix` cierran el issue; todo otro estado lo deja abierto.
|
|
41
|
+
|
|
42
|
+
### La máquina de estados
|
|
43
|
+
|
|
44
|
+
El ciclo de vida es **una sola máquina** (no dos): la **ingesta** — categorizar, verificar, escribir el brief — escribe la región de entrada, la **implementación** ([A-039](./A-039-pipeline-ship-issues-hijos-spec.md)) escribe la de ejecución, y `state::ready` es el puente — despojado de "quién" (eso es `exec::`).
|
|
45
|
+
|
|
46
|
+
- Sin label = sin ingesta (el estado por defecto, no una label).
|
|
47
|
+
- `state::needs-info`: esperando al reporter.
|
|
48
|
+
- `state::ready`: especificado, en cola para ser tomado; el modo lo da `exec::AFK`/`exec::HITL`.
|
|
49
|
+
- `state::in-development` (antes `developer`): en construcción.
|
|
50
|
+
- `state::completed`: desarrollo terminado, entregado a verificación (la verificación es el intervalo sin label hasta `approved`/`rejected`; `testing` desaparece).
|
|
51
|
+
- `state::approved`: verificado → despliegue → cierra el issue.
|
|
52
|
+
- `state::rejected`: falló la verificación → vuelve a `in-development`.
|
|
53
|
+
- `state::wontfix`: no se hará → cierra el issue.
|
|
54
|
+
|
|
55
|
+
### Migración
|
|
56
|
+
|
|
57
|
+
| Antes | Después |
|
|
58
|
+
|-------|---------|
|
|
59
|
+
| `AFK` / `HITL` | `exec::AFK` / `exec::HITL` |
|
|
60
|
+
| `ready-for-agent` | `state::ready` (el "quién" pasa a `exec::`) |
|
|
61
|
+
| `developer` | `state::in-development` |
|
|
62
|
+
| `approved` / `completed` / `rejected` | `state::approved` / `state::completed` / `state::rejected` |
|
|
63
|
+
| `hot` / `warm` | `priority::hot` / `priority::warm` |
|
|
64
|
+
| — | `state::needs-info`, `state::wontfix` (nuevas) |
|
|
65
|
+
| `testing` | — (retirada; la verificación es el intervalo sin label) |
|
|
66
|
+
| `ready-for-human` | — (nunca fue una label: es `state::ready` + `exec::HITL`) |
|
|
67
|
+
| `needs-triage` | — (nunca fue una label: es la ausencia de `state::`) |
|
|
68
|
+
| `system::*` | — (retirada) |
|
|
69
|
+
| `documentation` / `MR` | — (retiradas) |
|
|
70
|
+
| `type::*`, `candy::*`, `wayfinder::*` | sin cambios |
|
|
71
|
+
|
|
72
|
+
### Quién escribe cada dimensión
|
|
73
|
+
|
|
74
|
+
| Dimensión | Quién la escribe |
|
|
75
|
+
|-----------|------------------|
|
|
76
|
+
| `type::` | la ingesta (bug/enhancement) y la captura de ideas (idea, [A-035](./A-035-captura-ideas-reanclaje-candies.md)) |
|
|
77
|
+
| `candy::` | la captura de ideas ([A-035](./A-035-captura-ideas-reanclaje-candies.md)) y la reunión semanal (re-estimación, [A-035](./A-035-captura-ideas-reanclaje-candies.md)) |
|
|
78
|
+
| `exec::` | la ingesta, el troceado ([A-039](./A-039-pipeline-ship-issues-hijos-spec.md)) y wayfinding (que reutiliza, [A-036](./A-036-adopcion-wayfinder-ortogonalidad-labels.md)) |
|
|
79
|
+
| `state::` | la ingesta y la implementación ([A-039](./A-039-pipeline-ship-issues-hijos-spec.md)) |
|
|
80
|
+
| `priority::` | la reunión semanal ([A-035](./A-035-captura-ideas-reanclaje-candies.md)) |
|
|
81
|
+
| `wayfinder::` | wayfinding ([A-036](./A-036-adopcion-wayfinder-ortogonalidad-labels.md)) |
|
|
82
|
+
|
|
83
|
+
La maquinaria de cada rol vive en el paquete `@imolko/ultra-agent` ([A-034](./A-034-canonical-skill-set.md)).
|
|
84
|
+
|
|
85
|
+
## Consecuencias
|
|
86
|
+
|
|
87
|
+
### Positivas
|
|
88
|
+
|
|
89
|
+
- **Etiquetado determinista**: cada issue lleva exactamente un conjunto bien formado de labels; el estado de un issue se deduce de sus labels sin ambigüedad.
|
|
90
|
+
- **Ortogonalidad real**: `state::` y `exec::` quedan separados — `ready-for-agent` deja de fundir "¿está listo?" con "¿quién?".
|
|
91
|
+
- **Un patrón consistente**: la ausencia como default rige las tres dimensiones con estado por defecto (sin ingesta, `?`, backlog).
|
|
92
|
+
- **Traje limpio**: las labels describen trabajo, no entregables (`documentation`) ni sistemas externos (`system::*`).
|
|
93
|
+
|
|
94
|
+
### Negativas
|
|
95
|
+
|
|
96
|
+
- **Migración mecánica**: renombrar/añadir/retirar labels en el issue tracker y re-etiquetar los issues existentes que las llevan.
|
|
97
|
+
- **Pérdida de `testing`**: la fase de verificación deja de ser una label; si el equipo necesita filtrar "en verificación", deberá reintroducirla.
|
|
98
|
+
- **`ready` exige dos labels**: ahora el modo es `state::ready` + `exec::AFK`/`exec::HITL`, donde antes bastaba una sola; es el precio de la ortogonalidad.
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# A-038: Los issues referencian los skills relevantes por nombre
|
|
2
|
+
|
|
3
|
+
**Estado**: Aceptado
|
|
4
|
+
|
|
5
|
+
**Fecha**: 2026-05-19
|
|
6
|
+
|
|
7
|
+
**originally**: imolko
|
|
8
|
+
|
|
9
|
+
**tags**: agentes, tooling
|
|
10
|
+
|
|
11
|
+
## Contexto
|
|
12
|
+
|
|
13
|
+
El agente descubre los skills por la `description` de cada `SKILL.md` ([A-034](./A-034-canonical-skill-set.md)). Cuando un issue pide "generar un artefacto de dominio" o "implementar con red-green-refactor" sin nombrar el skill, el agente debe inferir cuál usar. Esto es frágil:
|
|
14
|
+
|
|
15
|
+
- Si la descripción del skill no incluye las palabras exactas del issue, el agente no lo descubre.
|
|
16
|
+
- El agente pierde tiempo intentando adivinar qué herramienta usar.
|
|
17
|
+
|
|
18
|
+
## Decisión
|
|
19
|
+
|
|
20
|
+
Todo issue que un agente consume documenta el skill relevante por su nombre exacto como primera instrucción de la sección `# Skill recomendado`, que define [A-042](./A-042-formato-documentos-issue-tracker.md):
|
|
21
|
+
|
|
22
|
+
```markdown
|
|
23
|
+
# Skill recomendado
|
|
24
|
+
|
|
25
|
+
Para comenzar, usa /skill:<nombre> con el siguiente JSON de entrada:
|
|
26
|
+
|
|
27
|
+
...
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Reglas
|
|
31
|
+
|
|
32
|
+
| Regla | Descripción |
|
|
33
|
+
|-------|-------------|
|
|
34
|
+
| Referencia explícita | Usar `/skill:<nombre>` con el nombre exacto del skill — el valor del campo `name` de su `SKILL.md` |
|
|
35
|
+
| Primera instrucción | La referencia al skill debe ser lo primero que el agente lee en `# Skill recomendado` |
|
|
36
|
+
| JSON de entrada | Incluir el JSON completo de entrada cuando el skill lo requiera |
|
|
37
|
+
| Skills encadenados | Si el flujo requiere varios skills, referenciarlos en orden |
|
|
38
|
+
| Skills en el spec padre | El spec padre documenta el flujo de skills como referencia para sus issues hijos |
|
|
39
|
+
|
|
40
|
+
Los skills disponibles viven en el paquete `@imolko/ultra-agent`, la fuente canónica del conjunto ([A-034](./A-034-canonical-skill-set.md)).
|
|
41
|
+
|
|
42
|
+
## Consecuencias
|
|
43
|
+
|
|
44
|
+
### Positivas
|
|
45
|
+
|
|
46
|
+
- **Descubrimiento determinista**: el agente no necesita inferir qué skill usar; el issue se lo dice.
|
|
47
|
+
- **Sin tiempo perdido**: el agente va directo a la herramienta correcta.
|
|
48
|
+
- **Flujo encadenado**: issues que requieren varios skills guían al agente por todo el proceso.
|
|
49
|
+
|
|
50
|
+
### Negativas
|
|
51
|
+
|
|
52
|
+
- **Mantenimiento de issues**: al crear issues, hay que recordar incluir la referencia al skill.
|
|
53
|
+
- **Acoplamiento**: si un skill cambia de nombre, los issues deben actualizarse.
|
|
54
|
+
- **Duplicación**: el spec padre y sus issues hijos pueden tener instrucciones redundantes.
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# A-039: Pipeline ship para implementar los issues hijos de un spec
|
|
2
|
+
|
|
3
|
+
**Estado**: Aceptado
|
|
4
|
+
|
|
5
|
+
**Fecha**: 2026-08-17
|
|
6
|
+
|
|
7
|
+
**originally**: imolko
|
|
8
|
+
|
|
9
|
+
**tags**: agentes, tooling
|
|
10
|
+
|
|
11
|
+
## Contexto
|
|
12
|
+
|
|
13
|
+
El ciclo canónico de skills ([A-034](./A-034-canonical-skill-set.md)) produce, desde una idea, un spec; el **troceado** lo parte en issues hijos y la **implementación** los ejecuta. Cada hijo se implementa con contexto mínimo y fresco (un hijo + el spec + el progreso reciente), de modo que el agente no deriva entre issues. La **coreografía** que une el troceado con la implementación y con las fases posteriores — revisar, corregir, abrir el merge request — no tiene dueño: sin un orquestador, los pasos de enlace quedan en la memoria de la persona.
|
|
14
|
+
|
|
15
|
+
## Decisión
|
|
16
|
+
|
|
17
|
+
El **pipeline `ship`** encadena la implementación de todos los hijos de un spec con la revisión, la corrección y la apertura del merge request. Un programa determinista es el **orquestador**: decide qué issue sigue y transiciona las labels; los sub-agentes son **trabajadores puros** (issue entra, veredicto sale) y nunca tocan el tracker.
|
|
18
|
+
|
|
19
|
+
### Arquitectura
|
|
20
|
+
|
|
21
|
+
1. **El orquestador es determinista y ejecuta la máquina de estados** ([A-037](./A-037-formalizacion-taxonomia-labels.md)): elige el siguiente hijo y transiciona sus labels. El modelo nunca decide qué issue sigue; solo trabaja dentro de cada sub-agente.
|
|
22
|
+
2. **Sub-agentes aislados**: cada fase (implementar, revisar, corregir) corre en un proceso aislado, con contexto fresco. El prompt de cada fase vive en **el payload del paquete** `@imolko/ultra-agent` ([A-052](./A-052-distribucion-metodologia-paquete-versionado.md)) — no en `.pi/agents/` del consumidor ni en el código.
|
|
23
|
+
3. **Disparo**: la persona lo invoca con `npx @imolko/ultra-agent ship --parent-iid <IID>` (el comando vive en el puntero `ship_cmd` de `docs/agents/repo-config.md`, [A-052](./A-052-distribucion-metodologia-paquete-versionado.md)), o el **troceado** lo ofrece al terminar, con el IID del padre ya resuelto.
|
|
24
|
+
|
|
25
|
+
### El bucle de implementación
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
loop:
|
|
29
|
+
hijo = pick_next(padre) # determinista: desbloqueado y ejecutable en automático
|
|
30
|
+
# (state::ready + exec::AFK); reclama atómicamente
|
|
31
|
+
veredicto = run implement(hijo) # sub-agente: contexto fresco; devuelve {estado, resumen, tests}
|
|
32
|
+
si veredicto.hecho: mark_done(hijo) # transiciona a completado + comentario en el padre
|
|
33
|
+
si no: gestionar fallo # lo deja en curso y se detiene
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Los estados y sus transiciones los define [A-037](./A-037-formalizacion-taxonomia-labels.md); el orquestador los ejecuta.
|
|
37
|
+
|
|
38
|
+
### Fases finales
|
|
39
|
+
|
|
40
|
+
- **Revisar**: un sub-agente revisa el diff completo contra el spec y los ADRs, y reporta hallazgos.
|
|
41
|
+
- **Corregir**: sub-agentes corrigen los hallazgos hasta que los tests queden verdes.
|
|
42
|
+
- **MR**: un solo merge request por spec padre; el pie lleva `Closes:` del padre y de los hijos completados ([A-033](./A-033-estandar-mensajes-commit.md)).
|
|
43
|
+
|
|
44
|
+
### Terminal de los hijos y del padre
|
|
45
|
+
|
|
46
|
+
La máquina de estados ([A-037](./A-037-formalizacion-taxonomia-labels.md)) fija las transiciones; este ADR refina su terminal: un hijo se **completa** y se **cierra por el MR** (`Closes:`); `state::approved` queda reservado al **padre**, el único work item terminal, y lo marca el desarrollador al fusionar.
|
|
47
|
+
|
|
48
|
+
### Recuperación
|
|
49
|
+
|
|
50
|
+
Al arrancar, el orquestador reinicia cualquier hijo que haya quedado en curso de una ejecución interrumpida a `state::ready` (sin asignar) y lo vuelve a ejecutar en fresco; los trabajadores son sin estado, así que re-ejecutar es seguro.
|
|
51
|
+
|
|
52
|
+
## Consecuencias
|
|
53
|
+
|
|
54
|
+
### Positivas
|
|
55
|
+
|
|
56
|
+
- **Una sola acción** desde el troceado hasta el MR: la persona dispara una vez y el pipeline encadena implementación, revisión, corrección y apertura del MR.
|
|
57
|
+
- **Determinismo conservado**: el orquestador — no el modelo — elige el siguiente hijo y transiciona las labels.
|
|
58
|
+
- **Prompt modular**: cada fase se edita en el payload del paquete, fuera del código y fuera del repositorio consumidor.
|
|
59
|
+
- **Reanudación segura**: la reclamación atómica (asignar y transicionar a en curso) evita la doble recogida y permite reiniciar a mitad del padre.
|
|
60
|
+
|
|
61
|
+
### Negativas
|
|
62
|
+
|
|
63
|
+
- **Un programa nuevo que mantener**: el orquestador, los prompts de los sub-agentes y el punto de disparo.
|
|
64
|
+
- **El cierre de cada hijo pasa por el pie del MR**: un hijo completado se cierra por el pie `Closes:`; un pie incorrecto lo deja abierto.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# A-040: Punteros de configuración del repositorio para los skills
|
|
2
|
+
|
|
3
|
+
**Estado**: Reemplazado
|
|
4
|
+
|
|
5
|
+
**Fecha**: 2026-08-17
|
|
6
|
+
|
|
7
|
+
**originally**: imolko
|
|
8
|
+
|
|
9
|
+
**tags**: agentes, tooling
|
|
10
|
+
|
|
11
|
+
> Reemplazado por [A-052](./A-052-distribucion-metodologia-paquete-versionado.md): el hub de punteros deja de vivir en `.pi/repo-config.md` y pasa a `docs/agents/repo-config.md`, con un bloque `## Agent skills` en `AGENTS.md`/`CLAUDE.md` como ancla neutral al harness.
|
|
12
|
+
|
|
13
|
+
## Contexto
|
|
14
|
+
|
|
15
|
+
El conjunto canónico de skills ([A-034](./A-034-canonical-skill-set.md)) fija el **contrato de adaptación**: mapea las convenciones ajenas a las del repositorio. Ese contrato vive como prosa en A-034, no como un artefacto que el agente pueda leer.
|
|
16
|
+
|
|
17
|
+
Las ubicaciones que mapea el contrato varían por repositorio y no tienen un hogar único: cada skill que las necesita las **hardcodea** en su cuerpo. Un cambio de carpeta obliga entonces a reescribir cada skill que menciona la ruta, y no existe un solo lugar donde el agente consulte dónde viven las cosas en el repo. La convención Imolko es estable y es el default, pero el coste de una divergencia puntual recae entero sobre los cuerpos de los skills.
|
|
18
|
+
|
|
19
|
+
## Decisión
|
|
20
|
+
|
|
21
|
+
Añadir un **fichero de punteros de configuración del repositorio** (`.pi/repo-config.md`) como capa de indirección entre los skills y las ubicaciones que varían por repositorio, más un skill que lo genera:
|
|
22
|
+
|
|
23
|
+
1. **`.pi/repo-config.md`** registra los punteros que varían por repositorio: `adr_dir`, `domain_dir`, `issue_language`, `tracker_cli` y `ship_cmd` (el comando que dispara el pipeline ship, [A-039](./A-039-pipeline-ship-issues-hijos-spec.md)). El fichero es un **hub de punteros, no un glosario**: no duplica el vocabulario de dominio ([A-031](./A-031-ubiquitous-language.md), [A-032](./A-032-domain-artifact-documentation-format.md)) ni el contenido del registro; solo dice dónde viven las cosas y qué switches usa el repo. Los defaults Imolko viven en el fichero, no aquí.
|
|
24
|
+
2. **Los skills leen los punteros en lugar de hardcodear rutas.** Los que referencian el registro ADR o la capa de dominio usan `adr_dir` y `domain_dir` (con una nota que apunta a `.pi/repo-config.md`). `issue_language`, `tracker_cli` y `ship_cmd` quedan registrados como referencia: los comandos de los cuerpos muestran el default Imolko y el agente adapta según el fichero cuando el repo diverge.
|
|
25
|
+
3. **La ubicación del propio fichero es la única ancla hardcodeada** (`.pi/repo-config.md`): la indirección reduce N rutas hardcodeadas a una. `.pi/skills/` ya es el hogar canónico del conjunto ([A-034](./A-034-canonical-skill-set.md)).
|
|
26
|
+
4. **Un generador de un solo paso** escribe `.pi/repo-config.md` con los defaults Imolko y marca las líneas que cambian si el repo diverge.
|
|
27
|
+
5. **La convención sigue siendo el default.** El registro ADR y sus metadatos ([ADR-0000](../ADR-0000-proceso-y-formato-de-adrs.md), los índices y el gate) fijan la ubicación canónica del registro y no cambian; `.pi/repo-config.md` es la capa que los *skills* leen, no una redefinición de la convención.
|
|
28
|
+
6. **Verificación**: una verificación comprueba que los punteros resuelven (las carpetas, el índice y el script de `ship_cmd` existen) y sale con código 0.
|
|
29
|
+
|
|
30
|
+
## Consecuencias
|
|
31
|
+
|
|
32
|
+
### Positivas
|
|
33
|
+
|
|
34
|
+
- **Un solo punto de cambio**: renombrar una carpeta es editar una línea de `.pi/repo-config.md`, no los cuerpos de los skills.
|
|
35
|
+
- **Contrato de adaptación ejecutable**: A-034 deja de ser solo prosa; el fichero es su cara legible por el agente.
|
|
36
|
+
- **Portabilidad**: copiar el conjunto de skills a otro repo y ejecutar el generador de un solo paso lo adapta sin tocar los cuerpos.
|
|
37
|
+
- **Default explícito y verificable**: los defaults Imolko quedan escritos en un solo lugar y la verificación detecta el desfase.
|
|
38
|
+
|
|
39
|
+
### Negativas
|
|
40
|
+
|
|
41
|
+
- **Un artefacto más que mantener**: `.pi/repo-config.md` debe mantenerse sincronizado con la realidad; la verificación mitiga el desfase.
|
|
42
|
+
- **Indirección**: cada skill que necesita una ruta debe leer el fichero; es un salto adicional (barato para el agente, pero real).
|
|
43
|
+
- **Doble fuente parcial**: ADR-0000 (y el gate) fijan la ubicación canónica del registro y el fichero la repite como default de `adr_dir`; si la convención cambia hay que tocar ambos.
|
|
44
|
+
- **Ancla única hardcodeada**: `.pi/repo-config.md` sigue siendo una constante; la reducción es N→1, no N→0.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# A-041: Estrategia de ramas del repositorio
|
|
2
|
+
|
|
3
|
+
**Estado**: Aceptado
|
|
4
|
+
|
|
5
|
+
**Fecha**: 2026-08-21
|
|
6
|
+
|
|
7
|
+
**originally**: imolko
|
|
8
|
+
|
|
9
|
+
**tags**: tooling, despliegue
|
|
10
|
+
|
|
11
|
+
## Contexto
|
|
12
|
+
|
|
13
|
+
El uso de las ramas no tiene una decisión que lo gobierne como un todo. [A-033](./A-033-estandar-mensajes-commit.md) fija el commit canónico (el squash del MR) y remite el flujo de ramas a este ADR; [A-016](./A-016-cicd-gitlab-pipeline-raiz-pipelines-modulares.md) menciona "fusionar a una rama protegida" para el despliegue. Quedan sin decidir qué ramas existen y su ciclo de vida, cómo se nombran, cuándo se crean y se borran, y dónde vive el código desechable de un spike.
|
|
14
|
+
|
|
15
|
+
Sin una decisión canónica, la mecánica de ramas deriva hacia canon suelto: el skill `spike` ([A-034](./A-034-canonical-skill-set.md)) improvisa una rama desechable sin que ningún ADR defina qué es ni su relación con `feature/*`.
|
|
16
|
+
|
|
17
|
+
## Decisión
|
|
18
|
+
|
|
19
|
+
Gobernar el uso de las ramas con un modelo único de **cuatro clases**: dos longevas y dos efímeras.
|
|
20
|
+
|
|
21
|
+
### Ramas longevas (protegidas, sin push directo)
|
|
22
|
+
|
|
23
|
+
- `main` — el estado liberado.
|
|
24
|
+
- `develop` — la línea de integración; recibe las features.
|
|
25
|
+
- `develop → main`: **merge commit `--no-ff`** (o fast-forward), para preservar los SHAs de `develop`.
|
|
26
|
+
|
|
27
|
+
### Ramas efímeras (se crean para un trabajo y se borran al terminar)
|
|
28
|
+
|
|
29
|
+
- `feature/*` — una feature o fix. Se fusiona a `develop` con **squash** y la rama de origen se **borra** al fusionar.
|
|
30
|
+
- `spike/*` — código desechable que responde una pregunta de diseño (un spike). **Nunca se fusiona**: su código no llega a `develop` ni a `main`. Por defecto el spike **no se commitea** — solo sobrevive su **veredicto**, capturado en la tarea de implementación. Si el artefacto debe quedar referenciable durante la implementación, se commitea a una rama `spike/*` que se **borra** cuando la decisión queda plegada en el código real.
|
|
31
|
+
|
|
32
|
+
### Nombrado
|
|
33
|
+
|
|
34
|
+
- `feature/*` y `spike/*` se nombran con una frase corta en minúsculas y guiones (`feature/saga-transferencias`, `spike/ui-fefo`). El número de work item vive en el footer del commit ([A-033](./A-033-estandar-mensajes-commit.md)).
|
|
35
|
+
|
|
36
|
+
## Consecuencias
|
|
37
|
+
|
|
38
|
+
### Positivas
|
|
39
|
+
|
|
40
|
+
- **Un solo flujo para personas y agentes**: la mecánica de ramas se gobierna en un solo lugar, para autores y agentes por igual.
|
|
41
|
+
|
|
42
|
+
### Negativas
|
|
43
|
+
|
|
44
|
+
- **Un ADR más que mantener**: ampliar el modelo (por ejemplo, una clase `hotfix/*`) exige editar este ADR.
|
|
45
|
+
- **Disciplina de borrado**: la utilidad de `spike/*` depende de que la rama se borre al plegar la decisión; una rama olvidada es desecho persistente.
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# A-042: Formato de los documentos del issue tracker
|
|
2
|
+
|
|
3
|
+
**Estado**: Aceptado
|
|
4
|
+
|
|
5
|
+
**Fecha**: 2026-08-22
|
|
6
|
+
|
|
7
|
+
**originally**: imolko
|
|
8
|
+
|
|
9
|
+
**tags**: agentes, tooling
|
|
10
|
+
|
|
11
|
+
## Contexto
|
|
12
|
+
|
|
13
|
+
El ciclo canónico de skills ([A-034](./A-034-canonical-skill-set.md)) publica varios **tipos de documento** en el issue tracker: ideas, specs, tareas, issues triados y los mapas/tickets de wayfinder. La forma de esos documentos no tiene un hogar único: cada skill que produce uno la lleva en su cuerpo, con su plantilla de secciones y un bloque común de reglas de formato duplicado.
|
|
14
|
+
|
|
15
|
+
Las labels ya las gobierna [A-037](./A-037-formalizacion-taxonomia-labels.md) y la regla de nombrar el skill como primera instrucción la gobierna [A-038](./A-038-issues-referencian-skills-nombre.md), pero la **forma** no la gobierna nadie: vive como canon suelto en los cuerpos de los skills — el mismo modo de fallo que [A-041](./A-041-estrategia-de-ramas.md) ya gobierna para las ramas.
|
|
16
|
+
|
|
17
|
+
La consecuencia concreta: el contrato entre el skill que **produce** un spec (o tarea, o idea) y los skills que lo **consumen** (el troceado, la implementación y la revisión) es implícito — vive dentro del cuerpo del productor. Un humano que quiera escribir un spec compatible a mano, o un skill consumidor que deba leerlo, no tiene un solo lugar que defina "qué es un spec".
|
|
18
|
+
|
|
19
|
+
## Decisión
|
|
20
|
+
|
|
21
|
+
Gobernar la **estructura** de los documentos del tracker en un único ADR fundacional, separando **estructura** de **oficio**:
|
|
22
|
+
|
|
23
|
+
- **Estructura (aquí)**: los tipos canónicos de documento, los nombres de sección y su orden, y las reglas de formato (comunes a todas las secciones y específicas de sección). Es el contrato de compatibilidad entre productor y consumidor.
|
|
24
|
+
- **Oficio (en el skill productor)**: la prosa que guía cómo escribir cada sección ("Explica la situación…", "Define el alcance…"). No es requisito de compatibilidad; se queda en el skill.
|
|
25
|
+
|
|
26
|
+
Los skills **cachean y apuntan**: el productor conserva una copia operativa de su plantilla en contexto (es el paso central), marcada como cache de este ADR, y deja de duplicar el bloque común de formato en favor de un puntero. Los skills consumidores apuntan aquí para conocer la forma que leen.
|
|
27
|
+
|
|
28
|
+
### Tipos de documento y su estructura
|
|
29
|
+
|
|
30
|
+
| Documento | Secciones (en orden) |
|
|
31
|
+
|-----------|----------------------|
|
|
32
|
+
| Idea (pre-spec) | `# Skill recomendado`, `# Contexto`, `# Idea`, `# Por qué importa`, `# Hecho se ve como` — más `# Pregunta` si no es estimable |
|
|
33
|
+
| Spec | `# Skill recomendado`, `# Contexto`, `# Alcance`, `# Criterio de cierre`, `# Pruebas recomendadas`, `# Decisiones de implementación`, `# Decisiones de testing`, `# Fuera de alcance`, `# Notas adicionales` |
|
|
34
|
+
| Tarea | `# Skill recomendado`, `# Contexto`, `# Alcance`, `# Criterio de cierre`, `# Pruebas recomendadas`, `# Tarea padre`, `# Bloqueado por` |
|
|
35
|
+
| Issue triado (bug/enhancement) | sin secciones fijas — un brief que declara: objetivo, conceptos de dominio, ADRs que constriñen, seams a testear, criterios de aceptación |
|
|
36
|
+
| Mapa wayfinder | `# Destino`, `# Notas`, `# Decisiones tomadas`, `# Aún sin especificar`, `# Fuera de alcance` |
|
|
37
|
+
| Ticket wayfinder | `# Pregunta`, `# Bloqueado por` |
|
|
38
|
+
|
|
39
|
+
Hay un vocabulario de secciones recurrente entre tipos: `# Skill recomendado` compartido por idea, spec y tarea; `# Contexto`/`# Alcance`/`# Criterio de cierre`/`# Pruebas recomendadas` compartidos por spec y tarea; `# Bloqueado por` compartido por tarea y ticket; `# Fuera de alcance` compartido por spec y mapa. Esa recurrencia es la señal de que la forma es un contrato compartido, no una preferencia de cada skill.
|
|
40
|
+
|
|
41
|
+
### Reglas comunes de formato
|
|
42
|
+
|
|
43
|
+
Una sola copia canónica aquí; los skills las apuntan en lugar de duplicarlas:
|
|
44
|
+
|
|
45
|
+
- Las secciones son **Header 1** (`# Nombre de sección`).
|
|
46
|
+
- Las secciones van seguidas, delimitadas solo por sus títulos.
|
|
47
|
+
- El título de sección es solo el nombre de la sección.
|
|
48
|
+
- El texto es texto plano.
|
|
49
|
+
- Todo el texto en el idioma del repo (`issue_language`, [A-052](./A-052-distribucion-metodologia-paquete-versionado.md)).
|
|
50
|
+
- Markup del tracker (`tracker_cli`, [A-052](./A-052-distribucion-metodologia-paquete-versionado.md)).
|
|
51
|
+
|
|
52
|
+
### Formato por sección
|
|
53
|
+
|
|
54
|
+
Además de las reglas comunes, `# Criterio de cierre` (compartido por spec y tarea) tiene un requisito de formato propio: una **lista de tareas con checkboxes** del tracker, una por criterio.
|
|
55
|
+
|
|
56
|
+
Es el único requisito de formato específico de sección; el resto de secciones solo siguen las reglas comunes.
|
|
57
|
+
|
|
58
|
+
### Qué no posee este ADR
|
|
59
|
+
|
|
60
|
+
- **Las labels** → [A-037](./A-037-formalizacion-taxonomia-labels.md), incluido el acople entre cada documento y sus labels.
|
|
61
|
+
- **La regla de nombrar el skill como primera instrucción** (`# Skill recomendado`) → [A-038](./A-038-issues-referencian-skills-nombre.md).
|
|
62
|
+
- **Qué skill produce cada documento** → [A-034](./A-034-canonical-skill-set.md) y la fuente canónica del conjunto, el paquete `@imolko/ultra-agent`.
|
|
63
|
+
- **El oficio** de escribir cada sección → el skill productor.
|
|
64
|
+
|
|
65
|
+
## Consecuencias
|
|
66
|
+
|
|
67
|
+
### Positivas
|
|
68
|
+
|
|
69
|
+
- **Un solo contrato**: la forma de cada documento vive en un lugar; productores y consumidores comparten la misma definición de "qué es un spec/tarea/idea".
|
|
70
|
+
- **Elimina la duplicación**: el bloque común de formato deja de repetirse en cada skill; las plantillas pasan de canon suelto a cache marcada.
|
|
71
|
+
- **Escritura a mano posible**: un humano que escribe un spec sin pasar por el skill tiene el ADR como referencia.
|
|
72
|
+
- **Separación estructura/oficio**: cambiar el contrato no obliga a reescribir el oficio, y viceversa.
|
|
73
|
+
|
|
74
|
+
### Negativas
|
|
75
|
+
|
|
76
|
+
- **Un ADR más que mantener**: cambiar la estructura de un documento exige editar este ADR.
|
|
77
|
+
- **Cache desincronizable**: la copia operativa en cada skill puede quedar desfasada de este ADR si no se actualiza al cambiarlo (mitigado por la disciplina de "marcar como cache").
|
|
78
|
+
- **Indirección**: los skills consumidores dan un salto al ADR para conocer la forma que leen.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# A-043: Vocabulario de etiquetas de los ADRs
|
|
2
|
+
|
|
3
|
+
**Estado**: Aceptado
|
|
4
|
+
|
|
5
|
+
**Fecha**: 2026-08-25
|
|
6
|
+
|
|
7
|
+
**originally**: imolko
|
|
8
|
+
|
|
9
|
+
**tags**: tooling
|
|
10
|
+
|
|
11
|
+
## Contexto
|
|
12
|
+
|
|
13
|
+
El campo `**tags**` del frontmatter de los ADRs admite de una a tres etiquetas. Alojar el vocabulario aprobado de esas etiquetas en el meta-ADR [ADR-0000](../ADR-0000-proceso-y-formato-de-adrs.md), que define el proceso y el formato, acopla el meta-ADR a una lista de valores que evoluciona con el registro: cada vez que el vocabulario cambia, el meta-ADR queda desactualizado y arrastra ese desfase a todos los repositorios que lo importan. El vocabulario es una decisión metodológica agnóstica al lenguaje; su hogar natural es el tier fundacional, no el meta-ADR.
|
|
14
|
+
|
|
15
|
+
## Decisión
|
|
16
|
+
|
|
17
|
+
El vocabulario aprobado de etiquetas vive aquí, en el tier fundacional, como fuente única de los valores que admite el campo `**tags**`. Cada ADR del tier A lleva de **una a tres etiquetas**, separadas por comas, en ASCII y en español:
|
|
18
|
+
|
|
19
|
+
| Etiqueta | Uso típico |
|
|
20
|
+
|----------|------------|
|
|
21
|
+
| `arquitectura` | Estructura, capas, dependencias, bounded contexts. |
|
|
22
|
+
| `dominio` | Reglas de negocio, modelos, value objects. |
|
|
23
|
+
| `eventos` | Event Sourcing, CloudEvents, emisión de eventos. |
|
|
24
|
+
| `testing` | TDD, criterios de test, reportes de tests. |
|
|
25
|
+
| `configuracion` | Settings, contratos de configuración. |
|
|
26
|
+
| `despliegue` | Helm, CI/CD, imágenes Docker, entornos. |
|
|
27
|
+
| `agentes` | Colaboradores LLM, bloques de prompt. |
|
|
28
|
+
| `tooling` | Herramientas del flujo de trabajo (gate, scripts, generadores). |
|
|
29
|
+
|
|
30
|
+
El campo `**tags**` en sí — su obligatoriedad y su forma — lo define [ADR-0000](../ADR-0000-proceso-y-formato-de-adrs.md); este ADR posee los valores y su semántica. Los tiers T, P y G pueden referenciar este ADR cuando adopten etiquetas.
|
|
31
|
+
|
|
32
|
+
## Consecuencias
|
|
33
|
+
|
|
34
|
+
### Positivas
|
|
35
|
+
|
|
36
|
+
- **Una sola fuente**: ampliar o redefinir el vocabulario es editar este ADR, sin tocar el meta-ADR.
|
|
37
|
+
- **Meta-ADR desacoplado**: ADR-0000 apunta aquí en lugar de contener la lista.
|
|
38
|
+
|
|
39
|
+
### Negativas
|
|
40
|
+
|
|
41
|
+
- **Vocabulario acotado**: limitar las etiquetas a ocho valores obliga a mapear cada decisión al vocabulario existente; ampliarlo requiere modificar este ADR.
|
|
42
|
+
- **Sin validación automática**: el gate no comprueba que las etiquetas pertenezcan a este vocabulario; la consistencia depende de la revisión.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# A-044: Composición funcional de procesos y operaciones
|
|
2
|
+
|
|
3
|
+
**Estado**: Aceptado
|
|
4
|
+
|
|
5
|
+
**Fecha**: 2026-08-29
|
|
6
|
+
|
|
7
|
+
**originally**: imolko
|
|
8
|
+
|
|
9
|
+
**tags**: arquitectura
|
|
10
|
+
|
|
11
|
+
## Contexto
|
|
12
|
+
|
|
13
|
+
Un proceso de negocio — un caso de uso con sus puertos que resuelve un comando o una consulta ([A-002](./A-002-cqrs-semantico.md)) — y una operación de dominio — un método de un value object, entidad o agregado — expresan una secuencia de pasos. Esa secuencia se puede escribir de dos formas:
|
|
14
|
+
|
|
15
|
+
- **Como composición**: los pasos se encadenan en un pipeline, cada paso es una función y la salida de uno es la entrada del siguiente.
|
|
16
|
+
- **Como ramas**: el cuerpo desvía el flujo con condicionales y bucles en cada situación.
|
|
17
|
+
|
|
18
|
+
La forma de ramas entierra la secuencia bajo el control de flujo: para entender el proceso hay que leer cada rama, y para combinar dos operaciones hay que cablear a mano el control de flujo de cada una. La forma de composición expresa la secuencia de negocio de un vistazo y hace cada paso verificable por separado.
|
|
19
|
+
|
|
20
|
+
Sin una decisión canónica, cada artefacto puede elegir entre componer o ramificar, y el estilo se erosiona.
|
|
21
|
+
|
|
22
|
+
## Decisión
|
|
23
|
+
|
|
24
|
+
Adoptar la **composición funcional** como estilo para expresar procesos y operaciones de dominio: cada uno se escribe como un pipeline de pasos encadenados, donde cada paso es una función y la salida de un paso es la entrada del siguiente.
|
|
25
|
+
|
|
26
|
+
- **Un paso, una función**: cada paso del proceso es una función con una responsabilidad.
|
|
27
|
+
- **Sin ramas de control**: el flujo no se desvía con condicionales ni bucles; la secuencia de pasos es el flujo.
|
|
28
|
+
|
|
29
|
+
Los operadores concretos del pipeline — el mecanismo de encadenado — los provee el tier de lenguaje de cada ecosistema. Este ADR fija el estilo; no duplica los operadores.
|
|
30
|
+
|
|
31
|
+
## Consecuencias
|
|
32
|
+
|
|
33
|
+
### Positivas
|
|
34
|
+
|
|
35
|
+
- **Legibilidad**: el proceso se lee como una secuencia de pasos de negocio, sin rastrear ramas.
|
|
36
|
+
- **Componibilidad**: dos operaciones se combinan encadenando sus pasos; el resultado de una alimenta la siguiente.
|
|
37
|
+
- **Testabilidad**: cada paso es una función aislada, verificable por separado.
|
|
38
|
+
- **Localidad**: modificar un paso no toca el resto del pipeline.
|
|
39
|
+
|
|
40
|
+
### Negativas
|
|
41
|
+
|
|
42
|
+
- **Curva de aprendizaje**: quien viene de estilo imperativo debe reaprender a expresar el flujo como composición.
|
|
43
|
+
- **Verbosidad en pasos triviales**: encadenar pasos de una línea puede ser más ceremonioso que una rama simple.
|
|
44
|
+
- **Disciplina**: exige rechazar ramas de control en revisión; sin ella, el estilo se erosiona.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# A-045: Guardrails aplicables, no directrices
|
|
2
|
+
|
|
3
|
+
**Estado**: Aceptado
|
|
4
|
+
|
|
5
|
+
**Fecha**: 2026-08-31
|
|
6
|
+
|
|
7
|
+
**originally**: albro
|
|
8
|
+
|
|
9
|
+
**Enriquecido desde**: Medium "ESLint as AI Guardrails: The Rules That Make AI Code Readable" (Alex Brohshtut)
|
|
10
|
+
|
|
11
|
+
**tags**: agentes, tooling
|
|
12
|
+
|
|
13
|
+
## Contexto
|
|
14
|
+
|
|
15
|
+
Los agentes que colaboran en los proyectos de Imolko escriben código de punta a punta. Las instrucciones que reciben — prompts ([A-023](./A-023-composicion-bloques-prompt-agentes.md)), skills ([A-034](./A-034-canonical-skill-set.md)), specs — dependen de su interpretación, y la calidad de la salida queda a merced de esa interpretación.
|
|
16
|
+
|
|
17
|
+
Persiguiendo la petición, el agente erosiona la forma del código — funciones largas y números mágicos ([A-046](./A-046-metricas-de-forma-y-legibilidad-del-codigo.md)), dependencias implícitas ([A-047](./A-047-dependencias-explicitas-sin-globales-ambientales.md)) — aun cumpliendo la instrucción.
|
|
18
|
+
|
|
19
|
+
Sin una decisión canónica, cada repositorio decide si confía en directrices o en guardrails, y el cerco se erosiona.
|
|
20
|
+
|
|
21
|
+
## Decisión
|
|
22
|
+
|
|
23
|
+
La salida del agente se gobierna con **guardrails aplicables**, no con directrices. Un guardrail es una regla verificable por máquina que el agente no puede eludir; una directriz es una instrucción que el agente puede ignorar. Los guardrails son dos capas de enforcement:
|
|
24
|
+
|
|
25
|
+
1. **Tests**: fijan el comportamiento esperado ([A-003](./A-003-tdd.md)).
|
|
26
|
+
2. **Linting**: fija la forma y la legibilidad del código ([A-046](./A-046-metricas-de-forma-y-legibilidad-del-codigo.md)).
|
|
27
|
+
|
|
28
|
+
### Principios
|
|
29
|
+
|
|
30
|
+
1. **Enforcement sobre persuasión**: la regla se cumple porque el ciclo la verifica, no porque el agente la recuerde.
|
|
31
|
+
2. **Reglas que solo la persona ajusta**: si una regla hace imposible la tarea, el agente se detiene y lo reporta a la persona; la persona decide si ajusta la regla.
|
|
32
|
+
3. **Bucle de retroalimentación**: tras cada edición, el guardrail se ejecuta; si falla, el agente corrige. Tras N fallos sobre el mismo archivo, el agente se detiene y reporta, para prevenir bucles infinitos de corrección.
|
|
33
|
+
4. **Cerco fijo**: la definición de las reglas y el cerco mismo quedan protegidos; el agente trabaja dentro del cerco. La materialización tiene dos capas: las reglas del linter, responsabilidad del tier de lenguaje, y el bucle que las ejecuta en el ciclo de edición del agente, materializado como extensión nativa de pi ([A-049](./A-049-materializacion-bucle-guardrails-extension-nativa-pi.md)).
|
|
34
|
+
|
|
35
|
+
Las métricas concretas que verifica el linting viven en [A-046](./A-046-metricas-de-forma-y-legibilidad-del-codigo.md). La composición de los prompts sigue siendo [A-023](./A-023-composicion-bloques-prompt-agentes.md); este ADR define el cerco ejecutable alrededor de esa instrucción, no la instrucción en sí. El bucle de retroalimentación se coloca en el ciclo de edición del agente (materializado por [A-049](./A-049-materializacion-bucle-guardrails-extension-nativa-pi.md)) y como gate en la integración continua ([A-016](./A-016-cicd-gitlab-pipeline-raiz-pipelines-modulares.md)).
|
|
36
|
+
|
|
37
|
+
## Consecuencias
|
|
38
|
+
|
|
39
|
+
### Positivas
|
|
40
|
+
|
|
41
|
+
- **Calidad determinista**: el agente refactoriza mientras trabaja para cumplir el guardrail.
|
|
42
|
+
- **Independencia del modelo**: la regla se cumple o el ciclo se detiene, sin depender de la buena voluntad del agente.
|
|
43
|
+
- **Escalable por ecosistema**: cada lenguaje materializa las mismas reglas con su linter; el principio no cambia.
|
|
44
|
+
|
|
45
|
+
### Negativas
|
|
46
|
+
|
|
47
|
+
- **Rigidez**: un guardrail puede bloquear una tarea legítima; la válvula es el reporte a la persona, no el bypass del agente.
|
|
48
|
+
- **Costo de configuración**: cada ecosistema debe materializar el cerco en su tier de lenguaje.
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# A-046: Métricas de forma y legibilidad del código
|
|
2
|
+
|
|
3
|
+
**Estado**: Aceptado
|
|
4
|
+
|
|
5
|
+
**Fecha**: 2026-08-31
|
|
6
|
+
|
|
7
|
+
**originally**: albro
|
|
8
|
+
|
|
9
|
+
**Enriquecido desde**: Medium "ESLint as AI Guardrails: The Rules That Make AI Code Readable" (Alex Brohshtut)
|
|
10
|
+
|
|
11
|
+
**tags**: arquitectura
|
|
12
|
+
|
|
13
|
+
## Contexto
|
|
14
|
+
|
|
15
|
+
Sin límites numéricos, el código — humano o generado por agente — tiende a funciones y archivos que crecen sin control, parámetros posicionales largos y números mágicos. La legibilidad queda como preferencia y se erosiona con cada contribución.
|
|
16
|
+
|
|
17
|
+
El vocabulario del código ya tiene canon: los verbos de intención ([A-029](./A-029-verbos-intencion-metodos-lado-negocio.md)) y el lenguaje ubicuo ([A-031](./A-031-ubiquitous-language.md)) fijan cómo se nombra. Falta fijar la forma: cuán grande puede ser una función, cuántos parámetros, cuánta complejidad.
|
|
18
|
+
|
|
19
|
+
Estos límites son agnósticos al lenguaje: el criterio no cambia entre ecosistemas. La herramienta que los verifica es la capa de linting del guardrail ([A-045](./A-045-guardrails-aplicables-no-directrices.md)); la materialización concreta (nombres de reglas, excepciones finas) vive en el tier de lenguaje y en la configuración del repo.
|
|
20
|
+
|
|
21
|
+
## Decisión
|
|
22
|
+
|
|
23
|
+
Adoptar límites duros de forma y legibilidad para todo el código:
|
|
24
|
+
|
|
25
|
+
1. **Máximo 2 parámetros por función**: más de dos se agrupa en un único parámetro compuesto.
|
|
26
|
+
2. **Máximo 50 líneas por función** (cuerpo de la función).
|
|
27
|
+
3. **Máximo 250 líneas por archivo**.
|
|
28
|
+
4. **Sin números mágicos**: los literales numéricos con significado se extraen a constantes nombradas. Quedan exceptuados los valores triviales (0, 1, -1, 2) y los índices de colecciones.
|
|
29
|
+
5. **Complejidad máxima 10** por función (ciclomática o cognitiva, según el ecosistema).
|
|
30
|
+
6. **Profundidad de anidamiento máxima 4**.
|
|
31
|
+
7. **Máximo 20 sentencias por función**.
|
|
32
|
+
8. **Un tipo principal por archivo**.
|
|
33
|
+
9. **Longitud mínima de identificador 2** caracteres.
|
|
34
|
+
10. **Igualdad sin coerciones implícitas**: las comparaciones no aplican coerciones de tipo; el operador concreto de igualdad estricta lo provee el tier de lenguaje.
|
|
35
|
+
|
|
36
|
+
Cada límite es un piso de refactorización: al alcanzarlo, se extrae un helper ([A-044](./A-044-composicion-funcional-procesos-operaciones.md)) y el nombre de la pieza extraída comunica su intención ([A-029](./A-029-verbos-intencion-metodos-lado-negocio.md)).
|
|
37
|
+
|
|
38
|
+
## Consecuencias
|
|
39
|
+
|
|
40
|
+
### Positivas
|
|
41
|
+
|
|
42
|
+
- **Legibilidad predecible**: cualquier función o archivo se entiende de un vistazo.
|
|
43
|
+
- **Refactorización continua**: el límite fuerza extraer helpers en lugar de acumular.
|
|
44
|
+
- **Revisión objetiva**: los límites son verificables por máquina, no discutibles por gusto.
|
|
45
|
+
|
|
46
|
+
### Negativas
|
|
47
|
+
|
|
48
|
+
- **Verbosidad en pasos triviales**: extraer un helper para una línea puede parecer ceremonioso.
|
|
49
|
+
- **Migración**: el código existente que excede los límites debe refactorizarse, feature por feature.
|
|
50
|
+
- **Excepciones**: casos legítimos (por ejemplo, un mapeo grande) requieren excepciones explícitas en la configuración del tier de lenguaje.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# A-047: Dependencias explícitas: sin globales ambientales
|
|
2
|
+
|
|
3
|
+
**Estado**: Aceptado
|
|
4
|
+
|
|
5
|
+
**Fecha**: 2026-08-31
|
|
6
|
+
|
|
7
|
+
**originally**: albro
|
|
8
|
+
|
|
9
|
+
**Enriquecido desde**: Medium "ESLint as AI Guardrails: The Rules That Make AI Code Readable" (Alex Brohshtut)
|
|
10
|
+
|
|
11
|
+
**tags**: arquitectura
|
|
12
|
+
|
|
13
|
+
## Contexto
|
|
14
|
+
|
|
15
|
+
El código que accede a globales ambientales — la consola para loguear, las variables de entorno para configurar — esconde sus dependencias: no se ve qué necesita para funcionar, no se puede sustituir en tests y la configuración queda dispersa.
|
|
16
|
+
|
|
17
|
+
La configuración ya tiene canon: el contrato de settings es su única fuente ([A-013](./A-013-contrato-settings-unica-fuente-configuracion.md)). El logging no lo tiene: falta fijar que se recibe por inyección, no se toma de la consola.
|
|
18
|
+
|
|
19
|
+
El artículo de referencia enmarca ambas prácticas como una misma regla: el código no accede a globales ambientales; usa inyección de dependencias. Sin una decisión canónica, cada pieza elige entre tomar sus dependencias del ambiente o recibirlas por inyección, y la visibilidad de las dependencias se erosiona.
|
|
20
|
+
|
|
21
|
+
## Decisión
|
|
22
|
+
|
|
23
|
+
El código no accede a globales ambientales de forma ad-hoc. Toda dependencia externa se recibe por inyección:
|
|
24
|
+
|
|
25
|
+
1. **Logging**: el código usa un logger inyectado (un puerto), no la consola. La elección del logger concreto es del tier de lenguaje.
|
|
26
|
+
2. **Configuración**: el acceso a variables de entorno sigue [A-013](./A-013-contrato-settings-unica-fuente-configuracion.md); este ADR no lo re-decide.
|
|
27
|
+
|
|
28
|
+
El punto de inyección sigue la anatomía de feature ([A-025](./A-025-anatomia-mecanica-feature-puertos-adaptadores-drivers.md)) y el wiring del entry point ([A-027](./A-027-patron-wiring-entry-point.md)).
|
|
29
|
+
|
|
30
|
+
## Consecuencias
|
|
31
|
+
|
|
32
|
+
### Positivas
|
|
33
|
+
|
|
34
|
+
- **Dependencias visibles**: la firma de una pieza revela qué necesita.
|
|
35
|
+
- **Testabilidad**: logger y configuración se sustituyen en tests.
|
|
36
|
+
|
|
37
|
+
### Negativas
|
|
38
|
+
|
|
39
|
+
- **Ceremonia**: inyectar logger y settings añade un puerto o parámetro en piezas que antes los tomaban del ambiente.
|
|
40
|
+
- **Migración**: el código existente que escribe a la consola debe migrarse (el CLI es el principal afectado).
|