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
|
@@ -1,53 +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-rebalance-'));
|
|
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: 3 },
|
|
16
|
-
{ id: 'team-b', region: 'us', seats: 4, used: 1 },
|
|
17
|
-
{ id: 'team-eu', region: 'eu', seats: 4, used: 0 }
|
|
18
|
-
],
|
|
19
|
-
events: [
|
|
20
|
-
{ id: 'low-reserve', type: 'reserve', account: 'team-b', qty: 3, priority: 1, effective_at: '2026-01-01T09:00:00Z' },
|
|
21
|
-
{ id: 'bad-cross', type: 'transfer', from: 'team-a', to: 'team-eu', qty: 1, priority: 8, effective_at: '2026-01-01T09:02:00Z' },
|
|
22
|
-
{ id: 'high-transfer', type: 'transfer', from: 'team-a', to: 'team-b', qty: 2, priority: 10, effective_at: '2026-01-01T09:05:00Z' },
|
|
23
|
-
{ id: 'after-release', type: 'release', account: 'team-a', qty: 1, priority: 7, effective_at: '2026-01-01T09:03:00Z' },
|
|
24
|
-
{ id: 'after-reserve', type: 'reserve', account: 'team-a', qty: 5, priority: 6, effective_at: '2026-01-01T09:04:00Z' }
|
|
25
|
-
]
|
|
26
|
-
}), 'utf8');
|
|
27
|
-
|
|
28
|
-
const result = spawnSync('node', [cli, 'rebalance-seats', '--input', input], {
|
|
29
|
-
cwd: work,
|
|
30
|
-
encoding: 'utf8'
|
|
31
|
-
});
|
|
32
|
-
assert.strictEqual(result.status, 0, result.stderr || result.stdout);
|
|
33
|
-
assert.strictEqual(result.stderr, '');
|
|
34
|
-
const parsed = JSON.parse(result.stdout);
|
|
35
|
-
|
|
36
|
-
assert.deepStrictEqual(parsed, {
|
|
37
|
-
applied: [
|
|
38
|
-
{ id: 'high-transfer', type: 'transfer' },
|
|
39
|
-
{ id: 'after-release', type: 'release' },
|
|
40
|
-
{ id: 'after-reserve', type: 'reserve' }
|
|
41
|
-
],
|
|
42
|
-
rejected: [
|
|
43
|
-
{ id: 'low-reserve', reason: 'no_capacity' },
|
|
44
|
-
{ id: 'bad-cross', reason: 'region_mismatch' }
|
|
45
|
-
],
|
|
46
|
-
accounts: [
|
|
47
|
-
{ id: 'team-a', region: 'us', seats: 5, used: 5, free: 0 },
|
|
48
|
-
{ id: 'team-b', region: 'us', seats: 4, used: 3, free: 1 },
|
|
49
|
-
{ id: 'team-eu', region: 'eu', seats: 4, used: 0, free: 4 }
|
|
50
|
-
]
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
console.log(JSON.stringify({ ok: true }));
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
# F32 Subscription renewal command
|
|
2
|
-
|
|
3
|
-
## Failure mode
|
|
4
|
-
|
|
5
|
-
This fixture targets billing-style state mutation where an implementation can
|
|
6
|
-
look correct on isolated cases but fail the interaction between renewal
|
|
7
|
-
priority, tentative credit application, rollback after `payment_required`, exact
|
|
8
|
-
credit consumption order, and strict JSON row shapes.
|
|
9
|
-
|
|
10
|
-
## Pipeline phase coverage
|
|
11
|
-
|
|
12
|
-
- PLAN must preserve the exact input/output field names and ordering clauses.
|
|
13
|
-
- RISK_PROBES should derive a compound priority + rollback + shape probe.
|
|
14
|
-
- IMPLEMENT must avoid input-order processing and must not leak tentative credit
|
|
15
|
-
consumption from rejected renewals.
|
|
16
|
-
- VERIFY pair mode should catch aliased keys, extra keys, and weak tests that
|
|
17
|
-
check only one field rather than the full parsed output.
|
|
18
|
-
|
|
19
|
-
## Why existing fixtures do not cover it
|
|
20
|
-
|
|
21
|
-
F25 covers pricing math and output shape, F31 covers entitlement transfers and
|
|
22
|
-
duplicate-id errors, and F23 covers fulfillment rollback. F32 combines billing
|
|
23
|
-
credits with a failed high-priority renewal that must roll back before a later
|
|
24
|
-
renewal can consume credits, plus exact nested output key sets.
|
|
25
|
-
|
|
26
|
-
## Retirement criteria
|
|
27
|
-
|
|
28
|
-
Retire or replace this fixture if both `bare` and `solo_claude` score above 95
|
|
29
|
-
on two current-model runs, or if another active fixture covers priority-ordered
|
|
30
|
-
tentative monetary credit rollback with exact nested output shape and duplicate
|
|
31
|
-
ID error contracts.
|
|
32
|
-
|
|
33
|
-
## Pair-candidate status
|
|
34
|
-
|
|
35
|
-
Rejected as pair-lift evidence by `20260512-f32-subscription-renewal-headroom`:
|
|
36
|
-
bare scored 33, but solo_claude scored 98 and passed all 3 verification
|
|
37
|
-
commands. Keep it as a billing rollback/shape control, not as a pair arm target,
|
|
38
|
-
unless it is reworked and clears a fresh headroom gate.
|
|
@@ -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-credit-rollback.js\"",
|
|
11
|
-
"exit_code": 0,
|
|
12
|
-
"stdout_contains": ["\"ok\":true"],
|
|
13
|
-
"stdout_not_contains": [],
|
|
14
|
-
"contract_refs": [
|
|
15
|
-
"Process renewals globally by `priority` descending, then `requested_at` ascending, then `id` ascending.",
|
|
16
|
-
"A rejected renewal with reason `payment_required` must not consume any credits, even if it tentatively applied credits before discovering the remaining due exceeded `max_due_cents`.",
|
|
17
|
-
"Usable credits are credits for the same customer with `expires_at >= as_of` and `cents > 0`, consumed by `expires_at` ascending, then `id` ascending.",
|
|
18
|
-
"`rejected` is ordered in the original input renewal order. Each row has keys `id` and `reason`.",
|
|
19
|
-
"`remaining_credits` includes only non-expired credits with positive cents after accepted renewals, sorted by `customer`, then `expires_at`, then `id`. Each row has keys `id`, `customer`, `cents`, and `expires_at`.",
|
|
20
|
-
"Output row key names and nested `credits` key names match the visible spec exactly, with no aliased or extra keys."
|
|
21
|
-
]
|
|
22
|
-
},
|
|
23
|
-
{
|
|
24
|
-
"cmd": "node \"$BENCH_FIXTURE_DIR/verifiers/duplicate-renewal-error.js\"",
|
|
25
|
-
"exit_code": 0,
|
|
26
|
-
"stdout_contains": ["\"ok\":true"],
|
|
27
|
-
"stdout_not_contains": [],
|
|
28
|
-
"contract_refs": [
|
|
29
|
-
"Before processing any renewal, duplicate renewal ids are invalid input: exit `2`, write exactly one JSON error object `{ \"error\": \"duplicate_renewal_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 subscription renewal 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": "F32-cli-subscription-renewal",
|
|
3
|
-
"category": "high-risk",
|
|
4
|
-
"difficulty": "hard",
|
|
5
|
-
"timeout_seconds": 1800,
|
|
6
|
-
"required_tools": ["node"],
|
|
7
|
-
"browser": false,
|
|
8
|
-
"deps_change_expected": false,
|
|
9
|
-
"intent": "Add a subscription renewal CLI command that applies expiring credits in priority order with rollback and exact machine-readable output."
|
|
10
|
-
}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: "F32-cli-subscription-renewal"
|
|
3
|
-
title: "Subscription renewal command"
|
|
4
|
-
status: planned
|
|
5
|
-
complexity: high
|
|
6
|
-
depends-on: []
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# F32 Subscription renewal command
|
|
10
|
-
|
|
11
|
-
## Context
|
|
12
|
-
|
|
13
|
-
`bench-cli` currently has greeting and version commands only. The task:
|
|
14
|
-
add a `renew-subscriptions` command that applies subscription renewal requests,
|
|
15
|
-
uses expiring customer credits in deterministic order, rolls back credits when a
|
|
16
|
-
renewal cannot be paid, and prints exact invoice, rejected, and remaining-credit
|
|
17
|
-
rows.
|
|
18
|
-
|
|
19
|
-
This is billing reconciliation. Downstream finance tools parse stdout as JSON,
|
|
20
|
-
so field names, error objects, and row shapes are part of the contract.
|
|
21
|
-
|
|
22
|
-
## Requirements
|
|
23
|
-
|
|
24
|
-
- [ ] `bench-cli renew-subscriptions --input <path>` reads JSON shaped as `{ "as_of": string, "plans": [plan], "customers": [customer], "credits": [credit], "renewals": [renewal] }`.
|
|
25
|
-
- [ ] Each plan has keys `id`, `monthly_cents`, `included_seats`, and `overage_cents`.
|
|
26
|
-
- [ ] Each customer has keys `id`, `plan`, and `active`.
|
|
27
|
-
- [ ] Each credit has keys `id`, `customer`, `cents`, and `expires_at`.
|
|
28
|
-
- [ ] Each renewal has keys `id`, `customer`, `seats`, `months`, `priority`, `requested_at`, and `max_due_cents`.
|
|
29
|
-
- [ ] Before processing any renewal, duplicate renewal ids are invalid input: exit `2`, write exactly one JSON error object `{ "error": "duplicate_renewal_id", "id": string }` to stderr, and write no stdout.
|
|
30
|
-
- [ ] Before processing any renewal, all cents, seat, month, and priority fields must be integers; `monthly_cents`, `overage_cents`, `included_seats`, `cents`, `seats`, and `months` must be non-negative except `seats` and `months` must be positive. Invalid input exits `2` with one JSON error object and no stdout.
|
|
31
|
-
- [ ] Process renewals globally by `priority` descending, then `requested_at` ascending, then `id` ascending.
|
|
32
|
-
- [ ] A renewal rejects with reason `unknown_customer` when the customer does not exist, `inactive_customer` when the customer is inactive, and `unknown_plan` when the customer's plan does not exist.
|
|
33
|
-
- [ ] Renewal subtotal is `(plan.monthly_cents + max(0, seats - plan.included_seats) * plan.overage_cents) * months`.
|
|
34
|
-
- [ ] Usable credits are credits for the same customer with `expires_at >= as_of` and `cents > 0`, consumed by `expires_at` ascending, then `id` ascending.
|
|
35
|
-
- [ ] A renewal accepts only when `subtotal_cents - credit_applied_cents <= max_due_cents`.
|
|
36
|
-
- [ ] A rejected renewal with reason `payment_required` must not consume any credits, even if it tentatively applied credits before discovering the remaining due exceeded `max_due_cents`.
|
|
37
|
-
- [ ] On success, write exactly one JSON object to stdout and no stderr. Keys: `invoices`, `rejected`, `remaining_credits`.
|
|
38
|
-
- [ ] `invoices` is ordered in processing order. Each row has keys `id`, `customer`, `subtotal_cents`, `credit_applied_cents`, `due_cents`, and `credits`.
|
|
39
|
-
- [ ] Each invoice `credits` row has keys `id` and `applied_cents`, ordered by the credit consumption order.
|
|
40
|
-
- [ ] `rejected` is ordered in the original input renewal order. Each row has keys `id` and `reason`.
|
|
41
|
-
- [ ] `remaining_credits` includes only non-expired credits with positive cents after accepted renewals, sorted by `customer`, then `expires_at`, then `id`. Each row has keys `id`, `customer`, `cents`, and `expires_at`.
|
|
42
|
-
- [ ] `tests/cli.test.js` is updated. Existing tests still pass and at least two new tests cover `renew-subscriptions`: one successful priority/rollback scenario and one validation failure.
|
|
43
|
-
|
|
44
|
-
## Constraints
|
|
45
|
-
|
|
46
|
-
- **No new npm dependencies.**
|
|
47
|
-
- **No floating money output.** All public amounts are integer cents.
|
|
48
|
-
- **No hidden mutable global state.** The command must derive output only from the input JSON for that invocation.
|
|
49
|
-
- **No silent catches.** Parse and file-read failures must emit a visible JSON error to stderr and exit `2`.
|
|
50
|
-
- **No extra stdout/stderr text** on the success path; downstream tooling parses stdout as JSON.
|
|
51
|
-
|
|
52
|
-
## Out of Scope
|
|
53
|
-
|
|
54
|
-
- Persisting renewal state between command invocations.
|
|
55
|
-
- Adding invoices to a database or writing files.
|
|
56
|
-
- Adding currencies, payment gateways, or tax rules.
|
|
57
|
-
- Adding web UI or server routes.
|
|
58
|
-
- Touching `server/`, `web/`, or `tests/server.test.js`.
|
|
59
|
-
|
|
60
|
-
## Verification
|
|
61
|
-
|
|
62
|
-
- `node --test tests/cli.test.js` exits 0.
|
|
63
|
-
- A later high-priority renewal is processed before an earlier low-priority renewal, and the low-priority renewal can lose usable credits because of that ordering.
|
|
64
|
-
- A rejected `payment_required` renewal leaves all tentatively applied credits available for later renewals.
|
|
65
|
-
- Credits are consumed by `expires_at` ascending, then `id` ascending, and expired or zero-cent credits are absent from `remaining_credits`.
|
|
66
|
-
- `rejected` rows are reported in the original input renewal order, even though processing order is priority based.
|
|
67
|
-
- Duplicate renewal ids exit `2`, print exactly `{ "error": "duplicate_renewal_id", "id": string }` to stderr, and print no stdout.
|
|
68
|
-
- Output row key names and nested `credits` key names match the visible spec exactly, with no aliased or extra keys.
|
|
69
|
-
- `git diff --stat` shows only `bin/cli.js` and `tests/cli.test.js` touched.
|
|
70
|
-
- Solo-headroom hypothesis: solo_claude is expected to miss payment-required credit rollback or expiring-credit consumption order; observable command `node "$BENCH_FIXTURE_DIR/verifiers/priority-credit-rollback.js"` exposes the miss.
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
Add a subscription renewal CLI command that applies expiring credits in priority order with rollback and exact machine-readable output.
|
|
2
|
-
|
|
3
|
-
The command should be `bench-cli renew-subscriptions --input <path>`. It reads plans, customers, credits, and renewal requests from JSON, processes renewals by priority, applies usable credits in expiration order, rejects unpaid renewals without consuming their tentative credits, and prints JSON invoices, rejected rows, and remaining credits. Keep the change scoped to the CLI and CLI tests, with no new dependencies and no extra stdout/stderr text.
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
const assert = require('node:assert/strict');
|
|
3
|
-
const { mkdtempSync, writeFileSync, rmSync } = require('node:fs');
|
|
4
|
-
const { tmpdir } = require('node:os');
|
|
5
|
-
const { join } = require('node:path');
|
|
6
|
-
const { spawnSync } = require('node:child_process');
|
|
7
|
-
|
|
8
|
-
const workdir = process.env.BENCH_WORKDIR || process.cwd();
|
|
9
|
-
const tmp = mkdtempSync(join(tmpdir(), 'f32-renewal-dup-'));
|
|
10
|
-
|
|
11
|
-
try {
|
|
12
|
-
const inputPath = join(tmp, 'input.json');
|
|
13
|
-
writeFileSync(inputPath, JSON.stringify({
|
|
14
|
-
as_of: '2026-05-15',
|
|
15
|
-
plans: [
|
|
16
|
-
{ id: 'starter', monthly_cents: 1000, included_seats: 5, overage_cents: 200 }
|
|
17
|
-
],
|
|
18
|
-
customers: [
|
|
19
|
-
{ id: 'c1', plan: 'starter', active: true }
|
|
20
|
-
],
|
|
21
|
-
credits: [],
|
|
22
|
-
renewals: [
|
|
23
|
-
{ id: 'dup-renewal', customer: 'c1', seats: 5, months: 1, priority: 1, requested_at: '2026-05-01', max_due_cents: 1000 },
|
|
24
|
-
{ id: 'dup-renewal', customer: 'missing', seats: 5, months: 1, priority: 9, requested_at: '2026-05-02', max_due_cents: 1000 }
|
|
25
|
-
]
|
|
26
|
-
}));
|
|
27
|
-
|
|
28
|
-
const proc = spawnSync('node', ['bin/cli.js', 'renew-subscriptions', '--input', inputPath], {
|
|
29
|
-
cwd: workdir,
|
|
30
|
-
encoding: 'utf8'
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
assert.equal(proc.status, 2, proc.stderr || proc.stdout);
|
|
34
|
-
assert.equal(proc.stdout, '');
|
|
35
|
-
assert.deepEqual(JSON.parse(proc.stderr), {
|
|
36
|
-
error: 'duplicate_renewal_id',
|
|
37
|
-
id: 'dup-renewal'
|
|
38
|
-
});
|
|
39
|
-
process.stdout.write(JSON.stringify({ ok: true }) + '\n');
|
|
40
|
-
} finally {
|
|
41
|
-
rmSync(tmp, { recursive: true, force: true });
|
|
42
|
-
}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
const assert = require('node:assert/strict');
|
|
3
|
-
const { mkdtempSync, writeFileSync, rmSync } = require('node:fs');
|
|
4
|
-
const { tmpdir } = require('node:os');
|
|
5
|
-
const { join } = require('node:path');
|
|
6
|
-
const { spawnSync } = require('node:child_process');
|
|
7
|
-
|
|
8
|
-
const workdir = process.env.BENCH_WORKDIR || process.cwd();
|
|
9
|
-
const tmp = mkdtempSync(join(tmpdir(), 'f32-renewal-'));
|
|
10
|
-
|
|
11
|
-
try {
|
|
12
|
-
const inputPath = join(tmp, 'input.json');
|
|
13
|
-
writeFileSync(inputPath, JSON.stringify({
|
|
14
|
-
as_of: '2026-05-15',
|
|
15
|
-
plans: [
|
|
16
|
-
{ id: 'starter', monthly_cents: 1000, included_seats: 5, overage_cents: 200 },
|
|
17
|
-
{ id: 'pro', monthly_cents: 3000, included_seats: 10, overage_cents: 150 }
|
|
18
|
-
],
|
|
19
|
-
customers: [
|
|
20
|
-
{ id: 'c1', plan: 'starter', active: true },
|
|
21
|
-
{ id: 'c2', plan: 'pro', active: true }
|
|
22
|
-
],
|
|
23
|
-
credits: [
|
|
24
|
-
{ id: 'cr-late', customer: 'c1', cents: 500, expires_at: '2026-06-30' },
|
|
25
|
-
{ id: 'cr-expired', customer: 'c1', cents: 999, expires_at: '2026-04-01' },
|
|
26
|
-
{ id: 'cr-early', customer: 'c1', cents: 400, expires_at: '2026-05-31' },
|
|
27
|
-
{ id: 'cr-zero', customer: 'c1', cents: 0, expires_at: '2026-05-20' },
|
|
28
|
-
{ id: 'cr-c2', customer: 'c2', cents: 1000, expires_at: '2026-12-31' }
|
|
29
|
-
],
|
|
30
|
-
renewals: [
|
|
31
|
-
{ id: 'r-low', customer: 'c1', seats: 5, months: 1, priority: 1, requested_at: '2026-05-01', max_due_cents: 100 },
|
|
32
|
-
{ id: 'r-mid', customer: 'c1', seats: 8, months: 1, priority: 10, requested_at: '2026-05-02', max_due_cents: 0 },
|
|
33
|
-
{ id: 'r-high', customer: 'c1', seats: 8, months: 1, priority: 9, requested_at: '2026-05-03', max_due_cents: 800 }
|
|
34
|
-
]
|
|
35
|
-
}));
|
|
36
|
-
|
|
37
|
-
const proc = spawnSync('node', ['bin/cli.js', 'renew-subscriptions', '--input', inputPath], {
|
|
38
|
-
cwd: workdir,
|
|
39
|
-
encoding: 'utf8'
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
assert.equal(proc.status, 0, proc.stderr || proc.stdout);
|
|
43
|
-
assert.equal(proc.stderr, '');
|
|
44
|
-
const output = JSON.parse(proc.stdout);
|
|
45
|
-
assert.deepEqual(output, {
|
|
46
|
-
invoices: [
|
|
47
|
-
{
|
|
48
|
-
id: 'r-high',
|
|
49
|
-
customer: 'c1',
|
|
50
|
-
subtotal_cents: 1600,
|
|
51
|
-
credit_applied_cents: 900,
|
|
52
|
-
due_cents: 700,
|
|
53
|
-
credits: [
|
|
54
|
-
{ id: 'cr-early', applied_cents: 400 },
|
|
55
|
-
{ id: 'cr-late', applied_cents: 500 }
|
|
56
|
-
]
|
|
57
|
-
}
|
|
58
|
-
],
|
|
59
|
-
rejected: [
|
|
60
|
-
{ id: 'r-low', reason: 'payment_required' },
|
|
61
|
-
{ id: 'r-mid', reason: 'payment_required' }
|
|
62
|
-
],
|
|
63
|
-
remaining_credits: [
|
|
64
|
-
{ id: 'cr-c2', customer: 'c2', cents: 1000, expires_at: '2026-12-31' }
|
|
65
|
-
]
|
|
66
|
-
});
|
|
67
|
-
process.stdout.write(JSON.stringify({ ok: true }) + '\n');
|
|
68
|
-
} finally {
|
|
69
|
-
rmSync(tmp, { recursive: true, force: true });
|
|
70
|
-
}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
# F4 — Notes
|
|
2
|
-
|
|
3
|
-
## Purpose
|
|
4
|
-
|
|
5
|
-
Exercises the browser-validate phase of the pipeline (Phase 1.5). Catches
|
|
6
|
-
web-UI-only regressions that unit tests can't see and that server/integration
|
|
7
|
-
tests won't surface.
|
|
8
|
-
|
|
9
|
-
## Failure modes detected
|
|
10
|
-
|
|
11
|
-
- **Italic via Unicode.** Arms may reach for Unicode italic characters
|
|
12
|
-
(`𝑖𝑡𝑎𝑙𝑖𝑐`) instead of CSS. Spec explicitly forbids this because it breaks
|
|
13
|
-
screen readers.
|
|
14
|
-
- **CDN link.** Linking to Google Fonts or an external CSS cuts the bench
|
|
15
|
-
and breaks offline / air-gapped runs — disqualifier.
|
|
16
|
-
- **Breaking Greet.** Careless refactors rewire the Greet button's handler
|
|
17
|
-
by mistake. Pipeline's Phase 1.5 browser-validate + dedicated spec test
|
|
18
|
-
catches it.
|
|
19
|
-
- **Accessibility drift.** Missing/incorrect `aria-label` on button.
|
|
20
|
-
|
|
21
|
-
## Pipeline exercise
|
|
22
|
-
|
|
23
|
-
- Phase 1.5 BROWSER VALIDATE is the primary gate (web file changes trigger it).
|
|
24
|
-
- Phase 3 CRITIC design checks the DOM structure and event-handler wiring.
|
|
25
|
-
|
|
26
|
-
## Caveats
|
|
27
|
-
|
|
28
|
-
- Playwright requires browser binaries installed locally. If the runner
|
|
29
|
-
machine lacks them, the browser test commands will fail. The suite
|
|
30
|
-
runner can still scoring for diff + grep checks, but the Playwright
|
|
31
|
-
command will show exit ≠ 0.
|
|
32
|
-
- The bench runner sets `BROWSER_METADATA` so future versions can wire
|
|
33
|
-
stricter browser-required gating; today the fixture only checks file
|
|
34
|
-
presence in verification.
|
|
35
|
-
|
|
36
|
-
## Current status
|
|
37
|
-
|
|
38
|
-
Rejected as pair-lift evidence. `20260512-f4-web-headroom` measured bare 70 /
|
|
39
|
-
solo_claude 92, with a +22 solo-over-bare margin, but failed headroom because
|
|
40
|
-
bare exceeded 60, solo exceeded 80, and bare carried judge/result/verify
|
|
41
|
-
disqualifiers. Rework the fixture or verifier before spending a pair arm on it.
|
|
42
|
-
|
|
43
|
-
## Rotation trigger
|
|
44
|
-
|
|
45
|
-
When both `bare` and `solo_claude` consistently produce correct output AND
|
|
46
|
-
include accessible markup without pipeline intervention, rotate to a harder UI
|
|
47
|
-
task (e.g., a form with validation states).
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"verification_commands": [
|
|
3
|
-
{
|
|
4
|
-
"cmd": "grep -q 'id=\"whisper\"' web/index.html && echo OK",
|
|
5
|
-
"exit_code": 0,
|
|
6
|
-
"stdout_contains": [
|
|
7
|
-
"OK"
|
|
8
|
-
],
|
|
9
|
-
"stdout_not_contains": []
|
|
10
|
-
},
|
|
11
|
-
{
|
|
12
|
-
"cmd": "grep -q 'hello from bench-test-repo' web/index.html && echo OK",
|
|
13
|
-
"exit_code": 0,
|
|
14
|
-
"stdout_contains": [
|
|
15
|
-
"OK"
|
|
16
|
-
],
|
|
17
|
-
"stdout_not_contains": []
|
|
18
|
-
},
|
|
19
|
-
{
|
|
20
|
-
"cmd": "grep -qE '(italic|font-style)' web/index.html && echo OK",
|
|
21
|
-
"exit_code": 0,
|
|
22
|
-
"stdout_contains": [
|
|
23
|
-
"OK"
|
|
24
|
-
],
|
|
25
|
-
"stdout_not_contains": []
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
"cmd": "bash -c 'shopt -s nullglob; files=(tests/e2e/*.spec.*); [ ${#files[@]} -gt 0 ] && echo FOUND || { echo MISSING; exit 1; }'",
|
|
29
|
-
"exit_code": 0,
|
|
30
|
-
"stdout_contains": [
|
|
31
|
-
"FOUND"
|
|
32
|
-
],
|
|
33
|
-
"stdout_not_contains": [
|
|
34
|
-
"MISSING"
|
|
35
|
-
]
|
|
36
|
-
}
|
|
37
|
-
],
|
|
38
|
-
"forbidden_patterns": [
|
|
39
|
-
{
|
|
40
|
-
"pattern": "(cdnjs|unpkg|jsdelivr|fonts\\.googleapis)",
|
|
41
|
-
"description": "external CDN reference \u2014 out-of-scope / offline brittleness",
|
|
42
|
-
"files": [
|
|
43
|
-
"web/index.html"
|
|
44
|
-
],
|
|
45
|
-
"severity": "disqualifier"
|
|
46
|
-
}
|
|
47
|
-
],
|
|
48
|
-
"required_files": [
|
|
49
|
-
"web/index.html"
|
|
50
|
-
],
|
|
51
|
-
"forbidden_files": [],
|
|
52
|
-
"max_deps_added": 0,
|
|
53
|
-
"spec_output_files": [
|
|
54
|
-
"web/index.html",
|
|
55
|
-
"tests/e2e/**"
|
|
56
|
-
]
|
|
57
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "F4-web-browser-design",
|
|
3
|
-
"category": "stress",
|
|
4
|
-
"difficulty": "medium",
|
|
5
|
-
"timeout_seconds": 1800,
|
|
6
|
-
"required_tools": ["node", "npx"],
|
|
7
|
-
"browser": true,
|
|
8
|
-
"deps_change_expected": false,
|
|
9
|
-
"intent": "Add a second button labelled 'Whisper' to web/index.html that, when clicked, replaces the #output text with 'hello from bench-test-repo' rendered in lowercase italic. The existing 'Greet' button continues to work unchanged. Tests exercise both buttons via the static page (no server)."
|
|
10
|
-
}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: "F4-web-browser-design"
|
|
3
|
-
title: "Add a Whisper button with italic lowercase output"
|
|
4
|
-
status: planned
|
|
5
|
-
complexity: medium
|
|
6
|
-
depends-on: []
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# F4 Add Whisper button
|
|
10
|
-
|
|
11
|
-
## Context
|
|
12
|
-
|
|
13
|
-
`web/index.html` currently has one button ("Greet") that fills `#output`
|
|
14
|
-
with `Hello from bench-test-repo`. Add a second button beside it labelled
|
|
15
|
-
`Whisper` that fills `#output` with `hello from bench-test-repo` — lowercase
|
|
16
|
-
and italicized — using only the page's own CSS/JS.
|
|
17
|
-
|
|
18
|
-
## Requirements
|
|
19
|
-
|
|
20
|
-
- [ ] A new `<button id="whisper">Whisper</button>` renders beside the existing `#greet` button.
|
|
21
|
-
- [ ] Clicking `#whisper` sets `#output` textContent to `hello from bench-test-repo` (lowercase, no exclamation).
|
|
22
|
-
- [ ] `#output`'s rendering of the whisper text is italic. Use CSS (inline, a class, or toggling a class). Do not rely on Unicode italic characters.
|
|
23
|
-
- [ ] Clicking `#greet` continues to set `#output` to `Hello from bench-test-repo` as before (no italic styling).
|
|
24
|
-
- [ ] A text node in `#output` is readable by Playwright via `data-testid="output"` (already present in the baseline).
|
|
25
|
-
- [ ] Minimal diff: only `web/index.html` and any new files directly needed for the test harness (e.g., `tests/e2e/whisper.spec.js` per the existing Playwright config).
|
|
26
|
-
|
|
27
|
-
## Constraints
|
|
28
|
-
|
|
29
|
-
- **No new npm dependencies.** Playwright is already scripted via `npx serve` and the repo's `playwright.config.js`.
|
|
30
|
-
- **No external resources.** Don't link to CDN fonts, external CSS, or remote images.
|
|
31
|
-
- **No inline JS frameworks.** Stick to the vanilla pattern already in `index.html`.
|
|
32
|
-
- **Accessibility.** Both buttons must have accessible names equal to their visible labels; `#whisper` adds `aria-label="whisper"` only if its visible text differs (it doesn't, so leave it off).
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
## Out of Scope
|
|
36
|
-
|
|
37
|
-
- Animations / transitions.
|
|
38
|
-
- Theme toggle / dark mode.
|
|
39
|
-
- Any change to `bin/cli.js`, `server/`, or CLI tests.
|
|
40
|
-
- Moving styles into a separate .css file.
|
|
41
|
-
|
|
42
|
-
## Verification
|
|
43
|
-
|
|
44
|
-
- Page loads: `npx serve -l 5173 web &` + `curl -s http://127.0.0.1:5173/` returns HTML containing `<button id="whisper"`.
|
|
45
|
-
- Clicking whisper produces `hello from bench-test-repo` in `#output` — verifiable via Playwright:
|
|
46
|
-
`npx playwright test tests/e2e/` passes the whisper spec.
|
|
47
|
-
- Clicking greet still produces `Hello from bench-test-repo` (test stays green).
|
|
48
|
-
- `git diff --stat` shows only `web/index.html` and the added Playwright test file.
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
Add a second button next to the existing "Greet" button in `web/index.html`, labelled "Whisper". When clicked, it should set `#output` to `hello from bench-test-repo` (lowercase, no exclamation mark) rendered in italic.
|
|
2
|
-
|
|
3
|
-
The existing "Greet" button must continue to set `#output` to `Hello from bench-test-repo` as before — no italic, no change.
|
|
4
|
-
|
|
5
|
-
Keep everything self-contained in the page: no CDN fonts, no new npm dependencies, no external resources. Use the same vanilla JS pattern that's already there.
|
|
6
|
-
|
|
7
|
-
Write a Playwright test under `tests/e2e/` that exercises both buttons. The repo already has `playwright.config.js` and serves `web/` via `npx serve -l 5173`.
|
|
8
|
-
|
|
9
|
-
Only touch `web/index.html` and the new Playwright test file.
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
# F5 — Notes
|
|
2
|
-
|
|
3
|
-
## Purpose
|
|
4
|
-
|
|
5
|
-
The suite's FIX LOOP stress test. The tests are intentionally constructed so
|
|
6
|
-
the obvious first-pass implementation (simple `input.split(' ').filter(w => w === word).length`) passes the basic count case but fails on:
|
|
7
|
-
|
|
8
|
-
- Case insensitivity (`Cat` should match `cat`).
|
|
9
|
-
- Whole-word boundaries (`cat` should NOT match inside `category`).
|
|
10
|
-
- Empty-stdin edge (returning `undefined` instead of `0`).
|
|
11
|
-
|
|
12
|
-
Variant's pipeline is expected to:
|
|
13
|
-
1. BUILD produces a first implementation.
|
|
14
|
-
2. BUILD GATE runs `node --test`; some tests fail.
|
|
15
|
-
3. EVAL emits findings with `criterion_ref` pointing at specific failing cases.
|
|
16
|
-
4. FIX LOOP round 1 targets those findings and converges.
|
|
17
|
-
|
|
18
|
-
Bare, without a forcing mechanism, often ships the first implementation and
|
|
19
|
-
calls it done. Verification catches that.
|
|
20
|
-
|
|
21
|
-
## Failure modes detected
|
|
22
|
-
|
|
23
|
-
- **Partial implementation.** Naive token split without regex word boundaries.
|
|
24
|
-
- **Case handling.** Missing `.toLowerCase()` on both sides of the comparison.
|
|
25
|
-
- **Async stdin.** Using `process.stdin.on('data')` without handling `end` properly → program hangs on test invocation.
|
|
26
|
-
- **Forgotten empty case.** `stdin.read()` returning `null` → `null.length` or `undefined` output.
|
|
27
|
-
|
|
28
|
-
## Pipeline exercise
|
|
29
|
-
|
|
30
|
-
- **Phase 2 EVAL** is the star: it must identify each failing test case with file:line evidence.
|
|
31
|
-
- **Phase 2.5 FIX LOOP** runs at least once. A fixture passing with 0 fix rounds is a smoke signal that the test-trap design is too lenient; inspect.
|
|
32
|
-
- **Phase 1.4 BUILD GATE** uses `node --test` which exits non-zero on any failure, forcing route to 2.5.
|
|
33
|
-
|
|
34
|
-
## Current status
|
|
35
|
-
|
|
36
|
-
Rejected as pair-lift evidence. `20260512-f5-fixloop-headroom` measured bare
|
|
37
|
-
99 / solo_claude 99, with bare and solo each passing 5/5 verification commands.
|
|
38
|
-
It fails both headroom preconditions and should remain a fix-loop control unless
|
|
39
|
-
reworked.
|
|
40
|
-
|
|
41
|
-
## Rotation trigger
|
|
42
|
-
|
|
43
|
-
When fix rounds consistently = 0 across two shipped versions, the trap is too
|
|
44
|
-
easy. Stiffen by adding a fourth test edge (e.g., Unicode folding, hyphenated
|
|
45
|
-
words).
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"verification_commands": [
|
|
3
|
-
{
|
|
4
|
-
"cmd": "node --test tests/count.test.js",
|
|
5
|
-
"exit_code": 0,
|
|
6
|
-
"stdout_contains": [],
|
|
7
|
-
"stdout_not_contains": [
|
|
8
|
-
"not ok "
|
|
9
|
-
]
|
|
10
|
-
},
|
|
11
|
-
{
|
|
12
|
-
"cmd": "echo 'cat hat CAT category' | node bin/cli.js count cat",
|
|
13
|
-
"exit_code": 0,
|
|
14
|
-
"stdout_contains": [
|
|
15
|
-
"2"
|
|
16
|
-
],
|
|
17
|
-
"stdout_not_contains": [
|
|
18
|
-
"3",
|
|
19
|
-
"4"
|
|
20
|
-
]
|
|
21
|
-
},
|
|
22
|
-
{
|
|
23
|
-
"cmd": "echo '' | node bin/cli.js count cat",
|
|
24
|
-
"exit_code": 0,
|
|
25
|
-
"stdout_contains": [
|
|
26
|
-
"0"
|
|
27
|
-
],
|
|
28
|
-
"stdout_not_contains": []
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
"cmd": "node bin/cli.js count",
|
|
32
|
-
"exit_code": 1,
|
|
33
|
-
"stdout_contains": [],
|
|
34
|
-
"stdout_not_contains": []
|
|
35
|
-
},
|
|
36
|
-
{
|
|
37
|
-
"cmd": "node bin/cli.js hello",
|
|
38
|
-
"exit_code": 0,
|
|
39
|
-
"stdout_contains": [
|
|
40
|
-
"Hello, world!"
|
|
41
|
-
],
|
|
42
|
-
"stdout_not_contains": []
|
|
43
|
-
}
|
|
44
|
-
],
|
|
45
|
-
"forbidden_patterns": [
|
|
46
|
-
{
|
|
47
|
-
"pattern": "catch\\s*\\([^)]*\\)\\s*\\{\\s*\\}",
|
|
48
|
-
"description": "empty catch block \u2014 silent error suppression",
|
|
49
|
-
"files": [
|
|
50
|
-
"bin/cli.js"
|
|
51
|
-
],
|
|
52
|
-
"severity": "disqualifier"
|
|
53
|
-
}
|
|
54
|
-
],
|
|
55
|
-
"required_files": [
|
|
56
|
-
"bin/cli.js",
|
|
57
|
-
"tests/count.test.js"
|
|
58
|
-
],
|
|
59
|
-
"forbidden_files": [],
|
|
60
|
-
"max_deps_added": 0,
|
|
61
|
-
"spec_output_files": [
|
|
62
|
-
"bin/cli.js",
|
|
63
|
-
"tests/**/count.test.js"
|
|
64
|
-
]
|
|
65
|
-
}
|