@trycore/spec-build-harness 0.1.0 → 0.4.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/state/README.md CHANGED
@@ -40,7 +40,25 @@ Luego se pregunta el **Release Gate** (outer loop, skill `releasing-a-version`)
40
40
  computado desde las líneas de release del Story Map.
41
41
 
42
42
  `harness_phase` arranca en `authoring` y lo cambia `load-build-state.sh` a `active` cuando
43
- detecta `package.json` en la raíz (aparición del scaffold Next.js).
43
+ detecta `package.json` en la raíz (aparición del scaffold de código del proyecto). Es una señal
44
+ **informativa**, no el gate de avance.
45
+
46
+ ### Gate `scaffold` (Paso 1 fundamental)
47
+
48
+ `scaffold` es un gate **de proyecto** (no por-slice): `{ confirmed, confirmed_by, confirmed_at, notes }`.
49
+ Arranca en `confirmed: false` y **solo** pasa a `true` por **confirmación explícita** (vía
50
+ `building-a-slice` Fase 0 / `dor-dod-gatekeeper`), nunca por auto-detección. Es la precondición
51
+ restrictiva para abrir cualquier slice: el hook `scaffold-guard.sh` bloquea escribir código de
52
+ slice (fases `red…data`) mientras `confirmed` no sea `true`. El arnés **no genera** el scaffold.
53
+
54
+ ### Reflexión post-slice (ciclo autocorrectivo)
55
+
56
+ Tras archivar un slice, su entrada en `history[]` puede llevar `reflected` / `reflected_at`. El
57
+ hook `reflect-nudge.sh` (evento `Stop`, **no bloqueante**) sugiere ejecutar `/build:reflect` mientras
58
+ exista al menos una entrada con `reflected != true`. `/build:reflect` lo ejecuta el **modelo**:
59
+ detecta convención nueva o error recurrente, **propone** un parche al bloque `trycore-build-learnings`
60
+ de `CLAUDE.md` (se aplica **solo tras tu aprobación**) y estampa `reflected: true` → el nudge calla.
61
+ El razonamiento vive en el modelo; el hook solo es un recordatorio determinista.
44
62
 
45
63
  ## Quién escribe qué
46
64
 
@@ -53,4 +71,5 @@ detecta `package.json` en la raíz (aparición del scaffold Next.js).
53
71
  | `gates.api` | `api-contract-tester` | slice |
54
72
  | `gates.data` | `data-consistency-checker` | slice |
55
73
  | `releases[]` (`security`, `smell`, `ux`, `coherence`, `stack_arch`, `integration`, `status`) | `releasing-a-version` (delega en `security-reviewer`, `simple-design-reviewer`, `ux-krug-reviewer`, `coherence-three-way`, `stack-guardian`) | release |
74
+ | `history[].reflected` · `history[].reflected_at` | `/build:reflect` | post-slice (tras archivar) |
56
75
  | `harness_phase` | `load-build-state.sh` (SessionStart) | — |
@@ -5,14 +5,15 @@
5
5
  "description": "Single source of truth para el handoff secuencial entre agentes de construcción. Lo escriben build-orchestrator y los gates; lo lee load-build-state.sh.",
6
6
  "type": "object",
7
7
  "additionalProperties": false,
