@nathapp/nax 0.50.3 → 0.51.2

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 (353) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +177 -104
  3. package/dist/nax.js +417 -213
  4. package/package.json +1 -3
  5. package/bin/nax.ts +0 -1195
  6. package/src/acceptance/fix-generator.ts +0 -322
  7. package/src/acceptance/generator.ts +0 -415
  8. package/src/acceptance/index.ts +0 -42
  9. package/src/acceptance/refinement.ts +0 -224
  10. package/src/acceptance/templates/cli.ts +0 -47
  11. package/src/acceptance/templates/component.ts +0 -78
  12. package/src/acceptance/templates/e2e.ts +0 -43
  13. package/src/acceptance/templates/index.ts +0 -21
  14. package/src/acceptance/templates/snapshot.ts +0 -50
  15. package/src/acceptance/templates/unit.ts +0 -48
  16. package/src/acceptance/types.ts +0 -138
  17. package/src/agents/acp/adapter.ts +0 -888
  18. package/src/agents/acp/cost.ts +0 -9
  19. package/src/agents/acp/index.ts +0 -7
  20. package/src/agents/acp/interaction-bridge.ts +0 -126
  21. package/src/agents/acp/parser.ts +0 -119
  22. package/src/agents/acp/spawn-client.ts +0 -373
  23. package/src/agents/acp/types.ts +0 -22
  24. package/src/agents/aider/adapter.ts +0 -135
  25. package/src/agents/claude/adapter.ts +0 -258
  26. package/src/agents/claude/complete.ts +0 -80
  27. package/src/agents/claude/cost.ts +0 -16
  28. package/src/agents/claude/execution.ts +0 -215
  29. package/src/agents/claude/index.ts +0 -3
  30. package/src/agents/claude/interactive.ts +0 -77
  31. package/src/agents/claude/plan.ts +0 -179
  32. package/src/agents/codex/adapter.ts +0 -153
  33. package/src/agents/cost/calculate.ts +0 -154
  34. package/src/agents/cost/index.ts +0 -10
  35. package/src/agents/cost/parse.ts +0 -97
  36. package/src/agents/cost/pricing.ts +0 -59
  37. package/src/agents/cost/types.ts +0 -45
  38. package/src/agents/gemini/adapter.ts +0 -177
  39. package/src/agents/index.ts +0 -18
  40. package/src/agents/opencode/adapter.ts +0 -106
  41. package/src/agents/registry.ts +0 -136
  42. package/src/agents/shared/decompose.ts +0 -154
  43. package/src/agents/shared/model-resolution.ts +0 -43
  44. package/src/agents/shared/types-extended.ts +0 -164
  45. package/src/agents/shared/validation.ts +0 -69
  46. package/src/agents/shared/version-detection.ts +0 -109
  47. package/src/agents/types.ts +0 -205
  48. package/src/analyze/classifier.ts +0 -282
  49. package/src/analyze/index.ts +0 -16
  50. package/src/analyze/scanner.ts +0 -171
  51. package/src/analyze/types.ts +0 -51
  52. package/src/cli/accept.ts +0 -108
  53. package/src/cli/agents.ts +0 -87
  54. package/src/cli/analyze-parser.ts +0 -291
  55. package/src/cli/analyze.ts +0 -352
  56. package/src/cli/config-descriptions.ts +0 -219
  57. package/src/cli/config-diff.ts +0 -103
  58. package/src/cli/config-display.ts +0 -285
  59. package/src/cli/config-get.ts +0 -55
  60. package/src/cli/config.ts +0 -14
  61. package/src/cli/constitution.ts +0 -17
  62. package/src/cli/diagnose-analysis.ts +0 -159
  63. package/src/cli/diagnose-formatter.ts +0 -87
  64. package/src/cli/diagnose.ts +0 -203
  65. package/src/cli/generate.ts +0 -250
  66. package/src/cli/index.ts +0 -42
  67. package/src/cli/init-context.ts +0 -405
  68. package/src/cli/init-detect.ts +0 -303
  69. package/src/cli/init.ts +0 -296
  70. package/src/cli/interact.ts +0 -295
  71. package/src/cli/plan.ts +0 -509
  72. package/src/cli/plugins.ts +0 -122
  73. package/src/cli/prompts-export.ts +0 -58
  74. package/src/cli/prompts-init.ts +0 -200
  75. package/src/cli/prompts-main.ts +0 -183
  76. package/src/cli/prompts-shared.ts +0 -70
  77. package/src/cli/prompts-tdd.ts +0 -88
  78. package/src/cli/prompts.ts +0 -17
  79. package/src/cli/runs.ts +0 -174
  80. package/src/cli/status-cost.ts +0 -151
  81. package/src/cli/status-features.ts +0 -405
  82. package/src/cli/status.ts +0 -13
  83. package/src/commands/common.ts +0 -171
  84. package/src/commands/diagnose.ts +0 -17
  85. package/src/commands/index.ts +0 -9
  86. package/src/commands/logs-formatter.ts +0 -201
  87. package/src/commands/logs-reader.ts +0 -171
  88. package/src/commands/logs.ts +0 -103
  89. package/src/commands/precheck.ts +0 -86
  90. package/src/commands/runs.ts +0 -220
  91. package/src/commands/unlock.ts +0 -96
  92. package/src/config/defaults.ts +0 -218
  93. package/src/config/index.ts +0 -22
  94. package/src/config/loader.ts +0 -143
  95. package/src/config/merge.ts +0 -106
  96. package/src/config/merger.ts +0 -147
  97. package/src/config/path-security.ts +0 -121
  98. package/src/config/paths.ts +0 -27
  99. package/src/config/permissions.ts +0 -63
  100. package/src/config/runtime-types.ts +0 -522
  101. package/src/config/schema-types.ts +0 -53
  102. package/src/config/schema.ts +0 -60
  103. package/src/config/schemas.ts +0 -426
  104. package/src/config/test-strategy.ts +0 -71
  105. package/src/config/types.ts +0 -57
  106. package/src/config/validate.ts +0 -103
  107. package/src/constitution/generator.ts +0 -158
  108. package/src/constitution/generators/aider.ts +0 -41
  109. package/src/constitution/generators/claude.ts +0 -35
  110. package/src/constitution/generators/cursor.ts +0 -36
  111. package/src/constitution/generators/opencode.ts +0 -38
  112. package/src/constitution/generators/types.ts +0 -33
  113. package/src/constitution/generators/windsurf.ts +0 -36
  114. package/src/constitution/index.ts +0 -11
  115. package/src/constitution/loader.ts +0 -121
  116. package/src/constitution/types.ts +0 -31
  117. package/src/context/auto-detect.ts +0 -228
  118. package/src/context/builder.ts +0 -299
  119. package/src/context/elements.ts +0 -122
  120. package/src/context/formatter.ts +0 -107
  121. package/src/context/generator.ts +0 -343
  122. package/src/context/generators/aider.ts +0 -34
  123. package/src/context/generators/claude.ts +0 -28
  124. package/src/context/generators/codex.ts +0 -28
  125. package/src/context/generators/cursor.ts +0 -28
  126. package/src/context/generators/gemini.ts +0 -28
  127. package/src/context/generators/opencode.ts +0 -30
  128. package/src/context/generators/windsurf.ts +0 -28
  129. package/src/context/greenfield.ts +0 -114
  130. package/src/context/index.ts +0 -34
  131. package/src/context/injector.ts +0 -279
  132. package/src/context/parent-context.ts +0 -39
  133. package/src/context/test-scanner.ts +0 -370
  134. package/src/context/types.ts +0 -98
  135. package/src/decompose/apply.ts +0 -50
  136. package/src/decompose/builder.ts +0 -181
  137. package/src/decompose/index.ts +0 -8
  138. package/src/decompose/sections/codebase.ts +0 -26
  139. package/src/decompose/sections/constraints.ts +0 -32
  140. package/src/decompose/sections/index.ts +0 -4
  141. package/src/decompose/sections/sibling-stories.ts +0 -25
  142. package/src/decompose/sections/target-story.ts +0 -31
  143. package/src/decompose/types.ts +0 -55
  144. package/src/decompose/validators/complexity.ts +0 -45
  145. package/src/decompose/validators/coverage.ts +0 -134
  146. package/src/decompose/validators/dependency.ts +0 -91
  147. package/src/decompose/validators/index.ts +0 -35
  148. package/src/decompose/validators/overlap.ts +0 -128
  149. package/src/errors.ts +0 -67
  150. package/src/execution/batching.ts +0 -157
  151. package/src/execution/crash-heartbeat.ts +0 -77
  152. package/src/execution/crash-recovery.ts +0 -79
  153. package/src/execution/crash-signals.ts +0 -165
  154. package/src/execution/crash-writer.ts +0 -154
  155. package/src/execution/deferred-review.ts +0 -105
  156. package/src/execution/dry-run.ts +0 -81
  157. package/src/execution/escalation/escalation.ts +0 -46
  158. package/src/execution/escalation/index.ts +0 -13
  159. package/src/execution/escalation/tier-escalation.ts +0 -346
  160. package/src/execution/escalation/tier-outcome.ts +0 -143
  161. package/src/execution/executor-types.ts +0 -73
  162. package/src/execution/helpers.ts +0 -38
  163. package/src/execution/index.ts +0 -27
  164. package/src/execution/iteration-runner.ts +0 -160
  165. package/src/execution/lifecycle/acceptance-loop.ts +0 -309
  166. package/src/execution/lifecycle/headless-formatter.ts +0 -83
  167. package/src/execution/lifecycle/index.ts +0 -11
  168. package/src/execution/lifecycle/parallel-lifecycle.ts +0 -101
  169. package/src/execution/lifecycle/precheck-runner.ts +0 -140
  170. package/src/execution/lifecycle/run-cleanup.ts +0 -81
  171. package/src/execution/lifecycle/run-completion.ts +0 -247
  172. package/src/execution/lifecycle/run-initialization.ts +0 -187
  173. package/src/execution/lifecycle/run-regression.ts +0 -305
  174. package/src/execution/lifecycle/run-setup.ts +0 -240
  175. package/src/execution/lifecycle/story-size-prompts.ts +0 -123
  176. package/src/execution/lock.ts +0 -129
  177. package/src/execution/parallel-coordinator.ts +0 -281
  178. package/src/execution/parallel-executor-rectification-pass.ts +0 -117
  179. package/src/execution/parallel-executor-rectify.ts +0 -136
  180. package/src/execution/parallel-executor.ts +0 -330
  181. package/src/execution/parallel-worker.ts +0 -149
  182. package/src/execution/parallel.ts +0 -13
  183. package/src/execution/pid-registry.ts +0 -275
  184. package/src/execution/pipeline-result-handler.ts +0 -221
  185. package/src/execution/progress.ts +0 -27
  186. package/src/execution/queue-handler.ts +0 -109
  187. package/src/execution/runner-completion.ts +0 -171
  188. package/src/execution/runner-execution.ts +0 -243
  189. package/src/execution/runner-setup.ts +0 -86
  190. package/src/execution/runner.ts +0 -265
  191. package/src/execution/sequential-executor.ts +0 -219
  192. package/src/execution/status-file.ts +0 -264
  193. package/src/execution/status-writer.ts +0 -181
  194. package/src/execution/story-context.ts +0 -266
  195. package/src/execution/story-selector.ts +0 -76
  196. package/src/execution/test-output-parser.ts +0 -14
  197. package/src/execution/timeout-handler.ts +0 -100
  198. package/src/hooks/index.ts +0 -2
  199. package/src/hooks/runner.ts +0 -280
  200. package/src/hooks/types.ts +0 -79
  201. package/src/interaction/chain.ts +0 -170
  202. package/src/interaction/index.ts +0 -61
  203. package/src/interaction/init.ts +0 -84
  204. package/src/interaction/plugins/auto.ts +0 -243
  205. package/src/interaction/plugins/cli.ts +0 -300
  206. package/src/interaction/plugins/telegram.ts +0 -384
  207. package/src/interaction/plugins/webhook.ts +0 -286
  208. package/src/interaction/state.ts +0 -171
  209. package/src/interaction/triggers.ts +0 -250
  210. package/src/interaction/types.ts +0 -170
  211. package/src/logger/formatters.ts +0 -84
  212. package/src/logger/index.ts +0 -16
  213. package/src/logger/logger.ts +0 -296
  214. package/src/logger/types.ts +0 -48
  215. package/src/logging/formatter.ts +0 -355
  216. package/src/logging/index.ts +0 -22
  217. package/src/logging/types.ts +0 -93
  218. package/src/metrics/aggregator.ts +0 -191
  219. package/src/metrics/index.ts +0 -14
  220. package/src/metrics/tracker.ts +0 -200
  221. package/src/metrics/types.ts +0 -115
  222. package/src/optimizer/index.ts +0 -63
  223. package/src/optimizer/noop.optimizer.ts +0 -24
  224. package/src/optimizer/rule-based.optimizer.ts +0 -248
  225. package/src/optimizer/types.ts +0 -53
  226. package/src/pipeline/event-bus.ts +0 -297
  227. package/src/pipeline/events.ts +0 -130
  228. package/src/pipeline/index.ts +0 -19
  229. package/src/pipeline/runner.ts +0 -149
  230. package/src/pipeline/stages/acceptance-setup.ts +0 -144
  231. package/src/pipeline/stages/acceptance.ts +0 -215
  232. package/src/pipeline/stages/autofix.ts +0 -262
  233. package/src/pipeline/stages/completion.ts +0 -110
  234. package/src/pipeline/stages/constitution.ts +0 -63
  235. package/src/pipeline/stages/context.ts +0 -122
  236. package/src/pipeline/stages/execution.ts +0 -359
  237. package/src/pipeline/stages/index.ts +0 -86
  238. package/src/pipeline/stages/optimizer.ts +0 -74
  239. package/src/pipeline/stages/prompt.ts +0 -79
  240. package/src/pipeline/stages/queue-check.ts +0 -103
  241. package/src/pipeline/stages/rectify.ts +0 -101
  242. package/src/pipeline/stages/regression.ts +0 -99
  243. package/src/pipeline/stages/review.ts +0 -94
  244. package/src/pipeline/stages/routing.ts +0 -276
  245. package/src/pipeline/stages/verify.ts +0 -286
  246. package/src/pipeline/subscribers/events-writer.ts +0 -135
  247. package/src/pipeline/subscribers/hooks.ts +0 -179
  248. package/src/pipeline/subscribers/interaction.ts +0 -103
  249. package/src/pipeline/subscribers/registry.ts +0 -73
  250. package/src/pipeline/subscribers/reporters.ts +0 -174
  251. package/src/pipeline/types.ts +0 -220
  252. package/src/plugins/extensions.ts +0 -225
  253. package/src/plugins/index.ts +0 -33
  254. package/src/plugins/loader.ts +0 -352
  255. package/src/plugins/plugin-logger.ts +0 -41
  256. package/src/plugins/registry.ts +0 -168
  257. package/src/plugins/types.ts +0 -206
  258. package/src/plugins/validator.ts +0 -352
  259. package/src/prd/index.ts +0 -220
  260. package/src/prd/schema.ts +0 -268
  261. package/src/prd/types.ts +0 -273
  262. package/src/prd/validate.ts +0 -41
  263. package/src/precheck/checks-agents.ts +0 -63
  264. package/src/precheck/checks-blockers.ts +0 -23
  265. package/src/precheck/checks-cli.ts +0 -68
  266. package/src/precheck/checks-config.ts +0 -102
  267. package/src/precheck/checks-git.ts +0 -117
  268. package/src/precheck/checks-system.ts +0 -101
  269. package/src/precheck/checks-warnings.ts +0 -221
  270. package/src/precheck/checks.ts +0 -36
  271. package/src/precheck/index.ts +0 -374
  272. package/src/precheck/story-size-gate.ts +0 -144
  273. package/src/precheck/types.ts +0 -31
  274. package/src/prompts/builder.ts +0 -166
  275. package/src/prompts/index.ts +0 -2
  276. package/src/prompts/loader.ts +0 -43
  277. package/src/prompts/sections/conventions.ts +0 -19
  278. package/src/prompts/sections/hermetic.ts +0 -41
  279. package/src/prompts/sections/index.ts +0 -12
  280. package/src/prompts/sections/isolation.ts +0 -70
  281. package/src/prompts/sections/role-task.ts +0 -182
  282. package/src/prompts/sections/story.ts +0 -55
  283. package/src/prompts/sections/verdict.ts +0 -70
  284. package/src/prompts/types.ts +0 -21
  285. package/src/queue/index.ts +0 -2
  286. package/src/queue/manager.ts +0 -254
  287. package/src/queue/types.ts +0 -54
  288. package/src/review/index.ts +0 -8
  289. package/src/review/orchestrator.ts +0 -154
  290. package/src/review/runner.ts +0 -303
  291. package/src/review/types.ts +0 -70
  292. package/src/routing/batch-route.ts +0 -35
  293. package/src/routing/builder.ts +0 -81
  294. package/src/routing/chain.ts +0 -75
  295. package/src/routing/content-hash.ts +0 -25
  296. package/src/routing/index.ts +0 -20
  297. package/src/routing/loader.ts +0 -62
  298. package/src/routing/router.ts +0 -305
  299. package/src/routing/strategies/adaptive.ts +0 -215
  300. package/src/routing/strategies/index.ts +0 -8
  301. package/src/routing/strategies/keyword.ts +0 -180
  302. package/src/routing/strategies/llm-prompts.ts +0 -224
  303. package/src/routing/strategies/llm.ts +0 -320
  304. package/src/routing/strategies/manual.ts +0 -50
  305. package/src/routing/strategy.ts +0 -102
  306. package/src/tdd/cleanup.ts +0 -120
  307. package/src/tdd/index.ts +0 -22
  308. package/src/tdd/isolation.ts +0 -117
  309. package/src/tdd/orchestrator.ts +0 -406
  310. package/src/tdd/prompts.ts +0 -40
  311. package/src/tdd/rectification-gate.ts +0 -274
  312. package/src/tdd/session-runner.ts +0 -263
  313. package/src/tdd/types.ts +0 -84
  314. package/src/tdd/verdict-reader.ts +0 -266
  315. package/src/tdd/verdict.ts +0 -152
  316. package/src/tui/App.tsx +0 -265
  317. package/src/tui/components/AgentPanel.tsx +0 -75
  318. package/src/tui/components/CostOverlay.tsx +0 -118
  319. package/src/tui/components/HelpOverlay.tsx +0 -107
  320. package/src/tui/components/StatusBar.tsx +0 -63
  321. package/src/tui/components/StoriesPanel.tsx +0 -177
  322. package/src/tui/hooks/useKeyboard.ts +0 -142
  323. package/src/tui/hooks/useLayout.ts +0 -137
  324. package/src/tui/hooks/usePipelineEvents.ts +0 -183
  325. package/src/tui/hooks/usePty.ts +0 -189
  326. package/src/tui/index.tsx +0 -38
  327. package/src/tui/types.ts +0 -76
  328. package/src/utils/errors.ts +0 -12
  329. package/src/utils/git.ts +0 -245
  330. package/src/utils/json-file.ts +0 -72
  331. package/src/utils/log-test-output.ts +0 -25
  332. package/src/utils/path-security.ts +0 -73
  333. package/src/utils/queue-writer.ts +0 -54
  334. package/src/verification/crash-detector.ts +0 -34
  335. package/src/verification/executor.ts +0 -250
  336. package/src/verification/index.ts +0 -12
  337. package/src/verification/orchestrator-types.ts +0 -154
  338. package/src/verification/orchestrator.ts +0 -76
  339. package/src/verification/parser.ts +0 -220
  340. package/src/verification/rectification-loop.ts +0 -172
  341. package/src/verification/rectification.ts +0 -108
  342. package/src/verification/runners.ts +0 -129
  343. package/src/verification/smart-runner.ts +0 -307
  344. package/src/verification/strategies/acceptance.ts +0 -136
  345. package/src/verification/strategies/regression.ts +0 -90
  346. package/src/verification/strategies/scoped.ts +0 -154
  347. package/src/verification/types.ts +0 -117
  348. package/src/version.ts +0 -40
  349. package/src/worktree/dispatcher.ts +0 -6
  350. package/src/worktree/index.ts +0 -2
  351. package/src/worktree/manager.ts +0 -193
  352. package/src/worktree/merge.ts +0 -302
  353. package/src/worktree/types.ts +0 -4
