pumuki 6.3.39 → 6.3.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/README.md +21 -12
  2. package/VERSION +1 -1
  3. package/core/gate/evaluateRules.test.ts +40 -0
  4. package/core/gate/evaluateRules.ts +7 -1
  5. package/core/rules/Consequence.ts +1 -0
  6. package/docs/CONFIGURATION.md +50 -0
  7. package/docs/INSTALLATION.md +38 -11
  8. package/docs/MCP_SERVERS.md +1 -1
  9. package/docs/README.md +1 -0
  10. package/docs/RELEASE_NOTES.md +44 -0
  11. package/docs/USAGE.md +191 -9
  12. package/docs/registro-maestro-de-seguimiento.md +2 -2
  13. package/docs/seguimiento-activo-pumuki-saas-supermercados.md +1592 -1
  14. package/docs/validation/README.md +2 -1
  15. package/docs/validation/ast-intelligence-roadmap.md +96 -0
  16. package/integrations/config/skillsCustomRules.ts +14 -0
  17. package/integrations/config/skillsDetectorRegistry.ts +11 -1
  18. package/integrations/config/skillsLock.ts +30 -0
  19. package/integrations/config/skillsMarkdownRules.ts +14 -3
  20. package/integrations/config/skillsRuleSet.ts +25 -3
  21. package/integrations/evidence/readEvidence.test.ts +3 -2
  22. package/integrations/evidence/readEvidence.ts +14 -4
  23. package/integrations/evidence/repoState.ts +10 -2
  24. package/integrations/evidence/schema.test.ts +3 -2
  25. package/integrations/evidence/schema.ts +3 -0
  26. package/integrations/evidence/writeEvidence.test.ts +3 -2
  27. package/integrations/gate/evaluateAiGate.ts +511 -2
  28. package/integrations/git/GitService.ts +5 -1
  29. package/integrations/git/astIntelligenceDualValidation.ts +275 -0
  30. package/integrations/git/gitAtomicity.ts +42 -9
  31. package/integrations/git/resolveGitRefs.ts +37 -0
  32. package/integrations/git/runPlatformGate.ts +228 -1
  33. package/integrations/git/runPlatformGateEvaluation.ts +4 -0
  34. package/integrations/git/stageRunners.ts +116 -2
  35. package/integrations/lifecycle/cli.ts +759 -22
  36. package/integrations/lifecycle/doctor.ts +62 -0
  37. package/integrations/lifecycle/index.ts +1 -0
  38. package/integrations/lifecycle/packageInfo.ts +25 -3
  39. package/integrations/lifecycle/policyReconcile.ts +304 -0
  40. package/integrations/lifecycle/preWriteAutomation.ts +42 -2
  41. package/integrations/lifecycle/watch.ts +365 -0
  42. package/integrations/mcp/aiGateCheck.ts +59 -2
  43. package/integrations/mcp/autoExecuteAiStart.ts +25 -1
  44. package/integrations/mcp/preFlightCheck.ts +13 -0
  45. package/integrations/sdd/evidenceScaffold.ts +223 -0
  46. package/integrations/sdd/index.ts +2 -0
  47. package/integrations/sdd/stateSync.ts +400 -0
  48. package/integrations/sdd/syncDocs.ts +97 -2
  49. package/package.json +4 -1
  50. package/scripts/backlog-action-reasons-lib.ts +38 -0
  51. package/scripts/backlog-id-issue-map-lib.ts +69 -0
  52. package/scripts/backlog-json-contract-lib.ts +3 -0
  53. package/scripts/framework-menu-consumer-preflight-lib.ts +6 -0
  54. package/scripts/package-install-smoke-command-resolution-lib.ts +64 -0
  55. package/scripts/package-install-smoke-consumer-npm-lib.ts +43 -0
  56. package/scripts/package-install-smoke-consumer-repo-setup-lib.ts +2 -0
  57. package/scripts/package-install-smoke-execution-steps-lib.ts +27 -9
  58. package/scripts/package-install-smoke-lifecycle-lib.ts +15 -4
  59. package/scripts/package-install-smoke-workspace-factory-lib.ts +4 -1
  60. package/scripts/reconcile-consumer-backlog-issues-lib.ts +651 -0
  61. package/scripts/reconcile-consumer-backlog-issues.ts +348 -0
  62. package/scripts/watch-consumer-backlog-lib.ts +465 -0
  63. package/scripts/watch-consumer-backlog.ts +326 -0
