@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,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**.
|