package/CHANGELOG.md CHANGED
@@ -5,6 +5,36 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.51.0] - 2026-03-21
9
+
10
+ ### Added
11
+
12
+ - **STRAT-001: `no-test` strategy** — New test strategy for stories with zero behavioral change (config, docs, CI/build files, dependency bumps, pure refactors). Requires `noTestJustification` field at every assignment point (plan prompt, LLM routing, batch routing) to prevent lazy test-skipping. `no-test` stories use an implement-only prompt (no RED/GREEN/REFACTOR), are exempt from greenfield override (BUG-010) and test-after escalation (S5), and batch separately from tested stories.
13
+ - **DIR-001: Rename `nax/` → `.nax/`** — Project-level config directory now uses hidden dot-prefix convention (like `.git/`, `.claude/`). `PROJECT_NAX_DIR = ".nax"` SSOT constant in `src/config/paths.ts`. Package configs moved from `<pkg>/nax/config.json` to `.nax/packages/<pkg>/config.json`. 93 files updated.
14
+ - **BUG-073: Acceptance fix story quality** — Fix stories now include acceptance test file path, truncated failure output, and "fix implementation not tests" instruction. Batched by related stories (cap 8) instead of 1-per-AC. Fix stories inherit `workdir` from related story. `>80%` AC failure triggers test regeneration instead of fix stories.
15
+ - **BUG-073: Acceptance staleness detection** — SHA-256 fingerprint of AC set stored in `acceptance-meta.json`. Acceptance test auto-regenerates (with `.bak` backup) when stories are added/removed/modified.
16
+
17
+ ### Fixed
18
+
19
+ - **fix(acceptance):** Correct `__dirname` depth in generator prompt — test file is exactly 3 `../` levels from root, not 4.
20
+ - **fix(acceptance):** Acceptance tests always run from repo root — covers both single repo and monorepo. Test uses `__dirname`-based paths into packages.
21
+ - **fix(acceptance):** Fix stories use per-package config for review/verify stages when `story.workdir` is set.
22
+ - **fix(review):** Fallback to `quality.commands` when `review.commands` not configured — prevents routing failures in monorepo packages.
23
+ - **fix(review):** Use optional chaining for `quality?.commands` — avoids crash when config has no quality section.
24
+ - **fix(pkg):** Remove `src/` and `bin/` from npm `files` — only `dist/` published. 354 files / 4.7MB → 5 files / 3.1MB.
25
+
26
+ ### Refactored
27
+
28
+ - **refactor(test):** Add `withDepsRestore` helper in `test/helpers/deps.ts` — eliminates save/restore boilerplate across 13 test files (−98 net lines).
29
+
30
+ ### Migration
31
+
32
+ - Rename your project's `nax/` directory to `.nax/`
33
+ - For monorepo: move `<pkg>/nax/config.json` → `.nax/packages/<pkg>/config.json`
34
+ - Update `.gitignore` patterns: `nax/**/runs/` → `.nax/**/runs/`, etc.
35
+
36
+ ---
37
+
8
38
  ## [0.50.0] - 2026-03-19
