__MK__tabaqat · StrataHealth & Humanitarian
Humanitarian Response Map — coverage against counted need

Which cells has nobody
reported covering?

A full-bleed extent scoreboard for one response. Pan or zoom and every numeral recomputes for the districts you can see. And the headline is not a delivery total — it is an absence, priced in people.

Afghanistan reference implementation · 4,812 sector × district cells · 430 assertions green On-prem snapshot · keyless basemaps · no runtime call leaves the network
© 2026 Tabaqat · Built on Strata — sovereign geospatial applications. Every figure is published OCHA data, joined at the p-code — nothing is generated. A geographic screen, not a certification.
The decision this drives

Where the next distribution goes, and which cluster to fund.

That decision is taken by an inter-cluster coordination group looking at the next allocation, and by a cluster lead deciding whether to call on partners to cover a cell or to cover it themselves. It is an operational read, taken this week — not a retrospective told to a funder at the end of a cycle.

Which is why the app is organised around the cell nobody reports covering, never around the delivery total. A 3W that celebrates what was delivered puts the busiest district at the top of every reading ever taken. The cluster lead already knows where their partners are. They are paid to find where nobody is.

Buyer: response coordinator · cluster lead Frame: 3W — who does what where IASC provider of last resort · JIAF 2.0 · COD p-codes
267of 4,812 sector × district cells carry counted people in need and zero organisations reporting presence

2,414 cells are covered. The map is mostly green — and the map being mostly green is exactly the problem. The product is the 267.

The largest single one: Yakawlang, Bamyan — 77,634 people counted in need for Health, and no organisation reporting a health activity there.

The finding that shaped the app

A delivery total is not honestly computable.

The health sector says so itself

WHO's own 3/4W tool, read in full: "Without the use of case management systems, it remains challenging to identify the actual number of unique people reached with Health services." One person is counted zero times or four times, and the error does not even carry a sign.

So the denominator is counted need

People in need, estimated per sector at the lowest agreed admin area under JIAF 2.0 — a published, standardised figure with a named release. Coverage is measured against it, never against what was handed out.

Which hands the app a protagonist

An app headlined "people reached" would have to print a double-counting disclaimer beside its own headline. An app headlined an absence does not — the absence of a report is a fact about the report, and it is exactly checkable.

The published brief reads "aid distribution, needs and coverage in a crisis." Correcting the first term did not shrink the solution — it gave it something true to lead with.

Why four states and not two

Two of these are honesty states. Neither one is the finding.

StateCellsWhat it actually saysIs it the finding?
uncovered267counted need, and no organisation reports covering itYes — the whole product
covered2,414one or more organisations report presence for that sector in that districtNo — and never called "served"
not reported2,005the sector publishes no presence lane at all — a finding about the response's reportingNo — and never "uncovered"
no estimate126no published people-in-need figure for that sector × districtNo — and never rendered as 0
uncoveredthe one loud colour on the board
covereda report exists — not a service guarantee
not reportedhatched — an absence of a lane
no estimatehatched — an absence of a figure

Collapse four states into two and the app manufactures its own finding. The two honesty states carry a hatch in the map fill and a spelled-out word in the popup, the table and every exported row — and a no_estimate row exports an empty people figure, never 0 — so the reading survives greyscale, a colour-blind reader, and a spreadsheet.

What "not reported" looks like

A board that reads zero, and says why.

The app with the Gender-Based Violence sector chip selected: every district hatched in the not-reported hue, the strip reading 0 unattended need, 0 uncovered, 401 not reported, 0 no estimate, and the right-hand list empty with a written explanation.
Shipped build, 2026-08-26 — a browser screenshot taken by the automated driver, not a mock-up.

Pick Gender-Based Violence and every district hatches, the headline reads 0, and the empty list explains itself: "an uncovered cell is one with counted people in need and no organisation reporting presence. Cells reading not reported or no estimate are not uncovered and are never counted here."

  • Five sectors publish no presence lane at all — Intersectoral, Child Protection, GBV, Housing/Land/Property, Mine Action.
  • That is 2,005 of 4,812 cells — 42 % of the board. Painting them as uncovered would have manufactured the finding across nearly half the response.
  • "No reporting actor" is not "no actor." On the splash, in the basis line, in every popup and in every exported row.
