📋 What was this drill?

Drill: Empty states: 5 different empty states, each with what/why/next. No 'No data.' Target: each empty state teaches the user something.

Interpretation: Building 'Listenpost' — a wildlife conservancy acoustic/camera survey console where each of 5 empty states (first-run map, filtered-zero detections, scoped station sync error, partial classifier data, season complete) lives inside a different container grammar at production fidelity. Constraints: single violet accent, WCAG-clamped semantics with shape+color dual encoding, JS describe-first dataset with reconciling counts (14 otter detections in the 90-day counterfactual), and a state index deep-linked via location.hash. Aesthetic: warm paper field-console, Inter + JetBrains Mono, Stripe-dashboard restraint.

Kettle Marsh Conservancy · Field Season 2026
10 of 11 synced Sun Sep 21 · 06:40
STATE 01 · FIRST-RUN TRIGGER · 0 OF 11 STATIONS HAVE A LOCKED GPS FIX
no fix · 52.31°N 1.68°W 500 m
N 52.38°W 1.74°S 52.24°E 1.61°

No recorders plotted on the marsh yet

Eleven stations are registered in the season roster, but none has a locked GPS fix — deployment coordinates are what turn a recorder into a point on this map. The console is ready before the hardware is.

FIELD NOTE · A fix needs ≥4 satellites — lock it from the field app at the post, not from this console afterwards.
Lock first GPS fix Import station sheet (CSV) or read the deployment guide
STATE 03 · SCOPED ERROR TRIGGER · AU-04 SYNC FAILED ×2 · SD 64/64 GB
AU-04Lone Alder · acoustic
SYNC FAILED
Last good syncSep 20 · 02:14 (2 nights ago)
SD card61.4 / 64 GB · full
Buffer on device31.2 GB safe · not lost
Uptime (30d)96.2%

AU-04 stopped uploading two nights ago

The SD card filled at 64 GB. The recorder keeps listening, but nothing leaves the card until a sync succeeds — everything since Sep 20 is buffered on-device, not lost. This failure is scoped to one station; ten others synced on schedule.

Retry sync now Open maintenance ticket SD lifecycle docs · replacing takes ~4 min in the field
STATE 02 · FILTERED-ZERO TRIGGER · OTTER × LAST 30 DAYS × ALL STATIONS = 0 ROWS
SPECIESEurasian otter WINDOWLast 30 days SCOPEAll stations
TimeStationSpeciesConf.File

Zero otter detections in 30 days — and that's a result

Absence is data. Occupancy models consume the full detection matrix, zero-cells included — silence across 11 stations for a month is a finding about the marsh, not a broken query. The matrix row for otter just wrote itself.

WHY IT MATTERS · A zero here narrows the occupancy estimate exactly as a detection widens it.
STATE 04 · PARTIAL DATA TRIGGER · CLASSIFIER v4.2 RE-RUN PENDING ON 3 STATIONS
212 classified 48 pending re-run LAST 7 NIGHTS · ALL SPECIES

This week is three stations short of final

Hatched rows are provisional. Otter and water-rail recordings from AU-02, AU-07 and CFG-02 still carry classifier v4.1 labels; those two rows move when the v4.2 re-run lands tonight. The other six species are final.

Queue v4.2 re-run for tonight See what v4.1 vs v4.2 changes re-runs are free · they never touch raw audio
STATE 05 · SEASON COMPLETE TRIGGER · 214/214 NIGHTS · 0 GAPS

Season wrapped — 214 nights, zero gaps

Every station filled every night of the Mar 1 – Sep 21 window. The occupancy model can run on an unbroken matrix — no imputation, no gap-flagging. This is the dataset the season was for.

Nights214/214
Raw files18,204
Classified3,671
Species61
Export season report Preview occupancy model archive stays editable until Nov 1