Hmbown/CodeWhale · error · SystemExit
app-icon blob not found in the founder sheet
Error message
app-icon blob not found in the founder sheet
What it means
icon_square in scripts/brand/braille-mark.py locates the largest connected navy blob in the founder sheet image (via flood fill) and raises SystemExit when the best blob is smaller than 10,000 pixels. This guard exists because the tool expects the app icon to be a large solid region; a smaller 'best' blob means the sheet was not found, changed color, or the icon was resized/replaced, so continuing would produce a corrupt crop.
Solutions
- Verify the correct founder-sheet image path is passed to the script
- Check the icon artwork still forms one large contiguous region of the expected color; merge split components or adjust the flood-fill color match
- Regenerate/restore the original founder sheet asset at its intended resolution
- If the icon is legitimately smaller, lower the 10_000 threshold deliberately in icon_square
Example fix
# before
if len(best) < 10_000:
raise SystemExit("app-icon blob not found in the founder sheet")
# after
if len(best) < 10_000:
print(f"largest blob only {len(best)} px; check sheet path/resolution")
raise SystemExit("app-icon blob not found in the founder sheet") Defensive patterns
Strategy: validation
Validate before calling
from PIL import Image
img = Image.open(path).convert("L")
navy_px = sum(1 for p in img.getdata() if p < 80)
assert navy_px >= 10_000, f"sheet has only {navy_px} navy px" Prevention
- Keep the founder sheet at a fixed canonical resolution and regenerate derived assets from it
- Add a CI check that runs icon_square against every rebrand PR
- Never hand-edit the sheet; export it from the design source each time
- Log blob size before the threshold check to speed diagnosis
When it happens
Trigger: Running braille-mark.py against a founder sheet image whose largest same-color connected component has fewer than 10,000 pixels — e.g. the icon artwork was changed, the sheet resolution was reduced, the icon color no longer matches the flood-fill target, or the wrong image path was passed so the biggest blob found is just a decorative element.
Common situations: Rebranding/redesigning the icon so its color or size no longer matches; downscaling the founder sheet; pointing the script at a placeholder or unrelated image; icon split into multiple smaller blobs by overlaid artwork (like the white whale cut) so no single component reaches the threshold.
Understand the failure class
Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.
Related errors
- app-icon blob has unexpected height
- could not locate PENDING_GROUPS in
- macOS builds require codesign to package Computer Use
- macOS builds require Xcode Command Line Tools to package…
- no navy hero whale found in the founder sheet
AI-assisted analysis of Hmbown/CodeWhale@433685b202 (2026-09-15).
Data as JSON: /api/errors/03a1362dcb61b603.
Report an issue: GitHub.
Appendix: source
Thrown at scripts/brand/braille-mark.py:155
continue
blob, stack = [], collections.deque([(sx, sy)])
seen[sy * width + sx] = 1
while stack:
x, y = stack.pop()
blob.append((x, y))
for nx, ny in ((x - 1, y), (x + 1, y), (x, y - 1), (x, y + 1)):
if (
x0 <= nx < x1
and y0 <= ny < y1
and not seen[ny * width + nx]
and is_navy(pixels[nx, ny])
):
seen[ny * width + nx] = 1
stack.append((nx, ny))
if len(blob) > len(best):
best = blob
if len(best) < 10_000:
raise SystemExit("app-icon blob not found in the founder sheet")
bx0 = min(x for x, _ in best)
bx1 = max(x for x, _ in best)
by0 = min(y for _, y in best)
by1 = max(y for _, y in best)
# The white whale cuts the blob's left side, but its full height shows:
# the icon is square, so the edge is the height.
edge = by1 - by0 + 1
if not 150 <= edge <= 260:
raise SystemExit(f"app-icon blob has unexpected height: {edge}")
cx = (bx0 + bx1) // 2
cy = (by0 + by1) // 2
half = edge // 2 + ICON_PAD
box = (cx - half, cy - half, cx + half, cy + half)
print(
f"// app-icon navy blob x {bx0}-{bx1} y {by0}-{by1}, "
f"square crop {box[0]},{box[1]}-{box[2]},{box[3]}",
file=sys.stderr,
)View on GitHub (pinned to 433685b202)