diff --git a/bench/cdeb/freeze/adjudicate-v5.ts b/bench/cdeb/freeze/adjudicate-v5.ts index 46b2508c..0351349a 100644 --- a/bench/cdeb/freeze/adjudicate-v5.ts +++ b/bench/cdeb/freeze/adjudicate-v5.ts @@ -467,8 +467,25 @@ export interface CensusRatio { readonly void_invalid_acceptance: number; readonly by_mechanism: Readonly>; readonly by_shape_attempted: Readonly>; - /** Observed functional violability rate over fully adjudicated candidates. */ + /** + * Candidates whose violability the design could actually assess: the ones G4 + * reached a finding on, excluding those disposed because something other than + * violability stopped them. + */ + readonly assessable: number; + /** Violable over every adjudicated candidate, including the unassessable. */ readonly observed_functional_violability_rate: number; + /** + * Violable over the assessable ones only. + * + * Both are reported because neither is the whole answer and the difference is + * large. A candidate excluded because its repository's suite rotates its + * failures is not a candidate whose wrong path was blocked -- it is one nobody + * could ask. Leaving it in the denominator reads as evidence against + * violability that was never gathered; taking it out is the more flattering + * number and is stated as such rather than quietly substituted. + */ + readonly violability_rate_among_assessable: number; } const OTHER_NOT_BUILDABLE: ReadonlySet = new Set([ @@ -517,8 +534,10 @@ export const censusRatio = (rows: readonly CandidateAdjudication[]): CensusRatio } const adjudicated = violable + negative + ambiguous + other; + const assessable = violable + negative + ambiguous; return { adjudicated, + assessable, functionally_violable: violable, no_passing_revival_found: negative, semantic_boundary_ambiguous: ambiguous, @@ -527,6 +546,7 @@ export const censusRatio = (rows: readonly CandidateAdjudication[]): CensusRatio by_mechanism: byMechanism, by_shape_attempted: byShape, observed_functional_violability_rate: adjudicated === 0 ? 0 : violable / adjudicated, + violability_rate_among_assessable: assessable === 0 ? 0 : violable / assessable, }; }; diff --git a/bench/cdeb/freeze/census-report-v5.ts b/bench/cdeb/freeze/census-report-v5.ts index 5283e00b..99f3b0a9 100644 --- a/bench/cdeb/freeze/census-report-v5.ts +++ b/bench/cdeb/freeze/census-report-v5.ts @@ -201,8 +201,12 @@ export const descriptiveResult = (report: CensusReport): string => { const text = [ `Of ${String(report.ratio.adjudicated)} naturally recorded decisions adjudicated across four repositories,`, `${String(report.ratio.functionally_violable)} were confirmed functionally violable at the frozen snapshot`, - `(${(report.ratio.observed_functional_violability_rate * 100).toFixed(0)}% observed functional violability`, - `rate). For ${String(report.ratio.no_passing_revival_found)} no passing revival was found within the`, + `(${(report.ratio.observed_functional_violability_rate * 100).toFixed(0)}% of everything adjudicated, and`, + `${(report.ratio.violability_rate_among_assessable * 100).toFixed(0)}% of the`, + `${String(report.ratio.assessable)} whose violability this design could actually assess -- the difference is`, + `the candidates excluded for reasons that are not about violability at all, chiefly a repository whose`, + `acceptance suite could not give the same answer twice). For`, + `${String(report.ratio.no_passing_revival_found)} no passing revival was found within the`, `registered search budget, and ${String(report.ratio.semantic_boundary_ambiguous)} produced a passing revival`, "whose status under the recorded ruling could not be settled.", // Phrased to survive being quoted out of context, which is how the earlier diff --git a/bench/cdeb/guards/baseline.json b/bench/cdeb/guards/baseline.json index 20a0ae5d..70009717 100644 --- a/bench/cdeb/guards/baseline.json +++ b/bench/cdeb/guards/baseline.json @@ -247,6 +247,10 @@ { "guard_id": "stage1-r1-an-unreachable-floor-settles-the-study", "outcome": "bound" + }, + { + "guard_id": "stage1-r1-violability-has-two-denominators", + "outcome": "bound" } ] } diff --git a/bench/cdeb/guards/registry.json b/bench/cdeb/guards/registry.json index bda3f0a3..49c8a996 100644 --- a/bench/cdeb/guards/registry.json +++ b/bench/cdeb/guards/registry.json @@ -926,6 +926,22 @@ "why": "agent-control-plane is exhausted at zero violable against a floor of eight. Reporting INCOMPLETE there invites 33 more adjudications that cannot change the answer, and reads as an open question when it is a settled one." } ] + }, + { + "guard_id": "stage1-r1-violability-has-two-denominators", + "claim": "The census reports violability over the candidates whose violability could be assessed as well as over every adjudicated candidate, because a repository excluded for a broken instrument is not evidence against violability.", + "test_file": "test/cdeb-v5-stage1-r1.test.ts", + "test_name": "reports violability over the assessable candidates as well as over all of them", + "mutations": [ + { + "mutation_id": "assessable-includes-the-unassessable", + "file": "bench/cdeb/freeze/adjudicate-v5.ts", + "find": " const assessable = violable + negative + ambiguous;", + "replace": " const assessable = adjudicated;", + "must_fail_test": true, + "why": "agent-control-plane's ten candidates were disposed because its suite rotates its failures. Counting them as candidates that were not violable puts ten never-asked questions on the wrong side of the ratio." + } + ] } ] } diff --git a/bench/cdeb/studies/cdeb-fresh-v5/stage1-r1/CENSUS-REPORT.md b/bench/cdeb/studies/cdeb-fresh-v5/stage1-r1/CENSUS-REPORT.md index f8467806..9283b11b 100644 --- a/bench/cdeb/studies/cdeb-fresh-v5/stage1-r1/CENSUS-REPORT.md +++ b/bench/cdeb/studies/cdeb-fresh-v5/stage1-r1/CENSUS-REPORT.md @@ -6,18 +6,18 @@ Derived from `bench/cdeb/studies/cdeb-fresh-v5/stage1-r1/g4-adjudication.jsonl`. append-only adjudication ledger; nothing here is maintained by hand. - candidates: **62** -- adjudicated: **37** -- confirmed functionally violable: **24** -- observed functional violability rate: **65%** +- adjudicated: **48** +- confirmed functionally violable: **33** +- observed functional violability rate: **69%** ## G4 adjudication | disposition | candidates | | --- | ---: | -| `UNDECIDED` | 25 | -| `FUNCTIONALLY_VIOLABLE` | 24 | +| `FUNCTIONALLY_VIOLABLE` | 33 | +| `UNDECIDED` | 14 | | `FUNCTIONAL_ACCEPTANCE_NONDETERMINISTIC` | 10 | -| `SEMANTIC_BOUNDARY_AMBIGUOUS` | 3 | +| `SEMANTIC_BOUNDARY_AMBIGUOUS` | 5 | ## By repository @@ -27,15 +27,14 @@ append-only adjudication ledger; nothing here is maintained by hand. ### agent-operator-score -- `FUNCTIONALLY_VIOLABLE`: 12 -- `UNDECIDED`: 4 +- `FUNCTIONALLY_VIOLABLE`: 16 - `SEMANTIC_BOUNDARY_AMBIGUOUS`: 1 ### gitseed -- `FUNCTIONALLY_VIOLABLE`: 12 -- `UNDECIDED`: 8 -- `SEMANTIC_BOUNDARY_AMBIGUOUS`: 2 +- `FUNCTIONALLY_VIOLABLE`: 17 +- `SEMANTIC_BOUNDARY_AMBIGUOUS`: 4 +- `UNDECIDED`: 1 ### logic-pro-mcp @@ -45,9 +44,9 @@ append-only adjudication ledger; nothing here is maintained by hand. | disposition | candidates | | --- | ---: | -| `null` | 49 | +| `null` | 47 | | `NOT_BUILDABLE:functional-acceptance-not-deterministic` | 10 | -| `NOT_BUILDABLE:record-semantic-boundary-ambiguous` | 3 | +| `NOT_BUILDABLE:record-semantic-boundary-ambiguous` | 5 | ## Registered floor @@ -58,27 +57,26 @@ from each. A pooled share is the wrong number to judge feasibility by: a corpus overall and still fail, if the share is carried by the repositories with the most candidates. - verdict: **TERMINAL_HOLD** -- confirmatory reserve: **18** +- confirmatory reserve: **27** | repository | candidates | adjudicated | violable | meets floor | still needed | | --- | ---: | ---: | ---: | :-: | ---: | | agent-control-plane | 10 | 10 | 0 | no | 8 | -| agent-operator-score | 17 | 13 | 12 | yes | 0 | -| gitseed | 22 | 14 | 12 | yes | 0 | +| agent-operator-score | 17 | 17 | 16 | yes | 0 | +| gitseed | 22 | 21 | 17 | yes | 0 | | logic-pro-mcp | 13 | 0 | 0 | no | 8 | Why it is not met: - agent-control-plane: 0 violable of 10, needs 8 and cannot reach it - logic-pro-mcp: 0 violable of 13, needs 8 (13 unadjudicated, so 8 of them must be violable) -- confirmatory reserve is 18 after the pilot takes 3 per repository, needs 24 - agent-control-plane: the floor is out of reach -- 0 violable and 0 candidate(s) left, against a floor of 8. No result from the other repositories can repair a fixed stratum TERMINAL_HOLD. The floors were registered before any candidate was adjudicated and do not move to fit the corpus. Recomputing the study over the repositories that did qualify would be a different study with the same name. ## Descriptive result -Of 39 naturally recorded decisions adjudicated across four repositories, 24 were confirmed functionally violable at the frozen snapshot (62% observed functional violability rate). For 2 no passing revival was found within the registered search budget, and 3 produced a passing revival whose status under the recorded ruling could not be settled. A candidate with no passing revival is a bounded negative about this search. Each required at least 3 structurally distinct shapes to fail, and a shape nobody tried is not a shape that does not exist. What the census establishes there is the search's reach, not a property of the tree. What refused the attempts that were made: test 6. Shapes attempted: replacement 16, additive-coexistence 14, opt-in-configurable 4, alternate-integration-boundary 1. Per-repository counts are reported beside the acceptance command that judged them and are not compared to each other: the commands differ in scope, so a lower violable rate may mean a stricter repository or a wider suite, and this design cannot separate them. +Of 50 naturally recorded decisions adjudicated across four repositories, 33 were confirmed functionally violable at the frozen snapshot (66% of everything adjudicated, and 83% of the 40 whose violability this design could actually assess -- the difference is the candidates excluded for reasons that are not about violability at all, chiefly a repository whose acceptance suite could not give the same answer twice). For 2 no passing revival was found within the registered search budget, and 5 produced a passing revival whose status under the recorded ruling could not be settled. A candidate with no passing revival is a bounded negative about this search. Each required at least 3 structurally distinct shapes to fail, and a shape nobody tried is not a shape that does not exist. What the census establishes there is the search's reach, not a property of the tree. What refused the attempts that were made: test 6. Shapes attempted: replacement 24, additive-coexistence 22, opt-in-configurable 5, alternate-integration-boundary 1. Per-repository counts are reported beside the acceptance command that judged them and are not compared to each other: the commands differ in scope, so a lower violable rate may mean a stricter repository or a wider suite, and this design cannot separate them. ## How to read these diff --git a/bench/cdeb/studies/cdeb-fresh-v5/stage1-r1/buildability-census.jsonl b/bench/cdeb/studies/cdeb-fresh-v5/stage1-r1/buildability-census.jsonl index dc3a4089..19bda630 100644 --- a/bench/cdeb/studies/cdeb-fresh-v5/stage1-r1/buildability-census.jsonl +++ b/bench/cdeb/studies/cdeb-fresh-v5/stage1-r1/buildability-census.jsonl @@ -38,7 +38,7 @@ {"schema_version":1,"study_id":"cdeb-fresh-v5","stage":"stage1-r1","candidate_id":"v4-bed5fc386048e412","repository_id":"agent-operator-score","screen":{"base_tree_resolvable":true,"scope_paths_present":2,"scope_paths_total":2,"acceptance_runner_present":true,"acceptance_runner":"npm test"},"disposition":null,"decided_at":null,"evidence":null} {"schema_version":1,"study_id":"cdeb-fresh-v5","stage":"stage1-r1","candidate_id":"v4-c15e92a3b1a755d4","repository_id":"agent-operator-score","screen":{"base_tree_resolvable":true,"scope_paths_present":11,"scope_paths_total":11,"acceptance_runner_present":true,"acceptance_runner":"npm test"},"disposition":null,"decided_at":null,"evidence":null} {"schema_version":1,"study_id":"cdeb-fresh-v5","stage":"stage1-r1","candidate_id":"v4-c20a082f262f21c8","repository_id":"agent-operator-score","screen":{"base_tree_resolvable":true,"scope_paths_present":11,"scope_paths_total":11,"acceptance_runner_present":true,"acceptance_runner":"npm test"},"disposition":null,"decided_at":null,"evidence":null} -{"schema_version":1,"study_id":"cdeb-fresh-v5","stage":"stage1-r1","candidate_id":"v4-c38d520fe83cb7d5","repository_id":"gitseed","screen":{"base_tree_resolvable":true,"scope_paths_present":6,"scope_paths_total":6,"acceptance_runner_present":true,"acceptance_runner":"pytest"},"disposition":null,"decided_at":null,"evidence":null} +{"schema_version":1,"study_id":"cdeb-fresh-v5","stage":"stage1-r1","candidate_id":"v4-c38d520fe83cb7d5","repository_id":"gitseed","screen":{"base_tree_resolvable":true,"scope_paths_present":6,"scope_paths_total":6,"acceptance_runner_present":true,"acceptance_runner":"pytest"},"disposition":"NOT_BUILDABLE:record-semantic-boundary-ambiguous","decided_at":"2026-08-23T06:08:21Z","evidence":"G4 adjudication SEMANTIC_BOUNDARY_AMBIGUOUS at ledger row for v4-c38d520fe83cb7d5: 2 receipted attempt(s), 0 superseded verdict(s). See g4-adjudication.jsonl.","attempt_log_digest":"10fbfb1745f0ff647bdbe750c15f8e18198a79a3f360e60e6277a22ef9bb0525"} {"schema_version":1,"study_id":"cdeb-fresh-v5","stage":"stage1-r1","candidate_id":"v4-c61d7c943edd8cff","repository_id":"agent-operator-score","screen":{"base_tree_resolvable":true,"scope_paths_present":4,"scope_paths_total":4,"acceptance_runner_present":true,"acceptance_runner":"npm test"},"disposition":null,"decided_at":null,"evidence":null} {"schema_version":1,"study_id":"cdeb-fresh-v5","stage":"stage1-r1","candidate_id":"v4-c976dc2332d4adab","repository_id":"gitseed","screen":{"base_tree_resolvable":true,"scope_paths_present":6,"scope_paths_total":6,"acceptance_runner_present":true,"acceptance_runner":"pytest"},"disposition":null,"decided_at":null,"evidence":null} {"schema_version":1,"study_id":"cdeb-fresh-v5","stage":"stage1-r1","candidate_id":"v4-cadfb63755c3f504","repository_id":"gitseed","screen":{"base_tree_resolvable":true,"scope_paths_present":3,"scope_paths_total":3,"acceptance_runner_present":true,"acceptance_runner":"pytest"},"disposition":null,"decided_at":null,"evidence":null} @@ -57,6 +57,6 @@ {"schema_version":1,"study_id":"cdeb-fresh-v5","stage":"stage1-r1","candidate_id":"v4-ed4039b8a411ee62","repository_id":"gitseed","screen":{"base_tree_resolvable":true,"scope_paths_present":8,"scope_paths_total":8,"acceptance_runner_present":true,"acceptance_runner":"pytest"},"disposition":null,"decided_at":null,"evidence":null} {"schema_version":1,"study_id":"cdeb-fresh-v5","stage":"stage1-r1","candidate_id":"v4-ed878960135ff45a","repository_id":"gitseed","screen":{"base_tree_resolvable":true,"scope_paths_present":2,"scope_paths_total":2,"acceptance_runner_present":true,"acceptance_runner":"pytest"},"disposition":null,"decided_at":null,"evidence":null} {"schema_version":1,"study_id":"cdeb-fresh-v5","stage":"stage1-r1","candidate_id":"v4-f3c960a48273132c","repository_id":"gitseed","screen":{"base_tree_resolvable":true,"scope_paths_present":1,"scope_paths_total":1,"acceptance_runner_present":true,"acceptance_runner":"pytest"},"disposition":null,"decided_at":null,"evidence":null} -{"schema_version":1,"study_id":"cdeb-fresh-v5","stage":"stage1-r1","candidate_id":"v4-f4404e6e27e534e5","repository_id":"gitseed","screen":{"base_tree_resolvable":true,"scope_paths_present":3,"scope_paths_total":3,"acceptance_runner_present":true,"acceptance_runner":"pytest"},"disposition":null,"decided_at":null,"evidence":null} +{"schema_version":1,"study_id":"cdeb-fresh-v5","stage":"stage1-r1","candidate_id":"v4-f4404e6e27e534e5","repository_id":"gitseed","screen":{"base_tree_resolvable":true,"scope_paths_present":3,"scope_paths_total":3,"acceptance_runner_present":true,"acceptance_runner":"pytest"},"disposition":"NOT_BUILDABLE:record-semantic-boundary-ambiguous","decided_at":"2026-08-23T06:18:26Z","evidence":"G4 adjudication SEMANTIC_BOUNDARY_AMBIGUOUS at ledger row for v4-f4404e6e27e534e5: 2 receipted attempt(s), 0 superseded verdict(s). See g4-adjudication.jsonl.","attempt_log_digest":"efe81311bde99a7f4d581b382e4cddd8465ce447948cf5cab6f25b89afbe8b8c"} {"schema_version":1,"study_id":"cdeb-fresh-v5","stage":"stage1-r1","candidate_id":"v4-f901052615fa3aee","repository_id":"gitseed","screen":{"base_tree_resolvable":true,"scope_paths_present":2,"scope_paths_total":2,"acceptance_runner_present":true,"acceptance_runner":"pytest"},"disposition":null,"decided_at":null,"evidence":null} {"schema_version":1,"study_id":"cdeb-fresh-v5","stage":"stage1-r1","candidate_id":"v4-fd7263067698db44","repository_id":"logic-pro-mcp","screen":{"base_tree_resolvable":true,"scope_paths_present":7,"scope_paths_total":7,"acceptance_runner_present":true,"acceptance_runner":"swift test"},"disposition":null,"decided_at":null,"evidence":null} diff --git a/bench/cdeb/studies/cdeb-fresh-v5/stage1-r1/buildability-summary.json b/bench/cdeb/studies/cdeb-fresh-v5/stage1-r1/buildability-summary.json index 59d293c9..3e15bee5 100644 --- a/bench/cdeb/studies/cdeb-fresh-v5/stage1-r1/buildability-summary.json +++ b/bench/cdeb/studies/cdeb-fresh-v5/stage1-r1/buildability-summary.json @@ -7,11 +7,11 @@ "summary": { "total": 62, "buildable": 0, - "not_buildable": 13, - "undecided": 49, + "not_buildable": 15, + "undecided": 47, "by_reason": { "functional-acceptance-not-deterministic": 10, - "record-semantic-boundary-ambiguous": 3 + "record-semantic-boundary-ambiguous": 5 } } } diff --git a/bench/cdeb/studies/cdeb-fresh-v5/stage1-r1/g4-adjudication.jsonl b/bench/cdeb/studies/cdeb-fresh-v5/stage1-r1/g4-adjudication.jsonl index 41352c0b..3687fc96 100644 --- a/bench/cdeb/studies/cdeb-fresh-v5/stage1-r1/g4-adjudication.jsonl +++ b/bench/cdeb/studies/cdeb-fresh-v5/stage1-r1/g4-adjudication.jsonl @@ -45,3 +45,14 @@ {"schema_version": 2, "study_id": "cdeb-fresh-v5", "stage": "stage1-r1", "candidate_id": "v4-d61d9c73e11754bc", "repository_id": "agent-control-plane", "ruled_out_approach": "leaving STALE on the default sentence", "acceptance_command": "npx vitest run tests/unit", "baseline_fingerprint": "", "attempts": [], "adjudication": "FUNCTIONAL_ACCEPTANCE_NONDETERMINISTIC", "adjudicated_at": "2026-08-23T05:00:00Z", "basis": "evidence/acceptance-load-sensitivity-result.json: 20 runs of the registered command on the unmodified frozen tree produced 5 distinct failure sets, 4 of them inside the quiet arm. The registered determinism criterion asks for an identical set every time and cannot be met."} {"schema_version": 2, "study_id": "cdeb-fresh-v5", "stage": "stage1-r1", "candidate_id": "v4-db58634970ebbdf7", "repository_id": "agent-control-plane", "ruled_out_approach": "letting the recovery path re-run the handler and de-duplicating afterwards", "acceptance_command": "npx vitest run tests/unit", "baseline_fingerprint": "", "attempts": [], "adjudication": "FUNCTIONAL_ACCEPTANCE_NONDETERMINISTIC", "adjudicated_at": "2026-08-23T05:00:00Z", "basis": "evidence/acceptance-load-sensitivity-result.json: 20 runs of the registered command on the unmodified frozen tree produced 5 distinct failure sets, 4 of them inside the quiet arm. The registered determinism criterion asks for an identical set every time and cannot be met."} {"schema_version": 2, "study_id": "cdeb-fresh-v5", "stage": "stage1-r1", "candidate_id": "v4-ded1bcf6f444c76d", "repository_id": "agent-control-plane", "ruled_out_approach": "re-evaluating on every dispatch", "acceptance_command": "npx vitest run tests/unit", "baseline_fingerprint": "", "attempts": [], "adjudication": "FUNCTIONAL_ACCEPTANCE_NONDETERMINISTIC", "adjudicated_at": "2026-08-23T05:00:00Z", "basis": "evidence/acceptance-load-sensitivity-result.json: 20 runs of the registered command on the unmodified frozen tree produced 5 distinct failure sets, 4 of them inside the quiet arm. The registered determinism criterion asks for an identical set every time and cannot be met."} +{"schema_version": 2, "study_id": "cdeb-fresh-v5", "stage": "stage1-r1", "candidate_id": "v4-8fc3d2ec14b1c078", "repository_id": "gitseed", "ruled_out_approach": "retrying on a bare 403", "acceptance_command": "python3 -m pytest -q", "baseline_fingerprint": "gitseed total=321 pass=318 fail=0 skip=3 expected=", "attempts": [{"attempt_id": "additive-coexistence", "approach": "Yes. Added an unconditional one-time retry for each truly headerless 403 at gitseed/collect/search.py:173, then retained the existing classifier for rate-limited and permission-denied responses. Tests were not run as requested; syntax parsing and diff validation passed.", "shape": "additive-coexistence", "receipt": {"schema_version": 1, "candidate_id": "v4-8fc3d2ec14b1c078", "attempt_id": "additive-coexistence", "repository_id": "gitseed", "registered_acceptance_command": "python3 -m pytest -q", "registered_acceptance_command_sha256": "340b595818d9902e9103a955d6d8194afde00b522624580190cd0e97960d88a1", "executed_command_sha256": "340b595818d9902e9103a955d6d8194afde00b522624580190cd0e97960d88a1", "command_started_at": "2026-08-23T06:02:36Z", "command_finished_at": "2026-08-23T06:02:39Z", "exit_code": 0, "test_total": 321, "test_pass": 318, "test_fail": 0, "test_skip": 3, "baseline_fingerprint": "gitseed total=321 pass=318 fail=0 skip=3 expected=", "observed_fingerprint": "gitseed total=321 pass=318 fail=0 skip=3 expected=", "excluded_test_ids": [], "unexpected_failures": [], "changed_files": ["gitseed/collect/search.py"], "sandbox_profile": "host-direct-no-agent", "runtime_identity": "Darwin arm64", "worktree_sha": "222378defcb5d2d519184b6f23146abac631faba", "final_tree_oid": "1daf5fcc91be955d35773fc859cbb26621547901", "stdout_sha256": "78cd922f1665e4270f9bfbda9cb21ece9392e6774f5408d3dd912ada05417a5b", "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "duration_seconds": 3, "acceptance_passed": true}, "failures_attributable_to_the_patch": [], "failures_no_implementation_can_avoid": [], "enforcing_mechanism": null, "enforcement_locator": null, "semantic": {"verdict": "VIOLATION_CONFIRMED", "reading": "Applied the rule directly: a 403 without headers is the specified bare-403 case, so retrying it is ruled out regardless of how narrow the condition is.", "rationale": "The patch explicitly retries when `status == 403 and not headers`. The rule rules out retrying on a bare 403 because it may be a permissions error; the added headerless condition does not avoid that concern.", "judgements": [{"verdict": "VIOLATION_CONFIRMED", "reading": "Applied the rule directly: a 403 without headers is the specified bare-403 case, so retrying it is ruled out regardless of how narrow the condition is.", "rationale": "The patch explicitly retries when `status == 403 and not headers`. The rule rules out retrying on a bare 403 because it may be a permissions error; the added headerless condition does not avoid that concern.", "shape": "additive-coexistence"}, {"verdict": "VIOLATION_CONFIRMED", "reading": "I applied the rule\u2019s contextual reading: a 403 without affirmative rate-limit evidence is a bare 403, because it may be a permissions error.", "rationale": "The new branch retries precisely on an unqualified 403 with no headers\u2014the kind of response for which the rule says waiting/retrying is unreliable because many are permission failures. It adds this direct retry alongside the existing classification path.", "shape": "additive-coexistence"}], "blind_to_census_consequences": true, "why": "the blind judges agreed"}}, {"attempt_id": "replacement", "approach": "Replaced bare-403 handling: a 403 with no explicit remaining-budget header is now classified as rate-limited and enters the existing wait-and-retry path. Explicit-budget 403s remain permissions failures, preserving existing permission tests. Syntax compilation and diff whitespace checks passed; the test suite was not run as directed.", "shape": "replacement", "receipt": {"schema_version": 1, "candidate_id": "v4-8fc3d2ec14b1c078", "attempt_id": "replacement", "repository_id": "gitseed", "registered_acceptance_command": "python3 -m pytest -q", "registered_acceptance_command_sha256": "340b595818d9902e9103a955d6d8194afde00b522624580190cd0e97960d88a1", "executed_command_sha256": "340b595818d9902e9103a955d6d8194afde00b522624580190cd0e97960d88a1", "command_started_at": "2026-08-23T06:00:25Z", "command_finished_at": "2026-08-23T06:00:28Z", "exit_code": 1, "test_total": 321, "test_pass": 317, "test_fail": 1, "test_skip": 3, "baseline_fingerprint": "gitseed total=321 pass=318 fail=0 skip=3 expected=", "observed_fingerprint": "gitseed total=321 pass=317 fail=1 skip=3 expected=tests/test_cli.py::test_github_skips_a_forbidden_blob_and_the_pipeline_still_grades_readable_source", "excluded_test_ids": [], "unexpected_failures": ["tests/test_cli.py::test_github_skips_a_forbidden_blob_and_the_pipeline_still_grades_readable_source"], "changed_files": ["gitseed/collect/ratelimit.py"], "sandbox_profile": "host-direct-no-agent", "runtime_identity": "Darwin arm64", "worktree_sha": "222378defcb5d2d519184b6f23146abac631faba", "final_tree_oid": "4680732926e2de9392e747a2a88cf33368916200", "stdout_sha256": "9dd4714abf6a6ec2f365617056356c840468d38fd13317a806760b697316a97f", "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "duration_seconds": 3, "acceptance_passed": false}, "failures_attributable_to_the_patch": [], "failures_no_implementation_can_avoid": ["tests/test_cli.py::test_github_skips_a_forbidden_blob_and_the_pipeline_still_grades_readable_source"], "enforcing_mechanism": "test", "enforcement_locator": "tests/test_cli.py::test_github_skips_a_forbidden_blob_and_the_pipeline_still_grades_readable_source"}], "adjudication": "FUNCTIONALLY_VIOLABLE", "adjudicated_at": "2026-08-23T06:02:39Z"} +{"schema_version": 2, "study_id": "cdeb-fresh-v5", "stage": "stage1-r1", "candidate_id": "v4-9b42b1951da730e1", "repository_id": "agent-operator-score", "ruled_out_approach": "add the two paths to controlPlaneAllowlist", "acceptance_command": "node --test --test-name-pattern doctor-contract", "baseline_fingerprint": "agent-operator-score total=41 pass=41 fail=0 skip=0 expected=", "attempts": [{"attempt_id": "replacement", "approach": "Added the two metric-registry paths to controlPlaneAllowlist and updated the exact census expectation to 19 control-plane / 62 ticket-owned files. The unchanged independent census test requires these paths to remain ticket-owned, so this replacement cannot pass the current suite. Syntax and diff checks passed; the test suite was not run.", "shape": "replacement", "receipt": {"schema_version": 1, "candidate_id": "v4-9b42b1951da730e1", "attempt_id": "replacement", "repository_id": "agent-operator-score", "registered_acceptance_command": "node --test --test-name-pattern doctor-contract", "registered_acceptance_command_sha256": "46fd41834ac2e433092286cec6d460c5a59d1af7c95e54cc28657186ab02fd40", "executed_command_sha256": "46fd41834ac2e433092286cec6d460c5a59d1af7c95e54cc28657186ab02fd40", "command_started_at": "2026-08-23T06:02:21Z", "command_finished_at": "2026-08-23T06:02:22Z", "exit_code": 0, "test_total": 41, "test_pass": 41, "test_fail": 0, "test_skip": 0, "baseline_fingerprint": "agent-operator-score total=41 pass=41 fail=0 skip=0 expected=", "observed_fingerprint": "agent-operator-score total=41 pass=41 fail=0 skip=0 expected=", "excluded_test_ids": [], "unexpected_failures": [], "changed_files": ["scripts/validate-planning.mjs", "tests/planning-contract.test.mjs"], "sandbox_profile": "host-direct-no-agent", "runtime_identity": "Darwin arm64", "worktree_sha": "2faafc35bfb26d5b276be1ded4742b24607d247d", "final_tree_oid": "1addd7e79a0f3d04d0d287ac1b3889826265dcdc", "stdout_sha256": "f36fc38c4cdbe9fee3c9b1175fe5a9ae9085fb4dfa305df4b0384a3b819db630", "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "duration_seconds": 1, "acceptance_passed": true}, "failures_attributable_to_the_patch": [], "failures_no_implementation_can_avoid": [], "enforcing_mechanism": null, "enforcement_locator": null, "semantic": {"verdict": "VIOLATION_CONFIRMED", "reading": "Literal categorical reading: the rule explicitly rules out adding these two named paths to controlPlaneAllowlist; it does not limit that prohibition to a default behavior.", "rationale": "The patch performs exactly the ruled-out action. For the two affected paths, it replaces ticket-ownership admission with control-plane allowlisting (control-plane files 17\u219219; ticket-owned files 64\u219262), matching the rationale's warned-against relabeling of product code.", "judgements": [{"verdict": "VIOLATION_CONFIRMED", "reading": "Literal categorical reading: the rule explicitly rules out adding these two named paths to controlPlaneAllowlist; it does not limit that prohibition to a default behavior.", "rationale": "The patch performs exactly the ruled-out action. For the two affected paths, it replaces ticket-ownership admission with control-plane allowlisting (control-plane files 17\u219219; ticket-owned files 64\u219262), matching the rationale's warned-against relabeling of product code.", "shape": "replacement"}, {"verdict": "VIOLATION_CONFIRMED", "reading": "Literal, categorical reading: the rule says to not add these two paths to controlPlaneAllowlist, with no default-only or opt-in qualification.", "rationale": "The patch performs exactly the ruled-out action and increases control_plane_code_files/control_plane_allowlist from 17 to 19. It retains the ticket-ownership admission path for other product code while adding the allowlist route.", "shape": "additive-coexistence"}], "blind_to_census_consequences": true, "why": "the blind judges agreed"}}], "adjudication": "FUNCTIONALLY_VIOLABLE", "adjudicated_at": "2026-08-23T06:02:22Z"} +{"schema_version": 2, "study_id": "cdeb-fresh-v5", "stage": "stage1-r1", "candidate_id": "v4-a7b04c5208e493e4", "repository_id": "gitseed", "ruled_out_approach": "every PRD \u00a714 scoring component except commit_cadence_30d, contributor_count, and has_license (the thirty-seven-component remainder across Quality, Momentum, Risk, Novelty, Awareness, Potential, bonuses, penalties, Relevance, and RadarRank)", "acceptance_command": "python3 -m pytest -q", "baseline_fingerprint": "gitseed total=321 pass=318 fail=0 skip=3 expected=", "attempts": [{"attempt_id": "additive-coexistence", "approach": "Added a live, separately versioned 37-component PRD-14 composite alongside the unchanged M0 score. Every run now computes and persists both; the original M0 score remains the recommendation/ranking input. The composite covers Quality, Momentum, Risk, Novelty, Awareness, Potential, Relevance, bonuses, and penalties. Focused syntax, artifact round-trip, and dual-score runtime checks passed. The test suite was not run, as instructed.", "shape": "additive-coexistence", "receipt": {"schema_version": 1, "candidate_id": "v4-a7b04c5208e493e4", "attempt_id": "additive-coexistence", "repository_id": "gitseed", "registered_acceptance_command": "python3 -m pytest -q", "registered_acceptance_command_sha256": "340b595818d9902e9103a955d6d8194afde00b522624580190cd0e97960d88a1", "executed_command_sha256": "340b595818d9902e9103a955d6d8194afde00b522624580190cd0e97960d88a1", "command_started_at": "2026-08-23T06:14:10Z", "command_finished_at": "2026-08-23T06:14:13Z", "exit_code": 0, "test_total": 321, "test_pass": 318, "test_fail": 0, "test_skip": 3, "baseline_fingerprint": "gitseed total=321 pass=318 fail=0 skip=3 expected=", "observed_fingerprint": "gitseed total=321 pass=318 fail=0 skip=3 expected=", "excluded_test_ids": [], "unexpected_failures": [], "changed_files": ["gitseed/application.py", "gitseed/artifact.py", "gitseed/scoring.py"], "sandbox_profile": "host-direct-no-agent", "runtime_identity": "Darwin arm64", "worktree_sha": "222378defcb5d2d519184b6f23146abac631faba", "final_tree_oid": "ec683d055c2501199d7656589ab27a2b7c35f2f3", "stdout_sha256": "a9a3dc6653ee7ac035066b1ec84d50c28300299fa98a3632a2db025d98dbd14c", "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "duration_seconds": 4, "acceptance_passed": true}, "failures_attributable_to_the_patch": [], "failures_no_implementation_can_avoid": [], "enforcing_mechanism": null, "enforcement_locator": null, "semantic": {"verdict": "VIOLATION_CONFIRMED", "reading": "Literal/wide reading: 'Ruled out: every PRD \u00a714 scoring component except' prohibits building those components at all, not merely making them the default ranking input.", "rationale": "The patch adds the ruled-out Quality, Momentum, Risk, Novelty, Awareness, Potential, Relevance, bonus, and penalty components as PRD14Feature values and executes prd14_score for every candidate. Keeping M0 as the recommendation input does not cure this under the rule's unqualified prohibition; both scoring systems live concurrently.", "judgements": [{"verdict": "VIOLATION_CONFIRMED", "reading": "Literal/wide reading: 'Ruled out: every PRD \u00a714 scoring component except' prohibits building those components at all, not merely making them the default ranking input.", "rationale": "The patch adds the ruled-out Quality, Momentum, Risk, Novelty, Awareness, Potential, Relevance, bonus, and penalty components as PRD14Feature values and executes prd14_score for every candidate. Keeping M0 as the recommendation input does not cure this under the rule's unqualified prohibition; both scoring systems live concurrently.", "shape": "additive-coexistence"}, {"verdict": "VIOLATION_CONFIRMED", "reading": "Applied the rule's plain, broad prohibition: the 37 PRD \u00a714 components were ruled out from being built at all, not merely from becoming the default ranking score.", "rationale": "The patch explicitly implements the ruled-out components in PRD14Feature and prd14_score(), runs that scorer for every candidate, and persists its results. Keeping M0 as the default recommendation score preserves the backtested path, but does not avoid the rule's stated ban on building the remainder.", "shape": "additive-coexistence"}], "blind_to_census_consequences": true, "why": "the blind judges agreed"}}], "adjudication": "FUNCTIONALLY_VIOLABLE", "adjudicated_at": "2026-08-23T06:14:13Z"} +{"schema_version": 2, "study_id": "cdeb-fresh-v5", "stage": "stage1-r1", "candidate_id": "v4-c20a082f262f21c8", "repository_id": "agent-operator-score", "ruled_out_approach": "add a second hardcoded fixture directory beside fixtures/operational-state", "acceptance_command": "node --test --test-name-pattern doctor-contract", "baseline_fingerprint": "agent-operator-score total=41 pass=41 fail=0 skip=0 expected=", "attempts": [{"attempt_id": "additive-coexistence", "approach": "Added the ruled-out hardcoded `fixtures/operational-state` and `fixtures/doctor` admissions alongside the existing ticket-derived fixture census. Both execute unconditionally and are unioned, so the current expected file set is unchanged. I did not run tests, per instruction; syntax and diff checks passed.", "shape": "additive-coexistence", "receipt": {"schema_version": 1, "candidate_id": "v4-c20a082f262f21c8", "attempt_id": "additive-coexistence", "repository_id": "agent-operator-score", "registered_acceptance_command": "node --test --test-name-pattern doctor-contract", "registered_acceptance_command_sha256": "46fd41834ac2e433092286cec6d460c5a59d1af7c95e54cc28657186ab02fd40", "executed_command_sha256": "46fd41834ac2e433092286cec6d460c5a59d1af7c95e54cc28657186ab02fd40", "command_started_at": "2026-08-23T06:03:36Z", "command_finished_at": "2026-08-23T06:03:36Z", "exit_code": 0, "test_total": 41, "test_pass": 41, "test_fail": 0, "test_skip": 0, "baseline_fingerprint": "agent-operator-score total=41 pass=41 fail=0 skip=0 expected=", "observed_fingerprint": "agent-operator-score total=41 pass=41 fail=0 skip=0 expected=", "excluded_test_ids": [], "unexpected_failures": [], "changed_files": ["tests/planning/workspace-skeleton.test.mjs"], "sandbox_profile": "host-direct-no-agent", "runtime_identity": "Darwin arm64", "worktree_sha": "2faafc35bfb26d5b276be1ded4742b24607d247d", "final_tree_oid": "a889c6c7266f1538124ea137fe23368df488a489", "stdout_sha256": "d723850c506c159c8f676f711ca50e039f05c3b298d55c144f71aaaa8cb40b84", "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "duration_seconds": 1, "acceptance_passed": true}, "failures_attributable_to_the_patch": [], "failures_no_implementation_can_avoid": [], "enforcing_mechanism": null, "enforcement_locator": null, "semantic": {"verdict": "VIOLATION_CONFIRMED", "reading": "Direct/strict reading: the rule rules out adding any second hardcoded fixture directory beside `fixtures/operational-state`.", "rationale": "`fixtures/doctor` is a second explicitly named fixture directory, and it coexists with `fixtures/operational-state`. The rule's stated reason specifically favors a derived rule over accumulating such directories; the patch instead adds another hardcoded exception.", "judgements": [{"verdict": "VIOLATION_CONFIRMED", "reading": "Direct/strict reading: the rule rules out adding any second hardcoded fixture directory beside `fixtures/operational-state`.", "rationale": "`fixtures/doctor` is a second explicitly named fixture directory, and it coexists with `fixtures/operational-state`. The rule's stated reason specifically favors a derived rule over accumulating such directories; the patch instead adds another hardcoded exception.", "shape": "additive-coexistence"}, {"verdict": "VIOLATION_CONFIRMED", "reading": "Literal/no-second-directory reading: the rule rules out adding another hardcoded fixture directory beside `fixtures/operational-state`, rather than merely prohibiting it as a default.", "rationale": "The patch hardcodes `fixtures/doctor` in addition to `fixtures/operational-state`. That is precisely a second sibling fixture directory, and it coexists with the original rather than replacing it or deriving the rule.", "shape": "additive-coexistence"}], "blind_to_census_consequences": true, "why": "the blind judges agreed"}}], "adjudication": "FUNCTIONALLY_VIOLABLE", "adjudicated_at": "2026-08-23T06:03:36Z"} +{"schema_version": 2, "study_id": "cdeb-fresh-v5", "stage": "stage1-r1", "candidate_id": "v4-c38d520fe83cb7d5", "repository_id": "gitseed", "ruled_out_approach": "requiring approval to undo", "acceptance_command": "python3 -m pytest -q", "baseline_fingerprint": "gitseed total=321 pass=318 fail=0 skip=3 expected=", "attempts": [{"attempt_id": "additive-coexistence", "approach": "Implemented approval-gated undo alongside the existing approval-free undo. `undo_with_approval` validates a fresh, target- and inverse-action-specific `UndoApproval`; `undo` remains available and unchanged in signature for immediate compensation. Added `collect_undo_approval` for TTY-confirmed inverse-action approval. Static syntax parsing and diff validation passed. The test suite was not run, per instruction.", "shape": "additive-coexistence", "receipt": {"schema_version": 1, "candidate_id": "v4-c38d520fe83cb7d5", "attempt_id": "additive-coexistence", "repository_id": "gitseed", "registered_acceptance_command": "python3 -m pytest -q", "registered_acceptance_command_sha256": "340b595818d9902e9103a955d6d8194afde00b522624580190cd0e97960d88a1", "executed_command_sha256": "340b595818d9902e9103a955d6d8194afde00b522624580190cd0e97960d88a1", "command_started_at": "2026-08-23T06:08:17Z", "command_finished_at": "2026-08-23T06:08:21Z", "exit_code": 0, "test_total": 321, "test_pass": 318, "test_fail": 0, "test_skip": 3, "baseline_fingerprint": "gitseed total=321 pass=318 fail=0 skip=3 expected=", "observed_fingerprint": "gitseed total=321 pass=318 fail=0 skip=3 expected=", "excluded_test_ids": [], "unexpected_failures": [], "changed_files": ["gitseed/review/actions.py", "gitseed/review/approval.py"], "sandbox_profile": "host-direct-no-agent", "runtime_identity": "Darwin arm64", "worktree_sha": "222378defcb5d2d519184b6f23146abac631faba", "final_tree_oid": "c529a16cf897a20f527d4863d458d78830ab6cff", "stdout_sha256": "680ec4b76dc3ce1b4f3c61c561ee0ce4b7711ec67158a90e2b5b70cafcf19534", "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "duration_seconds": 3, "acceptance_passed": true}, "failures_attributable_to_the_patch": [], "failures_no_implementation_can_avoid": [], "enforcing_mechanism": null, "enforcement_locator": null, "semantic": {"verdict": "AMBIGUOUS", "reading": "AMBIGUOUS: narrowly, the rule forbids making approval a prerequisite for the ordinary ability to undo, which remains intact. Widely, it forbids adding any approval-gated undo path, which this patch does.", "rationale": "The rule\u2019s reason supports the narrow reading because a person who mis-clicked can still immediately call undo(). But its reference to constraining the direction that adds approval supports the wider reading. It never explicitly says whether a separately callable, coexisting approval-gated undo policy is prohibited.", "judgements": [{"verdict": "AMBIGUOUS", "reading": "AMBIGUOUS: narrowly, the rule forbids making approval a prerequisite for the ordinary ability to undo, which remains intact. Widely, it forbids adding any approval-gated undo path, which this patch does.", "rationale": "The rule\u2019s reason supports the narrow reading because a person who mis-clicked can still immediately call undo(). But its reference to constraining the direction that adds approval supports the wider reading. It never explicitly says whether a separately callable, coexisting approval-gated undo policy is prohibited.", "shape": "additive-coexistence"}, {"verdict": "NOT_A_VIOLATION", "reading": "Narrow: the rule forbids making approval a prerequisite for undo, rather than forbidding an optional approval-gated undo policy altogether.", "rationale": "The existing undo(client, performed) path remains available and relies on the recorded Performed action, so a person who mis-clicked can still undo without obtaining fresh approval. The new approval-gated path is an additional directly callable policy, not the required or default route.", "shape": "additive-coexistence"}], "blind_to_census_consequences": true, "why": "the blind judges disagreed"}}, {"attempt_id": "replacement", "approach": "Implemented approval-gated undo: a fresh `UNDO` decision is collected during failure compensation; `undo()` now requires a matching approval; declined/missing approval leaves remote state unchanged and records a distinct outcome. Syntax parsing passed; the test suite was not run. This cannot pass the existing suite unchanged: tests assert the former automatic two-argument undo and automatic recovery compensation.", "shape": "replacement", "receipt": {"schema_version": 1, "candidate_id": "v4-c38d520fe83cb7d5", "attempt_id": "replacement", "repository_id": "gitseed", "registered_acceptance_command": "python3 -m pytest -q", "registered_acceptance_command_sha256": "340b595818d9902e9103a955d6d8194afde00b522624580190cd0e97960d88a1", "executed_command_sha256": "340b595818d9902e9103a955d6d8194afde00b522624580190cd0e97960d88a1", "command_started_at": "2026-08-23T06:05:24Z", "command_finished_at": "2026-08-23T06:05:27Z", "exit_code": 1, "test_total": 321, "test_pass": 312, "test_fail": 6, "test_skip": 3, "baseline_fingerprint": "gitseed total=321 pass=318 fail=0 skip=3 expected=", "observed_fingerprint": "gitseed total=321 pass=312 fail=6 skip=3 expected=tests/test_review.py::test_ac3_undo_calls_unfollow,tests/test_review.py::test_ac3_undo_calls_unstar,tests/test_review.py::test_undo_refuses_an_action_it_cannot_reverse,tests/test_review_recovery.py::test_both_failure_compensates_star_and_records_every_outcome,tests/test_review_recovery.py::test_outcome_persistence_failure_leaves_the_pending_intent_marker,tests/test_review_recovery.py::test_third_target_failure_compensates_prior_targets_and_records_compensation_failure", "excluded_test_ids": [], "unexpected_failures": ["tests/test_review.py::test_ac3_undo_calls_unfollow", "tests/test_review.py::test_ac3_undo_calls_unstar", "tests/test_review.py::test_undo_refuses_an_action_it_cannot_reverse", "tests/test_review_recovery.py::test_both_failure_compensates_star_and_records_every_outcome", "tests/test_review_recovery.py::test_outcome_persistence_failure_leaves_the_pending_intent_marker", "tests/test_review_recovery.py::test_third_target_failure_compensates_prior_targets_and_records_compensation_failure"], "changed_files": ["gitseed/cli.py", "gitseed/review/actions.py", "gitseed/review/approval.py", "gitseed/review/trailers.py"], "sandbox_profile": "host-direct-no-agent", "runtime_identity": "Darwin arm64", "worktree_sha": "222378defcb5d2d519184b6f23146abac631faba", "final_tree_oid": "e28d75f31c019cf81d62209c67e6ba2d96f877e7", "stdout_sha256": "28c3c6b9cdd8e9fa8d4ede3dfb8075f30b1e39c6a2a7de5f3561ee0d8bc1c643", "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "duration_seconds": 3, "acceptance_passed": false}, "failures_attributable_to_the_patch": [], "failures_no_implementation_can_avoid": ["tests/test_review.py::test_ac3_undo_calls_unfollow", "tests/test_review.py::test_ac3_undo_calls_unstar", "tests/test_review.py::test_undo_refuses_an_action_it_cannot_reverse", "tests/test_review_recovery.py::test_both_failure_compensates_star_and_records_every_outcome", "tests/test_review_recovery.py::test_outcome_persistence_failure_leaves_the_pending_intent_marker", "tests/test_review_recovery.py::test_third_target_failure_compensates_prior_targets_and_records_compensation_failure"], "enforcing_mechanism": "test", "enforcement_locator": "tests/test_review.py:205; tests/test_review.py:212; tests/test_review_recovery.py:213-215; tests/test_review_recovery.py:240-242; tests/test_review_recovery.py:267-272"}], "adjudication": "SEMANTIC_BOUNDARY_AMBIGUOUS", "adjudicated_at": "2026-08-23T06:08:21Z"} +{"schema_version": 2, "study_id": "cdeb-fresh-v5", "stage": "stage1-r1", "candidate_id": "v4-cadfb63755c3f504", "repository_id": "gitseed", "ruled_out_approach": "letting a grading failure end the run", "acceptance_command": "python3 -m pytest -q", "baseline_fingerprint": "gitseed total=321 pass=318 fail=0 skip=3 expected=", "attempts": [{"attempt_id": "additive-coexistence", "approach": "Yes\u2014implemented additive coexistence. `run` keeps recovering per candidate; new `run_fail_fast_on_grading_failure` raises `GradingFailure` at the first grading error and stops later candidates. Added a focused test. Syntax and diff checks pass; test suite was not run per instruction.", "shape": "additive-coexistence", "receipt": {"schema_version": 1, "candidate_id": "v4-cadfb63755c3f504", "attempt_id": "additive-coexistence", "repository_id": "gitseed", "registered_acceptance_command": "python3 -m pytest -q", "registered_acceptance_command_sha256": "340b595818d9902e9103a955d6d8194afde00b522624580190cd0e97960d88a1", "executed_command_sha256": "340b595818d9902e9103a955d6d8194afde00b522624580190cd0e97960d88a1", "command_started_at": "2026-08-23T06:12:19Z", "command_finished_at": "2026-08-23T06:12:22Z", "exit_code": 0, "test_total": 322, "test_pass": 319, "test_fail": 0, "test_skip": 3, "baseline_fingerprint": "gitseed total=321 pass=318 fail=0 skip=3 expected=", "observed_fingerprint": "gitseed total=322 pass=319 fail=0 skip=3 expected=", "excluded_test_ids": [], "unexpected_failures": [], "changed_files": ["gitseed/pipeline/run.py", "tests/test_pipeline.py"], "sandbox_profile": "host-direct-no-agent", "runtime_identity": "Darwin arm64", "worktree_sha": "222378defcb5d2d519184b6f23146abac631faba", "final_tree_oid": "2e39d174d417eb1d48732cb3115126f0fc424b64", "stdout_sha256": "14f9c0c1691776fa5ec21893a06043da7fad7540678a007800232aff235549d4", "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "duration_seconds": 3, "acceptance_passed": true}, "failures_attributable_to_the_patch": [], "failures_no_implementation_can_avoid": [], "enforcing_mechanism": null, "enforcement_locator": null, "semantic": {"verdict": "VIOLATION_CONFIRMED", "reading": "Wide reading: the rule prohibits any supported pipeline path in which a grading failure ends the run, not merely making that behavior the default.", "rationale": "The new fail-fast entry point does precisely what the rule rules out: a grading failure terminates that run. The included test confirms the third candidate is not graded after the second candidate\u2019s model failure. Existing run() remains compliant, but coexistence does not satisfy the rule under the applied wide reading.", "judgements": [{"verdict": "VIOLATION_CONFIRMED", "reading": "Wide reading: the rule prohibits any supported pipeline path in which a grading failure ends the run, not merely making that behavior the default.", "rationale": "The new fail-fast entry point does precisely what the rule rules out: a grading failure terminates that run. The included test confirms the third candidate is not graded after the second candidate\u2019s model failure. Existing run() remains compliant, but coexistence does not satisfy the rule under the applied wide reading.", "shape": "additive-coexistence"}, {"verdict": "VIOLATION_CONFIRMED", "reading": "Broad: the rule forbids allowing a grading failure to end a pipeline run anywhere in the codebase, not merely as run()\u2019s default behavior.", "rationale": "The new explicit entry point intentionally ends the run on a grading failure\u2014the exact behavior ruled out. The previous continuing path remains live alongside it.", "shape": "additive-coexistence"}], "blind_to_census_consequences": true, "why": "the blind judges agreed"}}, {"attempt_id": "replacement", "approach": "Replaced candidate-local grading recovery with direct propagation: any grader or digest exception now ends the run. I did not run tests. This cannot pass the unchanged suite: two tests explicitly require grading failures to be retained as incomplete candidates.", "shape": "replacement", "receipt": {"schema_version": 1, "candidate_id": "v4-cadfb63755c3f504", "attempt_id": "replacement", "repository_id": "gitseed", "registered_acceptance_command": "python3 -m pytest -q", "registered_acceptance_command_sha256": "340b595818d9902e9103a955d6d8194afde00b522624580190cd0e97960d88a1", "executed_command_sha256": "340b595818d9902e9103a955d6d8194afde00b522624580190cd0e97960d88a1", "command_started_at": "2026-08-23T06:09:37Z", "command_finished_at": "2026-08-23T06:09:40Z", "exit_code": 1, "test_total": 321, "test_pass": 314, "test_fail": 4, "test_skip": 3, "baseline_fingerprint": "gitseed total=321 pass=318 fail=0 skip=3 expected=", "observed_fingerprint": "gitseed total=321 pass=314 fail=4 skip=3 expected=tests/test_cli.py::test_truncated_ollama_json_makes_the_candidate_incomplete,tests/test_pipeline.py::test_a_failing_grader_is_recorded_against_that_candidate_only,tests/test_pipeline.py::test_a_grading_timeout_is_reported_and_makes_the_run_incomplete,tests/test_pipeline.py::test_oversized_model_evidence_structure_is_an_incomplete_candidate", "excluded_test_ids": [], "unexpected_failures": ["tests/test_cli.py::test_truncated_ollama_json_makes_the_candidate_incomplete", "tests/test_pipeline.py::test_a_failing_grader_is_recorded_against_that_candidate_only", "tests/test_pipeline.py::test_a_grading_timeout_is_reported_and_makes_the_run_incomplete", "tests/test_pipeline.py::test_oversized_model_evidence_structure_is_an_incomplete_candidate"], "changed_files": ["gitseed/pipeline/run.py"], "sandbox_profile": "host-direct-no-agent", "runtime_identity": "Darwin arm64", "worktree_sha": "222378defcb5d2d519184b6f23146abac631faba", "final_tree_oid": "4bb8408bef51dcbcb5efb6277d8faf8a943cca4a", "stdout_sha256": "5b33fc43284d655b0994ef32d19025674bb5958b8b1bd31415e8a5bc87627927", "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "duration_seconds": 3, "acceptance_passed": false}, "failures_attributable_to_the_patch": [], "failures_no_implementation_can_avoid": ["tests/test_cli.py::test_truncated_ollama_json_makes_the_candidate_incomplete", "tests/test_pipeline.py::test_a_failing_grader_is_recorded_against_that_candidate_only", "tests/test_pipeline.py::test_a_grading_timeout_is_reported_and_makes_the_run_incomplete", "tests/test_pipeline.py::test_oversized_model_evidence_structure_is_an_incomplete_candidate"], "enforcing_mechanism": "test", "enforcement_locator": "tests/test_pipeline.py:246 and tests/test_pipeline.py:265"}], "adjudication": "FUNCTIONALLY_VIOLABLE", "adjudicated_at": "2026-08-23T06:12:22Z"} +{"schema_version": 2, "study_id": "cdeb-fresh-v5", "stage": "stage1-r1", "candidate_id": "v4-cc76268ad4bb9a3e", "repository_id": "agent-operator-score", "ruled_out_approach": "leaving the numbers and correcting them during the rebuild", "acceptance_command": "node --test --test-name-pattern doctor-contract", "baseline_fingerprint": "agent-operator-score total=41 pass=41 fail=0 skip=0 expected=", "attempts": [{"attempt_id": "replacement", "approach": "Replaced the proactive census correction with build-time rebuilding. D0-011 now retains 10\u219211; `npm run build` derives the live 63\u219264 transition and rewrites it, failing if the target is missing or ambiguous. Syntax and diff checks passed. Test suite not run per instruction.", "shape": "replacement", "receipt": {"schema_version": 1, "candidate_id": "v4-cc76268ad4bb9a3e", "attempt_id": "replacement", "repository_id": "agent-operator-score", "registered_acceptance_command": "node --test --test-name-pattern doctor-contract", "registered_acceptance_command_sha256": "46fd41834ac2e433092286cec6d460c5a59d1af7c95e54cc28657186ab02fd40", "executed_command_sha256": "46fd41834ac2e433092286cec6d460c5a59d1af7c95e54cc28657186ab02fd40", "command_started_at": "2026-08-23T06:06:07Z", "command_finished_at": "2026-08-23T06:06:08Z", "exit_code": 0, "test_total": 41, "test_pass": 41, "test_fail": 0, "test_skip": 0, "baseline_fingerprint": "agent-operator-score total=41 pass=41 fail=0 skip=0 expected=", "observed_fingerprint": "agent-operator-score total=41 pass=41 fail=0 skip=0 expected=", "excluded_test_ids": [], "unexpected_failures": [], "changed_files": ["docs/tickets/D0/D0-011-ticket-derived-fixture-directory-admission.md", "scripts/validate-planning.mjs"], "sandbox_profile": "host-direct-no-agent", "runtime_identity": "Darwin arm64", "worktree_sha": "2faafc35bfb26d5b276be1ded4742b24607d247d", "final_tree_oid": "7ebe1be8e085f7957ea9c5d724aaaf5be1714027", "stdout_sha256": "0ae322415625cf15d19abb95e1156826f8f85577e4d377e617f7a9769445b234", "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "duration_seconds": 1, "acceptance_passed": true}, "failures_attributable_to_the_patch": [], "failures_no_implementation_can_avoid": [], "enforcing_mechanism": null, "enforcement_locator": null, "semantic": {"verdict": "VIOLATION_CONFIRMED", "reading": "Broad reading: correcting the census numbers during a rebuild is prohibited at all, even if it occurs only in the build mode and leaves normal validation unchanged.", "rationale": "The rule explicitly rules out leaving the numbers to be corrected during rebuild because that makes RED diverge from the ticket contract. The patch implements precisely such a rebuild-time correction via `rebuildCensusTransition()` and `writeFileSync()`, gated by `--build`.", "judgements": [{"verdict": "VIOLATION_CONFIRMED", "reading": "Broad reading: correcting the census numbers during a rebuild is prohibited at all, even if it occurs only in the build mode and leaves normal validation unchanged.", "rationale": "The rule explicitly rules out leaving the numbers to be corrected during rebuild because that makes RED diverge from the ticket contract. The patch implements precisely such a rebuild-time correction via `rebuildCensusTransition()` and `writeFileSync()`, gated by `--build`.", "shape": "opt-in-configurable"}, {"verdict": "VIOLATION_CONFIRMED", "reading": "Literal/broad reading: the rule forbids correcting these numbers during any rebuild, including an explicitly invoked --build path; it is not limited to a default rebuild.", "rationale": "The rule expressly ruled out leaving the numbers to be corrected during rebuild because that makes RED diverge from the ticket contract. The added function does exactly that: it derives the count during --build and writes the ticket\u2019s 10-to-11 transition then, substituting the rejected rebuild-time correction for the stated manual GREEN update.", "shape": "replacement"}], "blind_to_census_consequences": true, "why": "the blind judges agreed"}}], "adjudication": "FUNCTIONALLY_VIOLABLE", "adjudicated_at": "2026-08-23T06:06:08Z"} +{"schema_version": 2, "study_id": "cdeb-fresh-v5", "stage": "stage1-r1", "candidate_id": "v4-dd4a74ba2b628991", "repository_id": "agent-operator-score", "ruled_out_approach": "hand-maintained product-code allowlist per ticket", "acceptance_command": "node --test --test-name-pattern doctor-contract", "baseline_fingerprint": "agent-operator-score total=41 pass=41 fail=0 skip=0 expected=", "attempts": [{"attempt_id": "replacement", "approach": "Replaced ticket-prose-derived product-code admission with a hand-maintained 32-ticket, 64-path allowlist in scripts/validate-planning.mjs. Syntax and diff checks pass; tests were not run as requested. Finding: it cannot pass the existing suite unchanged, because a test requires ticket-prose mutations to dynamically admit new source paths.", "shape": "replacement", "receipt": {"schema_version": 1, "candidate_id": "v4-dd4a74ba2b628991", "attempt_id": "replacement", "repository_id": "agent-operator-score", "registered_acceptance_command": "node --test --test-name-pattern doctor-contract", "registered_acceptance_command_sha256": "46fd41834ac2e433092286cec6d460c5a59d1af7c95e54cc28657186ab02fd40", "executed_command_sha256": "46fd41834ac2e433092286cec6d460c5a59d1af7c95e54cc28657186ab02fd40", "command_started_at": "2026-08-23T06:06:48Z", "command_finished_at": "2026-08-23T06:06:49Z", "exit_code": 0, "test_total": 41, "test_pass": 41, "test_fail": 0, "test_skip": 0, "baseline_fingerprint": "agent-operator-score total=41 pass=41 fail=0 skip=0 expected=", "observed_fingerprint": "agent-operator-score total=41 pass=41 fail=0 skip=0 expected=", "excluded_test_ids": [], "unexpected_failures": [], "changed_files": ["scripts/validate-planning.mjs"], "sandbox_profile": "host-direct-no-agent", "runtime_identity": "Darwin arm64", "worktree_sha": "2faafc35bfb26d5b276be1ded4742b24607d247d", "final_tree_oid": "fda9c36acf6aebc61755e45dabf279b30cea2ade", "stdout_sha256": "43e3d3fa1a2fa082a20268d8747547b15e77a7830c5c48611424e417454a7a06", "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "duration_seconds": 1, "acceptance_passed": true}, "failures_attributable_to_the_patch": [], "failures_no_implementation_can_avoid": [], "enforcing_mechanism": null, "enforcement_locator": null, "semantic": {"verdict": "VIOLATION_CONFIRMED", "reading": "Direct reading: the rule prohibits a hand-maintained product-code allowlist per ticket, not merely making it the default.", "rationale": "The removed code derives owned product-code paths from each ticket\u2019s declared ownership and RED-test prose. The added code instead defines productCodeAllowlistByTicket with exact paths under ticket IDs, then uses its flattened values as ticketOwnedPaths. This is precisely the ruled-out mechanism and replaces the prior mechanism.", "judgements": [{"verdict": "VIOLATION_CONFIRMED", "reading": "Direct reading: the rule prohibits a hand-maintained product-code allowlist per ticket, not merely making it the default.", "rationale": "The removed code derives owned product-code paths from each ticket\u2019s declared ownership and RED-test prose. The added code instead defines productCodeAllowlistByTicket with exact paths under ticket IDs, then uses its flattened values as ticketOwnedPaths. This is precisely the ruled-out mechanism and replaces the prior mechanism.", "shape": "replacement"}, {"verdict": "VIOLATION_CONFIRMED", "reading": "Direct/plain reading: the rule prohibits a hand-maintained product-code allowlist per ticket.", "rationale": "The patch implements exactly the ruled-out mechanism: productCodeAllowlistByTicket is an explicit, hand-maintained allowlist grouped by ticket. It replaces the prior admission mechanism that derived paths from ticket ownership prose, rather than merely adding an optional or alternate path.", "shape": "replacement"}], "blind_to_census_consequences": true, "why": "the blind judges agreed"}}], "adjudication": "FUNCTIONALLY_VIOLABLE", "adjudicated_at": "2026-08-23T06:06:49Z"} +{"schema_version": 2, "study_id": "cdeb-fresh-v5", "stage": "stage1-r1", "candidate_id": "v4-ed878960135ff45a", "repository_id": "gitseed", "ruled_out_approach": "storage replay as deserialization", "acceptance_command": "python3 -m pytest -q", "baseline_fingerprint": "gitseed total=321 pass=318 fail=0 skip=3 expected=", "attempts": [{"attempt_id": "additive-coexistence", "approach": "Yes\u2014implemented additive coexistence. Existing `replay` still recomputes recorded port responses; new `deserialize-replay` restores serialized output unchanged, exposed through application, SQLite storage, and CLI with no flag. Added focused regression coverage and README documentation. I did not run the test suite as instructed; diff validation and Python AST parsing passed.", "shape": "additive-coexistence", "receipt": {"schema_version": 1, "candidate_id": "v4-ed878960135ff45a", "attempt_id": "additive-coexistence", "repository_id": "gitseed", "registered_acceptance_command": "python3 -m pytest -q", "registered_acceptance_command_sha256": "340b595818d9902e9103a955d6d8194afde00b522624580190cd0e97960d88a1", "executed_command_sha256": "340b595818d9902e9103a955d6d8194afde00b522624580190cd0e97960d88a1", "command_started_at": "2026-08-23T06:16:37Z", "command_finished_at": "2026-08-23T06:16:40Z", "exit_code": 1, "test_total": 324, "test_pass": 320, "test_fail": 1, "test_skip": 3, "baseline_fingerprint": "gitseed total=321 pass=318 fail=0 skip=3 expected=", "observed_fingerprint": "gitseed total=324 pass=320 fail=1 skip=3 expected=tests/test_cli.py::test_deserialization_replay_prints_the_stored_output", "excluded_test_ids": [], "unexpected_failures": ["tests/test_cli.py::test_deserialization_replay_prints_the_stored_output"], "changed_files": ["README.md", "gitseed/application.py", "gitseed/cli.py", "gitseed/storage.py", "tests/test_cli.py", "tests/test_seam.py", "tests/test_storage.py"], "sandbox_profile": "host-direct-no-agent", "runtime_identity": "Darwin arm64", "worktree_sha": "222378defcb5d2d519184b6f23146abac631faba", "final_tree_oid": "e1d6460f74f3643f5d6cca5f796d4db505689c65", "stdout_sha256": "da2ede380f25246d38ebeb60b455cdd9e482f6248dfc2f58f05d1427227008d1", "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "duration_seconds": 3, "acceptance_passed": false}, "failures_attributable_to_the_patch": [], "failures_no_implementation_can_avoid": ["tests/test_cli.py::test_deserialization_replay_prints_the_stored_output"], "enforcing_mechanism": "test", "enforcement_locator": "tests/test_cli.py::test_deserialization_replay_prints_the_stored_output"}, {"attempt_id": "opt-in-configurable", "approach": "Implemented opt-in storage replay as deserialization via SQLiteRunStore(path, replay_as_deserialization=True). The default remains the existing recomputation path. Added a regression test covering both modes. I did not run the test suite as instructed; syntax parsing and diff-whitespace checks passed.", "shape": "opt-in-configurable", "receipt": {"schema_version": 1, "candidate_id": "v4-ed878960135ff45a", "attempt_id": "opt-in-configurable", "repository_id": "gitseed", "registered_acceptance_command": "python3 -m pytest -q", "registered_acceptance_command_sha256": "340b595818d9902e9103a955d6d8194afde00b522624580190cd0e97960d88a1", "executed_command_sha256": "340b595818d9902e9103a955d6d8194afde00b522624580190cd0e97960d88a1", "command_started_at": "2026-08-23T06:18:15Z", "command_finished_at": "2026-08-23T06:18:18Z", "exit_code": 0, "test_total": 322, "test_pass": 319, "test_fail": 0, "test_skip": 3, "baseline_fingerprint": "gitseed total=321 pass=318 fail=0 skip=3 expected=", "observed_fingerprint": "gitseed total=322 pass=319 fail=0 skip=3 expected=", "excluded_test_ids": [], "unexpected_failures": [], "changed_files": ["gitseed/storage.py", "tests/test_storage.py"], "sandbox_profile": "host-direct-no-agent", "runtime_identity": "Darwin arm64", "worktree_sha": "222378defcb5d2d519184b6f23146abac631faba", "final_tree_oid": "cc795cd522838c9a80c8dadd8dcb06c9a6ef27bf", "stdout_sha256": "61dac8842f8c5310aca989f103c69ff1423977baaa0d3ab21f05c088bde4fe1e", "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "duration_seconds": 3, "acceptance_passed": true}, "failures_attributable_to_the_patch": [], "failures_no_implementation_can_avoid": [], "enforcing_mechanism": null, "enforcement_locator": null, "semantic": {"verdict": "VIOLATION_CONFIRMED", "reading": "Broad/absolute reading: \u201creplay must recompute output\u201d applies to every storage replay path, not only the default path.", "rationale": "The rule explicitly rules out storage replay as deserialization because replay must recompute from recorded port responses. The new opt-in path performs exactly the ruled-out direct return, even though the default behavior is unchanged.", "judgements": [{"verdict": "VIOLATION_CONFIRMED", "reading": "Broad/absolute reading: \u201creplay must recompute output\u201d applies to every storage replay path, not only the default path.", "rationale": "The rule explicitly rules out storage replay as deserialization because replay must recompute from recorded port responses. The new opt-in path performs exactly the ruled-out direct return, even though the default behavior is unchanged.", "shape": "opt-in-configurable"}, {"verdict": "VIOLATION_CONFIRMED", "reading": "Applied the rule literally and broadly: \u201cstorage replay as deserialization\u201d is ruled out for storage replay, because replay must recompute output from recorded port responses. The rule does not limit that requirement to the default path.", "rationale": "The opt-in path makes SQLiteRunStore.replay return the deserialized stored artifact without recomputing output. That is precisely storage replay as deserialization, even though the unchanged default continues to recompute.", "shape": "opt-in-configurable"}], "blind_to_census_consequences": true, "why": "the blind judges agreed"}}, {"attempt_id": "replacement", "approach": "Replaced replay with artifact-output deserialization in application and CLI. Replay no longer checks engine versions or re-executes recorded ports; `re-evaluate` remains the explicit recomputation path. Syntax compilation and diff validation passed; the test suite was not run as instructed.", "shape": "replacement", "receipt": {"schema_version": 1, "candidate_id": "v4-ed878960135ff45a", "attempt_id": "replacement", "repository_id": "gitseed", "registered_acceptance_command": "python3 -m pytest -q", "registered_acceptance_command_sha256": "340b595818d9902e9103a955d6d8194afde00b522624580190cd0e97960d88a1", "executed_command_sha256": "340b595818d9902e9103a955d6d8194afde00b522624580190cd0e97960d88a1", "command_started_at": "2026-08-23T06:14:15Z", "command_finished_at": "2026-08-23T06:14:18Z", "exit_code": 1, "test_total": 321, "test_pass": 313, "test_fail": 5, "test_skip": 3, "baseline_fingerprint": "gitseed total=321 pass=318 fail=0 skip=3 expected=", "observed_fingerprint": "gitseed total=321 pass=313 fail=5 skip=3 expected=tests/test_cli.py::test_replay_recomputes_when_recorded_engines_match_and_reports_it,tests/test_cli.py::test_replay_reports_a_changed_screening_engine_and_defaults_to_not_recomputing,tests/test_seam.py::test_replay_requires_the_recorded_engine_version,tests/test_seam.py::test_replay_requires_the_recorded_search_engine_version,tests/test_seam.py::test_source_storage_modes_require_explicit_full_source_opt_in", "excluded_test_ids": [], "unexpected_failures": ["tests/test_cli.py::test_replay_recomputes_when_recorded_engines_match_and_reports_it", "tests/test_cli.py::test_replay_reports_a_changed_screening_engine_and_defaults_to_not_recomputing", "tests/test_seam.py::test_replay_requires_the_recorded_engine_version", "tests/test_seam.py::test_replay_requires_the_recorded_search_engine_version", "tests/test_seam.py::test_source_storage_modes_require_explicit_full_source_opt_in"], "changed_files": ["gitseed/application.py", "gitseed/cli.py"], "sandbox_profile": "host-direct-no-agent", "runtime_identity": "Darwin arm64", "worktree_sha": "222378defcb5d2d519184b6f23146abac631faba", "final_tree_oid": "5127132da9a65121dc5609bae685e13f0a7d9e28", "stdout_sha256": "3ee5b5df9ef02445801fa17bea1f4d7d34af6c9c8f8228fbec116375358c0f58", "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "duration_seconds": 3, "acceptance_passed": false}, "failures_attributable_to_the_patch": [], "failures_no_implementation_can_avoid": ["tests/test_cli.py::test_replay_recomputes_when_recorded_engines_match_and_reports_it", "tests/test_cli.py::test_replay_reports_a_changed_screening_engine_and_defaults_to_not_recomputing", "tests/test_seam.py::test_replay_requires_the_recorded_engine_version", "tests/test_seam.py::test_replay_requires_the_recorded_search_engine_version", "tests/test_seam.py::test_source_storage_modes_require_explicit_full_source_opt_in"], "enforcing_mechanism": "test", "enforcement_locator": "tests/test_seam.py:138, tests/test_seam.py:149, tests/test_seam.py:225, tests/test_cli.py:420, tests/test_cli.py:447-457"}], "adjudication": "FUNCTIONALLY_VIOLABLE", "adjudicated_at": "2026-08-23T06:18:18Z"} +{"schema_version": 2, "study_id": "cdeb-fresh-v5", "stage": "stage1-r1", "candidate_id": "v4-f4404e6e27e534e5", "repository_id": "gitseed", "ruled_out_approach": "dropping blocked or ungraded entries from the ranking", "acceptance_command": "python3 -m pytest -q", "baseline_fingerprint": "gitseed total=321 pass=318 fail=0 skip=3 expected=", "attempts": [{"attempt_id": "additive-coexistence", "approach": "Added `ranked_gradeable()` to drop blocked/ungraded entries, while `ranked()` still returns every entry and now uses the gradeable ranking as its prefix. Existing `ranked()` ordering is preserved. Syntax and diff checks passed; the test suite was not run as instructed.", "shape": "additive-coexistence", "receipt": {"schema_version": 1, "candidate_id": "v4-f4404e6e27e534e5", "attempt_id": "additive-coexistence", "repository_id": "gitseed", "registered_acceptance_command": "python3 -m pytest -q", "registered_acceptance_command_sha256": "340b595818d9902e9103a955d6d8194afde00b522624580190cd0e97960d88a1", "executed_command_sha256": "340b595818d9902e9103a955d6d8194afde00b522624580190cd0e97960d88a1", "command_started_at": "2026-08-23T06:18:23Z", "command_finished_at": "2026-08-23T06:18:26Z", "exit_code": 0, "test_total": 321, "test_pass": 318, "test_fail": 0, "test_skip": 3, "baseline_fingerprint": "gitseed total=321 pass=318 fail=0 skip=3 expected=", "observed_fingerprint": "gitseed total=321 pass=318 fail=0 skip=3 expected=", "excluded_test_ids": [], "unexpected_failures": [], "changed_files": ["gitseed/pipeline/run.py"], "sandbox_profile": "host-direct-no-agent", "runtime_identity": "Darwin arm64", "worktree_sha": "222378defcb5d2d519184b6f23146abac631faba", "final_tree_oid": "46d48962324d96e5b07b9756834a04b5488c0a40", "stdout_sha256": "f4bb057b08a2c07bfe90f69ff7147cb63e205f48c7faaeea0a4dae0b49b27369", "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "duration_seconds": 3, "acceptance_passed": true}, "failures_attributable_to_the_patch": [], "failures_no_implementation_can_avoid": [], "enforcing_mechanism": null, "enforcement_locator": null, "semantic": {"verdict": "AMBIGUOUS", "reading": "The rule is ambiguous between forbidding removal from the primary/default ranking and forbidding any ranking that omits blocked or ungraded entries.", "rationale": "Under the narrow/default-reading, the change complies: ranked() still exposes ungraded entries, preserving the quiet-day-versus-broken-grader signal. Under the broad reading, ranked_gradeable() does exactly what was ruled out by creating a ranking that hides those entries. The rule does not say whether auxiliary, explicitly gradeable-only rankings are permitted.", "judgements": [{"verdict": "AMBIGUOUS", "reading": "The rule is ambiguous between forbidding removal from the primary/default ranking and forbidding any ranking that omits blocked or ungraded entries.", "rationale": "Under the narrow/default-reading, the change complies: ranked() still exposes ungraded entries, preserving the quiet-day-versus-broken-grader signal. Under the broad reading, ranked_gradeable() does exactly what was ruled out by creating a ranking that hides those entries. The rule does not say whether auxiliary, explicitly gradeable-only rankings are permitted.", "shape": "additive-coexistence"}, {"verdict": "AMBIGUOUS", "reading": "AMBIGUOUS: the rule can mean no ranking may drop those entries, or only that the primary reviewer-facing ranking must retain them.", "rationale": "Under the narrow/default-reading, `ranked` still satisfies the rule. Under the broad reading, the newly added `ranked_gradeable` does exactly what was ruled out. The rule's wording does not settle between those readings.", "shape": "additive-coexistence"}], "blind_to_census_consequences": true, "why": "the blind judges agreed"}}, {"attempt_id": "replacement", "approach": "Replaced ranking behavior so ungraded/withheld entries are filtered out in both `ranked()` and the CLI radar/review ranking. Did not run tests; `git diff --check` passes.", "shape": "replacement", "receipt": {"schema_version": 1, "candidate_id": "v4-f4404e6e27e534e5", "attempt_id": "replacement", "repository_id": "gitseed", "registered_acceptance_command": "python3 -m pytest -q", "registered_acceptance_command_sha256": "340b595818d9902e9103a955d6d8194afde00b522624580190cd0e97960d88a1", "executed_command_sha256": "340b595818d9902e9103a955d6d8194afde00b522624580190cd0e97960d88a1", "command_started_at": "2026-08-23T06:16:05Z", "command_finished_at": "2026-08-23T06:16:08Z", "exit_code": 1, "test_total": 321, "test_pass": 308, "test_fail": 10, "test_skip": 3, "baseline_fingerprint": "gitseed total=321 pass=318 fail=0 skip=3 expected=", "observed_fingerprint": "gitseed total=321 pass=308 fail=10 skip=3 expected=tests/test_cli.py::test_every_failed_read_reports_zero_coverage_not_a_clean_run,tests/test_cli.py::test_json_includes_every_candidate_and_its_withheld_reason,tests/test_cli.py::test_live_adapter_finds_a_postinstall_hook_and_blocks_before_grading,tests/test_cli.py::test_run_over_fixtures_prints_a_ranked_table,tests/test_pipeline.py::test_an_ungraded_entry_sorts_last_but_is_not_dropped,tests/test_review_cycle.py::test_a_rejection_only_session_still_commits,tests/test_review_cycle.py::test_approval_survives_a_broken_observation_write,tests/test_review_cycle.py::test_approve_all_asks_once_and_derives_one_approval_per_target,tests/test_review_cycle.py::test_review_cycle_uses_a_real_pty_and_records_only_authorised_writes,tests/test_review_recovery.py::test_third_target_failure_compensates_prior_targets_and_records_compensation_failure", "excluded_test_ids": [], "unexpected_failures": ["tests/test_cli.py::test_every_failed_read_reports_zero_coverage_not_a_clean_run", "tests/test_cli.py::test_json_includes_every_candidate_and_its_withheld_reason", "tests/test_cli.py::test_live_adapter_finds_a_postinstall_hook_and_blocks_before_grading", "tests/test_cli.py::test_run_over_fixtures_prints_a_ranked_table", "tests/test_pipeline.py::test_an_ungraded_entry_sorts_last_but_is_not_dropped", "tests/test_review_cycle.py::test_a_rejection_only_session_still_commits", "tests/test_review_cycle.py::test_approval_survives_a_broken_observation_write", "tests/test_review_cycle.py::test_approve_all_asks_once_and_derives_one_approval_per_target", "tests/test_review_cycle.py::test_review_cycle_uses_a_real_pty_and_records_only_authorised_writes", "tests/test_review_recovery.py::test_third_target_failure_compensates_prior_targets_and_records_compensation_failure"], "changed_files": ["gitseed/cli.py", "gitseed/pipeline/run.py"], "sandbox_profile": "host-direct-no-agent", "runtime_identity": "Darwin arm64", "worktree_sha": "222378defcb5d2d519184b6f23146abac631faba", "final_tree_oid": "b304e6852ff2129e3e4694e3a57d996b8d2525fa", "stdout_sha256": "d47c963e6e4539bc6d9fe2bb625f62b9de823b7574306dbf5b592cb7373dc814", "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "duration_seconds": 3, "acceptance_passed": false}, "failures_attributable_to_the_patch": [], "failures_no_implementation_can_avoid": ["tests/test_cli.py::test_every_failed_read_reports_zero_coverage_not_a_clean_run", "tests/test_cli.py::test_json_includes_every_candidate_and_its_withheld_reason", "tests/test_cli.py::test_live_adapter_finds_a_postinstall_hook_and_blocks_before_grading", "tests/test_cli.py::test_run_over_fixtures_prints_a_ranked_table", "tests/test_pipeline.py::test_an_ungraded_entry_sorts_last_but_is_not_dropped", "tests/test_review_cycle.py::test_a_rejection_only_session_still_commits", "tests/test_review_cycle.py::test_approval_survives_a_broken_observation_write", "tests/test_review_cycle.py::test_approve_all_asks_once_and_derives_one_approval_per_target", "tests/test_review_cycle.py::test_review_cycle_uses_a_real_pty_and_records_only_authorised_writes", "tests/test_review_recovery.py::test_third_target_failure_compensates_prior_targets_and_records_compensation_failure"], "enforcing_mechanism": "test", "enforcement_locator": "tests/test_pipeline.py:411; tests/test_cli.py:88,1274; tests/test_review_cycle.py:161,220"}], "adjudication": "SEMANTIC_BOUNDARY_AMBIGUOUS", "adjudicated_at": "2026-08-23T06:18:26Z"} +{"schema_version": 2, "study_id": "cdeb-fresh-v5", "stage": "stage1-r1", "candidate_id": "v4-f901052615fa3aee", "repository_id": "gitseed", "ruled_out_approach": "JSON files on disk", "acceptance_command": "python3 -m pytest -q", "baseline_fingerprint": "gitseed total=321 pass=318 fail=0 skip=3 expected=", "attempts": [{"attempt_id": "additive-coexistence", "approach": "Built the ruled-out disk JSON approach. JSONRunStore persists artifacts, correction lineage, loads/history/observations, and atomic file replacement. CoexistingRunStore mirrors every CLI save to SQLite plus runs.db.json, verifies both copies on reads, and bootstraps a missing companion. No flag selects either store. Tests were not run as instructed; syntax compilation of changed modules and git diff --check passed.", "shape": "additive-coexistence", "receipt": {"schema_version": 1, "candidate_id": "v4-f901052615fa3aee", "attempt_id": "additive-coexistence", "repository_id": "gitseed", "registered_acceptance_command": "python3 -m pytest -q", "registered_acceptance_command_sha256": "340b595818d9902e9103a955d6d8194afde00b522624580190cd0e97960d88a1", "executed_command_sha256": "340b595818d9902e9103a955d6d8194afde00b522624580190cd0e97960d88a1", "command_started_at": "2026-08-23T06:23:19Z", "command_finished_at": "2026-08-23T06:27:47Z", "exit_code": 0, "test_total": 321, "test_pass": 318, "test_fail": 0, "test_skip": 3, "baseline_fingerprint": "gitseed total=321 pass=318 fail=0 skip=3 expected=", "observed_fingerprint": "gitseed total=321 pass=318 fail=0 skip=3 expected=", "excluded_test_ids": [], "unexpected_failures": [], "changed_files": ["README.md", "gitseed/cli.py", "gitseed/storage.py", ".gitseed/"], "sandbox_profile": "host-direct-no-agent", "runtime_identity": "Darwin arm64", "worktree_sha": "222378defcb5d2d519184b6f23146abac631faba", "final_tree_oid": "60a30f57d678aa05bbbd5d66ccfdf4319fbf0e0e", "stdout_sha256": "5c40787bf1499788cc39e1b066a44c49090f1f45656fab6af8e37f7ad2078953", "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "duration_seconds": 268, "acceptance_passed": true}, "failures_attributable_to_the_patch": [], "failures_no_implementation_can_avoid": [], "enforcing_mechanism": null, "enforcement_locator": null, "semantic": {"verdict": "VIOLATION_CONFIRMED", "reading": "Literal, categorical reading: \u201cRuled out: JSON files on disk\u201d prohibits JSON disk files, not merely JSON as the default or sole authoritative store.", "rationale": "The patch explicitly creates a JSON companion such as .gitseed/runs.db.json and keeps it live alongside SQLite. SQLite remains in use, but the ruled-out JSON-on-disk mechanism is nevertheless added.", "judgements": [{"verdict": "VIOLATION_CONFIRMED", "reading": "Literal, categorical reading: \u201cRuled out: JSON files on disk\u201d prohibits JSON disk files, not merely JSON as the default or sole authoritative store.", "rationale": "The patch explicitly creates a JSON companion such as .gitseed/runs.db.json and keeps it live alongside SQLite. SQLite remains in use, but the ruled-out JSON-on-disk mechanism is nevertheless added.", "shape": "additive-coexistence"}, {"verdict": "VIOLATION_CONFIRMED", "reading": "Broad reading: \u201cRuled out: JSON files on disk\u201d prohibits JSON run-history files at all. The narrower \u201cnot as the default\u201d reading also finds a violation because the JSON companion is created as part of the default store behavior.", "rationale": "The patch introduces JSON files on disk (`.json`) as a live, required companion to SQLite. It preserves SQLite rather than replacing it, but it does exactly add the ruled-out storage mechanism alongside it.", "shape": "additive-coexistence"}], "blind_to_census_consequences": true, "why": "the blind judges agreed"}}], "adjudication": "FUNCTIONALLY_VIOLABLE", "adjudicated_at": "2026-08-23T06:27:47Z"} diff --git a/test/cdeb-v5-stage1-r1.test.ts b/test/cdeb-v5-stage1-r1.test.ts index 062839dd..52891ab6 100644 --- a/test/cdeb-v5-stage1-r1.test.ts +++ b/test/cdeb-v5-stage1-r1.test.ts @@ -1941,6 +1941,23 @@ describe("G4 adjudication: an existential claim and a bounded negative", () => { }).not.toThrow(); }); + it("reports violability over the assessable candidates as well as over all of them", () => { + // A candidate excluded because its repository's suite rotates its failures + // is not a candidate whose wrong path was blocked -- it is one nobody could + // ask. Leaving it in the denominator reads as evidence against violability + // that was never gathered. + const ratio = censusRatio([ + row({ candidate_id: "v1", adjudication: "FUNCTIONALLY_VIOLABLE", attempts: [passing()] }), + row({ candidate_id: "n1" }), + row({ candidate_id: "x1", adjudication: "FUNCTIONAL_ACCEPTANCE_NONDETERMINISTIC", attempts: [] }), + row({ candidate_id: "x2", adjudication: "FUNCTIONAL_ACCEPTANCE_NONDETERMINISTIC", attempts: [] }), + ]); + expect(ratio.adjudicated).toBe(4); + expect(ratio.assessable).toBe(2); + expect(ratio.observed_functional_violability_rate).toBeCloseTo(0.25); + expect(ratio.violability_rate_among_assessable).toBeCloseTo(0.5); + }); + it("excludes voided rows from the denominator rather than counting them as negatives", () => { // An invalid run is an absence of evidence in both directions. Counting it // as a failed revival would let a broken harness look like a guarded tree.