devlyn-cli 3.2.1 → 3.3.1
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 +12 -102
- package/bin/devlyn.js +13 -225
- package/bin/instruction-templates.json +8 -0
- 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 +351 -25
- package/config/skills/_shared/task-complete.py +660 -150
- 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 +47 -38
- 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 -238
package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/verifiers/rules-source.js
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
const assert = require('node:assert');
|
|
2
|
-
const fs = require('node:fs');
|
|
3
|
-
const os = require('node:os');
|
|
4
|
-
const path = require('node:path');
|
|
5
|
-
const { spawnSync } = require('node:child_process');
|
|
6
|
-
|
|
7
|
-
const workdir = process.env.BENCH_WORKDIR || process.cwd();
|
|
8
|
-
const rulesPath = path.join(workdir, 'data', 'payout-rules.json');
|
|
9
|
-
const original = fs.readFileSync(rulesPath, 'utf8');
|
|
10
|
-
|
|
11
|
-
try {
|
|
12
|
-
fs.writeFileSync(rulesPath, JSON.stringify({
|
|
13
|
-
processing_fee_percent: 1,
|
|
14
|
-
fixed_fee_cents: 10,
|
|
15
|
-
dispute_fee_cents: 77,
|
|
16
|
-
reserve_percent: 0,
|
|
17
|
-
minimum_payout_cents: 1
|
|
18
|
-
}, null, 2) + '\n');
|
|
19
|
-
|
|
20
|
-
const input = path.join(os.tmpdir(), `payout-rules-${process.pid}.json`);
|
|
21
|
-
fs.writeFileSync(input, JSON.stringify({
|
|
22
|
-
events: [
|
|
23
|
-
{ id: 'evt-1', merchant_id: 'm_1', type: 'charge', amount_cents: 10000 }
|
|
24
|
-
]
|
|
25
|
-
}));
|
|
26
|
-
|
|
27
|
-
const proc = spawnSync('node', ['bin/cli.js', 'payout', '--input', input], {
|
|
28
|
-
cwd: workdir,
|
|
29
|
-
encoding: 'utf8'
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
assert.strictEqual(proc.status, 0, proc.stderr || proc.stdout);
|
|
33
|
-
assert.strictEqual(proc.stderr, '');
|
|
34
|
-
assert.deepStrictEqual(JSON.parse(proc.stdout), {
|
|
35
|
-
total_payout_cents: 9890,
|
|
36
|
-
total_processing_fee_cents: 110,
|
|
37
|
-
total_dispute_fee_cents: 0,
|
|
38
|
-
total_reserve_cents: 0,
|
|
39
|
-
merchants: [
|
|
40
|
-
{
|
|
41
|
-
merchant_id: 'm_1',
|
|
42
|
-
gross_charge_cents: 10000,
|
|
43
|
-
refund_cents: 0,
|
|
44
|
-
dispute_cents: 0,
|
|
45
|
-
processing_fee_cents: 110,
|
|
46
|
-
dispute_fee_cents: 0,
|
|
47
|
-
reserve_cents: 0,
|
|
48
|
-
payout_cents: 9890
|
|
49
|
-
}
|
|
50
|
-
]
|
|
51
|
-
});
|
|
52
|
-
} finally {
|
|
53
|
-
fs.writeFileSync(rulesPath, original);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
process.stdout.write(JSON.stringify({ ok: true }) + '\n');
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
# F3 — Notes
|
|
2
|
-
|
|
3
|
-
## Purpose
|
|
4
|
-
|
|
5
|
-
High-risk contract change. Exercises the pipeline's ability to catch
|
|
6
|
-
**breaking changes hidden inside a reasonable-looking refactor**: lazy
|
|
7
|
-
implementations wrap `items` in an envelope but forget to update tests, or
|
|
8
|
-
update tests but forget backward-compat requirements (single-item route,
|
|
9
|
-
`items` key), or paginate without validating query params.
|
|
10
|
-
|
|
11
|
-
## Failure modes detected
|
|
12
|
-
|
|
13
|
-
- **Test lie**: arm changes the handler but leaves old `assert.ok(Array.isArray(body.items))` that still passes against `{ items: [...] }` inside the envelope → test passes but new paging fields aren't asserted. Fixture requires ≥ 2 NEW tests.
|
|
14
|
-
- **Query-param trust**: accepts `?per_page=abc` → `parseInt` returns `NaN` → handler explodes or silently treats as default. Fixture requires explicit 400.
|
|
15
|
-
- **Contract drift on single-item lookup**: arm paginates `/items/:id` too, breaking existing clients.
|
|
16
|
-
- **Silent catch**: wrapping `Number(req.query.page)` in a `try/catch { return [] }` — caught by forbidden pattern.
|
|
17
|
-
|
|
18
|
-
## Pipeline exercise
|
|
19
|
-
|
|
20
|
-
- Phase 0 routing: likely `strict` (no risk keywords, but cross-file multi-function change may escalate in Stage B).
|
|
21
|
-
- Phase 1 BUILD: Codex BUILD produces the implementation.
|
|
22
|
-
- Phase 1.4 BUILD GATE: `node --test tests/server.test.js` must pass.
|
|
23
|
-
- Phase 2 EVAL: scrutinizes that new tests cover new behavior (not just rename passes).
|
|
24
|
-
- Phase 3 CRITIC design: checks invalid-query branch and backward-compat.
|
|
25
|
-
|
|
26
|
-
## Rotation trigger
|
|
27
|
-
|
|
28
|
-
Headroom run `20260511-f3-http-error-headroom` rejected this fixture as
|
|
29
|
-
pair-lift evidence after the invalid-query HTTP error body verifier was
|
|
30
|
-
tightened: bare scored 97 and solo_claude scored 99. Keep it as a backend
|
|
31
|
-
contract control unless the visible contract is reworked to expose lower
|
|
32
|
-
bare/solo ceilings.
|
|
33
|
-
|
|
34
|
-
Retire when both `bare` and `solo_claude` consistently score > 95 AND produce
|
|
35
|
-
2+ new tests covering paging edge cases without pipeline intervention.
|
package/benchmark/auto-resolve/fixtures/F3-backend-contract-risk/expected-pair-plan-registry.json
DELETED
|
@@ -1,162 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"fixture_id": "F3-backend-contract-risk",
|
|
3
|
-
"generated_at": "2026-04-29T09:57:53Z",
|
|
4
|
-
"generated_from": {
|
|
5
|
-
"expected_path": "benchmark/auto-resolve/fixtures/F3-backend-contract-risk/expected.json",
|
|
6
|
-
"expected_sha256": "c0925ee948179fbc1c76836d98fba0c14c7eba56f462f2922903951923cb22e6",
|
|
7
|
-
"metadata_path": "benchmark/auto-resolve/fixtures/F3-backend-contract-risk/metadata.json",
|
|
8
|
-
"metadata_sha256": "c54530db26dbb04ce50b698fed2608206eae6f9a5dc2f666f127695e15d3fa30",
|
|
9
|
-
"oracle_script_shas": {
|
|
10
|
-
"scope-tier-a": "baaf21ed4a67f35d2a8af825e72869ef9737b5dfe08d65dd1a11c26fafe297ae",
|
|
11
|
-
"scope-tier-b": "9349d00a5c7456a4df9142923334e7004407d53f2443f2e210945bb771971e25",
|
|
12
|
-
"test-fidelity": "401184da51ae500cecfc75a6c5819b0d28acb63a397f788fb628c2913562f903"
|
|
13
|
-
}
|
|
14
|
-
},
|
|
15
|
-
"required_invariants": [
|
|
16
|
-
{
|
|
17
|
-
"authority": "expected.json/forbidden_patterns",
|
|
18
|
-
"id": "forbidden_pattern__eslint_disable_without_explicit_per_issue_justification__server_index_js",
|
|
19
|
-
"operational_check": "variant arm output MUST NOT contain regex pattern '/\\\\*\\\\s*eslint-disable' in files ['server/index.js']; rationale: eslint-disable without explicit per-issue justification",
|
|
20
|
-
"severity": "disqualifier",
|
|
21
|
-
"source_field": "expected.json/forbidden_patterns/1",
|
|
22
|
-
"source_ref": "expected.json:forbidden_patterns[1]"
|
|
23
|
-
},
|
|
24
|
-
{
|
|
25
|
-
"authority": "expected.json/forbidden_patterns",
|
|
26
|
-
"id": "forbidden_pattern__silent_catch_returning_fallback__server_index_js",
|
|
27
|
-
"operational_check": "variant arm output MUST NOT contain regex pattern \"catch\\\\s*\\\\([^)]*\\\\)\\\\s*\\\\{[^}]*return\\\\s+(null|undefined|'')\" in files ['server/index.js']; rationale: silent catch returning fallback",
|
|
28
|
-
"severity": "disqualifier",
|
|
29
|
-
"source_field": "expected.json/forbidden_patterns/0",
|
|
30
|
-
"source_ref": "expected.json:forbidden_patterns[0]"
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
"authority": "expected.json/max_deps_added",
|
|
34
|
-
"id": "max_deps_added__0",
|
|
35
|
-
"operational_check": "variant arm MUST NOT add more than 0 new npm dependencies (count delta of package.json:dependencies + devDependencies)",
|
|
36
|
-
"severity": "hard",
|
|
37
|
-
"source_field": "expected.json/max_deps_added",
|
|
38
|
-
"source_ref": "expected.json:max_deps_added"
|
|
39
|
-
},
|
|
40
|
-
{
|
|
41
|
-
"authority": "expected.json/required_files",
|
|
42
|
-
"id": "required_file__server_index_js",
|
|
43
|
-
"operational_check": "variant arm output MUST contain file 'server/index.js' (created or preserved)",
|
|
44
|
-
"severity": "hard",
|
|
45
|
-
"source_field": "expected.json/required_files",
|
|
46
|
-
"source_ref": "expected.json:required_files[server/index.js]"
|
|
47
|
-
},
|
|
48
|
-
{
|
|
49
|
-
"authority": "expected.json/required_files",
|
|
50
|
-
"id": "required_file__tests_server_test_js",
|
|
51
|
-
"operational_check": "variant arm output MUST contain file 'tests/server.test.js' (created or preserved)",
|
|
52
|
-
"severity": "hard",
|
|
53
|
-
"source_field": "expected.json/required_files",
|
|
54
|
-
"source_ref": "expected.json:required_files[tests/server.test.js]"
|
|
55
|
-
},
|
|
56
|
-
{
|
|
57
|
-
"authority": "metadata/oracle-allowlist",
|
|
58
|
-
"id": "scope-tier-a:lockfile-deletion",
|
|
59
|
-
"operational_check": "variant arm MUST NOT delete a scaffold-present lockfile",
|
|
60
|
-
"severity": "hard",
|
|
61
|
-
"source_field": "oracle/scope-tier-a/scope-tier-a:lockfile-deletion",
|
|
62
|
-
"source_ref": "oracle-scope-tier-a.py"
|
|
63
|
-
},
|
|
64
|
-
{
|
|
65
|
-
"authority": "metadata/oracle-allowlist",
|
|
66
|
-
"id": "scope-tier-a:tier-a-violation",
|
|
67
|
-
"operational_check": "variant arm MUST NOT add or modify paths matching: docs/roadmap/** | docs/VISION.md | docs/ROADMAP.md | .github/** | node_modules/** | **/node_modules/** | test-results/** | coverage/** | .nyc_output/** | basename suffix .log | basename prefix .env or secrets.",
|
|
68
|
-
"severity": "hard",
|
|
69
|
-
"source_field": "oracle/scope-tier-a/scope-tier-a:tier-a-violation",
|
|
70
|
-
"source_ref": "oracle-scope-tier-a.py"
|
|
71
|
-
},
|
|
72
|
-
{
|
|
73
|
-
"authority": "metadata/oracle-allowlist",
|
|
74
|
-
"id": "scope-tier-b:scope-unmatched",
|
|
75
|
-
"operational_check": "every variant-touched file MUST be either inside spec_output_files (Tier C) OR reachable from a Tier C seed via static JS/TS imports OR matched by expected.json:tier_a_waivers",
|
|
76
|
-
"severity": "warn",
|
|
77
|
-
"source_field": "oracle/scope-tier-b/scope-tier-b:scope-unmatched",
|
|
78
|
-
"source_ref": "oracle-scope-tier-b.py"
|
|
79
|
-
},
|
|
80
|
-
{
|
|
81
|
-
"authority": "expected.json/spec_output_files",
|
|
82
|
-
"id": "spec_output_file__server_index_js",
|
|
83
|
-
"operational_check": "variant-touched files MUST be inside (or reachable via static imports from) the spec_output_files set; 'server/index.js' is one Tier C seed",
|
|
84
|
-
"severity": "warn",
|
|
85
|
-
"source_field": "expected.json/spec_output_files",
|
|
86
|
-
"source_ref": "expected.json:spec_output_files[server/index.js]"
|
|
87
|
-
},
|
|
88
|
-
{
|
|
89
|
-
"authority": "expected.json/spec_output_files",
|
|
90
|
-
"id": "spec_output_file__tests_server_test_js",
|
|
91
|
-
"operational_check": "variant-touched files MUST be inside (or reachable via static imports from) the spec_output_files set; 'tests/server.test.js' is one Tier C seed",
|
|
92
|
-
"severity": "warn",
|
|
93
|
-
"source_field": "expected.json/spec_output_files",
|
|
94
|
-
"source_ref": "expected.json:spec_output_files[tests/server.test.js]"
|
|
95
|
-
},
|
|
96
|
-
{
|
|
97
|
-
"authority": "metadata/oracle-allowlist",
|
|
98
|
-
"id": "test-fidelity:assertion-regression",
|
|
99
|
-
"operational_check": "effective assertion count MUST NOT drop and skipped-test count MUST NOT rise; vacuous expect.assertions(0) is treated as a real regression",
|
|
100
|
-
"severity": "warn",
|
|
101
|
-
"source_field": "oracle/test-fidelity/test-fidelity:assertion-regression",
|
|
102
|
-
"source_ref": "oracle-test-fidelity.py"
|
|
103
|
-
},
|
|
104
|
-
{
|
|
105
|
-
"authority": "metadata/oracle-allowlist",
|
|
106
|
-
"id": "test-fidelity:mock-swap",
|
|
107
|
-
"operational_check": "post-arm test file MUST NOT swap REAL_PATTERNS hits for MOCK_PATTERNS hits (jest/vi/sinon, nock/msw, app.handle/inject/callback, hand-rolled IncomingMessage/ServerResponse, etc.); a drop in real_calls combined with a rise in mock_calls is a mock-swap flag",
|
|
108
|
-
"severity": "flag",
|
|
109
|
-
"source_field": "oracle/test-fidelity/test-fidelity:mock-swap",
|
|
110
|
-
"source_ref": "oracle-test-fidelity.py"
|
|
111
|
-
},
|
|
112
|
-
{
|
|
113
|
-
"authority": "metadata/oracle-allowlist",
|
|
114
|
-
"id": "test-fidelity:test-file-deleted",
|
|
115
|
-
"operational_check": "no scaffold-present test file may be deleted by the variant arm; deletion of an existing tests/*.test.* / *.spec.* / *.e2e.* file is a flag-severity finding",
|
|
116
|
-
"severity": "flag",
|
|
117
|
-
"source_field": "oracle/test-fidelity/test-fidelity:test-file-deleted",
|
|
118
|
-
"source_ref": "oracle-test-fidelity.py"
|
|
119
|
-
},
|
|
120
|
-
{
|
|
121
|
-
"authority": "metadata/oracle-allowlist",
|
|
122
|
-
"id": "test-fidelity:test-file-renamed",
|
|
123
|
-
"operational_check": "rename of a scaffold-present test file is warn-severity (content fidelity not verified across renames in step 1)",
|
|
124
|
-
"severity": "warn",
|
|
125
|
-
"source_field": "oracle/test-fidelity/test-fidelity:test-file-renamed",
|
|
126
|
-
"source_ref": "oracle-test-fidelity.py"
|
|
127
|
-
},
|
|
128
|
-
{
|
|
129
|
-
"authority": "expected.json/verification_commands",
|
|
130
|
-
"id": "verification__6001efe2",
|
|
131
|
-
"operational_check": "running `node -e 'const { app } = require(\"./server\"); const http = require(\"http\"); const s = http.createServer(app).listen(0, () => { const { port } = s.address(); http.get(`http://127.0.0.1:${port}/items?per_page=abc`, r => { console.log(r.statusCode); s.close(); }); });'` in the post-arm work dir MUST exit with code 0; stdout MUST contain all of ['400']; stdout MUST NOT contain any of []",
|
|
132
|
-
"severity": "hard",
|
|
133
|
-
"source_field": "expected.json/verification_commands/3",
|
|
134
|
-
"source_ref": "expected.json:verification_commands[3]"
|
|
135
|
-
},
|
|
136
|
-
{
|
|
137
|
-
"authority": "expected.json/verification_commands",
|
|
138
|
-
"id": "verification__6517d995",
|
|
139
|
-
"operational_check": "running `node -e 'const { app } = require(\"./server\"); const http = require(\"http\"); const s = http.createServer(app).listen(0, () => { const { port } = s.address(); http.get(`http://127.0.0.1:${port}/items`, r => { let b = \"\"; r.on(\"data\", c=>b+=c); r.on(\"end\", () => { const d = JSON.parse(b); console.log(JSON.stringify({ total: d.total, page: d.page, per_page: d.per_page, items_len: d.items.length })); s.close(); }); }); });'` in the post-arm work dir MUST exit with code 0; stdout MUST contain all of ['\"total\":2', '\"page\":1']; stdout MUST NOT contain any of []",
|
|
140
|
-
"severity": "hard",
|
|
141
|
-
"source_field": "expected.json/verification_commands/1",
|
|
142
|
-
"source_ref": "expected.json:verification_commands[1]"
|
|
143
|
-
},
|
|
144
|
-
{
|
|
145
|
-
"authority": "expected.json/verification_commands",
|
|
146
|
-
"id": "verification__73df5e81",
|
|
147
|
-
"operational_check": "running `node -e 'const { app } = require(\"./server\"); const http = require(\"http\"); const s = http.createServer(app).listen(0, () => { const { port } = s.address(); http.get(`http://127.0.0.1:${port}/items?page=2&per_page=1`, r => { let b = \"\"; r.on(\"data\", c=>b+=c); r.on(\"end\", () => { const d = JSON.parse(b); console.log(d.items[0] && d.items[0].name); s.close(); }); }); });'` in the post-arm work dir MUST exit with code 0; stdout MUST contain all of ['beta']; stdout MUST NOT contain any of []",
|
|
148
|
-
"severity": "hard",
|
|
149
|
-
"source_field": "expected.json/verification_commands/2",
|
|
150
|
-
"source_ref": "expected.json:verification_commands[2]"
|
|
151
|
-
},
|
|
152
|
-
{
|
|
153
|
-
"authority": "expected.json/verification_commands",
|
|
154
|
-
"id": "verification__7c5f3637",
|
|
155
|
-
"operational_check": "running `node --test tests/server.test.js` in the post-arm work dir MUST exit with code 0; stdout MUST contain all of []; stdout MUST NOT contain any of ['fail ']",
|
|
156
|
-
"severity": "hard",
|
|
157
|
-
"source_field": "expected.json/verification_commands/0",
|
|
158
|
-
"source_ref": "expected.json:verification_commands[0]"
|
|
159
|
-
}
|
|
160
|
-
],
|
|
161
|
-
"schema_version": "1"
|
|
162
|
-
}
|
|
@@ -1,67 +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": [
|
|
8
|
-
"not ok "
|
|
9
|
-
]
|
|
10
|
-
},
|
|
11
|
-
{
|
|
12
|
-
"cmd": "node -e 'const { app } = require(\"./server\"); const http = require(\"http\"); const s = http.createServer(app).listen(0, () => { const { port } = s.address(); http.get(`http://127.0.0.1:${port}/items`, r => { let b = \"\"; r.on(\"data\", c=>b+=c); r.on(\"end\", () => { const d = JSON.parse(b); console.log(JSON.stringify({ total: d.total, page: d.page, per_page: d.per_page, items_len: d.items.length })); s.close(); }); }); });'",
|
|
13
|
-
"exit_code": 0,
|
|
14
|
-
"stdout_contains": [
|
|
15
|
-
"\"total\":2",
|
|
16
|
-
"\"page\":1"
|
|
17
|
-
],
|
|
18
|
-
"stdout_not_contains": []
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
"cmd": "node -e 'const { app } = require(\"./server\"); const http = require(\"http\"); const s = http.createServer(app).listen(0, () => { const { port } = s.address(); http.get(`http://127.0.0.1:${port}/items?page=2&per_page=1`, r => { let b = \"\"; r.on(\"data\", c=>b+=c); r.on(\"end\", () => { const d = JSON.parse(b); console.log(d.items[0] && d.items[0].name); s.close(); }); }); });'",
|
|
22
|
-
"exit_code": 0,
|
|
23
|
-
"stdout_contains": [
|
|
24
|
-
"beta"
|
|
25
|
-
],
|
|
26
|
-
"stdout_not_contains": []
|
|
27
|
-
},
|
|
28
|
-
{
|
|
29
|
-
"cmd": "node -e 'const { app } = require(\"./server\"); const http = require(\"http\"); const s = http.createServer(app).listen(0, () => { const { port } = s.address(); http.get(`http://127.0.0.1:${port}/items?per_page=abc`, r => { let b = \"\"; r.on(\"data\", c => b += c); r.on(\"end\", () => { const d = JSON.parse(b); console.log(JSON.stringify({ status: r.statusCode, error: d.error, field: d.field })); s.close(); }); }); });'",
|
|
30
|
-
"exit_code": 0,
|
|
31
|
-
"stdout_contains": [
|
|
32
|
-
"\"status\":400",
|
|
33
|
-
"\"error\":\"invalid_query\"",
|
|
34
|
-
"\"field\":\"per_page\""
|
|
35
|
-
],
|
|
36
|
-
"stdout_not_contains": []
|
|
37
|
-
}
|
|
38
|
-
],
|
|
39
|
-
"forbidden_patterns": [
|
|
40
|
-
{
|
|
41
|
-
"pattern": "catch\\s*\\([^)]*\\)\\s*\\{[^}]*return\\s+(null|undefined|'')",
|
|
42
|
-
"description": "silent catch returning fallback",
|
|
43
|
-
"files": [
|
|
44
|
-
"server/index.js"
|
|
45
|
-
],
|
|
46
|
-
"severity": "disqualifier"
|
|
47
|
-
},
|
|
48
|
-
{
|
|
49
|
-
"pattern": "/\\*\\s*eslint-disable",
|
|
50
|
-
"description": "eslint-disable without explicit per-issue justification",
|
|
51
|
-
"files": [
|
|
52
|
-
"server/index.js"
|
|
53
|
-
],
|
|
54
|
-
"severity": "disqualifier"
|
|
55
|
-
}
|
|
56
|
-
],
|
|
57
|
-
"required_files": [
|
|
58
|
-
"server/index.js",
|
|
59
|
-
"tests/server.test.js"
|
|
60
|
-
],
|
|
61
|
-
"forbidden_files": [],
|
|
62
|
-
"max_deps_added": 0,
|
|
63
|
-
"spec_output_files": [
|
|
64
|
-
"server/index.js",
|
|
65
|
-
"tests/server.test.js"
|
|
66
|
-
]
|
|
67
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "F3-backend-contract-risk",
|
|
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": "Change the GET /items response shape from { items } to a paginated { items, total, page, per_page } while keeping the existing 1-based id semantics and updating tests. A lazy implementation will leave tests broken or drop the items array — the spec requires both.",
|
|
10
|
-
"pair_plan_oracle_categories": [
|
|
11
|
-
"scope-tier-a:lockfile-deletion",
|
|
12
|
-
"scope-tier-a:tier-a-violation",
|
|
13
|
-
"scope-tier-b:scope-unmatched",
|
|
14
|
-
"test-fidelity:assertion-regression",
|
|
15
|
-
"test-fidelity:mock-swap",
|
|
16
|
-
"test-fidelity:test-file-deleted",
|
|
17
|
-
"test-fidelity:test-file-renamed"
|
|
18
|
-
]
|
|
19
|
-
}
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: "F3-backend-contract-risk"
|
|
3
|
-
title: "Paginate GET /items response"
|
|
4
|
-
status: planned
|
|
5
|
-
complexity: high
|
|
6
|
-
depends-on: []
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# F3 Paginate `GET /items`
|
|
10
|
-
|
|
11
|
-
## Context
|
|
12
|
-
|
|
13
|
-
`server/index.js` currently returns `{ items: [...] }` for `GET /items` with
|
|
14
|
-
no pagination metadata. As the dataset grows, clients need a `total` and
|
|
15
|
-
paging information. The task: wrap the existing response in a pagination
|
|
16
|
-
envelope, accept `?page` and `?per_page` query parameters, and update tests
|
|
17
|
-
so existing assertions continue to pass alongside new paging assertions.
|
|
18
|
-
|
|
19
|
-
## Requirements
|
|
20
|
-
|
|
21
|
-
- [ ] `GET /items` (no query) returns `{ items, total, page, per_page }` where:
|
|
22
|
-
- `items` is the full list (baseline repo has 2 items).
|
|
23
|
-
- `total` is the full item count.
|
|
24
|
-
- `page` is `1`.
|
|
25
|
-
- `per_page` is the full item count when no pagination was requested.
|
|
26
|
-
- [ ] `GET /items?page=1&per_page=1` returns the first item wrapped in the envelope with `items.length === 1`, `total === 2`, `page === 1`, `per_page === 1`.
|
|
27
|
-
- [ ] `GET /items?page=2&per_page=1` returns the second item similarly.
|
|
28
|
-
- [ ] `GET /items?page=99&per_page=1` returns `items: []`, `total === 2`, `page === 99`, `per_page === 1` (out-of-range page is allowed — bare empty array, never a 404).
|
|
29
|
-
- [ ] `GET /items/:id` behavior unchanged (the per-item route does NOT get paginated).
|
|
30
|
-
- [ ] `tests/server.test.js` is updated so every existing assertion still holds (semantically) AND the new paging behavior is covered by at least two new tests.
|
|
31
|
-
- [ ] `GET /health` continues to return `{ status: 'ok' }` unchanged.
|
|
32
|
-
|
|
33
|
-
## Constraints
|
|
34
|
-
|
|
35
|
-
- **No new npm dependencies.** Use only Express + built-ins already in the repo.
|
|
36
|
-
- **No silent catches.** Invalid `page` or `per_page` (non-numeric, zero, negative) must respond 400 with `{ error: 'invalid_query', field }`.
|
|
37
|
-
- **No breaking change to `/items/:id`.** The per-item route must keep its current contract (the fixture explicitly does NOT paginate single-item lookups).
|
|
38
|
-
- **Backward-compat note**: clients that previously read `response.items` MUST still get the array at the same key inside the new envelope.
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
## Out of Scope
|
|
42
|
-
|
|
43
|
-
- Caching, rate limiting, authentication.
|
|
44
|
-
- Converting `items` to a database-backed list.
|
|
45
|
-
- Touching `bin/cli.js`, `web/`, or `tests/cli.test.js`.
|
|
46
|
-
- Adding a new route.
|
|
47
|
-
|
|
48
|
-
## Verification
|
|
49
|
-
|
|
50
|
-
- Server start: `node server/index.js` listens on port 3000 (exit via SIGINT).
|
|
51
|
-
- `curl -s http://127.0.0.1:3000/items | jq '.total'` returns `2`.
|
|
52
|
-
- `curl -s 'http://127.0.0.1:3000/items?per_page=1&page=2' | jq '.items[0].name'` returns `"beta"`.
|
|
53
|
-
- `curl -s 'http://127.0.0.1:3000/items?per_page=abc'` returns HTTP status `400` with JSON error body `{ "error": "invalid_query", "field": "per_page" }`.
|
|
54
|
-
- `node --test tests/server.test.js` passes; must include ≥ 2 new paging tests.
|
|
55
|
-
- `git diff --stat` shows only `server/index.js` and `tests/server.test.js` touched.
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
The `GET /items` endpoint in `server/index.js` currently returns `{ items: [...] }`. Paginate it: the response should be `{ items, total, page, per_page }`. Accept `?page` and `?per_page` query params. When no params are given, return everything on page 1 with `per_page` equal to the full count.
|
|
2
|
-
|
|
3
|
-
Keep `GET /items/:id` unchanged (no pagination on single-item lookup). `GET /health` stays as-is.
|
|
4
|
-
|
|
5
|
-
Invalid `page` or `per_page` (non-numeric, zero, negative) → respond 400 with `{ error: 'invalid_query', field: '<name>' }`. Out-of-range page (beyond the last item) returns an empty `items` array, NOT a 404.
|
|
6
|
-
|
|
7
|
-
Update `tests/server.test.js` so existing behavior is still covered AND you add at least two new tests for the paging behavior.
|
|
8
|
-
|
|
9
|
-
No new npm dependencies. Only touch `server/index.js` and `tests/server.test.js`.
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
# F31 CLI seat rebalance
|
|
2
|
-
|
|
3
|
-
## Failure mode
|
|
4
|
-
|
|
5
|
-
This fixture detects implementations that pass simple entitlement updates while
|
|
6
|
-
missing the interaction between priority ordering, transfer rollback, rejected
|
|
7
|
-
row ordering, and exact machine-readable error handling.
|
|
8
|
-
|
|
9
|
-
## Pipeline phase target
|
|
10
|
-
|
|
11
|
-
PLAN must preserve the ordering distinction between processing order and
|
|
12
|
-
rejected-output order. IMPLEMENT must keep transfer mutations all-or-nothing.
|
|
13
|
-
VERIFY should build adversarial cases where a later high-priority transfer
|
|
14
|
-
changes the outcome of an earlier low-priority reserve, and where a failed
|
|
15
|
-
transfer would corrupt state if mutations are applied too early.
|
|
16
|
-
|
|
17
|
-
## Why existing fixtures do not cover it
|
|
18
|
-
|
|
19
|
-
F21 covers scheduling priority and blocked intervals. F23 covers inventory
|
|
20
|
-
allocation rollback. F25 covers checkout calculation order. This fixture covers
|
|
21
|
-
account entitlement reconciliation with a different state shape and a duplicate
|
|
22
|
-
event-id hard error.
|
|
23
|
-
|
|
24
|
-
## Retirement
|
|
25
|
-
|
|
26
|
-
Headroom run `20260512-f31-seat-rebalance-headroom` rejected this fixture as
|
|
27
|
-
pair-lift evidence: bare scored 33 but carried judge/result/verify
|
|
28
|
-
disqualifiers, and solo_claude scored 98 with all 3 verification commands
|
|
29
|
-
passing. It should remain a control fixture unless reworked to lower the solo
|
|
30
|
-
ceiling.
|
|
31
|
-
|
|
32
|
-
Retire or replace this fixture if either `bare` or `solo_claude` consistently
|
|
33
|
-
reaches ceiling, or if a later fixture covers priority event processing plus
|
|
34
|
-
all-or-nothing transfer rollback with cleaner full-pipeline lift.
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"verification_commands": [
|
|
3
|
-
{
|
|
4
|
-
"cmd": "node --test tests/cli.test.js",
|
|
5
|
-
"exit_code": 0,
|
|
6
|
-
"stdout_contains": [],
|
|
7
|
-
"stdout_not_contains": ["not ok "]
|
|
8
|
-
},
|
|
9
|
-
{
|
|
10
|
-
"cmd": "node \"$BENCH_FIXTURE_DIR/verifiers/priority-transfer-rollback.js\"",
|
|
11
|
-
"exit_code": 0,
|
|
12
|
-
"stdout_contains": ["\"ok\":true"],
|
|
13
|
-
"stdout_not_contains": [],
|
|
14
|
-
"contract_refs": [
|
|
15
|
-
"Process events globally by `priority` descending, then `effective_at` ascending, then `id` ascending.",
|
|
16
|
-
"`transfer` is all-or-nothing. It accepts only when both accounts exist, the source has `used >= qty`, the destination has at least `qty` free seats, and both accounts have the same `region` unless `allow_cross_region` is `true`.",
|
|
17
|
-
"A rejected `transfer` must not change either account. Use reason `unknown_account`, `region_mismatch`, `insufficient_used`, or `no_capacity` for the first failing transfer rule in the order listed above.",
|
|
18
|
-
"`rejected` is ordered in the original input event order. Each row has keys `id`, `reason`.",
|
|
19
|
-
"`accounts` is sorted by account id ascending. Each row has keys `id`, `region`, `seats`, `used`, `free`, where `free = seats - used`.",
|
|
20
|
-
"On success, write exactly one JSON object to stdout and no stderr. Keys: `applied`, `rejected`, `accounts`."
|
|
21
|
-
]
|
|
22
|
-
},
|
|
23
|
-
{
|
|
24
|
-
"cmd": "node \"$BENCH_FIXTURE_DIR/verifiers/duplicate-event-error.js\"",
|
|
25
|
-
"exit_code": 0,
|
|
26
|
-
"stdout_contains": ["\"ok\":true"],
|
|
27
|
-
"stdout_not_contains": [],
|
|
28
|
-
"contract_refs": [
|
|
29
|
-
"Before processing any event, duplicate event ids are invalid input: exit `2`, write exactly one JSON error object `{ \"error\": \"duplicate_event_id\", \"id\": string }` to stderr, and write no stdout."
|
|
30
|
-
]
|
|
31
|
-
}
|
|
32
|
-
],
|
|
33
|
-
"forbidden_patterns": [
|
|
34
|
-
{
|
|
35
|
-
"pattern": "catch\\s*\\([^)]*\\)\\s*\\{[^}]*return\\s+(null|undefined|''|\\{\\})",
|
|
36
|
-
"description": "silent catch returning fallback in seat rebalance path",
|
|
37
|
-
"files": ["bin/cli.js", "tests/cli.test.js"],
|
|
38
|
-
"severity": "disqualifier"
|
|
39
|
-
},
|
|
40
|
-
{
|
|
41
|
-
"pattern": "catch\\s*\\([^)]*\\)\\s*\\{\\s*\\}",
|
|
42
|
-
"description": "empty catch block",
|
|
43
|
-
"files": ["bin/cli.js", "tests/cli.test.js"],
|
|
44
|
-
"severity": "disqualifier"
|
|
45
|
-
},
|
|
46
|
-
{
|
|
47
|
-
"pattern": "/\\*\\s*eslint-disable",
|
|
48
|
-
"description": "eslint-disable without scoped justification",
|
|
49
|
-
"files": ["bin/cli.js"],
|
|
50
|
-
"severity": "disqualifier"
|
|
51
|
-
}
|
|
52
|
-
],
|
|
53
|
-
"required_files": ["bin/cli.js", "tests/cli.test.js"],
|
|
54
|
-
"forbidden_files": [],
|
|
55
|
-
"max_deps_added": 0,
|
|
56
|
-
"spec_output_files": ["bin/cli.js", "tests/cli.test.js"]
|
|
57
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "F31-cli-seat-rebalance",
|
|
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 a bench-cli rebalance-seats command that reads account capacity and seat events from a JSON file, processes events by priority with all-or-nothing transfers, rejects invalid per-event operations without corrupting state, and prints exact applied, rejected, and final account rows."
|
|
10
|
-
}
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: "F31-cli-seat-rebalance"
|
|
3
|
-
title: "Seat rebalance command"
|
|
4
|
-
status: planned
|
|
5
|
-
complexity: high
|
|
6
|
-
depends-on: []
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# F31 Seat rebalance command
|
|
10
|
-
|
|
11
|
-
## Context
|
|
12
|
-
|
|
13
|
-
`bench-cli` currently has greeting and version commands only. The task:
|
|
14
|
-
add a `rebalance-seats` command that reads account capacity and seat events from
|
|
15
|
-
a JSON file, processes events by priority with all-or-nothing transfers, rejects
|
|
16
|
-
invalid per-event operations without corrupting state, and prints exact applied,
|
|
17
|
-
rejected, and final account rows.
|
|
18
|
-
|
|
19
|
-
This is account entitlement reconciliation. Downstream billing tools parse the
|
|
20
|
-
output, so success and error output must be exact machine-readable JSON.
|
|
21
|
-
|
|
22
|
-
## Requirements
|
|
23
|
-
|
|
24
|
-
- [ ] `bench-cli rebalance-seats --input <path>` reads JSON shaped as `{ "accounts": [{ "id": string, "region": string, "seats": number, "used": number }], "events": [event] }`.
|
|
25
|
-
- [ ] Valid event types are `reserve`, `release`, and `transfer`.
|
|
26
|
-
- [ ] `reserve` events have keys `id`, `type`, `account`, `qty`, `priority`, and `effective_at`.
|
|
27
|
-
- [ ] `release` events have keys `id`, `type`, `account`, `qty`, `priority`, and `effective_at`.
|
|
28
|
-
- [ ] `transfer` events have keys `id`, `type`, `from`, `to`, `qty`, `priority`, `effective_at`, and optional `allow_cross_region`.
|
|
29
|
-
- [ ] Before processing any event, duplicate event ids are invalid input: exit `2`, write exactly one JSON error object `{ "error": "duplicate_event_id", "id": string }` to stderr, and write no stdout.
|
|
30
|
-
- [ ] Before processing any event, account rows must have unique ids, non-empty string `id` and `region`, integer `seats >= 0`, and integer `used` with `0 <= used <= seats`. Invalid account input exits `2` with one JSON error object and no stdout.
|
|
31
|
-
- [ ] Before processing any event, every event `qty` must be a positive integer, every `priority` must be an integer, and every `effective_at` must be a non-empty string. Invalid event input exits `2` with one JSON error object and no stdout.
|
|
32
|
-
- [ ] Process events globally by `priority` descending, then `effective_at` ascending, then `id` ascending.
|
|
33
|
-
- [ ] `reserve` accepts only when the account exists and has at least `qty` free seats. On accept, increase that account's `used` by `qty`. Otherwise reject the event with reason `unknown_account` or `no_capacity`.
|
|
34
|
-
- [ ] `release` accepts only when the account exists and `used >= qty`. On accept, decrease that account's `used` by `qty`. Otherwise reject the event with reason `unknown_account` or `insufficient_used`.
|
|
35
|
-
- [ ] `transfer` is all-or-nothing. It accepts only when both accounts exist, the source has `used >= qty`, the destination has at least `qty` free seats, and both accounts have the same `region` unless `allow_cross_region` is `true`.
|
|
36
|
-
- [ ] A rejected `transfer` must not change either account. Use reason `unknown_account`, `region_mismatch`, `insufficient_used`, or `no_capacity` for the first failing transfer rule in the order listed above.
|
|
37
|
-
- [ ] On success, write exactly one JSON object to stdout and no stderr. Keys: `applied`, `rejected`, `accounts`.
|
|
38
|
-
- [ ] `applied` is ordered in processing order. Each row has keys `id`, `type`.
|
|
39
|
-
- [ ] `rejected` is ordered in the original input event order. Each row has keys `id`, `reason`.
|
|
40
|
-
- [ ] `accounts` is sorted by account id ascending. Each row has keys `id`, `region`, `seats`, `used`, `free`, where `free = seats - used`.
|
|
41
|
-
- [ ] `tests/cli.test.js` is updated. Existing tests still pass and at least two new tests cover `rebalance-seats`: one successful priority/transfer scenario and one validation failure.
|
|
42
|
-
|
|
43
|
-
## Constraints
|
|
44
|
-
|
|
45
|
-
- **No new npm dependencies.**
|
|
46
|
-
- **No hidden mutable global state.** The command must derive output only from the input JSON for that invocation.
|
|
47
|
-
- **No silent catches.** Parse and file-read failures must emit a visible JSON error to stderr and exit `2`.
|
|
48
|
-
- **No extra stdout/stderr text** on the success path; downstream tooling parses stdout as JSON.
|
|
49
|
-
|
|
50
|
-
## Out of Scope
|
|
51
|
-
|
|
52
|
-
- Persisting account state between command invocations.
|
|
53
|
-
- Adding billing invoices, plan catalogs, or currency calculations.
|
|
54
|
-
- Adding web UI or server routes.
|
|
55
|
-
- Touching `server/`, `web/`, or `tests/server.test.js`.
|
|
56
|
-
|
|
57
|
-
## Verification
|
|
58
|
-
|
|
59
|
-
- `node --test tests/cli.test.js` exits 0.
|
|
60
|
-
- A later high-priority transfer is processed before an earlier low-priority reserve, and the low-priority reserve can lose capacity because of that ordering.
|
|
61
|
-
- A rejected transfer leaves both source and destination account usage unchanged.
|
|
62
|
-
- Region mismatch rejects a transfer unless `allow_cross_region` is `true`.
|
|
63
|
-
- `rejected` rows are reported in the original input event order, even though processing order is priority based.
|
|
64
|
-
- Duplicate event ids exit `2`, print exactly `{ "error": "duplicate_event_id", "id": string }` to stderr, and print no stdout.
|
|
65
|
-
- Final `accounts` rows are sorted by id and include exact `free` values.
|
|
66
|
-
- `git diff --stat` shows only `bin/cli.js` and `tests/cli.test.js` touched.
|
|
67
|
-
- Solo-headroom hypothesis: solo_claude is expected to miss transfer rollback or rejected-row ordering under priority processing; observable command `node "$BENCH_FIXTURE_DIR/verifiers/priority-transfer-rollback.js"` exposes the miss.
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
Add a bench-cli rebalance-seats command that reads account capacity and seat events from a JSON file, processes events by priority with all-or-nothing transfers, rejects invalid per-event operations without corrupting state, and prints exact applied, rejected, and final account rows.
|
|
2
|
-
|
|
3
|
-
The command should be `bench-cli rebalance-seats --input <path>`. The input JSON has account rows with id, region, seats, and used, plus event rows for reserve, release, and transfer operations. Process all events by priority descending, then effective_at ascending, then id ascending.
|
|
4
|
-
|
|
5
|
-
Transfers must be all-or-nothing: if either account is missing, the source lacks used seats, the destination lacks free seats, or the regions differ without allow_cross_region, reject the transfer and leave both accounts unchanged. Reserve and release should reject per-event failures without aborting the whole command. Duplicate event ids are invalid input and must exit 2 with exactly one JSON error object on stderr and no stdout.
|
|
6
|
-
|
|
7
|
-
On success, stdout must be exactly one JSON object with applied rows in processing order, rejected rows in original input order, and final account rows sorted by account id with free = seats - used. Update `tests/cli.test.js` so existing tests still pass and at least two new tests cover rebalance-seats, including one successful priority/transfer scenario and one validation failure. Do not add dependencies or touch server/web files.
|
package/benchmark/auto-resolve/fixtures/F31-cli-seat-rebalance/verifiers/duplicate-event-error.js
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
const assert = require('node:assert');
|
|
3
|
-
const { spawnSync } = require('node:child_process');
|
|
4
|
-
const fs = require('node:fs');
|
|
5
|
-
const os = require('node:os');
|
|
6
|
-
const path = require('node:path');
|
|
7
|
-
|
|
8
|
-
const work = process.env.BENCH_WORKDIR || process.cwd();
|
|
9
|
-
const cli = path.join(work, 'bin', 'cli.js');
|
|
10
|
-
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'f31-duplicate-'));
|
|
11
|
-
const input = path.join(tmp, 'events.json');
|
|
12
|
-
|
|
13
|
-
fs.writeFileSync(input, JSON.stringify({
|
|
14
|
-
accounts: [
|
|
15
|
-
{ id: 'team-a', region: 'us', seats: 5, used: 1 }
|
|
16
|
-
],
|
|
17
|
-
events: [
|
|
18
|
-
{ id: 'dup', type: 'reserve', account: 'team-a', qty: 1, priority: 2, effective_at: '2026-01-01T09:00:00Z' },
|
|
19
|
-
{ id: 'dup', type: 'release', account: 'team-a', qty: 1, priority: 1, effective_at: '2026-01-01T09:01:00Z' }
|
|
20
|
-
]
|
|
21
|
-
}), 'utf8');
|
|
22
|
-
|
|
23
|
-
const result = spawnSync('node', [cli, 'rebalance-seats', '--input', input], {
|
|
24
|
-
cwd: work,
|
|
25
|
-
encoding: 'utf8'
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
assert.strictEqual(result.status, 2);
|
|
29
|
-
assert.strictEqual(result.stdout, '');
|
|
30
|
-
assert.deepStrictEqual(JSON.parse(result.stderr), {
|
|
31
|
-
error: 'duplicate_event_id',
|
|
32
|
-
id: 'dup'
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
console.log(JSON.stringify({ ok: true }));
|