FAILURE MAP
← Case archive

FA-23716 / Client state / Open access

Unsaved navigation confirmation: Prompt visibility · case 01

Prompt visibility.

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

ROOT CAUSE

The prompt-visibility client decision evaluates `dirty and decision!='confirm'` instead of `decision=='ask' and dirty and not bypass and target!=current`.

VERIFIED REPAIR

Apply the modeled prompt-visibility rule: `decision=='ask' and dirty and not bypass and target!=current`.

Unsuccessful approach: The partial repair `decision=='ask' and dirty` still violates the explicit fixture contract.

Case contract

The blocker asks only for dirty cross-location transitions without a one-shot bypass. Confirmation follows the captured pending destination, cancellation keeps current location and edits, and push versus replace is independent. Operation prompt-visibility has the six explicit input/output oracles below.

Why this case matters

An offline client lifecycle model that isolates a state-management defect without DOM rendering or network services.

1 / The failure

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

N = 1
observations = []
def solve(operation, s):
    dirty, target, current, pending, decision, bypass, replace = s
    if operation == 'dirty-transition-gate':
        return dirty and target!=current and not bypass
    if operation == 'cancel-retains-location':
        return current if decision=='cancel' else target
    if operation == 'confirm-original-destination':
        return pending if decision=='confirm' and pending is not None else current
    if operation == 'pending-request-replacement':
        return target if decision=='ask' and dirty and not bypass else None
    if operation == 'clear-on-cancel':
        return None if decision=='cancel' else pending
    if operation == 'replace-navigation-mode':
        return 'replace' if replace else 'push'
    if operation == 'same-location-noop':
        return target==current
    if operation == 'one-shot-bypass-consumption':
        return False if bypass and target!=current else bypass
    if operation == 'prompt-visibility':
        return dirty and decision!='confirm'
    if operation == 'discard-only-after-confirm':
        return dirty and decision!='confirm'
    raise ValueError('unknown modeled operation')
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('dirty-transition-gate scenario 1', solve('dirty-transition-gate', (True,'/b'+str(N),'/a',None,'ask',False,False)), True)
check('dirty-transition-gate scenario 2', solve('dirty-transition-gate', (False,'/a','/a','/old','ask',False,True)), False)
check('dirty-transition-gate scenario 3', solve('dirty-transition-gate', (True,'/b','/a','/b','cancel',False,False)), True)
check('dirty-transition-gate scenario 4', solve('dirty-transition-gate', (True,'/c','/a','/b','confirm',False,True)), True)
check('dirty-transition-gate scenario 5', solve('dirty-transition-gate', (True,'/b','/a',None,'ask',True,False)), False)
check('dirty-transition-gate scenario 6', solve('dirty-transition-gate', (False,'/b','/a',None,'ask',False,False)), False)
check('cancel-retains-location scenario 1', solve('cancel-retains-location', (True,'/b'+str(N),'/a',None,'ask',False,False)), '/b'+str(N))
check('cancel-retains-location scenario 2', solve('cancel-retains-location', (False,'/a','/a','/old','ask',False,True)), '/a')
check('cancel-retains-location scenario 3', solve('cancel-retains-location', (True,'/b','/a','/b','cancel',False,False)), '/a')
check('cancel-retains-location scenario 4', solve('cancel-retains-location', (True,'/c','/a','/b','confirm',False,True)), '/c')
check('cancel-retains-location scenario 5', solve('cancel-retains-location', (True,'/b','/a',None,'ask',True,False)), '/b')
check('cancel-retains-location scenario 6', solve('cancel-retains-location', (False,'/b','/a',None,'ask',False,False)), '/b')
check('confirm-original-destination scenario 1', solve('confirm-original-destination', (True,'/b'+str(N),'/a',None,'ask',False,False)), '/a')
check('confirm-original-destination scenario 2', solve('confirm-original-destination', (False,'/a','/a','/old','ask',False,True)), '/a')
check('confirm-original-destination scenario 3', solve('confirm-original-destination', (True,'/b','/a','/b','cancel',False,False)), '/a')
check('confirm-original-destination scenario 4', solve('confirm-original-destination', (True,'/c','/a','/b','confirm',False,True)), '/b')
check('confirm-original-destination scenario 5', solve('confirm-original-destination', (True,'/b','/a',None,'ask',True,False)), '/a')
check('confirm-original-destination scenario 6', solve('confirm-original-destination', (False,'/b','/a',None,'ask',False,False)), '/a')
check('pending-request-replacement scenario 1', solve('pending-request-replacement', (True,'/b'+str(N),'/a',None,'ask',False,False)), '/b'+str(N))
check('pending-request-replacement scenario 2', solve('pending-request-replacement', (False,'/a','/a','/old','ask',False,True)), None)
check('pending-request-replacement scenario 3', solve('pending-request-replacement', (True,'/b','/a','/b','cancel',False,False)), None)
check('pending-request-replacement scenario 4', solve('pending-request-replacement', (True,'/c','/a','/b','confirm',False,True)), None)
check('pending-request-replacement scenario 5', solve('pending-request-replacement', (True,'/b','/a',None,'ask',True,False)), None)
check('pending-request-replacement scenario 6', solve('pending-request-replacement', (False,'/b','/a',None,'ask',False,False)), None)
check('clear-on-cancel scenario 1', solve('clear-on-cancel', (True,'/b'+str(N),'/a',None,'ask',False,False)), None)
check('clear-on-cancel scenario 2', solve('clear-on-cancel', (False,'/a','/a','/old','ask',False,True)), '/old')
check('clear-on-cancel scenario 3', solve('clear-on-cancel', (True,'/b','/a','/b','cancel',False,False)), None)
check('clear-on-cancel scenario 4', solve('clear-on-cancel', (True,'/c','/a','/b','confirm',False,True)), '/b')
check('clear-on-cancel scenario 5', solve('clear-on-cancel', (True,'/b','/a',None,'ask',True,False)), None)
check('clear-on-cancel scenario 6', solve('clear-on-cancel', (False,'/b','/a',None,'ask',False,False)), None)
check('replace-navigation-mode scenario 1', solve('replace-navigation-mode', (True,'/b'+str(N),'/a',None,'ask',False,False)), 'push')
check('replace-navigation-mode scenario 2', solve('replace-navigation-mode', (False,'/a','/a','/old','ask',False,True)), 'replace')
check('replace-navigation-mode scenario 3', solve('replace-navigation-mode', (True,'/b','/a','/b','cancel',False,False)), 'push')
check('replace-navigation-mode scenario 4', solve('replace-navigation-mode', (True,'/c','/a','/b','confirm',False,True)), 'replace')
check('replace-navigation-mode scenario 5', solve('replace-navigation-mode', (True,'/b','/a',None,'ask',True,False)), 'push')
check('replace-navigation-mode scenario 6', solve('replace-navigation-mode', (False,'/b','/a',None,'ask',False,False)), 'push')
check('same-location-noop scenario 1', solve('same-location-noop', (True,'/b'+str(N),'/a',None,'ask',False,False)), False)
check('same-location-noop scenario 2', solve('same-location-noop', (False,'/a','/a','/old','ask',False,True)), True)
check('same-location-noop scenario 3', solve('same-location-noop', (True,'/b','/a','/b','cancel',False,False)), False)
check('same-location-noop scenario 4', solve('same-location-noop', (True,'/c','/a','/b','confirm',False,True)), False)
check('same-location-noop scenario 5', solve('same-location-noop', (True,'/b','/a',None,'ask',True,False)), False)
check('same-location-noop scenario 6', solve('same-location-noop', (False,'/b','/a',None,'ask',False,False)), False)
check('one-shot-bypass-consumption scenario 1', solve('one-shot-bypass-consumption', (True,'/b'+str(N),'/a',None,'ask',False,False)), False)
check('one-shot-bypass-consumption scenario 2', solve('one-shot-bypass-consumption', (False,'/a','/a','/old','ask',False,True)), False)
check('one-shot-bypass-consumption scenario 3', solve('one-shot-bypass-consumption', (True,'/b','/a','/b','cancel',False,False)), False)
check('one-shot-bypass-consumption scenario 4', solve('one-shot-bypass-consumption', (True,'/c','/a','/b','confirm',False,True)), False)
check('one-shot-bypass-consumption scenario 5', solve('one-shot-bypass-consumption', (True,'/b','/a',None,'ask',True,False)), False)
check('one-shot-bypass-consumption scenario 6', solve('one-shot-bypass-consumption', (False,'/b','/a',None,'ask',False,False)), False)
check('prompt-visibility scenario 1', solve('prompt-visibility', (True,'/b'+str(N),'/a',None,'ask',False,False)), True)
check('prompt-visibility scenario 2', solve('prompt-visibility', (False,'/a','/a','/old','ask',False,True)), False)
check('prompt-visibility scenario 3', solve('prompt-visibility', (True,'/b','/a','/b','cancel',False,False)), False)
check('prompt-visibility scenario 4', solve('prompt-visibility', (True,'/c','/a','/b','confirm',False,True)), False)
check('prompt-visibility scenario 5', solve('prompt-visibility', (True,'/b','/a',None,'ask',True,False)), False)
check('prompt-visibility scenario 6', solve('prompt-visibility', (False,'/b','/a',None,'ask',False,False)), False)
check('discard-only-after-confirm scenario 1', solve('discard-only-after-confirm', (True,'/b'+str(N),'/a',None,'ask',False,False)), True)
check('discard-only-after-confirm scenario 2', solve('discard-only-after-confirm', (False,'/a','/a','/old','ask',False,True)), False)
check('discard-only-after-confirm scenario 3', solve('discard-only-after-confirm', (True,'/b','/a','/b','cancel',False,False)), True)
check('discard-only-after-confirm scenario 4', solve('discard-only-after-confirm', (True,'/c','/a','/b','confirm',False,True)), False)
check('discard-only-after-confirm scenario 5', solve('discard-only-after-confirm', (True,'/b','/a',None,'ask',True,False)), True)
check('discard-only-after-confirm scenario 6', solve('discard-only-after-confirm', (False,'/b','/a',None,'ask',False,False)), False)
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
dirty-transition-gate scenario 1TrueTruePassed
dirty-transition-gate scenario 2FalseFalsePassed
dirty-transition-gate scenario 3TrueTruePassed
dirty-transition-gate scenario 4TrueTruePassed
dirty-transition-gate scenario 5FalseFalsePassed
dirty-transition-gate scenario 6FalseFalsePassed
cancel-retains-location scenario 1/b1/b1Passed
cancel-retains-location scenario 2/a/aPassed
cancel-retains-location scenario 3/a/aPassed
cancel-retains-location scenario 4/c/cPassed
cancel-retains-location scenario 5/b/bPassed
cancel-retains-location scenario 6/b/bPassed
confirm-original-destination scenario 1/a/aPassed
confirm-original-destination scenario 2/a/aPassed
confirm-original-destination scenario 3/a/aPassed
confirm-original-destination scenario 4/b/bPassed
confirm-original-destination scenario 5/a/aPassed
confirm-original-destination scenario 6/a/aPassed
pending-request-replacement scenario 1/b1/b1Passed
pending-request-replacement scenario 2NoneNonePassed
pending-request-replacement scenario 3NoneNonePassed
pending-request-replacement scenario 4NoneNonePassed
pending-request-replacement scenario 5NoneNonePassed
pending-request-replacement scenario 6NoneNonePassed
clear-on-cancel scenario 1NoneNonePassed
clear-on-cancel scenario 2/old/oldPassed
clear-on-cancel scenario 3NoneNonePassed
clear-on-cancel scenario 4/b/bPassed
clear-on-cancel scenario 5NoneNonePassed
clear-on-cancel scenario 6NoneNonePassed
replace-navigation-mode scenario 1pushpushPassed
replace-navigation-mode scenario 2replacereplacePassed
replace-navigation-mode scenario 3pushpushPassed
replace-navigation-mode scenario 4replacereplacePassed
replace-navigation-mode scenario 5pushpushPassed
replace-navigation-mode scenario 6pushpushPassed
same-location-noop scenario 1FalseFalsePassed
same-location-noop scenario 2TrueTruePassed
same-location-noop scenario 3FalseFalsePassed
same-location-noop scenario 4FalseFalsePassed
same-location-noop scenario 5FalseFalsePassed
same-location-noop scenario 6FalseFalsePassed
one-shot-bypass-consumption scenario 1FalseFalsePassed
one-shot-bypass-consumption scenario 2FalseFalsePassed
one-shot-bypass-consumption scenario 3FalseFalsePassed
one-shot-bypass-consumption scenario 4FalseFalsePassed
one-shot-bypass-consumption scenario 5FalseFalsePassed
one-shot-bypass-consumption scenario 6FalseFalsePassed
prompt-visibility scenario 1TrueTruePassed
prompt-visibility scenario 2FalseFalsePassed
prompt-visibility scenario 3TrueFalseFailed
prompt-visibility scenario 4FalseFalsePassed
prompt-visibility scenario 5TrueFalseFailed
prompt-visibility scenario 6FalseFalsePassed
discard-only-after-confirm scenario 1TrueTruePassed
discard-only-after-confirm scenario 2FalseFalsePassed
discard-only-after-confirm scenario 3TrueTruePassed
discard-only-after-confirm scenario 4FalseFalsePassed
discard-only-after-confirm scenario 5TrueTruePassed
discard-only-after-confirm scenario 6FalseFalsePassed