package/README.md CHANGED
@@ -32,11 +32,17 @@ Install and bootstrap:
32
32
 
33
33
  ```bash
34
34
  npm install --save-exact pumuki
35
- npx --yes pumuki install
36
- npx --yes pumuki doctor
35
+ npx --yes pumuki bootstrap --enterprise --agent=codex
37
36
  npx --yes pumuki status
38
37
  ```
39
38
 
39
+ Fallback (equivalent in pasos separados):
40
+
41
+ ```bash
42
+ npx --yes pumuki install --with-mcp --agent=codex
43
+ npx --yes pumuki doctor --deep --json
44
+ ```
45
+
40
46
  OpenSpec/SDD baseline:
41
47
 
42
48
  ```bash
@@ -56,16 +62,16 @@ npx --yes pumuki loop list --json
56
62
  Run local gates:
57
63
 
58
64
  ```bash
59
- npx --yes pumuki-pre-write
60
- npx --yes pumuki-pre-commit
65
+ npx --yes --package pumuki@latest pumuki-pre-write
66
+ npx --yes --package pumuki@latest pumuki-pre-commit
61
67
  ```
62
68
 
63
69
  Run push/CI gates (requires proper git context):
64
70
 
65
71
  ```bash
66
72
  git push --set-upstream origin <branch>
67
- npx --yes pumuki-pre-push
68
- npx --yes pumuki-ci
73
+ npx --yes --package pumuki@latest pumuki-pre-push
74
+ npx --yes --package pumuki@latest pumuki-ci
69
75
  ```
70
76
 
71
77
  Expected behavior:
@@ -176,7 +182,7 @@ Example:
176
182
  export PUMUKI_TELEMETRY_JSONL_PATH=".pumuki/artifacts/gate-telemetry.jsonl"
177
183
  export PUMUKI_TELEMETRY_OTEL_ENDPOINT="https://otel.example/v1/logs"
178
184
  export PUMUKI_TELEMETRY_OTEL_SERVICE_NAME="pumuki-enterprise"
179
- npx --yes pumuki-pre-commit
185
+ npx --yes --package pumuki@latest pumuki-pre-commit
180
186
  ```
181
187
 
182
188
  Each event captures deterministic stage/outcome/policy/repo context per gate execution.
@@ -258,16 +264,16 @@ npx --yes pumuki loop export --session=<session-id> --output-json=.audit-reports
258
264
  ### Stage Gates (Consumer)
259
265
 
260
266
  ```bash
261
- npx --yes pumuki-pre-write
262
- npx --yes pumuki-pre-commit
263
- npx --yes pumuki-pre-push
264
- npx --yes pumuki-ci
267
+ npx --yes --package pumuki@latest pumuki-pre-write
268
+ npx --yes --package pumuki@latest pumuki-pre-commit
269
+ npx --yes --package pumuki@latest pumuki-pre-push
270
+ npx --yes --package pumuki@latest pumuki-ci
265
271
  ```
266
272
 
267
273
  ### MCP Servers (Optional, Long-Running)
268
274
 
269
275
  ```bash
270
- npx --yes pumuki-mcp-evidence
276
+ npx --yes --package pumuki@latest pumuki-mcp-evidence
271
277
  npx --yes --package pumuki@latest pumuki-mcp-evidence-stdio
272
278
  npx --yes --package pumuki@latest pumuki-mcp-enterprise
273
279
  npx --yes --package pumuki@latest pumuki-mcp-enterprise-stdio
@@ -359,6 +365,8 @@ Highlights:
359
365
 
360
366
  - Installation: `docs/INSTALLATION.md`
361
367
  - Usage: `docs/USAGE.md`
368
+ - Backlog tooling quick nav (incluye snippet terminal): `docs/USAGE.md#backlog-tooling`
369
+ - Backlog reasons shared module: `docs/USAGE.md#backlog-reasons`
362
370
  - Testing: `docs/TESTING.md`
363
371
  - API reference: `docs/API_REFERENCE.md`
364
372
  - Architecture: `docs/ARCHITECTURE.md`
@@ -382,6 +390,7 @@ Contributions are welcome. For high-quality collaboration:
382
390
  3. Keep scope focused and include deterministic evidence when relevant.