9
39
 
10
40
  ### Added
package/README.md CHANGED
@@ -33,15 +33,20 @@ nax run -f my-feature --plan --from spec.md
33
33
  ## How It Works
34
34
 
35
35
  ```
36
- analyze → route → execute → verify → (loop until all stories pass) → regression gate
36
+ (plan) acceptance setup → route → execute → verify → (escalate) → regression gate → acceptance
37
37
  ```
38
38
 
39
- 1. **Analyze** each user story classify complexity, select test strategy
40
- 2. **Route** to the right model tier (cheap standard premium)
41
- 3. **Execute** an agent session (Claude Code by default)
42
- 4. **Verify** tests pass; escalate model tier on failure
43
- 5. **Loop** until all stories are complete or a cost/iteration limit is hit
44
- 6. **Regression gate** — deferred full-suite verification after all stories pass
39
+ 1. **Plan** *(optional)* `nax run --plan` generates a `prd.json` from a spec file using an LLM
40
+ 2. **Acceptance setup** *(pre-run)* generate acceptance tests and assert RED (tests must fail before implementation)
41
+ 3. **Route** classify story complexity and select model tier (fast balanced → powerful)
42
+ 4. **Context** gather relevant code, tests, and project standards
43
+ 5. **Execute** run an agent session (Claude Code, Codex, Gemini CLI, or ACP)
44
+ 6. **Verify** — run scoped tests; if failing, **rectify** before escalating
45
+ 7. **Review** — lint + typecheck; if failing, **autofix** before escalating
46
+ 8. **Escalate** — on repeated failure, retry with a higher model tier
47
+ 9. **Loop** — repeat steps 3–8 per story until all pass or a cost/iteration limit is hit
48
+ 10. **Regression gate** — deferred full-suite run after all stories pass
49
+ 11. **Acceptance** *(post-run)* — run the generated acceptance tests against the completed feature
45
50
 
