devlyn-cli 3.2.1 → 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 +12 -102
- package/bin/devlyn.js +13 -225
- package/bin/instruction-templates.json +6 -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 +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 -238
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
# F36 Session admission command with a global concurrency cap
|
|
2
|
-
|
|
3
|
-
## Failure mode
|
|
4
|
-
|
|
5
|
-
Detects implementations that get interval-admission logic correct at small,
|
|
6
|
-
hand-written scale but reach for a data structure that stops scaling once
|
|
7
|
-
the number of concurrently active sessions grows large — most naturally, a
|
|
8
|
-
plain array of admitted sessions that gets linearly scanned or filtered on
|
|
9
|
-
every new candidate. That shape is indistinguishable from the fully correct
|
|
10
|
-
answer on any test an agent is likely to hand-write, and only fails once the
|
|
11
|
-
active set stays large across a long run (Tier-2 axis: performance/scale,
|
|
12
|
-
never previously used in this suite — no existing fixture verifier measures
|
|
13
|
-
wall-clock; grepped `verifiers/*.js` across active + retired fixtures for
|
|
14
|
-
`Date.now|hrtime|performance.now|elapsed`, zero hits before this one).
|
|
15
|
-
Compounded with four small-scale correctness sub-traps so a fast-but-wrong
|
|
16
|
-
shortcut and a correct-but-slow shortcut both lose points independently:
|
|
17
|
-
half-open boundary (touching, not overlapping), start-time eligibility
|
|
18
|
-
order vs. file order, per-candidate (not static) `active_at_start`, and
|
|
19
|
-
eviction that must be driven by actual expiry (`end`) rather than admission
|
|
20
|
-
order — the last one specifically closes a FIFO-queue shortcut that would
|
|
21
|
-
otherwise pass the scale case by coincidence, since the scale case uses a
|
|
22
|
-
uniform session duration and a FIFO queue's admission order happens to
|
|
23
|
-
coincide with its expiry order there (Codex R2 catch, see Rounds below).
|
|
24
|
-
|
|
25
|
-
## Fairness
|
|
26
|
-
|
|
27
|
-
Every verifier assertion quotes a visible spec.md bullet via `contract_refs`
|
|
28
|
-
(lint-fixtures enforced). The 150,000-session performance requirement is
|
|
29
|
-
stated as a plain, numeric, visible spec bullet — no mechanism vocabulary
|
|
30
|
-
(no "sort", "heap", "priority queue", "efficient", "O(n log n)") appears
|
|
31
|
-
anywhere in `spec.md` or `task.txt`; only the observable behavior (must
|
|
32
|
-
finish within the process timeout, must not change the answer) is named.
|
|
33
|
-
The scale verifier's 15-second hard kill (`spawnSync` `timeout` option) sits
|
|
34
|
-
more than 100x above the efficient reference's actual running time and
|
|
35
|
-
correspondingly far below any realistic degraded-shortcut running time on
|
|
36
|
-
this fixture's parameters, so the gate has a wide, non-flaky margin in both
|
|
37
|
-
directions.
|
|
38
|
-
|
|
39
|
-
## Pipeline phase(s) tested
|
|
40
|
-
|
|
41
|
-
BUILD_GATE / VERIFY: an agent's own test suite is overwhelmingly likely to
|
|
42
|
-
be small-N (a handful of hand-written sessions), so nothing in a normal
|
|
43
|
-
iterative dev loop surfaces the scale defect; only the hidden, harness-side
|
|
44
|
-
scale verifier (never visible to the arm) exercises it. This is a
|
|
45
|
-
structurally different discriminator from every prior fixture in this
|
|
46
|
-
suite, which relied entirely on a single hidden semantic trap rather than a
|
|
47
|
-
mechanical, orthogonal performance axis.
|
|
48
|
-
|
|
49
|
-
## Why another fixture can't cover this
|
|
50
|
-
|
|
51
|
-
No active or retired fixture in this suite measures wall-clock/algorithmic
|
|
52
|
-
complexity at all (verified by grep, see Failure mode above). Every prior
|
|
53
|
-
headroom attempt (F27, F28, F30, F34, F35, S2-S6 — see
|
|
54
|
-
`pair-rejected-fixtures.sh`) relied on a single hidden ordering/rollback/
|
|
55
|
-
atomicity trap, and solo_claude scored 88-100 on all of them. This fixture
|
|
56
|
-
tests a category of miss (asymptotic complexity blindness under a full
|
|
57
|
-
self-review pipeline) that none of those exercise.
|
|
58
|
-
|
|
59
|
-
## When to retire or replace
|
|
60
|
-
|
|
61
|
-
If a headroom run shows solo_claude reliably recognizes and implements the
|
|
62
|
-
required efficient structure even without prompting (i.e. the visible
|
|
63
|
-
numeric scale requirement alone is enough to trigger scale-aware design),
|
|
64
|
-
retire per the same honest-retirement contract used for F27/F28/F30/F34/F35
|
|
65
|
-
and add this id to `pair-rejected-fixtures.sh` with the observed scores.
|
|
66
|
-
|
|
67
|
-
## Rounds — Codex GPT-5.5 collaboration (read-only, `codex-monitored.sh`)
|
|
68
|
-
|
|
69
|
-
**Round 1** (initial design: performance stated as a secondary condition on
|
|
70
|
-
top of a single hidden ordering trap, textbook "meeting rooms with
|
|
71
|
-
capacity" shape): Codex verdict **needs-rework** — "200,000 sessions" alone
|
|
72
|
-
is enough for a strong PLAN phase to infer scale pressure and pattern-match
|
|
73
|
-
the well-known interval-scheduling/heap shape; the boundary traps alone
|
|
74
|
-
weren't judged sufficient given solo already solved comparable explicit
|
|
75
|
-
order/rollback traps in F34/F35. Adopted: make performance the dominant
|
|
76
|
-
axis by choosing scale-case parameters (uniform long overlapping durations,
|
|
77
|
-
capacity held well below the overlap window) so that BOTH a brute
|
|
78
|
-
nested-loop AND a "linear-scan a plain active-sessions array" middle-tier
|
|
79
|
-
shortcut fail — only a genuinely sub-linear-per-op structure survives, not
|
|
80
|
-
merely "some awareness of scale."
|
|
81
|
-
|
|
82
|
-
**Round 2** (revised design presented): Codex verdict **converge, with one
|
|
83
|
-
fix** — flagged that because the scale case uses a uniform session
|
|
84
|
-
duration, admission order and expiry order coincide, so a FIFO
|
|
85
|
-
queue-with-front-eviction (simpler than the general answer, and not the
|
|
86
|
-
"real" discriminator intended) would also pass the scale case correctly and
|
|
87
|
-
fast. Fix adopted: added the fourth small-scale correctness sub-trap
|
|
88
|
-
(eviction driven by actual smallest `end` among currently active sessions,
|
|
89
|
-
not admission order) via a hand-authored 3-session case where a FIFO
|
|
90
|
-
shortcut and the correct rule disagree. This closes the loophole without
|
|
91
|
-
touching the scale case's parameters, since the two verifiers are
|
|
92
|
-
independent files/inputs.
|
|
93
|
-
|
|
94
|
-
Codex's own words, R2 answer to Q1: "F36 is much stronger now, but I see one
|
|
95
|
-
real shortcut left: a FIFO/sliding-window queue of admitted sessions can
|
|
96
|
-
pass the scale case if ends are monotonic... Add one small correctness case
|
|
97
|
-
where admitted end order differs from start/admission order... That defeats
|
|
98
|
-
FIFO while keeping the scale discriminator intact." Adopted verbatim as
|
|
99
|
-
correctness sub-trap 4.
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
# F36 retired
|
|
2
|
-
|
|
3
|
-
Retired from the active golden suite after headroom run
|
|
4
|
-
`iter-0041-headroom-f36-f37`.
|
|
5
|
-
|
|
6
|
-
Reason: `solo_claude` scored 96, exceeding the headroom ceiling of 80, and
|
|
7
|
-
timed out doing so (full 1500s budget). bare scored 50 — the bare ceiling
|
|
8
|
-
held (headroom 10), and bare failed on the intended traps (wrong deferred-row
|
|
9
|
-
output shape: reason `capacity`/key `active` instead of
|
|
10
|
-
`over_capacity`/`blocking`, plus a validation miss). But solo's pipeline
|
|
11
|
-
still produced a scalable heap-based implementation that cleared the hidden
|
|
12
|
-
scale verifier, so there is no pair-lift headroom to measure. The
|
|
13
|
-
performance/scale axis alone does not hold the solo pipeline under 80.
|
|
14
|
-
|
|
15
|
-
Future use: the small-scale correctness traps discriminated bare as designed;
|
|
16
|
-
the scale verifier did not discriminate solo. A future rework needs a
|
|
17
|
-
difficulty axis that survives a full PLAN/BUILD_GATE loop, not just a
|
|
18
|
-
single-pass implementation.
|
|
@@ -1,64 +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/correctness-small.js\"",
|
|
11
|
-
"exit_code": 0,
|
|
12
|
-
"stdout_contains": ["\"ok\":true"],
|
|
13
|
-
"stdout_not_contains": [],
|
|
14
|
-
"contract_refs": [
|
|
15
|
-
"an admitted session whose `end` equals the candidate's `start` has already ended and does not count against it",
|
|
16
|
-
"Sessions become eligible for admission in ascending order of `start`; ties are broken by the session's position in the input `sessions` array",
|
|
17
|
-
"Each deferred row reports `blocking`: the ids of the currently-active admitted sessions preventing its admission, in the order those sessions were themselves admitted"
|
|
18
|
-
]
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
"cmd": "node \"$BENCH_FIXTURE_DIR/verifiers/validation.js\"",
|
|
22
|
-
"exit_code": 0,
|
|
23
|
-
"stdout_contains": ["\"ok\":true"],
|
|
24
|
-
"stdout_not_contains": [],
|
|
25
|
-
"contract_refs": [
|
|
26
|
-
"Validation happens before any admission decision.",
|
|
27
|
-
"a duplicate `id` uses shape `{ \"error\": \"duplicate_session_id\", \"id\": string }`"
|
|
28
|
-
]
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
"cmd": "node \"$BENCH_FIXTURE_DIR/verifiers/scale.js\"",
|
|
32
|
-
"exit_code": 0,
|
|
33
|
-
"stdout_contains": ["\"ok\":true"],
|
|
34
|
-
"stdout_not_contains": [],
|
|
35
|
-
"contract_refs": [
|
|
36
|
-
"`bench-cli admit` must finish processing the 150,000-session verification input (see `## Verification`) within its process timeout, without changing which sessions are admitted or deferred compared to a smaller input processed under the same rule."
|
|
37
|
-
]
|
|
38
|
-
}
|
|
39
|
-
],
|
|
40
|
-
"forbidden_patterns": [
|
|
41
|
-
{
|
|
42
|
-
"pattern": "catch\\s*\\([^)]*\\)\\s*\\{[^}]*return\\s+(null|undefined|''|\\{\\})",
|
|
43
|
-
"description": "silent catch returning fallback in admit path",
|
|
44
|
-
"files": ["bin/cli.js"],
|
|
45
|
-
"severity": "disqualifier"
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
"pattern": "catch\\s*\\([^)]*\\)\\s*\\{\\s*\\}",
|
|
49
|
-
"description": "empty catch block",
|
|
50
|
-
"files": ["bin/cli.js"],
|
|
51
|
-
"severity": "disqualifier"
|
|
52
|
-
},
|
|
53
|
-
{
|
|
54
|
-
"pattern": "/\\*\\s*eslint-disable",
|
|
55
|
-
"description": "eslint-disable without scoped justification",
|
|
56
|
-
"files": ["bin/cli.js"],
|
|
57
|
-
"severity": "disqualifier"
|
|
58
|
-
}
|
|
59
|
-
],
|
|
60
|
-
"required_files": ["bin/cli.js", "tests/cli.test.js"],
|
|
61
|
-
"forbidden_files": [],
|
|
62
|
-
"max_deps_added": 0,
|
|
63
|
-
"spec_output_files": ["bin/cli.js", "tests/cli.test.js"]
|
|
64
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "F36-cli-session-admission",
|
|
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 admit command that admits scheduling sessions against a global concurrency capacity in start-time order with file-order tie-break, deferring sessions that would exceed capacity, and that must finish processing a 150,000-session verification input within its process timeout without changing which sessions are admitted or deferred."
|
|
10
|
-
}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: "F36-cli-session-admission"
|
|
3
|
-
title: "Session admission command with a global concurrency cap"
|
|
4
|
-
status: planned
|
|
5
|
-
complexity: high
|
|
6
|
-
depends-on: []
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# F36 Session admission command with a global concurrency cap
|
|
10
|
-
|
|
11
|
-
## Context
|
|
12
|
-
|
|
13
|
-
`bench-cli` gets an `admit` command that decides which of a batch of
|
|
14
|
-
scheduling sessions can run at all, given a single global limit on how many
|
|
15
|
-
sessions may be concurrently active. Downstream capacity-planning tooling
|
|
16
|
-
parses stdout as JSON and replays the verification input at production
|
|
17
|
-
scale, so the decision must be exact and the command must finish in
|
|
18
|
-
reasonable time even on large batches.
|
|
19
|
-
|
|
20
|
-
## Requirements
|
|
21
|
-
|
|
22
|
-
- [ ] `bench-cli admit --input <path>` reads JSON shaped as `{ "capacity": number, "sessions": [{ "id": string, "start": number, "end": number }] }`.
|
|
23
|
-
- [ ] Sessions become eligible for admission in ascending order of `start`; ties are broken by the session's position in the input `sessions` array (the earlier entry is eligible first).
|
|
24
|
-
- [ ] Sessions are considered for admission one at a time, in that eligibility order. A session is admitted unless, at the moment it is considered, the number of already-admitted sessions whose interval has not yet ended is already equal to `capacity` — in that case it is deferred instead. A session's interval `[start, end)` is half-open: an admitted session whose `end` equals the candidate's `start` has already ended and does not count against it.
|
|
25
|
-
- [ ] Each deferred row reports `blocking`: the ids of the currently-active admitted sessions preventing its admission, in the order those sessions were themselves admitted (not a final or static list, and not the list for any other candidate).
|
|
26
|
-
- [ ] `bench-cli admit` must finish processing the 150,000-session verification input (see `## Verification`) within its process timeout, without changing which sessions are admitted or deferred compared to a smaller input processed under the same rule.
|
|
27
|
-
- [ ] Validation happens before any admission decision. `capacity` must be a positive integer; `sessions` must be an array; every session needs a non-empty string `id`, integer `start`, and integer `end` with `start < end`; every `id` must be unique across the whole input. Invalid input exits `2` and writes exactly one JSON error object to stderr, printing nothing to stdout: a malformed capacity/session field uses shape `{ "error": "invalid_input", "reason": string }`; a duplicate `id` uses shape `{ "error": "duplicate_session_id", "id": string }`.
|
|
28
|
-
- [ ] On success, write exactly one JSON object to stdout and no stderr. Keys: `admitted` (array of admitted session ids, in eligibility order) and `deferred` (array of `{ "id": string, "reason": "over_capacity", "blocking": [string, ...] }` rows, in eligibility order).
|
|
29
|
-
- [ ] `tests/cli.test.js` is updated. Existing tests still pass AND at least two new tests cover `admit`: one where a session listed earlier in the file but starting later must not be admitted ahead of a session listed later but starting earlier, and one deferral.
|
|
30
|
-
|
|
31
|
-
## Constraints
|
|
32
|
-
|
|
33
|
-
- **No new npm dependencies.**
|
|
34
|
-
- **No silent catches.** If parsing or file reading fails, emit a visible JSON error to stderr and exit `2`.
|
|
35
|
-
- **No extra stdout/stderr text** on the success path; downstream tooling parses stdout as JSON.
|
|
36
|
-
- `data`, `server`, and `web` directories are unrelated to this command; do not add files there.
|
|
37
|
-
|
|
38
|
-
## Out of Scope
|
|
39
|
-
|
|
40
|
-
- Persisting admission results between command invocations.
|
|
41
|
-
- Retrying, rescheduling, or suggesting alternate times for deferred sessions.
|
|
42
|
-
- Changing server routes, web UI, or any file outside `bin/cli.js` and `tests/cli.test.js`.
|
|
43
|
-
- Touching `server/`, `web/`, or `tests/server.test.js`.
|
|
44
|
-
|
|
45
|
-
## Verification
|
|
46
|
-
|
|
47
|
-
- `node --test tests/cli.test.js` exits 0.
|
|
48
|
-
- Given three sessions where the second-admitted session's interval ends before the first-admitted session's interval ends, a fourth session starting after the second has ended but before the first has ended is correctly admitted (its admission depends on evicting the second, not the first, from the active set) — `node "$BENCH_FIXTURE_DIR/verifiers/correctness-small.js"` exposes misses on this and the eligibility-order, half-open-boundary, and `blocking` rules above.
|
|
49
|
-
- Malformed input, non-unique ids, and a non-positive capacity are all rejected before any admission decision, per the exact error shapes above — `node "$BENCH_FIXTURE_DIR/verifiers/validation.js"` exposes misses.
|
|
50
|
-
- A 150,000-session input with `capacity` set low relative to heavily overlapping session durations completes within the process timeout and produces the exact admitted/deferred sets — `node "$BENCH_FIXTURE_DIR/verifiers/scale.js"` exposes misses on both timing and correctness.
|
|
51
|
-
- `git diff --stat` shows only `bin/cli.js` and `tests/cli.test.js` touched.
|
|
52
|
-
|
|
53
|
-
## Solo-headroom hypothesis
|
|
54
|
-
|
|
55
|
-
A capable solo_claude baseline is expected to reach for a data structure
|
|
56
|
-
that is correct on typical hand-written examples but does not stay fast as
|
|
57
|
-
the number of concurrently active sessions grows — for example, keeping
|
|
58
|
-
admitted sessions in a plain list and scanning or filtering it on every new
|
|
59
|
-
candidate — which is correct at small scale but does not finish the
|
|
60
|
-
150,000-session input in time; observable command
|
|
61
|
-
`node "$BENCH_FIXTURE_DIR/verifiers/scale.js"` exposes the miss.
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
Add an `admit` command to `bench-cli` so users can run `bench-cli admit --input <path>` with a JSON file shaped as `{ "capacity": number, "sessions": [{ "id": string, "start": number, "end": number }] }`. Sessions become eligible for admission in ascending order of `start`; if two sessions share the same `start`, the one listed earlier in the `sessions` array is eligible first.
|
|
2
|
-
|
|
3
|
-
Consider sessions one at a time in that eligibility order. Admit a session unless the number of already-admitted sessions whose interval hasn't ended yet is already equal to `capacity` — in that case defer it instead. Treat intervals as half-open: a session that ends exactly when another starts is not overlapping it. Each deferred session should report which already-admitted sessions are still active at its own turn (their ids, in the order those sessions were admitted) — this can differ across deferred sessions depending on when each one is considered, since a session admitted earlier isn't necessarily still active later.
|
|
4
|
-
|
|
5
|
-
This command needs to stay fast: downstream capacity-planning tooling replays inputs with well over a hundred thousand sessions, and the command must still finish within a reasonable process timeout without changing which sessions get admitted or deferred versus a small input processed the same way.
|
|
6
|
-
|
|
7
|
-
Validate the whole input before making any admission decision: `capacity` must be a positive integer, `sessions` must be an array, every session needs a non-empty string `id` and integer `start`/`end` with `start` less than `end`, and every `id` must be unique. On any violation, exit 2, print exactly one JSON error object to stderr, and print nothing to stdout — use a distinct error for duplicate ids versus other malformed input. On success, print exactly one JSON object with `admitted` (ids in eligibility order) and `deferred` (rows with id/reason/active-count, in eligibility order) — nothing on stderr.
|
|
8
|
-
|
|
9
|
-
Update `tests/cli.test.js`: existing tests still pass, plus at least two new tests for `admit` (one exercising the start-time-vs-file-order tie-break, one deferral). No new npm dependencies. Only touch `bin/cli.js` and `tests/cli.test.js`.
|
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
// F36 hidden verifier — four independent small-scale correctness sub-traps:
|
|
3
|
-
// (1) half-open boundary (touching is not overlapping), (2) eligibility
|
|
4
|
-
// order is by `start` ascending with file-order tiebreak, not file order or
|
|
5
|
-
// output order, (3) `blocking` reports the exact currently-active admitted
|
|
6
|
-
// ids at each candidate's own turn (not a static/final list), (4) eviction
|
|
7
|
-
// must be driven by actual expiry (`end`), not admission order — a FIFO
|
|
8
|
-
// queue that only evicts from its front would miss B's expiry here since A
|
|
9
|
-
// (admitted first, longer-lived) is still in front and never expired.
|
|
10
|
-
//
|
|
11
|
-
// Structural equality: object key order is not part of the visible
|
|
12
|
-
// contract; array order is (Codex fairness-audit pattern from F35).
|
|
13
|
-
function deepEqual(a, b) {
|
|
14
|
-
if (a === b) return true;
|
|
15
|
-
if (Array.isArray(a) && Array.isArray(b)) {
|
|
16
|
-
return a.length === b.length && a.every((v, i) => deepEqual(v, b[i]));
|
|
17
|
-
}
|
|
18
|
-
if (a && b && typeof a === 'object' && typeof b === 'object' && !Array.isArray(a) && !Array.isArray(b)) {
|
|
19
|
-
const ka = Object.keys(a).sort();
|
|
20
|
-
const kb = Object.keys(b).sort();
|
|
21
|
-
return deepEqual(ka, kb) && ka.every((k) => deepEqual(a[k], b[k]));
|
|
22
|
-
}
|
|
23
|
-
return false;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
const fs = require('node:fs');
|
|
27
|
-
const os = require('node:os');
|
|
28
|
-
const path = require('node:path');
|
|
29
|
-
const { spawnSync } = require('node:child_process');
|
|
30
|
-
|
|
31
|
-
const work = process.env.BENCH_WORKDIR;
|
|
32
|
-
const cli = path.join(work, 'bin', 'cli.js');
|
|
33
|
-
|
|
34
|
-
let callCount = 0;
|
|
35
|
-
function runAdmit(payload) {
|
|
36
|
-
callCount += 1;
|
|
37
|
-
const inputPath = path.join(os.tmpdir(), `admit-small-${process.pid}-${callCount}.json`);
|
|
38
|
-
fs.writeFileSync(inputPath, JSON.stringify(payload));
|
|
39
|
-
const result = spawnSync('node', [cli, 'admit', '--input', inputPath], {
|
|
40
|
-
cwd: work,
|
|
41
|
-
encoding: 'utf8',
|
|
42
|
-
maxBuffer: 16 * 1024 * 1024,
|
|
43
|
-
});
|
|
44
|
-
let out = null;
|
|
45
|
-
try {
|
|
46
|
-
out = JSON.parse(result.stdout);
|
|
47
|
-
} catch {
|
|
48
|
-
out = null;
|
|
49
|
-
}
|
|
50
|
-
return { result, out };
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
const failures = [];
|
|
54
|
-
|
|
55
|
-
// Sub-test 1: half-open boundary — b.start === a.end must not overlap.
|
|
56
|
-
{
|
|
57
|
-
const { result, out } = runAdmit({
|
|
58
|
-
capacity: 1,
|
|
59
|
-
sessions: [
|
|
60
|
-
{ id: 'a', start: 0, end: 10 },
|
|
61
|
-
{ id: 'b', start: 10, end: 20 },
|
|
62
|
-
],
|
|
63
|
-
});
|
|
64
|
-
const expected = { admitted: ['a', 'b'], deferred: [] };
|
|
65
|
-
if (result.status !== 0 || result.stderr !== '' || !deepEqual(out, expected)) {
|
|
66
|
-
failures.push({ test: 'boundary', status: result.status, stderr: result.stderr, out, expected });
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
// Sub-test 2: eligibility order is by start ascending (file-order tiebreak
|
|
71
|
-
// only applies to equal starts) — output arrays follow eligibility order,
|
|
72
|
-
// not input file order.
|
|
73
|
-
{
|
|
74
|
-
const { result, out } = runAdmit({
|
|
75
|
-
capacity: 1,
|
|
76
|
-
sessions: [
|
|
77
|
-
{ id: 'x', start: 5, end: 6 },
|
|
78
|
-
{ id: 'y', start: 1, end: 2 },
|
|
79
|
-
],
|
|
80
|
-
});
|
|
81
|
-
const expected = { admitted: ['y', 'x'], deferred: [] };
|
|
82
|
-
if (result.status !== 0 || result.stderr !== '' || !deepEqual(out, expected)) {
|
|
83
|
-
failures.push({ test: 'eligibility-order', status: result.status, stderr: result.stderr, out, expected });
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
// Sub-test 3: `blocking` must be the exact currently-active admitted ids at
|
|
88
|
-
// each candidate's own turn, not a static or cumulative list.
|
|
89
|
-
{
|
|
90
|
-
const { result, out } = runAdmit({
|
|
91
|
-
capacity: 2,
|
|
92
|
-
sessions: [
|
|
93
|
-
{ id: 'a', start: 0, end: 5 },
|
|
94
|
-
{ id: 'b', start: 1, end: 100 },
|
|
95
|
-
{ id: 'c', start: 2, end: 3 },
|
|
96
|
-
{ id: 'd', start: 10, end: 100 },
|
|
97
|
-
{ id: 'e', start: 15, end: 16 },
|
|
98
|
-
],
|
|
99
|
-
});
|
|
100
|
-
const expected = {
|
|
101
|
-
admitted: ['a', 'b', 'd'],
|
|
102
|
-
deferred: [
|
|
103
|
-
{ id: 'c', reason: 'over_capacity', blocking: ['a', 'b'] },
|
|
104
|
-
{ id: 'e', reason: 'over_capacity', blocking: ['b', 'd'] },
|
|
105
|
-
],
|
|
106
|
-
};
|
|
107
|
-
if (result.status !== 0 || result.stderr !== '' || !deepEqual(out, expected)) {
|
|
108
|
-
failures.push({ test: 'blocking-per-candidate', status: result.status, stderr: result.stderr, out, expected });
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
// Sub-test 4: eviction must be driven by actual expiry, not admission
|
|
113
|
-
// order. A (admitted 1st, end=100) stays in front of any admission-order
|
|
114
|
-
// queue; B (admitted 2nd, end=3) expires first. C's admission at start=5
|
|
115
|
-
// depends on correctly evicting B (expired) while keeping A (still
|
|
116
|
-
// active) — a front-only-eviction shortcut stops at A and never checks B,
|
|
117
|
-
// leaving B incorrectly counted as active and wrongly deferring C.
|
|
118
|
-
{
|
|
119
|
-
const { result, out } = runAdmit({
|
|
120
|
-
capacity: 2,
|
|
121
|
-
sessions: [
|
|
122
|
-
{ id: 'A', start: 0, end: 100 },
|
|
123
|
-
{ id: 'B', start: 1, end: 3 },
|
|
124
|
-
{ id: 'C', start: 5, end: 6 },
|
|
125
|
-
],
|
|
126
|
-
});
|
|
127
|
-
const expected = { admitted: ['A', 'B', 'C'], deferred: [] };
|
|
128
|
-
if (result.status !== 0 || result.stderr !== '' || !deepEqual(out, expected)) {
|
|
129
|
-
failures.push({ test: 'non-monotonic-eviction', status: result.status, stderr: result.stderr, out, expected });
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
const ok = failures.length === 0;
|
|
134
|
-
console.log(JSON.stringify({ ok, failures }));
|
|
135
|
-
process.exit(ok ? 0 : 1);
|
package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/verifiers/scale.js
DELETED
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
// F36 hidden verifier — the performance discriminator. 150,000 sessions,
|
|
3
|
-
// each with a 100,000-unit duration (so the natural overlap peak reaches
|
|
4
|
-
// ~100,000 concurrently-active sessions across a wide middle stretch), with
|
|
5
|
-
// `capacity` set to 140,000 — comfortably above the natural peak (so
|
|
6
|
-
// nothing is ever actually deferred, keeping the expected output tiny and
|
|
7
|
-
// the correctness check trivial: everyone is admitted, in start order) but
|
|
8
|
-
// still below `n` (so an implementation cannot mathematically prove up
|
|
9
|
-
// front that capacity never binds and skip active-set tracking entirely —
|
|
10
|
-
// it must genuinely compute the active count per candidate for a batch this
|
|
11
|
-
// size and still get the right, ever-growing answer).
|
|
12
|
-
//
|
|
13
|
-
// Sessions are written to the input file in a shuffled (non-start-sorted)
|
|
14
|
-
// order via a deterministic permutation, so an implementation that trusts
|
|
15
|
-
// file order instead of actually sorting by `start` also fails here.
|
|
16
|
-
//
|
|
17
|
-
// A brute nested-loop-over-all-admitted approach, or a "keep an array of
|
|
18
|
-
// admitted sessions and linearly filter/scan it on every candidate"
|
|
19
|
-
// approach, costs on the order of n * (average active-set size) ~= 150,000
|
|
20
|
-
// * 90,000 =~ 1.35e10 element touches here — many minutes in Node. A
|
|
21
|
-
// genuinely sub-linear-per-op structure (evict-expired + size-check via an
|
|
22
|
-
// ordered-by-end structure) finishes in well under a second. The 15-second
|
|
23
|
-
// hard kill sits far above the efficient solution's expected running time
|
|
24
|
-
// and correspondingly far below any realistic degraded-shortcut running
|
|
25
|
-
// time, so the gate has a wide, non-flaky margin in both directions.
|
|
26
|
-
|
|
27
|
-
const fs = require('node:fs');
|
|
28
|
-
const os = require('node:os');
|
|
29
|
-
const path = require('node:path');
|
|
30
|
-
const { spawnSync } = require('node:child_process');
|
|
31
|
-
|
|
32
|
-
const work = process.env.BENCH_WORKDIR;
|
|
33
|
-
const cli = path.join(work, 'bin', 'cli.js');
|
|
34
|
-
|
|
35
|
-
const N = 150000;
|
|
36
|
-
const DURATION = 100000;
|
|
37
|
-
const CAPACITY = 140000;
|
|
38
|
-
const PERMUTE_MULTIPLIER = 99991; // coprime with N (150000 = 2^4 * 3 * 5^5)
|
|
39
|
-
|
|
40
|
-
const sessions = new Array(N);
|
|
41
|
-
for (let i = 0; i < N; i++) {
|
|
42
|
-
const pos = (i * PERMUTE_MULTIPLIER) % N;
|
|
43
|
-
sessions[pos] = { id: `s-${i}`, start: i, end: i + DURATION };
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
const inputPath = path.join(os.tmpdir(), `admit-scale-${process.pid}.json`);
|
|
47
|
-
fs.writeFileSync(inputPath, JSON.stringify({ capacity: CAPACITY, sessions }));
|
|
48
|
-
|
|
49
|
-
const start = Date.now();
|
|
50
|
-
const result = spawnSync('node', [cli, 'admit', '--input', inputPath], {
|
|
51
|
-
cwd: work,
|
|
52
|
-
encoding: 'utf8',
|
|
53
|
-
timeout: 15000,
|
|
54
|
-
killSignal: 'SIGKILL',
|
|
55
|
-
maxBuffer: 64 * 1024 * 1024,
|
|
56
|
-
});
|
|
57
|
-
const elapsedMs = Date.now() - start;
|
|
58
|
-
|
|
59
|
-
const timedOut = result.status === null && result.signal !== null;
|
|
60
|
-
|
|
61
|
-
let out = null;
|
|
62
|
-
if (!timedOut) {
|
|
63
|
-
try {
|
|
64
|
-
out = JSON.parse(result.stdout);
|
|
65
|
-
} catch {
|
|
66
|
-
out = null;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
const expectedAdmitted = Array.from({ length: N }, (_, i) => `s-${i}`);
|
|
71
|
-
|
|
72
|
-
let correct = false;
|
|
73
|
-
let mismatch = null;
|
|
74
|
-
if (out && Array.isArray(out.admitted) && Array.isArray(out.deferred)) {
|
|
75
|
-
correct =
|
|
76
|
-
out.deferred.length === 0 &&
|
|
77
|
-
out.admitted.length === expectedAdmitted.length &&
|
|
78
|
-
out.admitted.every((id, i) => id === expectedAdmitted[i]);
|
|
79
|
-
if (!correct) {
|
|
80
|
-
mismatch = {
|
|
81
|
-
admittedLength: out.admitted.length,
|
|
82
|
-
deferredLength: out.deferred.length,
|
|
83
|
-
firstMismatchIndex: out.admitted.findIndex((id, i) => id !== expectedAdmitted[i]),
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
const ok = !timedOut && result.status === 0 && result.stderr === '' && correct;
|
|
89
|
-
|
|
90
|
-
console.log(JSON.stringify({
|
|
91
|
-
ok,
|
|
92
|
-
timedOut,
|
|
93
|
-
elapsedMs,
|
|
94
|
-
status: result.status,
|
|
95
|
-
signal: result.signal,
|
|
96
|
-
stderrLength: result.stderr ? result.stderr.length : 0,
|
|
97
|
-
correct,
|
|
98
|
-
mismatch,
|
|
99
|
-
}));
|
|
100
|
-
process.exit(ok ? 0 : 1);
|
package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/verifiers/validation.js
DELETED
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
// F36 hidden verifier — validation happens before any admission decision:
|
|
3
|
-
// malformed capacity/session fields use `invalid_input`, duplicate ids use
|
|
4
|
-
// the distinct `duplicate_session_id` shape, and nothing is admitted or
|
|
5
|
-
// printed to stdout in either case.
|
|
6
|
-
|
|
7
|
-
const fs = require('node:fs');
|
|
8
|
-
const os = require('node:os');
|
|
9
|
-
const path = require('node:path');
|
|
10
|
-
const { spawnSync } = require('node:child_process');
|
|
11
|
-
|
|
12
|
-
const work = process.env.BENCH_WORKDIR;
|
|
13
|
-
const cli = path.join(work, 'bin', 'cli.js');
|
|
14
|
-
|
|
15
|
-
let callCount = 0;
|
|
16
|
-
function runAdmit(payload) {
|
|
17
|
-
callCount += 1;
|
|
18
|
-
const inputPath = path.join(os.tmpdir(), `admit-validate-${process.pid}-${callCount}.json`);
|
|
19
|
-
fs.writeFileSync(inputPath, JSON.stringify(payload));
|
|
20
|
-
const result = spawnSync('node', [cli, 'admit', '--input', inputPath], {
|
|
21
|
-
cwd: work,
|
|
22
|
-
encoding: 'utf8',
|
|
23
|
-
maxBuffer: 16 * 1024 * 1024,
|
|
24
|
-
});
|
|
25
|
-
let err = null;
|
|
26
|
-
try {
|
|
27
|
-
err = JSON.parse(result.stderr);
|
|
28
|
-
} catch {
|
|
29
|
-
err = null;
|
|
30
|
-
}
|
|
31
|
-
return { result, err };
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
const failures = [];
|
|
35
|
-
|
|
36
|
-
function expectInvalidInput(label, payload) {
|
|
37
|
-
const { result, err } = runAdmit(payload);
|
|
38
|
-
const ok = result.status === 2 && result.stdout === '' && err !== null && err.error === 'invalid_input' && typeof err.reason === 'string';
|
|
39
|
-
if (!ok) {
|
|
40
|
-
failures.push({ test: label, status: result.status, stdout: result.stdout, stderr: result.stderr, err });
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
// Non-positive capacity.
|
|
45
|
-
expectInvalidInput('capacity-zero', { capacity: 0, sessions: [{ id: 'a', start: 0, end: 1 }] });
|
|
46
|
-
// Non-integer capacity.
|
|
47
|
-
expectInvalidInput('capacity-float', { capacity: 1.5, sessions: [{ id: 'a', start: 0, end: 1 }] });
|
|
48
|
-
// start >= end.
|
|
49
|
-
expectInvalidInput('start-not-before-end', { capacity: 1, sessions: [{ id: 'a', start: 5, end: 5 }] });
|
|
50
|
-
// Non-integer start.
|
|
51
|
-
expectInvalidInput('non-integer-start', { capacity: 1, sessions: [{ id: 'a', start: 0.5, end: 5 }] });
|
|
52
|
-
// Missing id.
|
|
53
|
-
expectInvalidInput('missing-id', { capacity: 1, sessions: [{ start: 0, end: 5 }] });
|
|
54
|
-
// sessions not an array.
|
|
55
|
-
expectInvalidInput('sessions-not-array', { capacity: 1, sessions: 'nope' });
|
|
56
|
-
|
|
57
|
-
// Duplicate session id — distinct error shape.
|
|
58
|
-
{
|
|
59
|
-
const payload = {
|
|
60
|
-
capacity: 2,
|
|
61
|
-
sessions: [
|
|
62
|
-
{ id: 'dup', start: 0, end: 1 },
|
|
63
|
-
{ id: 'dup', start: 2, end: 3 },
|
|
64
|
-
],
|
|
65
|
-
};
|
|
66
|
-
const { result, err } = runAdmit(payload);
|
|
67
|
-
const ok = result.status === 2 && result.stdout === '' && err !== null && err.error === 'duplicate_session_id' && err.id === 'dup';
|
|
68
|
-
if (!ok) {
|
|
69
|
-
failures.push({ test: 'duplicate-session-id', status: result.status, stdout: result.stdout, stderr: result.stderr, err });
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
const ok = failures.length === 0;
|
|
74
|
-
console.log(JSON.stringify({ ok, failures }));
|
|
75
|
-
process.exit(ok ? 0 : 1);
|