An empty list explains why — it is never a clean bill
The application, first paint

Five numerals, and every one of them is about this view.

The Humanitarian Response Map at first paint with the Health sector selected: the full-bleed district choropleth of Afghanistan, the coverage key, the wrapping sector chip row, the five-numeral stat strip beneath, and the right-docked list of uncovered cells.
The Health sector, whole response: 652,028 people in 25 uncovered cells, 75 districts with no published estimate, 401 cells in view.
  • The strip recomputes on extent, and on nothing else. No timer, no rotation, no refresh, no freshness dot. Nothing on this board moves without a gesture.
  • The key is a key, not a filter — and it says so, so the key and the chips can never disagree about what the board is showing.
  • The list is never capped silently. The header states 25 of 25 shown; the sector-split chart says "+N more … capped, not complete" whenever it truncates.
  • Both vintages, in the basis line. Presence is 2026 Q1; need is the HNO 2025 release. The two lanes never share a vintage, so every number carries its own lane's period.
  • The by-sector chart is labelled WHOLE RESPONSE, does not follow the view — because it does not, and a reader would otherwise assume it did.
The number that is new

Unattended need — an absence, priced in people.

Not "12 organisations active", and not "340,000 people assisted", but the number of people counted in need who sit in a cell no organisation reports covering — per sector, recomputed for whatever extent is on screen.

Yakawlang · Bamyan · Health
people in need 77,634 (HNO 2025) · distinct reporting organisations 0
= coverage state uncovered
Health, whole response: 25 cells · 652,028 people

Nobody currently produces this number. The publisher ships both lanes as standardised indicators over the same p-codes and does not join them. The best-resourced 3W in the world answers who is there, not who is there against how many need it. The cluster platforms that do compute a gap compute it inside one deployment, behind one login, for one administrator. What is new here is small and defensible: the published commons, joined at the p-code, with the absence named.

Unattended need by sectorwhole response
WSH · Water, Sanitation & Hygiene2,708,223 80 uncovered cells · 275 covered · 46 with no estimate
EDU · Education1,261,305 76 uncovered · 324 covered
SHL · Emergency Shelter & NFI726,743 74 uncovered · 326 covered
HEA · Health652,028 25 uncovered · 301 covered · 75 districts with no published estimate — the largest hole in the needs lane, and the health reader is the one most exposed to it
FSC · Food Security355,334 12 uncovered · 388 covered
NUT · Nutrition  ·  PRO · Protection0 400 covered cells each — every district with counted need has at least one reporting organisation. A real zero, and it is allowed to be one.
Five sectors publish both lanes and carry unattended need; two publish both and carry none; five publish no presence lane at all.
The rule that costs the headline

The biggest number in the file is the one you may not print.

JIAF 2.0's intersectoral rule: people in need are estimated per sector, and the intersectoral figure is the highest sector's figure — never a sum. A person who needs both water and shelter is one person.

So 5,703,633 is arithmetic, and arithmetic is not a reading. With more than one sector in view the headline is the highest sector's figure, and it names that sector. Under All sectors, whole response, the board reads 2,708,223 · WSH — and there is no arrangement of the interface that offers a total.

The rule is enforced in one function — the single place a headline is produced — rather than in each widget that shows one. Cells may be counted across sectors; people may not. A regression test asserts that no grand total appears anywhere on screen, under any chip.

Never shown
5,703,633

the sum of the five sectors' unattended need — it double-counts every person who needs more than one thing

What the board reads instead
2,708,223

UNATTENDED NEED · people in view · highest sector: WSH — the reading names its own basis, so it can be checked against the publisher's rule rather than trusted.

This is the shape of the whole application. Every honest number on this board is smaller than the number a less careful build would have printed.

The signature interaction

Pan the map, and the reading is of what you can see.

A cell adopted: the map flown to Yakawlang with the district highlighted, its popup open showing coverage state uncovered, 77,634 people in need and 0 distinct reporting organisations, the matching row highlighted in the uncovered list, and the strip recomputed to 175,138 people over 45 cells in view.
Zoomed into Bamyan: the strip has recomputed to 175,138 people across 5 uncovered cells of 45 in view. Click a row and the map flies, flashes and opens the popup; click it again and everything releases.

