@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.
Files changed (239) hide show
  1. package/README.md +93 -0
  2. package/bin/cli.js +2 -0
  3. package/dist-node/bin.d.ts +2 -0
  4. package/dist-node/bin.d.ts.map +1 -0
  5. package/dist-node/bin.js +5 -0
  6. package/dist-node/bin.js.map +1 -0
  7. package/dist-node/cli.d.ts +41 -0
  8. package/dist-node/cli.d.ts.map +1 -0
  9. package/dist-node/cli.js +170 -0
  10. package/dist-node/cli.js.map +1 -0
  11. package/dist-node/index.d.ts +14 -0
  12. package/dist-node/index.d.ts.map +1 -0
  13. package/dist-node/index.js +40 -0
  14. package/dist-node/index.js.map +1 -0
  15. package/dist-node/init-lint.d.ts +43 -0
  16. package/dist-node/init-lint.d.ts.map +1 -0
  17. package/dist-node/init-lint.js +84 -0
  18. package/dist-node/init-lint.js.map +1 -0
  19. package/dist-node/manifest.d.ts +33 -0
  20. package/dist-node/manifest.d.ts.map +1 -0
  21. package/dist-node/manifest.js +59 -0
  22. package/dist-node/manifest.js.map +1 -0
  23. package/dist-node/materializer.d.ts +52 -0
  24. package/dist-node/materializer.d.ts.map +1 -0
  25. package/dist-node/materializer.js +194 -0
  26. package/dist-node/materializer.js.map +1 -0
  27. package/dist-node/package-root.d.ts +5 -0
  28. package/dist-node/package-root.d.ts.map +1 -0
  29. package/dist-node/package-root.js +17 -0
  30. package/dist-node/package-root.js.map +1 -0
  31. package/dist-node/payload.d.ts +22 -0
  32. package/dist-node/payload.d.ts.map +1 -0
  33. package/dist-node/payload.js +49 -0
  34. package/dist-node/payload.js.map +1 -0
  35. package/dist-node/pointer-hub.d.ts +22 -0
  36. package/dist-node/pointer-hub.d.ts.map +1 -0
  37. package/dist-node/pointer-hub.js +50 -0
  38. package/dist-node/pointer-hub.js.map +1 -0
  39. package/dist-node/publication.cli.d.ts +9 -0
  40. package/dist-node/publication.cli.d.ts.map +1 -0
  41. package/dist-node/publication.cli.js +17 -0
  42. package/dist-node/publication.cli.js.map +1 -0
  43. package/dist-node/publication.d.ts +23 -0
  44. package/dist-node/publication.d.ts.map +1 -0
  45. package/dist-node/publication.js +47 -0
  46. package/dist-node/publication.js.map +1 -0
  47. package/dist-node/reconcile.cli.d.ts +11 -0
  48. package/dist-node/reconcile.cli.d.ts.map +1 -0
  49. package/dist-node/reconcile.cli.js +39 -0
  50. package/dist-node/reconcile.cli.js.map +1 -0
  51. package/dist-node/reconcile.d.ts +30 -0
  52. package/dist-node/reconcile.d.ts.map +1 -0
  53. package/dist-node/reconcile.js +51 -0
  54. package/dist-node/reconcile.js.map +1 -0
  55. package/dist-node/ship/prompts/fix.md +22 -0
  56. package/dist-node/ship/prompts/implement.md +34 -0
  57. package/dist-node/ship/prompts/review.md +28 -0
  58. package/dist-node/ship/ship.agent.d.ts +22 -0
  59. package/dist-node/ship/ship.agent.d.ts.map +1 -0
  60. package/dist-node/ship/ship.agent.js +142 -0
  61. package/dist-node/ship/ship.agent.js.map +1 -0
  62. package/dist-node/ship/ship.args.d.ts +15 -0
  63. package/dist-node/ship/ship.args.d.ts.map +1 -0
  64. package/dist-node/ship/ship.args.js +93 -0
  65. package/dist-node/ship/ship.args.js.map +1 -0
  66. package/dist-node/ship/ship.context.d.ts +12 -0
  67. package/dist-node/ship/ship.context.d.ts.map +1 -0
  68. package/dist-node/ship/ship.context.js +3 -0
  69. package/dist-node/ship/ship.context.js.map +1 -0
  70. package/dist-node/ship/ship.d.ts +4 -0
  71. package/dist-node/ship/ship.d.ts.map +1 -0
  72. package/dist-node/ship/ship.js +221 -0
  73. package/dist-node/ship/ship.js.map +1 -0
  74. package/dist-node/ship/ship.mr.d.ts +9 -0
  75. package/dist-node/ship/ship.mr.d.ts.map +1 -0
  76. package/dist-node/ship/ship.mr.js +171 -0
  77. package/dist-node/ship/ship.mr.js.map +1 -0
  78. package/dist-node/ship/ship.output.d.ts +9 -0
  79. package/dist-node/ship/ship.output.d.ts.map +1 -0
  80. package/dist-node/ship/ship.output.js +21 -0
  81. package/dist-node/ship/ship.output.js.map +1 -0
  82. package/dist-node/ship/ship.tracker.d.ts +37 -0
  83. package/dist-node/ship/ship.tracker.d.ts.map +1 -0
  84. package/dist-node/ship/ship.tracker.js +220 -0
  85. package/dist-node/ship/ship.tracker.js.map +1 -0
  86. package/dist-node/version.cli.d.ts +9 -0
  87. package/dist-node/version.cli.d.ts.map +1 -0
  88. package/dist-node/version.cli.js +30 -0
  89. package/dist-node/version.cli.js.map +1 -0
  90. package/dist-node/version.d.ts +24 -0
  91. package/dist-node/version.d.ts.map +1 -0
  92. package/dist-node/version.js +76 -0
  93. package/dist-node/version.js.map +1 -0
  94. package/docs/adr/ADR-0000-proceso-y-formato-de-adrs.md +115 -0
  95. package/docs/adr/foundational/A-001-clean-architecture-4-capas.md +88 -0
  96. package/docs/adr/foundational/A-002-cqrs-semantico.md +58 -0
  97. package/docs/adr/foundational/A-003-tdd.md +97 -0
  98. package/docs/adr/foundational/A-005-either-return-custom-methods.md +80 -0
  99. package/docs/adr/foundational/A-006-feature-completion-criteria.md +47 -0
  100. package/docs/adr/foundational/A-007-data-contract-fail-fast.md +109 -0
  101. package/docs/adr/foundational/A-008-bounded-context-decomposition.md +130 -0
  102. package/docs/adr/foundational/A-009-use-case-taxonomy.md +99 -0
  103. package/docs/adr/foundational/A-010-propiedad-emision-eventos-dominio.md +95 -0
  104. package/docs/adr/foundational/A-011-characterization-first-refactoring.md +90 -0
  105. package/docs/adr/foundational/A-012-helm-mecanismo-primario-despliegue.md +67 -0
  106. package/docs/adr/foundational/A-013-contrato-settings-unica-fuente-configuracion.md +74 -0
  107. package/docs/adr/foundational/A-014-generacion-artefactos-despliegue-desde-contrato-settings.md +75 -0
  108. package/docs/adr/foundational/A-015-cloudevents-estandar-eventos.md +85 -0
  109. package/docs/adr/foundational/A-016-cicd-gitlab-pipeline-raiz-pipelines-modulares.md +92 -0
  110. package/docs/adr/foundational/A-017-taxonomia-repositorios-librerias-sistemas.md +93 -0
  111. package/docs/adr/foundational/A-018-practicas-build-imagenes-docker.md +85 -0
  112. package/docs/adr/foundational/A-019-convenciones-autoria-helm-charts.md +97 -0
  113. package/docs/adr/foundational/A-020-entorno-desarrollo-estandarizado-devcontainer.md +58 -0
  114. package/docs/adr/foundational/A-022-formato-reporte-tests-ctrf.md +55 -0
  115. package/docs/adr/foundational/A-023-composicion-bloques-prompt-agentes.md +65 -0
  116. package/docs/adr/foundational/A-024-features-slices-verticales-portables.md +41 -0
  117. package/docs/adr/foundational/A-025-anatomia-mecanica-feature-puertos-adaptadores-drivers.md +104 -0
  118. package/docs/adr/foundational/A-026-infraestructura-compartida.md +44 -0
  119. package/docs/adr/foundational/A-027-patron-wiring-entry-point.md +67 -0
  120. package/docs/adr/foundational/A-029-verbos-intencion-metodos-lado-negocio.md +54 -0
  121. package/docs/adr/foundational/A-030-global-development-tooling.md +52 -0
  122. package/docs/adr/foundational/A-031-ubiquitous-language.md +64 -0
  123. package/docs/adr/foundational/A-032-domain-artifact-documentation-format.md +128 -0
  124. package/docs/adr/foundational/A-033-estandar-mensajes-commit.md +127 -0
  125. package/docs/adr/foundational/A-034-canonical-skill-set.md +64 -0
  126. package/docs/adr/foundational/A-035-captura-ideas-reanclaje-candies.md +51 -0
  127. package/docs/adr/foundational/A-036-adopcion-wayfinder-ortogonalidad-labels.md +37 -0
  128. package/docs/adr/foundational/A-037-formalizacion-taxonomia-labels.md +98 -0
  129. package/docs/adr/foundational/A-038-issues-referencian-skills-nombre.md +54 -0
  130. package/docs/adr/foundational/A-039-pipeline-ship-issues-hijos-spec.md +64 -0
  131. package/docs/adr/foundational/A-040-punteros-configuracion-repo-skills.md +44 -0
  132. package/docs/adr/foundational/A-041-estrategia-de-ramas.md +45 -0
  133. package/docs/adr/foundational/A-042-formato-documentos-issue-tracker.md +78 -0
  134. package/docs/adr/foundational/A-043-vocabulario-etiquetas-adrs.md +42 -0
  135. package/docs/adr/foundational/A-044-composicion-funcional-procesos-operaciones.md +44 -0
  136. package/docs/adr/foundational/A-045-guardrails-aplicables-no-directrices.md +48 -0
  137. package/docs/adr/foundational/A-046-metricas-de-forma-y-legibilidad-del-codigo.md +50 -0
  138. package/docs/adr/foundational/A-047-dependencias-explicitas-sin-globales-ambientales.md +40 -0
  139. package/docs/adr/foundational/A-048-cobertura-minima-codigo.md +39 -0
  140. package/docs/adr/foundational/A-049-materializacion-bucle-guardrails-extension-nativa-pi.md +49 -0
  141. package/docs/adr/foundational/A-050-el-caso-de-uso-pide-al-dominio-no-lee-su-representacion.md +50 -0
  142. package/docs/adr/foundational/A-051-orden-imports-por-distancia.md +47 -0
  143. package/docs/adr/foundational/A-052-distribucion-metodologia-paquete-versionado.md +42 -0
  144. package/docs/adr/foundational/A-053-errores-compartidos-entre-features-dos-hogares-por-capa.md +43 -0
  145. package/docs/adr/foundational/A-054-contrato-costura-driver-port-raw-data-canal-error.md +65 -0
  146. package/docs/adr/foundational/index.md +98 -0
  147. package/docs/adr/index.md +19 -0
  148. package/docs/adr/python/P-001-dependencias-por-feature-fastapi-depends.md +63 -0
  149. package/docs/adr/python/P-002-inyeccion-token-por-request-sin-persistirlo.md +35 -0
  150. package/docs/adr/python/P-003-sqlalchemy-async-connection-pooling.md +59 -0
  151. package/docs/adr/python/P-004-serializer-json-custom-modelos-pydantic.md +47 -0
  152. package/docs/adr/python/P-005-patrones-pitfalls-nicegui.md +148 -0
  153. package/docs/adr/python/P-006-convenciones-pytest.md +96 -0
  154. package/docs/adr/python/P-007-ci-python-alineacion-poetry-version-unica.md +55 -0
  155. package/docs/adr/python/P-008-empaquetado-infraestructura-compartida-por-tecnologia.md +38 -0
  156. package/docs/adr/python/index.md +14 -0
  157. package/docs/adr/typescript/T-001-ddd-artifact-validation-zod-primitives.md +136 -0
  158. package/docs/adr/typescript/T-002-test-documentation-jsdoc.md +133 -0
  159. package/docs/adr/typescript/T-003-readme-formatting-domain-artifacts.md +51 -0
  160. package/docs/adr/typescript/T-005-input-optionality-use-case-not-entity.md +130 -0
  161. package/docs/adr/typescript/T-006-small-enums-inlined-zod-regex.md +77 -0
  162. package/docs/adr/typescript/T-007-controller-input-zod-schema.md +79 -0
  163. package/docs/adr/typescript/T-008-expressive-use-case-pipe.md +207 -0
  164. package/docs/adr/typescript/T-009-mdx-brace-escaping.md +80 -0
  165. package/docs/adr/typescript/T-010-stack-tooling-typescript-dominio.md +53 -0
  166. package/docs/adr/typescript/T-011-ultra-reporter-herramienta-canonica-documentacion.md +52 -0
  167. package/docs/adr/typescript/T-012-npm-workspaces-estructura-monorepo-clean-architecture.md +54 -0
  168. package/docs/adr/typescript/T-013-definicion-eventos-versionados-ultra-ddd.md +45 -0
  169. package/docs/adr/typescript/T-014-publicacion-distribucion-librerias-npm-semver.md +53 -0
  170. package/docs/adr/typescript/T-015-method-placement-definition.md +35 -0
  171. package/docs/adr/typescript/T-016-contrato-settings-zod.md +34 -0
  172. package/docs/adr/typescript/T-017-characterization-tests-golden-files.md +39 -0
  173. package/docs/adr/typescript/T-018-procedencia-campos-frontmatter.md +55 -0
  174. package/docs/adr/typescript/T-019-ultra-generator-herramienta-canonica-generacion.md +35 -0
  175. package/docs/adr/typescript/T-020-ultra-settings-herramienta-canonica-exportacion-despliegue.md +36 -0
  176. package/docs/adr/typescript/T-021-pipe-flujo-datos-operadores-semantica-contexto-inmutable.md +105 -0
  177. package/docs/adr/typescript/T-022-construction-is-execution-single-boundary.md +112 -0
  178. package/docs/adr/typescript/T-023-registry-cli-declara-dependencias-reales.md +84 -0
  179. package/docs/adr/typescript/T-024-paquete-ultra-agent-manifiesto-pi-peers-cli.md +39 -0
  180. package/docs/adr/typescript/T-025-publicacion-npm-trusted-publishing-procedencia.md +59 -0
  181. package/docs/adr/typescript/index.md +30 -0
  182. package/eslint/index.mjs +721 -0
  183. package/package.json +94 -0
  184. package/pi/extensions/handoff/README.md +92 -0
  185. package/pi/extensions/handoff/handoff-prompt.txt +9 -0
  186. package/pi/extensions/handoff/index.ts +296 -0
  187. package/pi/extensions/handoff/package.json +12 -0
  188. package/pi/extensions/qa-guardrail/README.md +108 -0
  189. package/pi/extensions/qa-guardrail/adapters/cli.ts +100 -0
  190. package/pi/extensions/qa-guardrail/adapters/eslint.ts +90 -0
  191. package/pi/extensions/qa-guardrail/adapters/registry.ts +45 -0
  192. package/pi/extensions/qa-guardrail/baseline.ts +74 -0
  193. package/pi/extensions/qa-guardrail/cerco.ts +134 -0
  194. package/pi/extensions/qa-guardrail/check.ts +185 -0
  195. package/pi/extensions/qa-guardrail/config.ts +189 -0
  196. package/pi/extensions/qa-guardrail/delta.ts +52 -0
  197. package/pi/extensions/qa-guardrail/feedback.ts +26 -0
  198. package/pi/extensions/qa-guardrail/index.ts +311 -0
  199. package/pi/extensions/qa-guardrail/nstop.ts +82 -0
  200. package/pi/extensions/qa-guardrail/package.json +12 -0
  201. package/pi/extensions/qa-guardrail/selection.ts +98 -0
  202. package/pi/extensions/qa-guardrail/types.ts +64 -0
  203. package/scripts/copy-assets.sh +10 -0
  204. package/scripts/reconcile-tags.sh +94 -0
  205. package/scripts/release-beta.sh +64 -0
  206. package/scripts/release-build.sh +53 -0
  207. package/scripts/release.sh +51 -0
  208. package/scripts/verify-adr-consistency.py +217 -0
  209. package/skills/code-review/SKILL.md +66 -0
  210. package/skills/codebase-design/SKILL.md +46 -0
  211. package/skills/configure-repo/SKILL.md +33 -0
  212. package/skills/diagnose-bug/SKILL.md +63 -0
  213. package/skills/domain-modeling/SKILL.md +56 -0
  214. package/skills/grill-me/SKILL.md +34 -0
  215. package/skills/i-have-an-idea/SKILL.md +166 -0
  216. package/skills/implement/SKILL.md +22 -0
  217. package/skills/research/SKILL.md +17 -0
  218. package/skills/ship/SKILL.md +26 -0
  219. package/skills/spike/SKILL.md +27 -0
  220. package/skills/tdd/SKILL.md +68 -0
  221. package/skills/tdd/references/deep-modules.md +53 -0
  222. package/skills/tdd/references/interface-design.md +74 -0
  223. package/skills/tdd/references/mocking.md +80 -0
  224. package/skills/tdd/references/refactoring.md +49 -0
  225. package/skills/tdd/references/tests.md +184 -0
  226. package/skills/to-specs/SKILL.md +141 -0
  227. package/skills/to-tasks/SKILL.md +143 -0
  228. package/skills/triage/SKILL.md +73 -0
  229. package/skills/ultra-generator/SKILL.md +263 -0
  230. package/skills/ultra-generator/references/aggregate-root.md +149 -0
  231. package/skills/ultra-generator/references/domain-event.md +174 -0
  232. package/skills/ultra-generator/references/entity.md +133 -0
  233. package/skills/ultra-generator/references/service.md +92 -0
  234. package/skills/ultra-generator/references/value-object.md +135 -0
  235. package/skills/wayfinder/SKILL.md +201 -0
  236. package/skills/workflow/SKILL.md +31 -0
  237. package/skills/writing-for-agents/SKILL-MECHANICS.md +32 -0
  238. package/skills/writing-for-agents/SKILL.md +86 -0
  239. package/skills/writing-for-agents/references/adrs.md +19 -0
