FA-9701 / Configuration / Open access
Configuration change plan: Changed keys appear in the unchanged report · case 01
Changed keys appear in the unchanged report.
ROOT CAUSE
The implementation substitutes sorted(common) for sorted(common - changed), so changed keys appear in the unchanged report.
VERIFIED REPAIR
Subtract changed keys from common keys.
Unsuccessful approach: The attempted repair substitutes sorted(changed). Fixture 4 still yields {'added': [], 'removed': [], 'changed': ['a'], 'restart': ['a'], 'unchanged': ['a']} instead of {'added': [], 'removed': [], 'changed': ['a'], 'restart': ['a'], 'unchanged': []}.
Case contract
Produce sorted added, removed, changed, restart-required, and unchanged key lists. Restart applies only to added/removed/changed keys in the restart set.
Why this case matters
An offline model of configuration change plan, 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(before, after, restart):
added = set(after) - set(before)
removed = set(before) - set(after)
common = set(before) & set(after)
changed = {k for k in common if before[k] != after[k]}
return {'added': sorted(added), 'removed': sorted(removed), 'changed': sorted(changed), 'restart': sorted((added | removed | changed) & set(restart)), 'unchanged': sorted(common)}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('fixture 1', solve({}, {}, []), {'added': [], 'removed': [], 'changed': [], 'restart': [], 'unchanged': []})
check('fixture 2', solve({}, {'a': 1}, ['a']), {'added': ['a'], 'removed': [], 'changed': [], 'restart': ['a'], 'unchanged': []})
check('fixture 3', solve({'a': 1}, {}, ['a']), {'added': [], 'removed': ['a'], 'changed': [], 'restart': ['a'], 'unchanged': []})
check('fixture 4', solve({'a': 1}, {'a': 2}, ['a']), {'added': [], 'removed': [], 'changed': ['a'], 'restart': ['a'], 'unchanged': []})
check('fixture 5', solve({'a': 1}, {'a': 1}, ['a']), {'added': [], 'removed': [], 'changed': [], 'restart': [], 'unchanged': ['a']})
check('fixture 6', solve({'a': 1}, {'a': 2}, []), {'added': [], 'removed': [], 'changed': ['a'], 'restart': [], 'unchanged': []})
check('fixture 7', solve({'a': 1, 'b': 2}, {'a': 1, 'c': 3}, ['b', 'c']), {'added': ['c'], 'removed': ['b'], 'changed': [], 'restart': ['b', 'c'], 'unchanged': ['a']})
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 | {'added': [], 'changed': [], 'removed': [], 'restart': [], 'unchanged': []} | {'added': [], 'changed': [], 'removed': [], 'restart': [], 'unchanged': []} | Passed |
| fixture 2 | {'added': ['a'], 'changed': [], 'removed': [], 'restart': ['a'], 'unchanged': []} | {'added': ['a'], 'changed': [], 'removed': [], 'restart': ['a'], 'unchanged': []} | Passed |
| fixture 3 | {'added': [], 'changed': [], 'removed': ['a'], 'restart': ['a'], 'unchanged': []} | {'added': [], 'changed': [], 'removed': ['a'], 'restart': ['a'], 'unchanged': []} | Passed |
| fixture 4 | {'added': [], 'changed': ['a'], 'removed': [], 'restart': ['a'], 'unchanged': ['a']} | {'added': [], 'changed': ['a'], 'removed': [], 'restart': ['a'], 'unchanged': []} | Failed |
| fixture 5 | {'added': [], 'changed': [], 'removed': [], 'restart': [], 'unchanged': ['a']} | {'added': [], 'changed': [], 'removed': [], 'restart': [], 'unchanged': ['a']} | Passed |
| fixture 6 | {'added': [], 'changed': ['a'], 'removed': [], 'restart': [], 'unchanged': ['a']} | {'added': [], 'changed': ['a'], 'removed': [], 'restart': [], 'unchanged': []} | Failed |
| fixture 7 | {'added': ['c'], 'changed': [], 'removed': ['b'], 'restart': ['b', 'c'], 'unchanged': ['a']} | {'added': ['c'], 'changed': [], 'removed': ['b'], 'restart': ['b', 'c'], 'unchanged': ['a']} | Passed |
SHA-256 / e93487fe866a66a6c8f7116973a337f672431d7911b611354a85f27566037bb4
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(before, after, restart):
added = set(after) - set(before)
removed = set(before) - set(after)
common = set(before) & set(after)
changed = {k for k in common if before[k] != after[k]}
return {'added': sorted(added), 'removed': sorted(removed), 'changed': sorted(changed), 'restart': sorted((added | removed | changed) & set(restart)), 'unchanged': sorted(changed)}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('fixture 1', solve({}, {}, []), {'added': [], 'removed': [], 'changed': [], 'restart': [], 'unchanged': []})
check('fixture 2', solve({}, {'a': 1}, ['a']), {'added': ['a'], 'removed': [], 'changed': [], 'restart': ['a'], 'unchanged': []})
check('fixture 3', solve({'a': 1}, {}, ['a']), {'added': [], 'removed': ['a'], 'changed': [], 'restart': ['a'], 'unchanged': []})
check('fixture 4', solve({'a': 1}, {'a': 2}, ['a']), {'added': [], 'removed': [], 'changed': ['a'], 'restart': ['a'], 'unchanged': []})
check('fixture 5', solve({'a': 1}, {'a': 1}, ['a']), {'added': [], 'removed': [], 'changed': [], 'restart': [], 'unchanged': ['a']})
check('fixture 6', solve({'a': 1}, {'a': 2}, []), {'added': [], 'removed': [], 'changed': ['a'], 'restart': [], 'unchanged': []})
check('fixture 7', solve({'a': 1, 'b': 2}, {'a': 1, 'c': 3}, ['b', 'c']), {'added': ['c'], 'removed': ['b'], 'changed': [], 'restart': ['b', 'c'], 'unchanged': ['a']})
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 | {'added': [], 'changed': [], 'removed': [], 'restart': [], 'unchanged': []} | {'added': [], 'changed': [], 'removed': [], 'restart': [], 'unchanged': []} | Passed |
| fixture 2 | {'added': ['a'], 'changed': [], 'removed': [], 'restart': ['a'], 'unchanged': []} | {'added': ['a'], 'changed': [], 'removed': [], 'restart': ['a'], 'unchanged': []} | Passed |
| fixture 3 | {'added': [], 'changed': [], 'removed': ['a'], 'restart': ['a'], 'unchanged': []} | {'added': [], 'changed': [], 'removed': ['a'], 'restart': ['a'], 'unchanged': []} | Passed |
| fixture 4 | {'added': [], 'changed': ['a'], 'removed': [], 'restart': ['a'], 'unchanged': ['a']} | {'added': [], 'changed': ['a'], 'removed': [], 'restart': ['a'], 'unchanged': []} | Failed |
| fixture 5 | {'added': [], 'changed': [], 'removed': [], 'restart': [], 'unchanged': []} | {'added': [], 'changed': [], 'removed': [], 'restart': [], 'unchanged': ['a']} | Failed |
| fixture 6 | {'added': [], 'changed': ['a'], 'removed': [], 'restart': [], 'unchanged': ['a']} | {'added': [], 'changed': ['a'], 'removed': [], 'restart': [], 'unchanged': []} | Failed |
| fixture 7 | {'added': ['c'], 'changed': [], 'removed': ['b'], 'restart': ['b', 'c'], 'unchanged': []} | {'added': ['c'], 'changed': [], 'removed': ['b'], 'restart': ['b', 'c'], 'unchanged': ['a']} | Failed |
SHA-256 / 43839685026b36a50a13c5a2f984da0bd45deeaa89e1e1016e2526b3bcb35386
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(before, after, restart):
added = set(after) - set(before)
removed = set(before) - set(after)
common = set(before) & set(after)
changed = {k for k in common if before[k] != after[k]}
return {'added': sorted(added), 'removed': sorted(removed), 'changed': sorted(changed), 'restart': sorted((added | removed | changed) & set(restart)), 'unchanged': sorted(common - changed)}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('fixture 1', solve({}, {}, []), {'added': [], 'removed': [], 'changed': [], 'restart': [], 'unchanged': []})
check('fixture 2', solve({}, {'a': 1}, ['a']), {'added': ['a'], 'removed': [], 'changed': [], 'restart': ['a'], 'unchanged': []})
check('fixture 3', solve({'a': 1}, {}, ['a']), {'added': [], 'removed': ['a'], 'changed': [], 'restart': ['a'], 'unchanged': []})
check('fixture 4', solve({'a': 1}, {'a': 2}, ['a']), {'added': [], 'removed': [], 'changed': ['a'], 'restart': ['a'], 'unchanged': []})
check('fixture 5', solve({'a': 1}, {'a': 1}, ['a']), {'added': [], 'removed': [], 'changed': [], 'restart': [], 'unchanged': ['a']})
check('fixture 6', solve({'a': 1}, {'a': 2}, []), {'added': [], 'removed': [], 'changed': ['a'], 'restart': [], 'unchanged': []})
check('fixture 7', solve({'a': 1, 'b': 2}, {'a': 1, 'c': 3}, ['b', 'c']), {'added': ['c'], 'removed': ['b'], 'changed': [], 'restart': ['b', 'c'], 'unchanged': ['a']})
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 | {'added': [], 'changed': [], 'removed': [], 'restart': [], 'unchanged': []} | {'added': [], 'changed': [], 'removed': [], 'restart': [], 'unchanged': []} | Passed |
| fixture 2 | {'added': ['a'], 'changed': [], 'removed': [], 'restart': ['a'], 'unchanged': []} | {'added': ['a'], 'changed': [], 'removed': [], 'restart': ['a'], 'unchanged': []} | Passed |
| fixture 3 | {'added': [], 'changed': [], 'removed': ['a'], 'restart': ['a'], 'unchanged': []} | {'added': [], 'changed': [], 'removed': ['a'], 'restart': ['a'], 'unchanged': []} | Passed |
| fixture 4 | {'added': [], 'changed': ['a'], 'removed': [], 'restart': ['a'], 'unchanged': []} | {'added': [], 'changed': ['a'], 'removed': [], 'restart': ['a'], 'unchanged': []} | Passed |
| fixture 5 | {'added': [], 'changed': [], 'removed': [], 'restart': [], 'unchanged': ['a']} | {'added': [], 'changed': [], 'removed': [], 'restart': [], 'unchanged': ['a']} | Passed |
| fixture 6 | {'added': [], 'changed': ['a'], 'removed': [], 'restart': [], 'unchanged': []} | {'added': [], 'changed': ['a'], 'removed': [], 'restart': [], 'unchanged': []} | Passed |
| fixture 7 | {'added': ['c'], 'changed': [], 'removed': ['b'], 'restart': ['b', 'c'], 'unchanged': ['a']} | {'added': ['c'], 'changed': [], 'removed': ['b'], 'restart': ['b', 'c'], 'unchanged': ['a']} | Passed |
SHA-256 / df295066bb3e7a8dc9d53e18bcb2192cd2ecdfd9ed537f332fa104397a20b3dd
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:32.260579+00:00.
Case digest / 67970ddcce51a29e1ca4384b995cfa95bbd3f96d4afe8b0ca06dcf03f1f29781