@nathapp/nax 0.28.0 → 0.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -2
- package/bin/nax.ts +2 -3
- package/dist/nax.js +72753 -0
- package/package.json +11 -3
- package/src/cli/analyze.ts +2 -7
- package/src/cli/config.ts +3 -1
- package/src/config/defaults.ts +1 -0
- package/src/config/schemas.ts +1 -0
- package/src/config/types.ts +1 -0
- package/src/context/builder.ts +10 -1
- package/src/execution/lifecycle/headless-formatter.ts +2 -4
- package/src/prompts/builder.ts +12 -69
- package/src/prompts/sections/isolation.ts +38 -8
- package/src/prompts/sections/role-task.ts +79 -17
- package/src/review/runner.ts +6 -1
- package/src/version.ts +2 -1
- package/.claude/rules/01-project-conventions.md +0 -34
- package/.claude/rules/02-test-architecture.md +0 -39
- package/.claude/rules/03-test-writing.md +0 -58
- package/.claude/rules/04-forbidden-patterns.md +0 -29
- package/.claude/settings.json +0 -15
- package/.githooks/pre-commit +0 -16
- package/.gitlab-ci.yml +0 -103
- package/.mcp.json +0 -8
- package/BRIEF.md +0 -140
- package/CLAUDE.md +0 -143
- package/US-007-IMPLEMENTATION.md +0 -139
- package/biome.json +0 -14
- package/bun.lock +0 -163
- package/bunfig.toml +0 -12
- package/docker-compose.test.yml +0 -15
- package/docs/20260216-fix-plan-context-review.md +0 -56
- package/docs/20260216-relentless-vs-ngent-comparison.md +0 -208
- package/docs/20260216-v02-plan.md +0 -136
- package/docs/20260216-v02-review.md +0 -685
- package/docs/20260217-dogfood-findings.md +0 -56
- package/docs/20260217-p2-plus-plan.md +0 -117
- package/docs/20260217-partial-fixes-plan.md +0 -62
- package/docs/20260217-plan-analyze-spec.md +0 -117
- package/docs/20260217-post-impl-review.md +0 -1137
- package/docs/20260217-quick-wins-plan.md +0 -66
- package/docs/20260217-split-runner-plan.md +0 -75
- package/docs/20260217-v03-impl-plan.md +0 -80
- package/docs/20260217-v03-post-impl-review.md +0 -589
- package/docs/20260217-v04-impl-plan.md +0 -86
- package/docs/20260217-v05-post-impl-review.md +0 -850
- package/docs/20260217-v06-post-impl-review.md +0 -817
- package/docs/20260218-adr003-port-plan.md +0 -151
- package/docs/20260218-review-adr003-verification.md +0 -175
- package/docs/20260219-fix-plan-bug16-19.md +0 -79
- package/docs/20260219-fix-plan-bug20-22.md +0 -114
- package/docs/20260219-plan-llm-routing.md +0 -116
- package/docs/20260219-review-bug20-22-fixes.md +0 -135
- package/docs/20260219-routing-baseline-keyword.md +0 -63
- package/docs/20260220-plan-structured-logging-p1.md +0 -80
- package/docs/20260220-plan-structured-logging-p2.md +0 -37
- package/docs/20260220-review-llm-routing.md +0 -180
- package/docs/20260220-review-post-fix-llm-routing.md +0 -70
- package/docs/20260221-fix-plan-relevantfiles-split.md +0 -101
- package/docs/20260221-fix-plan-routing-mode.md +0 -125
- package/docs/20260221-review-v0.9-implementation.md +0 -379
- package/docs/20260222-fix-plan-v091-routing-isolation.md +0 -197
- package/docs/20260223-fix-plan-prompt-audit.md +0 -62
- package/docs/20260224-nax-roadmap-phases.md +0 -189
- package/docs/20260225-phase2-llm-service-layer.md +0 -401
- package/docs/20260225-review-v0.10.1.md +0 -187
- package/docs/20260303-v010-implementation-plan.md +0 -165
- package/docs/20260304-review-nax.md +0 -492
- package/docs/CLAUDE.md.bak +0 -191
- package/docs/ROADMAP.md +0 -390
- package/docs/SPEC-rectification.md +0 -0
- package/docs/SPEC.md +0 -324
- package/docs/US-001-plugin-loading-verification.md +0 -152
- package/docs/adr/ADR-005-implementation-plan.md +0 -655
- package/docs/adr/ADR-005-pipeline-re-architecture.md +0 -464
- package/docs/architecture-analysis.md +0 -1076
- package/docs/bugs/BUG-21-escalation-null-attempts.md +0 -48
- package/docs/bugs-from-dogfood-run-c.md +0 -243
- package/docs/code-review-20260228.md +0 -612
- package/docs/code-review-v0.15.0.md +0 -629
- package/docs/hook-lifecycle-test-plan.md +0 -149
- package/docs/releases/v0.11.0-and-earlier.md +0 -20
- package/docs/releases/v0.12.0.md +0 -15
- package/docs/releases/v0.13.0.md +0 -14
- package/docs/releases/v0.14.0.md +0 -20
- package/docs/releases/v0.14.1.md +0 -36
- package/docs/releases/v0.14.2.md +0 -51
- package/docs/releases/v0.14.3.md +0 -174
- package/docs/releases/v0.14.4.md +0 -94
- package/docs/releases/v0.15.0.md +0 -502
- package/docs/releases/v0.15.1.md +0 -170
- package/docs/releases/v0.15.3.md +0 -193
- package/docs/specs/bug-039-orphan-processes.md +0 -131
- package/docs/specs/bug-040-review-rectification.md +0 -82
- package/docs/specs/bug-041-cross-story-test-isolation.md +0 -88
- package/docs/specs/bug-042-verifier-failure-capture.md +0 -117
- package/docs/specs/bun-pty-migration.md +0 -171
- package/docs/specs/central-run-registry.md +0 -116
- package/docs/specs/feat-010-smart-runner-git-history.md +0 -96
- package/docs/specs/feat-011-file-context-strategy.md +0 -73
- package/docs/specs/feat-012-tdd-writer-tier.md +0 -79
- package/docs/specs/feat-013-test-after-review.md +0 -89
- package/docs/specs/feat-014-heartbeat-observability.md +0 -127
- package/docs/specs/status-file-consolidation.md +0 -93
- package/docs/specs/status-file-v0.10.1.md +0 -812
- package/docs/specs/trigger-completion.md +0 -145
- package/docs/specs/verification-architecture-v2.md +0 -343
- package/docs/tdd/strategies.md +0 -97
- package/docs/v0.10-global-config.md +0 -206
- package/docs/v0.10-plugin-system.md +0 -415
- package/docs/v0.10-prompt-optimizer.md +0 -234
- package/docs/v0.3-spec.md +0 -244
- package/docs/v0.4-spec.md +0 -140
- package/docs/v0.5-spec.md +0 -237
- package/docs/v0.6-spec.md +0 -371
- package/docs/v0.7-spec.md +0 -177
- package/docs/v0.8-llm-routing.md +0 -206
- package/docs/v0.8-structured-logging.md +0 -132
- package/docs/v0.9.3-prompt-audit.md +0 -112
- package/examples/plugins/console-reporter/index.test.ts +0 -207
- package/examples/plugins/console-reporter/index.ts +0 -110
- package/memory/topic/feat-010-baseref.md +0 -28
- package/memory/topic/feat-013-test-after-deprecation.md +0 -22
- package/nax/config.json +0 -154
- package/nax/features/bug-039-medium/prd.json +0 -45
- package/nax/features/bugfix-v0171/prd.json +0 -52
- package/nax/features/central-run-registry/prd.json +0 -105
- package/nax/features/config-management/prd.json +0 -108
- package/nax/features/config-management/progress.txt +0 -5
- package/nax/features/diagnose/acceptance.test.ts +0 -414
- package/nax/features/diagnose/prd.json +0 -41
- package/nax/features/nax-compliance/prd.json +0 -52
- package/nax/features/nax-compliance/progress.txt +0 -1
- package/nax/features/orchestration-fixes/prd.json +0 -89
- package/nax/features/orchestration-fixes/progress.txt +0 -1
- package/nax/features/plugin-integration/US-007-VERIFICATION.md +0 -259
- package/nax/features/plugin-integration/prd.json +0 -208
- package/nax/features/plugin-integration/progress.txt +0 -5
- package/nax/features/post-rearch-bugfix/prd.json +0 -137
- package/nax/features/precheck/prd.json +0 -205
- package/nax/features/precheck/progress.txt +0 -15
- package/nax/features/prompt-builder/prd.json +0 -152
- package/nax/features/prompt-builder/progress.txt +0 -3
- package/nax/features/review-quality/prd.json +0 -55
- package/nax/features/routing-persistence/prd.json +0 -104
- package/nax/features/routing-persistence/progress.txt +0 -1
- package/nax/features/smart-test-runner/plan.md +0 -7
- package/nax/features/smart-test-runner/prd.json +0 -203
- package/nax/features/smart-test-runner/progress.txt +0 -13
- package/nax/features/smart-test-runner/spec.md +0 -7
- package/nax/features/smart-test-runner/tasks.md +0 -8
- package/nax/features/status-file-consolidation/prd.json +0 -106
- package/nax/features/structured-logging/prd.json +0 -199
- package/nax/features/trigger-completion/prd.json +0 -150
- package/nax/features/trigger-completion/progress.txt +0 -7
- package/nax/features/unlock/prd.json +0 -36
- package/nax/features/v0.18.3-execution-reliability/prd.json +0 -80
- package/nax/features/v0.18.3-execution-reliability/progress.txt +0 -3
- package/nax/features/v0.19.0-hardening/plan.md +0 -7
- package/nax/features/v0.19.0-hardening/prd.json +0 -84
- package/nax/features/v0.19.0-hardening/progress.txt +0 -7
- package/nax/features/v0.19.0-hardening/spec.md +0 -18
- package/nax/features/v0.19.0-hardening/tasks.md +0 -8
- package/nax/features/verify-v2/prd.json +0 -79
- package/nax/features/verify-v2/progress.txt +0 -3
- package/nax/status.json +0 -36
- package/src/prompts/templates/implementer.ts +0 -6
- package/src/prompts/templates/single-session.ts +0 -6
- package/src/prompts/templates/test-writer.ts +0 -6
- package/src/prompts/templates/verifier.ts +0 -6
- package/test/COVERAGE-GAPS.md +0 -333
- package/test/e2e/cm-003-default-view.test.ts +0 -195
- package/test/e2e/plan-analyze-run.test.ts +0 -902
- package/test/helpers/helpers.test.ts +0 -295
- package/test/helpers/timeout.ts +0 -42
- package/test/integration/US-002-TEST-SUMMARY.md +0 -107
- package/test/integration/US-003-TEST-SUMMARY.md +0 -149
- package/test/integration/US-004-TEST-SUMMARY.md +0 -106
- package/test/integration/US-005-TEST-SUMMARY.md +0 -138
- package/test/integration/US-007-TEST-SUMMARY.md +0 -100
- package/test/integration/cli/agent-validation.test.ts +0 -439
- package/test/integration/cli/cli-config-default-edge-cases.test.ts +0 -223
- package/test/integration/cli/cli-config-default-view.test.ts +0 -230
- package/test/integration/cli/cli-config-diff.test.ts +0 -461
- package/test/integration/cli/cli-config-prompts-explain.test.ts +0 -74
- package/test/integration/cli/cli-config.test.ts +0 -737
- package/test/integration/cli/cli-diagnose.test.ts +0 -595
- package/test/integration/cli/cli-logs.test.ts +0 -346
- package/test/integration/cli/cli-plugins.test.ts +0 -679
- package/test/integration/cli/cli-precheck.test.ts +0 -372
- package/test/integration/cli/cli-run-headless.test.ts +0 -174
- package/test/integration/cli/cli.test.ts +0 -76
- package/test/integration/cli/precheck-integration.test.ts +0 -476
- package/test/integration/cli/precheck-orchestrator.test.ts +0 -247
- package/test/integration/cli/precheck.test.ts +0 -806
- package/test/integration/config/config-loader.test.ts +0 -266
- package/test/integration/config/config.test.ts +0 -444
- package/test/integration/config/merger.test.ts +0 -466
- package/test/integration/config/paths.test.ts +0 -52
- package/test/integration/config/security-loader.test.ts +0 -83
- package/test/integration/context/context-integration.test.ts +0 -703
- package/test/integration/context/context-path-security.test.ts +0 -173
- package/test/integration/context/context-provider-injection.test.ts +0 -507
- package/test/integration/context/context-verification-integration.test.ts +0 -296
- package/test/integration/context/s5-greenfield-fallback.test.ts +0 -298
- package/test/integration/execution/execution-isolation.test.ts +0 -143
- package/test/integration/execution/execution.test.ts +0 -634
- package/test/integration/execution/feature-status-write.test.ts +0 -302
- package/test/integration/execution/parallel.test.ts +0 -251
- package/test/integration/execution/prd-pause.test.ts +0 -205
- package/test/integration/execution/prd-resolvers.test.ts +0 -186
- package/test/integration/execution/progress.test.ts +0 -34
- package/test/integration/execution/runner-batching.test.ts +0 -682
- package/test/integration/execution/runner-config-plugins.test.ts +0 -462
- package/test/integration/execution/runner-escalation.test.ts +0 -561
- package/test/integration/execution/runner-fixes.test.ts +0 -400
- package/test/integration/execution/runner-plugin-integration.test.ts +0 -544
- package/test/integration/execution/runner-queue-and-attempts.test.ts +0 -476
- package/test/integration/execution/status-file-integration.test.ts +0 -289
- package/test/integration/execution/status-file.test.ts +0 -380
- package/test/integration/execution/status-writer.test.ts +0 -447
- package/test/integration/execution/story-id-in-events.test.ts +0 -274
- package/test/integration/interaction/interaction-chain-pipeline.test.ts +0 -476
- package/test/integration/pipeline/hooks.test.ts +0 -363
- package/test/integration/pipeline/pipeline-acceptance.test.ts +0 -303
- package/test/integration/pipeline/pipeline-events.test.ts +0 -476
- package/test/integration/pipeline/pipeline.test.ts +0 -660
- package/test/integration/pipeline/reporter-lifecycle.test.ts +0 -862
- package/test/integration/pipeline/verify-stage.test.ts +0 -286
- package/test/integration/plan/analyze-integration.test.ts +0 -262
- package/test/integration/plan/analyze-scanner.test.ts +0 -132
- package/test/integration/plan/logger.test.ts +0 -461
- package/test/integration/plan/plan.test.ts +0 -157
- package/test/integration/plugins/config-integration.test.ts +0 -173
- package/test/integration/plugins/config-resolution.test.ts +0 -523
- package/test/integration/plugins/loader.test.ts +0 -644
- package/test/integration/plugins/plugins-registry.test.ts +0 -747
- package/test/integration/plugins/validator.test.ts +0 -564
- package/test/integration/prompts/pb-004-migration.test.ts +0 -523
- package/test/integration/review/review-config-commands.test.ts +0 -320
- package/test/integration/review/review-config-schema.test.ts +0 -117
- package/test/integration/review/review-plugin-integration.test.ts +0 -729
- package/test/integration/review/review.test.ts +0 -150
- package/test/integration/routing/plugin-routing-advanced.test.ts +0 -461
- package/test/integration/routing/plugin-routing-core.test.ts +0 -527
- package/test/integration/routing/routing-stage-bug-021.test.ts +0 -275
- package/test/integration/routing/routing-stage-greenfield.test.ts +0 -287
- package/test/integration/tdd/tdd-cleanup.test.ts +0 -246
- package/test/integration/tdd/tdd-orchestrator-core.test.ts +0 -565
- package/test/integration/tdd/tdd-orchestrator-failureCategory.test.ts +0 -355
- package/test/integration/tdd/tdd-orchestrator-fallback.test.ts +0 -311
- package/test/integration/tdd/tdd-orchestrator-lite.test.ts +0 -289
- package/test/integration/tdd/tdd-orchestrator-prompts.test.ts +0 -260
- package/test/integration/tdd/tdd-orchestrator-verdict.test.ts +0 -536
- package/test/integration/tmp/headless-test/test.jsonl +0 -30
- package/test/integration/verification/test-scanner.test.ts +0 -403
- package/test/integration/verification/verification-asset-check.test.ts +0 -143
- package/test/integration/worktree/manager.test.ts +0 -218
- package/test/integration/worktree/worktree-merge.test.ts +0 -341
- package/test/manual/logging-formatter-demo.ts +0 -158
- package/test/ui/tui-agent-panel.test.tsx +0 -99
- package/test/ui/tui-pty-integration.test.tsx +0 -146
- package/test/unit/acceptance.test.ts +0 -187
- package/test/unit/agent-stderr-capture.test.ts +0 -147
- package/test/unit/agents/claude.test.ts +0 -107
- package/test/unit/analyze-classifier.test.ts +0 -216
- package/test/unit/analyze.test.ts +0 -224
- package/test/unit/auto-detect.test.ts +0 -250
- package/test/unit/cli-status-project-level.test.ts +0 -283
- package/test/unit/cli-status.test.ts +0 -418
- package/test/unit/commands/common.test.ts +0 -321
- package/test/unit/commands/logs.test.ts +0 -458
- package/test/unit/commands/runs.test.ts +0 -303
- package/test/unit/commands/unlock.test.ts +0 -320
- package/test/unit/config/defaults.test.ts +0 -70
- package/test/unit/config/quality-commands-schema.test.ts +0 -72
- package/test/unit/config/regression-gate-schema.test.ts +0 -160
- package/test/unit/config/smart-runner-flag.test.ts +0 -250
- package/test/unit/constitution-generators.test.ts +0 -161
- package/test/unit/constitution.test.ts +0 -210
- package/test/unit/context/context-autodetect.test.ts +0 -297
- package/test/unit/context/context-build.test.ts +0 -575
- package/test/unit/context/context-coverage.test.ts +0 -236
- package/test/unit/context/context-error.test.ts +0 -93
- package/test/unit/context/context-estimate-tokens.test.ts +0 -201
- package/test/unit/context/context-format.test.ts +0 -302
- package/test/unit/context/context-isolation.test.ts +0 -267
- package/test/unit/context/context-sort.test.ts +0 -93
- package/test/unit/context/context-story.test.ts +0 -108
- package/test/unit/context/prior-failures.test.ts +0 -463
- package/test/unit/context.test.ts +0 -1726
- package/test/unit/cost.test.ts +0 -231
- package/test/unit/crash-recovery.test.ts +0 -309
- package/test/unit/escalation.test.ts +0 -127
- package/test/unit/execution/lifecycle/run-completion.test.ts +0 -240
- package/test/unit/execution/lifecycle/run-regression.test.ts +0 -420
- package/test/unit/execution/pid-registry.test.ts +0 -241
- package/test/unit/execution/sequential-executor.test.ts +0 -235
- package/test/unit/execution/sfc-004-dead-code-cleanup.test.ts +0 -89
- package/test/unit/execution/structured-failure.test.ts +0 -415
- package/test/unit/execution-logging-stderr.test.ts +0 -157
- package/test/unit/execution-stage.test.ts +0 -123
- package/test/unit/fix-generator.test.ts +0 -276
- package/test/unit/formatters.test.ts +0 -468
- package/test/unit/greenfield.test.ts +0 -180
- package/test/unit/hooks/shell-security.test.ts +0 -40
- package/test/unit/interaction/auto-plugin.test.ts +0 -162
- package/test/unit/interaction/human-review-trigger.test.ts +0 -165
- package/test/unit/interaction-network-failures.test.ts +0 -390
- package/test/unit/interaction-plugins.test.ts +0 -472
- package/test/unit/logging/formatter.test.ts +0 -456
- package/test/unit/merge.test.ts +0 -269
- package/test/unit/metrics/aggregator.test.ts +0 -164
- package/test/unit/metrics/tracker.test.ts +0 -186
- package/test/unit/metrics.test.ts +0 -276
- package/test/unit/optimizer/noop.optimizer.test.ts +0 -125
- package/test/unit/optimizer/rule-based.optimizer.test.ts +0 -358
- package/test/unit/pipeline/event-bus.test.ts +0 -105
- package/test/unit/pipeline/routing-partial-override.test.ts +0 -121
- package/test/unit/pipeline/runner-retry.test.ts +0 -89
- package/test/unit/pipeline/stages/autofix.test.ts +0 -97
- package/test/unit/pipeline/stages/completion-review-gate.test.ts +0 -218
- package/test/unit/pipeline/stages/execution-ambiguity.test.ts +0 -311
- package/test/unit/pipeline/stages/execution-merge-conflict.test.ts +0 -218
- package/test/unit/pipeline/stages/rectify.test.ts +0 -101
- package/test/unit/pipeline/stages/regression-stage.test.ts +0 -69
- package/test/unit/pipeline/stages/review.test.ts +0 -201
- package/test/unit/pipeline/stages/routing-idempotence.test.ts +0 -139
- package/test/unit/pipeline/stages/routing-initial-complexity.test.ts +0 -321
- package/test/unit/pipeline/stages/routing-persistence.test.ts +0 -380
- package/test/unit/pipeline/stages/verify.test.ts +0 -267
- package/test/unit/pipeline/subscribers/events-writer.test.ts +0 -227
- package/test/unit/pipeline/subscribers/hooks.test.ts +0 -84
- package/test/unit/pipeline/subscribers/interaction.test.ts +0 -313
- package/test/unit/pipeline/subscribers/registry.test.ts +0 -149
- package/test/unit/pipeline/subscribers/reporters.test.ts +0 -90
- package/test/unit/pipeline/verify-smart-runner.test.ts +0 -345
- package/test/unit/prd-auto-default.test.ts +0 -291
- package/test/unit/prd-failure-category.test.ts +0 -177
- package/test/unit/prd-get-next-story.test.ts +0 -215
- package/test/unit/precheck/checks-warnings.test.ts +0 -114
- package/test/unit/precheck-checks.test.ts +0 -841
- package/test/unit/precheck-story-size-gate.test.ts +0 -288
- package/test/unit/precheck-types.test.ts +0 -143
- package/test/unit/prompts/builder.test.ts +0 -258
- package/test/unit/prompts/loader.test.ts +0 -355
- package/test/unit/prompts/sections/conventions.test.ts +0 -30
- package/test/unit/prompts/sections/isolation.test.ts +0 -35
- package/test/unit/prompts/sections/role-task.test.ts +0 -40
- package/test/unit/prompts/sections/sections.test.ts +0 -238
- package/test/unit/prompts/sections/story.test.ts +0 -45
- package/test/unit/prompts/sections/verdict.test.ts +0 -58
- package/test/unit/prompts.test.ts +0 -476
- package/test/unit/queue.test.ts +0 -237
- package/test/unit/rectification.test.ts +0 -285
- package/test/unit/registry.test.ts +0 -288
- package/test/unit/review/runner.test.ts +0 -117
- package/test/unit/routing/content-hash.test.ts +0 -99
- package/test/unit/routing/routing-stability.test.ts +0 -208
- package/test/unit/routing/strategies/llm.test.ts +0 -306
- package/test/unit/routing-advanced.test.ts +0 -313
- package/test/unit/routing-core.test.ts +0 -341
- package/test/unit/routing-strategies.test.ts +0 -440
- package/test/unit/storyid-events.test.ts +0 -213
- package/test/unit/tdd-verdict.test.ts +0 -492
- package/test/unit/test-output-parser.test.ts +0 -377
- package/test/unit/ui/tui-controls.test.ts +0 -335
- package/test/unit/ui/tui-cost-and-pty.test.ts +0 -190
- package/test/unit/ui/tui-layout.test.ts +0 -379
- package/test/unit/ui/tui-stories.test.ts +0 -333
- package/test/unit/unit-isolation.test.ts +0 -135
- package/test/unit/utils/git.test.ts +0 -50
- package/test/unit/utils/path-security.test.ts +0 -47
- package/test/unit/utils-helpers.test.ts +0 -318
- package/test/unit/verdict.test.ts +0 -325
- package/test/unit/verification/orchestrator-types.test.ts +0 -54
- package/test/unit/verification/orchestrator.test.ts +0 -66
- package/test/unit/verification/smart-runner-config.test.ts +0 -163
- package/test/unit/verification/smart-runner-discovery.test.ts +0 -354
- package/test/unit/verification/smart-runner.test.ts +0 -262
- package/test/unit/verification/strategies/acceptance.test.ts +0 -33
- package/test/unit/verification/strategies/regression.test.ts +0 -87
- package/test/unit/verification/strategies/scoped.test.ts +0 -100
- package/test/unit/worktree-manager.test.ts +0 -159
- package/tsconfig.json +0 -27
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
# Trigger Completion — Spec
|
|
2
|
-
|
|
3
|
-
**Version:** v0.25.0
|
|
4
|
-
**Status:** Planned
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## Problem
|
|
9
|
-
|
|
10
|
-
8 of 9 interaction trigger helpers (`checkCostExceeded`, `checkCostWarning`, `checkMaxRetries`, `checkSecurityReview`, `checkMergeConflict`, `checkPreMerge`, `checkStoryAmbiguity`, `checkReviewGate`) are implemented in `src/interaction/triggers.ts` and exported but **never called** from the pipeline.
|
|
11
|
-
|
|
12
|
-
Only `human-review` is wired (via `wireInteraction` subscriber on `human-review:requested` event).
|
|
13
|
-
|
|
14
|
-
Additionally, 3 hook events (`on-resume`, `on-session-end`, `on-error`) are defined in `HookEvent` but not wired to any pipeline event.
|
|
15
|
-
|
|
16
|
-
---
|
|
17
|
-
|
|
18
|
-
## Goal
|
|
19
|
-
|
|
20
|
-
Wire all 8 remaining triggers to the correct pipeline decision points. Add 3 missing hook events. Add E2E/integration test coverage for the Telegram and auto plugins.
|
|
21
|
-
|
|
22
|
-
---
|
|
23
|
-
|
|
24
|
-
## Stories
|
|
25
|
-
|
|
26
|
-
### TC-001: Wire `cost-exceeded` and `cost-warning` triggers
|
|
27
|
-
|
|
28
|
-
**Location:** `src/execution/sequential-executor.ts`
|
|
29
|
-
|
|
30
|
-
Currently at line 93, when `totalCost >= config.execution.costLimit`, the run exits with `"cost-limit"` — no interaction trigger is fired.
|
|
31
|
-
|
|
32
|
-
**Fix:**
|
|
33
|
-
- Before exiting on cost limit: call `checkCostExceeded({featureName, cost, limit}, config, interactionChain)`. If trigger returns `abort` or chain not available → exit as today. Pass `interactionChain` into `executeSequential` ctx (already present in `SequentialExecutionContext`).
|
|
34
|
-
- Add a `cost-warning` threshold check: when `totalCost >= costLimit * 0.8` (configurable via `interaction.triggers.cost-warning.threshold`, default 0.8), fire `checkCostWarning`. Fire only once per run (track with a boolean flag). Fallback: `continue`.
|
|
35
|
-
- Emit new `run:paused` event if trigger response is `escalate` (pause for human decision).
|
|
36
|
-
- Add `CostExceededEvent` and `CostWarningEvent` to `PipelineEventBus` (or reuse `run:paused` with a `reason` field — preferred, avoids new event types).
|
|
37
|
-
|
|
38
|
-
**Acceptance criteria:**
|
|
39
|
-
- When cost hits 80% of limit, `cost-warning` trigger fires once and run continues (default fallback)
|
|
40
|
-
- When cost hits 100% of limit, `cost-exceeded` trigger fires; abort kills the run, skip/continue allows proceeding past limit
|
|
41
|
-
- When no interaction plugin is configured, behavior is identical to today (no-op)
|
|
42
|
-
- Tests: unit test both thresholds with mock chain
|
|
43
|
-
|
|
44
|
-
---
|
|
45
|
-
|
|
46
|
-
### TC-002: Wire `max-retries` trigger
|
|
47
|
-
|
|
48
|
-
**Location:** `src/execution/sequential-executor.ts` or `src/pipeline/pipeline-result-handler.ts`
|
|
49
|
-
|
|
50
|
-
Currently when a story exhausts all tier escalations and is marked failed permanently (`markStoryFailed`), no trigger fires (except `human-review` which fires on `human-review:requested` event for a different condition).
|
|
51
|
-
|
|
52
|
-
**Fix:**
|
|
53
|
-
- In the story failure path (after all escalations exhausted), call `checkMaxRetries({featureName, storyId, iteration}, config, interactionChain)`.
|
|
54
|
-
- Response `skip` = proceed (today's behavior), `abort` = halt entire run, `escalate` = retry story from scratch at top tier.
|
|
55
|
-
- Wire via `story:failed` event in `wireInteraction` subscriber (add alongside `human-review:requested`).
|
|
56
|
-
|
|
57
|
-
**Acceptance criteria:**
|
|
58
|
-
- `max-retries` trigger fires when a story is permanently failed
|
|
59
|
-
- `abort` response halts the run with exit reason `"interaction-abort"`
|
|
60
|
-
- `skip` response is silent (today's behavior)
|
|
61
|
-
- Tests: unit test with mock chain for all three fallbacks
|
|
62
|
-
|
|
63
|
-
---
|
|
64
|
-
|
|
65
|
-
### TC-003: Wire `security-review`, `merge-conflict`, `pre-merge` triggers
|
|
66
|
-
|
|
67
|
-
**Location:** `src/pipeline/stages/review.ts` and `src/pipeline/stages/completion.ts` (post-story)
|
|
68
|
-
|
|
69
|
-
- **`security-review`**: Fire after plugin reviewer (e.g. semgrep) rejects a story in `review.ts`. Currently returns `{ action: "fail" }`. Before failing permanently, call `checkSecurityReview`. Response `abort` = fail (today), `escalate` = retry with security context injected.
|
|
70
|
-
- **`merge-conflict`**: Fire when git operations detect a merge conflict during story commit. Currently no merge-conflict detection exists — add detection in `src/execution/git.ts` (catch `CONFLICT` in git merge/rebase output) and call `checkMergeConflict`.
|
|
71
|
-
- **`pre-merge`**: Fire after all stories pass but before the run is marked complete. Call `checkPreMerge({featureName, totalStories, cost}, config, interactionChain)` in `sequential-executor.ts` final block. Response `abort` = halt, `continue` = complete normally.
|
|
72
|
-
|
|
73
|
-
**Acceptance criteria:**
|
|
74
|
-
- `security-review` trigger fires when plugin reviewer rejects (not when lint/typecheck fails)
|
|
75
|
-
- `merge-conflict` trigger fires when git detects CONFLICT markers
|
|
76
|
-
- `pre-merge` trigger fires once after all stories pass, before run:completed
|
|
77
|
-
- Tests: unit tests for each trigger point with mock chain
|
|
78
|
-
|
|
79
|
-
---
|
|
80
|
-
|
|
81
|
-
### TC-004: Wire `story-ambiguity` and `review-gate` triggers
|
|
82
|
-
|
|
83
|
-
**Location:** `src/pipeline/stages/execution.ts`
|
|
84
|
-
|
|
85
|
-
- **`story-ambiguity`**: Fire when agent session returns ambiguous/clarification-needed signal. Currently the agent exit codes and output are parsed in `execution.ts` — add a detection heuristic (e.g. agent output contains "unclear" / "ambiguous" / "need clarification" keywords, or a new `needsClarification` flag in agent result). Call `checkStoryAmbiguity` before escalating.
|
|
86
|
-
- **`review-gate`**: Fire after `story:completed` as a human checkpoint gate (configurable, disabled by default). Wire via new `review-gate:requested` event emitted in completion stage when `interaction.triggers.review-gate.enabled = true`.
|
|
87
|
-
|
|
88
|
-
**Acceptance criteria:**
|
|
89
|
-
- `story-ambiguity` trigger fires when agent signals ambiguity (keyword detection)
|
|
90
|
-
- `review-gate` trigger fires after each story passes when enabled
|
|
91
|
-
- Both default to disabled in config (opt-in)
|
|
92
|
-
- Tests: unit tests for ambiguity detection heuristic + trigger dispatch
|
|
93
|
-
|
|
94
|
-
---
|
|
95
|
-
|
|
96
|
-
### TC-005: Wire missing hook events (`on-resume`, `on-session-end`, `on-error`)
|
|
97
|
-
|
|
98
|
-
**Location:** `src/pipeline/subscribers/hooks.ts`
|
|
99
|
-
|
|
100
|
-
Three hook events are defined in `HookEvent` but never wired to pipeline events:
|
|
101
|
-
|
|
102
|
-
- **`on-resume`**: Fire when a paused run resumes. Add `run:resumed` event to `PipelineEventBus`, emit it in `sequential-executor.ts` when resuming from pause state. Wire in `wireHooks`.
|
|
103
|
-
- **`on-session-end`**: Fire when an individual agent session ends (pass or fail). Map to `story:completed` + `story:failed`. Wire in `wireHooks` on both events.
|
|
104
|
-
- **`on-error`**: Fire on unhandled errors / crash. Emit in `crash-recovery.ts` crash handler. Wire in `wireHooks`.
|
|
105
|
-
|
|
106
|
-
**Acceptance criteria:**
|
|
107
|
-
- `on-resume` hook fires when a paused run is continued
|
|
108
|
-
- `on-session-end` hook fires after every agent session (pass or fail)
|
|
109
|
-
- `on-error` hook fires in crash handler before exit
|
|
110
|
-
- Tests: extend existing `hooks.test.ts` with the three new events
|
|
111
|
-
|
|
112
|
-
---
|
|
113
|
-
|
|
114
|
-
### TC-006: Auto plugin integration tests
|
|
115
|
-
|
|
116
|
-
**Location:** `test/integration/interaction/`
|
|
117
|
-
|
|
118
|
-
The `AutoInteractionPlugin` (LLM-based) has zero test coverage. The Telegram and Webhook plugins have init/config tests but no send/receive flow tests.
|
|
119
|
-
|
|
120
|
-
**Fix:**
|
|
121
|
-
- `auto.test.ts` — mock the LLM call (`_deps` pattern), test: approve decision, reject decision, confidence below threshold falls back, `security-review` is never auto-approved.
|
|
122
|
-
- Extend `interaction-plugins.test.ts` with Telegram send flow (mock `fetch`, verify message format + inline keyboard structure).
|
|
123
|
-
- Extend with Webhook send flow (mock HTTP server, verify HMAC signature validation).
|
|
124
|
-
|
|
125
|
-
**Acceptance criteria:**
|
|
126
|
-
- Auto plugin: LLM approve/reject/confidence-fallback/security-review-block all covered
|
|
127
|
-
- Telegram: message send format and inline keyboard structure verified
|
|
128
|
-
- Webhook: HMAC verification tested (valid + tampered signatures)
|
|
129
|
-
- All tests are unit/mock — no real network calls
|
|
130
|
-
|
|
131
|
-
---
|
|
132
|
-
|
|
133
|
-
## Out of Scope
|
|
134
|
-
|
|
135
|
-
- Full E2E test with real Telegram bot (requires live credentials)
|
|
136
|
-
- New trigger types beyond the 9 already defined
|
|
137
|
-
- Interaction state persistence (pause/resume full flow) — separate feature
|
|
138
|
-
|
|
139
|
-
---
|
|
140
|
-
|
|
141
|
-
## Notes
|
|
142
|
-
|
|
143
|
-
- All trigger calls must be best-effort guarded: if `interactionChain` is null/undefined, skip silently (today's behavior)
|
|
144
|
-
- `interactionChain` is already threaded through `SequentialExecutionContext` — no new context changes needed for most stories
|
|
145
|
-
- Config `interaction.triggers.<name>.enabled` must be `true` for any trigger to fire (`isTriggerEnabled` handles this)
|
|
@@ -1,343 +0,0 @@
|
|
|
1
|
-
# Verification Architecture v2
|
|
2
|
-
|
|
3
|
-
**Status:** Proposal
|
|
4
|
-
**Target:** v0.19.0
|
|
5
|
-
**Author:** Nax Dev
|
|
6
|
-
**Date:** 2026-03-04
|
|
7
|
-
**Fixes:** BUG-026, BUG-028, plus architectural debt in verification pipeline
|
|
8
|
-
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
## 1. Problems with Current Architecture
|
|
12
|
-
|
|
13
|
-
### 1.1 Triple Test Execution (Waste)
|
|
14
|
-
|
|
15
|
-
Current per-story flow runs tests up to 3 times:
|
|
16
|
-
|
|
17
|
-
```
|
|
18
|
-
Pipeline verify stage → scoped tests (Smart Test Runner)
|
|
19
|
-
Pipeline review stage → test command (if review.commands.test configured)
|
|
20
|
-
Post-verify → scoped tests AGAIN + full regression gate
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
On Mac01 with ~2000 tests, this means:
|
|
24
|
-
- Scoped: ~10-20s × 2 (duplicate) = 20-40s wasted
|
|
25
|
-
- Full regression: ~125s per story
|
|
26
|
-
- Total: ~150s+ of test execution per story
|
|
27
|
-
|
|
28
|
-
### 1.2 Regression Gate Per Story (BUG-026)
|
|
29
|
-
|
|
30
|
-
The regression gate runs a **full test suite after every story**. Problems:
|
|
31
|
-
- **Timeout:** Full suite frequently times out on Mac01 (~125s)
|
|
32
|
-
- **False escalation:** Timeout is treated as story failure → bumps `story.attempts` → triggers tier escalation
|
|
33
|
-
- **Wasted compute:** Agent's implementation was correct (scoped tests passed), but full suite timeout causes a complete redo at a higher (more expensive) tier
|
|
34
|
-
- **Cascading waste:** N stories × 1 full suite each = N full suite runs. Most are redundant.
|
|
35
|
-
|
|
36
|
-
### 1.3 Escalation Context Loss
|
|
37
|
-
|
|
38
|
-
When a story fails and escalates to a higher tier, the error context passed is:
|
|
39
|
-
|
|
40
|
-
```
|
|
41
|
-
priorErrors: ["Attempt 1 failed with model tier: fast"]
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
The actual test output — which tests failed, error messages, stack traces — is **discarded**. The escalated agent gets a vague hint instead of actionable failure context.
|
|
45
|
-
|
|
46
|
-
| Stage | Context Available | What's Stored in priorErrors |
|
|
47
|
-
|-------|-------------------|------------------------------|
|
|
48
|
-
| Rectification loop | Full `TestFailure[]` with file, testName, error, stackTrace | *(used internally, then discarded)* |
|
|
49
|
-
| Post-verify failure | `verificationResult.error` (summary string) | Generic: `"Verification failed: TEST_FAILURE"` |
|
|
50
|
-
| Regression gate failure | Full test output | Generic: `"REGRESSION: full-suite regression detected"` |
|
|
51
|
-
| Tier escalation | Nothing new | `"Attempt N failed with model tier: X"` |
|
|
52
|
-
|
|
53
|
-
Result: `fast → balanced → powerful` escalation chain has **zero actionable context** about what actually failed.
|
|
54
|
-
|
|
55
|
-
### 1.4 Routing Cache Ignores Escalation Tier (BUG-028)
|
|
56
|
-
|
|
57
|
-
LLM routing cache is keyed by `story.id` only. When escalation updates `story.routing.modelTier` from `balanced` → `powerful`, the next iteration hits the cache and returns the old `balanced` routing decision, overriding the escalation.
|
|
58
|
-
|
|
59
|
-
---
|
|
60
|
-
|
|
61
|
-
## 2. Proposed Architecture
|
|
62
|
-
|
|
63
|
-
### 2.1 Verification Flow (Simplified)
|
|
64
|
-
|
|
65
|
-
```
|
|
66
|
-
Pipeline per-story:
|
|
67
|
-
1. Agent execution
|
|
68
|
-
2. Scoped verify (Smart Test Runner) ← ONLY test run per story
|
|
69
|
-
3. Scoped rectification (if verify fails) ← has full test failure context
|
|
70
|
-
4. Review (typecheck + lint only) ← NO test re-run
|
|
71
|
-
5. Story marked "passed" or escalated
|
|
72
|
-
|
|
73
|
-
Run-end (after all stories pass):
|
|
74
|
-
6. Deferred regression gate (full suite) ← ONE full suite run total
|
|
75
|
-
7. Targeted regression rectification ← per-story, with failure context
|
|
76
|
-
8. Run marked complete or stalled
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
**Key changes:**
|
|
80
|
-
- **Remove duplicate test runs** — pipeline verify is the single source of truth
|
|
81
|
-
- **Review stage runs typecheck + lint only** — no test command
|
|
82
|
-
- **Remove post-verify scoped re-test** — pipeline verify already did this
|
|
83
|
-
- **Move regression gate to run-end** — one full suite run instead of N
|
|
84
|
-
- **Targeted regression rectification** — map failing tests back to responsible stories
|
|
85
|
-
|
|
86
|
-
### 2.2 Deferred Regression Gate
|
|
87
|
-
|
|
88
|
-
Instead of running the full suite after every story, run it **once** after all stories complete.
|
|
89
|
-
|
|
90
|
-
```typescript
|
|
91
|
-
// New: src/execution/lifecycle/run-regression.ts
|
|
92
|
-
|
|
93
|
-
interface DeferredRegressionOptions {
|
|
94
|
-
config: NaxConfig;
|
|
95
|
-
workdir: string;
|
|
96
|
-
prd: PRD;
|
|
97
|
-
prdPath: string;
|
|
98
|
-
allStoryMetrics: StoryMetrics[];
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
interface DeferredRegressionResult {
|
|
102
|
-
passed: boolean;
|
|
103
|
-
failedTests?: TestFailure[];
|
|
104
|
-
storyMapping?: Map<string, TestFailure[]>; // storyId → failures caused by that story
|
|
105
|
-
}
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
**Failure handling:**
|
|
109
|
-
1. Run full suite
|
|
110
|
-
2. Parse failures into `TestFailure[]`
|
|
111
|
-
3. For each failing test, use reverse Smart Test Runner mapping:
|
|
112
|
-
- `test/unit/foo/bar.test.ts` → `src/foo/bar.ts` → which story touched this file? (from git log per story)
|
|
113
|
-
4. Group failures by responsible story
|
|
114
|
-
5. Attempt targeted rectification per story (agent gets FULL failure context)
|
|
115
|
-
6. Re-run full suite to confirm fix
|
|
116
|
-
7. If still failing → mark responsible stories as failed
|
|
117
|
-
|
|
118
|
-
**Config:**
|
|
119
|
-
|
|
120
|
-
```jsonc
|
|
121
|
-
{
|
|
122
|
-
"execution": {
|
|
123
|
-
"regressionGate": {
|
|
124
|
-
"enabled": true,
|
|
125
|
-
"mode": "deferred", // "deferred" | "per-story" | "disabled"
|
|
126
|
-
"timeoutSeconds": 300,
|
|
127
|
-
"maxRectificationAttempts": 2
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
### 2.3 Structured Failure Context for Escalation
|
|
134
|
-
|
|
135
|
-
Replace vague `priorErrors` strings with structured failure data.
|
|
136
|
-
|
|
137
|
-
**New PRD field:** `priorFailures` (alongside existing `priorErrors` for backward compat)
|
|
138
|
-
|
|
139
|
-
```typescript
|
|
140
|
-
// In src/prd/types.ts
|
|
141
|
-
|
|
142
|
-
interface StructuredFailure {
|
|
143
|
-
/** Which attempt this failure occurred on */
|
|
144
|
-
attempt: number;
|
|
145
|
-
/** Model tier that was used */
|
|
146
|
-
modelTier: string;
|
|
147
|
-
/** What stage failed */
|
|
148
|
-
stage: "verify" | "review" | "regression" | "rectification" | "agent-session";
|
|
149
|
-
/** Human-readable summary */
|
|
150
|
-
summary: string;
|
|
151
|
-
/** Structured test failures (if applicable) */
|
|
152
|
-
testFailures?: TestFailureContext[];
|
|
153
|
-
/** Timestamp */
|
|
154
|
-
timestamp: string;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
interface TestFailureContext {
|
|
158
|
-
file: string;
|
|
159
|
-
testName: string;
|
|
160
|
-
error: string;
|
|
161
|
-
/** First 5 lines of stack trace */
|
|
162
|
-
stackTrace: string[];
|
|
163
|
-
}
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
**How it flows through escalation:**
|
|
167
|
-
|
|
168
|
-
```
|
|
169
|
-
fast attempt 1 → verify fails
|
|
170
|
-
→ priorFailures: [{
|
|
171
|
-
attempt: 1,
|
|
172
|
-
modelTier: "fast",
|
|
173
|
-
stage: "verify",
|
|
174
|
-
summary: "3 tests failed in src/routing/router.ts",
|
|
175
|
-
testFailures: [
|
|
176
|
-
{ file: "test/unit/routing/router.test.ts",
|
|
177
|
-
testName: "should route to balanced",
|
|
178
|
-
error: "Expected 'balanced' got 'fast'",
|
|
179
|
-
stackTrace: [...] },
|
|
180
|
-
...
|
|
181
|
-
]
|
|
182
|
-
}]
|
|
183
|
-
|
|
184
|
-
balanced attempt 1 → agent gets FULL context of what fast couldn't fix
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
**Context injection** (`context/builder.ts`):
|
|
188
|
-
|
|
189
|
-
Format `priorFailures` into actionable markdown for the agent prompt:
|
|
190
|
-
|
|
191
|
-
```markdown
|
|
192
|
-
## Prior Attempt 1 (fast, verify)
|
|
193
|
-
3 tests failed in src/routing/router.ts
|
|
194
|
-
|
|
195
|
-
### Test Failures:
|
|
196
|
-
- **test/unit/routing/router.test.ts** > should route to balanced
|
|
197
|
-
Error: Expected 'balanced' got 'fast'
|
|
198
|
-
Stack: at Router.route (src/routing/router.ts:42)
|
|
199
|
-
```
|
|
200
|
-
|
|
201
|
-
### 2.4 BUG-028 Fix: Cache Invalidation on Escalation
|
|
202
|
-
|
|
203
|
-
Add `clearCacheForStory(storyId)` to `src/routing/strategies/llm.ts`.
|
|
204
|
-
|
|
205
|
-
Call it in `tier-escalation.ts` when updating `story.routing.modelTier`.
|
|
206
|
-
|
|
207
|
-
---
|
|
208
|
-
|
|
209
|
-
## 3. Migration Plan
|
|
210
|
-
|
|
211
|
-
### Phase 1: v0.18.3 — Minimal Fixes (no architecture change)
|
|
212
|
-
|
|
213
|
-
1. **BUG-026 quick fix:** Regression gate timeout → accept scoped pass + warn (not escalate)
|
|
214
|
-
2. **BUG-028 fix:** `clearCacheForStory()` on escalation
|
|
215
|
-
3. **Store structured failures:** Start populating `priorFailures` alongside `priorErrors` (backward compat)
|
|
216
|
-
|
|
217
|
-
### Phase 2: v0.19.0 — Architecture v2
|
|
218
|
-
|
|
219
|
-
1. **Remove post-verify duplicate test run** — pipeline verify is authoritative
|
|
220
|
-
2. **Review stage: typecheck + lint only** — remove test command from review
|
|
221
|
-
3. **Deferred regression gate** — run-end full suite with targeted rectification
|
|
222
|
-
4. **Reverse Smart Test Runner mapping** — failing test → source file → responsible story
|
|
223
|
-
5. **Full structured failure context** — `priorFailures` injected into agent prompts
|
|
224
|
-
6. **Config:** `regressionGate.mode: "deferred"` (default)
|
|
225
|
-
|
|
226
|
-
### Phase 3: Future
|
|
227
|
-
|
|
228
|
-
- **Incremental regression:** Only run tests related to ALL changed files across all stories (union of Smart Test Runner scopes)
|
|
229
|
-
- **Test impact analysis:** AST-based dependency graph for more precise test scoping
|
|
230
|
-
- **Parallel story regression:** Run rectification for multiple stories concurrently
|
|
231
|
-
|
|
232
|
-
---
|
|
233
|
-
|
|
234
|
-
## 4. Files Affected
|
|
235
|
-
|
|
236
|
-
### Phase 1 (v0.18.3)
|
|
237
|
-
|
|
238
|
-
| File | Change |
|
|
239
|
-
|------|--------|
|
|
240
|
-
| `src/execution/post-verify.ts` | Regression gate timeout → accept + warn |
|
|
241
|
-
| `src/routing/strategies/llm.ts` | Add `clearCacheForStory()` export |
|
|
242
|
-
| `src/execution/escalation/tier-escalation.ts` | Call `clearCacheForStory()` on escalation |
|
|
243
|
-
| `src/execution/post-verify-rectification.ts` | Store `StructuredFailure` in `priorFailures` |
|
|
244
|
-
| `src/prd/types.ts` | Add `priorFailures?: StructuredFailure[]` to `UserStory` |
|
|
245
|
-
|
|
246
|
-
### Phase 2 (v0.19.0)
|
|
247
|
-
|
|
248
|
-
| File | Change |
|
|
249
|
-
|------|--------|
|
|
250
|
-
| `src/pipeline/stages/review.ts` | Remove test command execution |
|
|
251
|
-
| `src/execution/post-verify.ts` | Remove scoped re-test, keep regression call only |
|
|
252
|
-
| `src/execution/lifecycle/run-regression.ts` | **New:** Deferred regression gate + targeted rectification |
|
|
253
|
-
| `src/execution/lifecycle/run-completion.ts` | Call deferred regression before final metrics |
|
|
254
|
-
| `src/verification/smart-runner.ts` | Add reverse mapping: test file → source file → story |
|
|
255
|
-
| `src/context/builder.ts` | Format `priorFailures` into agent prompt |
|
|
256
|
-
| `src/config/schemas.ts` | Add `regressionGate.mode` enum |
|
|
257
|
-
|
|
258
|
-
---
|
|
259
|
-
|
|
260
|
-
## 5. Test Plan
|
|
261
|
-
|
|
262
|
-
### Phase 1 Tests
|
|
263
|
-
- Regression gate timeout returns "passed" with warning (not "failed")
|
|
264
|
-
- `clearCacheForStory()` removes cached decision; next route() re-evaluates
|
|
265
|
-
- `priorFailures` populated with structured `TestFailureContext` on verify failure
|
|
266
|
-
- Backward compat: `priorErrors` still populated alongside `priorFailures`
|
|
267
|
-
|
|
268
|
-
### Phase 2 Tests
|
|
269
|
-
- Pipeline verify is single test execution (no duplicate)
|
|
270
|
-
- Review stage skips test command
|
|
271
|
-
- Deferred regression runs once at run-end
|
|
272
|
-
- Reverse mapping correctly identifies responsible story
|
|
273
|
-
- Targeted rectification receives full failure context
|
|
274
|
-
- Escalated agent prompt includes formatted `priorFailures`
|
|
275
|
-
- Config `regressionGate.mode: "per-story"` preserves current behavior
|
|
276
|
-
|
|
277
|
-
---
|
|
278
|
-
|
|
279
|
-
## 6. Historical Context (Why It's Like This)
|
|
280
|
-
|
|
281
|
-
### Why post-verify exists separately from pipeline verify
|
|
282
|
-
|
|
283
|
-
The pipeline (`src/pipeline/pipeline.ts`) runs stages in sequence: routing → context → prompt → execution → **verify** → review → completion. This was the original single verification point.
|
|
284
|
-
|
|
285
|
-
Later, **post-agent verification** was added in `src/execution/pipeline-result-handler.ts` → `handlePipelineSuccess()` → `runPostAgentVerification()`. This was meant to handle:
|
|
286
|
-
- **Scoped verification** with git-diff-based test file detection (before Smart Test Runner existed in the pipeline)
|
|
287
|
-
- **Rectification** — retry loop with agent when tests fail
|
|
288
|
-
- **Regression gate** (BUG-009 fix) — full suite after scoped pass
|
|
289
|
-
|
|
290
|
-
When Smart Test Runner was added to the **pipeline verify stage** (v0.18.2), it duplicated the scoped test logic that post-verify already had. Nobody removed the post-verify scoped test.
|
|
291
|
-
|
|
292
|
-
### Current code flow with exact locations
|
|
293
|
-
|
|
294
|
-
```
|
|
295
|
-
sequential-executor.ts:170 → pipelineRunner.run(story)
|
|
296
|
-
pipeline.ts:execute() → runs stages in order:
|
|
297
|
-
verify.ts:execute() → Smart Test Runner scoped tests [TEST RUN #1]
|
|
298
|
-
review.ts:execute() → runReview() which may run tests [TEST RUN #2 if review.commands.test set]
|
|
299
|
-
|
|
300
|
-
pipeline-result-handler.ts:76 → runPostAgentVerification()
|
|
301
|
-
post-verify.ts:85 → runVerification(scopedCommand) [TEST RUN #3 — duplicate of #1]
|
|
302
|
-
post-verify.ts:118 → runRegressionGate()
|
|
303
|
-
post-verify.ts:180 → runVerification(fullSuite) [TEST RUN #4 — full suite]
|
|
304
|
-
```
|
|
305
|
-
|
|
306
|
-
### Review stage test command
|
|
307
|
-
|
|
308
|
-
`review.ts` calls `runReview()` from `src/review/index.ts` which runs `config.review.commands.test` if configured. In default config, `review.commands` includes `test`, `typecheck`, and `lint`. So yes — review runs tests by default, creating the triple-test problem.
|
|
309
|
-
|
|
310
|
-
### Decision rationale
|
|
311
|
-
|
|
312
|
-
**Why deferred regression (Option C) over per-story (A) or disabled (B):**
|
|
313
|
-
- **Option A (keep per-story):** 125s timeout per story is the root cause of BUG-026. Even with timeout-acceptance, it's wasteful.
|
|
314
|
-
- **Option B (disable entirely):** Too risky — cross-story regressions are real (BUG-009 was filed for this exact reason).
|
|
315
|
-
- **Option C (deferred):** One full suite run at the end. If it fails, we can trace back to responsible stories via reverse file mapping. Best balance of safety vs speed.
|
|
316
|
-
|
|
317
|
-
**Why cache invalidation (Option C for BUG-028) over cache key change (A) or bypass (B):**
|
|
318
|
-
- **Option A (include tier in key):** Works but creates multiple cache entries per story. If story is re-routed 3 times, 3 entries exist. Cache eviction becomes unpredictable.
|
|
319
|
-
- **Option B (bypass when routing set):** Almost all stories have `story.routing` set after first pass, so cache would rarely be used at all — defeats the purpose.
|
|
320
|
-
- **Option C (clear on escalation):** Surgical — one `delete()` call at the exact moment routing changes. Cache works normally for non-escalated stories.
|
|
321
|
-
|
|
322
|
-
## 7. Edge Cases
|
|
323
|
-
|
|
324
|
-
### Partial completion (stalled run)
|
|
325
|
-
|
|
326
|
-
If only 3 of 5 stories pass and nax stalls (remaining stories failed/paused):
|
|
327
|
-
- Deferred regression still runs on the 3 passed stories
|
|
328
|
-
- If regression fails, only the passed stories are candidates for rectification
|
|
329
|
-
- Failed/paused stories are untouched
|
|
330
|
-
|
|
331
|
-
### Stories that touch the same files
|
|
332
|
-
|
|
333
|
-
If story A and story B both modify `src/utils/parser.ts`:
|
|
334
|
-
- Reverse mapping may attribute the same failing test to both stories
|
|
335
|
-
- Rectification should try the **last story that touched the file** first (git log order)
|
|
336
|
-
- If that doesn't fix it, try the other story
|
|
337
|
-
|
|
338
|
-
### No test mapping possible
|
|
339
|
-
|
|
340
|
-
If a failing test can't be mapped to any story's changed files:
|
|
341
|
-
- Log warning: "Unmapped regression — cannot attribute to a specific story"
|
|
342
|
-
- Mark ALL passed stories as needing re-verification
|
|
343
|
-
- This is the worst case but should be rare with good test naming conventions
|
package/docs/tdd/strategies.md
DELETED
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
# TDD Strategies
|
|
2
|
-
|
|
3
|
-
nax supports three test strategies, selectable via `config.tdd.strategy` or per-story override.
|
|
4
|
-
|
|
5
|
-
## Strategy Comparison
|
|
6
|
-
|
|
7
|
-
| Aspect | `three-session-tdd` | `three-session-tdd-lite` | `test-after` |
|
|
8
|
-
|---|---|---|---|
|
|
9
|
-
| **Sessions** | 3 separate sessions | 3 separate sessions | 1 session |
|
|
10
|
-
| **Session 1 (Test Writer)** | Strict isolation — tests only, NO src/ reads, NO stubs | Relaxed — can read src/, create stubs in src/ | ❌ No dedicated test writer |
|
|
11
|
-
| **Session 2 (Implementer)** | Implements against pre-written tests | Same | Implements + writes tests |
|
|
12
|
-
| **Session 3 (Verifier)** | Verifies isolation wasn't violated | Same | ❌ No verifier |
|
|
13
|
-
| **Isolation check** | ✅ Full isolation enforcement | ✅ Full isolation enforcement | ❌ None |
|
|
14
|
-
| **Isolation-violation fallback** | Triggers lite-mode retry | N/A (already lite) | N/A |
|
|
15
|
-
| **Rectification gate** | Checks implementer isolation | ⚡ Skips `verifyImplementerIsolation` | Standard |
|
|
16
|
-
|
|
17
|
-
---
|
|
18
|
-
|
|
19
|
-
## When Each Strategy Is Used
|
|
20
|
-
|
|
21
|
-
Controlled by `config.tdd.strategy`:
|
|
22
|
-
|
|
23
|
-
| Config value | Behaviour |
|
|
24
|
-
|---|---|
|
|
25
|
-
| `"strict"` | Always `three-session-tdd` |
|
|
26
|
-
| `"lite"` | Always `three-session-tdd-lite` |
|
|
27
|
-
| `"off"` | Always `test-after` |
|
|
28
|
-
| `"auto"` | LLM/keyword router decides (see routing rules below) |
|
|
29
|
-
|
|
30
|
-
### Auto-Routing Rules (FEAT-013)
|
|
31
|
-
|
|
32
|
-
`test-after` is **deprecated** from auto mode. Default fallback is now `three-session-tdd-lite`.
|
|
33
|
-
|
|
34
|
-
| Condition | Strategy |
|
|
35
|
-
|---|---|
|
|
36
|
-
| Security / auth logic | `three-session-tdd` |
|
|
37
|
-
| Public API / complex / expert | `three-session-tdd` |
|
|
38
|
-
| UI / layout / CLI / integration / polyglot tags | `three-session-tdd-lite` |
|
|
39
|
-
| Simple / medium (default) | `three-session-tdd-lite` |
|
|
40
|
-
|
|
41
|
-
---
|
|
42
|
-
|
|
43
|
-
## Session Detail
|
|
44
|
-
|
|
45
|
-
### `three-session-tdd` — Full Mode
|
|
46
|
-
|
|
47
|
-
1. **Test Writer** — writes failing tests only. Cannot read src/ files or create any source stubs. Strict isolation enforced by post-session diff check.
|
|
48
|
-
2. **Implementer** — makes all failing tests pass. Works against the test-writer's output.
|
|
49
|
-
3. **Verifier** — confirms isolation: tests were written before implementation, no cheating.
|
|
50
|
-
|
|
51
|
-
If the test writer violates isolation (touches src/), the orchestrator flags it as `isolation-violation` and schedules a lite-mode retry on the next attempt.
|
|
52
|
-
|
|
53
|
-
### `three-session-tdd-lite` — Lite Mode
|
|
54
|
-
|
|
55
|
-
Same 3-session flow, but the test writer prompt is relaxed:
|
|
56
|
-
- **Can read** existing src/ files (needed when importing existing types/interfaces).
|
|
57
|
-
- **Can create minimal stubs** in src/ (empty exports, no logic) to make imports resolve.
|
|
58
|
-
- Implementer isolation check (`verifyImplementerIsolation`) is **skipped** in the rectification gate.
|
|
59
|
-
|
|
60
|
-
Best for: existing codebases where greenfield isolation is impractical, or stories that modify existing modules.
|
|
61
|
-
|
|
62
|
-
### `test-after` — Single Session
|
|
63
|
-
|
|
64
|
-
One Claude Code session writes tests and implements the feature together. No structured TDD flow.
|
|
65
|
-
|
|
66
|
-
- Higher failure rate observed in practice — Claude tends to write tests that are trivially passing or implementation-first.
|
|
67
|
-
- Use only when `tdd.strategy: "off"` or explicitly set per-story.
|
|
68
|
-
|
|
69
|
-
---
|
|
70
|
-
|
|
71
|
-
## Per-Story Override
|
|
72
|
-
|
|
73
|
-
Add `testStrategy` to a story in `prd.json` to override routing:
|
|
74
|
-
|
|
75
|
-
```json
|
|
76
|
-
{
|
|
77
|
-
"userStories": [
|
|
78
|
-
{
|
|
79
|
-
"id": "US-001",
|
|
80
|
-
"testStrategy": "three-session-tdd-lite",
|
|
81
|
-
...
|
|
82
|
-
}
|
|
83
|
-
]
|
|
84
|
-
}
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
Supported values: `"test-after"`, `"three-session-tdd"`, `"three-session-tdd-lite"`.
|
|
88
|
-
|
|
89
|
-
---
|
|
90
|
-
|
|
91
|
-
## Known Issues
|
|
92
|
-
|
|
93
|
-
- **BUG-045:** LLM batch routing bypasses `config.tdd.strategy`. `buildBatchPrompt()` only offers `test-after` and `three-session-tdd` to the LLM — no `three-session-tdd-lite`. The cache hit path returns the LLM decision directly without calling `determineTestStrategy()`, so `tdd.strategy: "lite"` is silently ignored for batch-routed stories. Fix: post-process batch decisions through `determineTestStrategy()`. See `src/routing/strategies/llm.ts:routeBatch()`.
|
|
94
|
-
|
|
95
|
-
---
|
|
96
|
-
|
|
97
|
-
*Last updated: 2026-03-07*
|