FAILURE MAP
← Case archive

FA-9081 / Build systems / Open access

Incremental rebuild decision: Missing outputs are accepted as cached · case 01

Missing outputs are accepted as cached.

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

ROOT CAUSE

The implementation substitutes False for not state['exists'], so missing outputs are accepted as cached.

THE FAILURE

The implementation substitutes False for not state['exists'], so missing outputs are accepted as cached.

Unsuccessful approach: The attempted repair substitutes state['exists']. Fixture 1 still yields False instead of True.

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 (False 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 fixtureActualExpectedOutcome
fixture 1FalseTrueFailed
fixture 2TrueTruePassed
fixture 3TrueTruePassed
fixture 4TrueTruePassed
fixture 5TrueTruePassed
fixture 6TrueTruePassed
fixture 7TrueTruePassed
fixture 8TrueTruePassed
fixture 9TrueTruePassed
fixture 10TrueTruePassed
fixture 11TrueTruePassed
fixture 12TrueTruePassed
fixture 13TrueTruePassed
fixture 14TrueTruePassed
fixture 15TrueTruePassed
fixture 16TrueTruePassed
fixture 17FalseFalsePassed
fixture 18TrueTruePassed
fixture 19TrueTruePassed
fixture 20TrueTruePassed
fixture 21TrueTruePassed
fixture 22TrueTruePassed
fixture 23TrueTruePassed
fixture 24TrueTruePassed
fixture 25TrueTruePassed
fixture 26TrueTruePassed
fixture 27TrueTruePassed
fixture 28TrueTruePassed
fixture 29TrueTruePassed
fixture 30TrueTruePassed
fixture 31TrueTruePassed
fixture 32TrueTruePassed

SHA-256 / 89bb563dcd842d4f14967fff789e12302978245bf0381e7345acc587d9dd2479

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(state):
    return (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 fixtureActualExpectedOutcome
fixture 1FalseTrueFailed
fixture 2TrueTruePassed
fixture 3TrueTruePassed
fixture 4TrueTruePassed
fixture 5TrueTruePassed
fixture 6TrueTruePassed
fixture 7TrueTruePassed
fixture 8TrueTruePassed
fixture 9TrueTruePassed
fixture 10TrueTruePassed
fixture 11TrueTruePassed
fixture 12TrueTruePassed
fixture 13TrueTruePassed
fixture 14TrueTruePassed
fixture 15TrueTruePassed
fixture 16TrueTruePassed
fixture 17TrueFalseFailed
fixture 18TrueTruePassed
fixture 19TrueTruePassed
fixture 20TrueTruePassed
fixture 21TrueTruePassed
fixture 22TrueTruePassed
fixture 23TrueTruePassed
fixture 24TrueTruePassed
fixture 25TrueTruePassed
fixture 26TrueTruePassed
fixture 27TrueTruePassed
fixture 28TrueTruePassed
fixture 29TrueTruePassed
fixture 30TrueTruePassed
fixture 31TrueTruePassed
fixture 32TrueTruePassed

SHA-256 / 92c273c5304fa8067bb7881be9d5d719f5dd2c51c34191c77508704e7561c6a0

HELD IN THE MEMBER ARCHIVE

The verified repair and its recorded checks are member-only.

This mechanism has 32 recorded checks per implementation. The open-access tier publishes the failure and the unsuccessful fix; the repaired source that passes every check, and the observations that prove it, are available to members.

Every case sharing this mechanism uses the same contract and the same repair, so this one record is held back for all of them.

Member access is invitation-based. Sign in with your invited account to inspect the repair.

Sign in to the archive ↗

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

Case digest / 584ffa1c82f9ab780c186bd404e31062c06390e6ebbc3580b9b4dd98b68610c2