@nathapp/nax 0.28.0 → 0.29.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.
Files changed (376) hide show
  1. package/CHANGELOG.md +13 -2
  2. package/dist/nax.js +72691 -0
  3. package/package.json +12 -4
  4. package/src/cli/config.ts +3 -1
  5. package/src/config/defaults.ts +1 -0
  6. package/src/config/schemas.ts +1 -0
  7. package/src/config/types.ts +1 -0
  8. package/src/context/builder.ts +10 -1
  9. package/src/prompts/sections/role-task.ts +4 -2
  10. package/src/review/runner.ts +6 -1
  11. package/src/version.ts +2 -1
  12. package/.claude/rules/01-project-conventions.md +0 -34
  13. package/.claude/rules/02-test-architecture.md +0 -39
  14. package/.claude/rules/03-test-writing.md +0 -58
  15. package/.claude/rules/04-forbidden-patterns.md +0 -29
  16. package/.claude/settings.json +0 -15
  17. package/.githooks/pre-commit +0 -16
  18. package/.gitlab-ci.yml +0 -103
  19. package/.mcp.json +0 -8
  20. package/BRIEF.md +0 -140
  21. package/CLAUDE.md +0 -143
  22. package/US-007-IMPLEMENTATION.md +0 -139
  23. package/biome.json +0 -14
  24. package/bun.lock +0 -163
  25. package/bunfig.toml +0 -12
  26. package/docker-compose.test.yml +0 -15
  27. package/docs/20260216-fix-plan-context-review.md +0 -56
  28. package/docs/20260216-relentless-vs-ngent-comparison.md +0 -208
  29. package/docs/20260216-v02-plan.md +0 -136
  30. package/docs/20260216-v02-review.md +0 -685
  31. package/docs/20260217-dogfood-findings.md +0 -56
  32. package/docs/20260217-p2-plus-plan.md +0 -117
  33. package/docs/20260217-partial-fixes-plan.md +0 -62
  34. package/docs/20260217-plan-analyze-spec.md +0 -117
  35. package/docs/20260217-post-impl-review.md +0 -1137
  36. package/docs/20260217-quick-wins-plan.md +0 -66
  37. package/docs/20260217-split-runner-plan.md +0 -75
  38. package/docs/20260217-v03-impl-plan.md +0 -80
  39. package/docs/20260217-v03-post-impl-review.md +0 -589
  40. package/docs/20260217-v04-impl-plan.md +0 -86
  41. package/docs/20260217-v05-post-impl-review.md +0 -850
  42. package/docs/20260217-v06-post-impl-review.md +0 -817
  43. package/docs/20260218-adr003-port-plan.md +0 -151
  44. package/docs/20260218-review-adr003-verification.md +0 -175
  45. package/docs/20260219-fix-plan-bug16-19.md +0 -79
  46. package/docs/20260219-fix-plan-bug20-22.md +0 -114
  47. package/docs/20260219-plan-llm-routing.md +0 -116
  48. package/docs/20260219-review-bug20-22-fixes.md +0 -135
  49. package/docs/20260219-routing-baseline-keyword.md +0 -63
  50. package/docs/20260220-plan-structured-logging-p1.md +0 -80
  51. package/docs/20260220-plan-structured-logging-p2.md +0 -37
  52. package/docs/20260220-review-llm-routing.md +0 -180
  53. package/docs/20260220-review-post-fix-llm-routing.md +0 -70
  54. package/docs/20260221-fix-plan-relevantfiles-split.md +0 -101
  55. package/docs/20260221-fix-plan-routing-mode.md +0 -125
  56. package/docs/20260221-review-v0.9-implementation.md +0 -379
  57. package/docs/20260222-fix-plan-v091-routing-isolation.md +0 -197
  58. package/docs/20260223-fix-plan-prompt-audit.md +0 -62
  59. package/docs/20260224-nax-roadmap-phases.md +0 -189
  60. package/docs/20260225-phase2-llm-service-layer.md +0 -401
  61. package/docs/20260225-review-v0.10.1.md +0 -187
  62. package/docs/20260303-v010-implementation-plan.md +0 -165
  63. package/docs/20260304-review-nax.md +0 -492
  64. package/docs/CLAUDE.md.bak +0 -191
  65. package/docs/ROADMAP.md +0 -390
  66. package/docs/SPEC-rectification.md +0 -0
  67. package/docs/SPEC.md +0 -324
  68. package/docs/US-001-plugin-loading-verification.md +0 -152
  69. package/docs/adr/ADR-005-implementation-plan.md +0 -655
  70. package/docs/adr/ADR-005-pipeline-re-architecture.md +0 -464
  71. package/docs/architecture-analysis.md +0 -1076
  72. package/docs/bugs/BUG-21-escalation-null-attempts.md +0 -48
  73. package/docs/bugs-from-dogfood-run-c.md +0 -243
  74. package/docs/code-review-20260228.md +0 -612
  75. package/docs/code-review-v0.15.0.md +0 -629
  76. package/docs/hook-lifecycle-test-plan.md +0 -149
  77. package/docs/releases/v0.11.0-and-earlier.md +0 -20
  78. package/docs/releases/v0.12.0.md +0 -15
  79. package/docs/releases/v0.13.0.md +0 -14
  80. package/docs/releases/v0.14.0.md +0 -20
  81. package/docs/releases/v0.14.1.md +0 -36
  82. package/docs/releases/v0.14.2.md +0 -51
  83. package/docs/releases/v0.14.3.md +0 -174
  84. package/docs/releases/v0.14.4.md +0 -94
  85. package/docs/releases/v0.15.0.md +0 -502
  86. package/docs/releases/v0.15.1.md +0 -170
  87. package/docs/releases/v0.15.3.md +0 -193
  88. package/docs/specs/bug-039-orphan-processes.md +0 -131
  89. package/docs/specs/bug-040-review-rectification.md +0 -82
  90. package/docs/specs/bug-041-cross-story-test-isolation.md +0 -88
  91. package/docs/specs/bug-042-verifier-failure-capture.md +0 -117
  92. package/docs/specs/bun-pty-migration.md +0 -171
  93. package/docs/specs/central-run-registry.md +0 -116
  94. package/docs/specs/feat-010-smart-runner-git-history.md +0 -96
  95. package/docs/specs/feat-011-file-context-strategy.md +0 -73
  96. package/docs/specs/feat-012-tdd-writer-tier.md +0 -79
  97. package/docs/specs/feat-013-test-after-review.md +0 -89
  98. package/docs/specs/feat-014-heartbeat-observability.md +0 -127
  99. package/docs/specs/status-file-consolidation.md +0 -93
  100. package/docs/specs/status-file-v0.10.1.md +0 -812
  101. package/docs/specs/trigger-completion.md +0 -145
  102. package/docs/specs/verification-architecture-v2.md +0 -343
  103. package/docs/tdd/strategies.md +0 -97
  104. package/docs/v0.10-global-config.md +0 -206
  105. package/docs/v0.10-plugin-system.md +0 -415
  106. package/docs/v0.10-prompt-optimizer.md +0 -234
  107. package/docs/v0.3-spec.md +0 -244
  108. package/docs/v0.4-spec.md +0 -140
  109. package/docs/v0.5-spec.md +0 -237
  110. package/docs/v0.6-spec.md +0 -371
  111. package/docs/v0.7-spec.md +0 -177
  112. package/docs/v0.8-llm-routing.md +0 -206
  113. package/docs/v0.8-structured-logging.md +0 -132
  114. package/docs/v0.9.3-prompt-audit.md +0 -112
  115. package/examples/plugins/console-reporter/index.test.ts +0 -207
  116. package/examples/plugins/console-reporter/index.ts +0 -110
  117. package/memory/topic/feat-010-baseref.md +0 -28
  118. package/memory/topic/feat-013-test-after-deprecation.md +0 -22
  119. package/nax/config.json +0 -154
  120. package/nax/features/bug-039-medium/prd.json +0 -45
  121. package/nax/features/bugfix-v0171/prd.json +0 -52
  122. package/nax/features/central-run-registry/prd.json +0 -105
  123. package/nax/features/config-management/prd.json +0 -108
  124. package/nax/features/config-management/progress.txt +0 -5
  125. package/nax/features/diagnose/acceptance.test.ts +0 -414
  126. package/nax/features/diagnose/prd.json +0 -41
  127. package/nax/features/nax-compliance/prd.json +0 -52
  128. package/nax/features/nax-compliance/progress.txt +0 -1
  129. package/nax/features/orchestration-fixes/prd.json +0 -89
  130. package/nax/features/orchestration-fixes/progress.txt +0 -1
  131. package/nax/features/plugin-integration/US-007-VERIFICATION.md +0 -259
  132. package/nax/features/plugin-integration/prd.json +0 -208
  133. package/nax/features/plugin-integration/progress.txt +0 -5
  134. package/nax/features/post-rearch-bugfix/prd.json +0 -137
  135. package/nax/features/precheck/prd.json +0 -205
  136. package/nax/features/precheck/progress.txt +0 -15
  137. package/nax/features/prompt-builder/prd.json +0 -152
  138. package/nax/features/prompt-builder/progress.txt +0 -3
  139. package/nax/features/review-quality/prd.json +0 -55
  140. package/nax/features/routing-persistence/prd.json +0 -104
  141. package/nax/features/routing-persistence/progress.txt +0 -1
  142. package/nax/features/smart-test-runner/plan.md +0 -7
  143. package/nax/features/smart-test-runner/prd.json +0 -203
  144. package/nax/features/smart-test-runner/progress.txt +0 -13
  145. package/nax/features/smart-test-runner/spec.md +0 -7
  146. package/nax/features/smart-test-runner/tasks.md +0 -8
  147. package/nax/features/status-file-consolidation/prd.json +0 -106
  148. package/nax/features/structured-logging/prd.json +0 -199
  149. package/nax/features/trigger-completion/prd.json +0 -150
  150. package/nax/features/trigger-completion/progress.txt +0 -7
  151. package/nax/features/unlock/prd.json +0 -36
  152. package/nax/features/v0.18.3-execution-reliability/prd.json +0 -80
  153. package/nax/features/v0.18.3-execution-reliability/progress.txt +0 -3
  154. package/nax/features/v0.19.0-hardening/plan.md +0 -7
  155. package/nax/features/v0.19.0-hardening/prd.json +0 -84
  156. package/nax/features/v0.19.0-hardening/progress.txt +0 -7
  157. package/nax/features/v0.19.0-hardening/spec.md +0 -18
  158. package/nax/features/v0.19.0-hardening/tasks.md +0 -8
  159. package/nax/features/verify-v2/prd.json +0 -79
  160. package/nax/features/verify-v2/progress.txt +0 -3
  161. package/nax/status.json +0 -36
  162. package/test/COVERAGE-GAPS.md +0 -333
  163. package/test/e2e/cm-003-default-view.test.ts +0 -195
  164. package/test/e2e/plan-analyze-run.test.ts +0 -902
  165. package/test/helpers/helpers.test.ts +0 -295
  166. package/test/helpers/timeout.ts +0 -42
  167. package/test/integration/US-002-TEST-SUMMARY.md +0 -107
  168. package/test/integration/US-003-TEST-SUMMARY.md +0 -149
  169. package/test/integration/US-004-TEST-SUMMARY.md +0 -106
  170. package/test/integration/US-005-TEST-SUMMARY.md +0 -138
  171. package/test/integration/US-007-TEST-SUMMARY.md +0 -100
  172. package/test/integration/cli/agent-validation.test.ts +0 -439
  173. package/test/integration/cli/cli-config-default-edge-cases.test.ts +0 -223
  174. package/test/integration/cli/cli-config-default-view.test.ts +0 -230
  175. package/test/integration/cli/cli-config-diff.test.ts +0 -461
  176. package/test/integration/cli/cli-config-prompts-explain.test.ts +0 -74
  177. package/test/integration/cli/cli-config.test.ts +0 -737
  178. package/test/integration/cli/cli-diagnose.test.ts +0 -595
  179. package/test/integration/cli/cli-logs.test.ts +0 -346
  180. package/test/integration/cli/cli-plugins.test.ts +0 -679
  181. package/test/integration/cli/cli-precheck.test.ts +0 -372
  182. package/test/integration/cli/cli-run-headless.test.ts +0 -174
  183. package/test/integration/cli/cli.test.ts +0 -76
  184. package/test/integration/cli/precheck-integration.test.ts +0 -476
  185. package/test/integration/cli/precheck-orchestrator.test.ts +0 -247
  186. package/test/integration/cli/precheck.test.ts +0 -806
  187. package/test/integration/config/config-loader.test.ts +0 -266
  188. package/test/integration/config/config.test.ts +0 -444
  189. package/test/integration/config/merger.test.ts +0 -466
  190. package/test/integration/config/paths.test.ts +0 -52
  191. package/test/integration/config/security-loader.test.ts +0 -83
  192. package/test/integration/context/context-integration.test.ts +0 -703
  193. package/test/integration/context/context-path-security.test.ts +0 -173
  194. package/test/integration/context/context-provider-injection.test.ts +0 -507
  195. package/test/integration/context/context-verification-integration.test.ts +0 -296
  196. package/test/integration/context/s5-greenfield-fallback.test.ts +0 -298
  197. package/test/integration/execution/execution-isolation.test.ts +0 -143
  198. package/test/integration/execution/execution.test.ts +0 -634
  199. package/test/integration/execution/feature-status-write.test.ts +0 -302
  200. package/test/integration/execution/parallel.test.ts +0 -251
  201. package/test/integration/execution/prd-pause.test.ts +0 -205
  202. package/test/integration/execution/prd-resolvers.test.ts +0 -186
  203. package/test/integration/execution/progress.test.ts +0 -34
  204. package/test/integration/execution/runner-batching.test.ts +0 -682
  205. package/test/integration/execution/runner-config-plugins.test.ts +0 -462
  206. package/test/integration/execution/runner-escalation.test.ts +0 -561
  207. package/test/integration/execution/runner-fixes.test.ts +0 -400
  208. package/test/integration/execution/runner-plugin-integration.test.ts +0 -544
  209. package/test/integration/execution/runner-queue-and-attempts.test.ts +0 -476
  210. package/test/integration/execution/status-file-integration.test.ts +0 -289
  211. package/test/integration/execution/status-file.test.ts +0 -380
  212. package/test/integration/execution/status-writer.test.ts +0 -447
  213. package/test/integration/execution/story-id-in-events.test.ts +0 -274
  214. package/test/integration/interaction/interaction-chain-pipeline.test.ts +0 -476
  215. package/test/integration/pipeline/hooks.test.ts +0 -363
  216. package/test/integration/pipeline/pipeline-acceptance.test.ts +0 -303
  217. package/test/integration/pipeline/pipeline-events.test.ts +0 -476
  218. package/test/integration/pipeline/pipeline.test.ts +0 -660
  219. package/test/integration/pipeline/reporter-lifecycle.test.ts +0 -862
  220. package/test/integration/pipeline/verify-stage.test.ts +0 -286
  221. package/test/integration/plan/analyze-integration.test.ts +0 -262
  222. package/test/integration/plan/analyze-scanner.test.ts +0 -132
  223. package/test/integration/plan/logger.test.ts +0 -461
  224. package/test/integration/plan/plan.test.ts +0 -157
  225. package/test/integration/plugins/config-integration.test.ts +0 -173
  226. package/test/integration/plugins/config-resolution.test.ts +0 -523
  227. package/test/integration/plugins/loader.test.ts +0 -644
  228. package/test/integration/plugins/plugins-registry.test.ts +0 -747
  229. package/test/integration/plugins/validator.test.ts +0 -564
  230. package/test/integration/prompts/pb-004-migration.test.ts +0 -523
  231. package/test/integration/review/review-config-commands.test.ts +0 -320
  232. package/test/integration/review/review-config-schema.test.ts +0 -117
  233. package/test/integration/review/review-plugin-integration.test.ts +0 -729
  234. package/test/integration/review/review.test.ts +0 -150
  235. package/test/integration/routing/plugin-routing-advanced.test.ts +0 -461
  236. package/test/integration/routing/plugin-routing-core.test.ts +0 -527
  237. package/test/integration/routing/routing-stage-bug-021.test.ts +0 -275
  238. package/test/integration/routing/routing-stage-greenfield.test.ts +0 -287
  239. package/test/integration/tdd/tdd-cleanup.test.ts +0 -246
  240. package/test/integration/tdd/tdd-orchestrator-core.test.ts +0 -565
  241. package/test/integration/tdd/tdd-orchestrator-failureCategory.test.ts +0 -355
  242. package/test/integration/tdd/tdd-orchestrator-fallback.test.ts +0 -311
  243. package/test/integration/tdd/tdd-orchestrator-lite.test.ts +0 -289
  244. package/test/integration/tdd/tdd-orchestrator-prompts.test.ts +0 -260
  245. package/test/integration/tdd/tdd-orchestrator-verdict.test.ts +0 -536
  246. package/test/integration/tmp/headless-test/test.jsonl +0 -30
  247. package/test/integration/verification/test-scanner.test.ts +0 -403
  248. package/test/integration/verification/verification-asset-check.test.ts +0 -143
  249. package/test/integration/worktree/manager.test.ts +0 -218
  250. package/test/integration/worktree/worktree-merge.test.ts +0 -341
  251. package/test/manual/logging-formatter-demo.ts +0 -158
  252. package/test/ui/tui-agent-panel.test.tsx +0 -99
  253. package/test/ui/tui-pty-integration.test.tsx +0 -146
  254. package/test/unit/acceptance.test.ts +0 -187
  255. package/test/unit/agent-stderr-capture.test.ts +0 -147
  256. package/test/unit/agents/claude.test.ts +0 -107
  257. package/test/unit/analyze-classifier.test.ts +0 -216
  258. package/test/unit/analyze.test.ts +0 -224
  259. package/test/unit/auto-detect.test.ts +0 -250
  260. package/test/unit/cli-status-project-level.test.ts +0 -283
  261. package/test/unit/cli-status.test.ts +0 -418
  262. package/test/unit/commands/common.test.ts +0 -321
  263. package/test/unit/commands/logs.test.ts +0 -458
  264. package/test/unit/commands/runs.test.ts +0 -303
  265. package/test/unit/commands/unlock.test.ts +0 -320
  266. package/test/unit/config/defaults.test.ts +0 -70
  267. package/test/unit/config/quality-commands-schema.test.ts +0 -72
  268. package/test/unit/config/regression-gate-schema.test.ts +0 -160
  269. package/test/unit/config/smart-runner-flag.test.ts +0 -250
  270. package/test/unit/constitution-generators.test.ts +0 -161
  271. package/test/unit/constitution.test.ts +0 -210
  272. package/test/unit/context/context-autodetect.test.ts +0 -297
  273. package/test/unit/context/context-build.test.ts +0 -575
  274. package/test/unit/context/context-coverage.test.ts +0 -236
  275. package/test/unit/context/context-error.test.ts +0 -93
  276. package/test/unit/context/context-estimate-tokens.test.ts +0 -201
  277. package/test/unit/context/context-format.test.ts +0 -302
  278. package/test/unit/context/context-isolation.test.ts +0 -267
  279. package/test/unit/context/context-sort.test.ts +0 -93
  280. package/test/unit/context/context-story.test.ts +0 -108
  281. package/test/unit/context/prior-failures.test.ts +0 -463
  282. package/test/unit/context.test.ts +0 -1726
  283. package/test/unit/cost.test.ts +0 -231
  284. package/test/unit/crash-recovery.test.ts +0 -309
  285. package/test/unit/escalation.test.ts +0 -127
  286. package/test/unit/execution/lifecycle/run-completion.test.ts +0 -240
  287. package/test/unit/execution/lifecycle/run-regression.test.ts +0 -420
  288. package/test/unit/execution/pid-registry.test.ts +0 -241
  289. package/test/unit/execution/sequential-executor.test.ts +0 -235
  290. package/test/unit/execution/sfc-004-dead-code-cleanup.test.ts +0 -89
  291. package/test/unit/execution/structured-failure.test.ts +0 -415
  292. package/test/unit/execution-logging-stderr.test.ts +0 -157
  293. package/test/unit/execution-stage.test.ts +0 -123
  294. package/test/unit/fix-generator.test.ts +0 -276
  295. package/test/unit/formatters.test.ts +0 -468
  296. package/test/unit/greenfield.test.ts +0 -180
  297. package/test/unit/hooks/shell-security.test.ts +0 -40
  298. package/test/unit/interaction/auto-plugin.test.ts +0 -162
  299. package/test/unit/interaction/human-review-trigger.test.ts +0 -165
  300. package/test/unit/interaction-network-failures.test.ts +0 -390
  301. package/test/unit/interaction-plugins.test.ts +0 -472
  302. package/test/unit/logging/formatter.test.ts +0 -456
  303. package/test/unit/merge.test.ts +0 -269
  304. package/test/unit/metrics/aggregator.test.ts +0 -164
  305. package/test/unit/metrics/tracker.test.ts +0 -186
  306. package/test/unit/metrics.test.ts +0 -276
  307. package/test/unit/optimizer/noop.optimizer.test.ts +0 -125
  308. package/test/unit/optimizer/rule-based.optimizer.test.ts +0 -358
  309. package/test/unit/pipeline/event-bus.test.ts +0 -105
  310. package/test/unit/pipeline/routing-partial-override.test.ts +0 -121
  311. package/test/unit/pipeline/runner-retry.test.ts +0 -89
  312. package/test/unit/pipeline/stages/autofix.test.ts +0 -97
  313. package/test/unit/pipeline/stages/completion-review-gate.test.ts +0 -218
  314. package/test/unit/pipeline/stages/execution-ambiguity.test.ts +0 -311
  315. package/test/unit/pipeline/stages/execution-merge-conflict.test.ts +0 -218
  316. package/test/unit/pipeline/stages/rectify.test.ts +0 -101
  317. package/test/unit/pipeline/stages/regression-stage.test.ts +0 -69
  318. package/test/unit/pipeline/stages/review.test.ts +0 -201
  319. package/test/unit/pipeline/stages/routing-idempotence.test.ts +0 -139
  320. package/test/unit/pipeline/stages/routing-initial-complexity.test.ts +0 -321
  321. package/test/unit/pipeline/stages/routing-persistence.test.ts +0 -380
  322. package/test/unit/pipeline/stages/verify.test.ts +0 -267
  323. package/test/unit/pipeline/subscribers/events-writer.test.ts +0 -227
  324. package/test/unit/pipeline/subscribers/hooks.test.ts +0 -84
  325. package/test/unit/pipeline/subscribers/interaction.test.ts +0 -313
  326. package/test/unit/pipeline/subscribers/registry.test.ts +0 -149
  327. package/test/unit/pipeline/subscribers/reporters.test.ts +0 -90
  328. package/test/unit/pipeline/verify-smart-runner.test.ts +0 -345
  329. package/test/unit/prd-auto-default.test.ts +0 -291
  330. package/test/unit/prd-failure-category.test.ts +0 -177
  331. package/test/unit/prd-get-next-story.test.ts +0 -215
  332. package/test/unit/precheck/checks-warnings.test.ts +0 -114
  333. package/test/unit/precheck-checks.test.ts +0 -841
  334. package/test/unit/precheck-story-size-gate.test.ts +0 -288
  335. package/test/unit/precheck-types.test.ts +0 -143
  336. package/test/unit/prompts/builder.test.ts +0 -258
  337. package/test/unit/prompts/loader.test.ts +0 -355
  338. package/test/unit/prompts/sections/conventions.test.ts +0 -30
  339. package/test/unit/prompts/sections/isolation.test.ts +0 -35
  340. package/test/unit/prompts/sections/role-task.test.ts +0 -40
  341. package/test/unit/prompts/sections/sections.test.ts +0 -238
  342. package/test/unit/prompts/sections/story.test.ts +0 -45
  343. package/test/unit/prompts/sections/verdict.test.ts +0 -58
  344. package/test/unit/prompts.test.ts +0 -476
  345. package/test/unit/queue.test.ts +0 -237
  346. package/test/unit/rectification.test.ts +0 -285
  347. package/test/unit/registry.test.ts +0 -288
  348. package/test/unit/review/runner.test.ts +0 -117
  349. package/test/unit/routing/content-hash.test.ts +0 -99
  350. package/test/unit/routing/routing-stability.test.ts +0 -208
  351. package/test/unit/routing/strategies/llm.test.ts +0 -306
  352. package/test/unit/routing-advanced.test.ts +0 -313
  353. package/test/unit/routing-core.test.ts +0 -341
  354. package/test/unit/routing-strategies.test.ts +0 -440
  355. package/test/unit/storyid-events.test.ts +0 -213
  356. package/test/unit/tdd-verdict.test.ts +0 -492
  357. package/test/unit/test-output-parser.test.ts +0 -377
  358. package/test/unit/ui/tui-controls.test.ts +0 -335
  359. package/test/unit/ui/tui-cost-and-pty.test.ts +0 -190
  360. package/test/unit/ui/tui-layout.test.ts +0 -379
  361. package/test/unit/ui/tui-stories.test.ts +0 -333
  362. package/test/unit/unit-isolation.test.ts +0 -135
  363. package/test/unit/utils/git.test.ts +0 -50
  364. package/test/unit/utils/path-security.test.ts +0 -47
  365. package/test/unit/utils-helpers.test.ts +0 -318
  366. package/test/unit/verdict.test.ts +0 -325
  367. package/test/unit/verification/orchestrator-types.test.ts +0 -54
  368. package/test/unit/verification/orchestrator.test.ts +0 -66
  369. package/test/unit/verification/smart-runner-config.test.ts +0 -163
  370. package/test/unit/verification/smart-runner-discovery.test.ts +0 -354
  371. package/test/unit/verification/smart-runner.test.ts +0 -262
  372. package/test/unit/verification/strategies/acceptance.test.ts +0 -33
  373. package/test/unit/verification/strategies/regression.test.ts +0 -87
  374. package/test/unit/verification/strategies/scoped.test.ts +0 -100
  375. package/test/unit/worktree-manager.test.ts +0 -159
  376. package/tsconfig.json +0 -27