46
51
  ---
47
52
 
@@ -49,7 +54,7 @@ analyze → route → execute → verify → (loop until all stories pass) → r
49
54
 
50
55
  ### `nax init`
51
56
 
52
- Initialize nax in your project. Creates the `nax/` folder structure.
57
+ Initialize nax in your project. Creates the `.nax/` folder structure.
53
58
 
54
59
  ```bash
55
60
  nax init
@@ -57,7 +62,7 @@ nax init
57
62
 
58
63
  Creates:
59
64
  ```
60
- nax/
65
+ .nax/
61
66
  ├── config.json # Project-level config
62
67
  └── features/ # One folder per feature
63
68
  ```
@@ -68,7 +73,7 @@ nax/
68
73
  nax init --package packages/api
69
74
  ```
70
75
 
71
- Creates `packages/api/nax/context.md` for per-package agent context.
76
+ Creates `.nax/mono/packages/api/context.md` for per-package agent context.
72
77
 
73
78
  ---
74
79
 
@@ -80,7 +85,7 @@ Scaffold a new feature.
80
85
  nax features create user-auth
81
86
  ```
82
87
 
83
- Creates `nax/features/user-auth/prd.json` — edit this file to define your user stories.
88
+ Creates `.nax/features/user-auth/spec.md` — fill in the overview, user stories, and acceptance criteria, then run `nax plan` to generate `prd.json`.
84
89
 
85
90
  ### `nax features list`
86
91
 
@@ -135,7 +140,7 @@ nax run -f my-feature
135
140
  | Flag | Description |
136
141
  |:-----|:------------|
137
142
  | `-f, --feature <name>` | Feature name |
138
- | `-a, --agent <name>` | Force a specific agent (`claude`, `opencode`, `codex`, etc.) |
143
+ | `-a, --agent <name>` | Force a specific agent (`claude`, `opencode`, `codex`, etc.). Only applies when `agent.protocol = "cli"` — ignored when using ACP protocol. |
139
144
  | `--plan` | Run plan phase first (requires `--from`) |
140
145
  | `--from <spec-path>` | Spec file for `--plan` |
141
146
  | `--one-shot` | Skip interactive Q&A during planning (ACP only) |
@@ -201,21 +206,28 @@ nax status -f my-feature
201
206
 
202
207
  ---
203
208
 
204
- ### `nax logs -f <name>`
209
+ ### `nax logs`
205
210
 
206
- Stream logs from the current or last run.
211
+ Stream logs from the current or last run. Run from your project directory.
207
212
 
208
213
  ```bash
