ndomo 0.1.0
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/.bun-version +1 -0
- package/.dockerignore +79 -0
- package/.editorconfig +18 -0
- package/.env.example +19 -0
- package/.github/CODEOWNERS +8 -0
- package/.github/ISSUE_TEMPLATE/bug_report.yml +62 -0
- package/.github/ISSUE_TEMPLATE/config.yml +2 -0
- package/.github/ISSUE_TEMPLATE/feature_request.yml +34 -0
- package/.github/dependabot.yml +36 -0
- package/.github/pull_request_template.md +24 -0
- package/.github/release.yml +30 -0
- package/.github/workflows/gitleaks.yml +28 -0
- package/.github/workflows/release-please.yml +27 -0
- package/.github/workflows/smoke.yml +29 -0
- package/.husky/commit-msg +1 -0
- package/CHANGELOG.md +114 -0
- package/Dockerfile +32 -0
- package/README.es.md +174 -0
- package/README.md +187 -0
- package/agents/chronicler.md +98 -0
- package/agents/ci-smith.md +136 -0
- package/agents/craftsman.md +341 -0
- package/agents/deploy-smith.md +138 -0
- package/agents/foreman.md +377 -0
- package/agents/go-smith.md +164 -0
- package/agents/guild.md +188 -0
- package/agents/inspector.md +83 -0
- package/agents/js-smith.md +127 -0
- package/agents/ops-scout.md +173 -0
- package/agents/painter.md +200 -0
- package/agents/python-smith.md +120 -0
- package/agents/ranger.md +307 -0
- package/agents/release-smith.md +165 -0
- package/agents/rust-smith.md +159 -0
- package/agents/sage.md +178 -0
- package/agents/scout.md +144 -0
- package/agents/scribe.md +156 -0
- package/agents/smith.md +201 -0
- package/agents/vue-smith.md +155 -0
- package/agents/warden.md +216 -0
- package/agents/zig-smith.md +156 -0
- package/bin/ndomo-analyses.ts +4 -0
- package/bin/ndomo-status.ts +4 -0
- package/biome.json +57 -0
- package/bun.lock +514 -0
- package/commitlint.config.js +3 -0
- package/config/ndomo.config.json +258 -0
- package/config/ndomo.schema.json +166 -0
- package/docs/agents.md +375 -0
- package/docs/bugs/plan-create-orphan-fk.md +131 -0
- package/docs/bugs/task_create_batch-order-index-collision.md +158 -0
- package/docs/configuration.md +276 -0
- package/docs/database.md +364 -0
- package/docs/features/feature-flexible-builder-v1.md +724 -0
- package/docs/features/feature-flexible-builder-v2.md +882 -0
- package/docs/features/feature-flexible-builder.md +974 -0
- package/docs/http-server.md +244 -0
- package/docs/installation.md +259 -0
- package/docs/integrations.md +129 -0
- package/docs/operations/anti-pattern-sub-agent-verify-2026-06-21.md +32 -0
- package/docs/operations/audit-v1.md +417 -0
- package/docs/operations/audit-v2.md +197 -0
- package/docs/operations/audit-v3.md +306 -0
- package/docs/operations/db-optimize-foundations.md +123 -0
- package/docs/operations/verify-gate-architecture.md +82 -0
- package/docs/workflows.md +448 -0
- package/opencode.json +5 -0
- package/package.json +65 -0
- package/release-please-config.json +11 -0
- package/scripts/dev-bust-cache.sh +164 -0
- package/scripts/install.sh +688 -0
- package/scripts/smoke-e2e.ts +704 -0
- package/scripts/smoke-hot.ts +417 -0
- package/scripts/smoke-http.sh +228 -0
- package/scripts/smoke-v4.ts +256 -0
- package/scripts/smoke-v5.ts +397 -0
- package/scripts/smoke.sh +9 -0
- package/scripts/uninstall.sh +224 -0
- package/skills/api-security-best-practices/SKILL.md +915 -0
- package/skills/bash-scripting/SKILL.md +201 -0
- package/skills/bun/SKILL.md +313 -0
- package/skills/cavecrew/SKILL.md +82 -0
- package/skills/caveman/SKILL.md +74 -0
- package/skills/caveman-review/README.md +33 -0
- package/skills/caveman-review/SKILL.md +55 -0
- package/skills/find-skills/SKILL.md +142 -0
- package/skills/frontend-design/LICENSE.txt +177 -0
- package/skills/frontend-design/SKILL.md +55 -0
- package/skills/golang-patterns/SKILL.md +674 -0
- package/skills/golang-security/SKILL.md +185 -0
- package/skills/golang-security/evals/evals.json +595 -0
- package/skills/golang-security/references/architecture.md +268 -0
- package/skills/golang-security/references/checklist.md +80 -0
- package/skills/golang-security/references/cookies.md +200 -0
- package/skills/golang-security/references/cryptography.md +424 -0
- package/skills/golang-security/references/filesystem.md +285 -0
- package/skills/golang-security/references/injection.md +315 -0
- package/skills/golang-security/references/logging.md +163 -0
- package/skills/golang-security/references/memory-safety.md +241 -0
- package/skills/golang-security/references/network.md +253 -0
- package/skills/golang-security/references/secrets.md +189 -0
- package/skills/golang-security/references/third-party.md +159 -0
- package/skills/golang-security/references/threat-modeling.md +189 -0
- package/skills/golang-testing/SKILL.md +720 -0
- package/skills/grill-me/SKILL.md +7 -0
- package/skills/javascript-testing-patterns/SKILL.md +537 -0
- package/skills/javascript-testing-patterns/references/advanced-testing-patterns.md +513 -0
- package/skills/modern-javascript-patterns/SKILL.md +43 -0
- package/skills/modern-javascript-patterns/references/advanced-patterns.md +487 -0
- package/skills/modern-javascript-patterns/references/details.md +457 -0
- package/skills/python-anti-patterns/SKILL.md +349 -0
- package/skills/python-design-patterns/SKILL.md +85 -0
- package/skills/python-design-patterns/references/details.md +353 -0
- package/skills/python-error-handling/SKILL.md +193 -0
- package/skills/python-error-handling/references/details.md +171 -0
- package/skills/python-testing-patterns/SKILL.md +278 -0
- package/skills/python-testing-patterns/references/advanced-patterns.md +411 -0
- package/skills/python-testing-patterns/references/details.md +349 -0
- package/skills/rust-patterns/SKILL.md +500 -0
- package/skills/rust-testing/SKILL.md +501 -0
- package/skills/security-review/SKILL.md +504 -0
- package/skills/security-review/cloud-infrastructure-security.md +361 -0
- package/skills/vue-best-practices/SKILL.md +154 -0
- package/skills/vue-best-practices/references/animation-class-based-technique.md +254 -0
- package/skills/vue-best-practices/references/animation-state-driven-technique.md +291 -0
- package/skills/vue-best-practices/references/component-async.md +97 -0
- package/skills/vue-best-practices/references/component-data-flow.md +307 -0
- package/skills/vue-best-practices/references/component-fallthrough-attrs.md +174 -0
- package/skills/vue-best-practices/references/component-keep-alive.md +137 -0
- package/skills/vue-best-practices/references/component-slots.md +216 -0
- package/skills/vue-best-practices/references/component-suspense.md +228 -0
- package/skills/vue-best-practices/references/component-teleport.md +108 -0
- package/skills/vue-best-practices/references/component-transition-group.md +128 -0
- package/skills/vue-best-practices/references/component-transition.md +125 -0
- package/skills/vue-best-practices/references/composables.md +290 -0
- package/skills/vue-best-practices/references/directives.md +162 -0
- package/skills/vue-best-practices/references/perf-avoid-component-abstraction-in-lists.md +159 -0
- package/skills/vue-best-practices/references/perf-v-once-v-memo-directives.md +182 -0
- package/skills/vue-best-practices/references/perf-virtualize-large-lists.md +187 -0
- package/skills/vue-best-practices/references/plugins.md +166 -0
- package/skills/vue-best-practices/references/reactivity.md +344 -0
- package/skills/vue-best-practices/references/render-functions.md +201 -0
- package/skills/vue-best-practices/references/sfc.md +310 -0
- package/skills/vue-best-practices/references/state-management.md +135 -0
- package/skills/vue-best-practices/references/updated-hook-performance.md +187 -0
- package/skills/vue-pinia-best-practices/SKILL.md +21 -0
- package/skills/vue-pinia-best-practices/reference/pinia-no-active-pinia-error.md +248 -0
- package/skills/vue-pinia-best-practices/reference/pinia-setup-store-return-all-state.md +227 -0
- package/skills/vue-pinia-best-practices/reference/pinia-store-destructuring-breaks-reactivity.md +193 -0
- package/skills/vue-pinia-best-practices/reference/state-url-for-ephemeral-filters.md +238 -0
- package/skills/vue-pinia-best-practices/reference/state-use-pinia-for-large-apps.md +262 -0
- package/skills/vue-pinia-best-practices/reference/store-method-binding-parentheses.md +191 -0
- package/skills/zig-0.16/SKILL.md +840 -0
- package/skills/zig-0.16/scripts/check-zig-version.sh +21 -0
- package/src/cli/analyses.ts +280 -0
- package/src/cli/index.ts +108 -0
- package/src/cli/serve.ts +192 -0
- package/src/cli/smoke.ts +131 -0
- package/src/cli/status.test.ts +204 -0
- package/src/cli/status.ts +263 -0
- package/src/cli/vacuum.test.ts +82 -0
- package/src/cli/vacuum.ts +96 -0
- package/src/config/schema.test.ts +88 -0
- package/src/config/schema.ts +64 -0
- package/src/db/analyses-migration.test.ts +210 -0
- package/src/db/analyses.test.ts +466 -0
- package/src/db/analyses.ts +375 -0
- package/src/db/auto-checkpoint.ts +131 -0
- package/src/db/client.test.ts +129 -0
- package/src/db/client.ts +55 -0
- package/src/db/fts-escape.ts +20 -0
- package/src/db/incidents.test.ts +201 -0
- package/src/db/incidents.ts +93 -0
- package/src/db/index.ts +86 -0
- package/src/db/migrations-v13.test.ts +141 -0
- package/src/db/migrations-v8.test.ts +301 -0
- package/src/db/migrations.ts +147 -0
- package/src/db/plan-archive.test.ts +180 -0
- package/src/db/plan-archive.ts +274 -0
- package/src/db/plan-create.test.ts +276 -0
- package/src/db/plan-create.ts +78 -0
- package/src/db/plan-files.test.ts +289 -0
- package/src/db/plan-update-status.ts +287 -0
- package/src/db/plans.test.ts +490 -0
- package/src/db/plans.ts +534 -0
- package/src/db/resolve-project-dir.test.ts +143 -0
- package/src/db/resolve-project-dir.ts +75 -0
- package/src/db/rollbacks.test.ts +150 -0
- package/src/db/rollbacks.ts +67 -0
- package/src/db/schema.ts +907 -0
- package/src/db/sessions.test.ts +80 -0
- package/src/db/sessions.ts +135 -0
- package/src/db/shutdown.test.ts +147 -0
- package/src/db/shutdown.ts +45 -0
- package/src/db/tasks.test.ts +921 -0
- package/src/db/tasks.ts +747 -0
- package/src/db/types.ts +619 -0
- package/src/http/__tests__/auth.test.ts +196 -0
- package/src/http/__tests__/routes.test.ts +465 -0
- package/src/http/__tests__/sse.test.ts +317 -0
- package/src/http/auth.ts +72 -0
- package/src/http/middleware/cors.ts +53 -0
- package/src/http/middleware/security-headers.ts +21 -0
- package/src/http/routes/events.ts +112 -0
- package/src/http/routes/health.ts +51 -0
- package/src/http/routes/plans.ts +66 -0
- package/src/http/routes/sessions.ts +50 -0
- package/src/http/routes/tasks.ts +60 -0
- package/src/http/server.ts +95 -0
- package/src/http/sse.ts +116 -0
- package/src/index.ts +37 -0
- package/src/lib.ts +65 -0
- package/src/mem/scoped.ts +65 -0
- package/src/orchestrator/background.test.ts +268 -0
- package/src/orchestrator/background.ts +293 -0
- package/src/orchestrator/memory-hook.ts +182 -0
- package/src/orchestrator/reconciler.ts +123 -0
- package/src/orchestrator/scheduler.test.ts +300 -0
- package/src/orchestrator/scheduler.ts +243 -0
- package/src/plugin.test.ts +2574 -0
- package/src/plugin.ts +1690 -0
- package/src/sdk/client.ts +66 -0
- package/src/worktrees/manager.ts +236 -0
- package/src/worktrees/state.ts +87 -0
- package/tests/integration/ranger-flow.test.ts +257 -0
- package/tools/analysis_archive.ts +28 -0
- package/tools/analysis_create.ts +55 -0
- package/tools/analysis_get.ts +33 -0
- package/tools/analysis_link_plan.ts +44 -0
- package/tools/analysis_list.ts +48 -0
- package/tools/analysis_search.ts +36 -0
- package/tools/analysis_update.ts +44 -0
- package/tools/plan_approve.ts +31 -0
- package/tools/plan_create.ts +58 -0
- package/tools/plan_get.ts +40 -0
- package/tools/plan_list.ts +37 -0
- package/tools/plan_search.ts +34 -0
- package/tools/plan_update_status.ts +71 -0
- package/tools/session_checkpoint.ts +31 -0
- package/tools/session_end.ts +26 -0
- package/tools/session_start.ts +43 -0
- package/tools/task_create_batch.ts +70 -0
- package/tools/task_list.ts +35 -0
- package/tools/task_next_for_agent.ts +30 -0
- package/tools/task_search.ts +34 -0
- package/tools/task_update_status.ts +37 -0
- package/tsconfig.json +31 -0
|
@@ -0,0 +1,882 @@
|
|
|
1
|
+
# Feature: Primary Craftsman — refactor arquitectónico (v2)
|
|
2
|
+
|
|
3
|
+
**Slug:** `feature-flexible-builder`
|
|
4
|
+
**Status:** Draft (spec v2)
|
|
5
|
+
**Plan ID:** `be21c801-b770-4d82-979a-2bb5186928f1`
|
|
6
|
+
**Plan slug:** `flexible-builder-v2`
|
|
7
|
+
**Created:** 2026-06-19
|
|
8
|
+
**Supersedes:** `docs/features/feature-flexible-builder-v1.md`
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 1. Resumen ejecutivo
|
|
13
|
+
|
|
14
|
+
Refactor arquitectónico mayor del ecosistema ndomo. Dos cambios estructurales que transforman el modelo de orquestación:
|
|
15
|
+
|
|
16
|
+
1. **Foreman simplificado a 4 pasos** (Aclaración → Exploración → Plan atómico → Persistir): se eliminan 6 pasos del flujo original de 10 (Brief de Delegación, Trivium en Vivo, Reconciliación, Validación, Reporte Final). Foreman pasa de orquestador ejecutor a **planner puro**: planifica y persiste en DB; la ejecución la toma otro agente.
|
|
17
|
+
|
|
18
|
+
2. **Nuevo primary `craftsman`** (antes `builder` en v1): agente implementador disciplinado con threshold estricto 2/5/1. Ataca bugs, features pequeñas y refactors acotados sin pasar por el ciclo de planificación del foreman. Opera con 4 estados de complejidad progresiva.
|
|
19
|
+
|
|
20
|
+
El user alterna manualmente entre foreman (planificación formal) y craftsman (ejecución directa) mediante el TUI. No hay dispatch automático ni enrutamiento foreman→craftsman — la separación es manual por diseño.
|
|
21
|
+
|
|
22
|
+
**Decisión clave del grill:** El nombre final es `craftsman` (no `builder`). El threshold es **2/5/1** (no 1/2-5/3 como en v1). El prompt del craftsman incluye 4 estados (no 3). Foreman baja a 4 pasos puramente planificadores.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## 2. Contexto y motivación
|
|
27
|
+
|
|
28
|
+
### 2.1 Problemas del foreman original (10 pasos)
|
|
29
|
+
|
|
30
|
+
El `foreman` (`agents/foreman.md`) operaba con un flujo de 10 pasos obligatorios que mezclaba planificación con ejecución:
|
|
31
|
+
|
|
32
|
+
| # | Paso | Problema |
|
|
33
|
+
|---|------|----------|
|
|
34
|
+
| 1 | Aclaración | OK — necesario |
|
|
35
|
+
| 2 | Memory Search | OK — necesario |
|
|
36
|
+
| 3 | Routing | OK — necesario |
|
|
37
|
+
| 4 | Plan Atómico | OK — necesario |
|
|
38
|
+
| 5 | Brief de Delegación | Inflado: el prompt del subagente ya contiene el objetivo |
|
|
39
|
+
| 6 | Trivium en Vivo | Contradictorio: foreman no debe implementar |
|
|
40
|
+
| 7 | Reconciliación | Innecesario si craftsman ejecuta completo |
|
|
41
|
+
| 8 | Validación | Craftsman corre sus propios tests |
|
|
42
|
+
| 9 | Reporte Final | Craftsman reporta en su output |
|
|
43
|
+
|
|
44
|
+
**Evidencia:** `agents/foreman.md:162-200` — secuencia de 10 pasos que el foreman debía seguir en cada request.
|
|
45
|
+
|
|
46
|
+
### 2.2 Grietas específicas identificadas
|
|
47
|
+
|
|
48
|
+
| Grieta | Ubicación en v1 | Impacto |
|
|
49
|
+
|--------|-----------------|---------|
|
|
50
|
+
| Trivium ≤5 líneas, 1 archivo, 0 nuevos exports | `agents/foreman.md:29-34` | Foreman no puede corregir ni un typo sin delegar |
|
|
51
|
+
| No hay modo ad-hoc; toda tarea requiere `plan_create` + `task_create_batch` | `agents/foreman.md:238` | Tareas de 1 archivo requieren ciclo completo de plan_db |
|
|
52
|
+
| `session_start` colisiona con `ctx.sessionID` | `docs/bugs/plan-create-orphan-fk.md:60-70` | `plan_approve`/`plan_update_status` fallan sin `session_start` explícito |
|
|
53
|
+
| `task_update_status` trunca `result`/`error` a 16KB | `src/db/tasks.ts:109-121` | Outputs grandes se pierden sin advertencia |
|
|
54
|
+
| Foreman monopoliza rol de "único primary" | `agents/foreman.md:28` y `agents/*.md` (`mode: subagent`) | User no puede delegar directamente a un smith |
|
|
55
|
+
| Routing estático en scheduler | `src/orchestrator/scheduler.ts:41-47` | No hay detección dinámica de stack |
|
|
56
|
+
| `opencode.json` ausente en el repo | `glob("*opencode.json*")` → 0 resultados | Config global no versionada |
|
|
57
|
+
| Sin asociación plan↔archivos | `src/db/schema.ts` | No hay trazabilidad de qué archivos toca cada plan |
|
|
58
|
+
| Sin `original_plan_data` | `src/db/schema.ts` | No hay audit trail de "qué se planeó vs qué se hizo" |
|
|
59
|
+
| Sin `plan_delete` | `src/plugin.ts` | No hay forma segura de eliminar planes huérfanos |
|
|
60
|
+
|
|
61
|
+
### 2.3 Diferencias clave entre v1 y v2
|
|
62
|
+
|
|
63
|
+
| Aspecto | v1 (`builder`) | v2 (`craftsman`) |
|
|
64
|
+
|---------|----------------|-------------------|
|
|
65
|
+
| Nombre | `builder` | `craftsman` (confirmado en grill) |
|
|
66
|
+
| Estados | 3 (trivial, ad-hoc, formal) | 4 (con threshold 2/5/1) |
|
|
67
|
+
| Threshold archivos | 1 / 2-5 / >5 | ≤2 Estado 1, 3-5 Estado 2, >5 Estado 4 |
|
|
68
|
+
| Foreman | Sin cambios (10 pasos) | Simplificado a 4 pasos (planner puro) |
|
|
69
|
+
| Cross-session close | `created_by` básico | `executed_by_agent` + `executed_by_session` + `created_by_agent` |
|
|
70
|
+
| Migraciones DB | v6 + v7 | v6 (original_plan_data) + v7 (plan_files) + v8 (agent/session audit) |
|
|
71
|
+
| Painter routing | Foreman | Solo craftsman |
|
|
72
|
+
| Caveman | 14 agents target | Mismos 14 + snippet estándar |
|
|
73
|
+
| `plan_delete` | Fase 3 | Fase 1 (priorizada) |
|
|
74
|
+
| Plan ≤5 steps | Soft warning | Soft warning + log |
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## 3. Análisis comparativo con nicosup98/ndomo
|
|
79
|
+
|
|
80
|
+
### 3.1 Arquitectura referencia: architect + builder + qagent
|
|
81
|
+
|
|
82
|
+
El proyecto referencia `nicosup98/ndomo` (opencode-core-slim) define tres modos de trabajo:
|
|
83
|
+
|
|
84
|
+
| Modo | Agente | Cuándo |
|
|
85
|
+
|------|--------|--------|
|
|
86
|
+
| Plan formal | `architect` (primary) | Tarea multi-archivo, necesita diseño |
|
|
87
|
+
| Ejecución directa | `builder` (primary) | Tarea bien definida, 1-5 archivos |
|
|
88
|
+
| Ad-hoc audit | `qagent` (ad-hoc tool) | Scope se deriva del query |
|
|
89
|
+
|
|
90
|
+
**Patrón clave:** `architect` NO usa `task` para invocar `builder`. Ambos son primaries que se comunican vía `plan_db` asíncrona. El user cambia de agente manualmente en el TUI.
|
|
91
|
+
|
|
92
|
+
### 3.2 Tabla comparativa ndomo-v1 vs nicosup98/ndomo vs ndomo-v2
|
|
93
|
+
|
|
94
|
+
| Aspecto | ndomo-v1 (foreman 10 pasos) | nicosup98/ndomo | ndomo-v2 (craftsman + foreman 4 pasos) |
|
|
95
|
+
|---------|-----------------------------|-----------------|----------------------------------------|
|
|
96
|
+
| Default agent | foreman (primary) | `build` (built-in) | foreman (primary planner) |
|
|
97
|
+
| Implementador | foreman delega a smiths | builder/scout/qagent | **craftsman** (primary implementer) |
|
|
98
|
+
| Modo trivial | Trivium ≤5 líneas + plan_db | `build` single-turn | Craftsman Estado 1 (sin plan_db) |
|
|
99
|
+
| Modo plan formal | foreman → 10 pasos → smiths | architect → plan_db → builder | Foreman 4 pasos → plan_db → craftsman |
|
|
100
|
+
| Coordinación | `task` síncrono | `plan_db` async + TUI switch | `plan_db` async + TUI switch |
|
|
101
|
+
| Audit trail | Solo `created_at`/`updated_at` | `original_plan_data` | `original_plan_data` + agent/session FK |
|
|
102
|
+
| Plan↔file | No existe | `plan_files` | `plan_files` |
|
|
103
|
+
| Tono global | Caveman parcial (foreman + algunos) | Caveman en TODOS | Caveman en TODOS los 14 + craftsman |
|
|
104
|
+
| `plan_delete` | No existe | Rechaza si `status='pending'` | Safety 3-capas |
|
|
105
|
+
| Plan ≤5 steps | No hay regla | Regla en architect.md | Soft warning en task_create_batch |
|
|
106
|
+
|
|
107
|
+
### 3.3 Por qué el patrón async + user switch gana
|
|
108
|
+
|
|
109
|
+
Modelo v1 (foreman 10 pasos):
|
|
110
|
+
1. Foreman crea plan en DB (2 writes)
|
|
111
|
+
2. Foreman crea tasks batch (N writes)
|
|
112
|
+
3. Foreman llama `task` para cada smith (N LLM invocations)
|
|
113
|
+
4. Foreman espera resultados (N context switches)
|
|
114
|
+
5. Foreman reconcilia resultados (N reads)
|
|
115
|
+
|
|
116
|
+
Modelo v2 (foreman 4 pasos + craftsman):
|
|
117
|
+
1. Foreman crea plan en DB (1-2 writes) — solo si >5 archivos o diseño arquitectura
|
|
118
|
+
2. User cambia a craftsman en TUI (0 LLM tokens)
|
|
119
|
+
3. Craftsman lee plan y ejecuta (1 read + N writes)
|
|
120
|
+
4. Craftsman cierra plan con `plan_update_status("completed")`
|
|
121
|
+
|
|
122
|
+
**Diferencia clave:** El modelo v2 gasta ~60% menos tokens en coordinación porque el "router" (foreman) solo escribe a DB, no invoca LLMs secundarios. Craftsman opera autónomamente.
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## 4. Decisiones de diseño
|
|
127
|
+
|
|
128
|
+
### D1. Nombre `craftsman` (no `builder`)
|
|
129
|
+
|
|
130
|
+
**Decisión:** El primary implementador se llama `craftsman`, no `builder` como en v1.
|
|
131
|
+
|
|
132
|
+
**Justificación:** Decisión del grill. `craftsman` evoca artesanía disciplinada (implementación precisa, threshold estricto, 4 estados). `builder` quedó descartado por ambigüedad con "builder pattern" y por la connotación genérica en el referencia.
|
|
133
|
+
|
|
134
|
+
**Archivo:** `agents/craftsman.md`
|
|
135
|
+
|
|
136
|
+
### D2. Threshold estricto 2/5/1
|
|
137
|
+
|
|
138
|
+
**Decisión:** El craftsman opera con threshold numérico estricto:
|
|
139
|
+
|
|
140
|
+
| Estado | Archivos | Comportamiento |
|
|
141
|
+
|--------|----------|----------------|
|
|
142
|
+
| Estado 1 | ≤2 archivos | Implementación directa, sin plan_db |
|
|
143
|
+
| Estado 2 | 3-5 archivos | Implementación con plan_db (crea plan y tasks) |
|
|
144
|
+
| Estado 3 | — | Lee plan existente del foreman y ejecuta |
|
|
145
|
+
| Estado 4 | >5 archivos | **Rechaza** — "fuera de mi dominio" → cambiar a foreman |
|
|
146
|
+
|
|
147
|
+
**Diferencia con v1:** v1 proponía 1/2-5 con threshold 1 archivo para Estado 1. v2 sube a ≤2 archivos para Estado 1, reflejando que fixes de 2 archivos son comunes y no requieren plan_db.
|
|
148
|
+
|
|
149
|
+
**Enforcement:** Solo por prompt (no hay validación en código). Craftsman es un primary agent; su prompt es la única barrera.
|
|
150
|
+
|
|
151
|
+
### D3. Routing interno: `task.files` extensión + `metadata.stack`
|
|
152
|
+
|
|
153
|
+
**Decisión:** El craftsman decide a qué sub-smith delegar basándose en (1) extensión de archivo en `task.files`, (2) `task.metadata.stack` si existe, (3) LLM fallback.
|
|
154
|
+
|
|
155
|
+
| Extensión | Sub-smith |
|
|
156
|
+
|-----------|-----------|
|
|
157
|
+
| `.go` | `go-smith` |
|
|
158
|
+
| `.vue`, `.svelte` | `vue-smith` |
|
|
159
|
+
| `.ts`, `.tsx`, `.js`, `.jsx` | `js-smith` |
|
|
160
|
+
| `.py` | `python-smith` |
|
|
161
|
+
| `.rs` | `rust-smith` |
|
|
162
|
+
| `.zig` | `zig-smith` |
|
|
163
|
+
| Sin match | `smith` (genérico) |
|
|
164
|
+
|
|
165
|
+
**Archivo:** `agents/craftsman.md` — tabla de routing interno.
|
|
166
|
+
|
|
167
|
+
### D4. Painter solo disponible vía craftsman
|
|
168
|
+
|
|
169
|
+
**Decisión:** `painter` (UI/UX designer) solo es invocable desde craftsman, no desde foreman.
|
|
170
|
+
|
|
171
|
+
**Justificación:** Foreman es planner puro (4 pasos). Si hay componente UI, craftsman decide: painter si `stack === "vue"` y `type === "design"`, o vue-smith si es implementación lógica.
|
|
172
|
+
|
|
173
|
+
**Diferencia con v1:** v1 no especificaba painter routing — quedaba como responsabilidad del foreman.
|
|
174
|
+
|
|
175
|
+
### D5. Cross-session close con audit trail completo
|
|
176
|
+
|
|
177
|
+
**Decisión:** Tres nuevos campos en tabla `plans`:
|
|
178
|
+
|
|
179
|
+
| Campo | Tipo | Descripción |
|
|
180
|
+
|-------|------|-------------|
|
|
181
|
+
| `created_by_agent` | TEXT | Agente que creó el plan (`foreman` o `craftsman`) |
|
|
182
|
+
| `executed_by_agent` | TEXT | Agente que ejecutó (`craftsman`, `go-smith`, etc.) |
|
|
183
|
+
| `executed_by_session` | TEXT FK → sessions.id | Sesión en que se ejecutó |
|
|
184
|
+
|
|
185
|
+
**Justificación:** Permite trazabilidad cross-session: "qué agente creó este plan, qué agente lo ejecutó, en qué sesión". Especialmente útil cuando foreman planifica y craftsman ejecuta en sesiones separadas.
|
|
186
|
+
|
|
187
|
+
**Comportamiento:**
|
|
188
|
+
- `plan_create` setea `created_by_agent` desde `ctx.agent`
|
|
189
|
+
- `task_update_status` / `plan_update_status` setea `executed_by_agent` y `executed_by_session` al primer `running`
|
|
190
|
+
- Write-once: no se sobrescriben si ya están seteados
|
|
191
|
+
|
|
192
|
+
### D6. `plan_delete` en Phase 1 (priorizada)
|
|
193
|
+
|
|
194
|
+
**Decisión:** `plan_delete` tool se implementa en Phase 1 (no Phase 3 como en v1).
|
|
195
|
+
|
|
196
|
+
**Safety checks:**
|
|
197
|
+
1. Rechaza si `confirm !== true`
|
|
198
|
+
2. Rechaza si `plan.status === 'pending'`
|
|
199
|
+
3. Rechaza si hay tasks `pending` o `running`
|
|
200
|
+
4. CASCADE: borra plan_tasks, plan_tags, plan_files, sessions ON DELETE SET NULL
|
|
201
|
+
|
|
202
|
+
### D7. Plan ≤5 steps: soft warning (no bloqueo)
|
|
203
|
+
|
|
204
|
+
**Decisión:** `task_create_batch` emite `console.warn` si `tasks.length > 5`. No bloquea. La regla se documenta en el prompt del foreman.
|
|
205
|
+
|
|
206
|
+
**Justificación:** Bloquear sería contraproducente — el usuario podría tener razón. El warning es suficiente para que el foreman reevalúe.
|
|
207
|
+
|
|
208
|
+
### D8. Caveman global snippet estándar
|
|
209
|
+
|
|
210
|
+
**Decisión:** Insertar snippet exacto al inicio del prompt de 14 agents (después del frontmatter, antes del primer heading):
|
|
211
|
+
|
|
212
|
+
```
|
|
213
|
+
Tono: caveman por default, nivel full. Activa siempre.
|
|
214
|
+
Excepción: prosa normal para advertencias de seguridad,
|
|
215
|
+
acciones irreversibles o ambigüedad multi-paso.
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
**Agentes:** chronicler, go-smith, guild, inspector, js-smith, painter, python-smith, rust-smith, sage, scout, scribe, smith, vue-smith, zig-smith.
|
|
219
|
+
|
|
220
|
+
**NO tocar:** `agents/craftsman.md` (ya incluye caveman en su prompt), `agents/foreman.md` (ya tiene caveman).
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
## 5. Diseño del craftsman
|
|
225
|
+
|
|
226
|
+
### 5.1 Frontmatter YAML
|
|
227
|
+
|
|
228
|
+
```yaml
|
|
229
|
+
---
|
|
230
|
+
description: Implementador Artesano / Disciplined Craftsman (modo ad-hoc o planificado)
|
|
231
|
+
mode: primary
|
|
232
|
+
model: opencode-go/deepseek-v4-flash
|
|
233
|
+
temperature: 0.1
|
|
234
|
+
permission:
|
|
235
|
+
edit: allow
|
|
236
|
+
write: allow
|
|
237
|
+
bash:
|
|
238
|
+
"*": ask
|
|
239
|
+
"git status*": allow
|
|
240
|
+
"git log*": allow
|
|
241
|
+
"git diff*": allow
|
|
242
|
+
"git add *": allow
|
|
243
|
+
"git commit*": allow
|
|
244
|
+
"git checkout*": ask
|
|
245
|
+
"git push*": ask
|
|
246
|
+
"ls *": allow
|
|
247
|
+
"cat *": allow
|
|
248
|
+
"mkdir *": allow
|
|
249
|
+
"mv *": allow
|
|
250
|
+
"cp *": allow
|
|
251
|
+
"bun *": allow
|
|
252
|
+
"npm *": allow
|
|
253
|
+
"rm *": ask
|
|
254
|
+
webfetch: deny
|
|
255
|
+
question: allow
|
|
256
|
+
task:
|
|
257
|
+
"scout": allow
|
|
258
|
+
"scribe": allow
|
|
259
|
+
"smith": allow
|
|
260
|
+
"go-smith": allow
|
|
261
|
+
"js-smith": allow
|
|
262
|
+
"vue-smith": allow
|
|
263
|
+
"python-smith": allow
|
|
264
|
+
"rust-smith": allow
|
|
265
|
+
"zig-smith": allow
|
|
266
|
+
"painter": allow
|
|
267
|
+
plan_db: allow
|
|
268
|
+
---
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
**Diferencias con el foreman:**
|
|
272
|
+
- `mode: primary` (NO subagent)
|
|
273
|
+
- `task` permitido solo a subagents implementadores + painter
|
|
274
|
+
- `task` NO permitido a foreman, guild, sage (son planners/advisors)
|
|
275
|
+
- `task` permitido a chronicler (post-implementation docs) e inspector (review gate) — decisión confirmada en user dialog v2
|
|
276
|
+
- Permisos `edit: allow`, `bash: ask` (craftsman implementa; foreman solo planifica)
|
|
277
|
+
- `plan_db` tools disponibles pero condicionales (Estado 1 no las usa)
|
|
278
|
+
|
|
279
|
+
### 5.2 Prompt con 4 estados
|
|
280
|
+
|
|
281
|
+
```
|
|
282
|
+
# Rol: Craftsman (Implementador Artesano)
|
|
283
|
+
|
|
284
|
+
Eres un **primary agent** diseñado para implementar código con precisión
|
|
285
|
+
artesanal. Atacas bugs, features pequeñas y refactors acotados. Operas en
|
|
286
|
+
4 estados según el alcance del trabajo. Cuando el alcance excede tu umbral,
|
|
287
|
+
escalas al foreman.
|
|
288
|
+
|
|
289
|
+
## Tono
|
|
290
|
+
Caveman nivel full SIEMPRE. Cero saludos, cero justificaciones.
|
|
291
|
+
|
|
292
|
+
## Threshold estricto 2/5/1
|
|
293
|
+
|
|
294
|
+
### Estado 1: Trivial (≤2 archivos, sin plan_db)
|
|
295
|
+
**Cuándo:** ≤2 archivos, cambios acotados (≤50 líneas diff), sin dependencias externas.
|
|
296
|
+
**Flujo:**
|
|
297
|
+
1. Lee archivos objetivo
|
|
298
|
+
2. Implementa cambios
|
|
299
|
+
3. Corre validación (typecheck / tests / lint)
|
|
300
|
+
4. Commit opcional (preguntar al user)
|
|
301
|
+
5. Reporta directo: archivos, líneas, verificación
|
|
302
|
+
**NO crea plan_create. NO toca plan_db.**
|
|
303
|
+
|
|
304
|
+
### Estado 2: Multi-archivo acotado (3-5 archivos, con plan_db)
|
|
305
|
+
**Cuándo:** 3-5 archivos, cambios que cruzan stacks, o necesita tracking cross-session.
|
|
306
|
+
**Flujo:**
|
|
307
|
+
1. `plan_create` con slug, overview, approach (1 línea cada uno)
|
|
308
|
+
2. `task_create_batch` con steps (máximo 5)
|
|
309
|
+
3. Para cada step: `task_update_status("running")` → implementar → `task_update_status("done")`
|
|
310
|
+
4. Al final: `plan_update_status("completed")`
|
|
311
|
+
**Obligatorio si toca más de 1 stack o requiere trazabilidad.**
|
|
312
|
+
|
|
313
|
+
### Estado 3: Plan formal (lee plan_db existente)
|
|
314
|
+
**Cuándo:** El foreman ya creó un plan con tasks asignadas a craftsman.
|
|
315
|
+
**Flujo:**
|
|
316
|
+
1. `plan_get({id})` o `task_next_for_agent({agent: "craftsman"})`
|
|
317
|
+
2. Lee plan_data completo: overview, approach, contexto
|
|
318
|
+
3. Implementa TDD: test → code → refactor
|
|
319
|
+
4. `task_update_status("done")` con reporte
|
|
320
|
+
5. Si todas las tasks hechas: `plan_update_status("completed")`
|
|
321
|
+
|
|
322
|
+
### Estado 4: FUERA DE MI DOMINIO (>5 archivos)
|
|
323
|
+
**Cuándo:** La tarea involucra >5 archivos o requiere diseño de arquitectura.
|
|
324
|
+
**Acción:**
|
|
325
|
+
→ Reportar: `[FUERA DE MI DOMINIO]` + cuantos archivos/por qué
|
|
326
|
+
→ Sugerir cambiar a `foreman` en TUI
|
|
327
|
+
→ NO implementar parcialmente
|
|
328
|
+
|
|
329
|
+
### Regla de selección
|
|
330
|
+
```
|
|
331
|
+
¿Archivos ≤ 2 y sin dependencias externas?
|
|
332
|
+
→ Estado 1: trivial (0 writes a DB)
|
|
333
|
+
¿Archivos 3-5 o necesita tracking?
|
|
334
|
+
→ Estado 2: plan_db propio
|
|
335
|
+
¿Plan existente con tasks para craftsman?
|
|
336
|
+
→ Estado 3: ejecutar plan formal
|
|
337
|
+
¿Archivos > 5 o requiere diseño?
|
|
338
|
+
→ Estado 4: fuera de dominio → foreman
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
## Routing interno (delegación a sub-smiths)
|
|
342
|
+
Cuando necesites implementación especializada, usa:
|
|
343
|
+
|
|
344
|
+
| Extensión archivo | Sub-smith |
|
|
345
|
+
|---|---|
|
|
346
|
+
| `.go` | `go-smith` |
|
|
347
|
+
| `.vue` / `.svelte` | `vue-smith` |
|
|
348
|
+
| `.ts` / `.tsx` / `.js` / `.jsx` | `js-smith` |
|
|
349
|
+
| `.py` | `python-smith` |
|
|
350
|
+
| `.rs` | `rust-smith` |
|
|
351
|
+
| `.zig` | `zig-smith` |
|
|
352
|
+
| UI/design + `type=design` | `painter` |
|
|
353
|
+
| Sin match | `smith` (genérico) |
|
|
354
|
+
|
|
355
|
+
Si `task.metadata.stack` existe, úsalo como override explícito.
|
|
356
|
+
Si no hay match y no hay stack, usa `smith`.
|
|
357
|
+
|
|
358
|
+
## Cross-session close
|
|
359
|
+
- `executed_by_agent`: siempre `craftsman`
|
|
360
|
+
- `executed_by_session`: siempre `current_session_id` (ctx.sessionID)
|
|
361
|
+
- `created_by_agent`: setear en `plan_create` si creaste el plan
|
|
362
|
+
|
|
363
|
+
## TDD workflow
|
|
364
|
+
1. Test first (si existen tests en el proyecto)
|
|
365
|
+
2. Code mínimo para pasar
|
|
366
|
+
3. Refactor
|
|
367
|
+
4. Verificar con suite del scope
|
|
368
|
+
5. Commit atómico
|
|
369
|
+
|
|
370
|
+
## Lo que NO puedes hacer
|
|
371
|
+
- ❌ Invocar foreman, guild, sage vía task
|
|
372
|
+
- ⚠️ Invocar chronicler solo post-implementación; inspector solo como review gate (no chaining entre ambos)
|
|
373
|
+
- ❌ Editar prompts de otros agents
|
|
374
|
+
- ❌ Editar tools MCP
|
|
375
|
+
- ❌ Usar `plan_approve`
|
|
376
|
+
- ❌ Modificar archivos sin leerlos primero
|
|
377
|
+
|
|
378
|
+
## Output format
|
|
379
|
+
```
|
|
380
|
+
cambios:
|
|
381
|
+
- archivo:linea — desc — verified: OK
|
|
382
|
+
tests:
|
|
383
|
+
- typecheck: passed
|
|
384
|
+
- test suite: N/N passed
|
|
385
|
+
plan:
|
|
386
|
+
- id: (si se creó/usó)
|
|
387
|
+
- estado: completed | ad-hoc (no plan_db)
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
## Caveman skill
|
|
391
|
+
Activa siempre. Excepción: prosa normal para advertencias de
|
|
392
|
+
seguridad, acciones irreversibles o ambigüedad multi-paso.
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
---
|
|
396
|
+
|
|
397
|
+
## 6. Foreman nuevo flow: 4 pasos (planner puro)
|
|
398
|
+
|
|
399
|
+
### 6.1 Comparativa 10 pasos → 4 pasos
|
|
400
|
+
|
|
401
|
+
| v1 (10 pasos) | v2 (4 pasos) | Diferencia |
|
|
402
|
+
|---------------|--------------|------------|
|
|
403
|
+
| 1. Aclaración | **1. Aclaración** | Se conserva |
|
|
404
|
+
| 2. Memory Search | **2. Exploración** | Se fusiona: memory + scout/scribe/sage/guild |
|
|
405
|
+
| 3. Routing | — | Routing implícito en la exploración |
|
|
406
|
+
| 4. Plan Atómico | **3. Plan Atómico** | Se conserva, más liviano |
|
|
407
|
+
| 5. Brief de Delegación | — | Eliminado: craftsman lee plan_db directamente |
|
|
408
|
+
| 6. Trivium en Vivo | — | Eliminado: craftsman implementa |
|
|
409
|
+
| 7. Reconciliación | — | Eliminado: craftsman ejecuta todo |
|
|
410
|
+
| 8. Validación | — | Eliminado: craftsman corre tests |
|
|
411
|
+
| 9. Reporte Final | — | Eliminado: craftsman reporta |
|
|
412
|
+
| — | **4. Persistir** | Nuevo: plan_create + write plan_db |
|
|
413
|
+
|
|
414
|
+
### 6.2 Flujo detallado
|
|
415
|
+
|
|
416
|
+
#### Paso 1: Aclaración
|
|
417
|
+
- Identificar intención en 1-2 frases
|
|
418
|
+
- Si ambigüedad: `question` al usuario
|
|
419
|
+
- Si la tarea es ≤5 archivos y bien definida → sugerir `craftsman`
|
|
420
|
+
- Si >5 archivos o requiere diseño → continuar con planificación
|
|
421
|
+
|
|
422
|
+
#### Paso 2: Exploración
|
|
423
|
+
- `memory({mode:"search", scope:"project"})` — decisiones pasadas
|
|
424
|
+
- Delegar a subagentes según necesidad:
|
|
425
|
+
- `scout` — mapear repo, encontrar archivos, detectar stack
|
|
426
|
+
- `scribe` — investigar APIs, versiones, docs externas
|
|
427
|
+
- `sage` — evaluar trade-offs arquitectónicos
|
|
428
|
+
- `guild` — solo si usuario pide debate explícito
|
|
429
|
+
- NO delegar a smiths, painter, chronicler, inspector
|
|
430
|
+
|
|
431
|
+
#### Paso 3: Plan Atómico
|
|
432
|
+
- Desglosar en ≤5 steps top-level
|
|
433
|
+
- Cada step: `(Acción) → archivos esperados → dependencias`
|
|
434
|
+
- Estimar complejidad (1-5) y riesgo (low/medium/high)
|
|
435
|
+
|
|
436
|
+
#### Paso 4: Persistir
|
|
437
|
+
- `plan_create` con slug, overview, approach
|
|
438
|
+
- `task_create_batch` con steps (máximo 5, warning si >5)
|
|
439
|
+
- NO crear `session_start` (lo hace craftsman al ejecutar)
|
|
440
|
+
- NO ejecutar tasks — craftsman las toma via `task_next_for_agent`
|
|
441
|
+
|
|
442
|
+
### 6.3 Routing table del foreman (v2)
|
|
443
|
+
|
|
444
|
+
| Petición | Delegar a |
|
|
445
|
+
|----------|-----------|
|
|
446
|
+
| Explorar código / mapear repo | `scout` |
|
|
447
|
+
| Investigar APIs / docs / versiones | `scribe` |
|
|
448
|
+
| Arquitectura / trade-offs / debugging difícil | `sage` |
|
|
449
|
+
| Debate multi-perspectiva | `guild` (solo manual) |
|
|
450
|
+
|
|
451
|
+
NOTA: foreman solo planifica. Ejecución es craftsman. NO delegar a smiths, painter, chronicler, inspector.
|
|
452
|
+
|
|
453
|
+
### 6.4 Output del foreman (v2)
|
|
454
|
+
|
|
455
|
+
```
|
|
456
|
+
**Objetivo:** [1 línea]
|
|
457
|
+
**Exploración:** [scout/scribe/sage findings]
|
|
458
|
+
**Plan:**
|
|
459
|
+
1. [acción] → archivos: [paths] → complejidad: N
|
|
460
|
+
2. [acción] → archivos: [paths] → complejidad: N
|
|
461
|
+
**Persistido:** plan_id=[uuid] slug=[slug]
|
|
462
|
+
**Siguiente:** cambiar a craftsman en TUI → task_next_for_agent
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
### 6.5 Plan Approve (legacy)
|
|
466
|
+
|
|
467
|
+
`plan_approve` es un tool MCP registrado en `src/plugin.ts:621-632` que marca un plan como `approved` seteando `approved_at`.
|
|
468
|
+
|
|
469
|
+
**Estado:** **LEGACY** — El flujo v2 de foreman (4 pasos, sección 6.2) **NO usa `plan_approve`**. En v2, el foreman pasa directo de `plan_create` (status `draft`) a `task_create_batch`. El status `approved` queda implícito al dispatchar tasks via `task_create_batch`.
|
|
470
|
+
|
|
471
|
+
**Por qué existe aún:** Compatibilidad con código externo y workflows manuales que requieren gating explícito antes de ejecutar. Se mantiene como tool MCP para uso legacy/humano.
|
|
472
|
+
|
|
473
|
+
**Cuándo invocarlo manualmente:** Si un usuario externo o script quiere un gating explícito "aprobar antes de ejecutar", puede llamar `plan_approve` entre `plan_create` y `task_create_batch`. En el flujo v2 normal esto es innecesario.
|
|
474
|
+
|
|
475
|
+
**Diferencia con v2 flow:**
|
|
476
|
+
|
|
477
|
+
| Aspecto | v2 flow (foreman 4 pasos) | Legacy (con `plan_approve`) |
|
|
478
|
+
|---------|---------------------------|-----------------------------|
|
|
479
|
+
| Flujo | `plan_create` → `task_create_batch` | `plan_create` → `plan_approve` → `task_create_batch` |
|
|
480
|
+
| Status intermedio | `draft` → directo a tasks | `draft` → `approved` → tasks |
|
|
481
|
+
| Gating | Ninguno (dispatch inmediato) | Explícito (aprobación manual) |
|
|
482
|
+
| Uso en v2 | Siempre | Nunca (solo externo/manual) |
|
|
483
|
+
|
|
484
|
+
**Archivo:** `src/plugin.ts:621-632`
|
|
485
|
+
|
|
486
|
+
---
|
|
487
|
+
|
|
488
|
+
## 7. Cambios al sistema
|
|
489
|
+
|
|
490
|
+
### 7.1 Migración v6: `original_plan_data`
|
|
491
|
+
|
|
492
|
+
| Campo | Tabla | Tipo | Comportamiento |
|
|
493
|
+
|-------|-------|------|----------------|
|
|
494
|
+
| `original_plan_data` | `plans` | `TEXT` | En `plan_create`: copiar snapshot de args como JSON |
|
|
495
|
+
| `original_plan_data` | `plan_tasks` | `TEXT` | En `task_create_batch`: copiar `{description, files, dependencies}` como JSON |
|
|
496
|
+
|
|
497
|
+
**Reglas:**
|
|
498
|
+
- `plan_create` setea `original_plan_data` al serializar los args de entrada
|
|
499
|
+
- `plan_approve` NO toca `original_plan_data`
|
|
500
|
+
- `plan_update_status` NO toca `original_plan_data`
|
|
501
|
+
- `archivePlan` lo incluye en markdown pero NO lo modifica
|
|
502
|
+
- `task_create_batch` setea `original_plan_data` por task
|
|
503
|
+
|
|
504
|
+
**Archivos afectados:**
|
|
505
|
+
- `src/db/schema.ts` — agregar columna vía `addColumnIfMissing` en migrations.ts (patrón v5)
|
|
506
|
+
- `src/db/types.ts` — agregar `originalPlanData: string | null` a Plan y PlanTask, PlanRow, TaskRow
|
|
507
|
+
- `src/db/plan-create.ts` — serializar `PlanCreateArgs` como `original_plan_data`
|
|
508
|
+
- `src/db/tasks.ts` — serializar cada task input como `original_plan_data`; warning si `tasks.length > 5`
|
|
509
|
+
- `src/db/plan-archive.ts` — leer y exportar `original_plan_data` en markdown archive
|
|
510
|
+
- `src/db/plans.ts` — `createPlan` acepta `originalPlanData`; `updatePlanStatus` / `approvePlan` NO lo sobrescriben
|
|
511
|
+
|
|
512
|
+
### 7.2 Migración v7: `plan_files`
|
|
513
|
+
|
|
514
|
+
```sql
|
|
515
|
+
CREATE TABLE IF NOT EXISTS plan_files (
|
|
516
|
+
plan_id TEXT NOT NULL REFERENCES plans(id) ON DELETE CASCADE,
|
|
517
|
+
file_path TEXT NOT NULL,
|
|
518
|
+
role TEXT,
|
|
519
|
+
PRIMARY KEY (plan_id, file_path)
|
|
520
|
+
);
|
|
521
|
+
CREATE INDEX IF NOT EXISTS idx_plan_files_path ON plan_files(file_path);
|
|
522
|
+
```
|
|
523
|
+
|
|
524
|
+
**Comportamiento:**
|
|
525
|
+
- `plan_create` acepta `files: string[]` opcional → inserta con role `'input'`
|
|
526
|
+
- `task_create_batch` acepta `files: string[]` por task → inserta con role `'modified'`
|
|
527
|
+
- `plan_get` retorna `files[]` via JOIN
|
|
528
|
+
- `plan_search` acepta `file_path` filter opcional
|
|
529
|
+
- `plan_delete` CASCADE borra `plan_files`
|
|
530
|
+
- `archivePlan` incluye files en el markdown archive
|
|
531
|
+
|
|
532
|
+
**Archivos afectados:**
|
|
533
|
+
- `src/db/schema.ts` — SCHEMA_V7_SQL con CREATE TABLE
|
|
534
|
+
- `src/db/types.ts` — extender Plan/PlanTask con `files` array
|
|
535
|
+
- `src/db/plan-create.ts` — `files?: string[]` en args, insertar en plan_files
|
|
536
|
+
- `src/db/tasks.ts` — insertar en plan_files si `files` no vacío
|
|
537
|
+
- `src/db/plans.ts` — `getPlan` JOIN con plan_files
|
|
538
|
+
- `src/db/plan-archive.ts` — incluir files en markdown
|
|
539
|
+
|
|
540
|
+
### 7.3 Migración v8: `created_by_agent` + `executed_by_agent` + `executed_by_session`
|
|
541
|
+
|
|
542
|
+
```sql
|
|
543
|
+
ALTER TABLE plans ADD COLUMN created_by_agent TEXT;
|
|
544
|
+
ALTER TABLE plans ADD COLUMN executed_by_agent TEXT;
|
|
545
|
+
ALTER TABLE plans ADD COLUMN executed_by_session TEXT REFERENCES sessions(id) ON DELETE SET NULL;
|
|
546
|
+
```
|
|
547
|
+
|
|
548
|
+
**Comportamiento:**
|
|
549
|
+
- `plan_create`: setea `created_by_agent = ctx.agent` (write-once)
|
|
550
|
+
- `task_update_status("running")` o `plan_update_status("executing")`: setea `executed_by_agent` y `executed_by_session` si es el primer running
|
|
551
|
+
- `plan_approve` / `plan_update_status("completed")`: NO tocan estos campos
|
|
552
|
+
- `getPlan`: retorna los campos en el objeto Plan
|
|
553
|
+
|
|
554
|
+
**Archivos afectados:**
|
|
555
|
+
- `src/db/schema.ts` — `addColumnIfMissing` en migrations.ts
|
|
556
|
+
- `src/db/types.ts` — agregar `createdByAgent`, `executedByAgent`, `executedBySession` a Plan y PlanRow
|
|
557
|
+
- `src/db/plan-create.ts` — pasar `ctx.agent` como `createdByAgent`
|
|
558
|
+
- `src/db/plans.ts` — en `updatePlanStatus`, setear `executed_by_agent`/`executed_by_session` al pasar a `executing`; en `createPlan`, setear `created_by_agent`
|
|
559
|
+
- `src/db/plan-archive.ts` — incluir en markdown archive
|
|
560
|
+
|
|
561
|
+
### 7.4 `plan_delete` safety
|
|
562
|
+
|
|
563
|
+
**Tool:** Nuevo en `src/plugin.ts`
|
|
564
|
+
|
|
565
|
+
**Función:** `deletePlan(db, id, confirm)` en `src/db/plans.ts`
|
|
566
|
+
|
|
567
|
+
**Validaciones:**
|
|
568
|
+
1. `typeof confirm !== 'boolean' || confirm !== true` → error `"ndomo: plan_delete requires confirm: true"`
|
|
569
|
+
2. `plan.status === 'draft'` → error `"ndomo: cannot delete a draft plan — use abandonPlan or approve first"`
|
|
570
|
+
3. Existen tasks con `status IN ('pending', 'running')` → error `"ndomo: plan has active tasks — resolve them first"`
|
|
571
|
+
|
|
572
|
+
**Si pasa:** `DELETE FROM plans WHERE id = ?` (CASCADE: plan_tasks, plan_tags, plan_files; sessions → SET NULL)
|
|
573
|
+
|
|
574
|
+
### 7.5 Plan ≤5 steps soft warning
|
|
575
|
+
|
|
576
|
+
En `src/db/tasks.ts`, función `createTasksBatch`:
|
|
577
|
+
|
|
578
|
+
```typescript
|
|
579
|
+
if (tasks.length > 5) {
|
|
580
|
+
console.warn(`[ndomo] plan ${planId} has ${tasks.length} tasks (>5): consider splitting`);
|
|
581
|
+
}
|
|
582
|
+
```
|
|
583
|
+
|
|
584
|
+
No bloquea. Warning visible en logs de OpenCode.
|
|
585
|
+
|
|
586
|
+
### 7.6 Caveman global en 14 agents
|
|
587
|
+
|
|
588
|
+
Insertar snippet estándar después del frontmatter YAML, antes del primer heading:
|
|
589
|
+
|
|
590
|
+
```
|
|
591
|
+
Tono: caveman por default, nivel full. Activa siempre.
|
|
592
|
+
Excepción: prosa normal para advertencias de seguridad,
|
|
593
|
+
acciones irreversibles o ambigüedad multi-paso.
|
|
594
|
+
```
|
|
595
|
+
|
|
596
|
+
**Archivos:** `agents/chronicler.md`, `agents/go-smith.md`, `agents/guild.md`, `agents/inspector.md`, `agents/js-smith.md`, `agents/painter.md`, `agents/python-smith.md`, `agents/rust-smith.md`, `agents/sage.md`, `agents/scout.md`, `agents/scribe.md`, `agents/smith.md`, `agents/vue-smith.md`, `agents/zig-smith.md`.
|
|
597
|
+
|
|
598
|
+
---
|
|
599
|
+
|
|
600
|
+
## 8. Acceptance criteria
|
|
601
|
+
|
|
602
|
+
### 8.1 Craftsman existe y es primary
|
|
603
|
+
- [ ] `agents/craftsman.md` existe con `mode: primary`, frontmatter completo
|
|
604
|
+
- [ ] Prompt cubre 4 estados con threshold 2/5/1
|
|
605
|
+
- [ ] User puede cambiar a craftsman en TUI
|
|
606
|
+
|
|
607
|
+
### 8.2 Threshold 2/5/1 funcional
|
|
608
|
+
- [ ] Estado 1: tarea ≤2 archivos → implementa sin plan_db
|
|
609
|
+
- [ ] Estado 2: tarea 3-5 archivos → crea plan_db + tasks
|
|
610
|
+
- [ ] Estado 3: plan existente → ejecuta tasks asignadas
|
|
611
|
+
- [ ] Estado 4: tarea >5 archivos → reporta fuera de dominio
|
|
612
|
+
|
|
613
|
+
### 8.3 Routing interno del craftsman
|
|
614
|
+
- [ ] Delegación por extensión: .go → go-smith, .vue → vue-smith, etc.
|
|
615
|
+
- [ ] `metadata.stack` override funciona
|
|
616
|
+
- [ ] LLM fallback a `smith` genérico
|
|
617
|
+
|
|
618
|
+
### 8.4 Painter solo vía craftsman
|
|
619
|
+
- [ ] Foreman NO lista painter en su routing
|
|
620
|
+
- [ ] Craftsman puede delegar a painter si `stack === "vue"` y `type === "design"`
|
|
621
|
+
- [ ] Craftsman usa vue-smith para UI no-design
|
|
622
|
+
|
|
623
|
+
### 8.5 Cross-session close
|
|
624
|
+
- [ ] `plan_create` setea `created_by_agent` (write-once)
|
|
625
|
+
- [ ] Primer `task_update_status("running")` setea `executed_by_agent` + `executed_by_session`
|
|
626
|
+
- [ ] Campos no se sobrescriben en updates posteriores
|
|
627
|
+
|
|
628
|
+
### 8.6 Migraciones DB
|
|
629
|
+
- [ ] v6: `original_plan_data` write-once en plans y plan_tasks
|
|
630
|
+
- [ ] v7: `plan_files` insert + query + CASCADE
|
|
631
|
+
- [ ] v8: `created_by_agent`, `executed_by_agent`, `executed_by_session` en plans
|
|
632
|
+
- [ ] Migraciones aplican limpias a DB existente
|
|
633
|
+
|
|
634
|
+
### 8.7 `plan_delete` safety
|
|
635
|
+
- [ ] Rechaza sin `confirm: true`
|
|
636
|
+
- [ ] Rechaza si `status='draft'`
|
|
637
|
+
- [ ] Rechaza si hay tasks pending/running
|
|
638
|
+
- [ ] CASCADE ejecuta correctamente
|
|
639
|
+
|
|
640
|
+
### 8.8 Plan ≤5 steps
|
|
641
|
+
- [ ] `agents/foreman.md` contiene regla de ≤5 steps
|
|
642
|
+
- [ ] `task_create_batch` emite console.warn si >5 tasks
|
|
643
|
+
|
|
644
|
+
### 8.9 Caveman global
|
|
645
|
+
- [ ] 14 agents tienen snippet caveman estándar
|
|
646
|
+
- [ ] Craftsman tiene caveman en prompt
|
|
647
|
+
- [ ] Foreman ya tenía caveman (no duplicar)
|
|
648
|
+
|
|
649
|
+
### 8.10 Tests y verificación
|
|
650
|
+
- [ ] `plan_delete` tests (3 sub-casos)
|
|
651
|
+
- [ ] `original_plan_data` write-once test
|
|
652
|
+
- [ ] `plan_files` insert + query + CASCADE test
|
|
653
|
+
- [ ] Audit trail write-once test (v8)
|
|
654
|
+
- [ ] `bun run typecheck` pasa sin errores
|
|
655
|
+
- [ ] `bun test` pasa (suite completa)
|
|
656
|
+
|
|
657
|
+
### 8.11 Docs
|
|
658
|
+
- [ ] `docs/agents.md` tiene sección craftsman (rol, cuándo usar, threshold 2/5/1)
|
|
659
|
+
- [ ] `docs/workflows.md` árbol de decisión actualizado
|
|
660
|
+
|
|
661
|
+
---
|
|
662
|
+
|
|
663
|
+
## 9. Plan de implementación (5 fases)
|
|
664
|
+
|
|
665
|
+
### Fase 0: Spec v2 + backup v1 (chronicler, ~30min)
|
|
666
|
+
|
|
667
|
+
**Qué:**
|
|
668
|
+
1. Backup `docs/features/feature-flexible-builder.md` → `-v1.md`
|
|
669
|
+
2. Reescribir spec v2 con arquitectura craftsman + foreman 4 pasos + threshold 2/5/1
|
|
670
|
+
|
|
671
|
+
**Archivos:**
|
|
672
|
+
- `docs/features/feature-flexible-builder.md` (rewrite)
|
|
673
|
+
- `docs/features/feature-flexible-builder-v1.md` (backup)
|
|
674
|
+
|
|
675
|
+
### Fase 1: Migraciones DB + tests (js-smith, ~2h)
|
|
676
|
+
|
|
677
|
+
**Qué:**
|
|
678
|
+
1. v6: `original_plan_data` en plans + plan_tasks
|
|
679
|
+
2. v7: `plan_files` join table
|
|
680
|
+
3. v8: `created_by_agent` + `executed_by_agent` + `executed_by_session`
|
|
681
|
+
4. `deletePlan` en `src/db/plans.ts` con safety checks
|
|
682
|
+
5. Tests: `plans.test.ts` (delete), `plan-files.test.ts`, `migrations-v8.test.ts`
|
|
683
|
+
|
|
684
|
+
**Archivos:** Ver sección 7.1, 7.2, 7.3, 7.4
|
|
685
|
+
|
|
686
|
+
### Fase 2: `agents/craftsman.md` (chronicler, ~1h)
|
|
687
|
+
|
|
688
|
+
**Qué:**
|
|
689
|
+
1. Crear `agents/craftsman.md` con frontmatter + prompt 4 estados + routing + cross-session close
|
|
690
|
+
|
|
691
|
+
**Archivos:**
|
|
692
|
+
- `agents/craftsman.md` (nuevo)
|
|
693
|
+
|
|
694
|
+
**Dependencia:** Phase 1 (para referencias DB en el prompt)
|
|
695
|
+
|
|
696
|
+
### Fase 3: Foreman rewrite + caveman global (smith/chronicler, ~1.5h)
|
|
697
|
+
|
|
698
|
+
**Qué:**
|
|
699
|
+
1. Rewrite `agents/foreman.md` a 4 pasos: Aclaración→Exploración→Plan Atómico→Persistir
|
|
700
|
+
2. Agregar caveman a 14 agents (diff mecánico)
|
|
701
|
+
3. Registrar `plan_delete` en `src/plugin.ts`
|
|
702
|
+
4. Soft warning ≤5 tasks en `src/db/tasks.ts`
|
|
703
|
+
|
|
704
|
+
**Archivos:**
|
|
705
|
+
- `agents/foreman.md` (rewrite)
|
|
706
|
+
- `agents/*.md` (14 archivos, +caveman)
|
|
707
|
+
- `src/plugin.ts` (+plan_delete tool)
|
|
708
|
+
- `src/db/tasks.ts` (+warning)
|
|
709
|
+
|
|
710
|
+
**Dependencia:** Phase 2 (foreman routing ya no incluye smiths)
|
|
711
|
+
|
|
712
|
+
### Fase 4: Docs + smoke tests (chronicler, ~1h)
|
|
713
|
+
|
|
714
|
+
**Qué:**
|
|
715
|
+
1. Actualizar `docs/agents.md` con craftsman
|
|
716
|
+
2. Actualizar `docs/workflows.md` con árbol de decisión
|
|
717
|
+
3. Smoke tests checklist (no automatizados):
|
|
718
|
+
- Foreman flow 4 pasos: plan_create + task_create_batch
|
|
719
|
+
- Craftsman Estado 1: ≤2 archivos, sin plan_db
|
|
720
|
+
- Craftsman Estado 4: >5 archivos → rechazo
|
|
721
|
+
4. `bun run typecheck` y `bun test` verdes
|
|
722
|
+
|
|
723
|
+
**Archivos:**
|
|
724
|
+
- `docs/agents.md` (nueva sección craftsman)
|
|
725
|
+
- `docs/workflows.md` (árbol actualizado)
|
|
726
|
+
|
|
727
|
+
**Dependencia:** Phase 2 + Phase 3
|
|
728
|
+
|
|
729
|
+
---
|
|
730
|
+
|
|
731
|
+
## 10. Riesgos y trade-offs
|
|
732
|
+
|
|
733
|
+
### R1. Abuso del craftsman para tareas grandes
|
|
734
|
+
|
|
735
|
+
**Riesgo:** Craftsman tiene `edit: allow` + `task: allow`. El user podría usarlo para features >5 archivos, saltándose el foreman.
|
|
736
|
+
|
|
737
|
+
**Mitigación (2 capas):**
|
|
738
|
+
1. **Prompt:** Estado 4 rechaza explícitamente >5 archivos
|
|
739
|
+
2. **Modelo:** craftsman usa temperatura 0.1, menos propenso a auto-expandir scope
|
|
740
|
+
|
|
741
|
+
**Severidad:** baja (el sistema es una herramienta, no un guardián).
|
|
742
|
+
|
|
743
|
+
### R2. Separación manual foreman→craftsman confusa
|
|
744
|
+
|
|
745
|
+
**Riesgo:** El user no sabe cuándo usar foreman vs craftsman, resultando en planes mal diseñados o implementaciones sin plan.
|
|
746
|
+
|
|
747
|
+
**Mitigación:**
|
|
748
|
+
1. Foreman en el Paso 1 (Aclaración) sugiere craftsman si la tarea es ≤5 archivos
|
|
749
|
+
2. Craftsman en Estado 4 sugiere foreman si >5 archivos
|
|
750
|
+
3. `docs/workflows.md` documenta árbol de decisión
|
|
751
|
+
|
|
752
|
+
**Severidad:** media (curva de aprendizaje inicial).
|
|
753
|
+
|
|
754
|
+
### R3. Crecimiento de DB con `original_plan_data`
|
|
755
|
+
|
|
756
|
+
**Riesgo:** Duplica `plan_data` (2x por fila). En proyectos grandes, puede sumar MB.
|
|
757
|
+
|
|
758
|
+
**Mitigación:**
|
|
759
|
+
1. Auto-archive a markdown cuando el plan se completa
|
|
760
|
+
2. Archivar setea `archived_at`, limpiando de DB activa
|
|
761
|
+
|
|
762
|
+
**Severidad:** baja (SQLite, 1000 planes ≈ 2-5MB extra).
|
|
763
|
+
|
|
764
|
+
### R4. Write-once no enforced en DB
|
|
765
|
+
|
|
766
|
+
**Riesgo:** Los campos `created_by_agent`, `executed_by_agent`, `executed_by_session` y `original_plan_data` son write-once por convención, no por constraint DB.
|
|
767
|
+
|
|
768
|
+
**Mitigación:**
|
|
769
|
+
1. El código en `planCreateExecutor`, `createPlan`, `updatePlanStatus` verifica antes de setear
|
|
770
|
+
2. Tests unitarios validan write-once behavior
|
|
771
|
+
|
|
772
|
+
**Severidad:** baja (si se sobrescribe, es bug en el código, no en la DB).
|
|
773
|
+
|
|
774
|
+
### R5. Caveman en 14 agents = 14 lugares de mantenimiento
|
|
775
|
+
|
|
776
|
+
**Riesgo:** El snippet caveman puede volverse inconsistente si se edita en un agent y no en los otros.
|
|
777
|
+
|
|
778
|
+
**Mitigación:**
|
|
779
|
+
1. Snippet exacto documentado en spec (sección 7.6)
|
|
780
|
+
2. Si cambia, buscar/replace en 14 archivos
|
|
781
|
+
|
|
782
|
+
**Severidad:** baja (diff mecánico).
|
|
783
|
+
|
|
784
|
+
### R6. Foreman sin acceso a smiths — posible fricción
|
|
785
|
+
|
|
786
|
+
**Riesgo:** Si el user pide al foreman "implementa X en Go" y el foreman no puede delegar a go-smith directamente, el user debe cambiar manualmente a craftsman.
|
|
787
|
+
|
|
788
|
+
**Mitigación:**
|
|
789
|
+
1. Foreman en Paso 1 sugiere craftsman temprano
|
|
790
|
+
2. Foreman puede planificar y craftsman ejecuta — el user cambia una vez
|
|
791
|
+
|
|
792
|
+
**Severidad:** media-baja (un switch manual adicional vs delegación automática).
|
|
793
|
+
|
|
794
|
+
---
|
|
795
|
+
|
|
796
|
+
## 11. Referencias cruzadas
|
|
797
|
+
|
|
798
|
+
### 11.1 Archivos clave
|
|
799
|
+
|
|
800
|
+
| Archivo | Líneas relevantes | Notas |
|
|
801
|
+
|---------|-------------------|-------|
|
|
802
|
+
| `agents/foreman.md` | 1-21 (frontmatter), 162-200 (10 pasos v1) | Se reescribe a 4 pasos en Phase 3 |
|
|
803
|
+
| `agents/craftsman.md` | (nuevo) | Creado en Phase 2 |
|
|
804
|
+
| `src/db/schema.ts` | 8-497 (v1-v5), MIGRATIONS array 465-497 | Se agregan v6/v7/v8 |
|
|
805
|
+
| `src/db/types.ts` | 41-64 (Plan), 66-91 (PlanTask), 119-166 (Rows) | Se extienden con nuevos campos |
|
|
806
|
+
| `src/db/plans.ts` | createPlan, updatePlanStatus, approvePlan | Puntos de inserción original_plan_data + v8 |
|
|
807
|
+
| `src/db/tasks.ts` | 13-80 (createTasksBatch), 109-121 (truncation) | original_plan_data + warning ≤5 |
|
|
808
|
+
| `src/db/plan-create.ts` | 15-30 (PlanCreateArgs), 32-62 (planCreateExecutor) | ensureSession ya existe |
|
|
809
|
+
| `src/db/plan-archive.ts` | serializePlanToMarkdown, archivePlan | Incluir nuevos campos |
|
|
810
|
+
| `src/db/migrations.ts` | addColumnIfMissing, runMigrations | Patrón para v6/v7/v8 |
|
|
811
|
+
| `src/plugin.ts` | 352-822 (tools) | Nuevo tool plan_delete + adjust plan_create |
|
|
812
|
+
| `src/db/plans.ts` | (nueva función) | deletePlan con safety checks |
|
|
813
|
+
| `docs/bugs/plan-create-orphan-fk.md` | 60-70, 88-103 | Bug conocido, no resuelto |
|
|
814
|
+
|
|
815
|
+
### 11.2 Specs relacionados
|
|
816
|
+
|
|
817
|
+
| Recurso | Relación |
|
|
818
|
+
|---------|----------|
|
|
819
|
+
| `docs/features/feature-flexible-builder-v1.md` | Spec original v1 (archivada). Define `builder` con 3 estados. Reemplazada por v2. |
|
|
820
|
+
| `agents/foreman.md` | Prompt actual del foreman (10 pasos). Se reescribe en Phase 3. |
|
|
821
|
+
| `docs/agents.md` | Se actualiza en Phase 4 con craftsman. |
|
|
822
|
+
| `docs/workflows.md` | Se actualiza en Phase 4 con árbol de decisión. |
|
|
823
|
+
| `src/db/schema.ts` | Schema DB actual (v1-v5). Migraciones v6+v7+v8 en spec. |
|
|
824
|
+
|
|
825
|
+
### 11.3 Árbol de decisión actualizado
|
|
826
|
+
|
|
827
|
+
```
|
|
828
|
+
User envía prompt
|
|
829
|
+
│
|
|
830
|
+
├─ ¿Tarea ≤2 archivos, ≤50 líneas, bien definida?
|
|
831
|
+
│ → `craftsman` en TUI → Estado 1 (trivial, sin plan_db)
|
|
832
|
+
│
|
|
833
|
+
├─ ¿Tarea 3-5 archivos, multi-stack, necesita tracking?
|
|
834
|
+
│ → `craftsman` en TUI → Estado 2 (ad-hoc con plan_db)
|
|
835
|
+
│
|
|
836
|
+
├─ ¿Tarea >5 archivos, diseño de arquitectura, o ambigua?
|
|
837
|
+
│ → `foreman` en TUI → 4 pasos: Aclaración → Exploración → Plan → Persistir
|
|
838
|
+
│ → Luego `craftsman` en TUI → Estado 3 (lee plan formal)
|
|
839
|
+
│
|
|
840
|
+
├─ ¿Auditoría de PR existente o tarea read-only?
|
|
841
|
+
│ → `craftsman` o `scout` según necesite escribir
|
|
842
|
+
│
|
|
843
|
+
└─ ¿Exploración read-only?
|
|
844
|
+
→ `scout` en TUI
|
|
845
|
+
```
|
|
846
|
+
|
|
847
|
+
---
|
|
848
|
+
|
|
849
|
+
## Apéndice A: Decisiones del grill
|
|
850
|
+
|
|
851
|
+
| Decisión | Opción elegida | Alternativas descartadas |
|
|
852
|
+
|----------|---------------|--------------------------|
|
|
853
|
+
| Nombre del primary | `craftsman` | `builder` (v1), `implementer`, `artisan` |
|
|
854
|
+
| Threshold | 2/5/1 (≤2 Estado 1, 3-5 Estado 2, >5 Estado 4) | 1/2-5 (v1), 1/3-5/6+ |
|
|
855
|
+
| Estados del craftsman | 4 (trivial / multi-archivo / plan formal / fuera dominio) | 3 (v1) |
|
|
856
|
+
| Foreman pasos | 4 (Aclaración / Exploración / Plan / Persistir) | 10 (v1), 6, 3 |
|
|
857
|
+
| Painter routing | Solo craftsman | Foreman + craftsman |
|
|
858
|
+
| Cross-session close | `created_by_agent` + `executed_by_agent` + `executed_by_session` | Solo `created_by` |
|
|
859
|
+
| `plan_delete` fase | Phase 1 (priorizada) | Phase 3 (v1) |
|
|
860
|
+
| Plan ≤5 steps | Soft warning (no bloqueo) | Bloqueo estricto |
|
|
861
|
+
| Caveman snippet | Estándar en 14 agents | Caveman solo en prompt |
|
|
862
|
+
|
|
863
|
+
---
|
|
864
|
+
|
|
865
|
+
## Apéndice B: Relación con bugs existentes
|
|
866
|
+
|
|
867
|
+
### Bug `ctx.sessionID` (`docs/bugs/plan-create-orphan-fk.md`)
|
|
868
|
+
|
|
869
|
+
No se resuelve en este spec. Craftsman usa `plan_create` + `plan_update_status("completed")`:
|
|
870
|
+
- `planCreateExecutor` ya tiene `ensureSession` automático (`src/db/plan-create.ts:39-41`)
|
|
871
|
+
- `planUpdateStatus` solo chequea FK para status `executing`/`approved` (`src/db/plans.ts:122`)
|
|
872
|
+
- Craftsman no usa `plan_approve`
|
|
873
|
+
|
|
874
|
+
**Impacto:** El bug no afecta al flujo craftsman.
|
|
875
|
+
|
|
876
|
+
### Truncation 16KB (`src/db/tasks.ts:109-121`)
|
|
877
|
+
|
|
878
|
+
No se resuelve en este spec. Craftsman genera resultados pequeños (formato caveman). Si un sub-smith produce output grande, el truncation aplica igual que hoy.
|
|
879
|
+
|
|
880
|
+
---
|
|
881
|
+
|
|
882
|
+
*Fin del feature spec v2 — ~600 líneas*
|