@@ -1,589 +0,0 @@
1
- # Deep Code Review: ngent v0.3.0
2
-
3
- **Date:** 2026-02-17
4
- **Reviewer:** Subrina (AI)
5
- **Version:** 0.3.0-dev
6
- **Files:** 65 TypeScript files (src: ~7,172 LOC, test: ~7,757 LOC)
7
- **Baseline:** 342 tests passing, 881 assertions, TypeScript strict mode
8
-
9
- ---
10
-
11
- ## Overall Grade: A- (88/100)
12
-
13
- The v0.3 pipeline refactor represents a significant architectural improvement, successfully decomposing the monolithic runner into composable stages while maintaining backward compatibility. The new constitution, analyze, and review modules are well-designed with strong type safety and comprehensive test coverage. However, several medium-priority issues around JSDoc coverage, error handling consistency, and incomplete verify stage logic prevent this from achieving an A grade.
14
-
15
- **Key Strengths:**
16
- - Clean pipeline architecture with proper separation of concerns
17
- - Excellent test coverage for new modules (constitution: 100%, review: 100%, pipeline: 90%+)
18
- - Strong type safety with discriminated unions for pipeline results
19
- - Proper integration between new and existing systems
20
-
21
- **Areas for Improvement:**
22
- - Incomplete verify stage (placeholder with TODO)
23
- - JSDoc coverage gaps in pipeline stages (~40%)
24
- - Inconsistent error handling patterns between stages
25
- - Missing integration tests for full pipeline execution with all stages
26
-
27
- ---
28
-
29
- ## Findings
30
-
31
- ### 🔴 CRITICAL
32
-
33
- None. The codebase is production-ready from a security and reliability standpoint.
34
-
35
- ---
36
-
37
- ### 🟡 HIGH
38
-
39
- #### BUG-7: Verify Stage is a No-Op Placeholder
40
- **Severity:** HIGH | **Category:** Bug
41
- **File:** `src/pipeline/stages/verify.ts:18-25`
42
-
43
- ```typescript
44
- export const verifyStage: PipelineStage = {
45
- name: "verify",
46
- enabled: () => true,
47
- async execute(_ctx: PipelineContext): Promise<StageResult> {
48
- // TODO: Add verification logic here
49
- // - Run tests
50
- // - Check build
51
- // - Validate output
52
- return { action: "continue" };
53
- },
54
- };
55
- ```
56
-
57
- **Risk:** The verify stage is currently a no-op that always passes. This means agent output is never validated before being marked as passed. Stories could be marked complete even if tests fail or builds break.
58
-
59
- **Fix:** Implement verification logic:
60
- 1. Run `bun test` in the workdir
61
- 2. Check exit code
62
- 3. Return `{ action: "fail", reason: "Tests failed" }` if exit code !== 0
63
- 4. Consider adding build verification for TypeScript projects
64
-
65
- **Priority:** P0 — This is a critical gap in the execution pipeline.
66
-
67
- ---
68
-
69
- #### ENH-6: Pipeline Stages Have Inconsistent Error Handling
70
- **Severity:** HIGH | **Category:** Enhancement
71
- **File:** Multiple pipeline stages
72
-
73
- ```typescript
74
- // Constitution stage: returns continue even if loading fails silently
75
- if (result) {
76
- ctx.constitution = result.content;
77
- // ...logs...
78
- }
79
- // No else — just continues without constitution
80
-
81
- // Execution stage: returns fail with clear reason
82
- if (!ctx.prompt) {
83
- return { action: "fail", reason: "Prompt not built (prompt stage skipped?)" };
84
- }
85
- ```
86
-
87
- **Risk:** Inconsistent error handling makes it hard to debug pipeline failures. Some stages silently continue on errors, others fail explicitly. This can lead to confusing behavior where a story fails for unclear reasons.
88
-
89
- **Fix:** Establish consistent patterns:
90
- 1. **Soft failures** (constitution missing, context empty) → continue with warning log
91
- 2. **Hard failures** (no agent, invalid config) → return `{ action: "fail", reason: "..." }`
92
- 3. Document these patterns in a `PIPELINE.md` guide
93
-
94
- **Priority:** P1 — Affects debugging experience and maintainability.
95
-
96
- ---
97
-
98
- ### 🟡 MEDIUM
99
-
100
- #### ENH-7: Missing JSDoc on Pipeline Stages (~40% coverage)
101
- **Severity:** MEDIUM | **Category:** Enhancement
102
- **File:** `src/pipeline/stages/*.ts`
103
-
104
- ```typescript
105
- // ✗ No JSDoc
106
- export const queueCheckStage: PipelineStage = {
107
- name: "queue-check",
108
- enabled: () => true,
109
- async execute(ctx: PipelineContext): Promise<StageResult> {
110
- // ...
111
- },
112
- };
113
-
114
- // ✓ Should have JSDoc
115
- /**
116
- * Queue Check Stage
117
- *
118
- * Checks for queue commands (PAUSE/ABORT/SKIP) before executing a story.
119
- * Processes commands atomically and updates PRD accordingly.
120
- *
121
- * @returns
122
- * - `continue`: No queue commands, proceed
123
- * - `pause`: PAUSE/ABORT command found, stop execution
124
- * - `skip`: SKIP command removed all stories from batch
125
- *
126
- * @example
127
- * ```ts
128
- * // User writes: echo "PAUSE" > .queue.txt
129
- * const result = await queueCheckStage.execute(ctx);
130
- * // result: { action: "pause", reason: "User requested pause via .queue.txt" }
131
- * ```
132
- */
133
- ```
134
-
135
- **Impact:** New contributors need to read implementation code to understand stage behavior. Missing examples make it hard to understand stage interactions.
136
-
137
- **Fix:** Add JSDoc to all 9 pipeline stages with:
138
- - Brief description (1-2 sentences)
139
- - Return value documentation (all possible actions)
140
- - Example showing stage behavior in context
141
-
142
- **Priority:** P2 — Documentation gap, but code is readable.
143
-
144
- ---
145
-
146
- #### TYPE-3: Constitution Stage Uses Loose Type Conversion
147
- **Severity:** MEDIUM | **Category:** Type Safety
148
- **File:** `src/pipeline/stages/prompt.ts:22-30`
149
-
150
- ```typescript
151
- // Convert constitution string to ConstitutionResult if present
152
- const constitution: ConstitutionResult | undefined = ctx.constitution
153
- ? {
154
- content: ctx.constitution,
155
- tokens: Math.ceil(ctx.constitution.length / 4), // ⚠️ Duplicates estimation logic
156
- originalTokens: Math.ceil(ctx.constitution.length / 4),
157
- truncated: false,
158
- }
159
- : undefined;
160
- ```
161
-
162
- **Risk:**
163
- 1. Duplicates token estimation logic (should use `estimateTokens()` from constitution module)
164
- 2. Uses 1 token ≈ 4 chars, but constitution loader uses 1 token ≈ 3 chars (inconsistent)
165
- 3. If context stores `ConstitutionResult` instead of `string`, this conversion is unnecessary
166
-
167
- **Fix:**
168
- 1. Store `ConstitutionResult | undefined` in `PipelineContext.constitution` instead of `string | undefined`
169
- 2. Update constitution stage to assign the full result object
170
- 3. Remove conversion logic from prompt stage
171
-
172
- **Priority:** P2 — Type inconsistency, but functionally correct.
173
-
174
- ---
175
-
176
- #### BUG-8: Pipeline Runner Doesn't Preserve Context Mutations Across Stages
177
- **Severity:** MEDIUM | **Category:** Bug
178
- **File:** `src/pipeline/runner.ts:48-127`
179
-
180
- ```typescript
181
- export async function runPipeline(
182
- stages: PipelineStage[],
183
- context: PipelineContext,
184
- ): Promise<PipelineRunResult> {
185
- for (const stage of stages) {
186
- // ...
187
- result = await stage.execute(context); // ⚠️ Stages mutate context in-place
188
- }
189
- // ...
190
- return {
191
- success: true,
192
- finalAction: "complete",
193
- context, // ⚠️ Returns mutated context, but contract is unclear
194
- };
195
- }
196
- ```
197
-
198
- **Risk:** Stages mutate the context object in-place. The function signature doesn't make it clear whether the input `context` is mutated or a new context is returned. This could cause subtle bugs if callers expect immutability.
199
-
200
- **Fix:**
201
- 1. Document mutation contract in JSDoc: "Stages mutate the context in-place. The returned context is the same object, mutated."
202
- 2. Consider cloning context before pipeline execution for safer API (if mutation is unintended)
203
- 3. Add integration test verifying context mutations are preserved
204
-
205
- **Priority:** P2 — Potential footgun, but current usage is correct.
206
-
207
- ---
208
-
209
- #### PERF-4: Prompt Stage Recreates ConstitutionResult on Every Execution
210
- **Severity:** MEDIUM | **Category:** Performance
211
- **File:** `src/pipeline/stages/prompt.ts:22-30`
212
-
213
- ```typescript
214
- async execute(ctx: PipelineContext): Promise<StageResult> {
215
- // ⚠️ Re-creates ConstitutionResult every time even though content is static
216
- const constitution: ConstitutionResult | undefined = ctx.constitution
217
- ? {
218
- content: ctx.constitution,
219
- tokens: Math.ceil(ctx.constitution.length / 4),
220
- originalTokens: Math.ceil(ctx.constitution.length / 4),
221
- truncated: false,
222
- }
223
- : undefined;
224
- // ...
225
- }
226
- ```
227
-
228
- **Impact:** Constitution is loaded once per feature, but prompt stage recreates the result object on every story. For a 100-story feature, this wastes allocation cycles.
229
-
230
- **Fix:** Store `ConstitutionResult` in context (see TYPE-3) so prompt stage can use it directly without reconstruction.
231
-
232
- **Priority:** P3 — Micro-optimization, but aligns with TYPE-3 fix.
233
-
234
- ---
235
-
236
- #### ENH-8: No Integration Test for Full Pipeline with All Stages
237
- **Severity:** MEDIUM | **Category:** Enhancement
238
- **File:** `test/pipeline.test.ts`
239
-
240
- **Current coverage:**
241
- - ✓ Pipeline runner logic (continue/skip/fail/escalate/pause)
242
- - ✓ Individual stage unit tests (constitution, review)
243
- - ✗ Full pipeline execution with all 9 stages
244
-
245
- **Missing:** An integration test that:
246
- 1. Sets up a real workdir with package.json, src/, test/
247
- 2. Runs `runPipeline(defaultPipeline, realContext)`
248
- 3. Verifies all stages execute in order
249
- 4. Checks context accumulation (constitution → context → prompt → agentResult → reviewResult)
250
-
251
- **Fix:** Add `test/pipeline-integration.test.ts`:
252
- ```typescript
253
- test("full pipeline execution with all stages", async () => {
254
- const ctx = createRealTestContext(); // Real files, not mocks
255
- const result = await runPipeline(defaultPipeline, ctx);
256
-
257
- expect(result.success).toBe(true);
258
- expect(result.context.constitution).toBeDefined();
259
- expect(result.context.prompt).toBeDefined();
260
- expect(result.context.agentResult).toBeDefined();
261
- // etc.
262
- });
263
- ```
264
-
265
- **Priority:** P2 — Increases confidence in pipeline integration.
266
-
267
- ---
268
-
269
- #### STYLE-4: Magic Number for Constitution Token Estimation Inconsistency
270
- **Severity:** MEDIUM | **Category:** Style
271
- **File:** `src/pipeline/stages/prompt.ts:26` vs `src/constitution/loader.ts:21`
272
-
273
- ```typescript
274
- // constitution/loader.ts
275
- export function estimateTokens(text: string): number {
276
- return Math.ceil(text.length / 3); // 1 token ≈ 3 chars
277
- }
278
-
279
- // pipeline/stages/prompt.ts
280
- tokens: Math.ceil(ctx.constitution.length / 4), // ⚠️ 1 token ≈ 4 chars
281
- ```
282
-
283
- **Risk:** Inconsistent token estimation can lead to underestimation in prompt stage, potentially hitting model context limits unexpectedly.
284
-
285
- **Fix:** Always use `estimateTokens()` from constitution module. Extract as named constant if different heuristic is intentional:
286
- ```typescript
287
- const CONSERVATIVE_TOKEN_ESTIMATE = 4; // chars per token (more conservative than 3)
288
- ```
289
-
290
- **Priority:** P2 — Consistency issue with functional impact.
291
-
292
- ---
293
-
294
- ### 🟢 LOW
295
-
296
- #### ENH-9: Plan Command Doesn't Validate Spec Template Output
297
- **Severity:** LOW | **Category:** Enhancement
298
- **File:** `src/cli/plan.ts:50-132`
299
-
300
- ```typescript
301
- // In interactive mode, assume agent wrote the spec
302
- if (interactive) {
303
- if (result.specContent) {
304
- await Bun.write(outputPath, result.specContent);
305
- } else {
306
- // If agent wrote directly, verify it exists
307
- if (!existsSync(outputPath)) { // ⚠️ No format validation
308
- throw new Error(`Interactive planning completed but spec not found at ${outputPath}`);
309
- }
310
- }
311
- }
312
- ```
313
-
314
- **Impact:** Plan mode checks if spec file exists but doesn't validate it follows the template format. Agent could write invalid markdown or skip required sections (Problem, Requirements, Acceptance Criteria).
315
-
316
- **Fix:** Add optional spec validation:
317
- 1. Parse output markdown
318
- 2. Check for required sections: `# Feature:`, `## Problem`, `## Requirements`, `## Acceptance Criteria`
319
- 3. Warn if sections are missing (don't fail, since agent may use different structure)
320
-
321
- **Priority:** P3 — Nice-to-have validation, but agent output is typically well-structured.
322
-
323
- ---
324
-
325
- #### STYLE-5: Analyze Classifier Uses `any` for LLM Response Parsing
326
- **Severity:** LOW | **Category:** Type Safety
327
- **File:** `src/analyze/classifier.ts:105-127`
328
-
329
- ```typescript
330
- // Extract text from response
331
- const textContent = response.content.find((c: any) => c.type === "text"); // ⚠️ any
332
- if (!textContent || textContent.type !== "text") {
333
- throw new Error("No text response from LLM");
334
- }
335
-
336
- // Map to StoryClassification[]
337
- const classifications: StoryClassification[] = parsed.map((item: any) => ({ // ⚠️ any
338
- storyId: item.storyId,
339
- complexity: validateComplexity(item.complexity),
340
- // ...
341
- }));
342
- ```
343
-
344
- **Risk:** Using `any` bypasses type checking. If Anthropic SDK changes response structure, this code could fail at runtime without TypeScript catching it.
345
-
346
- **Fix:** Define proper types:
347
- ```typescript
348
- interface AnthropicTextContent {
349
- type: "text";
350
- text: string;
351
- }
352
-
353
- interface LLMClassificationItem {
354
- storyId: string;
355
- complexity: string;
356
- relevantFiles: unknown;
357
- reasoning: unknown;
358
- estimatedLOC: unknown;
359
- risks: unknown;
360
- }
361
- ```
362
-
363
- **Priority:** P3 — Low risk since Anthropic SDK is stable, but better type safety is always preferred.
364
-
365
- ---
366
-
367
- #### ENH-10: Pipeline Doesn't Log Which Stages Were Skipped
368
- **Severity:** LOW | **Category:** Enhancement
369
- **File:** `src/pipeline/runner.ts:52-56`
370
-
371
- ```typescript
372
- for (const stage of stages) {
373
- // Skip disabled stages
374
- if (!stage.enabled(context)) {
375
- continue; // ⚠️ Silent skip — user doesn't know why stage didn't run
376
- }
377
- // ...
378
- }
379
- ```
380
-
381
- **Impact:** If a stage is disabled (e.g., `reviewStage` when `config.review.enabled = false`), the pipeline silently skips it. Users may be confused why review didn't run.
382
-
383
- **Fix:** Add debug logging for skipped stages:
384
- ```typescript
385
- if (!stage.enabled(context)) {
386
- console.log(chalk.dim(` → Stage "${stage.name}" skipped (disabled)`));
387
- continue;
388
- }
389
- ```
390
-
391
- **Priority:** P3 — Improves observability but not critical.
392
-
393
- ---
394
-
395
- #### STYLE-6: Queue Check Stage Mutates Context Stories Array
396
- **Severity:** LOW | **Category:** Style
397
- **File:** `src/pipeline/stages/queue-check.ts:68`
398
-
399
- ```typescript
400
- // Remove from batch
401
- ctx.stories = ctx.stories.filter((s) => s.id !== cmd.storyId); // ⚠️ Mutation
402
- ```
403
-
404
- **Risk:** Mutating `ctx.stories` directly could cause confusion if other code expects the original batch to remain unchanged.
405
-
406
- **Fix:** Follow immutability principles:
407
- ```typescript
408
- // Create new array instead of mutating
409
- ctx.stories = ctx.stories.filter((s) => s.id !== cmd.storyId);
410
- // ✓ Already immutable (filter returns new array), but could be clearer:
411
- const updatedStories = ctx.stories.filter((s) => s.id !== cmd.storyId);
412
- ctx.stories = updatedStories;
413
- ```
414
-
415
- **Note:** Current code is actually fine (filter returns new array), but the assignment pattern could be clearer.
416
-
417
- **Priority:** P4 — Code works correctly, just a style preference.
418
-
419
- ---
420
-
421
- #### ENH-11: No Dry-Run Support for Review Stage
422
- **Severity:** LOW | **Category:** Enhancement
423
- **File:** `src/pipeline/stages/review.ts:16-29`
424
-
425
- ```typescript
426
- async execute(ctx: PipelineContext): Promise<StageResult> {
427
- console.log(chalk.cyan("\n → Running review phase..."));
428
-
429
- const reviewResult = await runReview(ctx.config.review, ctx.workdir); // ⚠️ Always runs, even in dry-run mode
430
- // ...
431
- }
432
- ```
433
-
434
- **Impact:** In dry-run mode, review stage still executes `bun test`, `bun run typecheck`, etc. This makes dry runs slow and may fail on incomplete code.
435
-
436
- **Fix:** Check for dry-run flag in context:
437
- ```typescript
438
- if (ctx.config.execution.dryRun) {
439
- console.log(chalk.yellow(" [DRY RUN] Would run review phase"));
440
- return { action: "continue" };
441
- }
442
- ```
443
-
444
- **Note:** PipelineContext doesn't currently have a `dryRun` flag. This would need to be added.
445
-
446
- **Priority:** P4 — Minor UX improvement for dry runs.
447
-
448
- ---
449
-
450
- #### TYPE-4: Routing Stage Console Logs Duplicate Logic
451
- **Severity:** LOW | **Category:** Style
452
- **File:** `src/pipeline/stages/routing.ts:32-45`
453
-
454
- ```typescript
455
- const isBatch = ctx.stories.length > 1;
456
-
457
- if (isBatch) {
458
- console.log(
459
- chalk.dim(
460
- ` Complexity: ${routing.complexity} | Model: ${routing.modelTier} | TDD: ${routing.testStrategy}`,
461
- ),
462
- );
463
- } else {
464
- console.log(
465
- chalk.dim(
466
- ` Complexity: ${routing.complexity} | Model: ${routing.modelTier} | TDD: ${routing.testStrategy}`,
467
- ),
468
- );
469
- console.log(chalk.dim(` Routing: ${routing.reasoning}`));
470
- }
471
- ```
472
-
473
- **Issue:** Both branches log identical strings. Could be simplified:
474
- ```typescript
475
- console.log(
476
- chalk.dim(
477
- ` Complexity: ${routing.complexity} | Model: ${routing.modelTier} | TDD: ${routing.testStrategy}`,
478
- ),
479
- );
480
- if (!isBatch) {
481
- console.log(chalk.dim(` Routing: ${routing.reasoning}`));
482
- }
483
- ```
484
-
485
- **Priority:** P4 — Code clarity, no functional impact.
486
-
487
- ---
488
-
489
- ## Priority Fix Order
490
-
491
- | Priority | ID | Effort | Description |
492
- |:---|:---|:---|:---|
493
- | **P0** | BUG-7 | M | Implement verify stage logic (run tests, check build) |
494
- | **P1** | ENH-6 | L | Document and standardize error handling patterns across pipeline stages |
495
- | **P1** | ENH-7 | M | Add JSDoc to all 9 pipeline stages with examples |
496
- | **P2** | TYPE-3 | S | Store ConstitutionResult in context, remove prompt stage conversion |
497
- | **P2** | BUG-8 | S | Document context mutation contract in runPipeline JSDoc |
498
- | **P2** | ENH-8 | M | Add full pipeline integration test with all stages |
499
- | **P2** | STYLE-4 | S | Fix token estimation inconsistency (use estimateTokens() everywhere) |
500
- | **P3** | ENH-9 | M | Add optional spec validation to plan command |
501
- | **P3** | STYLE-5 | S | Replace `any` with proper types in analyze classifier |
502
- | **P3** | ENH-10 | S | Log skipped stages for observability |
503
- | **P4** | STYLE-6 | — | (No action needed — code is correct) |
504
- | **P4** | ENH-11 | S | Add dry-run support to review stage |
505
- | **P4** | TYPE-4 | S | Simplify routing stage logging |
506
-
507
- **Effort:** S = Small (<1hr), M = Medium (1-4hrs), L = Large (>4hrs)
508
-
509
- ---
510
-
511
- ## Dimension Scores
512
-
513
- ### Security: 20/20 ✓
514
- - ✓ No hardcoded secrets or credentials
515
- - ✓ Input validation on all boundaries (queue commands, spec parsing)
516
- - ✓ Command injection prevention in review runner (using spawn with args array)
517
- - ✓ Path traversal protection via config path-security module
518
- - ✓ No eval or dynamic code execution
519
- - ✓ Hook security validation from v0.2 still in place
520
-
521
- **Notes:** Pipeline stages properly delegate to existing security-vetted modules (hooks, agents, prd). No new security concerns introduced.
522
-
523
- ### Reliability: 17/20
524
- - ✓ Comprehensive error handling in pipeline runner (try/catch, stage failures)
525
- - ✓ Proper resource cleanup (no leaked streams, timers, or file handles)
526
- - ✓ Atomic queue file handling from v0.2 maintained
527
- - ✗ **BUG-7:** Verify stage is a no-op (doesn't actually verify anything)
528
- - ✗ **ENH-6:** Inconsistent error handling patterns across stages
529
- - ⚠️ **BUG-8:** Context mutation contract unclear
530
-
531
- **Deductions:** -3 for verify stage gap, -0.5 for inconsistent error patterns, -0.5 for mutation documentation gap.
532
-
533
- ### API Design: 18/20
534
- - ✓ Clean pipeline abstraction with composable stages
535
- - ✓ Well-defined stage interface (PipelineStage with enabled/execute)
536
- - ✓ Discriminated union for StageResult (exhaustiveness checking)
537
- - ✓ Consistent naming conventions (queueCheckStage, routingStage, etc.)
538
- - ✓ Good separation of concerns (each stage has single responsibility)
539
- - ✗ **TYPE-3:** Constitution type inconsistency (string vs ConstitutionResult)
540
- - ✗ **ENH-7:** Missing JSDoc on 60% of pipeline stages
541
-
542
- **Deductions:** -1 for type inconsistency, -1 for documentation gaps.
543
-
544
- ### Code Quality: 16/20
545
- - ✓ Excellent test coverage (constitution: 100%, review: 100%, pipeline: 90%+)
546
- - ✓ No dead code or commented-out blocks
547
- - ✓ Files are appropriately sized (<400 lines for all pipeline stages)
548
- - ✓ Consistent code style (Biome formatting)
549
- - ✗ **STYLE-4:** Magic number inconsistency (token estimation)
550
- - ✗ **STYLE-5:** Use of `any` in classifier LLM response parsing
551
- - ✗ **TYPE-4:** Duplicate logging logic in routing stage
552
- - ✗ **ENH-8:** Missing integration test for full pipeline
553
-
554
- **Deductions:** -2 for missing integration test, -1 for any usage, -1 for magic number inconsistency.
555
-
556
- ### Best Practices: 17/20
557
- - ✓ Follows established v0.2 patterns (hooks, routing, PRD management)
558
- - ✓ Proper use of TypeScript features (discriminated unions, exhaustiveness checks)
559
- - ✓ Clear module boundaries with barrel exports
560
- - ✓ Good abstraction (pipeline runner is framework-agnostic)
561
- - ✗ **ENH-6:** Inconsistent error handling (some stages silent fail, others don't)
562
- - ✗ **ENH-10:** No observability for skipped stages
563
- - ✗ **BUG-8:** Mutation contract unclear
564
-
565
- **Deductions:** -2 for inconsistent patterns, -1 for observability gap.
566
-
567
- ---
568
-
569
- ## Summary
570
-
571
- The v0.3 pipeline refactor is a **strong architectural improvement** that successfully decomposes the monolithic runner into composable, testable stages. The new modules (constitution, analyze, review) are well-designed with excellent test coverage and proper integration.
572
-
573
- **Critical gap:** The verify stage is currently a placeholder (BUG-7). This must be implemented before v0.3 ships, as it's a core part of the quality gate.
574
-
575
- **Recommended path forward:**
576
- 1. **Immediate (P0):** Implement verify stage with test execution
577
- 2. **Before v0.3 release (P1):** Add pipeline stage JSDoc and standardize error handling
578
- 3. **Post-v0.3 (P2-P4):** Address type inconsistencies, add integration tests, improve observability
579
-
580
- **Grade justification:**
581
- - Security: Excellent (20/20)
582
- - Reliability: Very good, one critical gap (17/20)
583
- - API Design: Very good, minor documentation gap (18/20)
584
- - Code Quality: Good, missing integration tests (16/20)
585
- - Best Practices: Good, inconsistent patterns (17/20)
586
-
587
- **Total: 88/100 (A-)**
588
-
589
- With BUG-7 fixed and ENH-6/ENH-7 addressed, this would easily achieve an **A (90+)**.
@@ -1,86 +0,0 @@
1
- # v0.4 Implementation Plan: Acceptance Validation
2
- **Date:** 2026-02-17
3
- **Branch:** master
4
-
5
- ## Complexity Assessment
6
- - **Files touched:** 8+ (new module + pipeline stage + analyze integration + config + CLI + tests)
7
- - **LOC:** ~400-600 new
8
- - **Architectural impact:** New pipeline stage, new analyze output, new retry loop in runner
9
- - **Test strategy:** test-after (internal modules, not public API)
10
-
11
- ## Phase 1: Acceptance test generator
12
- ### 1a: Acceptance module
13
- **File:** `src/acceptance/generator.ts` (NEW)
14
- - Parse spec.md acceptance criteria (extract AC-N lines)
15
- - Build LLM prompt: ACs + codebase context → test file
16
- - Parse LLM response → write `acceptance.test.ts`
17
- - Fallback: generate skeleton tests with TODO if LLM fails
18
-
19
- ### 1b: Integration with analyze
20
- **File:** `src/cli/analyze.ts`
21
- - After decompose, call acceptance test generator
22
- - Write tests to `ngent/features/<name>/acceptance.test.ts`
23
- - Config check: `acceptance.generateTests`
24
-
25
- ### 1c: Config schema update
26
- **File:** `src/config/schema.ts`
27
- - Add `acceptance` config block: `enabled`, `maxRetries`, `generateTests`, `testPath`
28
-
29
- ### Tests
30
- - AC parser extracts criteria from spec markdown
31
- - Generator produces valid test structure
32
- - Config validation
33
-
34
- **Commit:** `feat(acceptance): generate acceptance tests from spec ACs`
35
-
36
- ## Phase 2: Acceptance pipeline stage
37
- ### 2a: Acceptance stage
38
- **File:** `src/pipeline/stages/acceptance.ts` (NEW)
39
- - Only runs when all stories are complete (check prd status)
40
- - Spawns `bun test acceptance.test.ts` in workdir
41
- - Parses test output: which ACs passed/failed
42
- - Returns `continue` if all pass, `fail` with details if any fail
43
-
44
- ### 2b: Register in default pipeline
45
- **File:** `src/pipeline/stages/index.ts`
46
- - Add `acceptanceStage` after `completionStage`
47
-
48
- ### Tests
49
- - Stage skips when stories still pending
50
- - Stage runs and parses test results
51
- - Pass/fail detection
52
-
53
- **Commit:** `feat(acceptance): add acceptance validation pipeline stage`
54
-
55
- ## Phase 3: Self-correcting fix loop
56
- ### 3a: Fix story generator
57
- **File:** `src/acceptance/fix-generator.ts` (NEW)
58
- - Input: failed ACs + test output + related stories + source code
59
- - LLM call: generate fix story descriptions
60
- - Output: FixStory objects with id, title, relatedStories, description
61
-
62
- ### 3b: Fix loop in runner
63
- **File:** `src/execution/runner.ts`
64
- - After acceptance stage fails: generate fix stories, append to prd
65
- - Re-run pipeline for fix stories only
66
- - Re-run acceptance tests
67
- - Max `config.acceptance.maxRetries` loops
68
- - If still failing: pause and report to human
69
-
70
- ### 3c: Accept override command
71
- **File:** `src/cli/accept.ts` (NEW)
72
- - `ngent accept --override AC-2 "reason"`
73
- - Stores in prd.json `acceptanceOverrides`
74
- - Acceptance stage skips overridden ACs
75
-
76
- ### Tests
77
- - Fix story generation from failed ACs
78
- - Retry loop respects maxRetries
79
- - Override skips specified ACs
80
- - Full integration: fail → fix → pass
81
-
82
- **Commit:** `feat(acceptance): add self-correcting fix loop with human override`
83
-
84
- ## Test Strategy
85
- - Mode: test-after
86
- - Run `bun test && bun run typecheck` after each phase