devlyn-cli 3.2.0 → 3.3.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/AGENTS.md +2 -2
- package/CLAUDE.md +2 -2
- package/README.md +22 -113
- package/bin/devlyn.js +13 -225
- package/bin/instruction-templates.json +752 -1
- package/bin/instructions.js +101 -17
- package/config/skills/_shared/adapters/grok.md +1 -2
- package/config/skills/_shared/archive_run.py +15 -3
- package/config/skills/_shared/judge-role-evidence.py +21 -1
- package/config/skills/_shared/runtime-principles.md +1 -1
- package/config/skills/_shared/spec-verify-check.py +0 -653
- package/config/skills/_shared/state-phase-write.py +371 -30
- package/config/skills/_shared/task-complete.py +635 -143
- package/config/skills/_shared/terminal-claim-check.py +229 -4
- package/config/skills/_shared/verify-merge-findings.py +93 -2
- package/config/skills/devlyn:ideate/SKILL.md +3 -4
- package/config/skills/devlyn:ideate/references/elicitation.md +2 -35
- package/config/skills/devlyn:ideate/references/from-spec-mode.md +3 -18
- package/config/skills/devlyn:ideate/references/project-mode.md +1 -16
- package/config/skills/devlyn:ideate/references/spec-template.md +0 -2
- package/config/skills/devlyn:queue/SKILL.md +6 -4
- package/config/skills/devlyn:resolve/SKILL.md +16 -25
- package/config/skills/devlyn:resolve/references/free-form-mode.md +0 -14
- package/config/skills/devlyn:resolve/references/outer-loop.md +1 -1
- package/config/skills/devlyn:resolve/references/phases/build-gate.md +1 -1
- package/config/skills/devlyn:resolve/references/phases/cleanup.md +3 -3
- package/config/skills/devlyn:resolve/references/phases/implement.md +1 -1
- package/config/skills/devlyn:resolve/references/phases/probe-derive.md +1 -16
- package/config/skills/devlyn:resolve/references/phases/verify.md +4 -9
- package/config/skills/devlyn:resolve/references/state-schema.md +9 -7
- package/config/skills/devlyn:resolve/references/task-completion.md +46 -37
- package/{config/skills → optional-skills}/code-health-standards/SKILL.md +4 -13
- package/{config/skills → optional-skills}/code-review-standards/SKILL.md +4 -12
- package/{config/skills → optional-skills}/root-cause-analysis/SKILL.md +4 -12
- package/{config/skills → optional-skills}/ui-implementation-standards/SKILL.md +4 -14
- package/package.json +1 -57
- package/benchmark/auto-resolve/BENCHMARK-DESIGN.md +0 -289
- package/benchmark/auto-resolve/BENCHMARK-RESULTS.md +0 -341
- package/benchmark/auto-resolve/README.md +0 -696
- package/benchmark/auto-resolve/RUBRIC.md +0 -177
- package/benchmark/auto-resolve/fixtures/F1-cli-trivial-flag/NOTES.md +0 -34
- package/benchmark/auto-resolve/fixtures/F1-cli-trivial-flag/expected.json +0 -68
- package/benchmark/auto-resolve/fixtures/F1-cli-trivial-flag/metadata.json +0 -10
- package/benchmark/auto-resolve/fixtures/F1-cli-trivial-flag/setup.sh +0 -4
- package/benchmark/auto-resolve/fixtures/F1-cli-trivial-flag/spec.md +0 -44
- package/benchmark/auto-resolve/fixtures/F1-cli-trivial-flag/task.ko.txt +0 -8
- package/benchmark/auto-resolve/fixtures/F1-cli-trivial-flag/task.txt +0 -8
- package/benchmark/auto-resolve/fixtures/F10-persist-write-collision/NOTES.md +0 -68
- package/benchmark/auto-resolve/fixtures/F10-persist-write-collision/expected.json +0 -60
- package/benchmark/auto-resolve/fixtures/F10-persist-write-collision/metadata.json +0 -10
- package/benchmark/auto-resolve/fixtures/F10-persist-write-collision/setup.sh +0 -17
- package/benchmark/auto-resolve/fixtures/F10-persist-write-collision/spec.md +0 -51
- package/benchmark/auto-resolve/fixtures/F10-persist-write-collision/task.txt +0 -9
- package/benchmark/auto-resolve/fixtures/F10-persist-write-collision/verifiers/invalid.js +0 -29
- package/benchmark/auto-resolve/fixtures/F10-persist-write-collision/verifiers/parallel.js +0 -50
- package/benchmark/auto-resolve/fixtures/F11-batch-import-all-or-nothing/NOTES.md +0 -75
- package/benchmark/auto-resolve/fixtures/F11-batch-import-all-or-nothing/expected.json +0 -52
- package/benchmark/auto-resolve/fixtures/F11-batch-import-all-or-nothing/metadata.json +0 -10
- package/benchmark/auto-resolve/fixtures/F11-batch-import-all-or-nothing/setup.sh +0 -171
- package/benchmark/auto-resolve/fixtures/F11-batch-import-all-or-nothing/spec.md +0 -50
- package/benchmark/auto-resolve/fixtures/F11-batch-import-all-or-nothing/task.txt +0 -9
- package/benchmark/auto-resolve/fixtures/F12-webhook-raw-body-signature/NOTES.md +0 -89
- package/benchmark/auto-resolve/fixtures/F12-webhook-raw-body-signature/expected.json +0 -74
- package/benchmark/auto-resolve/fixtures/F12-webhook-raw-body-signature/metadata.json +0 -10
- package/benchmark/auto-resolve/fixtures/F12-webhook-raw-body-signature/setup.sh +0 -251
- package/benchmark/auto-resolve/fixtures/F12-webhook-raw-body-signature/spec.md +0 -57
- package/benchmark/auto-resolve/fixtures/F12-webhook-raw-body-signature/task.txt +0 -13
- package/benchmark/auto-resolve/fixtures/F12-webhook-raw-body-signature/verifiers/replay-malformed-body.js +0 -64
- package/benchmark/auto-resolve/fixtures/F15-frozen-diff-race-review/NOTES.md +0 -104
- package/benchmark/auto-resolve/fixtures/F15-frozen-diff-race-review/expected.json +0 -46
- package/benchmark/auto-resolve/fixtures/F15-frozen-diff-race-review/metadata.json +0 -10
- package/benchmark/auto-resolve/fixtures/F15-frozen-diff-race-review/setup.sh +0 -336
- package/benchmark/auto-resolve/fixtures/F15-frozen-diff-race-review/spec.md +0 -51
- package/benchmark/auto-resolve/fixtures/F15-frozen-diff-race-review/task.txt +0 -9
- package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/NOTES.md +0 -38
- package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/expected.json +0 -64
- package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/metadata.json +0 -10
- package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/setup.sh +0 -32
- package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/spec.md +0 -63
- package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/task.txt +0 -7
- package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/verifiers/exact-success.js +0 -54
- package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/verifiers/no-hardcoded-pricing.js +0 -47
- package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/verifiers/stock-error.js +0 -45
- package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/NOTES.md +0 -57
- package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/expected-pair-plan-registry.json +0 -170
- package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/expected.json +0 -84
- package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/metadata.json +0 -21
- package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/pair-plan.sample-fail.json +0 -214
- package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/pair-plan.sample-pass.json +0 -223
- package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/setup.sh +0 -5
- package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/spec.md +0 -55
- package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/task.txt +0 -14
- package/benchmark/auto-resolve/fixtures/F21-cli-scheduler-priority/NOTES.md +0 -39
- package/benchmark/auto-resolve/fixtures/F21-cli-scheduler-priority/expected.json +0 -62
- package/benchmark/auto-resolve/fixtures/F21-cli-scheduler-priority/metadata.json +0 -10
- package/benchmark/auto-resolve/fixtures/F21-cli-scheduler-priority/setup.sh +0 -2
- package/benchmark/auto-resolve/fixtures/F21-cli-scheduler-priority/spec.md +0 -67
- package/benchmark/auto-resolve/fixtures/F21-cli-scheduler-priority/task.txt +0 -7
- package/benchmark/auto-resolve/fixtures/F21-cli-scheduler-priority/verifiers/error-order.js +0 -55
- package/benchmark/auto-resolve/fixtures/F21-cli-scheduler-priority/verifiers/priority-blocked.js +0 -48
- package/benchmark/auto-resolve/fixtures/F22-cli-ledger-close/NOTES.md +0 -35
- package/benchmark/auto-resolve/fixtures/F22-cli-ledger-close/expected.json +0 -56
- package/benchmark/auto-resolve/fixtures/F22-cli-ledger-close/metadata.json +0 -10
- package/benchmark/auto-resolve/fixtures/F22-cli-ledger-close/setup.sh +0 -2
- package/benchmark/auto-resolve/fixtures/F22-cli-ledger-close/spec.md +0 -64
- package/benchmark/auto-resolve/fixtures/F22-cli-ledger-close/task.txt +0 -7
- package/benchmark/auto-resolve/fixtures/F22-cli-ledger-close/verifiers/conflicting-duplicate.js +0 -34
- package/benchmark/auto-resolve/fixtures/F22-cli-ledger-close/verifiers/idempotent-close.js +0 -41
- package/benchmark/auto-resolve/fixtures/F23-cli-fulfillment-wave/NOTES.md +0 -39
- package/benchmark/auto-resolve/fixtures/F23-cli-fulfillment-wave/expected.json +0 -56
- package/benchmark/auto-resolve/fixtures/F23-cli-fulfillment-wave/metadata.json +0 -10
- package/benchmark/auto-resolve/fixtures/F23-cli-fulfillment-wave/setup.sh +0 -2
- package/benchmark/auto-resolve/fixtures/F23-cli-fulfillment-wave/spec.md +0 -76
- package/benchmark/auto-resolve/fixtures/F23-cli-fulfillment-wave/task.txt +0 -7
- package/benchmark/auto-resolve/fixtures/F23-cli-fulfillment-wave/verifiers/priority-rollback.js +0 -64
- package/benchmark/auto-resolve/fixtures/F23-cli-fulfillment-wave/verifiers/single-warehouse-fefo.js +0 -66
- package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/NOTES.md +0 -40
- package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/expected.json +0 -66
- package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/metadata.json +0 -10
- package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/setup.sh +0 -36
- package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/spec.md +0 -71
- package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/task.txt +0 -7
- package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/verifiers/catalog-source.js +0 -57
- package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/verifiers/exact-success.js +0 -63
- package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/verifiers/stock-error.js +0 -34
- package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/NOTES.md +0 -31
- package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/expected.json +0 -68
- package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/metadata.json +0 -10
- package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/setup.sh +0 -17
- package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/spec.md +0 -68
- package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/task.txt +0 -7
- package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/verifiers/conflicting-duplicate.js +0 -29
- package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/verifiers/exact-payout.js +0 -58
- package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/verifiers/rules-source.js +0 -56
- package/benchmark/auto-resolve/fixtures/F3-backend-contract-risk/NOTES.md +0 -35
- package/benchmark/auto-resolve/fixtures/F3-backend-contract-risk/expected-pair-plan-registry.json +0 -162
- package/benchmark/auto-resolve/fixtures/F3-backend-contract-risk/expected.json +0 -67
- package/benchmark/auto-resolve/fixtures/F3-backend-contract-risk/metadata.json +0 -19
- package/benchmark/auto-resolve/fixtures/F3-backend-contract-risk/setup.sh +0 -4
- package/benchmark/auto-resolve/fixtures/F3-backend-contract-risk/spec.md +0 -55
- package/benchmark/auto-resolve/fixtures/F3-backend-contract-risk/task.txt +0 -9
- package/benchmark/auto-resolve/fixtures/F31-cli-seat-rebalance/NOTES.md +0 -34
- package/benchmark/auto-resolve/fixtures/F31-cli-seat-rebalance/expected.json +0 -57
- package/benchmark/auto-resolve/fixtures/F31-cli-seat-rebalance/metadata.json +0 -10
- package/benchmark/auto-resolve/fixtures/F31-cli-seat-rebalance/setup.sh +0 -2
- package/benchmark/auto-resolve/fixtures/F31-cli-seat-rebalance/spec.md +0 -67
- package/benchmark/auto-resolve/fixtures/F31-cli-seat-rebalance/task.txt +0 -7
- package/benchmark/auto-resolve/fixtures/F31-cli-seat-rebalance/verifiers/duplicate-event-error.js +0 -35
- package/benchmark/auto-resolve/fixtures/F31-cli-seat-rebalance/verifiers/priority-transfer-rollback.js +0 -53
- package/benchmark/auto-resolve/fixtures/F32-cli-subscription-renewal/NOTES.md +0 -38
- package/benchmark/auto-resolve/fixtures/F32-cli-subscription-renewal/expected.json +0 -57
- package/benchmark/auto-resolve/fixtures/F32-cli-subscription-renewal/metadata.json +0 -10
- package/benchmark/auto-resolve/fixtures/F32-cli-subscription-renewal/setup.sh +0 -2
- package/benchmark/auto-resolve/fixtures/F32-cli-subscription-renewal/spec.md +0 -70
- package/benchmark/auto-resolve/fixtures/F32-cli-subscription-renewal/task.txt +0 -3
- package/benchmark/auto-resolve/fixtures/F32-cli-subscription-renewal/verifiers/duplicate-renewal-error.js +0 -42
- package/benchmark/auto-resolve/fixtures/F32-cli-subscription-renewal/verifiers/priority-credit-rollback.js +0 -70
- package/benchmark/auto-resolve/fixtures/F4-web-browser-design/NOTES.md +0 -47
- package/benchmark/auto-resolve/fixtures/F4-web-browser-design/expected.json +0 -57
- package/benchmark/auto-resolve/fixtures/F4-web-browser-design/metadata.json +0 -10
- package/benchmark/auto-resolve/fixtures/F4-web-browser-design/setup.sh +0 -6
- package/benchmark/auto-resolve/fixtures/F4-web-browser-design/spec.md +0 -48
- package/benchmark/auto-resolve/fixtures/F4-web-browser-design/task.txt +0 -9
- package/benchmark/auto-resolve/fixtures/F5-fix-loop-red-green/NOTES.md +0 -45
- package/benchmark/auto-resolve/fixtures/F5-fix-loop-red-green/expected.json +0 -65
- package/benchmark/auto-resolve/fixtures/F5-fix-loop-red-green/metadata.json +0 -10
- package/benchmark/auto-resolve/fixtures/F5-fix-loop-red-green/setup.sh +0 -55
- package/benchmark/auto-resolve/fixtures/F5-fix-loop-red-green/spec.md +0 -48
- package/benchmark/auto-resolve/fixtures/F5-fix-loop-red-green/task.txt +0 -7
- package/benchmark/auto-resolve/fixtures/F6-dep-audit-native-module/NOTES.md +0 -43
- package/benchmark/auto-resolve/fixtures/F6-dep-audit-native-module/expected.json +0 -77
- package/benchmark/auto-resolve/fixtures/F6-dep-audit-native-module/metadata.json +0 -10
- package/benchmark/auto-resolve/fixtures/F6-dep-audit-native-module/setup.sh +0 -4
- package/benchmark/auto-resolve/fixtures/F6-dep-audit-native-module/spec.md +0 -48
- package/benchmark/auto-resolve/fixtures/F6-dep-audit-native-module/task.txt +0 -10
- package/benchmark/auto-resolve/fixtures/F7-out-of-scope-trap/NOTES.md +0 -57
- package/benchmark/auto-resolve/fixtures/F7-out-of-scope-trap/expected.json +0 -76
- package/benchmark/auto-resolve/fixtures/F7-out-of-scope-trap/metadata.json +0 -10
- package/benchmark/auto-resolve/fixtures/F7-out-of-scope-trap/setup.sh +0 -36
- package/benchmark/auto-resolve/fixtures/F7-out-of-scope-trap/spec.md +0 -45
- package/benchmark/auto-resolve/fixtures/F7-out-of-scope-trap/task.txt +0 -7
- package/benchmark/auto-resolve/fixtures/F8-known-limit-ambiguous/NOTES.md +0 -53
- package/benchmark/auto-resolve/fixtures/F8-known-limit-ambiguous/expected.json +0 -63
- package/benchmark/auto-resolve/fixtures/F8-known-limit-ambiguous/metadata.json +0 -10
- package/benchmark/auto-resolve/fixtures/F8-known-limit-ambiguous/setup.sh +0 -4
- package/benchmark/auto-resolve/fixtures/F8-known-limit-ambiguous/spec.md +0 -48
- package/benchmark/auto-resolve/fixtures/F8-known-limit-ambiguous/task.txt +0 -1
- package/benchmark/auto-resolve/fixtures/F9-e2e-ideate-to-resolve/NOTES.md +0 -105
- package/benchmark/auto-resolve/fixtures/F9-e2e-ideate-to-resolve/expected.json +0 -74
- package/benchmark/auto-resolve/fixtures/F9-e2e-ideate-to-resolve/metadata.json +0 -10
- package/benchmark/auto-resolve/fixtures/F9-e2e-ideate-to-resolve/setup.sh +0 -28
- package/benchmark/auto-resolve/fixtures/F9-e2e-ideate-to-resolve/spec.md +0 -59
- package/benchmark/auto-resolve/fixtures/F9-e2e-ideate-to-resolve/task.txt +0 -5
- package/benchmark/auto-resolve/fixtures/SCHEMA.md +0 -188
- package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/NOTES.md +0 -37
- package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/RETIRED.md +0 -13
- package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/expected.json +0 -56
- package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/metadata.json +0 -10
- package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/setup.sh +0 -18
- package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/spec.md +0 -69
- package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/task.txt +0 -7
- package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/verifiers/exact-proration.js +0 -48
- package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/verifiers/rules-source-and-conflict.js +0 -79
- package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/NOTES.md +0 -54
- package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/RETIRED.md +0 -7
- package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/expected.json +0 -67
- package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/metadata.json +0 -10
- package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/setup.sh +0 -2
- package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/spec.md +0 -67
- package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/task.txt +0 -5
- package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/verifiers/policy-precedence.js +0 -72
- package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/verifiers/validation-and-immutability.js +0 -43
- package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/verifiers/validation-boundary.js +0 -116
- package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/NOTES.md +0 -35
- package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/RETIRED.md +0 -12
- package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/expected.json +0 -58
- package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/metadata.json +0 -10
- package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/setup.sh +0 -2
- package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/spec.md +0 -73
- package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/task.txt +0 -17
- package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/verifiers/mixed-idempotent-settlement.js +0 -53
- package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/verifiers/rejection-boundaries.js +0 -74
- package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/NOTES.md +0 -28
- package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/RETIRED.md +0 -15
- package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/expected.json +0 -57
- package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/metadata.json +0 -10
- package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/setup.sh +0 -50
- package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/spec.md +0 -59
- package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/task.txt +0 -9
- package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/verifiers/ordered-settlement.js +0 -88
- package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/verifiers/reject-invalid.js +0 -45
- package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/NOTES.md +0 -30
- package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/RETIRED.md +0 -16
- package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/expected.json +0 -64
- package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/metadata.json +0 -10
- package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/setup.sh +0 -21
- package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/spec.md +0 -58
- package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/task.txt +0 -9
- package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/verifiers/dup-op.js +0 -54
- package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/verifiers/priority-apply.js +0 -82
- package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/verifiers/rollback.js +0 -77
- package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/NOTES.md +0 -99
- package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/RETIRED.md +0 -18
- package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/expected.json +0 -64
- package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/metadata.json +0 -10
- package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/setup.sh +0 -4
- package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/spec.md +0 -61
- package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/task.txt +0 -9
- package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/verifiers/correctness-small.js +0 -135
- package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/verifiers/scale.js +0 -100
- package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/verifiers/validation.js +0 -75
- package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/NOTES.md +0 -93
- package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/RETIRED.md +0 -16
- package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/expected.json +0 -65
- package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/metadata.json +0 -10
- package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/setup.sh +0 -18
- package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/spec.md +0 -66
- package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/task.txt +0 -9
- package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/verifiers/correctness-small.js +0 -84
- package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/verifiers/scale.js +0 -184
- package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/verifiers/validation.js +0 -74
- package/benchmark/auto-resolve/fixtures/retired/F9-e2e-ideate-to-preflight/NOTES.md +0 -60
- package/benchmark/auto-resolve/fixtures/retired/F9-e2e-ideate-to-preflight/RETIRED.md +0 -29
- package/benchmark/auto-resolve/fixtures/retired/F9-e2e-ideate-to-preflight/expected.json +0 -73
- package/benchmark/auto-resolve/fixtures/retired/F9-e2e-ideate-to-preflight/metadata.json +0 -10
- package/benchmark/auto-resolve/fixtures/retired/F9-e2e-ideate-to-preflight/setup.sh +0 -28
- package/benchmark/auto-resolve/fixtures/retired/F9-e2e-ideate-to-preflight/spec.md +0 -58
- package/benchmark/auto-resolve/fixtures/retired/F9-e2e-ideate-to-preflight/task.txt +0 -5
- package/benchmark/auto-resolve/fixtures/test-repo/README.md +0 -12
- package/benchmark/auto-resolve/fixtures/test-repo/bin/cli.js +0 -63
- package/benchmark/auto-resolve/fixtures/test-repo/package-lock.json +0 -823
- package/benchmark/auto-resolve/fixtures/test-repo/package.json +0 -22
- package/benchmark/auto-resolve/fixtures/test-repo/playwright.config.js +0 -17
- package/benchmark/auto-resolve/fixtures/test-repo/server/index.js +0 -37
- package/benchmark/auto-resolve/fixtures/test-repo/tests/cli.test.js +0 -25
- package/benchmark/auto-resolve/fixtures/test-repo/tests/server.test.js +0 -58
- package/benchmark/auto-resolve/fixtures/test-repo/web/index.html +0 -37
- package/benchmark/auto-resolve/results/20260507-f10-f11-tier1-full-pipeline/headroom-gate.json +0 -25
- package/benchmark/auto-resolve/results/20260507-f10-f11-tier1-full-pipeline/headroom-gate.md +0 -10
- package/benchmark/auto-resolve/results/20260508-f22-exact-error-headroom/headroom-gate.json +0 -18
- package/benchmark/auto-resolve/results/20260508-f22-exact-error-headroom/headroom-gate.md +0 -9
- package/benchmark/auto-resolve/results/20260508-f26-headroom/headroom-gate.json +0 -18
- package/benchmark/auto-resolve/results/20260508-f26-headroom/headroom-gate.md +0 -9
- package/benchmark/auto-resolve/results/20260510-f16-f23-f25-combined-proof/F16-cli-quote-tax-rules/l2_risk_probes/result.json +0 -28
- package/benchmark/auto-resolve/results/20260510-f16-f23-f25-combined-proof/F23-cli-fulfillment-wave/l2_risk_probes/result.json +0 -28
- package/benchmark/auto-resolve/results/20260510-f16-f23-f25-combined-proof/F25-cli-cart-promotion-rules/l2_risk_probes/result.json +0 -30
- package/benchmark/auto-resolve/results/20260510-f16-f23-f25-combined-proof/full-pipeline-pair-gate.json +0 -82
- package/benchmark/auto-resolve/results/20260510-f16-f23-f25-combined-proof/full-pipeline-pair-gate.md +0 -18
- package/benchmark/auto-resolve/results/20260510-f16-f23-f25-combined-proof/headroom-gate.json +0 -46
- package/benchmark/auto-resolve/results/20260510-f16-f23-f25-combined-proof/headroom-gate.md +0 -17
- package/benchmark/auto-resolve/results/20260511-f12-webhook-headroom/headroom-gate.json +0 -28
- package/benchmark/auto-resolve/results/20260511-f12-webhook-headroom/headroom-gate.md +0 -15
- package/benchmark/auto-resolve/results/20260511-f15-concurrency-headroom/headroom-gate.json +0 -28
- package/benchmark/auto-resolve/results/20260511-f15-concurrency-headroom/headroom-gate.md +0 -15
- package/benchmark/auto-resolve/results/20260511-f21-current-riskprobes-v1/F21-cli-scheduler-priority/l2_risk_probes/result.json +0 -32
- package/benchmark/auto-resolve/results/20260511-f21-current-riskprobes-v1/full-pipeline-pair-gate.json +0 -44
- package/benchmark/auto-resolve/results/20260511-f21-current-riskprobes-v1/full-pipeline-pair-gate.md +0 -16
- package/benchmark/auto-resolve/results/20260511-f21-current-riskprobes-v1/headroom-gate.json +0 -18
- package/benchmark/auto-resolve/results/20260511-f21-current-riskprobes-v1/headroom-gate.md +0 -9
- package/benchmark/auto-resolve/results/20260511-f3-http-error-headroom/headroom-gate.json +0 -28
- package/benchmark/auto-resolve/results/20260511-f3-http-error-headroom/headroom-gate.md +0 -15
- package/benchmark/auto-resolve/results/20260512-f2-medium-headroom/headroom-gate.json +0 -28
- package/benchmark/auto-resolve/results/20260512-f2-medium-headroom/headroom-gate.md +0 -15
- package/benchmark/auto-resolve/results/20260512-f31-seat-rebalance-headroom/headroom-gate.json +0 -28
- package/benchmark/auto-resolve/results/20260512-f31-seat-rebalance-headroom/headroom-gate.md +0 -15
- package/benchmark/auto-resolve/results/20260512-f32-subscription-renewal-headroom/headroom-gate.json +0 -28
- package/benchmark/auto-resolve/results/20260512-f32-subscription-renewal-headroom/headroom-gate.md +0 -15
- package/benchmark/auto-resolve/results/20260512-f4-web-headroom/headroom-gate.json +0 -28
- package/benchmark/auto-resolve/results/20260512-f4-web-headroom/headroom-gate.md +0 -15
- package/benchmark/auto-resolve/results/20260512-f5-fixloop-headroom/headroom-gate.json +0 -28
- package/benchmark/auto-resolve/results/20260512-f5-fixloop-headroom/headroom-gate.md +0 -15
- package/benchmark/auto-resolve/results/20260512-f6-checksum-headroom/headroom-gate.json +0 -28
- package/benchmark/auto-resolve/results/20260512-f6-checksum-headroom/headroom-gate.md +0 -15
- package/benchmark/auto-resolve/results/20260512-f7-scope-headroom/headroom-gate.json +0 -28
- package/benchmark/auto-resolve/results/20260512-f7-scope-headroom/headroom-gate.md +0 -15
- package/benchmark/auto-resolve/results/20260512-f9-e2e-headroom/headroom-gate.json +0 -28
- package/benchmark/auto-resolve/results/20260512-f9-e2e-headroom/headroom-gate.md +0 -15
- package/benchmark/auto-resolve/run-real-benchmark.md +0 -303
- package/benchmark/auto-resolve/scripts/audit-headroom-rejections.py +0 -441
- package/benchmark/auto-resolve/scripts/audit-pair-evidence.py +0 -1256
- package/benchmark/auto-resolve/scripts/build-pair-eligible-manifest.py +0 -306
- package/benchmark/auto-resolve/scripts/check-f9-artifacts.py +0 -268
- package/benchmark/auto-resolve/scripts/collect-swebench-predictions.py +0 -108
- package/benchmark/auto-resolve/scripts/compile-report.py +0 -493
- package/benchmark/auto-resolve/scripts/fetch-swebench-instances.py +0 -129
- package/benchmark/auto-resolve/scripts/frozen-verify-gate.py +0 -434
- package/benchmark/auto-resolve/scripts/full-pipeline-pair-gate.py +0 -612
- package/benchmark/auto-resolve/scripts/headroom-gate.py +0 -378
- package/benchmark/auto-resolve/scripts/iter-0033c-compare.py +0 -683
- package/benchmark/auto-resolve/scripts/iter-0033c-l1-summary.py +0 -97
- package/benchmark/auto-resolve/scripts/judge-opus-pass.sh +0 -542
- package/benchmark/auto-resolve/scripts/judge.sh +0 -565
- package/benchmark/auto-resolve/scripts/oracle-scope-tier-a.py +0 -256
- package/benchmark/auto-resolve/scripts/oracle-scope-tier-b.py +0 -287
- package/benchmark/auto-resolve/scripts/oracle-test-fidelity.py +0 -328
- package/benchmark/auto-resolve/scripts/pair-candidate-frontier.py +0 -469
- package/benchmark/auto-resolve/scripts/pair-plan-idgen.py +0 -401
- package/benchmark/auto-resolve/scripts/pair-plan-lint.py +0 -475
- package/benchmark/auto-resolve/scripts/pair-rejected-fixtures.sh +0 -103
- package/benchmark/auto-resolve/scripts/pair_evidence_contract.py +0 -270
- package/benchmark/auto-resolve/scripts/prepare-swebench-frozen-case.py +0 -273
- package/benchmark/auto-resolve/scripts/prepare-swebench-frozen-corpus.py +0 -148
- package/benchmark/auto-resolve/scripts/prepare-swebench-solver-worktree.py +0 -210
- package/benchmark/auto-resolve/scripts/recent-benchmark-summary.py +0 -232
- package/benchmark/auto-resolve/scripts/run-fixture.sh +0 -1024
- package/benchmark/auto-resolve/scripts/run-frozen-verify-pair.sh +0 -683
- package/benchmark/auto-resolve/scripts/run-full-pipeline-pair-candidate.sh +0 -458
- package/benchmark/auto-resolve/scripts/run-headroom-candidate.sh +0 -336
- package/benchmark/auto-resolve/scripts/run-iter-0033c.sh +0 -208
- package/benchmark/auto-resolve/scripts/run-suite.sh +0 -251
- package/benchmark/auto-resolve/scripts/run-swebench-frozen-corpus.sh +0 -310
- package/benchmark/auto-resolve/scripts/run-swebench-solver-batch.sh +0 -257
- package/benchmark/auto-resolve/scripts/ship-gate.py +0 -391
- package/benchmark/auto-resolve/scripts/solo-ceiling-avoidance.py +0 -53
- package/benchmark/auto-resolve/scripts/solo-headroom-hypothesis.py +0 -77
- package/benchmark/auto-resolve/scripts/swebench-frozen-matrix.py +0 -478
- package/benchmark/auto-resolve/scripts/test-audit-headroom-rejections.sh +0 -288
- package/benchmark/auto-resolve/scripts/test-audit-pair-evidence.sh +0 -1672
- package/benchmark/auto-resolve/scripts/test-benchmark-arg-parsing.sh +0 -1015
- package/benchmark/auto-resolve/scripts/test-build-pair-eligible-manifest.sh +0 -491
- package/benchmark/auto-resolve/scripts/test-check-f9-artifacts.sh +0 -91
- package/benchmark/auto-resolve/scripts/test-frozen-verify-gate.sh +0 -517
- package/benchmark/auto-resolve/scripts/test-full-pipeline-pair-gate.sh +0 -610
- package/benchmark/auto-resolve/scripts/test-headroom-gate.sh +0 -401
- package/benchmark/auto-resolve/scripts/test-iter-0033c-compare.sh +0 -525
- package/benchmark/auto-resolve/scripts/test-iter-0033c-l1-summary.sh +0 -254
- package/benchmark/auto-resolve/scripts/test-lint-fixtures.sh +0 -580
- package/benchmark/auto-resolve/scripts/test-pair-candidate-frontier.sh +0 -591
- package/benchmark/auto-resolve/scripts/test-run-full-pipeline-pair-candidate.sh +0 -497
- package/benchmark/auto-resolve/scripts/test-run-headroom-candidate.sh +0 -401
- package/benchmark/auto-resolve/scripts/test-run-swebench-solver-batch.sh +0 -111
- package/benchmark/auto-resolve/scripts/test-ship-gate.sh +0 -1189
- package/benchmark/auto-resolve/scripts/test-swebench-frozen-case.sh +0 -1221
- package/benchmark/auto-resolve/shadow-fixtures/S1-cli-lang-flag/NOTES.md +0 -28
- package/benchmark/auto-resolve/shadow-fixtures/S1-cli-lang-flag/expected.json +0 -63
- package/benchmark/auto-resolve/shadow-fixtures/S1-cli-lang-flag/metadata.json +0 -10
- package/benchmark/auto-resolve/shadow-fixtures/S1-cli-lang-flag/setup.sh +0 -3
- package/benchmark/auto-resolve/shadow-fixtures/S1-cli-lang-flag/spec.md +0 -47
- package/benchmark/auto-resolve/shadow-fixtures/S1-cli-lang-flag/task.txt +0 -1
- package/benchmark/auto-resolve/shadow-fixtures/S2-cli-inventory-reservation/NOTES.md +0 -34
- package/benchmark/auto-resolve/shadow-fixtures/S2-cli-inventory-reservation/expected.json +0 -53
- package/benchmark/auto-resolve/shadow-fixtures/S2-cli-inventory-reservation/metadata.json +0 -10
- package/benchmark/auto-resolve/shadow-fixtures/S2-cli-inventory-reservation/setup.sh +0 -3
- package/benchmark/auto-resolve/shadow-fixtures/S2-cli-inventory-reservation/spec.md +0 -50
- package/benchmark/auto-resolve/shadow-fixtures/S2-cli-inventory-reservation/task.txt +0 -1
- package/benchmark/auto-resolve/shadow-fixtures/S2-cli-inventory-reservation/verifiers/duplicate-order-error.js +0 -27
- package/benchmark/auto-resolve/shadow-fixtures/S2-cli-inventory-reservation/verifiers/priority-stock-reservation.js +0 -44
- package/benchmark/auto-resolve/shadow-fixtures/S3-cli-ticket-assignment/NOTES.md +0 -34
- package/benchmark/auto-resolve/shadow-fixtures/S3-cli-ticket-assignment/expected.json +0 -55
- package/benchmark/auto-resolve/shadow-fixtures/S3-cli-ticket-assignment/metadata.json +0 -10
- package/benchmark/auto-resolve/shadow-fixtures/S3-cli-ticket-assignment/setup.sh +0 -3
- package/benchmark/auto-resolve/shadow-fixtures/S3-cli-ticket-assignment/spec.md +0 -52
- package/benchmark/auto-resolve/shadow-fixtures/S3-cli-ticket-assignment/task.txt +0 -1
- package/benchmark/auto-resolve/shadow-fixtures/S3-cli-ticket-assignment/verifiers/duplicate-ticket-error.js +0 -29
- package/benchmark/auto-resolve/shadow-fixtures/S3-cli-ticket-assignment/verifiers/priority-agent-assignment.js +0 -48
- package/benchmark/auto-resolve/shadow-fixtures/S4-cli-return-routing/NOTES.md +0 -34
- package/benchmark/auto-resolve/shadow-fixtures/S4-cli-return-routing/expected.json +0 -55
- package/benchmark/auto-resolve/shadow-fixtures/S4-cli-return-routing/metadata.json +0 -10
- package/benchmark/auto-resolve/shadow-fixtures/S4-cli-return-routing/setup.sh +0 -3
- package/benchmark/auto-resolve/shadow-fixtures/S4-cli-return-routing/spec.md +0 -55
- package/benchmark/auto-resolve/shadow-fixtures/S4-cli-return-routing/task.txt +0 -1
- package/benchmark/auto-resolve/shadow-fixtures/S4-cli-return-routing/verifiers/duplicate-return-error.js +0 -43
- package/benchmark/auto-resolve/shadow-fixtures/S4-cli-return-routing/verifiers/priority-return-routing.js +0 -70
- package/benchmark/auto-resolve/shadow-fixtures/S5-cli-credit-grant-ledger/NOTES.md +0 -37
- package/benchmark/auto-resolve/shadow-fixtures/S5-cli-credit-grant-ledger/expected.json +0 -54
- package/benchmark/auto-resolve/shadow-fixtures/S5-cli-credit-grant-ledger/metadata.json +0 -10
- package/benchmark/auto-resolve/shadow-fixtures/S5-cli-credit-grant-ledger/setup.sh +0 -3
- package/benchmark/auto-resolve/shadow-fixtures/S5-cli-credit-grant-ledger/spec.md +0 -59
- package/benchmark/auto-resolve/shadow-fixtures/S5-cli-credit-grant-ledger/task.txt +0 -1
- package/benchmark/auto-resolve/shadow-fixtures/S5-cli-credit-grant-ledger/verifiers/credit-ledger-priority.js +0 -98
- package/benchmark/auto-resolve/shadow-fixtures/S5-cli-credit-grant-ledger/verifiers/duplicate-charge-error.js +0 -38
- package/benchmark/auto-resolve/shadow-fixtures/S6-cli-refund-window-ledger/NOTES.md +0 -36
- package/benchmark/auto-resolve/shadow-fixtures/S6-cli-refund-window-ledger/expected.json +0 -56
- package/benchmark/auto-resolve/shadow-fixtures/S6-cli-refund-window-ledger/metadata.json +0 -10
- package/benchmark/auto-resolve/shadow-fixtures/S6-cli-refund-window-ledger/setup.sh +0 -3
- package/benchmark/auto-resolve/shadow-fixtures/S6-cli-refund-window-ledger/spec.md +0 -59
- package/benchmark/auto-resolve/shadow-fixtures/S6-cli-refund-window-ledger/task.txt +0 -1
- package/benchmark/auto-resolve/shadow-fixtures/S6-cli-refund-window-ledger/verifiers/duplicate-refund-error.js +0 -41
- package/benchmark/auto-resolve/shadow-fixtures/S6-cli-refund-window-ledger/verifiers/priority-refund-ledger.js +0 -65
- package/config/skills/_shared/pair-plan-schema.md +0 -298
- package/scripts/lint-fixtures.sh +0 -352
- package/scripts/lint-shadow-fixtures.sh +0 -58
- package/scripts/lint-skills.sh +0 -4265
- package/scripts/test-owner-phases.py +0 -193
|
@@ -1,177 +0,0 @@
|
|
|
1
|
-
# Benchmark Judge Rubric
|
|
2
|
-
|
|
3
|
-
Stable across model upgrades. This file is the single source of truth for how
|
|
4
|
-
arms are scored and how ship gates evaluate a run. Do not change the rubric
|
|
5
|
-
during a benchmarking window — changing it invalidates comparability with
|
|
6
|
-
prior `history/runs/`.
|
|
7
|
-
|
|
8
|
-
**Outer goal lives in [`autoresearch/NORTH-STAR.md`](../../autoresearch/NORTH-STAR.md).** The release-decision layer (L0 / L1 / L2 contracts, wall-time efficiency, pair-cost justification) sits on top of the per-arm scoring rules below. When NORTH-STAR.md adds a release-gate number that this file did not have, the new number applies — open a doc-fix iter to mirror it here.
|
|
9
|
-
|
|
10
|
-
## Scoring — 4 axes, 25 points each, 100 total
|
|
11
|
-
|
|
12
|
-
The blind judge scores all submitted arms on identical axes without knowing
|
|
13
|
-
which label maps to which arm.
|
|
14
|
-
|
|
15
|
-
### Axis 1 — Spec Compliance (0-25)
|
|
16
|
-
|
|
17
|
-
Does this implementation satisfy every Requirements bullet in `spec.md`?
|
|
18
|
-
Does every Verification command behave as the spec states?
|
|
19
|
-
|
|
20
|
-
- **25** — All Requirements satisfied. All Verification commands would pass.
|
|
21
|
-
- **19-24** — 90%+ coverage, minor omissions.
|
|
22
|
-
- **13-18** — Partial implementation or verification gaps.
|
|
23
|
-
- **7-12** — Major requirements missed.
|
|
24
|
-
- **0-6** — Does not address the core task.
|
|
25
|
-
|
|
26
|
-
Mechanical cap: after the blind judge returns, `judge.sh` caps total score at
|
|
27
|
-
`floor(100 * verify_score)` and caps the Spec Compliance axis at
|
|
28
|
-
`floor(25 * verify_score)`. This makes the machine-readable acceptance
|
|
29
|
-
contract binding when a judge grades prose generously despite failed required
|
|
30
|
-
verification commands.
|
|
31
|
-
|
|
32
|
-
### Axis 2 — Constraint Respect (0-25)
|
|
33
|
-
|
|
34
|
-
Zero new npm deps (unless spec allows), no silent catches (`try { } catch { return fallback }`), no `any`/`@ts-ignore`, explicit HOME/env guards where required, EACCES-specific handling, no hardcoded values that should be configurable.
|
|
35
|
-
|
|
36
|
-
- Each **disqualifier-severity forbidden_pattern match** or explicit constraint violation = −4 points, minimum 0.
|
|
37
|
-
|
|
38
|
-
### Axis 3 — Scope Discipline (0-25)
|
|
39
|
-
|
|
40
|
-
Out of Scope respected. No gratuitous refactors of unrelated code. No "while I'm here" additions. No opportunistic upgrades.
|
|
41
|
-
|
|
42
|
-
- Each out-of-scope change = −5 points, minimum 0.
|
|
43
|
-
|
|
44
|
-
### Axis 4 — Code Quality (0-25)
|
|
45
|
-
|
|
46
|
-
Readable, idiomatic for the language/framework, helpful error messages, appropriate abstraction level (not under- or over-engineered), uses standard library primitives where available (e.g., `fs.accessSync` over mode-bit checks per CLAUDE.md `phase-3-critic.md:32` calibration).
|
|
47
|
-
|
|
48
|
-
- This axis is judge-calibrated; no deterministic grading. The judge looks at
|
|
49
|
-
naming, function/file decomposition, error handling, and comparability to
|
|
50
|
-
idiomatic peer code.
|
|
51
|
-
|
|
52
|
-
---
|
|
53
|
-
|
|
54
|
-
## Judge Disqualifiers (hard floor)
|
|
55
|
-
|
|
56
|
-
Any of these produces `disqualifier: true` on the arm, overriding score:
|
|
57
|
-
|
|
58
|
-
- Silent-catch pattern in diff.
|
|
59
|
-
- Fabricated verification (code that claims to pass without actually running).
|
|
60
|
-
- Skipped a required test file that the spec names.
|
|
61
|
-
- Created a file listed in `expected.forbidden_files`.
|
|
62
|
-
- Exceeded `expected.max_deps_added`.
|
|
63
|
-
- `@ts-ignore` / `eslint-disable` without scoped justification comment.
|
|
64
|
-
- Hardcoded paths or values where spec required configurability.
|
|
65
|
-
|
|
66
|
-
Disqualifier arms automatically lose the fixture regardless of score.
|
|
67
|
-
|
|
68
|
-
---
|
|
69
|
-
|
|
70
|
-
## Ship Gates
|
|
71
|
-
|
|
72
|
-
After the judge finishes every fixture, `scripts/ship-gate.py` applies these
|
|
73
|
-
rules to the run's `summary.json`.
|
|
74
|
-
|
|
75
|
-
This section describes the broad run-suite ship gate. Current solo<pair
|
|
76
|
-
evidence uses the full-pipeline pair gate with an explicit selected pair arm
|
|
77
|
-
(`l2_risk_probes` for proof runs, `l2_gated` for diagnostics), and that gate
|
|
78
|
-
compares the selected pair arm against `solo_claude`.
|
|
79
|
-
|
|
80
|
-
### Hard floors (any one failure blocks ship)
|
|
81
|
-
|
|
82
|
-
1. **No disqualifier-level violation** in any gated harness arm (legacy suite `variant`/L2 and `solo_claude`/L1 when present).
|
|
83
|
-
2. **F9 (E2E) must PASS** — novice-flow contract.
|
|
84
|
-
3. **At least 7 gated, headroom-available fixtures** must have the required margin ≥ +5 for each gated contract — legacy `variant`-`bare` (L2-L0) for the suite gate, and `solo_claude`-`bare` (L1-L0) when `solo_claude` is present. This is **headroom-aware** (added 2026-05-02 per iter-0033 R4 + NORTH-STAR amendment): a fixture is excluded from a contract count when the lower arm is ceiling-near and the higher arm is clean at ceiling. Excluded fixtures become fixture-rotation candidates per the policy below if the two-shipped-version rule is met.
|
|
85
|
-
4. **No fixture regression worse than −5** vs. last `baselines/shipped.json` on the same fixture.
|
|
86
|
-
|
|
87
|
-
### Soft gates (produce WARNING but do not block)
|
|
88
|
-
|
|
89
|
-
5. Suite average margin drop > 3 vs. last shipped.
|
|
90
|
-
6. A fixture that previously had margin > +5 now has margin ≤ 0.
|
|
91
|
-
7. Critical-finding catch-rate decrease vs. the last shipped gated harness arm.
|
|
92
|
-
|
|
93
|
-
### Known-limit exception
|
|
94
|
-
|
|
95
|
-
- **F8-known-limit-ambiguous** is excluded from gates 3 and 4. It exists to
|
|
96
|
-
document where the harness may not beat bare. Its allowed margin range is
|
|
97
|
-
[-3, +3]. Margins outside this range trigger a WARNING regardless of sign
|
|
98
|
-
(too-good means the fixture is no longer a known limit; too-bad means we
|
|
99
|
-
shipped a regression somewhere else that this fixture caught).
|
|
100
|
-
|
|
101
|
-
---
|
|
102
|
-
|
|
103
|
-
## Run Record
|
|
104
|
-
|
|
105
|
-
Every suite run appends an immutable record to `history/runs/<ts>-<label>.json`:
|
|
106
|
-
|
|
107
|
-
```json
|
|
108
|
-
{
|
|
109
|
-
"run_id": "2026-04-23T12:00:00Z-v3.6",
|
|
110
|
-
"version_label": "v3.6",
|
|
111
|
-
"git_sha": "fdb7428...",
|
|
112
|
-
"branch": "benchmark/v3.6-ab-...",
|
|
113
|
-
"n_per_fixture": 1,
|
|
114
|
-
"judge_model": "<recorded from ~/.codex/config.toml at run time; do not hardcode>",
|
|
115
|
-
"judge_effort": "xhigh",
|
|
116
|
-
"fixtures": [
|
|
117
|
-
{
|
|
118
|
-
"id": "F2-cli-medium-subcommand",
|
|
119
|
-
"variant": { "score": 92, "wall_s": 707, "tokens_agg": 108852, "disqualifier": false,
|
|
120
|
-
"axes": {"spec": 23, "constraint": 23, "scope": 24, "quality": 22} },
|
|
121
|
-
"bare": { "score": 81, "wall_s": 101, "tokens_agg": 55588, "disqualifier": false,
|
|
122
|
-
"axes": {"spec": 19, "constraint": 19, "scope": 20, "quality": 23} },
|
|
123
|
-
"winner": "variant",
|
|
124
|
-
"margin": 11,
|
|
125
|
-
"critical_findings": {
|
|
126
|
-
"variant": [],
|
|
127
|
-
"bare": ["silent catch in findSkillMdFiles (no-silent-catches violation)"]
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
],
|
|
131
|
-
"suite": {
|
|
132
|
-
"fixtures_run": 9,
|
|
133
|
-
"variant_avg": 89.3,
|
|
134
|
-
"bare_avg": 75.0,
|
|
135
|
-
"margin_avg": 14.3,
|
|
136
|
-
"hard_floor_violations": 0,
|
|
137
|
-
"ship_gate": "PASS"
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
---
|
|
143
|
-
|
|
144
|
-
## Fixture Rotation Policy
|
|
145
|
-
|
|
146
|
-
If any fixture has all compared gated arms scoring > 95 for two consecutive
|
|
147
|
-
shipped versions, it's saturated and no longer differentiates. Replace with a
|
|
148
|
-
harder equivalent and record the swap in
|
|
149
|
-
`history/runs/<ts>-fixture-rotation.json`:
|
|
150
|
-
|
|
151
|
-
```json
|
|
152
|
-
{
|
|
153
|
-
"retired": "F1-cli-trivial-flag",
|
|
154
|
-
"retired_reason": "all compared gated arms > 95 on v3.7 and v3.8 (saturation)",
|
|
155
|
-
"replacement": "F1b-cli-trivial-flag-v2",
|
|
156
|
-
"replacement_rationale": "adds exit-code precedence requirement that current leaders didn't handle on first try"
|
|
157
|
-
}
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
Retired fixtures stay in `fixtures/retired/` for replay if a regression is
|
|
161
|
-
suspected in their area.
|
|
162
|
-
|
|
163
|
-
---
|
|
164
|
-
|
|
165
|
-
## Why These Thresholds
|
|
166
|
-
|
|
167
|
-
- **+5 margin floor** — below this, the gated harness arm is not reliably
|
|
168
|
-
beating its lower baseline given judge variance (empirically ~±3 per axis).
|
|
169
|
-
For the legacy suite that is `variant` over `bare`; for pair evidence it is
|
|
170
|
-
the selected pair arm over `solo_claude`. Worth paying pipeline cost requires
|
|
171
|
-
margin clearly above noise.
|
|
172
|
-
- **−5 regression floor** — one-axis regression can look like −5; allowing
|
|
173
|
-
less would let real regressions slip through.
|
|
174
|
-
- **7-fixture coverage floor** — requires a broad enough set of
|
|
175
|
-
headroom-available, non-known-limit fixtures to clear the margin floor. This
|
|
176
|
-
preserves the original core-suite coverage bar without pretending the current
|
|
177
|
-
extended fixture inventory is still exactly nine fixtures.
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
# F1 — Notes
|
|
2
|
-
|
|
3
|
-
## Purpose
|
|
4
|
-
|
|
5
|
-
Trivial-tier calibration. Every arm should one-shot this; it's here to catch
|
|
6
|
-
catastrophic regressions and to anchor the "saturation" end of the scoring
|
|
7
|
-
scale.
|
|
8
|
-
|
|
9
|
-
Pair-candidate status: rejected by design. Because every arm is expected to
|
|
10
|
-
one-shot F1, it is a trivial calibration/control fixture and must not be used
|
|
11
|
-
as pair-lift evidence.
|
|
12
|
-
|
|
13
|
-
## Failure mode
|
|
14
|
-
|
|
15
|
-
- **Default-behavior regression.** Careless implementations add `--loud`
|
|
16
|
-
handling but accidentally alter the default case (e.g., always uppercasing
|
|
17
|
-
because the flag-check is misplaced). Verification commands 1 and 4 guard
|
|
18
|
-
against that.
|
|
19
|
-
- **Scope creep.** Modifying unrelated code while "here" would be caught by
|
|
20
|
-
both CRITIC design sub-pass and the `git diff --stat` spec requirement.
|
|
21
|
-
|
|
22
|
-
## Pipeline exercise
|
|
23
|
-
|
|
24
|
-
- Phase 0 routing: expected `standard` route (no risk keywords).
|
|
25
|
-
- Phase 1 BUILD: single-file edit.
|
|
26
|
-
- Phase 1.4 BUILD GATE: `node --check` + `node --test` both must pass.
|
|
27
|
-
- Phase 2 EVAL: minimal findings expected.
|
|
28
|
-
- Phase 3 CRITIC design: verifies diff surgical-ness.
|
|
29
|
-
|
|
30
|
-
## Rotation trigger
|
|
31
|
-
|
|
32
|
-
When both `bare` and `solo_claude` score > 95 for two consecutive shipped
|
|
33
|
-
versions, replace with a harder trivial fixture (e.g., one that requires
|
|
34
|
-
handling a new flag interacting with existing flag precedence).
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"verification_commands": [
|
|
3
|
-
{
|
|
4
|
-
"cmd": "node bin/cli.js hello",
|
|
5
|
-
"exit_code": 0,
|
|
6
|
-
"stdout_contains": [
|
|
7
|
-
"Hello, world!"
|
|
8
|
-
],
|
|
9
|
-
"stdout_not_contains": [
|
|
10
|
-
"HELLO"
|
|
11
|
-
]
|
|
12
|
-
},
|
|
13
|
-
{
|
|
14
|
-
"cmd": "node bin/cli.js hello --loud",
|
|
15
|
-
"exit_code": 0,
|
|
16
|
-
"stdout_contains": [
|
|
17
|
-
"HELLO, WORLD!!"
|
|
18
|
-
],
|
|
19
|
-
"stdout_not_contains": []
|
|
20
|
-
},
|
|
21
|
-
{
|
|
22
|
-
"cmd": "node bin/cli.js hello --loud --name alice",
|
|
23
|
-
"exit_code": 0,
|
|
24
|
-
"stdout_contains": [
|
|
25
|
-
"HELLO, ALICE!!"
|
|
26
|
-
],
|
|
27
|
-
"stdout_not_contains": []
|
|
28
|
-
},
|
|
29
|
-
{
|
|
30
|
-
"cmd": "node bin/cli.js hello --name bob",
|
|
31
|
-
"exit_code": 0,
|
|
32
|
-
"stdout_contains": [
|
|
33
|
-
"Hello, bob!"
|
|
34
|
-
],
|
|
35
|
-
"stdout_not_contains": [
|
|
36
|
-
"HELLO"
|
|
37
|
-
]
|
|
38
|
-
},
|
|
39
|
-
{
|
|
40
|
-
"cmd": "node --test tests/cli.test.js",
|
|
41
|
-
"exit_code": 0,
|
|
42
|
-
"stdout_contains": [],
|
|
43
|
-
"stdout_not_contains": [
|
|
44
|
-
"not ok "
|
|
45
|
-
]
|
|
46
|
-
}
|
|
47
|
-
],
|
|
48
|
-
"forbidden_patterns": [
|
|
49
|
-
{
|
|
50
|
-
"pattern": "catch\\s*\\([^)]*\\)\\s*\\{[^}]*return\\s+(null|undefined|'')",
|
|
51
|
-
"description": "silent catch returning fallback",
|
|
52
|
-
"files": [
|
|
53
|
-
"bin/cli.js"
|
|
54
|
-
],
|
|
55
|
-
"severity": "disqualifier"
|
|
56
|
-
}
|
|
57
|
-
],
|
|
58
|
-
"required_files": [
|
|
59
|
-
"bin/cli.js",
|
|
60
|
-
"tests/cli.test.js"
|
|
61
|
-
],
|
|
62
|
-
"forbidden_files": [],
|
|
63
|
-
"max_deps_added": 0,
|
|
64
|
-
"spec_output_files": [
|
|
65
|
-
"bin/cli.js",
|
|
66
|
-
"tests/cli.test.js"
|
|
67
|
-
]
|
|
68
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "F1-cli-trivial-flag",
|
|
3
|
-
"category": "trivial",
|
|
4
|
-
"difficulty": "trivial",
|
|
5
|
-
"timeout_seconds": 900,
|
|
6
|
-
"required_tools": ["node"],
|
|
7
|
-
"browser": false,
|
|
8
|
-
"deps_change_expected": false,
|
|
9
|
-
"intent": "Add a boolean --loud flag to bench-test-repo's hello subcommand. When passed, the greeting is uppercased and ends with '!!'. Default behavior unchanged. Update tests."
|
|
10
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: "F1-cli-trivial-flag"
|
|
3
|
-
title: "Add --loud flag to hello subcommand"
|
|
4
|
-
status: planned
|
|
5
|
-
complexity: trivial
|
|
6
|
-
depends-on: []
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# F1 Add `--loud` flag to `hello`
|
|
10
|
-
|
|
11
|
-
## Context
|
|
12
|
-
|
|
13
|
-
The `hello` subcommand in `bin/cli.js` currently prints `Hello, <name>!`. A
|
|
14
|
-
`--loud` flag gives users an emphatic variant without breaking the default.
|
|
15
|
-
This is a low-risk edit used to calibrate trivial-tier fixture difficulty.
|
|
16
|
-
|
|
17
|
-
## Requirements
|
|
18
|
-
|
|
19
|
-
- [ ] `node bin/cli.js hello --loud` prints `HELLO, WORLD!!` (everything uppercased, two trailing exclamation marks).
|
|
20
|
-
- [ ] `node bin/cli.js hello --loud --name alice` prints `HELLO, ALICE!!`.
|
|
21
|
-
- [ ] `node bin/cli.js hello` (no flag) still prints `Hello, world!` (unchanged).
|
|
22
|
-
- [ ] `node bin/cli.js hello --name bob` still prints `Hello, bob!` (unchanged).
|
|
23
|
-
- [ ] Existing tests continue to pass. Add at least one test covering the `--loud` path.
|
|
24
|
-
|
|
25
|
-
## Constraints
|
|
26
|
-
|
|
27
|
-
- **No new npm dependencies.** Built-ins only.
|
|
28
|
-
- **No silent catches.** If an unknown flag is passed, exit 1 with an informative message (same pattern as the existing `--name` handler).
|
|
29
|
-
- **Surgical diff.** Only touch `bin/cli.js` and `tests/cli.test.js`. Do not reformat unrelated code.
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
## Out of Scope
|
|
33
|
-
|
|
34
|
-
- Adding unrelated flags (`--quiet`, `--locale`, etc.).
|
|
35
|
-
- Refactoring the existing argument parser.
|
|
36
|
-
- Touching `server/`, `web/`, or `tests/server.test.js`.
|
|
37
|
-
|
|
38
|
-
## Verification
|
|
39
|
-
|
|
40
|
-
- `node bin/cli.js hello` prints `Hello, world!` (exit 0).
|
|
41
|
-
- `node bin/cli.js hello --loud` prints `HELLO, WORLD!!` (exit 0).
|
|
42
|
-
- `node bin/cli.js hello --loud --name alice` prints `HELLO, ALICE!!` (exit 0).
|
|
43
|
-
- `node --test tests/` passes all tests including the new `--loud` case.
|
|
44
|
-
- `git diff --stat` shows only `bin/cli.js` and `tests/cli.test.js` touched.
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
bench-test-repo의 CLI(bin/cli.js)에 있는 `hello` 서브커맨드에 `--loud` 플래그를 추가해주세요. `--loud`가 전달되면 인사말이 대문자로 바뀌고 느낌표 두 개로 끝나야 합니다.
|
|
2
|
-
|
|
3
|
-
예시:
|
|
4
|
-
- `node bin/cli.js hello --loud` → `HELLO, WORLD!!`
|
|
5
|
-
- `node bin/cli.js hello --loud --name alice` → `HELLO, ALICE!!`
|
|
6
|
-
- `node bin/cli.js hello` → `Hello, world!` (기본값 변경 없음)
|
|
7
|
-
|
|
8
|
-
기존 테스트가 계속 통과하는지 확인하고, `--loud` 경로에 대한 테스트를 최소 하나 추가해주세요. 관련 없는 파일은 건드리지 마세요 — `bin/cli.js`와 `tests/cli.test.js`만 수정하세요. 새로운 npm 의존성은 추가하지 마세요.
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
Add a --loud flag to the `hello` subcommand in bench-test-repo's CLI (bin/cli.js). When --loud is passed, the greeting is uppercased and ends with two exclamation marks.
|
|
2
|
-
|
|
3
|
-
For example:
|
|
4
|
-
- `node bin/cli.js hello --loud` → `HELLO, WORLD!!`
|
|
5
|
-
- `node bin/cli.js hello --loud --name alice` → `HELLO, ALICE!!`
|
|
6
|
-
- `node bin/cli.js hello` → `Hello, world!` (unchanged default)
|
|
7
|
-
|
|
8
|
-
Make sure existing tests still pass and add at least one test for the --loud path. Don't touch unrelated files — only `bin/cli.js` and `tests/cli.test.js`. No new npm dependencies.
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
# F10 — Notes
|
|
2
|
-
|
|
3
|
-
## Purpose
|
|
4
|
-
|
|
5
|
-
Pair-discriminating high-risk fixture. Adds a write endpoint with persistent
|
|
6
|
-
storage. The pair-edge mechanism: when an implementation reads-modifies-
|
|
7
|
-
writes a JSON file in response to async requests, multiple in-flight POSTs
|
|
8
|
-
can interleave during the await gap between read and write — producing
|
|
9
|
-
duplicate ids or lost writes. A single-pass implementer typically writes
|
|
10
|
-
the natural shape:
|
|
11
|
-
|
|
12
|
-
```js
|
|
13
|
-
const data = JSON.parse(await fs.readFile(...));
|
|
14
|
-
data.items.push({ id: data.items.length + 1, ...body });
|
|
15
|
-
await fs.writeFile(...);
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
This passes single-POST tests trivially. The failure only surfaces when
|
|
19
|
-
multiple POSTs are in flight together. A reviewer with fresh eyes asking
|
|
20
|
-
"what happens if two of these run at once?" catches it; the same model
|
|
21
|
-
reviewing its own work tends to anchor on the "happy path" view.
|
|
22
|
-
|
|
23
|
-
## Failure modes detected
|
|
24
|
-
|
|
25
|
-
- **Duplicate ids** from `length + 1` after concurrent reads.
|
|
26
|
-
- **Lost writes** from last-writer-wins overwrite of in-flight POSTs.
|
|
27
|
-
- **No persistence** — implementer keeps in-memory only, ignoring the
|
|
28
|
-
restart-survival requirement. Caught by `data/items.json` byte check.
|
|
29
|
-
- **Silent catch** wrapping the write path. Caught by forbidden_pattern.
|
|
30
|
-
|
|
31
|
-
## Pipeline exercise
|
|
32
|
-
|
|
33
|
-
- Phase 1 BUILD: implementer must derive that an awaited file read-modify-
|
|
34
|
-
write under parallel requests requires either serialization (mutex /
|
|
35
|
-
queue) or a unique-id source independent of array length.
|
|
36
|
-
- Phase 2 EVAL: scrutinizes whether the new tests exercise the close-
|
|
37
|
-
together POST case rather than just single-POST happy path.
|
|
38
|
-
- Phase 3 CRITIC: scope discipline + production-ready invariant on the
|
|
39
|
-
consistency claim.
|
|
40
|
-
|
|
41
|
-
## Discrimination expectation
|
|
42
|
-
|
|
43
|
-
Calibration target (set in pyx-memory project memory 2026-05-05):
|
|
44
|
-
|
|
45
|
-
- bare arm: 40-65 (passes spec wording verbatim, fails parallel verifier).
|
|
46
|
-
- solo arm: 60-78 (review pass may catch one mode, may miss another).
|
|
47
|
-
- pair arm: 75-90 (cross-perspective derivation of the consistency
|
|
48
|
-
invariant from the English "close together" wording).
|
|
49
|
-
|
|
50
|
-
## Public-spec wording — load-bearing
|
|
51
|
-
|
|
52
|
-
The spec deliberately uses "close together" and "remain consistent"
|
|
53
|
-
instead of trigger keywords. If the spec were to say "race condition",
|
|
54
|
-
"concurrent", "atomic", or "lock", a single-pass solo arm would
|
|
55
|
-
keyword-match the answer pattern and ace the fixture. The English
|
|
56
|
-
prose forces invariant derivation, which is where pair has the edge.
|
|
57
|
-
|
|
58
|
-
## Rotation trigger
|
|
59
|
-
|
|
60
|
-
Headroom run `20260507-f10-f11-tier1-full-pipeline` rejected this fixture as
|
|
61
|
-
pair-lift evidence: bare scored 75 and solo_claude scored 94. Keep it as a
|
|
62
|
-
concurrent persistence control unless the visible contract is reworked to
|
|
63
|
-
expose lower bare/solo ceilings.
|
|
64
|
-
|
|
65
|
-
Retire when both `bare` and `solo_claude` consistently land > 90 across two
|
|
66
|
-
shipped versions, OR when "close-together-write" becomes a recognized pattern
|
|
67
|
-
such that solo arm reliably reaches for a serializing mechanism on first read.
|
|
68
|
-
Whichever comes first.
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"verification_commands": [
|
|
3
|
-
{
|
|
4
|
-
"cmd": "node --test tests/server.test.js",
|
|
5
|
-
"exit_code": 0,
|
|
6
|
-
"stdout_contains": [],
|
|
7
|
-
"stdout_not_contains": ["not ok "]
|
|
8
|
-
},
|
|
9
|
-
{
|
|
10
|
-
"cmd": "node \"$BENCH_FIXTURE_DIR/verifiers/parallel.js\"",
|
|
11
|
-
"exit_code": 0,
|
|
12
|
-
"stdout_contains": ["\"ok\":true"],
|
|
13
|
-
"stdout_not_contains": [],
|
|
14
|
-
"contract_refs": [
|
|
15
|
-
"After multiple POSTs (single or many at once), `GET /items` reflects every successful POST exactly once",
|
|
16
|
-
"Several POSTs sent close together produce a list with every item, each with a distinct id"
|
|
17
|
-
]
|
|
18
|
-
},
|
|
19
|
-
{
|
|
20
|
-
"cmd": "node \"$BENCH_FIXTURE_DIR/verifiers/invalid.js\"",
|
|
21
|
-
"exit_code": 0,
|
|
22
|
-
"stdout_contains": ["\"ok\":true"],
|
|
23
|
-
"stdout_not_contains": [],
|
|
24
|
-
"contract_refs": [
|
|
25
|
-
"Invalid body (missing `name`, missing `qty`, `qty` not a positive number) → respond `400` with `{ error: 'invalid_body', field: '<name>' }`",
|
|
26
|
-
"An invalid POST returns `400` and the persisted file is byte-identical to its pre-request contents."
|
|
27
|
-
]
|
|
28
|
-
},
|
|
29
|
-
{
|
|
30
|
-
"cmd": "node -e 'const fs=require(\"fs\"); const d=JSON.parse(fs.readFileSync(\"data/items.json\",\"utf8\")); console.log(Array.isArray(d.items));'",
|
|
31
|
-
"exit_code": 0,
|
|
32
|
-
"stdout_contains": ["true"],
|
|
33
|
-
"stdout_not_contains": ["false", "undefined"]
|
|
34
|
-
}
|
|
35
|
-
],
|
|
36
|
-
"forbidden_patterns": [
|
|
37
|
-
{
|
|
38
|
-
"pattern": "catch\\s*\\([^)]*\\)\\s*\\{[^}]*return\\s+(null|undefined|''|\\{\\})",
|
|
39
|
-
"description": "silent catch returning fallback in write path",
|
|
40
|
-
"files": ["server/index.js"],
|
|
41
|
-
"severity": "disqualifier"
|
|
42
|
-
},
|
|
43
|
-
{
|
|
44
|
-
"pattern": "catch\\s*\\([^)]*\\)\\s*\\{\\s*\\}",
|
|
45
|
-
"description": "empty catch block",
|
|
46
|
-
"files": ["server/index.js"],
|
|
47
|
-
"severity": "disqualifier"
|
|
48
|
-
},
|
|
49
|
-
{
|
|
50
|
-
"pattern": "/\\*\\s*eslint-disable",
|
|
51
|
-
"description": "eslint-disable without scoped justification",
|
|
52
|
-
"files": ["server/index.js"],
|
|
53
|
-
"severity": "disqualifier"
|
|
54
|
-
}
|
|
55
|
-
],
|
|
56
|
-
"required_files": ["server/index.js", "tests/server.test.js", "data/items.json"],
|
|
57
|
-
"forbidden_files": [],
|
|
58
|
-
"max_deps_added": 0,
|
|
59
|
-
"spec_output_files": ["server/index.js", "tests/server.test.js"]
|
|
60
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "F10-persist-write-collision",
|
|
3
|
-
"category": "high-risk",
|
|
4
|
-
"difficulty": "high",
|
|
5
|
-
"timeout_seconds": 1500,
|
|
6
|
-
"required_tools": ["node"],
|
|
7
|
-
"browser": false,
|
|
8
|
-
"deps_change_expected": false,
|
|
9
|
-
"intent": "Add POST /items that appends a new entry and persists the full list to data/items.json. The list and its ids must remain consistent when multiple POSTs arrive close together — every saved item ends up with a unique numeric id and none are lost."
|
|
10
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# F10 setup — seed data/items.json.
|
|
3
|
-
set -e
|
|
4
|
-
|
|
5
|
-
mkdir -p data
|
|
6
|
-
|
|
7
|
-
# Seed with the same baseline the in-memory items started with.
|
|
8
|
-
cat > data/items.json <<'JSON'
|
|
9
|
-
{
|
|
10
|
-
"items": [
|
|
11
|
-
{ "id": 1, "name": "alpha", "qty": 3 },
|
|
12
|
-
{ "id": 2, "name": "beta", "qty": 5 }
|
|
13
|
-
]
|
|
14
|
-
}
|
|
15
|
-
JSON
|
|
16
|
-
|
|
17
|
-
exit 0
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: "F10-persist-write-collision"
|
|
3
|
-
title: "Add POST /items with persistent store"
|
|
4
|
-
status: planned
|
|
5
|
-
complexity: high
|
|
6
|
-
depends-on: []
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# F10 Add POST /items with persistent store
|
|
10
|
-
|
|
11
|
-
## Context
|
|
12
|
-
|
|
13
|
-
`server/index.js` currently keeps `items` in an in-memory array that
|
|
14
|
-
resets on restart. The task: add `POST /items` that appends a new entry
|
|
15
|
-
and persists the full list to `data/items.json` so state survives
|
|
16
|
-
restarts. Read paths (`GET /items`, `GET /items/:id`) load from the same
|
|
17
|
-
persisted file.
|
|
18
|
-
|
|
19
|
-
The list and every saved item's `id` must remain consistent when
|
|
20
|
-
multiple POSTs arrive close together — no duplicate ids, no lost writes.
|
|
21
|
-
|
|
22
|
-
## Requirements
|
|
23
|
-
|
|
24
|
-
- [ ] `POST /items` accepts JSON body `{ name: string, qty: number }` and returns `201` with `{ item: { id, name, qty } }` on success.
|
|
25
|
-
- [ ] `id` is a unique numeric value. Every successful POST returns an id no other item has, past or present.
|
|
26
|
-
- [ ] After multiple POSTs (single or many at once), `GET /items` reflects every successful POST exactly once — `items.length` equals starting count plus successful POST count.
|
|
27
|
-
- [ ] `data/items.json` on disk reflects the same state. Restarting the server preserves the items.
|
|
28
|
-
- [ ] `GET /items` and `GET /items/:id` read from the persisted file (or from state initialized from it at startup, with all writes persisted before the response is returned).
|
|
29
|
-
- [ ] Invalid body (missing `name`, missing `qty`, `qty` not a positive number) → respond `400` with `{ error: 'invalid_body', field: '<name>' }`. The persisted store must be unchanged after a 400 response.
|
|
30
|
-
- [ ] `tests/server.test.js` is updated. Existing assertions still hold AND at least two new tests cover POST behavior, including a test that fires several POST requests close together and verifies the resulting list contains every item with distinct ids.
|
|
31
|
-
|
|
32
|
-
## Constraints
|
|
33
|
-
|
|
34
|
-
- **No new npm dependencies.** Use only Express + Node built-ins (`fs/promises`).
|
|
35
|
-
- **No silent catches.** Any `try/catch` in the write path must surface failure as `500` with a clear body, not return a fake success.
|
|
36
|
-
- **No hardcoded ids.** Existing baseline ids (1, 2) remain valid; new ids must not collide with any past or present id.
|
|
37
|
-
- **No breaking change** to `GET /items` shape or `GET /items/:id` semantics.
|
|
38
|
-
|
|
39
|
-
## Out of Scope
|
|
40
|
-
|
|
41
|
-
- Authentication, rate limiting, validation libraries.
|
|
42
|
-
- Database integration. The store is a single JSON file by design.
|
|
43
|
-
- Touching `bin/cli.js`, `web/`, or `tests/cli.test.js`.
|
|
44
|
-
|
|
45
|
-
## Verification
|
|
46
|
-
|
|
47
|
-
- `node --test tests/server.test.js` exits 0 and the new tests cover POST.
|
|
48
|
-
- Several POSTs sent close together produce a list with every item, each with a distinct id — assertable from a small Node script that POSTs in parallel and reads back `GET /items`.
|
|
49
|
-
- After server restart, items posted before the restart are still present in `GET /items`.
|
|
50
|
-
- An invalid POST returns `400` and the persisted file is byte-identical to its pre-request contents.
|
|
51
|
-
- `git diff --stat` shows only `server/index.js` and `tests/server.test.js` touched (the `data/items.json` seed comes from setup, not the arm).
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
Add `POST /items` to `server/index.js` so users can append a new item with `{ name, qty }`. The full list should be persisted to `data/items.json` so state survives restarts — the existing read endpoints (`GET /items`, `GET /items/:id`) should also use the same persisted file going forward.
|
|
2
|
-
|
|
3
|
-
Every saved item must have a unique numeric id. If two or more POSTs arrive close together, the resulting list must contain every successful one with distinct ids — no duplicates, nothing lost.
|
|
4
|
-
|
|
5
|
-
Invalid body (missing `name`, missing `qty`, `qty` not a positive number) → respond `400` with `{ error: 'invalid_body', field: '<name>' }`, and the persisted store must be unchanged after the 400.
|
|
6
|
-
|
|
7
|
-
Update `tests/server.test.js` so existing tests still pass AND add at least two new tests covering POST behavior. One of them must fire several POSTs close together and verify the final list contains every item with distinct ids.
|
|
8
|
-
|
|
9
|
-
No new npm dependencies. Only touch `server/index.js`, `tests/server.test.js`, and `data/items.json` (which is seeded for you).
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
const fs = require('fs');
|
|
3
|
-
const http = require('http');
|
|
4
|
-
const path = require('path');
|
|
5
|
-
const { app } = require(path.join(process.env.BENCH_WORKDIR, 'server'));
|
|
6
|
-
|
|
7
|
-
const before = fs.readFileSync('data/items.json');
|
|
8
|
-
|
|
9
|
-
const s = http.createServer(app).listen(0, () => {
|
|
10
|
-
const { port } = s.address();
|
|
11
|
-
const req = http.request(
|
|
12
|
-
{ host: '127.0.0.1', port, method: 'POST', path: '/items',
|
|
13
|
-
headers: { 'Content-Type': 'application/json' } },
|
|
14
|
-
(r) => {
|
|
15
|
-
let b = '';
|
|
16
|
-
r.on('data', (c) => (b += c));
|
|
17
|
-
r.on('end', () => {
|
|
18
|
-
const after = fs.readFileSync('data/items.json');
|
|
19
|
-
const same = before.equals(after);
|
|
20
|
-
const ok = r.statusCode === 400 && same;
|
|
21
|
-
console.log(JSON.stringify({ status: r.statusCode, store_unchanged: same, ok }));
|
|
22
|
-
s.close();
|
|
23
|
-
process.exit(ok ? 0 : 1);
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
);
|
|
27
|
-
req.write(JSON.stringify({ name: 'noqty' }));
|
|
28
|
-
req.end();
|
|
29
|
-
});
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
const http = require('http');
|
|
3
|
-
const path = require('path');
|
|
4
|
-
const { app } = require(path.join(process.env.BENCH_WORKDIR, 'server'));
|
|
5
|
-
|
|
6
|
-
const s = http.createServer(app).listen(0, () => {
|
|
7
|
-
const { port } = s.address();
|
|
8
|
-
const post = (body) => new Promise((resolve) => {
|
|
9
|
-
const req = http.request(
|
|
10
|
-
{ host: '127.0.0.1', port, method: 'POST', path: '/items',
|
|
11
|
-
headers: { 'Content-Type': 'application/json' } },
|
|
12
|
-
(r) => {
|
|
13
|
-
let b = '';
|
|
14
|
-
r.on('data', (c) => (b += c));
|
|
15
|
-
r.on('end', () => resolve({ status: r.statusCode, body: b ? safeJson(b) : null }));
|
|
16
|
-
}
|
|
17
|
-
);
|
|
18
|
-
req.on('error', () => resolve({ status: 0, body: null }));
|
|
19
|
-
req.write(JSON.stringify(body));
|
|
20
|
-
req.end();
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
Promise.all([
|
|
24
|
-
post({ name: 'gamma', qty: 1 }),
|
|
25
|
-
post({ name: 'delta', qty: 2 }),
|
|
26
|
-
post({ name: 'epsilon', qty: 3 }),
|
|
27
|
-
]).then(async (results) => {
|
|
28
|
-
await new Promise((r) => setTimeout(r, 250));
|
|
29
|
-
http.get(`http://127.0.0.1:${port}/items`, (r) => {
|
|
30
|
-
let b = '';
|
|
31
|
-
r.on('data', (c) => (b += c));
|
|
32
|
-
r.on('end', () => {
|
|
33
|
-
let data;
|
|
34
|
-
try { data = JSON.parse(b); } catch { data = { items: [] }; }
|
|
35
|
-
const items = Array.isArray(data.items) ? data.items : [];
|
|
36
|
-
const ids = items.map((i) => i && i.id);
|
|
37
|
-
const uniq = new Set(ids).size;
|
|
38
|
-
const allPosted = results.every((x) => x.status === 201);
|
|
39
|
-
const ok = allPosted && items.length === 5 && uniq === 5;
|
|
40
|
-
console.log(JSON.stringify({
|
|
41
|
-
len: items.length, uniq, status: results.map((r) => r.status), ok,
|
|
42
|
-
}));
|
|
43
|
-
s.close();
|
|
44
|
-
process.exit(ok ? 0 : 1);
|
|
45
|
-
});
|
|
46
|
-
});
|
|
47
|
-
});
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
function safeJson(s) { try { return JSON.parse(s); } catch { return null; } }
|