FAILURE MAP
← Case archive

FA-10041 / Packaging / Open access

Editable installation mapping: Conflicting editable modules silently override · case 01

Conflicting editable modules silently override.

Verified by executionVariant 1 · 7 checks per implementationDownload source bundle ↓JSON ↗

ROOT CAUSE

The implementation substitutes False for module in result and result[module] != directory, so conflicting editable modules silently override.

VERIFIED REPAIR

Reject different directories for the same module while allowing identical repeats.

Unsuccessful approach: The attempted repair substitutes module in result. Fixture 6 still yields 'conflict' instead of [('a', 'src/a')].

Case contract

Resolve declared modules to their source directories, reject missing sources, reject duplicate module names pointing elsewhere, exclude disabled declarations, and keep module names sorted. Identical repeats are allowed.

Why this case matters

An offline model of editable installation mapping, 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(declarations, available):
    result = {}
    for module, directory, enabled in declarations:
        if not enabled: continue
        if directory not in available: return 'missing-source'
        if False: return 'conflict'
        result[module] = directory
    return sorted(result.items())
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', 'src/a', True)], ['src/a']), [('a', 'src/a')])
check('fixture 3', solve([('a', 'src/a', False)], []), [])
check('fixture 4', solve([('a', 'src/a', True)], []), 'missing-source')
check('fixture 5', solve([('a', 'src/a', True), ('a', 'lib/a', True)], ['src/a', 'lib/a']), 'conflict')
check('fixture 6', solve([('a', 'src/a', True), ('a', 'src/a', True)], ['src/a']), [('a', 'src/a')])
check('fixture 7', solve([('z', 'src/z', True), ('a', 'src/a', True)], ['src/a', 'src/z']), [('a', 'src/a'), ('z', 'src/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 fixtureActualExpectedOutcome
fixture 1[][]Passed
fixture 2[['a', 'src/a']][['a', 'src/a']]Passed
fixture 3[][]Passed
fixture 4missing-sourcemissing-sourcePassed
fixture 5[['a', 'lib/a']]conflictFailed
fixture 6[['a', 'src/a']][['a', 'src/a']]Passed
fixture 7[['a', 'src/a'], ['z', 'src/z']][['a', 'src/a'], ['z', 'src/z']]Passed

SHA-256 / 0494b9499274782f688b27ca418c23eb1b52d650db77bf23d6bf4455d2690571

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(declarations, available):
    result = {}
    for module, directory, enabled in declarations:
        if not enabled: continue
        if directory not in available: return 'missing-source'
        if module in result: return 'conflict'
        result[module] = directory
    return sorted(result.items())
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', 'src/a', True)], ['src/a']), [('a', 'src/a')])
check('fixture 3', solve([('a', 'src/a', False)], []), [])
check('fixture 4', solve([('a', 'src/a', True)], []), 'missing-source')
check('fixture 5', solve([('a', 'src/a', True), ('a', 'lib/a', True)], ['src/a', 'lib/a']), 'conflict')
check('fixture 6', solve([('a', 'src/a', True), ('a', 'src/a', True)], ['src/a']), [('a', 'src/a')])
check('fixture 7', solve([('z', 'src/z', True), ('a', 'src/a', True)], ['src/a', 'src/z']), [('a', 'src/a'), ('z', 'src/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 fixtureActualExpectedOutcome
fixture 1[][]Passed
fixture 2[['a', 'src/a']][['a', 'src/a']]Passed
fixture 3[][]Passed
fixture 4missing-sourcemissing-sourcePassed
fixture 5conflictconflictPassed
fixture 6conflict[['a', 'src/a']]Failed
fixture 7[['a', 'src/a'], ['z', 'src/z']][['a', 'src/a'], ['z', 'src/z']]Passed

SHA-256 / 4ee3078c74ee7b692ad25b648b50524dbfbe2234f9c424703d157c6db4606240

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(declarations, available):
    result = {}
    for module, directory, enabled in declarations:
        if not enabled: continue
        if directory not in available: return 'missing-source'
        if module in result and result[module] != directory: return 'conflict'
        result[module] = directory
    return sorted(result.items())
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', 'src/a', True)], ['src/a']), [('a', 'src/a')])
check('fixture 3', solve([('a', 'src/a', False)], []), [])
check('fixture 4', solve([('a', 'src/a', True)], []), 'missing-source')
check('fixture 5', solve([('a', 'src/a', True), ('a', 'lib/a', True)], ['src/a', 'lib/a']), 'conflict')
check('fixture 6', solve([('a', 'src/a', True), ('a', 'src/a', True)], ['src/a']), [('a', 'src/a')])
check('fixture 7', solve([('z', 'src/z', True), ('a', 'src/a', True)], ['src/a', 'src/z']), [('a', 'src/a'), ('z', 'src/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 fixtureActualExpectedOutcome
fixture 1[][]Passed
fixture 2[['a', 'src/a']][['a', 'src/a']]Passed
fixture 3[][]Passed
fixture 4missing-sourcemissing-sourcePassed
fixture 5conflictconflictPassed
fixture 6[['a', 'src/a']][['a', 'src/a']]Passed
fixture 7[['a', 'src/a'], ['z', 'src/z']][['a', 'src/a'], ['z', 'src/z']]Passed

SHA-256 / 55a2bd8e53b742cf8ec0aa1912ceda9be623f41c54473bced84ba9d67c9b5326

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:35.382887+00:00.

Case digest / ad6184c55a77ef74c71c3c5b580bfac7a6dd8a9fbd96b89c494b14985c7f7d59