209
- nax logs -f my-feature
214
+ # List all recorded runs
215
+ nax logs --list
210
216
 
211
- # Follow in real-time
212
- nax logs -f my-feature --follow
217
+ # Follow current run in real-time
218
+ nax logs --follow
213
219
 
214
220
  # Filter by story
215
- nax logs -f my-feature --story US-003
221
+ nax logs --story US-003
216
222
 
217
- # Filter by level
218
- nax logs -f my-feature --level error
223
+ # Filter by log level
224
+ nax logs --level error
225
+
226
+ # Select a specific run by ID
227
+ nax logs --run <runId>
228
+
229
+ # Raw JSONL output (for scripting)
230
+ nax logs --json
219
231
  ```
220
232
 
221
233
  ---
@@ -255,7 +267,7 @@ Output sections:
255
267
 
256
268
  ### `nax generate`
257
269
 
258
- Generate agent config files from `nax/context.md`. Supports Claude Code, OpenCode, Codex, Cursor, Windsurf, Aider, and Gemini.
270
+ Generate agent config files from `.nax/context.md`. Supports Claude Code, OpenCode, Codex, Cursor, Windsurf, Aider, and Gemini.
259
271
 
260
272
  ```bash
261
273
  nax generate
@@ -265,7 +277,7 @@ nax generate
265
277
 
266
278
  | Flag | Description |
267
279
  |:-----|:------------|
268
- | `-c, --context <path>` | Context file path (default: `nax/context.md`) |
280
+ | `-c, --context <path>` | Context file path (default: `.nax/context.md`) |
269
281
  | `-o, --output <dir>` | Output directory (default: project root) |
270
282
  | `-a, --agent <name>` | Generate for a specific agent only (`claude`, `opencode`, `cursor`, `windsurf`, `aider`, `codex`, `gemini`) |
271
283
  | `--dry-run` | Preview without writing files |
@@ -287,7 +299,7 @@ nax generate
287
299
 
288
300
  **Workflow:**
289
301
 
290
- 1. Create `nax/context.md` — describe your project's architecture, conventions, and coding standards
302
+ 1. Create `.nax/context.md` — describe your project's architecture, conventions, and coding standards
291
303
  2. Run `nax generate` — writes agent config files to the project root (and per-package if configured)
292
304
  3. Commit the generated files — your agents will automatically pick them up
293
305
 
@@ -301,7 +313,7 @@ nax generate --package packages/api
301
313
  nax generate --all-packages
302
314
  ```
303
315
 
304
- Each package can have its own `nax/context.md` at `<package>/nax/context.md` for package-specific agent instructions.
316
+ Each package can have its own context file at `.nax/mono/<package>/context.md` for package-specific agent instructions (created via `nax init --package <package>`).
305
317
 
306
318
  ---
307
319
 
@@ -317,7 +329,7 @@ nax prompts -f my-feature
317
329
 
318
330
  | Flag | Description |
319
331
  |:-----|:------------|
320
- | `--init` | Export default role templates to `nax/templates/` for customization |
332
+ | `--init` | Export default role templates to `.nax/templates/` for customization |
321
333
  | `--role <role>` | Show prompt for a specific role (`implementer`, `test-writer`, `verifier`, `tdd-simple`) |
322
334
 
323
335
  After running `--init`, edit the templates and nax will use them automatically via `prompts.overrides` config.
@@ -354,12 +366,19 @@ nax agents
354
366
 
355
367
  ---
356
368
 
357
- ### `nax config --explain`
369
+ ### `nax config`
358
370
 
359
- Display the effective merged configuration with inline explanations for every field.
371
+ Display the effective merged configuration (global + project layers).
360
372
 
361
373
  ```bash
362
- nax config -f my-feature --explain
374
+ # Show merged config
375
+ nax config
376
+
377
+ # Show with field descriptions
378
+ nax config --explain
379
+
380
+ # Show only fields where project overrides global
381
+ nax config --diff
363
382
  ```
364
383
 
365
384
  ---
@@ -371,7 +390,7 @@ Config is layered — project overrides global:
371
390
  | File | Scope |
372
391
  |:-----|:------|
373
392
  | `~/.nax/config.json` | Global (all projects) |
374
- | `nax/config.json` | Project-level override |
393
+ | `.nax/config.json` | Project-level override |
375
394
 
376
395
  **Key options:**
377
396
 
@@ -414,7 +433,7 @@ Review commands (`lint`, `typecheck`) are executed directly via `Bun.spawn` —
414
433
  }
415
434
  ```
416
435
  ```json
417
- // nax/config.json
436
+ // .nax/config.json
418
437
  "quality": {
419
438
  "commands": {
420
439
  "typecheck": "bun run build-and-check"
@@ -442,13 +461,15 @@ Use `testScoped` to define the exact scoped test command with a `{{files}}` plac
442
461
 
443
462
  If `testScoped` is not configured, nax falls back to a heuristic that replaces the last path-like token in the `test` command. **Recommended:** always configure `testScoped` explicitly to avoid surprises.
444
463
 
445
- **TDD strategy options:**
464
+ **TDD strategy options:** <a name="tdd-strategy-options"></a>
446
465
 
447
466
  | Value | Behaviour |
448
467
  |:------|:----------|
449
- | `auto` | nax decides based on complexity and tags |
450
- | `lite` | Prefer `three-session-tdd-lite` for complex stories |
451
- | `strict` | Always use full `three-session-tdd` for complex stories |
468
+ | `auto` | nax decides based on complexity and tags — simple→`tdd-simple`, security/public-api→`three-session-tdd`, else→`three-session-tdd-lite` |
469
+ | `strict` | Always use `three-session-tdd` (strictest all stories) |
470
+ | `lite` | Always use `three-session-tdd-lite` |
471
+ | `simple` | Always use `tdd-simple` (1 session) |
472
+ | `off` | No TDD — tests written after implementation (`test-after`) |
452
473
 
453
474
  ---
454
475
 
@@ -462,12 +483,12 @@ Customize the instructions sent to each agent role for your project's specific n
462
483
 
463
484
  ```bash
