FA-8536 / Form submission / Open access
Submission state transitions: Invalid forms enter the submitting state · case 01
Invalid forms enter the submitting state.
ROOT CAUSE
The invalid operation uses `if errors: return ('submitting', errors)` where the contract requires `if errors: return ('invalid', errors)`.
VERIFIED REPAIR
Implement the invalid operation as `if errors: return ('invalid', errors)`.
Unsuccessful approach: Clearing errors prevents users locating validation failures.
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 ('submitting', 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 | ['submitting', {'a': 'required'}] | ['invalid', {'a': 'required'}] | Failed |
| 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 / 1c7862a52e15336746e4b4914d146e7e37aa1693395ed67969cf8c8541a5ce9c
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', {})
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', {}] | ['invalid', {'a': 'required'}] | Failed |
| 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 / 8e02f2b6557444e8f0e21b80239cdf6df7afa276e4f539d4103edff720c6efe2
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.189759+00:00.
Case digest / a89815add0e2dc8a8b3bea9fe4d6c3885d1b4770523abe33874c4fc235ce35c8