SHA-256 / 8751cf08307c2e3ce8534e3969583b66d9976c993c928e4487cd15255e39823f

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(operation, s):
    dirty, target, current, pending, decision, bypass, replace = s
    if operation == 'dirty-transition-gate':
        return dirty and target!=current and not bypass
    if operation == 'cancel-retains-location':
        return current if decision=='cancel' else target
    if operation == 'confirm-original-destination':
        return pending if decision=='confirm' and pending is not None else current
    if operation == 'pending-request-replacement':
        return target if decision=='ask' and dirty and not bypass else None
    if operation == 'clear-on-cancel':
        return None if decision=='cancel' else pending
    if operation == 'replace-navigation-mode':
        return 'replace' if replace else 'push'
    if operation == 'same-location-noop':
        return target==current
    if operation == 'one-shot-bypass-consumption':
        return False if bypass and target!=current else bypass
    if operation == 'prompt-visibility':
        return decision=='ask' and dirty
    if operation == 'discard-only-after-confirm':
        return dirty and decision!='confirm'
    raise ValueError('unknown modeled operation')
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('dirty-transition-gate scenario 1', solve('dirty-transition-gate', (True,'/b'+str(N),'/a',None,'ask',False,False)), True)
check('dirty-transition-gate scenario 2', solve('dirty-transition-gate', (False,'/a','/a','/old','ask',False,True)), False)
check('dirty-transition-gate scenario 3', solve('dirty-transition-gate', (True,'/b','/a','/b','cancel',False,False)), True)
check('dirty-transition-gate scenario 4', solve('dirty-transition-gate', (True,'/c','/a','/b','confirm',False,True)), True)
check('dirty-transition-gate scenario 5', solve('dirty-transition-gate', (True,'/b','/a',None,'ask',True,False)), False)
check('dirty-transition-gate scenario 6', solve('dirty-transition-gate', (False,'/b','/a',None,'ask',False,False)), False)
check('cancel-retains-location scenario 1', solve('cancel-retains-location', (True,'/b'+str(N),'/a',None,'ask',False,False)), '/b'+str(N))
check('cancel-retains-location scenario 2', solve('cancel-retains-location', (False,'/a','/a','/old','ask',False,True)), '/a')
check('cancel-retains-location scenario 3', solve('cancel-retains-location', (True,'/b','/a','/b','cancel',False,False)), '/a')
check('cancel-retains-location scenario 4', solve('cancel-retains-location', (True,'/c','/a','/b','confirm',False,True)), '/c')
check('cancel-retains-location scenario 5', solve('cancel-retains-location', (True,'/b','/a',None,'ask',True,False)), '/b')
check('cancel-retains-location scenario 6', solve('cancel-retains-location', (False,'/b','/a',None,'ask',False,False)), '/b')
check('confirm-original-destination scenario 1', solve('confirm-original-destination', (True,'/b'+str(N),'/a',None,'ask',False,False)), '/a')
check('confirm-original-destination scenario 2', solve('confirm-original-destination', (False,'/a','/a','/old','ask',False,True)), '/a')
check('confirm-original-destination scenario 3', solve('confirm-original-destination', (True,'/b','/a','/b','cancel',False,False)), '/a')
check('confirm-original-destination scenario 4', solve('confirm-original-destination', (True,'/c','/a','/b','confirm',False,True)), '/b')
check('confirm-original-destination scenario 5', solve('confirm-original-destination', (True,'/b','/a',None,'ask',True,False)), '/a')
check('confirm-original-destination scenario 6', solve('confirm-original-destination', (False,'/b','/a',None,'ask',False,False)), '/a')
check('pending-request-replacement scenario 1', solve('pending-request-replacement', (True,'/b'+str(N),'/a',None,'ask',False,False)), '/b'+str(N))
check('pending-request-replacement scenario 2', solve('pending-request-replacement', (False,'/a','/a','/old','ask',False,True)), None)
check('pending-request-replacement scenario 3', solve('pending-request-replacement', (True,'/b','/a','/b','cancel',False,False)), None)
check('pending-request-replacement scenario 4', solve('pending-request-replacement', (True,'/c','/a','/b','confirm',False,True)), None)
check('pending-request-replacement scenario 5', solve('pending-request-replacement', (True,'/b','/a',None,'ask',True,False)), None)
check('pending-request-replacement scenario 6', solve('pending-request-replacement', (False,'/b','/a',None,'ask',False,False)), None)
check('clear-on-cancel scenario 1', solve('clear-on-cancel', (True,'/b'+str(N),'/a',None,'ask',False,False)), None)
check('clear-on-cancel scenario 2', solve('clear-on-cancel', (False,'/a','/a','/old','ask',False,True)), '/old')
check('clear-on-cancel scenario 3', solve('clear-on-cancel', (True,'/b','/a','/b','cancel',False,False)), None)
check('clear-on-cancel scenario 4', solve('clear-on-cancel', (True,'/c','/a','/b','confirm',False,True)), '/b')
check('clear-on-cancel scenario 5', solve('clear-on-cancel', (True,'/b','/a',None,'ask',True,False)), None)
check('clear-on-cancel scenario 6', solve('clear-on-cancel', (False,'/b','/a',None,'ask',False,False)), None)
check('replace-navigation-mode scenario 1', solve('replace-navigation-mode', (True,'/b'+str(N),'/a',None,'ask',False,False)), 'push')
check('replace-navigation-mode scenario 2', solve('replace-navigation-mode', (False,'/a','/a','/old','ask',False,True)), 'replace')
check('replace-navigation-mode scenario 3', solve('replace-navigation-mode', (True,'/b','/a','/b','cancel',False,False)), 'push')
check('replace-navigation-mode scenario 4', solve('replace-navigation-mode', (True,'/c','/a','/b','confirm',False,True)), 'replace')
check('replace-navigation-mode scenario 5', solve('replace-navigation-mode', (True,'/b','/a',None,'ask',True,False)), 'push')
check('replace-navigation-mode scenario 6', solve('replace-navigation-mode', (False,'/b','/a',None,'ask',False,False)), 'push')
check('same-location-noop scenario 1', solve('same-location-noop', (True,'/b'+str(N),'/a',None,'ask',False,False)), False)
check('same-location-noop scenario 2', solve('same-location-noop', (False,'/a','/a','/old','ask',False,True)), True)
check('same-location-noop scenario 3', solve('same-location-noop', (True,'/b','/a','/b','cancel',False,False)), False)
check('same-location-noop scenario 4', solve('same-location-noop', (True,'/c','/a','/b','confirm',False,True)), False)
check('same-location-noop scenario 5', solve('same-location-noop', (True,'/b','/a',None,'ask',True,False)), False)
check('same-location-noop scenario 6', solve('same-location-noop', (False,'/b','/a',None,'ask',False,False)), False)
check('one-shot-bypass-consumption scenario 1', solve('one-shot-bypass-consumption', (True,'/b'+str(N),'/a',None,'ask',False,False)), False)
check('one-shot-bypass-consumption scenario 2', solve('one-shot-bypass-consumption', (False,'/a','/a','/old','ask',False,True)), False)
check('one-shot-bypass-consumption scenario 3', solve('one-shot-bypass-consumption', (True,'/b','/a','/b','cancel',False,False)), False)
check('one-shot-bypass-consumption scenario 4', solve('one-shot-bypass-consumption', (True,'/c','/a','/b','confirm',False,True)), False)
check('one-shot-bypass-consumption scenario 5', solve('one-shot-bypass-consumption', (True,'/b','/a',None,'ask',True,False)), False)
check('one-shot-bypass-consumption scenario 6', solve('one-shot-bypass-consumption', (False,'/b','/a',None,'ask',False,False)), False)
check('prompt-visibility scenario 1', solve('prompt-visibility', (True,'/b'+str(N),'/a',None,'ask',False,False)), True)
check('prompt-visibility scenario 2', solve('prompt-visibility', (False,'/a','/a','/old','ask',False,True)), False)
check('prompt-visibility scenario 3', solve('prompt-visibility', (True,'/b','/a','/b','cancel',False,False)), False)
check('prompt-visibility scenario 4', solve('prompt-visibility', (True,'/c','/a','/b','confirm',False,True)), False)
check('prompt-visibility scenario 5', solve('prompt-visibility', (True,'/b','/a',None,'ask',True,False)), False)
check('prompt-visibility scenario 6', solve('prompt-visibility', (False,'/b','/a',None,'ask',False,False)), False)
check('discard-only-after-confirm scenario 1', solve('discard-only-after-confirm', (True,'/b'+str(N),'/a',None,'ask',False,False)), True)
check('discard-only-after-confirm scenario 2', solve('discard-only-after-confirm', (False,'/a','/a','/old','ask',False,True)), False)
check('discard-only-after-confirm scenario 3', solve('discard-only-after-confirm', (True,'/b','/a','/b','cancel',False,False)), True)
check('discard-only-after-confirm scenario 4', solve('discard-only-after-confirm', (True,'/c','/a','/b','confirm',False,True)), False)
check('discard-only-after-confirm scenario 5', solve('discard-only-after-confirm', (True,'/b','/a',None,'ask',True,False)), True)
check('discard-only-after-confirm scenario 6', solve('discard-only-after-confirm', (False,'/b','/a',None,'ask',False,False)), False)
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
dirty-transition-gate scenario 1TrueTruePassed
dirty-transition-gate scenario 2FalseFalsePassed
dirty-transition-gate scenario 3TrueTruePassed
dirty-transition-gate scenario 4TrueTruePassed
dirty-transition-gate scenario 5FalseFalsePassed
dirty-transition-gate scenario 6FalseFalsePassed
cancel-retains-location scenario 1/b1/b1Passed
cancel-retains-location scenario 2/a/aPassed
cancel-retains-location scenario 3/a/aPassed
cancel-retains-location scenario 4/c/cPassed
cancel-retains-location scenario 5/b/bPassed
cancel-retains-location scenario 6/b/bPassed
confirm-original-destination scenario 1/a/aPassed
confirm-original-destination scenario 2/a/aPassed
confirm-original-destination scenario 3/a/aPassed
confirm-original-destination scenario 4/b/bPassed
confirm-original-destination scenario 5/a/aPassed
confirm-original-destination scenario 6/a/aPassed
pending-request-replacement scenario 1/b1/b1Passed
pending-request-replacement scenario 2NoneNonePassed
pending-request-replacement scenario 3NoneNonePassed
pending-request-replacement scenario 4NoneNonePassed
pending-request-replacement scenario 5NoneNonePassed
pending-request-replacement scenario 6NoneNonePassed
clear-on-cancel scenario 1NoneNonePassed
clear-on-cancel scenario 2/old/oldPassed
clear-on-cancel scenario 3NoneNonePassed
clear-on-cancel scenario 4/b/bPassed
clear-on-cancel scenario 5NoneNonePassed
clear-on-cancel scenario 6NoneNonePassed
replace-navigation-mode scenario 1pushpushPassed
replace-navigation-mode scenario 2replacereplacePassed
replace-navigation-mode scenario 3pushpushPassed
replace-navigation-mode scenario 4replacereplacePassed
replace-navigation-mode scenario 5pushpushPassed
replace-navigation-mode scenario 6pushpushPassed
same-location-noop scenario 1FalseFalsePassed
same-location-noop scenario 2TrueTruePassed
same-location-noop scenario 3FalseFalsePassed
same-location-noop scenario 4FalseFalsePassed
same-location-noop scenario 5FalseFalsePassed
same-location-noop scenario 6FalseFalsePassed
one-shot-bypass-consumption scenario 1FalseFalsePassed
one-shot-bypass-consumption scenario 2FalseFalsePassed
one-shot-bypass-consumption scenario 3FalseFalsePassed
one-shot-bypass-consumption scenario 4FalseFalsePassed
one-shot-bypass-consumption scenario 5FalseFalsePassed
one-shot-bypass-consumption scenario 6FalseFalsePassed
prompt-visibility scenario 1TrueTruePassed
prompt-visibility scenario 2FalseFalsePassed
prompt-visibility scenario 3FalseFalsePassed
prompt-visibility scenario 4FalseFalsePassed
prompt-visibility scenario 5TrueFalseFailed
prompt-visibility scenario 6FalseFalsePassed
discard-only-after-confirm scenario 1TrueTruePassed
discard-only-after-confirm scenario 2FalseFalsePassed
discard-only-after-confirm scenario 3TrueTruePassed
discard-only-after-confirm scenario 4FalseFalsePassed
discard-only-after-confirm scenario 5TrueTruePassed
discard-only-after-confirm scenario 6FalseFalsePassed

