FA-11351 / Spreadsheet calculation semantics / Open access
Blank counting confuses absent cells with empty formula results · case 01
Empty string results disappear from blank counts or zero values are counted as blank.
ROOT CAUSE
Blankness is represented by either identity with None or general falsiness.
VERIFIED REPAIR
Count None and empty strings explicitly.
Unsuccessful approach: Treating all false values as blank includes zero and FALSE.
Case contract
COUNTBLANK model counts None and empty string cells, including empty formula results; numeric zero, False and whitespace are not blank.
Why this case matters
This isolated spreadsheet model makes cell semantics explicit; it does not claim compatibility with every workbook engine.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(cells):
return sum(cell is None for cell in cells)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('empty formula strings', solve(['']*N), N)
check('zero is occupied', solve([0]*N), 0)
check('false is occupied', solve([False, None]), 1)
check('space is occupied', solve([' ', '']), 1)
check('empty range', solve([]), 0)
check('mixed blanks', solve([None, '', N, 'x']), 2)
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 |
|---|---|---|---|
| empty formula strings | 0 | 1 | Failed |
| zero is occupied | 0 | 0 | Passed |
| false is occupied | 1 | 1 | Passed |
| space is occupied | 0 | 1 | Failed |
| empty range | 0 | 0 | Passed |
| mixed blanks | 1 | 2 | Failed |
SHA-256 / efad2b8c0b86ae38aca256dfac4598279dcf44d432b2f426e14579fca5f4672d
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(cells):
return sum(not cell for cell in cells)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('empty formula strings', solve(['']*N), N)
check('zero is occupied', solve([0]*N), 0)
check('false is occupied', solve([False, None]), 1)
check('space is occupied', solve([' ', '']), 1)
check('empty range', solve([]), 0)
check('mixed blanks', solve([None, '', N, 'x']), 2)
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 |
|---|---|---|---|
| empty formula strings | 1 | 1 | Passed |
| zero is occupied | 1 | 0 | Failed |
| false is occupied | 2 | 1 | Failed |
| space is occupied | 1 | 1 | Passed |
| empty range | 0 | 0 | Passed |
| mixed blanks | 2 | 2 | Passed |
SHA-256 / 4afc0ca6a3b1eab35cc6381e14bb4c67fbe4452f0ce0d384f06f9a9dd95a7560
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(cells):
return sum(cell is None or (type(cell) is str and cell == '') for cell in cells)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('empty formula strings', solve(['']*N), N)
check('zero is occupied', solve([0]*N), 0)
check('false is occupied', solve([False, None]), 1)
check('space is occupied', solve([' ', '']), 1)
check('empty range', solve([]), 0)
check('mixed blanks', solve([None, '', N, 'x']), 2)
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 |
|---|---|---|---|
| empty formula strings | 1 | 1 | Passed |
| zero is occupied | 0 | 0 | Passed |
| false is occupied | 1 | 1 | Passed |
| space is occupied | 1 | 1 | Passed |
| empty range | 0 | 0 | Passed |
| mixed blanks | 2 | 2 | Passed |
SHA-256 / 526d9c7ffc3dbf72f5ea831666d77195535a320b8cebf6d8c29a6723d5de873b
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:47.191687+00:00.
Case digest / 4a03fa4fb3b932b6c983ddea1c08a4b89c3a56774b36fe813b01198810cd62fe