@@ -0,0 +1,67 @@
1
+ # A-027: Patrón de wiring entry-point
2
+
3
+ **Estado**: Aceptado
4
+
5
+ **Fecha**: 2026-08-13
6
+
7
+ **originally**: A-001
8
+
9
+ **Enriquecido desde**: Cortex ADR 004 — Clean Architecture feature structure with ports & drivers
10
+
11
+ **tags**: arquitectura
12
+
13
+ ## Contexto
14
+
15
+ Cada app necesita instanciar drivers concretos y arrancar su lógica. Si el wiring de dependencias se mezcla con la lógica de negocio en una única función, esa lógica no puede probarse con drivers en-memoria sin ejecutar la función de wiring, y cambiar un driver obliga a tocar código que también contiene lógica.
16
+
17
+ ## Decisión
18
+
19
+ Cada app separa el wiring de dependencias de la lógica de negocio usando dos funciones:
20
+
21
+ - **Función de wiring** (p. ej. `main()`, `bootstrap()`) — la **raíz de composición única** de la app: lee configuración, instancia los drivers concretos de `shared-infra/<tech>/` ([A-025](./A-025-anatomia-mecanica-feature-puertos-adaptadores-drivers.md), [A-026](./A-026-infraestructura-compartida.md)), ensambla los adaptadores y el caso de uso de la feature, y construye el controlador y el presentador. Este es el **único** lugar donde se instancian clases concretas (drivers, adaptadores, caso de uso, controlador y presentador). Llama a la función de lógica pasándole el controlador ya cableado.
22
+ - **Función de lógica** (p. ej. `startServer(deps)`, `run(deps)`) — recibe las dependencias ya construidas y contiene la lógica pura (setup HTTP, poll loop, etc.). Esta función nunca importa drivers concretos.
23
+
24
+ Este patrón asegura:
25
+
26
+ - Las funciones de lógica son testeables con drivers en-memoria sin tocar la función de wiring
27
+ - Cambiar un driver solo toca la función de wiring
28
+ - Todas las apps siguen la misma estructura legible
29
+ - El **controlador y el presentador** son la frontera de la app, dos mitades simétricas: el controlador recibe el input desde afuera y lo entrega al caso de uso; el presentador recibe la salida del caso de uso (un `OutputDto` o su stream) y la mapea a la wire — con `representations/<protocol>/` cuando es schema'd, con transformaciones cosméticas propias de la app en caso contrario ([A-025](./A-025-anatomia-mecanica-feature-puertos-adaptadores-drivers.md), [A-026](./A-026-infraestructura-compartida.md)). La feature no nombra ni el transporte, ni el presentador, ni la representación.
30
+
31
+ **Variante sin contenedor de inyección**: cuando una app compone varios casos de uso a mano (p. ej. un CLI con un registry por feature), el seam de cada caso de uso declara los **puertos** que consume — en lugar del controlador ya cableado — y la función de lógica ensambla caso de uso y controlador a partir de ellos. El objetivo es el mismo (separar wiring de lógica); cambia qué cruza el seam: los puertos, para que el seam documente las dependencias reales del caso de uso.
32
+
33
+ Ejemplo conceptual (`server.ext`):
34
+
35
+ ```text
36
+ // función de wiring — única raíz de composición; instancia todo lo concreto
37
+ function main() {
38
+ settings = SettingsSchema.parse(env)
39
+ pool = new PostgresPool(settings.dbUrl) // shared-infra/postgres — conexión
40
+ repository = new RepositoryDriver(pool) // driver de shared-infra/postgres — implementa el driver port
41
+ notifier = new NotifierDriver(settings.smtpConfig) // driver autocontenido de shared-infra/notifier
42
+ useCase = new UseCase({ repository: new RepositoryAdapter(repository), notifier: new NotifierAdapter(notifier) })
43
+ controller = new Controller(useCase) // valida y traduce el input, invoca el caso de uso
44
+ presenter = new Presenter() // mapea la salida del caso de uso a la wire
45
+ return startServer({ settings, controller, presenter })
46
+ }
47
+
48
+ // función de lógica — setup HTTP puro, sin imports de drivers concretos
49
+ function startServer(deps) {
50
+ server = createServer((req, res) => { /* usa deps.controller y deps.presenter */ })
51
+ server.listen(deps.settings.port)
52
+ }
53
+ ```
54
+
55
+ El mismo patrón aplica a workers (la función de wiring cablea, la función de lógica es el loop) y a cualquier otro modo de despliegue. La composición de features en la función de wiring es la que describe [A-024](./A-024-features-slices-verticales-portables.md).
56
+
57
+ ## Consecuencias
58
+
59
+ ### Positivas
60
+
61
+ - **Testabilidad**: la lógica se prueba con drivers en-memoria sin ejecutar la función de wiring.
62
+ - **Cambios acotados**: cambiar un driver solo toca la función de wiring.
63
+ - **Estructura uniforme**: todas las apps comparten la misma separación.
64
+
65
+ ### Negativas
66
+
67
+ - **Convención obligatoria**: toda app debe respetar las dos funciones; mezclar wiring y lógica reintroduce el acoplamiento.
@@ -0,0 +1,54 @@
1
+ # A-029: Verbos de intención para métodos del lado del negocio
2
+
3
+ **Estado**: Aceptado
4
+
5
+ **Fecha**: 2026-08-13
6
+
7
+ **originally**: A-010
8
+
9
+ **Enriquecido desde**: Cortex ADR 037
10
+
11
+ **tags**: dominio
12
+
13
+ ## Contexto
14
+
15
+ En el lado del negocio de la Clean Architecture
16
+ ([A-001](./A-001-clean-architecture-4-capas.md)), los métodos comunican la acción de negocio que
17
+ ejecutan. Cuando un método usa un verbo de almacenamiento (`guardar_entidad`,
18
+ `persistir_datos`) expresa una operación CRUD, no la intención de negocio: entierra la acción
19
+ bajo el detalle de cómo se persiste. Un método con verbo de intención (`crear_entidad`,
20
+ `registrar_pedido`) comunica qué ocurrió en el negocio.
21
+
22
+ El vocabulario de esos verbos es el lenguaje ubicuo del sistema
23
+ ([A-031](./A-031-ubiquitous-language.md)). La regla alcanza a los métodos del lado del negocio
24
+ — el dominio y los casos de uso, con sus puertos —; el lado tecnológico (driver ports y
25
+ drivers) conserva su vocabulario técnico
26
+ ([A-025](./A-025-anatomia-mecanica-feature-puertos-adaptadores-drivers.md)).
27
+
28
+ ## Decisión
29
+
30
+ Los métodos del lado del negocio se nombran con verbos de intención de dominio, no con
31
+ verbos de almacenamiento. Por ejemplo:
32
+
33
+ | Verbo de almacenamiento | Verbo de intención |
34
+ |---|---|
35
+ | `guardar_entidad(...)` | `crear_entidad(...)`, `actualizar_entidad(...)` |
36
+ | `guardar_pedido(...)` | `registrar_pedido(...)` |
37
+ | `persistir_documento(...)` | `publicar_documento(...)` |
38
+
39
+ ## Consecuencias
40
+
41
+ ### Positivas
42
+
43
+ - **Nombres auto-documentados**: el nombre del método comunica la acción de negocio, no cómo se
44
+ persiste.
45
+ - **Alineación con el lenguaje ubicuo**: los métodos usan el vocabulario del dominio, manteniendo
46
+ código y modelo alineados.
47
+ - **Frontera agnóstica a la tecnología**: el nombre no menciona persistencia; el driver decide la
48
+ operación concreta (base de datos, GraphQL, bus de mensajes).
49
+
50
+ ### Negativas
51
+
52
+ - **Disciplina de nomenclatura**: el equipo debe rechazar verbos de almacenamiento en las revisiones.
53
+ - **Migración**: los métodos existentes con verbos de almacenamiento deben renombrarse, aunque pueden
54
+ migrarse feature por feature sin dependencias entre ellas.
@@ -0,0 +1,52 @@
1
+ # A-030: Herramientas de desarrollo globales
2
+
3
+ **Estado**: Aceptado
4
+
5
+ **Fecha**: 2026-08-14
6
+
7
+ **originally**: imolko
8
+
9
+ **tags**: tooling, agentes
10
+
11
+ ## Contexto
12
+
13
+ Cada repositorio de Imolko depende de un conjunto pequeño de herramientas globales
14
+ que el entorno de desarrollo usa en todas las apps y flujos de trabajo, sin importar
15
+ el dominio ni el lenguaje: **kubectl**, **glab** (el CLI de GitLab) y **pi** (el
16
+ agente de codificación).
17
+
18
+ Sin una decisión canónica, el toolchain queda implícito: cada desarrollador instala
19
+ las herramientas ad hoc (versiones distintas, o ninguna), el onboarding es manual, y
20
+ los scripts o agentes asumen herramientas que pueden no estar presentes.
21
+
22
+ ## Decisión
23
+
24
+ El toolchain global es **kubectl, glab y pi**. Cada herramienta tiene un único rol
25
+ definido:
26
+
27
+ | Tool | Rol |
28
+ |------|-----|
29
+ | kubectl | Interacción directa con los clústeres de Kubernetes: inspección, diagnóstico y operaciones ad hoc (`get`, `describe`, `logs`). |
30
+ | glab | CLI canónico del servidor de GitLab: issues, merge requests, labels, pipelines y releases. Es la interfaz de scripting que usan los skills. |
31
+ | pi | El agente de codificación ([pi.dev](https://pi.dev), paquete `@earendil-works/pi-coding-agent`) para desarrollo asistido y bucles autónomos. |
32
+
33
+ El despliegue pertenece a Helm ([A-012](./A-012-helm-mecanismo-primario-despliegue.md)).
34
+
35
+ ### Provisioning
36
+
37
+ Las tres herramientas se instalan en el **DevContainer**
38
+ ([A-020](./A-020-entorno-desarrollo-estandarizado-devcontainer.md)).
39
+
40
+ ## Consecuencias
41
+
42
+ ### Positivas
43
+
44
+ - **Toolchain canónico**: las tres herramientas y sus roles quedan en un único
45
+ documento, en lugar de asumirse por convención no escrita.
46
+
47
+ ### Negativas
48
+
49
+ - **Un ADR más que mantener**: si el toolchain cambia (se añade o reemplaza una
50
+ herramienta), este ADR debe actualizarse.
51
+ - **Herramientas que evolucionan aparte**: glab y pi publican a su propio ritmo;
52
+ este ADR las referencia por rol, no por versión.
@@ -0,0 +1,64 @@
1
+ # A-031: Lenguaje ubicuo
2
+
3
+ **Estado**: Aceptado
4
+
5
+ **Fecha**: 2026-08-14
6
+
7
+ **originally**: imolko
8
+
9
+ **tags**: dominio, agentes
10
+
11
+ ## Contexto
12
+
13
+ Cada repositorio de sistema de Imolko modela su negocio con Domain-Driven Design: la
14
+ capa `domain/` ([A-001](./A-001-clean-architecture-4-capas.md)) aloja el **lenguaje ubicuo** del sistema — el vocabulario
15
+ de negocio compartido por los expertos del dominio, los desarrolladores y el agente de
16
+ codificación.
17
+
18
+ La obligación de usarlo necesita una decisión canónica que fije en qué superficies
19
+ aplica y quién debe seguirlo.
20
+
21
+ Mientras esa obligación queda implícita y dispersa, el código, la documentación, los
22
+ tests y los artefactos de agente derivan hacia términos técnicos o inventados que no
23
+ son las palabras del negocio, erosionando el alineamiento entre el modelo y las
24
+ personas que lo usan.
25
+
26
+ ## Decisión
27
+
28
+ El **lenguaje ubicuo** de un sistema es el vocabulario canónico para nombrar y
29
+ describir los conceptos del dominio. Cada participante — desarrolladores y el agente
30
+ de codificación — lo usa en estas superficies:
31
+
32
+ 1. **Código**: nombres de artefactos de dominio, métodos, puertos y casos de uso que
33
+ representan conceptos de negocio.
34
+ 2. **Documentación**: READMEs, ADRs y documentación generada.
35
+ 3. **Tests**: nombres y descripciones de los tests.
36
+ 4. **Artefactos de agente**: PRDs, issues, slices, títulos y descripciones.
37
+
38
+ ### Fuente de verdad
39
+
40
+ El lenguaje ubicuo vive en la **capa de dominio** (`domain/`): cada concepto del
41
+ dominio se documenta en su propio `README.md`, que define su propósito de negocio y
42
+ sus reglas (ver
43
+ [A-032](./A-032-domain-artifact-documentation-format.md)). Cuando hay que elegir o
44
+ comprobar un término, la capa de dominio es la autoridad.
45
+
46
+ ## Consecuencias
47
+
48
+ ### Positivas
49
+
50
+ - **Una autoridad**: la capa de dominio es el único lugar donde el vocabulario se
51
+ define y se comprueba.
52
+ - **Nombrado consistente**: código, docs, tests y artefactos de agente hablan el mismo
53
+ lenguaje de negocio, manteniendo el modelo alineado con los expertos del dominio.
54
+ - **Alineación del agente**: el agente de codificación tiene una regla canónica y
55
+ citable.
56
+
57
+ ### Negativas
58
+
59
+ - **No aplicable mecánicamente**: si un nombre es el término de dominio correcto es un
60
+ juicio semántico; el gate de ADRs no puede validarlo (a diferencia de enlaces o
61
+ índices).
62
+ - **Requiere conocimiento del dominio**: usar el lenguaje correctamente depende de
63
+ conocer la capa de dominio; el onboarding debe apuntar a los recién llegados hacia
64
+ ella.
@@ -0,0 +1,128 @@
1
+ # A-032: Formato de documentación de artefactos de dominio y features
2
+
3
+ **Estado**: Aceptado
4
+
5
+ **Fecha**: 2026-08-14
6
+
7
+ **originally**: imolko
8
+
9
+ **tags**: dominio, tooling
10
+
11
+ ## Contexto
12
+
13
+ Los artefactos de dominio — value objects, entidades, agregados, eventos de dominio,
14
+ servicios y enums — son el vocabulario del lenguaje ubicuo del sistema (ver
15
+ [A-031](./A-031-ubiquitous-language.md)). Cada artefacto y cada caso de uso (feature) necesitan documentación
16
+ legible por humanos que los expertos del dominio puedan validar y que los
17
+ desarrolladores y agentes puedan descubrir, en todo repositorio de sistema, sin
18
+ importar el lenguaje de implementación.
19
+
20
+ Sin un formato canónico, cada artefacto se documenta de forma distinta: los nombres
21
+ de sección varían, el idioma se mezcla, y la documentación no puede ensamblarse en un
22
+ todo coherente y navegable.
23
+
24
+ ## Decisión
25
+
26
+ Cada artefacto de dominio o feature se documenta en su propio `README.md` con una
27
+ estructura canónica, escrito en español (el idioma de los expertos del dominio).
28
+
29
+ ### Estructura
30
+
31
+ - **El `README.md` empieza directamente con las secciones de contenido**: el nombre,
32
+ tipo y estado del artefacto los presenta el sistema de documentación.
33
+ - **Secciones obligatorias en español**, por tipo de artefacto:
34
+
35
+ | Tipo | Secciones obligatorias |
36
+ |------|----------------------|
37
+ | value-object, entity, aggregate | `## Propósito`, `## Reglas`, `## Ejemplos de uso`, `## Relaciones` |
38
+ | domain-event | `## Propósito`, `## Data del evento (vX.Y.Z)`, `## Ejemplos de uso`, `## Relaciones` |
39
+ | service | `## Propósito`, `## ServiceInput`, `## ServiceOutput`, `## Reglas`, `## Errores`, `## Ejemplos de uso`, `## Relaciones` |
40
+ | enum | `## Propósito`, `## Valores`, `## Ejemplos de uso`, `## Relaciones` |
41
+
42
+ Los casos de uso (features) siguen su propia estructura según `command` o `query`:
43
+
44
+ - command: `## Propósito`, `## Precondiciones`, `## Poscondiciones`, `## Flujo`, `## Errores`, `## Relaciones`
45
+ - query: `## Propósito`, `## Parámetros`, `## Resultado`, `## Flujo`, `## Errores`, `## Relaciones`
46
+
47
+ - **Columnas de las secciones tabulares**:
48
+
49
+ | Sección | Columnas |
50
+ |---------|----------|
51
+ | `## Reglas` | `Regla`, `Descripción` |
52
+ | `## Errores` | `Error`, `Condición` (features añaden `Recovery`) |
53
+ | `## ServiceInput`, `## ServiceOutput`, `## Data del evento` | `Campo`, `Tipo`, `Descripción` |
54
+ | `## Valores` | `Valor`, `Descripción` |
55
+ | `## Precondiciones` | `Precondición`, `Validación` |
56
+ | `## Poscondiciones` | `Poscondición`, `Efecto` |
57
+ | `## Parámetros` | `Parámetro`, `Tipo`, `Requerido`, `Descripción` |
58
+ | `## Resultado` | `Campo`, `Tipo`, `Descripción` |
59
+
60
+ - `## Relaciones` incluye siempre un diagrama Mermaid `graph TD` con aristas
61
+ etiquetadas que explican cada relación (`identidad`, `propiedad`, `contiene`,
62
+ `selecciona`, `emite`, `consume`, etc.). Los nodos llevan el nombre y el tipo del
63
+ artefacto: `Nombre["Artefacto<br/>(tipo)"]`.
64
+
65
+ ```mermaid
66
+ graph TD
67
+ Artifact["Artefacto<br/>(tipo)"]
68
+ Owner["Owner<br/>(entity)"]
69
+ Referrer["Referrer<br/>(aggregate)"]
70
+ Service["Service<br/>(service)"]
71
+
72
+ Owner -->|"identidad"| Artifact
73
+ Referrer -->|"propiedad"| Artifact
74
+ Service -->|"consume"| Artifact
75
+ ```
76
+
77
+ - `## Flujo` (command y query) es un diagrama Mermaid del pipeline del caso de uso.
78
+ - `## Ejemplos de uso` incluye siempre bloques de código.
79
+
80
+ ### Frontmatter
81
+
82
+ Cada `README.md` empieza con un bloque de frontmatter YAML delimitado por `---`.
83
+
84
+ **Artefactos de dominio:**
85
+
86
+ ```yaml
87
+ ---
88
+ description: |
89
+ <descripción enriquecida del artefacto>
90
+ domain: <nombre-del-proyecto>
91
+ boundedContext: <nombre-del-bounded-context>
92
+ type: value-object | entity | aggregate | domain-event | service | enum
93
+ tags:
94
+ - completed
95
+ ---
96
+ ```
97
+
98
+ **Features (casos de uso):**
99
+
100
+ ```yaml
101
+ ---
102
+ feature: <nombre-de-la-feature-en-kebab-case>
103
+ type: command | query
104
+ title: <título legible>
105
+ description: <descripción corta>
106
+ tags:
107
+ - completed | pending
108
+ - scope::*
109
+ ---
110
+ ```
111
+
112
+ El `type` del feature (`command` o `query`) lo clasifica [A-002](./A-002-cqrs-semantico.md); el tag `scope::*` lo define [A-009](./A-009-use-case-taxonomy.md).
113
+
114
+ ## Consecuencias
115
+
116
+ ### Positivas
117
+
118
+ - **Un formato, cualquier lenguaje**: el estándar aplica a cualquier repositorio de
119
+ sistema, independiente del tooling que ensambla la documentación.
120
+ - **Vocabulario descubrible**: cada `README.md` es el punto de entrada al propósito y
121
+ las reglas de su artefacto, alimentando el lenguaje ubicuo.
122
+
123
+ ### Negativas
124
+
125
+ - **No aplicable mecánicamente**: el formato se verifica por revisión o se delega al
126
+ agente, no por el gate de ADRs.
127
+ - **Diagramas manuales**: el diagrama Mermaid de `Relaciones` debe actualizarse
128
+ cuando nuevos artefactos se relacionan con el documentado.
@@ -0,0 +1,127 @@
1
+ # A-033: Estándar de mensajes de commit
2
+
3
+ **Estado**: Aceptado
4
+
5
+ **Fecha**: 2026-08-14
6
+
7
+ **originally**: imolko
8
+
9
+ **tags**: tooling, agentes
10
+
11
+ ## Contexto
12
+
13
+ Los mensajes de commit son la materia prima de tres capacidades que el equipo
14
+ quiere fiables: generar changelogs a partir del historial, trazar cada commit a
15
+ su work item y a su merge request, y conservar un repositorio de conocimiento de
16
+ la evolución del proyecto. Sin una convención canónica, los mensajes derivan
17
+ hacia estilos dispares:
18
+
19
+ - Estilo informal y desigual: `docs(adr):`, `chore(adr):`, `refactor:` y
20
+ `fix:` conviven con `feat(#670): Crear readme` (número de work item en el
21
+ alcance) y con descripciones en inglés y español sin criterio.
22
+ - El versionado de las librerías (SemVer) se apoya en keywords ad hoc en el
23
+ mensaje (`UPGRADE_MAJOR_VERSION`, `UPGRADE_MINOR_VERSION`): una segunda
24
+ convención de commits implícita, distinta de la anterior y tampoco gobernada.
25
+
26
+ Mientras no exista una decisión canónica, el changelog no puede derivarse de los
27
+ commits, la trazabilidad depende de la memoria de cada autor y no existe
28
+ validación del formato.
29
+
30
+ ## Decisión
31
+
32
+ Adoptar **Conventional Commits 1.0.0** como el estándar de mensajes de commit de
33
+ todo repositorio de Imolko, con vocabulario acotado y reglas de gobierno sobre
34
+ las superficies que lo consumen.
35
+
36
+ ### 1. Formato
37
+
38
+ ```text
39
+ <tipo>[alcance][!]: <descripción>
40
+
41
+ [cuerpo opcional]
42
+
43
+ [footers]
44
+ ```
45
+
46
+ - El **tipo** responde "qué tipo de cambio es"; el **alcance**, "dónde ocurrió".
47
+ El cuerpo explica el *porqué* cuando no es obvio desde el título.
48
+ - La descripción va en **español**, en infinitivo, en minúscula tras `:`, sin
49
+ punto final y de ≤72 caracteres. El tipo, el alcance y las keywords de footer
50
+ son tokens en **inglés**.
51
+ - Los términos de dominio usan el término canónico de la capa de dominio, tal cual
52
+ ([A-031](./A-031-ubiquitous-language.md)).
53
+
54
+ ### 2. Vocabulario de tipos
55
+
56
+ El contrato semántico fija qué tipos describen versión y cuáles no:
57
+
58
+ - `feat` (funcionalidad nueva) y `fix` (corrección de bug) se usan de forma
59
+ estricta; son los únicos tipos que mueven versión.
60
+ - Un **breaking change** se marca con `!` tras el tipo/alcance y/o con el footer
61
+ `BREAKING CHANGE:`.
62
+ - El vocabulario queda cerrado al de Conventional Commits 1.0.0: el resto de
63
+ tipos del estándar queda disponible.
64
+
65
+ La validación ejecutable del contrato vive en la configuración del linter de
66
+ cada repositorio; este ADR fija el contrato semántico, no duplica la lista.
67
+
68
+ ### 3. Alcances
69
+
70
+ El alcance es **opcional**, pero cuando aparece debe ser un **componente
71
+ arquitectónico estable** (bounded context, app desplegable o módulo transversal)
72
+ de la lista canónica del repositorio. La enumeración de cada repositorio
73
+ vive en la configuración de su linter.
74
+
75
+ ### 4. Trazabilidad con work items
76
+
77
+ Todo commit canónico lleva un **footer obligatorio** que enlaza al work item:
78
+ `Refs: #N` (lo toca) o `Closes: #N` (lo resuelve). El token `#N` es lo que
79
+ GitLab indexa para el enlace commit ↔ work item; `Closes` añade el cierre
80
+ automático al fusionar. El número de work item vive solo en el footer.
81
+
82
+ ### 5. Squash como commit canónico
83
+
84
+ El **commit canónico** es el **squash commit** del merge request de una feature: el título del
85
+ MR es el subject y la descripción del MR es el cuerpo con los footers. El flujo
86
+ de ramas y sus fusiones se gobierna en [A-041](./A-041-estrategia-de-ramas.md).
87
+
88
+ Los commits intermedios de desarrollo (`wip`, `fix typo`) no tienen que cumplir
89
+ la convención; solo el commit canónico la cumple.
90
+
91
+ ### 6. Enforcement
92
+
93
+ El formato se valida con un **linter en CI**: un job linta el título del MR y
94
+ su descripción — el commit canónico —, no cada commit de desarrollo; por eso la
95
+ validación vive en CI y no en push rules.
96
+
97
+ ### 7. Changelog y versionado
98
+
99
+ El commit convencional es la **única fuente de metadata** de la que se deriva el
100
+ changelog. La derivación de versión depende del tipo de repositorio, según
101
+ [A-017](./A-017-taxonomia-repositorios-librerias-sistemas.md)
102
+ y [A-016](./A-016-cicd-gitlab-pipeline-raiz-pipelines-modulares.md):
103
+
104
+ - **Librerías** (SemVer): `feat`→minor, `fix`→patch, breaking→major.
105
+ - **Sistemas** (CalVer): la versión se deriva de la fecha; los tipos solo
106
+ agrupan el changelog y el marcador breaking señala una liberación de ruptura.
107
+ - **Configuración**: queda fuera del versionado por tipos; si versiona (p. ej.
108
+ `version` de un chart), lo gobierna su propio mecanismo.
109
+
110
+ En las librerías, los tipos **sustituyen** a las keywords ad hoc
111
+ `UPGRADE_MAJOR_VERSION` / `UPGRADE_MINOR_VERSION`.
112
+
113
+ ## Consecuencias
114
+
115
+ ### Positivas
116
+
117
+ - **Contrato único para autores y agentes**: el estándar gobierna por igual los
118
+ commits de los autores y los del agente de codificación.
119
+
120
+ ### Negativas
121
+
122
+ - **Fricción en el MR**: el autor debe redactar título y footers según el
123
+ estándar.
124
+ - **No mecánicamente perfecto**: el linter valida forma, no semántica (si un
125
+ cambio es `feat` o `refactor` sigue siendo juicio humano).
126
+ - **Migración pendiente**: sustituir las keywords por tipos exige migrar el flujo
127
+ de release de las librerías; hasta entonces conviven dos convenciones.
@@ -0,0 +1,64 @@
1
+ # A-034: Conjunto canónico de skills del asistente de codificación
2
+
3
+ **Estado**: Aceptado
4
+
5
+ **Fecha**: 2026-08-14
6
+
7
+ **originally**: mattpocock-skills
8
+
9
+ **Enriquecido desde**: mattpocock/skills — taxonomía canónica de skills (engineering + productivity), adaptada al registro ADR de Guarura
10
+
11
+ **tags**: agentes, tooling
12
+
13
+ ## Contexto
14
+
15
+ El asistente de codificación (pi) descubre skills mediante el frontmatter de cada `SKILL.md` del paquete `@imolko/ultra-agent` ([A-052](./A-052-distribucion-metodologia-paquete-versionado.md)), que los materializa en la ubicación de descubrimiento de cada harness. El agente es más productivo cuando las convenciones de cada skill se adaptan a las prácticas del repositorio; sin una decisión canónica, cada skill mapearía esas convenciones a su manera, produciendo referencias rotas y convenciones inconsistentes entre skills.
16
+
17
+ ## Decisión
18
+
19
+ Adoptar un **conjunto canónico de skills** que cubre el ciclo de desarrollo completo y trabaja en tándem con el registro ADR. El conjunto gobierna la metodología de desarrollo; cada repositorio añade skills propios para los problemas particulares de su proyecto, fuera del alcance de este ADR. La lista concreta vive en el paquete `@imolko/ultra-agent` — la fuente canónica, distribuida y versionada según [A-052](./A-052-distribucion-metodologia-paquete-versionado.md) — y no se duplica aquí (regla `hardcoded` de [ADR-0000](../ADR-0000-proceso-y-formato-de-adrs.md)).
20
+
21
+ ### Modelo del ciclo
22
+
23
+ Los skills se dividen en dos clases según cómo se invocan:
24
+
25
+ - **Puntos de entrada**: invocados por la persona, sin carga de contexto; inician una unidad de trabajo deliberada.
26
+ - **Disciplinas**: invocados por el modelo, o alcanzados por otro skill a mitad de trabajo; llevan `description` en el prompt del sistema para que el agente las alcance por sí mismo o desde otro skill.
27
+
28
+ Qué skills pertenecen a cada clase vive en el paquete `@imolko/ultra-agent` (la fuente canónica del conjunto, [A-052](./A-052-distribucion-metodologia-paquete-versionado.md)).
29
+
30
+ ### Contrato de adaptación
31
+
32
+ Cada skill adoptado de una taxonomía externa reemplaza las convenciones ajenas por las del repositorio:
33
+
34
+ | Convención ajena | Equivalente en el repositorio |
35
+ |---------------------------|------------------------|
36
+ | `CONTEXT.md` (glosario) | `domain/` READMEs ([A-031](./A-031-ubiquitous-language.md), [A-032](./A-032-domain-artifact-documentation-format.md)) |
37
+ | `CODING_STANDARDS.md` | el registro `docs/adr/` |
38
+ | `docs/agents/issue-tracker.md` + `ready-for-agent` | GitLab + la convención skill-first ([A-038](./A-038-issues-referencian-skills-nombre.md)) |
39
+ | `AGENTS.md` / `CLAUDE.md` | no se referencian |
40
+
41
+ El CLI del tracker se lee de `tracker_cli` en `docs/agents/repo-config.md` ([A-052](./A-052-distribucion-metodologia-paquete-versionado.md)).
42
+
43
+ ### Límite de escritura
44
+
45
+ El registro global es de solo lectura: `ADR-0000` y los tiers A, T y P no se modifican nunca desde un skill. Lo escribible es el **tier de proyecto** (las decisiones específicas del dominio del proyecto) y los `README.md` de `domain/`. El skill que registra decisiones (modelado de dominio) escribe solo en ese ámbito, siguiendo A-031 y A-032 para el glosario y ADR-0000 para los ADR.
46
+
47
+ ### Documentación del conjunto
48
+
49
+ - Un **router skill** (`workflow`) nombra los skills canónicos y el orden del ciclo — es el mapa para la persona.
50
+ - Este ADR documenta la metodología — el modelo del ciclo, la división de invocación y el contrato de adaptación.
51
+
52
+ ## Consecuencias
53
+
54
+ ### Positivas
55
+
56
+ - **Una taxonomía, no una convención por skill**: todos los skills comparten el mismo contrato de adaptación y los mismos límites de escritura.
57
+ - **Descubrimiento determinista**: los puntos de entrada no pagan contexto; las disciplinas se alcanzan por `description`.
58
+ - **Un solo mapa**: el router `workflow` evita que la persona memorice el conjunto de skills.
59
+
60
+ ### Negativas
61
+
62
+ - **Un conjunto de skills que mantener**: cada skill nuevo o renombrado debe actualizar el router y sus referencias.
63
+ - **Acoplamiento por nombre**: renombrar un skill rompe las referencias `/skill:<name>` en issues y en otros skills.
64
+ - **Carga cognitiva en los puntos de entrada**: los skills de entrada dependen de que la persona los recuerde — mitigada por el router.
@@ -0,0 +1,51 @@
1
+ # A-035: Captura de ideas y re-anclaje de candies al flujo de agentes
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 candy es la unidad de complejidad de un issue; las horas sirven para comunicar esa complejidad entre humanos. La escala se mantiene calibrada empíricamente: se registra el tiempo invertido de cada issue y se promedian horas hasta producción por candy.
14
+
15
+ El ciclo canónico de skills ([A-034](./A-034-canonical-skill-set.md)) necesita una puerta de entrada que convierta una **idea cruda** en un issue aprehensible. Sus etapas — sintetizar el spec, clasificar issues que ya existen, afinar un plan — operan todas después de la idea cruda.
16
+
17
+ El flujo agéntico desplaza la unidad natural de trabajo a la **sesión de agente**. El candy conserva su significado — complejidad — y re-ancla su unidad a esa sesión.
18
+
19
+ ## Decisión
20
+
21
+ Re-anclar el candy de horas a **sesiones de agente** y enrutar cada idea por su candy:
22
+
23
+ 1. **El candy**: 1 candy ≈ 1 issue del tamaño de una sesión; `?` significa "no estimable"; 16+ es "demasiado grande → partir". Las labels `candy::N` y `type::idea` las formaliza [A-037](./A-037-formalizacion-taxonomia-labels.md).
24
+ 2. **El enrutado**: cada idea lleva la ruta publicada como primera instrucción de `# Skill recomendado` ([A-038](./A-038-issues-referencian-skills-nombre.md)). La **línea de spec** — afinar la idea, sintetizar el spec y las tareas ([A-042](./A-042-formato-documentos-issue-tracker.md)) e implementar ([A-039](./A-039-pipeline-ship-issues-hijos-spec.md)) — es la ruta de las ideas estimables; **wayfinding** ([A-036](./A-036-adopcion-wayfinder-ortogonalidad-labels.md)) es la ruta de las que necesitan mapa.
25
+
26
+ | Candy | Ruta |
27
+ |-------|------|
28
+ | 1–4 | la línea de spec |
29
+ | 8 | wayfinding |
30
+ | `?` | wayfinding + `# Pregunta` (la única pregunta cuya respuesta hace estimable la idea); cuando el camino quede claro, la línea de spec |
31
+ | 16+ | no publica issue; remite directamente a wayfinding |
32
+
33
+ Para aplicar este enrutado, el ciclo gana una **puerta de entrada de captura de ideas** (invocada por la persona, sin carga de contexto): entrevista, mapea al vocabulario del dominio ([A-031](./A-031-ubiquitous-language.md)) y busca issues similares, y publica el issue con su candy y su ruta; la persona decide la estimación y si es duplicado. El skill que la implementa vive en el paquete `@imolko/ultra-agent` ([A-034](./A-034-canonical-skill-set.md)); la estructura del issue sigue la Idea de [A-042](./A-042-formato-documentos-issue-tracker.md).
34
+
35
+ La **reunión semanal** sobrevive, más ligera: deja de estimar (lo hace la puerta de entrada) y conserva sus dos trabajos genuinamente colectivos — priorizar (`priority::hot`/`warm`, [A-037](./A-037-formalizacion-taxonomia-labels.md)) y **re-estimar** candies cuando el contexto nuevo lo justifica. La re-estimación cambia la label `candy::N` (el tracker lo registra como evento del issue) y añade un comentario con el nuevo enrutado (referenciando el skill por nombre, [A-038](./A-038-issues-referencian-skills-nombre.md)), conservando la redacción original del proponente.
36
+
37
+ ## Consecuencias
38
+
39
+ ### Positivas
40
+
41
+ - **Las ideas crudas ya no viven solo en cabezas o chats**: se convierten en issues aprehensibles con un enrutado que apunta al afilador correcto.
42
+ - **El candy sobrevive como vocabulario de estimación** del equipo, re-anclado a la unidad agéntica (sesiones), y el bucle de calibración empírico (registrar → promediar → recalibrar) se conserva tal cual, cambiando solo la unidad registrada.
43
+ - **La reunión conserva lo colectivo** (priorizar y re-estimar) y suelta la estimación mecánica.
44
+
45
+ ### Negativas
46
+
47
+ - **Dos artefactos nuevos que mantener**: el skill y las labels, además de actualizar el router del ciclo.
48
+ - **La unidad "sesión" no es intuitiva** hasta que el bucle de calibración produzca datos; las primeras estimaciones tenderán a `?`.
49
+ - **La re-estimación que cruza la frontera 4/8 exige disciplina** (label + comentario juntos); si se cambia solo la label, el enrutado del issue miente.
50
+ - **La pasada de mapeo añade un paso a la entrevista ligera**: se mitiga proponiendo solo cuando existe un término canónico en los READMEs de `domain/`.
51
+ - **Las ideas `?` pagan la maquinaria de wayfinding** incluso cuando la niebla era una sola pregunta; la escotilla de "sin niebla" de [A-036](./A-036-adopcion-wayfinder-ortogonalidad-labels.md) lo mitiga.
@@ -0,0 +1,37 @@
1
+ # A-036: Wayfinding y ortogonalidad de labels del issue tracker
2
+
3
+ **Estado**: Aceptado
4
+
5
+ **Fecha**: 2026-08-17
6
+
7
+ **originally**: mattpocock-skills
8
+
9
+ **tags**: agentes, tooling
10
+
11
+ ## Contexto
12
+
13
+ El enrutado de ideas 8+ y de ideas `?` ([A-035](./A-035-captura-ideas-reanclaje-candies.md)) remite a un camino para esfuerzos grandes, multi-sesión o con la ruta poco clara (la niebla). **Ese camino es wayfinding**: planificar un trabajo que no cabe en una sesión de agente como un **mapa** compartido y una serie de **tickets de decisión** hijos, resueltos de a uno por sesión hasta que el camino queda claro.
14
+
15
+ El tracker ya tiene varias dimensiones de labels; las labels de wayfinding entran en él y necesitan un criterio propio para convivir con las existentes. La formalización completa de la taxonomía la gobierna [A-037](./A-037-formalizacion-taxonomia-labels.md); este ADR fija el criterio con el que entran.
16
+
17
+ ## Decisión
18
+
19
+ Los artefactos de wayfinding — el mapa y los tickets de decisión — entran en el tracker con una dimensión propia, **`wayfinder::*`**, que responde exactamente "¿qué artefacto de planificación?". Un artefacto de wayfinding no es un work item — nunca lleva `type::` ni `candy::`, y su modo de ejecución reutiliza la dimensión `exec::` ([A-037](./A-037-formalizacion-taxonomia-labels.md)).
20
+
21
+ Las labels de la dimensión son `wayfinder::map` (el mapa) y `wayfinder::research`/`spike`/`grilling`/`task` (los tickets de decisión), con doble dos-puntos (`::`), la convención del repositorio.
22
+
23
+ La maquinaria de wayfinding vive en el paquete `@imolko/ultra-agent` ([A-034](./A-034-canonical-skill-set.md)).
24
+
25
+ La taxonomía completa — las seis dimensiones — la gobierna [A-037](./A-037-formalizacion-taxonomia-labels.md); este ADR fija solo el principio de entrada de wayfinding.
26
+
27
+ ## Consecuencias
28
+
29
+ ### Positivas
30
+
31
+ - **Una ruta canónica** para esfuerzos grandes, multi-sesión o de ruta poco clara, alcanzada por el enrutado de ideas 8+ y `?` ([A-035](./A-035-captura-ideas-reanclaje-candies.md)).
32
+ - **Labels nuevas ortogonales**: siguen la convención `::` del repositorio y una regla explícita, ortogonales a `type::`, `candy::` y `exec::`.
33
+
34
+ ### Negativas
35
+
36
+ - **Maquinaria pesada**: las ideas 8+ pagan la maquinaria de wayfinding incluso cuando la ruta resulta clara; la escotilla de "sin niebla" lo mitiga.
37
+ - **Más labels que crear y mantener**.