The reading is taken over the visible region — the map container minus its own opaque overlays, measured from the DOM on every recompute. Not the canvas. A full-bleed map with a stat strip over it is a map you can only partly see.

  • Sector chips — map paint, all five numerals, the list and the layer drawer's count narrow in the same frame. / step them without the mouse.
  • Adopt and release, both directions — row to map, map to row, and a second click clears it.
  • It says when it does not know yet"Recomputing for this view…" between the gesture and the new reading, because a confident stale number is worse than a pause.
  • Share link, CSV, print — the sector and extent round-trip through a cold load, and every exported row carries both vintages and the basis sentence.
38 behaviours specified and tested
Proof, not promises

Built, driven and measured — 2026-08-26.

430assertions green — 126 live · 184 offline · 120 in real headless Chrome
38behaviours specified, each mapped to the suite that exercises it
5.92worst informational contrast ratio, in both light and dark — the floor is 4.5
24numbered traps in the data, each probed and recorded with its literal response

The board counted what you cannot see

An extent query with no geometry answers for the whole canvas. Fitted, the board read 401 cells in view when 290 were visible — 28 % of the headline drawn from behind a panel. It is now measured over the visible region, seams and slivers subtracted.

Only the screenshot found the phone bug

At 420 × 820 the strip covered the map to within 30 px and every numeral correctly read 0. Every non-visual assertion passed. Below the breakpoint the strip now leaves the overlay and the map keeps 52 vh.

The build stamped its date from the clock

Re-running it moved the printed retrieval date to a day on which nothing was retrieved — the exact defect the basis line exists to prevent, inside the script that writes it. The date now comes from the newest file the build actually read.

Reading the figures: every number is published OCHA data — operational presence (3W) and people in need (JIAF / HNO 2025), joined at the COD p-code over 401 admin-2 districts. Nothing is generated. A lane that is not published renders empty with its citation, and a withheld cell reads "withheld", never zero.

Stated as boundaries, not caveats

What this application will not do.

  • A coordination screen, never a certification. Not a measure of adequacy, quality, sufficiency, effectiveness or assistance received, and never an allocation instrument.
  • It never asks who received what. The 5W "for Whom" lane is out of scope permanently, not pending a source — answering it honestly needs case management over affected people.
  • Published aggregates at the publisher's own admin level, and never finer. No downscaling, no dasymetric re-allocation, no join that would sharpen a cell, no slicing by population category.
  • No organisation league table. It counts distinct reporting organisations; it does not rank, score or profile one. An organisation's presence in a contested area is a security fact about its staff.
  • Not a time series. Organisation identity is not stable across releases by the publisher's own admission, so footprints are never trended and activity counts are never added.
  • A dated snapshot, not the live API. The endpoint is an outbound third-party call carrying the customer's query — disqualified inside a perimeter. Nothing refreshes; the retrieval date sits beside every number.
  • No travel axis at all. No ring, no isochrone, no drive-time figure — and no facility layer, because the health-facility register needs an API key, so that lane was dropped rather than substituted or generated.
  • Read-only, one response, English only. It runs identically on Strata Serve and on ArcGIS because it never writes to either.

Every one of these is written into the delivered application's own README. Both lanes go blind in the same places — an uncovered cell and an unreachable one can look identical — and the app states that rather than smoothing it.

Point it at your response

One response.
Two lanes. One p-code.

Your operational-presence lane and your people-in-need figures, at the administrative level your response already publishes at, joined on the common operational dataset. Two weeks, and this board reads your response instead of the reference one.

Swappable by configuration, not by code: the response, the admin level, the sector vocabulary. Of the 20 responses with a Humanitarian Response Plan, 12 carry both lanes at admin 2 — for the other eight the app says the cell is not computable and names which lane is missing, rather than aggregating one upward to force a join.

tabaqat.net → Solutions → Health & Humanitarian info@tabaqat.net
© 2026 Tabaqat · Built on Strata. Reference implementation over 401 Afghanistan districts × 12 sectors, snapshot retrieved 2026-08-25. Operational presence and people in need © OCHA, CC BY-IGO. A geographic screen — not a certification, and not a measure of assistance received.
1 / 12