FAILURE MAP
← Case archive

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.

Verified by executionVariant 1 · 6 checks per implementationDownload source bundle ↓JSON ↗

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 fixtureActualExpectedOutcome
empty formula strings01Failed
zero is occupied00Passed
false is occupied11Passed
space is occupied01Failed
empty range00Passed
mixed blanks12Failed

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 fixtureActualExpectedOutcome
empty formula strings11Passed
zero is occupied10Failed
false is occupied21Failed
space is occupied11Passed
empty range00Passed
mixed blanks22Passed

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 fixtureActualExpectedOutcome
empty formula strings11Passed
zero is occupied00Passed
false is occupied11Passed
space is occupied11Passed
empty range00Passed
mixed blanks22Passed

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