FA-8546 / Form submission / Open access
Submission state transitions: Server failure details never replace old error messages · case 01
Server failure details never replace old error messages.
ROOT CAUSE
The failure operation uses `if event == 'failure': return ('failed', errors)` where the contract requires `if event == 'failure': return ('failed', result)`.
VERIFIED REPAIR
Implement the failure operation as `if event == 'failure': return ('failed', result)`.
Unsuccessful approach: Marking a failed result successful misrepresents completion.
Case contract
A duplicate pending submit preserves pending; invalid submit retains errors; success clears errors; failure installs result errors; editing resets status and stale errors.
Why this case matters
A deterministic model of submission state transitions; this isolates one interface invariant without requiring a browser.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(state, errors, event, result):
if event == 'submit':
if state == 'submitting': return (state, errors)
if errors: return ('invalid', errors)
return ('submitting', {})
if event == 'success': return ('succeeded', {})
if event == 'failure': return ('failed', errors)
if event == 'edit': return ('idle', {})
return (state, errors)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('duplicate', solve('submitting', {}, 'submit', None), ('submitting', {}))
check('invalid', solve('idle', {'a':'required'}, 'submit', None), ('invalid', {'a': 'required'}))
check('valid', solve('idle', {}, 'submit', None), ('submitting', {}))
check('success', solve('submitting', {'old':'stale'}, 'success', None), ('succeeded', {}))
check('failure', solve('submitting', {'old':'stale'}, 'failure', {'a':'conflict'}), ('failed', {'a': 'conflict'}))
check('edit', solve('failed', {'a':'stale'}, 'edit', None), ('idle', {}))
check('parameterized failure details', solve('submitting', {}, 'failure', {'field':str(N)}), ('failed',{'field':str(N)}))
for repetition in range(N):
check('repeat edit', solve('failed', {'a':'stale'}, 'edit', None), ('idle', {}))
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 |
|---|---|---|---|
| duplicate | ['submitting', {}] | ['submitting', {}] | Passed |
| invalid | ['invalid', {'a': 'required'}] | ['invalid', {'a': 'required'}] | Passed |
| valid | ['submitting', {}] | ['submitting', {}] | Passed |
| success | ['succeeded', {}] | ['succeeded', {}] | Passed |
| failure | ['failed', {'old': 'stale'}] | ['failed', {'a': 'conflict'}] | Failed |
| edit | ['idle', {}] | ['idle', {}] | Passed |
| parameterized failure details | ['failed', {}] | ['failed', {'field': '1'}] | Failed |
| repeat edit | ['idle', {}] | ['idle', {}] | Passed |
SHA-256 / 619869370c48f348c0121bc042e6b3e1ffec916cf454500a499e3f53d62802c8
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(state, errors, event, result):
if event == 'submit':
if state == 'submitting': return (state, errors)
if errors: return ('invalid', errors)
return ('submitting', {})
if event == 'success': return ('succeeded', {})
if event == 'failure': return ('succeeded', result)
if event == 'edit': return ('idle', {})
return (state, errors)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('duplicate', solve('submitting', {}, 'submit', None), ('submitting', {}))
check('invalid', solve('idle', {'a':'required'}, 'submit', None), ('invalid', {'a': 'required'}))
check('valid', solve('idle', {}, 'submit', None), ('submitting', {}))
check('success', solve('submitting', {'old':'stale'}, 'success', None), ('succeeded', {}))
check('failure', solve('submitting', {'old':'stale'}, 'failure', {'a':'conflict'}), ('failed', {'a': 'conflict'}))
check('edit', solve('failed', {'a':'stale'}, 'edit', None), ('idle', {}))
check('parameterized failure details', solve('submitting', {}, 'failure', {'field':str(N)}), ('failed',{'field':str(N)}))
for repetition in range(N):
check('repeat edit', solve('failed', {'a':'stale'}, 'edit', None), ('idle', {}))
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 |
|---|---|---|---|
| duplicate | ['submitting', {}] | ['submitting', {}] | Passed |
| invalid | ['invalid', {'a': 'required'}] | ['invalid', {'a': 'required'}] | Passed |
| valid | ['submitting', {}] | ['submitting', {}] | Passed |
| success | ['succeeded', {}] | ['succeeded', {}] | Passed |
| failure | ['succeeded', {'a': 'conflict'}] | ['failed', {'a': 'conflict'}] | Failed |
| edit | ['idle', {}] | ['idle', {}] | Passed |
| parameterized failure details | ['succeeded', {'field': '1'}] | ['failed', {'field': '1'}] | Failed |
| repeat edit | ['idle', {}] | ['idle', {}] | Passed |
SHA-256 / 2a3a154d3e7a632e3e73fd2891345e99a61e0d8c2af5528a84754230fa6cace3
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(state, errors, event, result):
if event == 'submit':
if state == 'submitting': return (state, errors)
if errors: return ('invalid', errors)
return ('submitting', {})
if event == 'success': return ('succeeded', {})
if event == 'failure': return ('failed', result)
if event == 'edit': return ('idle', {})
return (state, errors)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('duplicate', solve('submitting', {}, 'submit', None), ('submitting', {}))
check('invalid', solve('idle', {'a':'required'}, 'submit', None), ('invalid', {'a': 'required'}))
check('valid', solve('idle', {}, 'submit', None), ('submitting', {}))
check('success', solve('submitting', {'old':'stale'}, 'success', None), ('succeeded', {}))
check('failure', solve('submitting', {'old':'stale'}, 'failure', {'a':'conflict'}), ('failed', {'a': 'conflict'}))
check('edit', solve('failed', {'a':'stale'}, 'edit', None), ('idle', {}))
check('parameterized failure details', solve('submitting', {}, 'failure', {'field':str(N)}), ('failed',{'field':str(N)}))
for repetition in range(N):
check('repeat edit', solve('failed', {'a':'stale'}, 'edit', None), ('idle', {}))
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 |
|---|---|---|---|
| duplicate | ['submitting', {}] | ['submitting', {}] | Passed |
| invalid | ['invalid', {'a': 'required'}] | ['invalid', {'a': 'required'}] | Passed |
| valid | ['submitting', {}] | ['submitting', {}] | Passed |
| success | ['succeeded', {}] | ['succeeded', {}] | Passed |
| failure | ['failed', {'a': 'conflict'}] | ['failed', {'a': 'conflict'}] | Passed |
| edit | ['idle', {}] | ['idle', {}] | Passed |
| parameterized failure details | ['failed', {'field': '1'}] | ['failed', {'field': '1'}] | Passed |
| repeat edit | ['idle', {}] | ['idle', {}] | Passed |
SHA-256 / 5ad8ee64f343ea64fbbdd31ec11c45c4cc012cf35d29cd5f2de66069961cbd08
Verification & scope
This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.
Observations recorded using Python 3.12.14 at 2026-09-29T14:38:22.371386+00:00.
Case digest / 235690a53705b0f6dacd1ca005b4baf3682ce4cfeccf5779e1084c208cde54b6