464
485
  nax prompts --init # Create default templates
465
- # Edit nax/templates/*.md
486
+ # Edit .nax/templates/*.md
466
487
  nax prompts --export test-writer # Preview a role's prompt
467
488
  nax run -f my-feature # Uses your custom prompts
468
489
  ```
469
490
 
470
- **Full guide:** See [Prompt Customization Guide](docs/prompt-customization.md) for detailed instructions, role reference, and best practices.
491
+ **Full guide:** See [Prompt Customization Guide](docs/guides/prompt-customization.md) for detailed instructions, role reference, and best practices.
471
492
 
472
493
  ---
473
494
 
@@ -477,12 +498,13 @@ nax selects a test strategy per story based on complexity and tags:
477
498
 
478
499
  | Strategy | Sessions | When | Description |
479
500
  |:---------|:---------|:-----|:------------|
480
- | `test-after` | 1 | Refactors, deletions, config, docs | Single session, no TDD discipline |
501
+ | `no-test` | 1 | Config, docs, CI, pure refactors with no behavior change | No tests written or run — requires `noTestJustification` in prd.json |
502
+ | `test-after` | 1 | Refactors, deletions | Single session, tests written after implementation |
481
503
  | `tdd-simple` | 1 | Simple stories | Single session with TDD prompt (red-green-refactor) |
482
504
  | `three-session-tdd-lite` | 3 | Medium stories | Three sessions, relaxed isolation rules |
483
505
  | `three-session-tdd` | 3 | Complex/security stories | Three sessions, strict file isolation |
484
506
 
485
- Configure the default TDD behavior in `nax/config.json`:
507
+ Configure the default TDD behavior in `.nax/config.json`:
486
508
 
487
509
  ```json
488
510
  {
@@ -492,11 +514,7 @@ Configure the default TDD behavior in `nax/config.json`:
492
514
  }
493
515
  ```
494
516
 
495
- | Value | Behaviour |
496
- |:------|:----------|
497
- | `auto` | nax decides based on complexity and tags (default) |
498
- | `lite` | Prefer `three-session-tdd-lite` for complex stories |
499
- | `strict` | Always use full `three-session-tdd` for complex stories |
517
+ See [TDD strategy options](#tdd-strategy-options) for all values.
500
518
 
501
519
  ---
502
520
 
@@ -544,7 +562,7 @@ Configured under `quality.testing` — supports **per-package override** in mono
544
562
 
545
563
  > **Tip:** `externalBoundaries` and `mockGuidance` complement `context.md`. nax provides the rule ("mock all I/O"), while `context.md` provides project-specific knowledge ("use `ioredis-mock` for Redis"). Use both for best results.
546
564
 
547
- > **Monorepo:** Each package can override `quality.testing` in its own `packages/<name>/nax/config.json`. For example, `packages/api` can specify Redis boundaries while `packages/web` specifies HTTP-only.
565
+ > **Monorepo:** Each package can override `quality.testing` in its own `.nax/mono/<package>/config.json`. For example, `packages/api` can specify Redis boundaries while `apps/web` specifies HTTP-only.
548
566
 
549
567
  > **Opt-out:** Set `quality.testing.hermetic: false` if your project requires real integration calls (e.g. live database tests against a local dev container).
550
568
 
@@ -552,34 +570,41 @@ Configured under `quality.testing` — supports **per-package override** in mono
552
570
 
553
571
  ## Story Decomposition
554
572
 
555
- When a story is too large (complex/expert with >6 acceptance criteria), nax can automatically decompose it into smaller sub-stories. This runs during the routing stage.
573
+ Story decomposition is **opt-in** disabled by default. Enable it by adding a `decompose` block to `.nax/config.json`.
556
574
 
557
- **Trigger:** The `story-oversized` interaction trigger fires when a story exceeds the configured thresholds. You can approve decomposition, skip the story, or continue as-is.
558
-
559
- **How it works:**
560
-
561
- 1. The `DecomposeBuilder` constructs a prompt with the target story, sibling stories (to prevent overlap), and codebase context
562
- 2. An LLM generates sub-stories with IDs, titles, descriptions, acceptance criteria, and dependency ordering
563
- 3. Post-decompose validators check:
564
- - **Overlap** — sub-stories must not duplicate scope of existing stories
565
- - **Coverage** — sub-stories must cover all parent acceptance criteria
566
- - **Complexity** — each sub-story must be simpler than the parent
567
- - **Dependencies** — dependency graph must be acyclic with valid references
568
- 4. The parent story is replaced in the PRD with the validated sub-stories
575
+ When enabled, nax checks during the routing stage whether a story is oversized (complex/expert complexity with more ACs than `maxAcceptanceCriteria`). If so, an LLM breaks it into smaller sub-stories and replaces the original in the PRD.
569
576
 
570
577
  **Configuration:**
571
578
 
572
579
  ```json
573
580
  {
574
581
  "decompose": {
575
- "enabled": true,
576
- "maxSubStories": 5,
577
- "minAcceptanceCriteria": 6,
578
- "complexityThreshold": ["complex", "expert"]
582
+ "trigger": "auto",
583
+ "maxAcceptanceCriteria": 6,
584
+ "maxSubstories": 5,
585
+ "maxSubstoryComplexity": "medium",
586
+ "maxRetries": 2,
587
+ "model": "balanced"
579
588
  }
580
589
  }
581
590
  ```
582
591
 
592
+ **Trigger modes:**
593
+
594
+ | Value | Behaviour |
595
+ |:------|:----------|
596
+ | `auto` | Decompose automatically — no confirmation prompt |
597
+ | `confirm` | Show interaction prompt — you approve, skip, or continue as-is |
598
+ | `disabled` | Never decompose — log a warning if story is oversized |
599
+
600
+ > **Note:** `storySizeGate` (under `precheck`) is a separate pre-run guard that warns if stories exceed size limits before execution starts. Decomposition happens during routing, mid-run.
601
+
602
+ **How it works:**
603
+
604
+ 1. An LLM generates sub-stories with IDs, titles, descriptions, acceptance criteria, and dependency ordering
605
+ 2. Post-decompose validators check overlap, coverage, complexity, and dependency ordering
606
+ 3. The parent story is replaced in the PRD with the validated sub-stories
607
+
583
608
  ---
584
609
 
585
610
  ## Regression Gate
@@ -601,8 +626,8 @@ After all stories pass their individual verification, nax can run a deferred ful
601
626
  | Mode | Behaviour |
602
627
  |:-----|:----------|
603
628
  | `disabled` | No regression gate |
604
- | `per-story` | Full suite after each story (expensive) |
605
- | `deferred` | Full suite once after all stories pass (recommended) |
629
+ | `per-story` | Full suite after each story higher cost and slower if stories fail regression |
630
+ | `deferred` | Full suite once after all stories pass (recommended) — **default** |
606
631
 
607
632
  If the regression gate detects failures, nax maps them to the responsible story via git blame and attempts automated rectification. If rectification fails, affected stories are marked as `regression-failed`.
608
633
 
@@ -646,7 +671,9 @@ nax run -f my-feature --parallel 3
646
671
 
647
672
  ## Agents
648
673
 
649
- nax supports multiple coding agents. By default it uses Claude Code via the ACP protocol.
674
+ nax supports multiple coding agents via the [Agent Client Protocol (ACP)](https://github.com/openclaw/acpx). **ACP protocol is recommended** — it provides persistent sessions, structured cost/token reporting, and works with all supported agents.
675
+
676
+ > **CLI protocol** (`agent.protocol: "cli"`) is supported for Claude Code only and is being gradually deprecated in favour of ACP. New projects should use ACP.
650
677
 
651
678
  ```bash