SHA-256 / 619228f034ff0ae8e4a4b4ce612320856c92b78f1516961832e00e61762e037e

3 / The verified repair

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

N = 1
observations = []
def solve(operation, s):
    dirty, target, current, pending, decision, bypass, replace = s
    if operation == 'dirty-transition-gate':
        return dirty and target!=current and not bypass
    if operation == 'cancel-retains-location':
        return current if decision=='cancel' else target
    if operation == 'confirm-original-destination':
        return pending if decision=='confirm' and pending is not None else current
    if operation == 'pending-request-replacement':
        return target if decision=='ask' and dirty and not bypass else None
    if operation == 'clear-on-cancel':
        return None if decision=='cancel' else pending
    if operation == 'replace-navigation-mode':
        return 'replace' if replace else 'push'
    if operation == 'same-location-noop':
        return target==current
    if operation == 'one-shot-bypass-consumption':
        return False if bypass and target!=current else bypass
    if operation == 'prompt-visibility':
        return decision=='ask' and dirty and not bypass and target!=current
    if operation == 'discard-only-after-confirm':
        return dirty and decision!='confirm'
    raise ValueError('unknown modeled operation')
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('dirty-transition-gate scenario 1', solve('dirty-transition-gate', (True,'/b'+str(N),'/a',None,'ask',False,False)), True)
check('dirty-transition-gate scenario 2', solve('dirty-transition-gate', (False,'/a','/a','/old','ask',False,True)), False)
check('dirty-transition-gate scenario 3', solve('dirty-transition-gate', (True,'/b','/a','/b','cancel',False,False)), True)
check('dirty-transition-gate scenario 4', solve('dirty-transition-gate', (True,'/c','/a','/b','confirm',False,True)), True)
check('dirty-transition-gate scenario 5', solve('dirty-transition-gate', (True,'/b','/a',None,'ask',True,False)), False)
check('dirty-transition-gate scenario 6', solve('dirty-transition-gate', (False,'/b','/a',None,'ask',False,False)), False)
check('cancel-retains-location scenario 1', solve('cancel-retains-location', (True,'/b'+str(N),'/a',None,'ask',False,False)), '/b'+str(N))
check('cancel-retains-location scenario 2', solve('cancel-retains-location', (False,'/a','/a','/old','ask',False,True)), '/a')
check('cancel-retains-location scenario 3', solve('cancel-retains-location', (True,'/b','/a','/b','cancel',False,False)), '/a')
check('cancel-retains-location scenario 4', solve('cancel-retains-location', (True,'/c','/a','/b','confirm',False,True)), '/c')
check('cancel-retains-location scenario 5', solve('cancel-retains-location', (True,'/b','/a',None,'ask',True,False)), '/b')
check('cancel-retains-location scenario 6', solve('cancel-retains-location', (False,'/b','/a',None,'ask',False,False)), '/b')
check('confirm-original-destination scenario 1', solve('confirm-original-destination', (True,'/b'+str(N),'/a',None,'ask',False,False)), '/a')
check('confirm-original-destination scenario 2', solve('confirm-original-destination', (False,'/a','/a','/old','ask',False,True)), '/a')
check('confirm-original-destination scenario 3', solve('confirm-original-destination', (True,'/b','/a','/b','cancel',False,False)), '/a')
check('confirm-original-destination scenario 4', solve('confirm-original-destination', (True,'/c','/a','/b','confirm',False,True)), '/b')
check('confirm-original-destination scenario 5', solve('confirm-original-destination', (True,'/b','/a',None,'ask',True,False)), '/a')
check('confirm-original-destination scenario 6', solve('confirm-original-destination', (False,'/b','/a',None,'ask',False,False)), '/a')
check('pending-request-replacement scenario 1', solve('pending-request-replacement', (True,'/b'+str(N),'/a',None,'ask',False,False)), '/b'+str(N))
check('pending-request-replacement scenario 2', solve('pending-request-replacement', (False,'/a','/a','/old','ask',False,True)), None)
check('pending-request-replacement scenario 3', solve('pending-request-replacement', (True,'/b','/a','/b','cancel',False,False)), None)
check('pending-request-replacement scenario 4', solve('pending-request-replacement', (True,'/c','/a','/b','confirm',False,True)), None)
check('pending-request-replacement scenario 5', solve('pending-request-replacement', (True,'/b','/a',None,'ask',True,False)), None)
check('pending-request-replacement scenario 6', solve('pending-request-replacement', (False,'/b','/a',None,'ask',False,False)), None)
check('clear-on-cancel scenario 1', solve('clear-on-cancel', (True,'/b'+str(N),'/a',None,'ask',False,False)), None)
check('clear-on-cancel scenario 2', solve('clear-on-cancel', (False,'/a','/a','/old','ask',False,True)), '/old')
check('clear-on-cancel scenario 3', solve('clear-on-cancel', (True,'/b','/a','/b','cancel',False,False)), None)
check('clear-on-cancel scenario 4', solve('clear-on-cancel', (True,'/c','/a','/b','confirm',False,True)), '/b')
check('clear-on-cancel scenario 5', solve('clear-on-cancel', (True,'/b','/a',None,'ask',True,False)), None)
check('clear-on-cancel scenario 6', solve('clear-on-cancel', (False,'/b','/a',None,'ask',False,False)), None)
check('replace-navigation-mode scenario 1', solve('replace-navigation-mode', (True,'/b'+str(N),'/a',None,'ask',False,False)), 'push')
check('replace-navigation-mode scenario 2', solve('replace-navigation-mode', (False,'/a','/a','/old','ask',False,True)), 'replace')
check('replace-navigation-mode scenario 3', solve('replace-navigation-mode', (True,'/b','/a','/b','cancel',False,False)), 'push')
check('replace-navigation-mode scenario 4', solve('replace-navigation-mode', (True,'/c','/a','/b','confirm',False,True)), 'replace')
check('replace-navigation-mode scenario 5', solve('replace-navigation-mode', (True,'/b','/a',None,'ask',True,False)), 'push')
check('replace-navigation-mode scenario 6', solve('replace-navigation-mode', (False,'/b','/a',None,'ask',False,False)), 'push')
check('same-location-noop scenario 1', solve('same-location-noop', (True,'/b'+str(N),'/a',None,'ask',False,False)), False)
check('same-location-noop scenario 2', solve('same-location-noop', (False,'/a','/a','/old','ask',False,True)), True)
check('same-location-noop scenario 3', solve('same-location-noop', (True,'/b','/a','/b','cancel',False,False)), False)
check('same-location-noop scenario 4', solve('same-location-noop', (True,'/c','/a','/b','confirm',False,True)), False)
check('same-location-noop scenario 5', solve('same-location-noop', (True,'/b','/a',None,'ask',True,False)), False)
check('same-location-noop scenario 6', solve('same-location-noop', (False,'/b','/a',None,'ask',False,False)), False)
check('one-shot-bypass-consumption scenario 1', solve('one-shot-bypass-consumption', (True,'/b'+str(N),'/a',None,'ask',False,False)), False)
check('one-shot-bypass-consumption scenario 2', solve('one-shot-bypass-consumption', (False,'/a','/a','/old','ask',False,True)), False)
check('one-shot-bypass-consumption scenario 3', solve('one-shot-bypass-consumption', (True,'/b','/a','/b','cancel',False,False)), False)
check('one-shot-bypass-consumption scenario 4', solve('one-shot-bypass-consumption', (True,'/c','/a','/b','confirm',False,True)), False)
check('one-shot-bypass-consumption scenario 5', solve('one-shot-bypass-consumption', (True,'/b','/a',None,'ask',True,False)), False)
check('one-shot-bypass-consumption scenario 6', solve('one-shot-bypass-consumption', (False,'/b','/a',None,'ask',False,False)), False)
check('prompt-visibility scenario 1', solve('prompt-visibility', (True,'/b'+str(N),'/a',None,'ask',False,False)), True)
check('prompt-visibility scenario 2', solve('prompt-visibility', (False,'/a','/a','/old','ask',False,True)), False)
check('prompt-visibility scenario 3', solve('prompt-visibility', (True,'/b','/a','/b','cancel',False,False)), False)
check('prompt-visibility scenario 4', solve('prompt-visibility', (True,'/c','/a','/b','confirm',False,True)), False)
check('prompt-visibility scenario 5', solve('prompt-visibility', (True,'/b','/a',None,'ask',True,False)), False)
check('prompt-visibility scenario 6', solve('prompt-visibility', (False,'/b','/a',None,'ask',False,False)), False)
check('discard-only-after-confirm scenario 1', solve('discard-only-after-confirm', (True,'/b'+str(N),'/a',None,'ask',False,False)), True)
check('discard-only-after-confirm scenario 2', solve('discard-only-after-confirm', (False,'/a','/a','/old','ask',False,True)), False)
check('discard-only-after-confirm scenario 3', solve('discard-only-after-confirm', (True,'/b','/a','/b','cancel',False,False)), True)
check('discard-only-after-confirm scenario 4', solve('discard-only-after-confirm', (True,'/c','/a','/b','confirm',False,True)), False)
check('discard-only-after-confirm scenario 5', solve('discard-only-after-confirm', (True,'/b','/a',None,'ask',True,False)), True)
check('discard-only-after-confirm scenario 6', solve('discard-only-after-confirm', (False,'/b','/a',None,'ask',False,False)), False)
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
dirty-transition-gate scenario 1TrueTruePassed
dirty-transition-gate scenario 2FalseFalsePassed
dirty-transition-gate scenario 3TrueTruePassed
dirty-transition-gate scenario 4TrueTruePassed
dirty-transition-gate scenario 5FalseFalsePassed
dirty-transition-gate scenario 6FalseFalsePassed
cancel-retains-location scenario 1/b1/b1Passed
cancel-retains-location scenario 2/a/aPassed
cancel-retains-location scenario 3/a/aPassed
cancel-retains-location scenario 4/c/cPassed
cancel-retains-location scenario 5/b/bPassed
cancel-retains-location scenario 6/b/bPassed
confirm-original-destination scenario 1/a/aPassed
confirm-original-destination scenario 2/a/aPassed
confirm-original-destination scenario 3/a/aPassed
confirm-original-destination scenario 4/b/bPassed
confirm-original-destination scenario 5/a/aPassed
confirm-original-destination scenario 6/a/aPassed
pending-request-replacement scenario 1/b1/b1Passed
pending-request-replacement scenario 2NoneNonePassed
pending-request-replacement scenario 3NoneNonePassed
pending-request-replacement scenario 4NoneNonePassed
pending-request-replacement scenario 5NoneNonePassed
pending-request-replacement scenario 6NoneNonePassed
clear-on-cancel scenario 1NoneNonePassed
clear-on-cancel scenario 2/old/oldPassed
clear-on-cancel scenario 3NoneNonePassed
clear-on-cancel scenario 4/b/bPassed
clear-on-cancel scenario 5NoneNonePassed
clear-on-cancel scenario 6NoneNonePassed
replace-navigation-mode scenario 1pushpushPassed
replace-navigation-mode scenario 2replacereplacePassed
replace-navigation-mode scenario 3pushpushPassed
replace-navigation-mode scenario 4replacereplacePassed
replace-navigation-mode scenario 5pushpushPassed
replace-navigation-mode scenario 6pushpushPassed
same-location-noop scenario 1FalseFalsePassed
same-location-noop scenario 2TrueTruePassed
same-location-noop scenario 3FalseFalsePassed
same-location-noop scenario 4FalseFalsePassed
same-location-noop scenario 5FalseFalsePassed
same-location-noop scenario 6FalseFalsePassed
one-shot-bypass-consumption scenario 1FalseFalsePassed
one-shot-bypass-consumption scenario 2FalseFalsePassed
one-shot-bypass-consumption scenario 3FalseFalsePassed
one-shot-bypass-consumption scenario 4FalseFalsePassed
one-shot-bypass-consumption scenario 5FalseFalsePassed
one-shot-bypass-consumption scenario 6FalseFalsePassed
prompt-visibility scenario 1TrueTruePassed
prompt-visibility scenario 2FalseFalsePassed
prompt-visibility scenario 3FalseFalsePassed
prompt-visibility scenario 4FalseFalsePassed
prompt-visibility scenario 5FalseFalsePassed
prompt-visibility scenario 6FalseFalsePassed
discard-only-after-confirm scenario 1TrueTruePassed
discard-only-after-confirm scenario 2FalseFalsePassed
discard-only-after-confirm scenario 3TrueTruePassed
discard-only-after-confirm scenario 4FalseFalsePassed
discard-only-after-confirm scenario 5TrueTruePassed
discard-only-after-confirm scenario 6FalseFalsePassed

SHA-256 / 56b2ca8512abf40664409312f2a9520af4552d85f7dc0490d486c5f115a48031

Verification & scope

Only the explicitly specified operations and finite deterministic records are modeled; no browser or framework conformance is claimed. 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:40:50.399554+00:00.

Case digest / 7cd7c0abb70271cce713ddad068cc26e68d39ec9ed7aca9a59bf9e94fec3217f