FA-9331 / Dependency resolution / Open access
Release candidate selection: Yanked versions remain eligible · case 01
Yanked versions remain eligible.
ROOT CAUSE
The implementation substitutes True for not r['yanked'], so yanked versions remain eligible.
VERIFIED REPAIR
Exclude yanked releases.
Unsuccessful approach: The attempted repair substitutes r['yanked']. Fixture 7 still yields (3, 0) instead of (2, 0).
Case contract
Choose the greatest compatible version; exclude yanked, prerelease, wrong-platform and below-minimum candidates. Return None if no candidates remain. Versions are integer tuples.
Why this case matters
An offline model of release candidate selection, 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(releases, minimum, platform):
items = [r for r in releases if True]
items = [r for r in items if not r['pre']]
items = [r for r in items if r['platform'] in [platform, 'any']]
items = [r for r in items if r['version'] >= minimum]
return max((r['version'] for r in items), default=None)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('fixture 1', solve([], (0, 0), 'linux'), None)
check('fixture 2', solve([], (0, 0), 'win'), None)
check('fixture 3', solve([], (2, 0), 'linux'), None)
check('fixture 4', solve([], (2, 0), 'win'), None)
check('fixture 5', solve([], (6, 0), 'linux'), None)
check('fixture 6', solve([], (6, 0), 'win'), None)
check('fixture 7', solve([{'version': (1, 0), 'yanked': False, 'pre': False, 'platform': 'any'}, {'version': (2, 0), 'yanked': False, 'pre': False, 'platform': 'linux'}, {'version': (3, 0), 'yanked': True, 'pre': False, 'platform': 'linux'}, {'version': (4, 0), 'yanked': False, 'pre': True, 'platform': 'linux'}, {'version': (5, 0), 'yanked': False, 'pre': False, 'platform': 'win'}], (0, 0), 'linux'), (2, 0))
check('fixture 8', solve([{'version': (1, 0), 'yanked': False, 'pre': False, 'platform': 'any'}, {'version': (2, 0), 'yanked': False, 'pre': False, 'platform': 'linux'}, {'version': (3, 0), 'yanked': True, 'pre': False, 'platform': 'linux'}, {'version': (4, 0), 'yanked': False, 'pre': True, 'platform': 'linux'}, {'version': (5, 0), 'yanked': False, 'pre': False, 'platform': 'win'}], (0, 0), 'win'), (5, 0))
check('fixture 9', solve([{'version': (1, 0), 'yanked': False, 'pre': False, 'platform': 'any'}, {'version': (2, 0), 'yanked': False, 'pre': False, 'platform': 'linux'}, {'version': (3, 0), 'yanked': True, 'pre': False, 'platform': 'linux'}, {'version': (4, 0), 'yanked': False, 'pre': True, 'platform': 'linux'}, {'version': (5, 0), 'yanked': False, 'pre': False, 'platform': 'win'}], (2, 0), 'linux'), (2, 0))
check('fixture 10', solve([{'version': (1, 0), 'yanked': False, 'pre': False, 'platform': 'any'}, {'version': (2, 0), 'yanked': False, 'pre': False, 'platform': 'linux'}, {'version': (3, 0), 'yanked': True, 'pre': False, 'platform': 'linux'}, {'version': (4, 0), 'yanked': False, 'pre': True, 'platform': 'linux'}, {'version': (5, 0), 'yanked': False, 'pre': False, 'platform': 'win'}], (2, 0), 'win'), (5, 0))
check('fixture 11', solve([{'version': (1, 0), 'yanked': False, 'pre': False, 'platform': 'any'}, {'version': (2, 0), 'yanked': False, 'pre': False, 'platform': 'linux'}, {'version': (3, 0), 'yanked': True, 'pre': False, 'platform': 'linux'}, {'version': (4, 0), 'yanked': False, 'pre': True, 'platform': 'linux'}, {'version': (5, 0), 'yanked': False, 'pre': False, 'platform': 'win'}], (6, 0), 'linux'), None)
check('fixture 12', solve([{'version': (1, 0), 'yanked': False, 'pre': False, 'platform': 'any'}, {'version': (2, 0), 'yanked': False, 'pre': False, 'platform': 'linux'}, {'version': (3, 0), 'yanked': True, 'pre': False, 'platform': 'linux'}, {'version': (4, 0), 'yanked': False, 'pre': True, 'platform': 'linux'}, {'version': (5, 0), 'yanked': False, 'pre': False, 'platform': 'win'}], (6, 0), 'win'), None)
check('fixture 13', solve([{'version': (2, 0), 'yanked': False, 'pre': False, 'platform': 'any'}], (0, 0), 'linux'), (2, 0))
check('fixture 14', solve([{'version': (2, 0), 'yanked': False, 'pre': False, 'platform': 'any'}], (0, 0), 'win'), (2, 0))
check('fixture 15', solve([{'version': (2, 0), 'yanked': False, 'pre': False, 'platform': 'any'}], (2, 0), 'linux'), (2, 0))
check('fixture 16', solve([{'version': (2, 0), 'yanked': False, 'pre': False, 'platform': 'any'}], (2, 0), 'win'), (2, 0))
check('fixture 17', solve([{'version': (2, 0), 'yanked': False, 'pre': False, 'platform': 'any'}], (6, 0), 'linux'), None)
check('fixture 18', solve([{'version': (2, 0), 'yanked': False, 'pre': False, 'platform': 'any'}], (6, 0), 'win'), None)
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 | None | None | Passed |
| fixture 2 | None | None | Passed |
| fixture 3 | None | None | Passed |
| fixture 4 | None | None | Passed |
| fixture 5 | None | None | Passed |
| fixture 6 | None | None | Passed |
| fixture 7 | [3, 0] | [2, 0] | Failed |
| fixture 8 | [5, 0] | [5, 0] | Passed |
| fixture 9 | [3, 0] | [2, 0] | Failed |
| fixture 10 | [5, 0] | [5, 0] | Passed |
| fixture 11 | None | None | Passed |
| fixture 12 | None | None | Passed |
| fixture 13 | [2, 0] | [2, 0] | Passed |
| fixture 14 | [2, 0] | [2, 0] | Passed |
| fixture 15 | [2, 0] | [2, 0] | Passed |
| fixture 16 | [2, 0] | [2, 0] | Passed |
| fixture 17 | None | None | Passed |
| fixture 18 | None | None | Passed |
SHA-256 / 3b7cc6c875a60f74bc46f98cb123a62475e9f0acba0e9ee0d207397dd3172d2a
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(releases, minimum, platform):
items = [r for r in releases if r['yanked']]
items = [r for r in items if not r['pre']]
items = [r for r in items if r['platform'] in [platform, 'any']]
items = [r for r in items if r['version'] >= minimum]
return max((r['version'] for r in items), default=None)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('fixture 1', solve([], (0, 0), 'linux'), None)
check('fixture 2', solve([], (0, 0), 'win'), None)
check('fixture 3', solve([], (2, 0), 'linux'), None)
check('fixture 4', solve([], (2, 0), 'win'), None)
check('fixture 5', solve([], (6, 0), 'linux'), None)
check('fixture 6', solve([], (6, 0), 'win'), None)
check('fixture 7', solve([{'version': (1, 0), 'yanked': False, 'pre': False, 'platform': 'any'}, {'version': (2, 0), 'yanked': False, 'pre': False, 'platform': 'linux'}, {'version': (3, 0), 'yanked': True, 'pre': False, 'platform': 'linux'}, {'version': (4, 0), 'yanked': False, 'pre': True, 'platform': 'linux'}, {'version': (5, 0), 'yanked': False, 'pre': False, 'platform': 'win'}], (0, 0), 'linux'), (2, 0))
check('fixture 8', solve([{'version': (1, 0), 'yanked': False, 'pre': False, 'platform': 'any'}, {'version': (2, 0), 'yanked': False, 'pre': False, 'platform': 'linux'}, {'version': (3, 0), 'yanked': True, 'pre': False, 'platform': 'linux'}, {'version': (4, 0), 'yanked': False, 'pre': True, 'platform': 'linux'}, {'version': (5, 0), 'yanked': False, 'pre': False, 'platform': 'win'}], (0, 0), 'win'), (5, 0))
check('fixture 9', solve([{'version': (1, 0), 'yanked': False, 'pre': False, 'platform': 'any'}, {'version': (2, 0), 'yanked': False, 'pre': False, 'platform': 'linux'}, {'version': (3, 0), 'yanked': True, 'pre': False, 'platform': 'linux'}, {'version': (4, 0), 'yanked': False, 'pre': True, 'platform': 'linux'}, {'version': (5, 0), 'yanked': False, 'pre': False, 'platform': 'win'}], (2, 0), 'linux'), (2, 0))
check('fixture 10', solve([{'version': (1, 0), 'yanked': False, 'pre': False, 'platform': 'any'}, {'version': (2, 0), 'yanked': False, 'pre': False, 'platform': 'linux'}, {'version': (3, 0), 'yanked': True, 'pre': False, 'platform': 'linux'}, {'version': (4, 0), 'yanked': False, 'pre': True, 'platform': 'linux'}, {'version': (5, 0), 'yanked': False, 'pre': False, 'platform': 'win'}], (2, 0), 'win'), (5, 0))
check('fixture 11', solve([{'version': (1, 0), 'yanked': False, 'pre': False, 'platform': 'any'}, {'version': (2, 0), 'yanked': False, 'pre': False, 'platform': 'linux'}, {'version': (3, 0), 'yanked': True, 'pre': False, 'platform': 'linux'}, {'version': (4, 0), 'yanked': False, 'pre': True, 'platform': 'linux'}, {'version': (5, 0), 'yanked': False, 'pre': False, 'platform': 'win'}], (6, 0), 'linux'), None)
check('fixture 12', solve([{'version': (1, 0), 'yanked': False, 'pre': False, 'platform': 'any'}, {'version': (2, 0), 'yanked': False, 'pre': False, 'platform': 'linux'}, {'version': (3, 0), 'yanked': True, 'pre': False, 'platform': 'linux'}, {'version': (4, 0), 'yanked': False, 'pre': True, 'platform': 'linux'}, {'version': (5, 0), 'yanked': False, 'pre': False, 'platform': 'win'}], (6, 0), 'win'), None)
check('fixture 13', solve([{'version': (2, 0), 'yanked': False, 'pre': False, 'platform': 'any'}], (0, 0), 'linux'), (2, 0))
check('fixture 14', solve([{'version': (2, 0), 'yanked': False, 'pre': False, 'platform': 'any'}], (0, 0), 'win'), (2, 0))
check('fixture 15', solve([{'version': (2, 0), 'yanked': False, 'pre': False, 'platform': 'any'}], (2, 0), 'linux'), (2, 0))
check('fixture 16', solve([{'version': (2, 0), 'yanked': False, 'pre': False, 'platform': 'any'}], (2, 0), 'win'), (2, 0))
check('fixture 17', solve([{'version': (2, 0), 'yanked': False, 'pre': False, 'platform': 'any'}], (6, 0), 'linux'), None)
check('fixture 18', solve([{'version': (2, 0), 'yanked': False, 'pre': False, 'platform': 'any'}], (6, 0), 'win'), None)
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 | None | None | Passed |
| fixture 2 | None | None | Passed |
| fixture 3 | None | None | Passed |
| fixture 4 | None | None | Passed |
| fixture 5 | None | None | Passed |
| fixture 6 | None | None | Passed |
| fixture 7 | [3, 0] | [2, 0] | Failed |
| fixture 8 | None | [5, 0] | Failed |
| fixture 9 | [3, 0] | [2, 0] | Failed |
| fixture 10 | None | [5, 0] | Failed |
| fixture 11 | None | None | Passed |
| fixture 12 | None | None | Passed |
| fixture 13 | None | [2, 0] | Failed |
| fixture 14 | None | [2, 0] | Failed |
| fixture 15 | None | [2, 0] | Failed |
| fixture 16 | None | [2, 0] | Failed |
| fixture 17 | None | None | Passed |
| fixture 18 | None | None | Passed |
SHA-256 / 0b68092dc9e87c47ef58978cffd50f1e589d0684c3a5a98e4d72823c98634671
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(releases, minimum, platform):
items = [r for r in releases if not r['yanked']]
items = [r for r in items if not r['pre']]
items = [r for r in items if r['platform'] in [platform, 'any']]
items = [r for r in items if r['version'] >= minimum]
return max((r['version'] for r in items), default=None)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('fixture 1', solve([], (0, 0), 'linux'), None)
check('fixture 2', solve([], (0, 0), 'win'), None)
check('fixture 3', solve([], (2, 0), 'linux'), None)
check('fixture 4', solve([], (2, 0), 'win'), None)
check('fixture 5', solve([], (6, 0), 'linux'), None)
check('fixture 6', solve([], (6, 0), 'win'), None)
check('fixture 7', solve([{'version': (1, 0), 'yanked': False, 'pre': False, 'platform': 'any'}, {'version': (2, 0), 'yanked': False, 'pre': False, 'platform': 'linux'}, {'version': (3, 0), 'yanked': True, 'pre': False, 'platform': 'linux'}, {'version': (4, 0), 'yanked': False, 'pre': True, 'platform': 'linux'}, {'version': (5, 0), 'yanked': False, 'pre': False, 'platform': 'win'}], (0, 0), 'linux'), (2, 0))
check('fixture 8', solve([{'version': (1, 0), 'yanked': False, 'pre': False, 'platform': 'any'}, {'version': (2, 0), 'yanked': False, 'pre': False, 'platform': 'linux'}, {'version': (3, 0), 'yanked': True, 'pre': False, 'platform': 'linux'}, {'version': (4, 0), 'yanked': False, 'pre': True, 'platform': 'linux'}, {'version': (5, 0), 'yanked': False, 'pre': False, 'platform': 'win'}], (0, 0), 'win'), (5, 0))
check('fixture 9', solve([{'version': (1, 0), 'yanked': False, 'pre': False, 'platform': 'any'}, {'version': (2, 0), 'yanked': False, 'pre': False, 'platform': 'linux'}, {'version': (3, 0), 'yanked': True, 'pre': False, 'platform': 'linux'}, {'version': (4, 0), 'yanked': False, 'pre': True, 'platform': 'linux'}, {'version': (5, 0), 'yanked': False, 'pre': False, 'platform': 'win'}], (2, 0), 'linux'), (2, 0))
check('fixture 10', solve([{'version': (1, 0), 'yanked': False, 'pre': False, 'platform': 'any'}, {'version': (2, 0), 'yanked': False, 'pre': False, 'platform': 'linux'}, {'version': (3, 0), 'yanked': True, 'pre': False, 'platform': 'linux'}, {'version': (4, 0), 'yanked': False, 'pre': True, 'platform': 'linux'}, {'version': (5, 0), 'yanked': False, 'pre': False, 'platform': 'win'}], (2, 0), 'win'), (5, 0))
check('fixture 11', solve([{'version': (1, 0), 'yanked': False, 'pre': False, 'platform': 'any'}, {'version': (2, 0), 'yanked': False, 'pre': False, 'platform': 'linux'}, {'version': (3, 0), 'yanked': True, 'pre': False, 'platform': 'linux'}, {'version': (4, 0), 'yanked': False, 'pre': True, 'platform': 'linux'}, {'version': (5, 0), 'yanked': False, 'pre': False, 'platform': 'win'}], (6, 0), 'linux'), None)
check('fixture 12', solve([{'version': (1, 0), 'yanked': False, 'pre': False, 'platform': 'any'}, {'version': (2, 0), 'yanked': False, 'pre': False, 'platform': 'linux'}, {'version': (3, 0), 'yanked': True, 'pre': False, 'platform': 'linux'}, {'version': (4, 0), 'yanked': False, 'pre': True, 'platform': 'linux'}, {'version': (5, 0), 'yanked': False, 'pre': False, 'platform': 'win'}], (6, 0), 'win'), None)
check('fixture 13', solve([{'version': (2, 0), 'yanked': False, 'pre': False, 'platform': 'any'}], (0, 0), 'linux'), (2, 0))
check('fixture 14', solve([{'version': (2, 0), 'yanked': False, 'pre': False, 'platform': 'any'}], (0, 0), 'win'), (2, 0))
check('fixture 15', solve([{'version': (2, 0), 'yanked': False, 'pre': False, 'platform': 'any'}], (2, 0), 'linux'), (2, 0))
check('fixture 16', solve([{'version': (2, 0), 'yanked': False, 'pre': False, 'platform': 'any'}], (2, 0), 'win'), (2, 0))
check('fixture 17', solve([{'version': (2, 0), 'yanked': False, 'pre': False, 'platform': 'any'}], (6, 0), 'linux'), None)
check('fixture 18', solve([{'version': (2, 0), 'yanked': False, 'pre': False, 'platform': 'any'}], (6, 0), 'win'), None)
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 | None | None | Passed |
| fixture 2 | None | None | Passed |
| fixture 3 | None | None | Passed |
| fixture 4 | None | None | Passed |
| fixture 5 | None | None | Passed |
| fixture 6 | None | None | Passed |
| fixture 7 | [2, 0] | [2, 0] | Passed |
| fixture 8 | [5, 0] | [5, 0] | Passed |
| fixture 9 | [2, 0] | [2, 0] | Passed |
| fixture 10 | [5, 0] | [5, 0] | Passed |
| fixture 11 | None | None | Passed |
| fixture 12 | None | None | Passed |
| fixture 13 | [2, 0] | [2, 0] | Passed |
| fixture 14 | [2, 0] | [2, 0] | Passed |
| fixture 15 | [2, 0] | [2, 0] | Passed |
| fixture 16 | [2, 0] | [2, 0] | Passed |
| fixture 17 | None | None | Passed |
| fixture 18 | None | None | Passed |
SHA-256 / 93c29830a9c3346a4f312f5e883cc429f99e7b6bb1033ce0119b283a6b20da1e
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:29.083480+00:00.
Case digest / 2196db6729f7197688c0bd6d681edf37cb5ac9b5b503d27b93aa974bf27a3bfb