383
391
  4. Before opening a PR, run at least:
384
392
  - `npm run typecheck`
393
+ - `npm run -s test:backlog-tooling`
385
394
  - `npm run test:operational-memory`
386
395
  - `npm run test:saas-ingestion`
387
396
  5. Open a PR with clear problem statement, approach, and validation evidence.
package/VERSION CHANGED
@@ -1 +1 @@
1
- v6.3.39
1
+ v6.3.40
@@ -75,6 +75,46 @@ test('evaluateRules usa id de la regla como code cuando no se define en consecue
75
75
  assert.equal(findings[0]?.severity, 'ERROR');
76
76
  });
77
77
 
78
+ test('evaluateRules combina source del fact y source declarada por la regla', () => {
79
+ const rules: RuleSet = [
80
+ {
81
+ id: 'skills.backend.no-empty-catch',
82
+ description: 'Disallow empty catch blocks in backend runtime code.',
83
+ severity: 'ERROR',
84
+ when: {
85
+ kind: 'FileContent',
86
+ regex: ['catch\\s*\\{\\s*\\}'],
87
+ },
88
+ then: {
89
+ kind: 'Finding',
90
+ message: 'Disallow empty catch blocks in backend runtime code.',
91
+ code: 'SKILLS_BACKEND_NO_EMPTY_CATCH',
92
+ source:
93
+ 'skills-ir:rule=skills.backend.no-empty-catch;source_skill=backend-guidelines;source_path=docs/codex-skills/windsurf-rules-backend.md;evaluation_mode=AUTO;ast_nodes=[heuristics.ts.empty-catch.ast]',
94
+ },
95
+ scope: {
96
+ include: ['apps/backend/'],
97
+ },
98
+ },
99
+ ];
100
+ const facts = [
101
+ {
102
+ kind: 'FileContent',
103
+ path: 'apps/backend/src/service.ts',
104
+ content: 'try { doStuff(); } catch {}',
105
+ source: 'git:staged',
106
+ },
107
+ ] as const;
108
+
109
+ const findings = evaluateRules(rules, facts);
110
+
111
+ assert.equal(findings.length, 1);
112
+ assert.equal(
113
+ findings[0]?.source,
114
+ 'git:staged|skills-ir:rule=skills.backend.no-empty-catch;source_skill=backend-guidelines;source_path=docs/codex-skills/windsurf-rules-backend.md;evaluation_mode=AUTO;ast_nodes=[heuristics.ts.empty-catch.ast]'
115
+ );
116
+ });
117
+
78
118
  test('evaluateRules respeta scope y no genera hallazgo cuando no coincide', () => {
79
119
  const rules: RuleSet = [
80
120
  {
@@ -27,6 +27,12 @@ const toFinding = (
27
27
  consequence: Consequence,
28
28
  target?: FindingTarget
29
29
  ): Finding => {
30
+ const sourceParts = [
31
+ target?.source?.trim(),
32
+ consequence.source?.trim(),
33
+ ].filter((part): part is string => typeof part === 'string' && part.length > 0);
34
+ const mergedSource = sourceParts.length > 0 ? sourceParts.join('|') : undefined;
35
+
30
36
  return {
31
37
  ruleId: rule.id,
32
38
  severity: rule.severity,
@@ -34,7 +40,7 @@ const toFinding = (
34
40
  message: consequence.message,
35
41
  filePath: target?.filePath,
36
42
  matchedBy: target?.matchedBy,
37
- source: target?.source,
43
+ source: mergedSource,
38
44
  };
39
45
  };
40
46
 
@@ -2,4 +2,5 @@ export type Consequence = {
2
2
  kind: 'Finding';
3
3
  message: string;
4
4
  code?: string;
5
+ source?: string;
5
6
  };
@@ -192,6 +192,7 @@ Behavior:
192
192
  - `rule_updates`: deterministic recommendations derived from evidence/gate signals (`missing`, `invalid`, `blocked`, `allowed`).
193
193
  - dedicated command: `pumuki sdd learn --change=<id> [--stage=<stage>] [--task=<task>] [--dry-run] [--json]` generates/persists the same artifact without requiring `sync-docs`.
194
194
  - orchestration command: `pumuki sdd auto-sync --change=<id> [--stage=<stage>] [--task=<task>] [--dry-run] [--json]` executes deterministic docs sync plus learning generation in one step.
195
+ - safety limit: `--from-evidence` must resolve inside the repository root; path traversal/outside-repo paths are blocked.
195
196
 
196
197
  ## Gate telemetry export (optional)
197
198
 
@@ -241,6 +242,18 @@ PUMUKI_ENABLE_AST_HEURISTICS=true
241
242
 
242
243
  When enabled, stage-based heuristic severity maturity applies via `applyHeuristicSeverityForStage`.
243
244
 
245
+ ## AST Intelligence dual mode (legacy + nodos)
246
+
247
+ Controla la validación dual entre findings legacy y evaluación AST por nodos compilados desde `skills-ir`.
248
+
249
+ ```bash
250
+ PUMUKI_AST_INTELLIGENCE_DUAL_MODE=off|shadow|strict
251
+ ```
252
+
253
+ - `off` (default): desactivado.
254
+ - `shadow`: compara y reporta divergencias sin bloquear.
255
+ - `strict`: bloquea si hay divergencias (`false_positive/false_negative`) entre legacy y AST.
256
+
244
257
  ## Rule packs
245
258
 
246
259
  Version map lives in `core/rules/presets/rulePackVersions.ts`.
@@ -265,6 +278,43 @@ Configuration outcomes are reflected in `.ai_evidence.json`:
265
278
 
266
279
  Schema reference: `docs/evidence-v2.1.md`.
267
280
 
281
+ ## AI Gate skills contract
282
+
283
+ `evaluateAiGate` now emits a machine-readable contract snapshot under `skills_contract`.
284
+
285
+ Contract goals:
286
+
287
+ - deterministic mapping: `detected platform -> required skills policy/rules`
288
+ - explicit coverage checks for `active_rule_ids` and `evaluated_rule_ids`
289
+ - stage-aware enforcement beyond PRE_WRITE (`PRE_COMMIT`, `PRE_PUSH`, `CI`)
290
+
291
+ Runtime fields:
292
+
293
+ - `skills_contract.stage`
294
+ - `skills_contract.status` (`PASS|FAIL|NOT_APPLICABLE`)
295
+ - `skills_contract.detected_platforms`
296
+ - `skills_contract.requirements[]`
297
+ - `skills_contract.violations[]`
298
+
299
+ Blocking code:
300
+
301
+ - `EVIDENCE_SKILLS_CONTRACT_INCOMPLETE` (when contract is incomplete outside PRE_WRITE)
302
+
303
+ ## PRE_WRITE worktree hygiene guard
304
+
305
+ AI Gate can enforce early worktree hygiene in `PRE_WRITE` to reduce non-atomic changes before commit time.
306
+
307
+ Environment variables:
308
+
309
+ - `PUMUKI_PREWRITE_WORKTREE_HYGIENE_ENABLED` (`true|false`, default: `true`)
310
+ - `PUMUKI_PREWRITE_WORKTREE_WARN_THRESHOLD` (default: `12`)
311
+ - `PUMUKI_PREWRITE_WORKTREE_BLOCK_THRESHOLD` (default: `24`)
312
+
313
+ Codes emitted:
314
+
315
+ - `EVIDENCE_PREWRITE_WORKTREE_WARN` (warning, still `ALLOWED`)
316
+ - `EVIDENCE_PREWRITE_WORKTREE_OVER_LIMIT` (blocking error)
317
+
268
318
  ## TDD/BDD Vertical Enforcement Contract
269
319
 
270
320
  For new/complex changes, Pumuki enforces a neutral TDD/BDD evidence contract.
@@ -45,10 +45,10 @@ If both commands pass, the workspace is ready.
45
45
  npm install --save-exact pumuki
46
46
  ```
47
47
 
48
- ### 2) Install managed lifecycle and OpenSpec bootstrap
48
+ ### 2) Bootstrap managed lifecycle (recommended single command)
49
49
 
50
50
  ```bash
51
- npx --yes pumuki install
51
+ npx --yes pumuki bootstrap --enterprise --agent=codex
52
52
  ```
53
53
 
54
54
  Behavior:
@@ -56,11 +56,20 @@ Behavior:
56
56
  - Auto-installs `@fission-ai/openspec@latest` when OpenSpec is missing/incompatible (when `package.json` exists).
57
57
  - Scaffolds `openspec/` baseline if missing (`project` file plus archive/spec placeholders).
58
58
  - Bootstraps `.ai_evidence.json` when missing (deterministic empty baseline with repo state snapshot).
59
+ - Scaffolds adapter wiring (`.pumuki/adapter.json` by default) and runs `doctor --deep` automatically.
60
+
61
+ Fallback (equivalent):
62
+
63
+ ```bash
64
+ npx --yes pumuki install --with-mcp --agent=codex
65
+ npx --yes pumuki doctor --deep --json
66
+ ```
59
67
 
60
68
  ### 3) Verify lifecycle and SDD status
61
69
 
62
70
  ```bash
63
71
  npx --yes pumuki doctor
72
+ npx --yes pumuki doctor --deep --json
64
73
  npx --yes pumuki status
65
74
  npx --yes pumuki sdd status
66
75
  ```
@@ -81,10 +90,10 @@ npx --yes pumuki sdd validate --stage=PRE_COMMIT
81
90
  ### 5) Run gates
82
91
 
83
92
  ```bash
84
- npx --yes pumuki-pre-write
85
- npx --yes pumuki-pre-commit
86
- npx --yes pumuki-pre-push
87
- npx --yes pumuki-ci
93
+ npx --yes --package pumuki@latest pumuki-pre-write
94
+ npx --yes --package pumuki@latest pumuki-pre-commit
95
+ npx --yes --package pumuki@latest pumuki-pre-push
96
+ npx --yes --package pumuki@latest pumuki-ci
88
97
  ```
89
98
 
90
99
  `PRE_WRITE` JSON shape:
@@ -121,23 +130,23 @@ Consumer repositories do not have the `framework:menu` npm script by default.
121
130
  Use the published binary instead:
122
131
 
123
132
  ```bash
124
- npx --yes pumuki-framework
133
+ npx --yes --package pumuki@latest pumuki-framework
125
134
  ```
126
135
 
127
136
  ### Direct stage runners
128
137
 
129
138
  ```bash
130
139
  # PRE_WRITE
131
- npx --yes pumuki-pre-write
140
+ npx --yes --package pumuki@latest pumuki-pre-write
132
141
 
133
142
  # PRE_COMMIT
134
- npx --yes pumuki-pre-commit
143
+ npx --yes --package pumuki@latest pumuki-pre-commit
135
144
 
136
145
  # PRE_PUSH
137
- npx --yes pumuki-pre-push
146
+ npx --yes --package pumuki@latest pumuki-pre-push
138
147
 
139
148
  # CI
140
- npx --yes pumuki-ci
149
+ npx --yes --package pumuki@latest pumuki-ci
141
150
  ```
142
151
 
143
152
  ## Lifecycle + SDD commands
@@ -241,3 +250,21 @@ Then reopen/refresh active session:
241
250
  npx --yes pumuki sdd session --open --change=<change-id>
242
251
  npx --yes pumuki sdd session --refresh
243
252
  ```
253
+
254
+ ### Hooks/adapter use fragile `npx` binary resolution
255
+
256
+ Run deep doctor diagnostics and verify `adapter-wiring`:
257
+
258
+ ```bash
259
+ npx --yes pumuki doctor --deep --json
260
+ ```
261
+
262
+ If doctor reports fragile commands in adapter wiring, repair with:
263
+
264
+ ```bash
265
+ npx --yes pumuki adapter install --agent=codex
266
+ ```
267
+
268
+ Notes for repos with `:` in path:
269
+ - Avoid adapter/hook commands that mutate `PATH` inline (for example `PATH="...:$PATH" npx ...`).
270
+ - Prefer generated commands from `pumuki adapter install` (local bin / local node entry / `npx --package` fallback).
@@ -21,7 +21,7 @@ npm run mcp:enterprise
21
21
  ### Desde un repositorio consumidor
22
22
 
23
23
  ```bash
24
- npx --yes pumuki-mcp-evidence
24
+ npx --yes --package pumuki@latest pumuki-mcp-evidence
25
25
  npx --yes --package pumuki@latest pumuki-mcp-enterprise
26
26
  npx --yes --package pumuki@latest pumuki-mcp-enterprise-stdio
27
27
  ```
package/docs/README.md CHANGED
@@ -48,6 +48,7 @@ Canonical index for active Pumuki documentation.
48
48
 
49
49
  - `docs/validation/README.md`: enterprise minimal validation index.
50
50
  - `docs/validation/adapter-hook-runtime-validation.md`
51
+ - `docs/validation/ast-intelligence-roadmap.md`
51
52
  - `docs/validation/c022-phase-acceptance-contract.md`
52
53
  - `docs/validation/enterprise-consumer-isolation-policy.md`
53
54
  - `docs/validation/mock-consumer-integration-runbook.md`
@@ -5,6 +5,50 @@ Detailed commit history remains available through Git history (`git log` / `git
5
5
 
6
6
  ## 2026-03 (enterprise hardening updates)
7
7
 
8
+ ### 2026-03-05 (v6.3.40)
9
+
10
+ - AST Intelligence dual validation PoC (`#616`) integrado en gate:
11
+ - runtime mode: `PUMUKI_AST_INTELLIGENCE_DUAL_MODE=off|shadow|strict`.
12
+ - `shadow`: comparación legacy vs AST por nodos sin bloqueo.
13
+ - `strict`: bloqueo cuando hay divergencias.
14
+ - métricas en runtime: `mapped_rules`, `divergences`, `false_positives`, `false_negatives`, `latency_ms`, `languages`.
15
+ - Señales de gate añadidas:
16
+ - `governance.ast-intelligence.dual-validation.shadow`
17
+ - `governance.ast-intelligence.dual-validation.mismatch`
18
+ - Backlog tooling (`watch/reconcile`) amplía contrato JSON en `next_commands[]`:
19
+ - nuevo campo `probe_kind` (`json_contract` | `state_recheck`) para tipar verificación post-ejecución.
20
+ - Correcciones de robustez operativa en consumidores reales:
21
+ - `PRE_PUSH` detecta upstream desalineado antes de evaluar scope coverage (evita falsos positivos de plataforma por delta contaminado).
22
+ - smoke de instalación local hace fallback cuando `npx --no-install` falla por `MODULE_NOT_FOUND`.
23
+ - `ai_gate_check` unifica hint de precedencia para códigos legacy `EVIDENCE_*` (incluye `EVIDENCE_INTEGRITY_MISSING`).
24
+ - RFC y plan de rollout/rollback:
25
+ - `docs/validation/ast-intelligence-roadmap.md`.
26
+ - Evidencia de validación:
27
+ - `npx --yes tsx@4.21.0 --test scripts/__tests__/backlog-cli-help-exit-code.test.ts` (`11 pass / 0 fail`)
28
+ - `npm run -s typecheck` (`PASS`)
29
+ - `npm run -s test:stage-gates` (`1033 pass / 0 fail / 4 skip`)
30
+
31
+ ### 2026-03-04 (next cut candidate, post v6.3.39)
32
+
33
+ - Gate coverage hardening for SAAS backlog (`#622`):
34
+ - when code changes are present and `active_rule_ids` is empty, gate now blocks with:
35
+ - finding id: `governance.rules.active-rule-coverage.empty`
36
+ - code: `ACTIVE_RULE_IDS_EMPTY_FOR_CODE_CHANGES_HIGH`
37
+ - iOS test quality hardening for SAAS backlog (`#623`):
38
+ - for XCTest sources in `apps/ios/**/Tests/**.swift`, gate now requires:
39
+ - `makeSUT()`
40
+ - `trackForMemoryLeaks()`
41
+ - blocking signal:
42
+ - finding id: `governance.skills.ios-test-quality.incomplete`
43
+ - code: `IOS_TEST_QUALITY_PATTERN_MISSING_HIGH`
44
+ - Gate traceability consistency:
45
+ - fixed propagation of guard findings to `effectiveFindings` so `BLOCK` outcomes are always accompanied by explicit finding payload.
46
+ - Validation evidence:
47
+ - `npx --yes tsx@4.21.0 --test integrations/git/__tests__/runPlatformGate.test.ts` (`32 pass / 0 fail`)
48
+ - `npx --yes tsx@4.21.0 --test integrations/git/__tests__/stageRunners.test.ts` (`21 pass / 0 fail`)
49
+ - `npm run -s typecheck` (`PASS`)
50
+ - `npm run -s test:stage-gates` (`1024 pass / 0 fail / 4 skip`)
51
+
8
52
  ### 2026-03-04 (v6.3.39)
9
53
 
10
54
  - Adapter/runtime bootstrap hardening: