FA-23776 / Client state / Open access
Client route-state projection: Repeated values retention · case 01
Repeated values retention.
ROOT CAUSE
The repeated-values-retention client decision evaluates `list(dict(pairs).get('tag',''))` instead of `[v for k,v in pairs if k=='tag']`.
VERIFIED REPAIR
Apply the modeled repeated-values-retention rule: `[v for k,v in pairs if k=='tag']`.
Unsuccessful approach: The partial repair `[v for k,v in pairs if k=='tag'][:1]` still violates the explicit fixture contract.
Case contract
This route-state adapter models already-decoded query pairs. Repeated pairs and insertion order remain significant, first occurrence is used by single-value readers, explicit empty values override defaults, and fragment absence differs from empty. Operation repeated-values-retention 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):
pairs, defaults, route, fragment = s
if operation == 'repeated-values-retention':
return list(dict(pairs).get('tag',''))
if operation == 'empty-query-value':
return next((v for k,v in pairs if k=='q'),defaults.get('q'))
if operation == 'query-default-merge':
return {**defaults,**dict(pairs)}
if operation == 'fragment-null-preservation':
return fragment if fragment is not None else 'absent'
if operation == 'state-cache-key':
return (route,tuple(pairs))
if operation == 'remove-one-query-name':
return [(k,v) for k,v in pairs if k!='q']
if operation == 'first-value-precedence':
return next((v for k,v in pairs if k=='q'),None)
if operation == 'debug-exclusion':
return [(k,v) for k,v in pairs if k!='debug']
if operation == 'explicit-query-key-set':
return sorted({k for k,v in pairs})
if operation == 'navigation-fragment-key':
return (route,fragment)
raise ValueError('unknown modeled operation')
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('repeated-values-retention scenario 1', solve('repeated-values-retention', ([('q','a'),('tag','x'),('tag','y')],{'q':'default'},'/a/'+str(N),'part')), ['x','y'])
check('repeated-values-retention scenario 2', solve('repeated-values-retention', ([('q','')],{'q':'default'},'/a','')), [])
check('repeated-values-retention scenario 3', solve('repeated-values-retention', ([] ,{'q':'default','page':'1'},'/a',None)), [])
check('repeated-values-retention scenario 4', solve('repeated-values-retention', ([('q','0'),('page','2'),('debug','1')],{'q':'default'},'/b','x')), [])
check('repeated-values-retention scenario 5', solve('repeated-values-retention', ([('page','0'),('tag','x')],{},'/a',None)), ['x'])
check('repeated-values-retention scenario 6', solve('repeated-values-retention', ([('q','a'),('q','b')],{},'/b','end')), [])
check('empty-query-value scenario 1', solve('empty-query-value', ([('q','a'),('tag','x'),('tag','y')],{'q':'default'},'/a/'+str(N),'part')), 'a')
check('empty-query-value scenario 2', solve('empty-query-value', ([('q','')],{'q':'default'},'/a','')), '')
check('empty-query-value scenario 3', solve('empty-query-value', ([] ,{'q':'default','page':'1'},'/a',None)), 'default')
check('empty-query-value scenario 4', solve('empty-query-value', ([('q','0'),('page','2'),('debug','1')],{'q':'default'},'/b','x')), '0')
check('empty-query-value scenario 5', solve('empty-query-value', ([('page','0'),('tag','x')],{},'/a',None)), None)
check('empty-query-value scenario 6', solve('empty-query-value', ([('q','a'),('q','b')],{},'/b','end')), 'a')
check('query-default-merge scenario 1', solve('query-default-merge', ([('q','a'),('tag','x'),('tag','y')],{'q':'default'},'/a/'+str(N),'part')), {'q':'a','tag':'y'})
check('query-default-merge scenario 2', solve('query-default-merge', ([('q','')],{'q':'default'},'/a','')), {'q':''})
check('query-default-merge scenario 3', solve('query-default-merge', ([] ,{'q':'default','page':'1'},'/a',None)), {'q':'default','page':'1'})
check('query-default-merge scenario 4', solve('query-default-merge', ([('q','0'),('page','2'),('debug','1')],{'q':'default'},'/b','x')), {'q':'0','page':'2','debug':'1'})
check('query-default-merge scenario 5', solve('query-default-merge', ([('page','0'),('tag','x')],{},'/a',None)), {'page':'0','tag':'x'})
check('query-default-merge scenario 6', solve('query-default-merge', ([('q','a'),('q','b')],{},'/b','end')), {'q':'b'})
check('fragment-null-preservation scenario 1', solve('fragment-null-preservation', ([('q','a'),('tag','x'),('tag','y')],{'q':'default'},'/a/'+str(N),'part')), 'part')
check('fragment-null-preservation scenario 2', solve('fragment-null-preservation', ([('q','')],{'q':'default'},'/a','')), '')
check('fragment-null-preservation scenario 3', solve('fragment-null-preservation', ([] ,{'q':'default','page':'1'},'/a',None)), 'absent')
check('fragment-null-preservation scenario 4', solve('fragment-null-preservation', ([('q','0'),('page','2'),('debug','1')],{'q':'default'},'/b','x')), 'x')
check('fragment-null-preservation scenario 5', solve('fragment-null-preservation', ([('page','0'),('tag','x')],{},'/a',None)), 'absent')
check('fragment-null-preservation scenario 6', solve('fragment-null-preservation', ([('q','a'),('q','b')],{},'/b','end')), 'end')
check('state-cache-key scenario 1', solve('state-cache-key', ([('q','a'),('tag','x'),('tag','y')],{'q':'default'},'/a/'+str(N),'part')), ('/a/'+str(N),(('q','a'),('tag','x'),('tag','y'))))
check('state-cache-key scenario 2', solve('state-cache-key', ([('q','')],{'q':'default'},'/a','')), ('/a',(('q',''),)))
check('state-cache-key scenario 3', solve('state-cache-key', ([] ,{'q':'default','page':'1'},'/a',None)), ('/a',()))
check('state-cache-key scenario 4', solve('state-cache-key', ([('q','0'),('page','2'),('debug','1')],{'q':'default'},'/b','x')), ('/b',(('q','0'),('page','2'),('debug','1'))))
check('state-cache-key scenario 5', solve('state-cache-key', ([('page','0'),('tag','x')],{},'/a',None)), ('/a',(('page','0'),('tag','x'))))
check('state-cache-key scenario 6', solve('state-cache-key', ([('q','a'),('q','b')],{},'/b','end')), ('/b',(('q','a'),('q','b'))))
check('remove-one-query-name scenario 1', solve('remove-one-query-name', ([('q','a'),('tag','x'),('tag','y')],{'q':'default'},'/a/'+str(N),'part')), [('tag','x'),('tag','y')])
check('remove-one-query-name scenario 2', solve('remove-one-query-name', ([('q','')],{'q':'default'},'/a','')), [])
check('remove-one-query-name scenario 3', solve('remove-one-query-name', ([] ,{'q':'default','page':'1'},'/a',None)), [])
check('remove-one-query-name scenario 4', solve('remove-one-query-name', ([('q','0'),('page','2'),('debug','1')],{'q':'default'},'/b','x')), [('page','2'),('debug','1')])
check('remove-one-query-name scenario 5', solve('remove-one-query-name', ([('page','0'),('tag','x')],{},'/a',None)), [('page','0'),('tag','x')])
check('remove-one-query-name scenario 6', solve('remove-one-query-name', ([('q','a'),('q','b')],{},'/b','end')), [])
check('first-value-precedence scenario 1', solve('first-value-precedence', ([('q','a'),('tag','x'),('tag','y')],{'q':'default'},'/a/'+str(N),'part')), 'a')
check('first-value-precedence scenario 2', solve('first-value-precedence', ([('q','')],{'q':'default'},'/a','')), '')
check('first-value-precedence scenario 3', solve('first-value-precedence', ([] ,{'q':'default','page':'1'},'/a',None)), None)
check('first-value-precedence scenario 4', solve('first-value-precedence', ([('q','0'),('page','2'),('debug','1')],{'q':'default'},'/b','x')), '0')
check('first-value-precedence scenario 5', solve('first-value-precedence', ([('page','0'),('tag','x')],{},'/a',None)), None)
check('first-value-precedence scenario 6', solve('first-value-precedence', ([('q','a'),('q','b')],{},'/b','end')), 'a')
check('debug-exclusion scenario 1', solve('debug-exclusion', ([('q','a'),('tag','x'),('tag','y')],{'q':'default'},'/a/'+str(N),'part')), [('q','a'),('tag','x'),('tag','y')])
check('debug-exclusion scenario 2', solve('debug-exclusion', ([('q','')],{'q':'default'},'/a','')), [('q','')])
check('debug-exclusion scenario 3', solve('debug-exclusion', ([] ,{'q':'default','page':'1'},'/a',None)), [])
check('debug-exclusion scenario 4', solve('debug-exclusion', ([('q','0'),('page','2'),('debug','1')],{'q':'default'},'/b','x')), [('q','0'),('page','2')])
check('debug-exclusion scenario 5', solve('debug-exclusion', ([('page','0'),('tag','x')],{},'/a',None)), [('page','0'),('tag','x')])
check('debug-exclusion scenario 6', solve('debug-exclusion', ([('q','a'),('q','b')],{},'/b','end')), [('q','a'),('q','b')])
check('explicit-query-key-set scenario 1', solve('explicit-query-key-set', ([('q','a'),('tag','x'),('tag','y')],{'q':'default'},'/a/'+str(N),'part')), ['q','tag'])
check('explicit-query-key-set scenario 2', solve('explicit-query-key-set', ([('q','')],{'q':'default'},'/a','')), ['q'])
check('explicit-query-key-set scenario 3', solve('explicit-query-key-set', ([] ,{'q':'default','page':'1'},'/a',None)), [])
check('explicit-query-key-set scenario 4', solve('explicit-query-key-set', ([('q','0'),('page','2'),('debug','1')],{'q':'default'},'/b','x')), ['debug','page','q'])
check('explicit-query-key-set scenario 5', solve('explicit-query-key-set', ([('page','0'),('tag','x')],{},'/a',None)), ['page','tag'])
check('explicit-query-key-set scenario 6', solve('explicit-query-key-set', ([('q','a'),('q','b')],{},'/b','end')), ['q'])
check('navigation-fragment-key scenario 1', solve('navigation-fragment-key', ([('q','a'),('tag','x'),('tag','y')],{'q':'default'},'/a/'+str(N),'part')), ('/a/'+str(N),'part'))
check('navigation-fragment-key scenario 2', solve('navigation-fragment-key', ([('q','')],{'q':'default'},'/a','')), ('/a',''))
check('navigation-fragment-key scenario 3', solve('navigation-fragment-key', ([] ,{'q':'default','page':'1'},'/a',None)), ('/a',None))
check('navigation-fragment-key scenario 4', solve('navigation-fragment-key', ([('q','0'),('page','2'),('debug','1')],{'q':'default'},'/b','x')), ('/b','x'))
check('navigation-fragment-key scenario 5', solve('navigation-fragment-key', ([('page','0'),('tag','x')],{},'/a',None)), ('/a',None))
check('navigation-fragment-key scenario 6', solve('navigation-fragment-key', ([('q','a'),('q','b')],{},'/b','end')), ('/b','end'))
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 |
|---|---|---|---|
| repeated-values-retention scenario 1 | ['y'] | ['x', 'y'] | Failed |
| repeated-values-retention scenario 2 | [] | [] | Passed |
| repeated-values-retention scenario 3 | [] | [] | Passed |
| repeated-values-retention scenario 4 | [] | [] | Passed |
| repeated-values-retention scenario 5 | ['x'] | ['x'] | Passed |
| repeated-values-retention scenario 6 | [] | [] | Passed |
| empty-query-value scenario 1 | a | a | Passed |
| empty-query-value scenario 2 | | | Passed |
| empty-query-value scenario 3 | default | default | Passed |
| empty-query-value scenario 4 | 0 | 0 | Passed |
| empty-query-value scenario 5 | None | None | Passed |
| empty-query-value scenario 6 | a | a | Passed |
| query-default-merge scenario 1 | {'q': 'a', 'tag': 'y'} | {'q': 'a', 'tag': 'y'} | Passed |
| query-default-merge scenario 2 | {'q': ''} | {'q': ''} | Passed |
| query-default-merge scenario 3 | {'page': '1', 'q': 'default'} | {'page': '1', 'q': 'default'} | Passed |
| query-default-merge scenario 4 | {'debug': '1', 'page': '2', 'q': '0'} | {'debug': '1', 'page': '2', 'q': '0'} | Passed |
| query-default-merge scenario 5 | {'page': '0', 'tag': 'x'} | {'page': '0', 'tag': 'x'} | Passed |
| query-default-merge scenario 6 | {'q': 'b'} | {'q': 'b'} | Passed |
| fragment-null-preservation scenario 1 | part | part | Passed |
| fragment-null-preservation scenario 2 | | | Passed |
| fragment-null-preservation scenario 3 | absent | absent | Passed |
| fragment-null-preservation scenario 4 | x | x | Passed |
| fragment-null-preservation scenario 5 | absent | absent | Passed |
| fragment-null-preservation scenario 6 | end | end | Passed |
| state-cache-key scenario 1 | ['/a/1', [['q', 'a'], ['tag', 'x'], ['tag', 'y']]] | ['/a/1', [['q', 'a'], ['tag', 'x'], ['tag', 'y']]] | Passed |
| state-cache-key scenario 2 | ['/a', [['q', '']]] | ['/a', [['q', '']]] | Passed |
| state-cache-key scenario 3 | ['/a', []] | ['/a', []] | Passed |
| state-cache-key scenario 4 | ['/b', [['q', '0'], ['page', '2'], ['debug', '1']]] | ['/b', [['q', '0'], ['page', '2'], ['debug', '1']]] | Passed |
| state-cache-key scenario 5 | ['/a', [['page', '0'], ['tag', 'x']]] | ['/a', [['page', '0'], ['tag', 'x']]] | Passed |
| state-cache-key scenario 6 | ['/b', [['q', 'a'], ['q', 'b']]] | ['/b', [['q', 'a'], ['q', 'b']]] | Passed |
| remove-one-query-name scenario 1 | [['tag', 'x'], ['tag', 'y']] | [['tag', 'x'], ['tag', 'y']] | Passed |
| remove-one-query-name scenario 2 | [] | [] | Passed |
| remove-one-query-name scenario 3 | [] | [] | Passed |
| remove-one-query-name scenario 4 | [['page', '2'], ['debug', '1']] | [['page', '2'], ['debug', '1']] | Passed |
| remove-one-query-name scenario 5 | [['page', '0'], ['tag', 'x']] | [['page', '0'], ['tag', 'x']] | Passed |
| remove-one-query-name scenario 6 | [] | [] | Passed |
| first-value-precedence scenario 1 | a | a | Passed |
| first-value-precedence scenario 2 | | | Passed |
| first-value-precedence scenario 3 | None | None | Passed |
| first-value-precedence scenario 4 | 0 | 0 | Passed |
| first-value-precedence scenario 5 | None | None | Passed |
| first-value-precedence scenario 6 | a | a | Passed |
| debug-exclusion scenario 1 | [['q', 'a'], ['tag', 'x'], ['tag', 'y']] | [['q', 'a'], ['tag', 'x'], ['tag', 'y']] | Passed |
| debug-exclusion scenario 2 | [['q', '']] | [['q', '']] | Passed |
| debug-exclusion scenario 3 | [] | [] | Passed |
| debug-exclusion scenario 4 | [['q', '0'], ['page', '2']] | [['q', '0'], ['page', '2']] | Passed |
| debug-exclusion scenario 5 | [['page', '0'], ['tag', 'x']] | [['page', '0'], ['tag', 'x']] | Passed |
| debug-exclusion scenario 6 | [['q', 'a'], ['q', 'b']] | [['q', 'a'], ['q', 'b']] | Passed |
| explicit-query-key-set scenario 1 | ['q', 'tag'] | ['q', 'tag'] | Passed |
| explicit-query-key-set scenario 2 | ['q'] | ['q'] | Passed |
| explicit-query-key-set scenario 3 | [] | [] | Passed |
| explicit-query-key-set scenario 4 | ['debug', 'page', 'q'] | ['debug', 'page', 'q'] | Passed |
| explicit-query-key-set scenario 5 | ['page', 'tag'] | ['page', 'tag'] | Passed |
| explicit-query-key-set scenario 6 | ['q'] | ['q'] | Passed |
| navigation-fragment-key scenario 1 | ['/a/1', 'part'] | ['/a/1', 'part'] | Passed |
| navigation-fragment-key scenario 2 | ['/a', ''] | ['/a', ''] | Passed |
| navigation-fragment-key scenario 3 | ['/a', None] | ['/a', None] | Passed |
| navigation-fragment-key scenario 4 | ['/b', 'x'] | ['/b', 'x'] | Passed |
| navigation-fragment-key scenario 5 | ['/a', None] | ['/a', None] | Passed |
| navigation-fragment-key scenario 6 | ['/b', 'end'] | ['/b', 'end'] | Passed |
SHA-256 / 1a78d7a80084f9a15b071a9eb9b33a3a4132ed2d8b86308dca475b552d21af0f
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(operation, s):
pairs, defaults, route, fragment = s
if operation == 'repeated-values-retention':
return [v for k,v in pairs if k=='tag'][:1]
if operation == 'empty-query-value':
return next((v for k,v in pairs if k=='q'),defaults.get('q'))
if operation == 'query-default-merge':
return {**defaults,**dict(pairs)}
if operation == 'fragment-null-preservation':
return fragment if fragment is not None else 'absent'
if operation == 'state-cache-key':
return (route,tuple(pairs))
if operation == 'remove-one-query-name':
return [(k,v) for k,v in pairs if k!='q']
if operation == 'first-value-precedence':
return next((v for k,v in pairs if k=='q'),None)
if operation == 'debug-exclusion':
return [(k,v) for k,v in pairs if k!='debug']
if operation == 'explicit-query-key-set':
return sorted({k for k,v in pairs})
if operation == 'navigation-fragment-key':
return (route,fragment)
raise ValueError('unknown modeled operation')
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('repeated-values-retention scenario 1', solve('repeated-values-retention', ([('q','a'),('tag','x'),('tag','y')],{'q':'default'},'/a/'+str(N),'part')), ['x','y'])
check('repeated-values-retention scenario 2', solve('repeated-values-retention', ([('q','')],{'q':'default'},'/a','')), [])
check('repeated-values-retention scenario 3', solve('repeated-values-retention', ([] ,{'q':'default','page':'1'},'/a',None)), [])
check('repeated-values-retention scenario 4', solve('repeated-values-retention', ([('q','0'),('page','2'),('debug','1')],{'q':'default'},'/b','x')), [])
check('repeated-values-retention scenario 5', solve('repeated-values-retention', ([('page','0'),('tag','x')],{},'/a',None)), ['x'])
check('repeated-values-retention scenario 6', solve('repeated-values-retention', ([('q','a'),('q','b')],{},'/b','end')), [])
check('empty-query-value scenario 1', solve('empty-query-value', ([('q','a'),('tag','x'),('tag','y')],{'q':'default'},'/a/'+str(N),'part')), 'a')
check('empty-query-value scenario 2', solve('empty-query-value', ([('q','')],{'q':'default'},'/a','')), '')
check('empty-query-value scenario 3', solve('empty-query-value', ([] ,{'q':'default','page':'1'},'/a',None)), 'default')
check('empty-query-value scenario 4', solve('empty-query-value', ([('q','0'),('page','2'),('debug','1')],{'q':'default'},'/b','x')), '0')
check('empty-query-value scenario 5', solve('empty-query-value', ([('page','0'),('tag','x')],{},'/a',None)), None)
check('empty-query-value scenario 6', solve('empty-query-value', ([('q','a'),('q','b')],{},'/b','end')), 'a')
check('query-default-merge scenario 1', solve('query-default-merge', ([('q','a'),('tag','x'),('tag','y')],{'q':'default'},'/a/'+str(N),'part')), {'q':'a','tag':'y'})
check('query-default-merge scenario 2', solve('query-default-merge', ([('q','')],{'q':'default'},'/a','')), {'q':''})
check('query-default-merge scenario 3', solve('query-default-merge', ([] ,{'q':'default','page':'1'},'/a',None)), {'q':'default','page':'1'})
check('query-default-merge scenario 4', solve('query-default-merge', ([('q','0'),('page','2'),('debug','1')],{'q':'default'},'/b','x')), {'q':'0','page':'2','debug':'1'})
check('query-default-merge scenario 5', solve('query-default-merge', ([('page','0'),('tag','x')],{},'/a',None)), {'page':'0','tag':'x'})
check('query-default-merge scenario 6', solve('query-default-merge', ([('q','a'),('q','b')],{},'/b','end')), {'q':'b'})
check('fragment-null-preservation scenario 1', solve('fragment-null-preservation', ([('q','a'),('tag','x'),('tag','y')],{'q':'default'},'/a/'+str(N),'part')), 'part')
check('fragment-null-preservation scenario 2', solve('fragment-null-preservation', ([('q','')],{'q':'default'},'/a','')), '')
check('fragment-null-preservation scenario 3', solve('fragment-null-preservation', ([] ,{'q':'default','page':'1'},'/a',None)), 'absent')
check('fragment-null-preservation scenario 4', solve('fragment-null-preservation', ([('q','0'),('page','2'),('debug','1')],{'q':'default'},'/b','x')), 'x')
check('fragment-null-preservation scenario 5', solve('fragment-null-preservation', ([('page','0'),('tag','x')],{},'/a',None)), 'absent')
check('fragment-null-preservation scenario 6', solve('fragment-null-preservation', ([('q','a'),('q','b')],{},'/b','end')), 'end')
check('state-cache-key scenario 1', solve('state-cache-key', ([('q','a'),('tag','x'),('tag','y')],{'q':'default'},'/a/'+str(N),'part')), ('/a/'+str(N),(('q','a'),('tag','x'),('tag','y'))))
check('state-cache-key scenario 2', solve('state-cache-key', ([('q','')],{'q':'default'},'/a','')), ('/a',(('q',''),)))
check('state-cache-key scenario 3', solve('state-cache-key', ([] ,{'q':'default','page':'1'},'/a',None)), ('/a',()))
check('state-cache-key scenario 4', solve('state-cache-key', ([('q','0'),('page','2'),('debug','1')],{'q':'default'},'/b','x')), ('/b',(('q','0'),('page','2'),('debug','1'))))
check('state-cache-key scenario 5', solve('state-cache-key', ([('page','0'),('tag','x')],{},'/a',None)), ('/a',(('page','0'),('tag','x'))))
check('state-cache-key scenario 6', solve('state-cache-key', ([('q','a'),('q','b')],{},'/b','end')), ('/b',(('q','a'),('q','b'))))
check('remove-one-query-name scenario 1', solve('remove-one-query-name', ([('q','a'),('tag','x'),('tag','y')],{'q':'default'},'/a/'+str(N),'part')), [('tag','x'),('tag','y')])
check('remove-one-query-name scenario 2', solve('remove-one-query-name', ([('q','')],{'q':'default'},'/a','')), [])
check('remove-one-query-name scenario 3', solve('remove-one-query-name', ([] ,{'q':'default','page':'1'},'/a',None)), [])
check('remove-one-query-name scenario 4', solve('remove-one-query-name', ([('q','0'),('page','2'),('debug','1')],{'q':'default'},'/b','x')), [('page','2'),('debug','1')])
check('remove-one-query-name scenario 5', solve('remove-one-query-name', ([('page','0'),('tag','x')],{},'/a',None)), [('page','0'),('tag','x')])
check('remove-one-query-name scenario 6', solve('remove-one-query-name', ([('q','a'),('q','b')],{},'/b','end')), [])
check('first-value-precedence scenario 1', solve('first-value-precedence', ([('q','a'),('tag','x'),('tag','y')],{'q':'default'},'/a/'+str(N),'part')), 'a')
check('first-value-precedence scenario 2', solve('first-value-precedence', ([('q','')],{'q':'default'},'/a','')), '')
check('first-value-precedence scenario 3', solve('first-value-precedence', ([] ,{'q':'default','page':'1'},'/a',None)), None)
check('first-value-precedence scenario 4', solve('first-value-precedence', ([('q','0'),('page','2'),('debug','1')],{'q':'default'},'/b','x')), '0')
check('first-value-precedence scenario 5', solve('first-value-precedence', ([('page','0'),('tag','x')],{},'/a',None)), None)
check('first-value-precedence scenario 6', solve('first-value-precedence', ([('q','a'),('q','b')],{},'/b','end')), 'a')
check('debug-exclusion scenario 1', solve('debug-exclusion', ([('q','a'),('tag','x'),('tag','y')],{'q':'default'},'/a/'+str(N),'part')), [('q','a'),('tag','x'),('tag','y')])
check('debug-exclusion scenario 2', solve('debug-exclusion', ([('q','')],{'q':'default'},'/a','')), [('q','')])
check('debug-exclusion scenario 3', solve('debug-exclusion', ([] ,{'q':'default','page':'1'},'/a',None)), [])
check('debug-exclusion scenario 4', solve('debug-exclusion', ([('q','0'),('page','2'),('debug','1')],{'q':'default'},'/b','x')), [('q','0'),('page','2')])
check('debug-exclusion scenario 5', solve('debug-exclusion', ([('page','0'),('tag','x')],{},'/a',None)), [('page','0'),('tag','x')])
check('debug-exclusion scenario 6', solve('debug-exclusion', ([('q','a'),('q','b')],{},'/b','end')), [('q','a'),('q','b')])
check('explicit-query-key-set scenario 1', solve('explicit-query-key-set', ([('q','a'),('tag','x'),('tag','y')],{'q':'default'},'/a/'+str(N),'part')), ['q','tag'])
check('explicit-query-key-set scenario 2', solve('explicit-query-key-set', ([('q','')],{'q':'default'},'/a','')), ['q'])
check('explicit-query-key-set scenario 3', solve('explicit-query-key-set', ([] ,{'q':'default','page':'1'},'/a',None)), [])
check('explicit-query-key-set scenario 4', solve('explicit-query-key-set', ([('q','0'),('page','2'),('debug','1')],{'q':'default'},'/b','x')), ['debug','page','q'])
check('explicit-query-key-set scenario 5', solve('explicit-query-key-set', ([('page','0'),('tag','x')],{},'/a',None)), ['page','tag'])
check('explicit-query-key-set scenario 6', solve('explicit-query-key-set', ([('q','a'),('q','b')],{},'/b','end')), ['q'])
check('navigation-fragment-key scenario 1', solve('navigation-fragment-key', ([('q','a'),('tag','x'),('tag','y')],{'q':'default'},'/a/'+str(N),'part')), ('/a/'+str(N),'part'))
check('navigation-fragment-key scenario 2', solve('navigation-fragment-key', ([('q','')],{'q':'default'},'/a','')), ('/a',''))
check('navigation-fragment-key scenario 3', solve('navigation-fragment-key', ([] ,{'q':'default','page':'1'},'/a',None)), ('/a',None))
check('navigation-fragment-key scenario 4', solve('navigation-fragment-key', ([('q','0'),('page','2'),('debug','1')],{'q':'default'},'/b','x')), ('/b','x'))
check('navigation-fragment-key scenario 5', solve('navigation-fragment-key', ([('page','0'),('tag','x')],{},'/a',None)), ('/a',None))
check('navigation-fragment-key scenario 6', solve('navigation-fragment-key', ([('q','a'),('q','b')],{},'/b','end')), ('/b','end'))
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 |
|---|---|---|---|
| repeated-values-retention scenario 1 | ['x'] | ['x', 'y'] | Failed |
| repeated-values-retention scenario 2 | [] | [] | Passed |
| repeated-values-retention scenario 3 | [] | [] | Passed |
| repeated-values-retention scenario 4 | [] | [] | Passed |
| repeated-values-retention scenario 5 | ['x'] | ['x'] | Passed |
| repeated-values-retention scenario 6 | [] | [] | Passed |
| empty-query-value scenario 1 | a | a | Passed |
| empty-query-value scenario 2 | | | Passed |
| empty-query-value scenario 3 | default | default | Passed |
| empty-query-value scenario 4 | 0 | 0 | Passed |
| empty-query-value scenario 5 | None | None | Passed |
| empty-query-value scenario 6 | a | a | Passed |
| query-default-merge scenario 1 | {'q': 'a', 'tag': 'y'} | {'q': 'a', 'tag': 'y'} | Passed |
| query-default-merge scenario 2 | {'q': ''} | {'q': ''} | Passed |
| query-default-merge scenario 3 | {'page': '1', 'q': 'default'} | {'page': '1', 'q': 'default'} | Passed |
| query-default-merge scenario 4 | {'debug': '1', 'page': '2', 'q': '0'} | {'debug': '1', 'page': '2', 'q': '0'} | Passed |
| query-default-merge scenario 5 | {'page': '0', 'tag': 'x'} | {'page': '0', 'tag': 'x'} | Passed |
| query-default-merge scenario 6 | {'q': 'b'} | {'q': 'b'} | Passed |
| fragment-null-preservation scenario 1 | part | part | Passed |
| fragment-null-preservation scenario 2 | | | Passed |
| fragment-null-preservation scenario 3 | absent | absent | Passed |
| fragment-null-preservation scenario 4 | x | x | Passed |
| fragment-null-preservation scenario 5 | absent | absent | Passed |
| fragment-null-preservation scenario 6 | end | end | Passed |
| state-cache-key scenario 1 | ['/a/1', [['q', 'a'], ['tag', 'x'], ['tag', 'y']]] | ['/a/1', [['q', 'a'], ['tag', 'x'], ['tag', 'y']]] | Passed |
| state-cache-key scenario 2 | ['/a', [['q', '']]] | ['/a', [['q', '']]] | Passed |
| state-cache-key scenario 3 | ['/a', []] | ['/a', []] | Passed |
| state-cache-key scenario 4 | ['/b', [['q', '0'], ['page', '2'], ['debug', '1']]] | ['/b', [['q', '0'], ['page', '2'], ['debug', '1']]] | Passed |
| state-cache-key scenario 5 | ['/a', [['page', '0'], ['tag', 'x']]] | ['/a', [['page', '0'], ['tag', 'x']]] | Passed |
| state-cache-key scenario 6 | ['/b', [['q', 'a'], ['q', 'b']]] | ['/b', [['q', 'a'], ['q', 'b']]] | Passed |
| remove-one-query-name scenario 1 | [['tag', 'x'], ['tag', 'y']] | [['tag', 'x'], ['tag', 'y']] | Passed |
| remove-one-query-name scenario 2 | [] | [] | Passed |
| remove-one-query-name scenario 3 | [] | [] | Passed |
| remove-one-query-name scenario 4 | [['page', '2'], ['debug', '1']] | [['page', '2'], ['debug', '1']] | Passed |
| remove-one-query-name scenario 5 | [['page', '0'], ['tag', 'x']] | [['page', '0'], ['tag', 'x']] | Passed |
| remove-one-query-name scenario 6 | [] | [] | Passed |
| first-value-precedence scenario 1 | a | a | Passed |
| first-value-precedence scenario 2 | | | Passed |
| first-value-precedence scenario 3 | None | None | Passed |
| first-value-precedence scenario 4 | 0 | 0 | Passed |
| first-value-precedence scenario 5 | None | None | Passed |
| first-value-precedence scenario 6 | a | a | Passed |
| debug-exclusion scenario 1 | [['q', 'a'], ['tag', 'x'], ['tag', 'y']] | [['q', 'a'], ['tag', 'x'], ['tag', 'y']] | Passed |
| debug-exclusion scenario 2 | [['q', '']] | [['q', '']] | Passed |
| debug-exclusion scenario 3 | [] | [] | Passed |
| debug-exclusion scenario 4 | [['q', '0'], ['page', '2']] | [['q', '0'], ['page', '2']] | Passed |
| debug-exclusion scenario 5 | [['page', '0'], ['tag', 'x']] | [['page', '0'], ['tag', 'x']] | Passed |
| debug-exclusion scenario 6 | [['q', 'a'], ['q', 'b']] | [['q', 'a'], ['q', 'b']] | Passed |
| explicit-query-key-set scenario 1 | ['q', 'tag'] | ['q', 'tag'] | Passed |
| explicit-query-key-set scenario 2 | ['q'] | ['q'] | Passed |
| explicit-query-key-set scenario 3 | [] | [] | Passed |
| explicit-query-key-set scenario 4 | ['debug', 'page', 'q'] | ['debug', 'page', 'q'] | Passed |
| explicit-query-key-set scenario 5 | ['page', 'tag'] | ['page', 'tag'] | Passed |
| explicit-query-key-set scenario 6 | ['q'] | ['q'] | Passed |
| navigation-fragment-key scenario 1 | ['/a/1', 'part'] | ['/a/1', 'part'] | Passed |
| navigation-fragment-key scenario 2 | ['/a', ''] | ['/a', ''] | Passed |
| navigation-fragment-key scenario 3 | ['/a', None] | ['/a', None] | Passed |
| navigation-fragment-key scenario 4 | ['/b', 'x'] | ['/b', 'x'] | Passed |
| navigation-fragment-key scenario 5 | ['/a', None] | ['/a', None] | Passed |
| navigation-fragment-key scenario 6 | ['/b', 'end'] | ['/b', 'end'] | Passed |
SHA-256 / 846852ffe56580a3a9deea738b2deabc89a1c6d017d353a12a623d4f36bd1658
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(operation, s):
pairs, defaults, route, fragment = s
if operation == 'repeated-values-retention':
return [v for k,v in pairs if k=='tag']
if operation == 'empty-query-value':
return next((v for k,v in pairs if k=='q'),defaults.get('q'))
if operation == 'query-default-merge':
return {**defaults,**dict(pairs)}
if operation == 'fragment-null-preservation':
return fragment if fragment is not None else 'absent'
if operation == 'state-cache-key':
return (route,tuple(pairs))
if operation == 'remove-one-query-name':
return [(k,v) for k,v in pairs if k!='q']
if operation == 'first-value-precedence':
return next((v for k,v in pairs if k=='q'),None)
if operation == 'debug-exclusion':
return [(k,v) for k,v in pairs if k!='debug']
if operation == 'explicit-query-key-set':
return sorted({k for k,v in pairs})
if operation == 'navigation-fragment-key':
return (route,fragment)
raise ValueError('unknown modeled operation')
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('repeated-values-retention scenario 1', solve('repeated-values-retention', ([('q','a'),('tag','x'),('tag','y')],{'q':'default'},'/a/'+str(N),'part')), ['x','y'])
check('repeated-values-retention scenario 2', solve('repeated-values-retention', ([('q','')],{'q':'default'},'/a','')), [])
check('repeated-values-retention scenario 3', solve('repeated-values-retention', ([] ,{'q':'default','page':'1'},'/a',None)), [])
check('repeated-values-retention scenario 4', solve('repeated-values-retention', ([('q','0'),('page','2'),('debug','1')],{'q':'default'},'/b','x')), [])
check('repeated-values-retention scenario 5', solve('repeated-values-retention', ([('page','0'),('tag','x')],{},'/a',None)), ['x'])
check('repeated-values-retention scenario 6', solve('repeated-values-retention', ([('q','a'),('q','b')],{},'/b','end')), [])
check('empty-query-value scenario 1', solve('empty-query-value', ([('q','a'),('tag','x'),('tag','y')],{'q':'default'},'/a/'+str(N),'part')), 'a')
check('empty-query-value scenario 2', solve('empty-query-value', ([('q','')],{'q':'default'},'/a','')), '')
check('empty-query-value scenario 3', solve('empty-query-value', ([] ,{'q':'default','page':'1'},'/a',None)), 'default')
check('empty-query-value scenario 4', solve('empty-query-value', ([('q','0'),('page','2'),('debug','1')],{'q':'default'},'/b','x')), '0')
check('empty-query-value scenario 5', solve('empty-query-value', ([('page','0'),('tag','x')],{},'/a',None)), None)
check('empty-query-value scenario 6', solve('empty-query-value', ([('q','a'),('q','b')],{},'/b','end')), 'a')
check('query-default-merge scenario 1', solve('query-default-merge', ([('q','a'),('tag','x'),('tag','y')],{'q':'default'},'/a/'+str(N),'part')), {'q':'a','tag':'y'})
check('query-default-merge scenario 2', solve('query-default-merge', ([('q','')],{'q':'default'},'/a','')), {'q':''})
check('query-default-merge scenario 3', solve('query-default-merge', ([] ,{'q':'default','page':'1'},'/a',None)), {'q':'default','page':'1'})
check('query-default-merge scenario 4', solve('query-default-merge', ([('q','0'),('page','2'),('debug','1')],{'q':'default'},'/b','x')), {'q':'0','page':'2','debug':'1'})
check('query-default-merge scenario 5', solve('query-default-merge', ([('page','0'),('tag','x')],{},'/a',None)), {'page':'0','tag':'x'})
check('query-default-merge scenario 6', solve('query-default-merge', ([('q','a'),('q','b')],{},'/b','end')), {'q':'b'})
check('fragment-null-preservation scenario 1', solve('fragment-null-preservation', ([('q','a'),('tag','x'),('tag','y')],{'q':'default'},'/a/'+str(N),'part')), 'part')
check('fragment-null-preservation scenario 2', solve('fragment-null-preservation', ([('q','')],{'q':'default'},'/a','')), '')
check('fragment-null-preservation scenario 3', solve('fragment-null-preservation', ([] ,{'q':'default','page':'1'},'/a',None)), 'absent')
check('fragment-null-preservation scenario 4', solve('fragment-null-preservation', ([('q','0'),('page','2'),('debug','1')],{'q':'default'},'/b','x')), 'x')
check('fragment-null-preservation scenario 5', solve('fragment-null-preservation', ([('page','0'),('tag','x')],{},'/a',None)), 'absent')
check('fragment-null-preservation scenario 6', solve('fragment-null-preservation', ([('q','a'),('q','b')],{},'/b','end')), 'end')
check('state-cache-key scenario 1', solve('state-cache-key', ([('q','a'),('tag','x'),('tag','y')],{'q':'default'},'/a/'+str(N),'part')), ('/a/'+str(N),(('q','a'),('tag','x'),('tag','y'))))
check('state-cache-key scenario 2', solve('state-cache-key', ([('q','')],{'q':'default'},'/a','')), ('/a',(('q',''),)))
check('state-cache-key scenario 3', solve('state-cache-key', ([] ,{'q':'default','page':'1'},'/a',None)), ('/a',()))
check('state-cache-key scenario 4', solve('state-cache-key', ([('q','0'),('page','2'),('debug','1')],{'q':'default'},'/b','x')), ('/b',(('q','0'),('page','2'),('debug','1'))))
check('state-cache-key scenario 5', solve('state-cache-key', ([('page','0'),('tag','x')],{},'/a',None)), ('/a',(('page','0'),('tag','x'))))
check('state-cache-key scenario 6', solve('state-cache-key', ([('q','a'),('q','b')],{},'/b','end')), ('/b',(('q','a'),('q','b'))))
check('remove-one-query-name scenario 1', solve('remove-one-query-name', ([('q','a'),('tag','x'),('tag','y')],{'q':'default'},'/a/'+str(N),'part')), [('tag','x'),('tag','y')])
check('remove-one-query-name scenario 2', solve('remove-one-query-name', ([('q','')],{'q':'default'},'/a','')), [])
check('remove-one-query-name scenario 3', solve('remove-one-query-name', ([] ,{'q':'default','page':'1'},'/a',None)), [])
check('remove-one-query-name scenario 4', solve('remove-one-query-name', ([('q','0'),('page','2'),('debug','1')],{'q':'default'},'/b','x')), [('page','2'),('debug','1')])
check('remove-one-query-name scenario 5', solve('remove-one-query-name', ([('page','0'),('tag','x')],{},'/a',None)), [('page','0'),('tag','x')])
check('remove-one-query-name scenario 6', solve('remove-one-query-name', ([('q','a'),('q','b')],{},'/b','end')), [])
check('first-value-precedence scenario 1', solve('first-value-precedence', ([('q','a'),('tag','x'),('tag','y')],{'q':'default'},'/a/'+str(N),'part')), 'a')
check('first-value-precedence scenario 2', solve('first-value-precedence', ([('q','')],{'q':'default'},'/a','')), '')
check('first-value-precedence scenario 3', solve('first-value-precedence', ([] ,{'q':'default','page':'1'},'/a',None)), None)
check('first-value-precedence scenario 4', solve('first-value-precedence', ([('q','0'),('page','2'),('debug','1')],{'q':'default'},'/b','x')), '0')
check('first-value-precedence scenario 5', solve('first-value-precedence', ([('page','0'),('tag','x')],{},'/a',None)), None)
check('first-value-precedence scenario 6', solve('first-value-precedence', ([('q','a'),('q','b')],{},'/b','end')), 'a')
check('debug-exclusion scenario 1', solve('debug-exclusion', ([('q','a'),('tag','x'),('tag','y')],{'q':'default'},'/a/'+str(N),'part')), [('q','a'),('tag','x'),('tag','y')])
check('debug-exclusion scenario 2', solve('debug-exclusion', ([('q','')],{'q':'default'},'/a','')), [('q','')])
check('debug-exclusion scenario 3', solve('debug-exclusion', ([] ,{'q':'default','page':'1'},'/a',None)), [])
check('debug-exclusion scenario 4', solve('debug-exclusion', ([('q','0'),('page','2'),('debug','1')],{'q':'default'},'/b','x')), [('q','0'),('page','2')])
check('debug-exclusion scenario 5', solve('debug-exclusion', ([('page','0'),('tag','x')],{},'/a',None)), [('page','0'),('tag','x')])
check('debug-exclusion scenario 6', solve('debug-exclusion', ([('q','a'),('q','b')],{},'/b','end')), [('q','a'),('q','b')])
check('explicit-query-key-set scenario 1', solve('explicit-query-key-set', ([('q','a'),('tag','x'),('tag','y')],{'q':'default'},'/a/'+str(N),'part')), ['q','tag'])
check('explicit-query-key-set scenario 2', solve('explicit-query-key-set', ([('q','')],{'q':'default'},'/a','')), ['q'])
check('explicit-query-key-set scenario 3', solve('explicit-query-key-set', ([] ,{'q':'default','page':'1'},'/a',None)), [])
check('explicit-query-key-set scenario 4', solve('explicit-query-key-set', ([('q','0'),('page','2'),('debug','1')],{'q':'default'},'/b','x')), ['debug','page','q'])
check('explicit-query-key-set scenario 5', solve('explicit-query-key-set', ([('page','0'),('tag','x')],{},'/a',None)), ['page','tag'])
check('explicit-query-key-set scenario 6', solve('explicit-query-key-set', ([('q','a'),('q','b')],{},'/b','end')), ['q'])
check('navigation-fragment-key scenario 1', solve('navigation-fragment-key', ([('q','a'),('tag','x'),('tag','y')],{'q':'default'},'/a/'+str(N),'part')), ('/a/'+str(N),'part'))
check('navigation-fragment-key scenario 2', solve('navigation-fragment-key', ([('q','')],{'q':'default'},'/a','')), ('/a',''))
check('navigation-fragment-key scenario 3', solve('navigation-fragment-key', ([] ,{'q':'default','page':'1'},'/a',None)), ('/a',None))
check('navigation-fragment-key scenario 4', solve('navigation-fragment-key', ([('q','0'),('page','2'),('debug','1')],{'q':'default'},'/b','x')), ('/b','x'))
check('navigation-fragment-key scenario 5', solve('navigation-fragment-key', ([('page','0'),('tag','x')],{},'/a',None)), ('/a',None))
check('navigation-fragment-key scenario 6', solve('navigation-fragment-key', ([('q','a'),('q','b')],{},'/b','end')), ('/b','end'))
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 |
|---|---|---|---|
| repeated-values-retention scenario 1 | ['x', 'y'] | ['x', 'y'] | Passed |
| repeated-values-retention scenario 2 | [] | [] | Passed |
| repeated-values-retention scenario 3 | [] | [] | Passed |
| repeated-values-retention scenario 4 | [] | [] | Passed |
| repeated-values-retention scenario 5 | ['x'] | ['x'] | Passed |
| repeated-values-retention scenario 6 | [] | [] | Passed |
| empty-query-value scenario 1 | a | a | Passed |
| empty-query-value scenario 2 | | | Passed |
| empty-query-value scenario 3 | default | default | Passed |
| empty-query-value scenario 4 | 0 | 0 | Passed |
| empty-query-value scenario 5 | None | None | Passed |
| empty-query-value scenario 6 | a | a | Passed |
| query-default-merge scenario 1 | {'q': 'a', 'tag': 'y'} | {'q': 'a', 'tag': 'y'} | Passed |
| query-default-merge scenario 2 | {'q': ''} | {'q': ''} | Passed |
| query-default-merge scenario 3 | {'page': '1', 'q': 'default'} | {'page': '1', 'q': 'default'} | Passed |
| query-default-merge scenario 4 | {'debug': '1', 'page': '2', 'q': '0'} | {'debug': '1', 'page': '2', 'q': '0'} | Passed |
| query-default-merge scenario 5 | {'page': '0', 'tag': 'x'} | {'page': '0', 'tag': 'x'} | Passed |
| query-default-merge scenario 6 | {'q': 'b'} | {'q': 'b'} | Passed |
| fragment-null-preservation scenario 1 | part | part | Passed |
| fragment-null-preservation scenario 2 | | | Passed |
| fragment-null-preservation scenario 3 | absent | absent | Passed |
| fragment-null-preservation scenario 4 | x | x | Passed |
| fragment-null-preservation scenario 5 | absent | absent | Passed |
| fragment-null-preservation scenario 6 | end | end | Passed |
| state-cache-key scenario 1 | ['/a/1', [['q', 'a'], ['tag', 'x'], ['tag', 'y']]] | ['/a/1', [['q', 'a'], ['tag', 'x'], ['tag', 'y']]] | Passed |
| state-cache-key scenario 2 | ['/a', [['q', '']]] | ['/a', [['q', '']]] | Passed |
| state-cache-key scenario 3 | ['/a', []] | ['/a', []] | Passed |
| state-cache-key scenario 4 | ['/b', [['q', '0'], ['page', '2'], ['debug', '1']]] | ['/b', [['q', '0'], ['page', '2'], ['debug', '1']]] | Passed |
| state-cache-key scenario 5 | ['/a', [['page', '0'], ['tag', 'x']]] | ['/a', [['page', '0'], ['tag', 'x']]] | Passed |
| state-cache-key scenario 6 | ['/b', [['q', 'a'], ['q', 'b']]] | ['/b', [['q', 'a'], ['q', 'b']]] | Passed |
| remove-one-query-name scenario 1 | [['tag', 'x'], ['tag', 'y']] | [['tag', 'x'], ['tag', 'y']] | Passed |
| remove-one-query-name scenario 2 | [] | [] | Passed |
| remove-one-query-name scenario 3 | [] | [] | Passed |
| remove-one-query-name scenario 4 | [['page', '2'], ['debug', '1']] | [['page', '2'], ['debug', '1']] | Passed |
| remove-one-query-name scenario 5 | [['page', '0'], ['tag', 'x']] | [['page', '0'], ['tag', 'x']] | Passed |
| remove-one-query-name scenario 6 | [] | [] | Passed |
| first-value-precedence scenario 1 | a | a | Passed |
| first-value-precedence scenario 2 | | | Passed |
| first-value-precedence scenario 3 | None | None | Passed |
| first-value-precedence scenario 4 | 0 | 0 | Passed |
| first-value-precedence scenario 5 | None | None | Passed |
| first-value-precedence scenario 6 | a | a | Passed |
| debug-exclusion scenario 1 | [['q', 'a'], ['tag', 'x'], ['tag', 'y']] | [['q', 'a'], ['tag', 'x'], ['tag', 'y']] | Passed |
| debug-exclusion scenario 2 | [['q', '']] | [['q', '']] | Passed |
| debug-exclusion scenario 3 | [] | [] | Passed |
| debug-exclusion scenario 4 | [['q', '0'], ['page', '2']] | [['q', '0'], ['page', '2']] | Passed |
| debug-exclusion scenario 5 | [['page', '0'], ['tag', 'x']] | [['page', '0'], ['tag', 'x']] | Passed |
| debug-exclusion scenario 6 | [['q', 'a'], ['q', 'b']] | [['q', 'a'], ['q', 'b']] | Passed |
| explicit-query-key-set scenario 1 | ['q', 'tag'] | ['q', 'tag'] | Passed |
| explicit-query-key-set scenario 2 | ['q'] | ['q'] | Passed |
| explicit-query-key-set scenario 3 | [] | [] | Passed |
| explicit-query-key-set scenario 4 | ['debug', 'page', 'q'] | ['debug', 'page', 'q'] | Passed |
| explicit-query-key-set scenario 5 | ['page', 'tag'] | ['page', 'tag'] | Passed |
| explicit-query-key-set scenario 6 | ['q'] | ['q'] | Passed |
| navigation-fragment-key scenario 1 | ['/a/1', 'part'] | ['/a/1', 'part'] | Passed |
| navigation-fragment-key scenario 2 | ['/a', ''] | ['/a', ''] | Passed |
| navigation-fragment-key scenario 3 | ['/a', None] | ['/a', None] | Passed |
| navigation-fragment-key scenario 4 | ['/b', 'x'] | ['/b', 'x'] | Passed |
| navigation-fragment-key scenario 5 | ['/a', None] | ['/a', None] | Passed |
| navigation-fragment-key scenario 6 | ['/b', 'end'] | ['/b', 'end'] | Passed |
SHA-256 / 47a6968de86aa78ac2d2aa35b1b66c6c8a2f197cdd519430c5b6570b56782b57
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.943428+00:00.
Case digest / a636e67088afa1c05d93f7eb95b250c4da001e8d938901b1632aaa405b1f29d6