FA-9091 / Build systems / Open access
Incremental rebuild decision: Compiler identity is absent from invalidation · case 01
Compiler identity is absent from invalidation.
ROOT CAUSE
The implementation substitutes False for state['tool'] != state['old_tool'], so compiler identity is absent from invalidation.
VERIFIED REPAIR
Invalidate when the compiler identity changes.
Unsuccessful approach: The attempted repair substitutes state['tool'] == state['old_tool']. Fixture 17 still yields True instead of False.
Case contract
Rebuild if output absent, content digest changed, tool changed, recipe changed, or a prerequisite failed; timestamps alone are irrelevant.
Why this case matters
An offline model of incremental rebuild decision, suitable for testing build and release tooling without external services.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(state):
return (not state['exists'] or state['digest'] != state['old_digest'] or False or state['recipe'] != state['old_recipe'] or state['failed'])
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('fixture 1', solve({'exists': False, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 2', solve({'exists': False, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 3', solve({'exists': False, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 4', solve({'exists': False, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 5', solve({'exists': False, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 6', solve({'exists': False, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 7', solve({'exists': False, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 8', solve({'exists': False, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 9', solve({'exists': False, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 10', solve({'exists': False, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 11', solve({'exists': False, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 12', solve({'exists': False, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 13', solve({'exists': False, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 14', solve({'exists': False, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 15', solve({'exists': False, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 16', solve({'exists': False, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 17', solve({'exists': True, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': False}), False)
check('fixture 18', solve({'exists': True, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 19', solve({'exists': True, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 20', solve({'exists': True, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 21', solve({'exists': True, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 22', solve({'exists': True, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 23', solve({'exists': True, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 24', solve({'exists': True, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 25', solve({'exists': True, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 26', solve({'exists': True, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 27', solve({'exists': True, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 28', solve({'exists': True, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 29', solve({'exists': True, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 30', solve({'exists': True, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 31', solve({'exists': True, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 32', solve({'exists': True, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': True}), True)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| fixture 1 | True | True | Passed |
| fixture 2 | True | True | Passed |
| fixture 3 | True | True | Passed |
| fixture 4 | True | True | Passed |
| fixture 5 | True | True | Passed |
| fixture 6 | True | True | Passed |
| fixture 7 | True | True | Passed |
| fixture 8 | True | True | Passed |
| fixture 9 | True | True | Passed |
| fixture 10 | True | True | Passed |
| fixture 11 | True | True | Passed |
| fixture 12 | True | True | Passed |
| fixture 13 | True | True | Passed |
| fixture 14 | True | True | Passed |
| fixture 15 | True | True | Passed |
| fixture 16 | True | True | Passed |
| fixture 17 | False | False | Passed |
| fixture 18 | True | True | Passed |
| fixture 19 | True | True | Passed |
| fixture 20 | True | True | Passed |
| fixture 21 | False | True | Failed |
| fixture 22 | True | True | Passed |
| fixture 23 | True | True | Passed |
| fixture 24 | True | True | Passed |
| fixture 25 | True | True | Passed |
| fixture 26 | True | True | Passed |
| fixture 27 | True | True | Passed |
| fixture 28 | True | True | Passed |
| fixture 29 | True | True | Passed |
| fixture 30 | True | True | Passed |
| fixture 31 | True | True | Passed |
| fixture 32 | True | True | Passed |
SHA-256 / a9ac677bb7aed463dabd685c9c3ba75096cb3ce1789a7e836be49d9d087165fa
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(state):
return (not state['exists'] or state['digest'] != state['old_digest'] or state['tool'] == state['old_tool'] or state['recipe'] != state['old_recipe'] or state['failed'])
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('fixture 1', solve({'exists': False, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 2', solve({'exists': False, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 3', solve({'exists': False, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 4', solve({'exists': False, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 5', solve({'exists': False, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 6', solve({'exists': False, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 7', solve({'exists': False, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 8', solve({'exists': False, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 9', solve({'exists': False, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 10', solve({'exists': False, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 11', solve({'exists': False, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 12', solve({'exists': False, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 13', solve({'exists': False, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 14', solve({'exists': False, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 15', solve({'exists': False, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 16', solve({'exists': False, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 17', solve({'exists': True, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': False}), False)
check('fixture 18', solve({'exists': True, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 19', solve({'exists': True, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 20', solve({'exists': True, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 21', solve({'exists': True, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 22', solve({'exists': True, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 23', solve({'exists': True, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 24', solve({'exists': True, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 25', solve({'exists': True, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 26', solve({'exists': True, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 27', solve({'exists': True, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 28', solve({'exists': True, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 29', solve({'exists': True, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 30', solve({'exists': True, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 31', solve({'exists': True, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 32', solve({'exists': True, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': True}), True)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| fixture 1 | True | True | Passed |
| fixture 2 | True | True | Passed |
| fixture 3 | True | True | Passed |
| fixture 4 | True | True | Passed |
| fixture 5 | True | True | Passed |
| fixture 6 | True | True | Passed |
| fixture 7 | True | True | Passed |
| fixture 8 | True | True | Passed |
| fixture 9 | True | True | Passed |
| fixture 10 | True | True | Passed |
| fixture 11 | True | True | Passed |
| fixture 12 | True | True | Passed |
| fixture 13 | True | True | Passed |
| fixture 14 | True | True | Passed |
| fixture 15 | True | True | Passed |
| fixture 16 | True | True | Passed |
| fixture 17 | True | False | Failed |
| fixture 18 | True | True | Passed |
| fixture 19 | True | True | Passed |
| fixture 20 | True | True | Passed |
| fixture 21 | False | True | Failed |
| fixture 22 | True | True | Passed |
| fixture 23 | True | True | Passed |
| fixture 24 | True | True | Passed |
| fixture 25 | True | True | Passed |
| fixture 26 | True | True | Passed |
| fixture 27 | True | True | Passed |
| fixture 28 | True | True | Passed |
| fixture 29 | True | True | Passed |
| fixture 30 | True | True | Passed |
| fixture 31 | True | True | Passed |
| fixture 32 | True | True | Passed |
SHA-256 / 80fd6849dc796079ff7485ee788c3088a22302708fb1bc08ef98766a5c81ac86
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(state):
return (not state['exists'] or state['digest'] != state['old_digest'] or state['tool'] != state['old_tool'] or state['recipe'] != state['old_recipe'] or state['failed'])
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('fixture 1', solve({'exists': False, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 2', solve({'exists': False, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 3', solve({'exists': False, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 4', solve({'exists': False, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 5', solve({'exists': False, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 6', solve({'exists': False, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 7', solve({'exists': False, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 8', solve({'exists': False, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 9', solve({'exists': False, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 10', solve({'exists': False, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 11', solve({'exists': False, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 12', solve({'exists': False, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 13', solve({'exists': False, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 14', solve({'exists': False, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 15', solve({'exists': False, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 16', solve({'exists': False, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 17', solve({'exists': True, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': False}), False)
check('fixture 18', solve({'exists': True, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 19', solve({'exists': True, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 20', solve({'exists': True, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 21', solve({'exists': True, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 22', solve({'exists': True, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 23', solve({'exists': True, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 24', solve({'exists': True, 'digest': 'a', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 25', solve({'exists': True, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 26', solve({'exists': True, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 27', solve({'exists': True, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 28', solve({'exists': True, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc1', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 29', solve({'exists': True, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 30', solve({'exists': True, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r1', 'old_recipe': 'r1', 'failed': True}), True)
check('fixture 31', solve({'exists': True, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': False}), True)
check('fixture 32', solve({'exists': True, 'digest': 'b', 'old_digest': 'a', 'tool': 'cc2', 'old_tool': 'cc1', 'recipe': 'r2', 'old_recipe': 'r1', 'failed': True}), True)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| fixture 1 | True | True | Passed |
| fixture 2 | True | True | Passed |
| fixture 3 | True | True | Passed |
| fixture 4 | True | True | Passed |
| fixture 5 | True | True | Passed |
| fixture 6 | True | True | Passed |
| fixture 7 | True | True | Passed |
| fixture 8 | True | True | Passed |
| fixture 9 | True | True | Passed |
| fixture 10 | True | True | Passed |
| fixture 11 | True | True | Passed |
| fixture 12 | True | True | Passed |
| fixture 13 | True | True | Passed |
| fixture 14 | True | True | Passed |
| fixture 15 | True | True | Passed |
| fixture 16 | True | True | Passed |
| fixture 17 | False | False | Passed |
| fixture 18 | True | True | Passed |
| fixture 19 | True | True | Passed |
| fixture 20 | True | True | Passed |
| fixture 21 | True | True | Passed |
| fixture 22 | True | True | Passed |
| fixture 23 | True | True | Passed |
| fixture 24 | True | True | Passed |
| fixture 25 | True | True | Passed |
| fixture 26 | True | True | Passed |
| fixture 27 | True | True | Passed |
| fixture 28 | True | True | Passed |
| fixture 29 | True | True | Passed |
| fixture 30 | True | True | Passed |
| fixture 31 | True | True | Passed |
| fixture 32 | True | True | Passed |
SHA-256 / 3f10f8d55f1744d83f8c9a11cfd81a7be839b88ae17e1a36df07b81333b276da
Verification & scope
This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.
Observations recorded using Python 3.12.14 at 2026-09-29T14:38:26.928599+00:00.
Case digest / 83055f906c86e45ba4ce46e6aa8ce63ae13c3c2f7e32772d20200a16c07ca258