FA-23716 / Client state / Open access
Unsaved navigation confirmation: Prompt visibility · case 01
Prompt visibility.
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| dirty-transition-gate scenario 1 | True | True | Passed |
| dirty-transition-gate scenario 2 | False | False | Passed |
| dirty-transition-gate scenario 3 | True | True | Passed |
| dirty-transition-gate scenario 4 | True | True | Passed |
| dirty-transition-gate scenario 5 | False | False | Passed |
| dirty-transition-gate scenario 6 | False | False | Passed |
| cancel-retains-location scenario 1 | /b1 | /b1 | Passed |
| cancel-retains-location scenario 2 | /a | /a | Passed |
| cancel-retains-location scenario 3 | /a | /a | Passed |
| cancel-retains-location scenario 4 | /c | /c | Passed |
| cancel-retains-location scenario 5 | /b | /b | Passed |
| cancel-retains-location scenario 6 | /b | /b | Passed |
| confirm-original-destination scenario 1 | /a | /a | Passed |
| confirm-original-destination scenario 2 | /a | /a | Passed |
| confirm-original-destination scenario 3 | /a | /a | Passed |
| confirm-original-destination scenario 4 | /b | /b | Passed |
| confirm-original-destination scenario 5 | /a | /a | Passed |
| confirm-original-destination scenario 6 | /a | /a | Passed |
| pending-request-replacement scenario 1 | /b1 | /b1 | Passed |
| pending-request-replacement scenario 2 | None | None | Passed |
| pending-request-replacement scenario 3 | None | None | Passed |
| pending-request-replacement scenario 4 | None | None | Passed |
| pending-request-replacement scenario 5 | None | None | Passed |
| pending-request-replacement scenario 6 | None | None | Passed |
| clear-on-cancel scenario 1 | None | None | Passed |
| clear-on-cancel scenario 2 | /old | /old | Passed |
| clear-on-cancel scenario 3 | None | None | Passed |
| clear-on-cancel scenario 4 | /b | /b | Passed |
| clear-on-cancel scenario 5 | None | None | Passed |
| clear-on-cancel scenario 6 | None | None | Passed |
| replace-navigation-mode scenario 1 | push | push | Passed |
| replace-navigation-mode scenario 2 | replace | replace | Passed |
| replace-navigation-mode scenario 3 | push | push | Passed |
| replace-navigation-mode scenario 4 | replace | replace | Passed |
| replace-navigation-mode scenario 5 | push | push | Passed |
| replace-navigation-mode scenario 6 | push | push | Passed |
| same-location-noop scenario 1 | False | False | Passed |
| same-location-noop scenario 2 | True | True | Passed |
| same-location-noop scenario 3 | False | False | Passed |
| same-location-noop scenario 4 | False | False | Passed |
| same-location-noop scenario 5 | False | False | Passed |
| same-location-noop scenario 6 | False | False | Passed |
| one-shot-bypass-consumption scenario 1 | False | False | Passed |
| one-shot-bypass-consumption scenario 2 | False | False | Passed |
| one-shot-bypass-consumption scenario 3 | False | False | Passed |
| one-shot-bypass-consumption scenario 4 | False | False | Passed |
| one-shot-bypass-consumption scenario 5 | False | False | Passed |
| one-shot-bypass-consumption scenario 6 | False | False | Passed |
| prompt-visibility scenario 1 | True | True | Passed |
| prompt-visibility scenario 2 | False | False | Passed |
| prompt-visibility scenario 3 | True | False | Failed |
| prompt-visibility scenario 4 | False | False | Passed |
| prompt-visibility scenario 5 | True | False | Failed |
| prompt-visibility scenario 6 | False | False | Passed |
| discard-only-after-confirm scenario 1 | True | True | Passed |
| discard-only-after-confirm scenario 2 | False | False | Passed |
| discard-only-after-confirm scenario 3 | True | True | Passed |
| discard-only-after-confirm scenario 4 | False | False | Passed |
| discard-only-after-confirm scenario 5 | True | True | Passed |
| discard-only-after-confirm scenario 6 | False | False | Passed |
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| dirty-transition-gate scenario 1 | True | True | Passed |
| dirty-transition-gate scenario 2 | False | False | Passed |
| dirty-transition-gate scenario 3 | True | True | Passed |
| dirty-transition-gate scenario 4 | True | True | Passed |
| dirty-transition-gate scenario 5 | False | False | Passed |
| dirty-transition-gate scenario 6 | False | False | Passed |
| cancel-retains-location scenario 1 | /b1 | /b1 | Passed |
| cancel-retains-location scenario 2 | /a | /a | Passed |
| cancel-retains-location scenario 3 | /a | /a | Passed |
| cancel-retains-location scenario 4 | /c | /c | Passed |
| cancel-retains-location scenario 5 | /b | /b | Passed |
| cancel-retains-location scenario 6 | /b | /b | Passed |
| confirm-original-destination scenario 1 | /a | /a | Passed |
| confirm-original-destination scenario 2 | /a | /a | Passed |
| confirm-original-destination scenario 3 | /a | /a | Passed |
| confirm-original-destination scenario 4 | /b | /b | Passed |
| confirm-original-destination scenario 5 | /a | /a | Passed |
| confirm-original-destination scenario 6 | /a | /a | Passed |
| pending-request-replacement scenario 1 | /b1 | /b1 | Passed |
| pending-request-replacement scenario 2 | None | None | Passed |
| pending-request-replacement scenario 3 | None | None | Passed |
| pending-request-replacement scenario 4 | None | None | Passed |
| pending-request-replacement scenario 5 | None | None | Passed |
| pending-request-replacement scenario 6 | None | None | Passed |
| clear-on-cancel scenario 1 | None | None | Passed |
| clear-on-cancel scenario 2 | /old | /old | Passed |
| clear-on-cancel scenario 3 | None | None | Passed |
| clear-on-cancel scenario 4 | /b | /b | Passed |
| clear-on-cancel scenario 5 | None | None | Passed |
| clear-on-cancel scenario 6 | None | None | Passed |
| replace-navigation-mode scenario 1 | push | push | Passed |
| replace-navigation-mode scenario 2 | replace | replace | Passed |
| replace-navigation-mode scenario 3 | push | push | Passed |
| replace-navigation-mode scenario 4 | replace | replace | Passed |
| replace-navigation-mode scenario 5 | push | push | Passed |
| replace-navigation-mode scenario 6 | push | push | Passed |
| same-location-noop scenario 1 | False | False | Passed |
| same-location-noop scenario 2 | True | True | Passed |
| same-location-noop scenario 3 | False | False | Passed |
| same-location-noop scenario 4 | False | False | Passed |
| same-location-noop scenario 5 | False | False | Passed |
| same-location-noop scenario 6 | False | False | Passed |
| one-shot-bypass-consumption scenario 1 | False | False | Passed |
| one-shot-bypass-consumption scenario 2 | False | False | Passed |
| one-shot-bypass-consumption scenario 3 | False | False | Passed |
| one-shot-bypass-consumption scenario 4 | False | False | Passed |
| one-shot-bypass-consumption scenario 5 | False | False | Passed |
| one-shot-bypass-consumption scenario 6 | False | False | Passed |
| prompt-visibility scenario 1 | True | True | Passed |
| prompt-visibility scenario 2 | False | False | Passed |
| prompt-visibility scenario 3 | False | False | Passed |
| prompt-visibility scenario 4 | False | False | Passed |
| prompt-visibility scenario 5 | True | False | Failed |
| prompt-visibility scenario 6 | False | False | Passed |
| discard-only-after-confirm scenario 1 | True | True | Passed |
| discard-only-after-confirm scenario 2 | False | False | Passed |
| discard-only-after-confirm scenario 3 | True | True | Passed |
| discard-only-after-confirm scenario 4 | False | False | Passed |
| discard-only-after-confirm scenario 5 | True | True | Passed |
| discard-only-after-confirm scenario 6 | False | False | Passed |
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| dirty-transition-gate scenario 1 | True | True | Passed |
| dirty-transition-gate scenario 2 | False | False | Passed |
| dirty-transition-gate scenario 3 | True | True | Passed |
| dirty-transition-gate scenario 4 | True | True | Passed |
| dirty-transition-gate scenario 5 | False | False | Passed |
| dirty-transition-gate scenario 6 | False | False | Passed |
| cancel-retains-location scenario 1 | /b1 | /b1 | Passed |
| cancel-retains-location scenario 2 | /a | /a | Passed |
| cancel-retains-location scenario 3 | /a | /a | Passed |
| cancel-retains-location scenario 4 | /c | /c | Passed |
| cancel-retains-location scenario 5 | /b | /b | Passed |
| cancel-retains-location scenario 6 | /b | /b | Passed |
| confirm-original-destination scenario 1 | /a | /a | Passed |
| confirm-original-destination scenario 2 | /a | /a | Passed |
| confirm-original-destination scenario 3 | /a | /a | Passed |
| confirm-original-destination scenario 4 | /b | /b | Passed |
| confirm-original-destination scenario 5 | /a | /a | Passed |
| confirm-original-destination scenario 6 | /a | /a | Passed |
| pending-request-replacement scenario 1 | /b1 | /b1 | Passed |
| pending-request-replacement scenario 2 | None | None | Passed |
| pending-request-replacement scenario 3 | None | None | Passed |
| pending-request-replacement scenario 4 | None | None | Passed |
| pending-request-replacement scenario 5 | None | None | Passed |
| pending-request-replacement scenario 6 | None | None | Passed |
| clear-on-cancel scenario 1 | None | None | Passed |
| clear-on-cancel scenario 2 | /old | /old | Passed |
| clear-on-cancel scenario 3 | None | None | Passed |
| clear-on-cancel scenario 4 | /b | /b | Passed |
| clear-on-cancel scenario 5 | None | None | Passed |
| clear-on-cancel scenario 6 | None | None | Passed |
| replace-navigation-mode scenario 1 | push | push | Passed |
| replace-navigation-mode scenario 2 | replace | replace | Passed |
| replace-navigation-mode scenario 3 | push | push | Passed |
| replace-navigation-mode scenario 4 | replace | replace | Passed |
| replace-navigation-mode scenario 5 | push | push | Passed |
| replace-navigation-mode scenario 6 | push | push | Passed |
| same-location-noop scenario 1 | False | False | Passed |
| same-location-noop scenario 2 | True | True | Passed |
| same-location-noop scenario 3 | False | False | Passed |
| same-location-noop scenario 4 | False | False | Passed |
| same-location-noop scenario 5 | False | False | Passed |
| same-location-noop scenario 6 | False | False | Passed |
| one-shot-bypass-consumption scenario 1 | False | False | Passed |
| one-shot-bypass-consumption scenario 2 | False | False | Passed |
| one-shot-bypass-consumption scenario 3 | False | False | Passed |
| one-shot-bypass-consumption scenario 4 | False | False | Passed |
| one-shot-bypass-consumption scenario 5 | False | False | Passed |
| one-shot-bypass-consumption scenario 6 | False | False | Passed |
| prompt-visibility scenario 1 | True | True | Passed |
| prompt-visibility scenario 2 | False | False | Passed |
| prompt-visibility scenario 3 | False | False | Passed |
| prompt-visibility scenario 4 | False | False | Passed |
| prompt-visibility scenario 5 | False | False | Passed |
| prompt-visibility scenario 6 | False | False | Passed |
| discard-only-after-confirm scenario 1 | True | True | Passed |
| discard-only-after-confirm scenario 2 | False | False | Passed |
| discard-only-after-confirm scenario 3 | True | True | Passed |
| discard-only-after-confirm scenario 4 | False | False | Passed |
| discard-only-after-confirm scenario 5 | True | True | Passed |
| discard-only-after-confirm scenario 6 | False | False | Passed |
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