FA-9386 / Dependency resolution / Open access
Dependency group activation: Inactive optional groups are installed · case 01
Inactive optional groups are installed.
ROOT CAUSE
The implementation substitutes False for group != 'runtime' and group not in enabled, so inactive optional groups are installed.
VERIFIED REPAIR
Skip optional groups that were not enabled.
Unsuccessful approach: The attempted repair substitutes group == 'runtime' and group not in enabled. Fixture 2 still yields [] instead of ['a'].
Case contract
Return sorted unique dependency names from runtime and explicitly enabled optional groups. Exclude inactive markers and disabled entries; a dependency appearing in multiple groups is emitted once.
Why this case matters
An offline model of dependency group activation, 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(rows, enabled):
selected = []
for name, group, marker, disabled in rows:
if False: continue
if not marker: continue
if disabled: continue
selected.append(name)
return sorted(set(selected))
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('fixture 1', solve([], []), [])
check('fixture 2', solve([('a', 'runtime', True, False)], []), ['a'])
check('fixture 3', solve([('a', 'dev', True, False)], []), [])
check('fixture 4', solve([('a', 'dev', True, False)], ['dev']), ['a'])
check('fixture 5', solve([('a', 'runtime', False, False)], []), [])
check('fixture 6', solve([('a', 'runtime', True, True)], []), [])
check('fixture 7', solve([('z', 'runtime', True, False), ('a', 'dev', True, False), ('z', 'dev', True, False)], ['dev']), ['a', 'z'])
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 | [] | [] | Passed |
| fixture 2 | ['a'] | ['a'] | Passed |
| fixture 3 | ['a'] | [] | Failed |
| fixture 4 | ['a'] | ['a'] | Passed |
| fixture 5 | [] | [] | Passed |
| fixture 6 | [] | [] | Passed |
| fixture 7 | ['a', 'z'] | ['a', 'z'] | Passed |
SHA-256 / d7f6d40e578f72006598afa6bb04e9d29626a211807960e26f9cbea946487f2e
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(rows, enabled):
selected = []
for name, group, marker, disabled in rows:
if group == 'runtime' and group not in enabled: continue
if not marker: continue
if disabled: continue
selected.append(name)
return sorted(set(selected))
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('fixture 1', solve([], []), [])
check('fixture 2', solve([('a', 'runtime', True, False)], []), ['a'])
check('fixture 3', solve([('a', 'dev', True, False)], []), [])
check('fixture 4', solve([('a', 'dev', True, False)], ['dev']), ['a'])
check('fixture 5', solve([('a', 'runtime', False, False)], []), [])
check('fixture 6', solve([('a', 'runtime', True, True)], []), [])
check('fixture 7', solve([('z', 'runtime', True, False), ('a', 'dev', True, False), ('z', 'dev', True, False)], ['dev']), ['a', 'z'])
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 | [] | [] | Passed |
| fixture 2 | [] | ['a'] | Failed |
| fixture 3 | ['a'] | [] | Failed |
| fixture 4 | ['a'] | ['a'] | Passed |
| fixture 5 | [] | [] | Passed |
| fixture 6 | [] | [] | Passed |
| fixture 7 | ['a', 'z'] | ['a', 'z'] | Passed |
SHA-256 / 486082347336175c61379dbb0fba561dba55a87d59ea3a272d75e9a131d1729e
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(rows, enabled):
selected = []
for name, group, marker, disabled in rows:
if group != 'runtime' and group not in enabled: continue
if not marker: continue
if disabled: continue
selected.append(name)
return sorted(set(selected))
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('fixture 1', solve([], []), [])
check('fixture 2', solve([('a', 'runtime', True, False)], []), ['a'])
check('fixture 3', solve([('a', 'dev', True, False)], []), [])
check('fixture 4', solve([('a', 'dev', True, False)], ['dev']), ['a'])
check('fixture 5', solve([('a', 'runtime', False, False)], []), [])
check('fixture 6', solve([('a', 'runtime', True, True)], []), [])
check('fixture 7', solve([('z', 'runtime', True, False), ('a', 'dev', True, False), ('z', 'dev', True, False)], ['dev']), ['a', 'z'])
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 | [] | [] | Passed |
| fixture 2 | ['a'] | ['a'] | Passed |
| fixture 3 | [] | [] | Passed |
| fixture 4 | ['a'] | ['a'] | Passed |
| fixture 5 | [] | [] | Passed |
| fixture 6 | [] | [] | Passed |
| fixture 7 | ['a', 'z'] | ['a', 'z'] | Passed |
SHA-256 / 1d8ef41da514736c11f17d6de7c87614627de2794085db73fb84824afa7040f1
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.581011+00:00.
Case digest / 02f81532ddcd9a97d084282e52b8a6d5b135f444ed97600103e1a905d37097e7