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,256 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""
|
|
3
|
-
oracle-scope-tier-a.py — deterministic detector for categorical file-path
|
|
4
|
-
violations. Flags touches of paths that are never legitimately needed by an
|
|
5
|
-
implementation task (planning docs, CI config, dep-install output, runtime
|
|
6
|
-
artifacts, env/secret files) and lockfile deletions.
|
|
7
|
-
|
|
8
|
-
Complementary to oracle-test-fidelity.py, which handles weakening INSIDE
|
|
9
|
-
existing test files. This oracle only cares about WHICH files are touched.
|
|
10
|
-
|
|
11
|
-
Path matching uses fnmatch with normalized, repo-root-relative paths.
|
|
12
|
-
`docs/**` matches `docs/<anything>` but NOT `server/docs/readme.md` — the
|
|
13
|
-
anchoring is left-only, which is what we want. Per-oracle convention
|
|
14
|
-
documented here; step 1's content oracle uses regex instead.
|
|
15
|
-
|
|
16
|
-
Fixtures can waive any Tier A pattern via `expected.json::tier_a_waivers`
|
|
17
|
-
(list of fnmatch globs). Load-bearing case: F9 e2e-ideate-to-resolve
|
|
18
|
-
legitimately creates docs/VISION.md, docs/ROADMAP.md, docs/roadmap/**.
|
|
19
|
-
|
|
20
|
-
Step 2 scope: findings only. Scoring integration is a later step.
|
|
21
|
-
"""
|
|
22
|
-
import argparse
|
|
23
|
-
import fnmatch
|
|
24
|
-
import json
|
|
25
|
-
import os
|
|
26
|
-
import pathlib
|
|
27
|
-
import subprocess
|
|
28
|
-
import sys
|
|
29
|
-
|
|
30
|
-
from pair_evidence_contract import loads_strict_json_object
|
|
31
|
-
|
|
32
|
-
ORACLE_NAME = "scope-tier-a"
|
|
33
|
-
|
|
34
|
-
# iter-0022: stable category enumeration. See header comment in
|
|
35
|
-
# oracle-test-fidelity.py for the edit-discipline rules. tier-a-violation is
|
|
36
|
-
# ONE umbrella category covering the 5 path-glob groups (planning-doc,
|
|
37
|
-
# ci-config, node-modules, test-results-or-coverage, env-secrets) plus the 2
|
|
38
|
-
# basename rules (.log suffix, .env/secrets. prefix); splitting into 7 sub-
|
|
39
|
-
# categories was rejected during iter-0022 R0 because the oracle emits a
|
|
40
|
-
# single finding-row per touched path regardless.
|
|
41
|
-
CATEGORIES = [
|
|
42
|
-
{
|
|
43
|
-
"id": "scope-tier-a:lockfile-deletion",
|
|
44
|
-
"severity": "hard",
|
|
45
|
-
"applies_when": "scaffold contains a lockfile (package-lock.json / yarn.lock / pnpm-lock.yaml / bun.lock / bun.lockb)",
|
|
46
|
-
"operational_check": "variant arm MUST NOT delete a scaffold-present lockfile",
|
|
47
|
-
"evidence_source_files": ["oracle-scope-tier-a.py"],
|
|
48
|
-
},
|
|
49
|
-
{
|
|
50
|
-
"id": "scope-tier-a:tier-a-violation",
|
|
51
|
-
"severity": "hard",
|
|
52
|
-
"applies_when": "any fixture (the protected paths exist conceptually for every JS/TS repo)",
|
|
53
|
-
"operational_check": "variant arm MUST NOT add or modify paths matching: docs/roadmap/** | docs/VISION.md | docs/ROADMAP.md | .github/** | node_modules/** | **/node_modules/** | test-results/** | coverage/** | .nyc_output/** | basename suffix .log | basename prefix .env or secrets.",
|
|
54
|
-
"evidence_source_files": ["oracle-scope-tier-a.py"],
|
|
55
|
-
},
|
|
56
|
-
]
|
|
57
|
-
|
|
58
|
-
# Path globs — fnmatch-style, left-anchored. `**` is treated as `*` by
|
|
59
|
-
# fnmatch (no special recursive semantics), so `docs/roadmap/**` matches
|
|
60
|
-
# `docs/roadmap/anything/nested/here` because `*` matches `/` in fnmatch.
|
|
61
|
-
TIER_A_PATH_GLOBS = [
|
|
62
|
-
# Planning docs — implementation tasks should never edit these.
|
|
63
|
-
"docs/roadmap/**",
|
|
64
|
-
"docs/VISION.md",
|
|
65
|
-
"docs/ROADMAP.md",
|
|
66
|
-
# CI / repo-wide config.
|
|
67
|
-
".github/**",
|
|
68
|
-
# Install outputs.
|
|
69
|
-
"node_modules/**",
|
|
70
|
-
"**/node_modules/**",
|
|
71
|
-
# Runtime / test artifacts.
|
|
72
|
-
"test-results/**",
|
|
73
|
-
"coverage/**",
|
|
74
|
-
".nyc_output/**",
|
|
75
|
-
]
|
|
76
|
-
|
|
77
|
-
# Basename suffix matches (run against os.path.basename so any depth hits).
|
|
78
|
-
TIER_A_BASENAME_SUFFIXES = {
|
|
79
|
-
".log",
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
# Basename prefix matches. `.env` → `.env`, `.env.local`, `.env.production`.
|
|
83
|
-
# `secrets.` → `secrets.json`, `secrets.yaml`.
|
|
84
|
-
TIER_A_BASENAME_PREFIXES = {
|
|
85
|
-
".env",
|
|
86
|
-
"secrets.",
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
# Lockfiles — modification is legitimate when deps change; deletion is not.
|
|
90
|
-
# Only flag D status AND only if the file existed at scaffold.
|
|
91
|
-
LOCKFILE_NAMES = {
|
|
92
|
-
"package-lock.json",
|
|
93
|
-
"yarn.lock",
|
|
94
|
-
"pnpm-lock.yaml",
|
|
95
|
-
"bun.lock",
|
|
96
|
-
"bun.lockb",
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
def run_git(args, cwd):
|
|
101
|
-
return subprocess.run(
|
|
102
|
-
["git", *args], cwd=cwd, capture_output=True, text=True
|
|
103
|
-
)
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
def git_diff_status(scaffold_sha, cwd):
|
|
107
|
-
r = run_git(["diff", "--name-status", "-M", scaffold_sha], cwd=cwd)
|
|
108
|
-
entries = []
|
|
109
|
-
for line in r.stdout.splitlines():
|
|
110
|
-
line = line.strip()
|
|
111
|
-
if not line:
|
|
112
|
-
continue
|
|
113
|
-
parts = line.split("\t")
|
|
114
|
-
status = parts[0]
|
|
115
|
-
if status.startswith("R") or status.startswith("C"):
|
|
116
|
-
if len(parts) >= 3:
|
|
117
|
-
# Treat as new path; keep R/C letter for reporting.
|
|
118
|
-
entries.append((status[0], parts[2]))
|
|
119
|
-
else:
|
|
120
|
-
if len(parts) >= 2:
|
|
121
|
-
entries.append((status, parts[1]))
|
|
122
|
-
return entries
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
def existed_at_scaffold(scaffold_sha, path, cwd):
|
|
126
|
-
r = run_git(["cat-file", "-e", f"{scaffold_sha}:{path}"], cwd=cwd)
|
|
127
|
-
return r.returncode == 0
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
def matches_any_glob(path, patterns):
|
|
131
|
-
for p in patterns:
|
|
132
|
-
if fnmatch.fnmatch(path, p):
|
|
133
|
-
return p
|
|
134
|
-
return None
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
def matches_basename(path, suffixes, prefixes):
|
|
138
|
-
base = os.path.basename(path)
|
|
139
|
-
for s in suffixes:
|
|
140
|
-
if base.endswith(s):
|
|
141
|
-
return f"*{s}"
|
|
142
|
-
for p in prefixes:
|
|
143
|
-
if base.startswith(p):
|
|
144
|
-
return f"{p}*"
|
|
145
|
-
return None
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
def is_waived(path, waivers):
|
|
149
|
-
for w in waivers:
|
|
150
|
-
if fnmatch.fnmatch(path, w):
|
|
151
|
-
return True
|
|
152
|
-
return False
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
def analyze(work_dir, scaffold_sha, waivers, fixture_id=None):
|
|
156
|
-
findings = []
|
|
157
|
-
entries = git_diff_status(scaffold_sha, work_dir)
|
|
158
|
-
|
|
159
|
-
for status, path in entries:
|
|
160
|
-
if is_waived(path, waivers):
|
|
161
|
-
continue
|
|
162
|
-
|
|
163
|
-
# Lockfile deletion — only when file existed at scaffold.
|
|
164
|
-
if status == "D" and os.path.basename(path) in LOCKFILE_NAMES:
|
|
165
|
-
if existed_at_scaffold(scaffold_sha, path, work_dir):
|
|
166
|
-
findings.append({
|
|
167
|
-
"file": path,
|
|
168
|
-
"type": "lockfile-deletion",
|
|
169
|
-
"severity": "hard",
|
|
170
|
-
"status": status,
|
|
171
|
-
"verdict": "Lockfile deleted (existed at scaffold)",
|
|
172
|
-
})
|
|
173
|
-
continue
|
|
174
|
-
|
|
175
|
-
# For categorical path violations, only flag when the arm ADDED or
|
|
176
|
-
# MODIFIED (including rename/copy). Pure deletion of a non-lockfile
|
|
177
|
-
# Tier A path would also be suspicious but is rare in practice and
|
|
178
|
-
# overlaps with test-fidelity; leave for a later iteration if needed.
|
|
179
|
-
if status not in ("A", "M", "R", "C"):
|
|
180
|
-
continue
|
|
181
|
-
|
|
182
|
-
matched = matches_any_glob(path, TIER_A_PATH_GLOBS)
|
|
183
|
-
if matched is None:
|
|
184
|
-
matched = matches_basename(
|
|
185
|
-
path, TIER_A_BASENAME_SUFFIXES, TIER_A_BASENAME_PREFIXES
|
|
186
|
-
)
|
|
187
|
-
if matched is None:
|
|
188
|
-
continue
|
|
189
|
-
|
|
190
|
-
findings.append({
|
|
191
|
-
"file": path,
|
|
192
|
-
"type": "tier-a-violation",
|
|
193
|
-
"severity": "hard",
|
|
194
|
-
"status": status,
|
|
195
|
-
"matched_pattern": matched,
|
|
196
|
-
"verdict": "Touched a path categorically outside implementation scope",
|
|
197
|
-
})
|
|
198
|
-
|
|
199
|
-
return findings
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
def main():
|
|
203
|
-
ap = argparse.ArgumentParser()
|
|
204
|
-
ap.add_argument("--work")
|
|
205
|
-
ap.add_argument("--scaffold")
|
|
206
|
-
ap.add_argument(
|
|
207
|
-
"--expected",
|
|
208
|
-
help="Path to fixture expected.json (for tier_a_waivers)",
|
|
209
|
-
default=None,
|
|
210
|
-
)
|
|
211
|
-
ap.add_argument(
|
|
212
|
-
"--list-categories",
|
|
213
|
-
action="store_true",
|
|
214
|
-
help="Emit the stable oracle CATEGORIES enum as JSON and exit (iter-0022).",
|
|
215
|
-
)
|
|
216
|
-
args = ap.parse_args()
|
|
217
|
-
|
|
218
|
-
if args.list_categories:
|
|
219
|
-
print(json.dumps({"oracle": ORACLE_NAME, "categories": CATEGORIES}, indent=2, sort_keys=True))
|
|
220
|
-
return
|
|
221
|
-
|
|
222
|
-
if not args.work or not args.scaffold:
|
|
223
|
-
ap.error("--work and --scaffold are required unless --list-categories is set")
|
|
224
|
-
|
|
225
|
-
waivers = []
|
|
226
|
-
fixture_id = None
|
|
227
|
-
expected_error = None
|
|
228
|
-
if args.expected:
|
|
229
|
-
exp_path = pathlib.Path(args.expected)
|
|
230
|
-
# fixture_id = parent directory name of expected.json
|
|
231
|
-
fixture_id = exp_path.parent.name
|
|
232
|
-
try:
|
|
233
|
-
expected = loads_strict_json_object(exp_path.read_text())
|
|
234
|
-
raw = expected.get("tier_a_waivers", [])
|
|
235
|
-
if isinstance(raw, list):
|
|
236
|
-
waivers = [w for w in raw if isinstance(w, str)]
|
|
237
|
-
except (OSError, json.JSONDecodeError, ValueError) as e:
|
|
238
|
-
expected_error = f"expected.json unreadable: {e}"
|
|
239
|
-
sys.stderr.write(
|
|
240
|
-
f"[oracle-scope-tier-a] could not read waivers from {args.expected}: {e}\n"
|
|
241
|
-
)
|
|
242
|
-
|
|
243
|
-
findings = analyze(args.work, args.scaffold, waivers, fixture_id=fixture_id)
|
|
244
|
-
report = {
|
|
245
|
-
"oracle": "scope-tier-a",
|
|
246
|
-
"waivers": waivers,
|
|
247
|
-
"fixture_id": fixture_id,
|
|
248
|
-
"findings": findings,
|
|
249
|
-
}
|
|
250
|
-
if expected_error:
|
|
251
|
-
report["error"] = expected_error
|
|
252
|
-
print(json.dumps(report, indent=2))
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
if __name__ == "__main__":
|
|
256
|
-
main()
|
|
@@ -1,287 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""
|
|
3
|
-
oracle-scope-tier-b.py — transitive-import classifier for benchmark arm diffs.
|
|
4
|
-
|
|
5
|
-
For each arm-touched file that is NOT in Tier C (spec_output_files) and NOT
|
|
6
|
-
in tier_a_waivers, determines whether it is reachable from a Tier C seed via
|
|
7
|
-
the static import/require graph:
|
|
8
|
-
- Reachable → `tier-b-reachable` (legitimate structural extension)
|
|
9
|
-
- Unreachable → `scope-unmatched` (may overlap with step 2's Tier A globals;
|
|
10
|
-
step 5's scoring dedupes against step 2)
|
|
11
|
-
|
|
12
|
-
BFS seeds = (spec_output_files glob matches in POST-arm work_dir) ∩
|
|
13
|
-
(arm-touched files).
|
|
14
|
-
The intersection prevents BFS blow-up when Tier C globs are broad (e.g.
|
|
15
|
-
`bin/**`) and keeps the trace meaningful — "what the arm changed and where
|
|
16
|
-
did it propagate?" not "every theoretically-in-scope file."
|
|
17
|
-
|
|
18
|
-
Step 4 scope:
|
|
19
|
-
- JS/TS only (matches step 1 language scope). TS tsconfig path aliases NOT
|
|
20
|
-
handled; none of the current fixtures use them.
|
|
21
|
-
- Static string-literal imports only. Dynamic requires via variables
|
|
22
|
-
(`require(someVar)`) are invisible to the trace — documented limitation.
|
|
23
|
-
- Findings-only at this stage; scoring integration is step 5.
|
|
24
|
-
|
|
25
|
-
The `trace_method: "regex"` field in the output lets step 5 differentiate
|
|
26
|
-
heuristic traces from future AST-based traces without schema changes.
|
|
27
|
-
"""
|
|
28
|
-
import argparse
|
|
29
|
-
import fnmatch
|
|
30
|
-
import json
|
|
31
|
-
import os
|
|
32
|
-
import pathlib
|
|
33
|
-
import re
|
|
34
|
-
import subprocess
|
|
35
|
-
import sys
|
|
36
|
-
|
|
37
|
-
from pair_evidence_contract import loads_strict_json_object
|
|
38
|
-
|
|
39
|
-
ORACLE_NAME = "scope-tier-b"
|
|
40
|
-
|
|
41
|
-
# iter-0022: stable category enumeration. tier-b-reachable is `info` severity
|
|
42
|
-
# (positive signal: touched file is reachable from spec_output_files via
|
|
43
|
-
# static imports) and is intentionally OMITTED from the registry — it is
|
|
44
|
-
# context, not an invariant violation. Only scope-unmatched is registered.
|
|
45
|
-
CATEGORIES = [
|
|
46
|
-
{
|
|
47
|
-
"id": "scope-tier-b:scope-unmatched",
|
|
48
|
-
"severity": "warn",
|
|
49
|
-
"applies_when": "fixture has expected.json:spec_output_files (the BFS seed set is non-empty)",
|
|
50
|
-
"operational_check": "every variant-touched file MUST be either inside spec_output_files (Tier C) OR reachable from a Tier C seed via static JS/TS imports OR matched by expected.json:tier_a_waivers",
|
|
51
|
-
"evidence_source_files": ["oracle-scope-tier-b.py"],
|
|
52
|
-
},
|
|
53
|
-
]
|
|
54
|
-
|
|
55
|
-
TRACE_METHOD = "regex"
|
|
56
|
-
|
|
57
|
-
# Static-import patterns. Order matters only for readability; duplicates
|
|
58
|
-
# are harmless because we dedupe by resolved path in BFS.
|
|
59
|
-
IMPORT_PATTERNS = [
|
|
60
|
-
# CommonJS: require('./foo')
|
|
61
|
-
r"require\(\s*['\"]([^'\"]+)['\"]\s*\)",
|
|
62
|
-
# ES module static import (with or without binding)
|
|
63
|
-
r"import\s+(?:[\w*{},\s\n]+\s+from\s+)?['\"]([^'\"]+)['\"]",
|
|
64
|
-
# ES module re-export
|
|
65
|
-
r"export\s+(?:\*|\{[^}]*\})\s+from\s+['\"]([^'\"]+)['\"]",
|
|
66
|
-
# Dynamic import with string literal
|
|
67
|
-
r"import\(\s*['\"]([^'\"]+)['\"]\s*\)",
|
|
68
|
-
]
|
|
69
|
-
|
|
70
|
-
# Extension order for resolution. .json is a valid import target but is a
|
|
71
|
-
# leaf (we don't recurse into it).
|
|
72
|
-
RESOLUTION_EXTENSIONS = (".js", ".mjs", ".cjs", ".ts", ".tsx", ".jsx", ".json")
|
|
73
|
-
TRACEABLE_EXTENSIONS = (".js", ".mjs", ".cjs", ".ts", ".tsx", ".jsx")
|
|
74
|
-
INDEX_EXTENSIONS = (".js", ".mjs", ".ts")
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
def is_relative(spec: str) -> bool:
|
|
78
|
-
return spec.startswith("./") or spec.startswith("../") or spec.startswith("/")
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
def resolve_import(source_rel: str, spec: str, work_dir: pathlib.Path):
|
|
82
|
-
"""Resolve a relative import. Returns a repo-root-relative path or None."""
|
|
83
|
-
if spec.startswith("/"):
|
|
84
|
-
target = spec.lstrip("/")
|
|
85
|
-
else:
|
|
86
|
-
source_dir = os.path.dirname(source_rel)
|
|
87
|
-
target = os.path.normpath(os.path.join(source_dir, spec))
|
|
88
|
-
# Normalize to forward slashes
|
|
89
|
-
target = target.replace(os.sep, "/")
|
|
90
|
-
# Reject paths that escape work_dir (e.g. `../../outside-repo`)
|
|
91
|
-
if target.startswith("../") or target.startswith("/"):
|
|
92
|
-
return None
|
|
93
|
-
# Exact file
|
|
94
|
-
if (work_dir / target).is_file():
|
|
95
|
-
return target
|
|
96
|
-
# Suffix candidates
|
|
97
|
-
for ext in RESOLUTION_EXTENSIONS:
|
|
98
|
-
cand = f"{target}{ext}"
|
|
99
|
-
if (work_dir / cand).is_file():
|
|
100
|
-
return cand
|
|
101
|
-
# /index.* in directory
|
|
102
|
-
for ext in INDEX_EXTENSIONS:
|
|
103
|
-
cand = f"{target}/index{ext}"
|
|
104
|
-
if (work_dir / cand).is_file():
|
|
105
|
-
return cand
|
|
106
|
-
return None
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
def read_imports(file_path: pathlib.Path):
|
|
110
|
-
try:
|
|
111
|
-
content = file_path.read_text(encoding="utf-8", errors="replace")
|
|
112
|
-
except OSError:
|
|
113
|
-
return []
|
|
114
|
-
specs = []
|
|
115
|
-
for pattern in IMPORT_PATTERNS:
|
|
116
|
-
for m in re.finditer(pattern, content, re.MULTILINE):
|
|
117
|
-
specs.append(m.group(1))
|
|
118
|
-
return specs
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
def bfs_trace(seeds, work_dir: pathlib.Path):
|
|
122
|
-
"""BFS following static imports. Returns dict: path → (depth, via)."""
|
|
123
|
-
reachable = {s: (0, None) for s in seeds}
|
|
124
|
-
queue = [(s, 0) for s in seeds]
|
|
125
|
-
while queue:
|
|
126
|
-
current, depth = queue.pop(0)
|
|
127
|
-
if not any(current.endswith(ext) for ext in TRACEABLE_EXTENSIONS):
|
|
128
|
-
continue
|
|
129
|
-
full = work_dir / current
|
|
130
|
-
if not full.is_file():
|
|
131
|
-
continue
|
|
132
|
-
for spec in read_imports(full):
|
|
133
|
-
if not is_relative(spec):
|
|
134
|
-
continue
|
|
135
|
-
resolved = resolve_import(current, spec, work_dir)
|
|
136
|
-
if resolved is None or resolved in reachable:
|
|
137
|
-
continue
|
|
138
|
-
if "node_modules" in resolved.split("/"):
|
|
139
|
-
continue
|
|
140
|
-
reachable[resolved] = (depth + 1, current)
|
|
141
|
-
queue.append((resolved, depth + 1))
|
|
142
|
-
return reachable
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
def git_touched_files(scaffold_sha: str, work_dir: pathlib.Path):
|
|
146
|
-
"""Arm-touched files (relative paths), excluding deletions."""
|
|
147
|
-
r = subprocess.run(
|
|
148
|
-
["git", "diff", "--name-status", "-M", scaffold_sha],
|
|
149
|
-
cwd=str(work_dir), capture_output=True, text=True,
|
|
150
|
-
)
|
|
151
|
-
touched = []
|
|
152
|
-
for line in r.stdout.splitlines():
|
|
153
|
-
parts = line.split("\t")
|
|
154
|
-
if len(parts) < 2:
|
|
155
|
-
continue
|
|
156
|
-
status = parts[0]
|
|
157
|
-
if status == "D":
|
|
158
|
-
continue
|
|
159
|
-
path = parts[-1]
|
|
160
|
-
touched.append(path)
|
|
161
|
-
return touched
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
def match_any(path: str, patterns) -> bool:
|
|
165
|
-
return any(fnmatch.fnmatch(path, p) for p in patterns)
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
def analyze(work_dir_str: str, scaffold_sha: str, tier_c_globs, waivers,
|
|
169
|
-
fixture_id=None):
|
|
170
|
-
work_dir = pathlib.Path(work_dir_str).resolve()
|
|
171
|
-
touched = git_touched_files(scaffold_sha, work_dir)
|
|
172
|
-
|
|
173
|
-
# Seeds = arm-touched files matching spec_output_files globs.
|
|
174
|
-
seeds = sorted(p for p in touched if match_any(p, tier_c_globs))
|
|
175
|
-
|
|
176
|
-
reachable = bfs_trace(seeds, work_dir)
|
|
177
|
-
|
|
178
|
-
findings = []
|
|
179
|
-
for path in sorted(touched):
|
|
180
|
-
if match_any(path, tier_c_globs):
|
|
181
|
-
continue
|
|
182
|
-
if match_any(path, waivers):
|
|
183
|
-
continue
|
|
184
|
-
if path in reachable:
|
|
185
|
-
depth, via = reachable[path]
|
|
186
|
-
findings.append({
|
|
187
|
-
"file": path,
|
|
188
|
-
"type": "tier-b-reachable",
|
|
189
|
-
"severity": "info",
|
|
190
|
-
"reachable_via": via,
|
|
191
|
-
"depth": depth,
|
|
192
|
-
"verdict": "Reachable from Tier C via import chain",
|
|
193
|
-
})
|
|
194
|
-
else:
|
|
195
|
-
findings.append({
|
|
196
|
-
"file": path,
|
|
197
|
-
"type": "scope-unmatched",
|
|
198
|
-
"severity": "warn",
|
|
199
|
-
"verdict": "Not in Tier C, not reachable from Tier C via static imports",
|
|
200
|
-
})
|
|
201
|
-
|
|
202
|
-
return seeds, findings
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
def main():
|
|
206
|
-
ap = argparse.ArgumentParser()
|
|
207
|
-
ap.add_argument("--work")
|
|
208
|
-
ap.add_argument("--scaffold")
|
|
209
|
-
ap.add_argument("--expected",
|
|
210
|
-
help="Path to fixture expected.json")
|
|
211
|
-
ap.add_argument(
|
|
212
|
-
"--list-categories",
|
|
213
|
-
action="store_true",
|
|
214
|
-
help="Emit the stable oracle CATEGORIES enum as JSON and exit (iter-0022).",
|
|
215
|
-
)
|
|
216
|
-
args = ap.parse_args()
|
|
217
|
-
|
|
218
|
-
if args.list_categories:
|
|
219
|
-
print(json.dumps({"oracle": ORACLE_NAME, "categories": CATEGORIES}, indent=2, sort_keys=True))
|
|
220
|
-
return
|
|
221
|
-
|
|
222
|
-
if not args.work or not args.scaffold or not args.expected:
|
|
223
|
-
ap.error("--work, --scaffold, and --expected are required unless --list-categories is set")
|
|
224
|
-
|
|
225
|
-
try:
|
|
226
|
-
expected = loads_strict_json_object(pathlib.Path(args.expected).read_text())
|
|
227
|
-
except (OSError, json.JSONDecodeError, ValueError) as e:
|
|
228
|
-
sys.stderr.write(f"[oracle-scope-tier-b] cannot read expected: {e}\n")
|
|
229
|
-
print(json.dumps({
|
|
230
|
-
"oracle": "scope-tier-b",
|
|
231
|
-
"trace_method": TRACE_METHOD,
|
|
232
|
-
"tier_c_seeds_matched": [],
|
|
233
|
-
"findings": [],
|
|
234
|
-
"error": f"expected.json unreadable: {e}",
|
|
235
|
-
}, indent=2))
|
|
236
|
-
return
|
|
237
|
-
|
|
238
|
-
tier_c = expected.get("spec_output_files", [])
|
|
239
|
-
waivers = expected.get("tier_a_waivers", [])
|
|
240
|
-
# fixture_id = parent directory name of expected.json
|
|
241
|
-
fixture_id = pathlib.Path(args.expected).parent.name
|
|
242
|
-
|
|
243
|
-
if not isinstance(tier_c, list) or not all(isinstance(item, str) for item in tier_c):
|
|
244
|
-
print(json.dumps({
|
|
245
|
-
"oracle": "scope-tier-b",
|
|
246
|
-
"trace_method": TRACE_METHOD,
|
|
247
|
-
"tier_c_seeds_matched": [],
|
|
248
|
-
"fixture_id": fixture_id,
|
|
249
|
-
"findings": [],
|
|
250
|
-
"error": "expected.json malformed: spec_output_files must be a string array",
|
|
251
|
-
}, indent=2))
|
|
252
|
-
return
|
|
253
|
-
if not isinstance(waivers, list) or not all(isinstance(item, str) for item in waivers):
|
|
254
|
-
print(json.dumps({
|
|
255
|
-
"oracle": "scope-tier-b",
|
|
256
|
-
"trace_method": TRACE_METHOD,
|
|
257
|
-
"tier_c_seeds_matched": [],
|
|
258
|
-
"fixture_id": fixture_id,
|
|
259
|
-
"findings": [],
|
|
260
|
-
"error": "expected.json malformed: tier_a_waivers must be a string array",
|
|
261
|
-
}, indent=2))
|
|
262
|
-
return
|
|
263
|
-
|
|
264
|
-
if not tier_c:
|
|
265
|
-
print(json.dumps({
|
|
266
|
-
"oracle": "scope-tier-b",
|
|
267
|
-
"trace_method": TRACE_METHOD,
|
|
268
|
-
"tier_c_seeds_matched": [],
|
|
269
|
-
"fixture_id": fixture_id,
|
|
270
|
-
"findings": [],
|
|
271
|
-
"error": "no spec_output_files in expected.json",
|
|
272
|
-
}, indent=2))
|
|
273
|
-
return
|
|
274
|
-
|
|
275
|
-
seeds, findings = analyze(args.work, args.scaffold, tier_c, waivers,
|
|
276
|
-
fixture_id=fixture_id)
|
|
277
|
-
print(json.dumps({
|
|
278
|
-
"oracle": "scope-tier-b",
|
|
279
|
-
"trace_method": TRACE_METHOD,
|
|
280
|
-
"tier_c_seeds_matched": seeds,
|
|
281
|
-
"fixture_id": fixture_id,
|
|
282
|
-
"findings": findings,
|
|
283
|
-
}, indent=2))
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
if __name__ == "__main__":
|
|
287
|
-
main()
|