8
- "required": ["version", "harness_phase", "active_slice", "history", "releases"],
8
+ "required": ["version", "harness_phase", "scaffold", "active_slice", "history", "releases"],
9
9
  "properties": {
10
10
  "version": { "type": "string", "const": "1.0" },
11
11
  "harness_phase": {
12
12
  "type": "string",
13
13
  "enum": ["authoring", "active"],
14
- "description": "authoring = aún no hay package.json; active = scaffold de código presente."
14
+ "description": "Señal INFORMATIVA auto-detectada: authoring = aún no hay package.json; active = scaffold de código presente. El gate de avance es `scaffold.confirmed`, NO esta señal."
15
15
  },
16
+ "scaffold": { "$ref": "#/$defs/scaffold" },
16
17
  "active_slice": {
17
18
  "description": "El slice (épica) en construcción. null si no hay ninguno activo.",
18
19
  "oneOf": [
@@ -32,6 +33,18 @@
32
33
  }
33
34
  },
34
35
  "$defs": {
36
+ "scaffold": {
37
+ "type": "object",
38
+ "additionalProperties": false,
39
+ "description": "Gate de PROYECTO (Paso 1 fundamental): el scaffold runnable existe. Precondición EXPLÍCITA y restrictiva — solo pasa a confirmed=true por confirmación humana (vía building-a-slice Fase 0 / dor-dod-gatekeeper), nunca por auto-detección. El arnés NO genera el scaffold.",
40
+ "required": ["confirmed"],
41
+ "properties": {
42
+ "confirmed": { "type": "boolean", "description": "true solo tras confirmación explícita de que el esqueleto runnable existe." },
43
+ "confirmed_by": { "type": ["string", "null"], "description": "Agente/skill que registró la confirmación." },
44
+ "confirmed_at": { "type": ["string", "null"], "format": "date-time" },
45
+ "notes": { "type": "string", "description": "Evidencia libre (p.ej. 'build/dev arranca vacío sin error')." }
46
+ }
47
+ },
35
48
  "slice": {
36
49
  "type": "object",
37
50
  "additionalProperties": false,
@@ -73,7 +86,9 @@
73
86
  },
74
87
  "updated_at": { "type": "string", "format": "date-time" },
75
88
  "updated_by": { "type": "string", "description": "Agente o hook que escribió el estado." },
76
- "notes": { "type": "string", "description": "Nota libre opcional (p.ej. changes/branches adicionales de una épica construida en varios pasos)." }
89
+ "notes": { "type": "string", "description": "Nota libre opcional (p.ej. changes/branches adicionales de una épica construida en varios pasos)." },
90
+ "reflected": { "type": "boolean", "description": "True si /build:reflect ya capturó los aprendizajes de este slice archivado (ciclo autocorrectivo). Mientras sea false/ausente, reflect-nudge.sh sugiere reflexionar al cerrar sesión." },
91
+ "reflected_at": { "type": "string", "format": "date-time", "description": "Cuándo se reflexionó (ISO-8601 UTC). Lo escribe /build:reflect." }
77
92
  }
78
93
  },
79
94
  "release": {
@@ -1,6 +1,12 @@
1
1
  {
2
2
  "version": "1.0",
3
3
  "harness_phase": "authoring",
4
+ "scaffold": {
5
+ "confirmed": false,
6
+ "confirmed_by": null,
7
+ "confirmed_at": null,
8
+ "notes": ""
9
+ },
4
10
  "active_slice": null,
5
11
  "history": [],
6
12
  "releases": []
@@ -54,4 +54,10 @@ Estos puntos de extensión los leen los agentes `security-reviewer`, `stack-guar
54
54
 
55
55
  <!-- END trycore-build-harness -->
56
56
 
57
+ <!-- BEGIN trycore-build-learnings -->
58
+ ## Convenciones aprendidas (mantenido por /build:reflect)
59
+
60
+ <!-- /build:reflect propone aquí viñetas concretas (convención nueva o error recurrente) tras cerrar un slice; se agregan SOLO con tu aprobación. Revísalas en PR como cualquier cambio de equipo. -->
61
+ <!-- END trycore-build-learnings -->
62
+
57
63
  <!-- A partir de aquí, el equipo del proyecto puede agregar instrucciones específicas del cliente. -->
@@ -13,7 +13,7 @@
13
13
  ],
14
14
  "PreToolUse": [
15
15
  { "matcher": "Bash", "hooks": [ { "type": "command", "command": "\"${CLAUDE_PLUGIN_ROOT:-$CLAUDE_PROJECT_DIR/.claude}/hooks/build/gitflow-guard.sh\"" } ] },
16
- { "matcher": "Write|Edit|MultiEdit", "hooks": [ { "type": "command", "command": "\"${CLAUDE_PLUGIN_ROOT:-$CLAUDE_PROJECT_DIR/.claude}/hooks/build/stack-guard.sh\"" } ] }
16
+ { "matcher": "Write|Edit|MultiEdit", "hooks": [ { "type": "command", "command": "\"${CLAUDE_PLUGIN_ROOT:-$CLAUDE_PROJECT_DIR/.claude}/hooks/build/stack-guard.sh\"" }, { "type": "command", "command": "\"${CLAUDE_PLUGIN_ROOT:-$CLAUDE_PROJECT_DIR/.claude}/hooks/build/scaffold-guard.sh\"" } ] }
17
17
  ],
18
18
  "PostToolUse": [
19
19
  { "matcher": "Write|Edit|MultiEdit", "hooks": [ { "type": "command", "command": "\"${CLAUDE_PLUGIN_ROOT:-$CLAUDE_PROJECT_DIR/.claude}/hooks/build/lint-typecheck.sh\"" }, { "type": "command", "command": "\"${CLAUDE_PLUGIN_ROOT:-$CLAUDE_PROJECT_DIR/.claude}/hooks/build/coherence-flag.sh\"" } ] }