652
679
  # List installed agents and their capabilities
@@ -655,21 +682,16 @@ nax agents
655
682
 
656
683
  **Supported agents:**
657
684
 
658
- | Agent | Protocol | Notes |
659
- |:------|:---------|:------|
660
- | `claude` | ACP (default) | Claude Code via acpx |
661
- | `opencode` | ACP | OpenCode via acpx |
662
- | `codex` | ACP | Codex via acpx |
663
- | `cursor` | ACP | Cursor via acpx |
664
- | `windsurf` | ACP | Windsurf via acpx |
665
- | `aider` | ACP | Aider via acpx |
666
- | `gemini` | ACP | Gemini CLI via acpx |
685
+ | Agent | CLI mode |
686
+ |:------|:---------|
687
+ | `claude` | Stable |
688
+ | All others (`codex`, `gemini`, `opencode`, `cursor`, `copilot`, `kilo`, `qwen`, `kimi`, `iflow`, `droid`, `kiro`, and more) | 🧪 Experimental |
667
689
 
668
- **ACP protocol (default):**
690
+ nax connects to agents via [acpx](https://github.com/openclaw/acpx). All agents run as persistent ACP sessions — nax sends prompts and receives structured JSON-RPC responses including token counts and exact USD cost per session. For the full list of supported agents and their ACP startup commands, see the [acpx agent docs](https://github.com/openclaw/acpx#agents).
669
691
 
670
- nax uses [acpx](https://github.com/nathapp/acpx) as the ACP transport. All agents run as persistent sessions nax sends prompts and receives structured JSON-RPC responses including token counts and exact USD cost per session.
692
+ > **Note:** When `agent.protocol` is set to `"acp"`, the `--agent` CLI flag has no effect all execution routes through the ACP adapter regardless of agent name.
671
693
 
672
- > **Known issue — `acpx` ≤ 0.3.1:** The `--model` flag is not supported. Model selection via `execution.model` or per-package `model` overrides has no effect when using acpx as the ACP transport. This is a limitation in the underlying `@zed-industries/claude-agent-acp` adapter, which ignores runtime model requests and always uses the model configured in Claude Code settings. A fix is being tracked in [openclaw/acpx#49](https://github.com/openclaw/acpx/issues/49). As a workaround, set your preferred model directly in Claude Code settings before running nax.
694
+ > **Known issue — `acpx` ≤ 0.3.1:** The `--model` flag is not supported. Model selection via `execution.model` or per-package `model` overrides has no effect. As a temporary workaround, use the [nathapp-io/acpx](https://github.com/nathapp-io/acpx) fork which adds `--model` support. Upstream fix is tracked in [openclaw/acpx#49](https://github.com/openclaw/acpx/issues/49).
673
695
 
674
696
  **Configuring agents:**
675
697
 
@@ -683,10 +705,11 @@ nax uses [acpx](https://github.com/nathapp/acpx) as the ACP transport. All agent
683
705
  }
684
706
  ```
685
707
 
686
- **Force a specific agent at runtime:**
708
+ **Force a specific agent at runtime (CLI protocol only):**
687
709
 
688
710
  ```bash
689
- nax run -f my-feature --agent opencode
711
+ # Only applies when agent.protocol = "cli" (Claude Code only — other agents experimental)
712
+ nax run -f my-feature --agent claude
690
713
  ```
691
714
 
692
715
  ---
@@ -708,27 +731,27 @@ nax init --package packages/web
708
731
 
709
732
  ### Per-Package Config
710
733
 
711
- Each package can override specific config fields by placing a `nax/config.json` inside the package directory:
734
+ Each package's config and context are stored centrally under the root `.nax/mono/` directory:
712
735
 
713
736
  ```
714
737
  repo-root/
715
- ├── nax/
716
- └── config.json # root config
717
- ├── packages/
718
- ├── api/
719
- │ └── nax/
720
- │ ├── config.json # overrides for api package
721
- │ └── context.md # agent context for api
722
- └── web/
723
- └── nax/
724
- ├── config.json # overrides for web package
725
- └── context.md # agent context for web
738
+ ├── .nax/
739
+ ├── config.json # root config
740
+ │ └── mono/
741
+ ├── packages/
742
+ │ └── api/
743
+ │ ├── config.json # overrides for packages/api
744
+ │ └── context.md # agent context for packages/api
745
+ └── apps/
746
+ └── api/
747
+ ├── config.json # overrides for apps/api
748
+ └── context.md # agent context for apps/api
726
749
  ```
727
750
 
728
751
  **Overridable fields per package:** `execution`, `review`, `acceptance`, `quality`, `context`
729
752
 
730
753
  ```json
731
- // packages/api/nax/config.json
754
+ // .nax/mono/packages/api/config.json
732
755
  {
733
756
  "quality": {
734
757
  "commands": {
@@ -764,7 +787,7 @@ When `nax plan` generates stories for a monorepo, it auto-discovers packages fro
764
787
  - `turbo.json` → `packages` field
765
788
  - `package.json` → `workspaces`
766
789
  - `pnpm-workspace.yaml` → `packages`
767
- - Existing `*/nax/context.md` files
790
+ - Existing `.nax/mono/*/context.md` files
768
791
 
769
792
  ### Generate Agent Files for All Packages
770
793
 
@@ -772,7 +795,7 @@ When `nax plan` generates stories for a monorepo, it auto-discovers packages fro
772
795
  nax generate --all-packages
773
796
  ```
774
797
 
775
- Generates a `CLAUDE.md` (or agent-specific file) in each discovered package directory, using the package's own `nax/context.md` if present.
798
+ Generates a `CLAUDE.md` (or agent-specific file) in each discovered package directory, using the package's own `.nax/mono/<package>/context.md` if present.
776
799
 
777
800
  ---
778
801
 
@@ -780,7 +803,7 @@ Generates a `CLAUDE.md` (or agent-specific file) in each discovered package dire
780
803
 
781
804
  Integrate notifications, CI triggers, or custom scripts via lifecycle hooks.
782
805
 
783
- **Project hooks** (`nax/hooks.json`):
806
+ **Project hooks** (`.nax/hooks.json`):
784
807
 
785
808
  ```json
786
809
  {
@@ -883,7 +906,7 @@ nax can pause execution and prompt you for decisions at critical points. Configu
883
906
  | `max-retries` | 🟡 Yellow | `skip` | Story exhausted all retry attempts — skip and continue? |
884
907
  | `pre-merge` | 🟡 Yellow | `escalate` | Checkpoint before merging to main branch |
885
908
  | `human-review` | 🟡 Yellow | `skip` | Human review required on critical failure |
886
- | `story-oversized` | 🟡 Yellow | `continue` | Story too complex — decompose into sub-stories? |
909
+ | `story-oversized` | 🟡 Yellow | `continue` | Story too complex — decompose into sub-stories? (only fires when `decompose.trigger = "confirm"`) |
887
910
  | `story-ambiguity` | 🟢 Green | `continue` | Story requirements unclear — continue with best effort? |
888
911
  | `review-gate` | 🟢 Green | `continue` | Code review checkpoint before proceeding |
889
912
 
@@ -913,7 +936,7 @@ nax can pause execution and prompt you for decisions at critical points. Configu
913
936
 
914
937
  Extend nax with custom reviewers, reporters, or integrations.
915
938
 
916
- **Project plugins** (`nax/config.json`):
939
+ **Project plugins** (`.nax/config.json`):
917
940
 
918
941
  ```json
919
942
  {
@@ -976,35 +999,85 @@ nax precheck -f my-feature
976
999
 
977
1000
  **Run stopped mid-way**
978
1001
 
979
- nax saves progress in `nax/features/<name>/prd.json`. Re-run with the same command — completed stories are skipped automatically.
1002
+ nax saves progress in `.nax/features/<name>/prd.json`. Re-run with the same command — completed stories are skipped automatically.
980
1003
 
981
1004
  ---
982
1005
 
983
1006
  ## PRD Format
984
1007
 
985
- User stories are defined in `nax/features/<name>/prd.json`:
1008
+ User stories are defined in `.nax/features/<name>/prd.json`. Typically generated by `nax plan` — but you can write it by hand.
986
1009
 
987
1010
  ```json
988
1011
  {
1012
+ "project": "my-app",
989
1013
  "feature": "user-auth",
1014
+ "branchName": "feat/user-auth",
1015
+ "createdAt": "2026-01-01T00:00:00.000Z",
1016
+ "updatedAt": "2026-01-01T00:00:00.000Z",
990
1017
  "userStories": [
991
1018
  {
992
1019
  "id": "US-001",
993
1020
  "title": "Add login endpoint",
994
- "description": "POST /auth/login with email/password",
1021
+ "description": "POST /auth/login accepts email + password, returns signed JWT on success",
995
1022
  "acceptanceCriteria": [
996
- "Returns JWT on success",
997
- "Returns 401 on invalid credentials"
1023
+ "Returns 200 + JWT on valid credentials",
1024
+ "Returns 401 on invalid credentials",
1025
+ "Rate-limits to 5 attempts per minute"
998
1026
  ],
999
- "complexity": "medium",
1000
1027
  "tags": ["auth", "security"],
1001
- "status": "pending"
1028
+ "dependencies": [],
1029
+ "status": "pending",
1030
+ "passes": false,
1031
+ "attempts": 0,
1032
+ "escalations": [],
1033
+ "contextFiles": ["src/auth/types.ts"],
1034
+ "expectedFiles": ["src/auth/login.ts", "test/auth/login.test.ts"]
1035
+ },
1036
+ {
1037
+ "id": "US-002",
1038
+ "title": "Update changelog",
1039
+ "description": "Add v1.0 entry to CHANGELOG.md",
1040
+ "acceptanceCriteria": ["CHANGELOG.md has v1.0 section"],
1041
+ "tags": ["docs"],
1042
+ "dependencies": [],
1043
+ "status": "pending",
1044
+ "passes": false,
1045
+ "attempts": 0,
1046
+ "escalations": [],
1047
+ "routing": {
1048
+ "complexity": "simple",
1049
+ "testStrategy": "no-test",
1050
+ "noTestJustification": "Docs-only change — no executable code",
1051
+ "reasoning": "Pure documentation update"
1052
+ }
1002
1053
  }
1003
1054
  ]
1004
1055
  }
1005
1056
  ```
1006
1057
 
1007
- > **Note:** Use `"status": "passed"` (not `"done"`) to manually mark a story complete.
1058
+ **Key fields:**
1059
+
1060
+ | Field | Required | Description |
1061
+ |:------|:---------|:------------|
1062
+ | `id` | ✅ | Story ID — must be unique (e.g. `US-001`) |
1063
+ | `title` | ✅ | Short story title |
1064
+ | `description` | ✅ | What needs to be built |
1065
+ | `acceptanceCriteria` | ✅ | Testable outcomes — used for acceptance tests |
1066
+ | `tags` | ✅ | Routing hints that influence complexity classification and test strategy selection. Security tags (`auth`, `security`, `jwt`, `oauth`, `rbac`, etc.) and public-API tags (`public-api`, `endpoint`, `sdk`, etc.) force `three-session-tdd`. UI/integration tags (`ui`, `layout`, `cli`, `integration`) prefer `three-session-tdd-lite`. |
1067
+ | `dependencies` | ✅ | Story IDs that must pass before this one runs |
1068
+ | `status` | ✅ | `pending` \| `in-progress` \| `passed` \| `failed` \| `skipped` \| `blocked` \| `paused` |
1069
+ | `passes` | ✅ | `true` once all ACs pass — set by nax, not manually |
1070
+ | `attempts` | ✅ | Retry counter — set by nax |
1071
+ | `escalations` | ✅ | Escalation history — set by nax |
1072
+ | `contextFiles` | optional | Files pre-loaded into agent prompt |
1073
+ | `expectedFiles` | optional | Files that must exist after execution (pre-flight gate) |
1074
+ | `workdir` | optional | Package subdirectory for monorepo stories (e.g. `packages/api`) |
1075
+ | `routing` | optional | Pre-set routing — skip LLM classification if provided |
1076
+ | `routing.testStrategy` | optional | Override test strategy (e.g. `no-test`, `tdd-simple`). Only honored when `routing.contentHash` is absent — omit `contentHash` to prevent the LLM classifier from overriding your manual value. |
1077
+ | `routing.noTestJustification` | required if `no-test` | Explain why no tests are needed |
1078
+ | `storyPoints` | optional | Estimate (default: 1) |
1079
+
1080
+ > **Tip:** Use `"status": "passed"` to manually skip a story that's already done.
1008
1081
 
1009
1082
  ---
1010
1083