Skip to main content

Post-disaster building damage record layer: per-building damage state (danger / caution / inspected / unsurveyed) + confidence + provenance, bound to persistent PLATEAU building IDs. Honest by construction: covered=false ⇒ value=null.

Project description

Yodo Labs

plateau-triage 🚩

English · 日本語

After an earthquake, which buildings do you send rescuers to first —
and which ones has nobody even checked yet?

PyPI CI Python 3.9–3.13 Code: Apache-2.0 Data: CC BY 4.0

What it is

After a disaster a city has tens of thousands of buildings and far too few inspectors. plateau-triage turns disaster imagery into a building-by-building map of damage — and its one rule is that a building nobody has checked is never allowed to look "fine".

The trap it fixes: most damage maps leave un-inspected buildings blank — which looks exactly like "safe", so responders skip them. plateau-triage instead gives every building one of four explicit labels:

🔴 danger · 🟡 caution · 🟢 inspected — safe · ⬜ not yet surveyed

The grey "not yet surveyed" is the whole point: a building no one has looked at is shown as unknown — never assumed safe. A coverage meter tells you how much of the city is still grey ("8,000 / 30,000 checked — 73% unknown"), so the question becomes "what haven't we checked?" instead of "no red marks, must be fine."

Annotated demo: red/yellow/green buildings someone checked, grey slabs for not-yet-surveyed (never assumed safe), and a coverage meter showing 33% unknown

Click any building to see where its status came from

Every label is traceable: which image, when, how confident, and the official building ID it's bound to. A grey building says, in plain words, "nobody has looked here — not assumed safe."

Clicking a grey building opens a provenance panel: not yet surveyed, nobody has looked, not assumed safe

Who uses it, and how

  1. A response HQ opens the map and reads the coverage meter — danger first, and "not yet surveyed" ranked above "confirmed safe", because an unknown building may be the most dangerous one on the block.
  2. An inspector clicks a building to see where its status came from, decides whether to trust it or go look, and the record updates after the site visit.
  3. A relief desk exports the records straight into existing systems — a screening feed for the victim-support system (被災者支援システム) and a pre-fill for the disaster-victim certificate (罹災証明). Unsurveyed buildings carry no claim, so the system can never issue a certificate for a building nobody checked.

Data comes either from public satellite datasets (bulk import) or from drone / street capture in the field — and when the drone can't see a building clearly, that building is honestly marked not yet surveyed, not guessed.

Quickstart

pip install plateau-triage          # from PyPI
plateau-triage demo --out out/      # runs on a bundled earthquake sample
plateau-triage — Noto demo
  ingested 12 footprints from the bundled Copernicus Noto sample
  coverage: 8 / 12 assessed; 33% unknown
  state breakdown:
    🔴 危険    danger          3
    🟡 要注意   caution         3
    🟢 調査済   inspected       2
    ⬜ 未調査   unsurveyed      4
  outputs:
    triage.geojson  ·  coverage.json  ·  records.duckdb
    support_system.csv  ·  risai_shomei.csv

(危険 / 要注意 / 調査済 / 未調査 are the values actually stored in each record — the Japanese emergency risk-assessment labels for danger / caution / inspected / not-surveyed.)

See the map (the red/yellow/green/grey 3D view above, bilingual JP/EN):

make demo && make viz-data      # build the demo data
make viz-install && make viz-dev   # http://localhost:5173

Field capture (drone / street) and exports for existing systems:

plateau-triage capture --out out/                                   # drone capture → records
plateau-triage export --records out/records.duckdb --out feed.csv --format both

How it works

   satellite / public datasets ──┐                  ┌── drone / street capture
        (bulk import)            │                  │   (weak / unseen ⇒ not surveyed)
                                 ▼                  ▼
                        honest per-building records   (missing data ⇒ not surveyed, never "safe")
                                 │ bind to a persistent building ID
                                 ▼
        ┌──────────── record layer (GeoParquet / DuckDB) ────────────┐
        • coverage meter — "how much have we NOT checked?"
        • map feed (red/yellow/green/grey) → the plateau-r3f viewer
        • query — look a building up; list what's still unchecked
        • export — victim-support-system feed + disaster-certificate pre-fill
        • eval — proves, on public data, that it says "unknown" when it should
part what it does
plateau_triage.record the one record shape + the four states; the honesty rule lives here
plateau_triage.accrue bring data in — ingest_batch (datasets) and ingest_capture (drone/street)
plateau_triage.bind pin each record to a persistent building ID (plateau-id-resolve)
plateau_triage.coverage the coverage meter + triage ordering (unknown above confirmed-safe)
plateau_triage.store the record layer on disk (GeoParquet / DuckDB)
plateau_triage.query look up a building / list what's still unchecked (mounted by caveat-mcp)
plateau_triage.export feeds for the victim-support system + disaster-certificate pre-fill
plateau_triage.eval self-proving honesty score (calibration + symmetric penalty)
viz/ the plateau-r3f web viewer (Vite + React Three Fiber, bilingual)

Honest by construction

The core rule — a not-surveyed building never carries a value or gets called safe — is enforced independently at every layer (write, storage, field extraction, export, query), so a regression is a test failure, not a silent slip. The rule, and the seven places it's enforced, are written up in docs/honesty-spec.md. For the data model it is the literal invariant covered=false ⇒ value=null.

For developers

  • The record is a frozen, shared contract (contracts/record.schema.json), also projectable onto SOSA + PROV-O and checkable in SHACL — standards alignment, not a new standard. See docs/standards.md.
  • pip install -e ".[dev,shacl]" then python -m pytest (118 tests) and cd viz && npm run build.
  • Docs: honesty-spec · standards · data-sources · integration.
  • Contributing: CONTRIBUTING.md.

License

Code Apache-2.0 (LICENSE); data CC BY 4.0 (LICENSE-DATA, incl. PLATEAU / Copernicus attribution).

This is a screening layer that feeds existing systems — not a replacement for the legal official damage assessment (被害認定調査) a human signs.


Yodo Labs
Yodo Labs · PixelX Inc. / ピクセルエックス株式会社
yodolabs.jp · pan@yodolabs.jp

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

plateau_triage-0.1.4.tar.gz (63.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

plateau_triage-0.1.4-py3-none-any.whl (59.1 kB view details)

Uploaded Python 3

File details

Details for the file plateau_triage-0.1.4.tar.gz.

File metadata

  • Download URL: plateau_triage-0.1.4.tar.gz
  • Upload date:
  • Size: 63.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for plateau_triage-0.1.4.tar.gz
Algorithm Hash digest
SHA256 5ef424735bc825d941ab63c23ddce7a44efc4bdf17fca13eef06134dacf89b4b
MD5 58123f185f89dbd04821afc45be9a090
BLAKE2b-256 52f91f6f13c0bb0b30b18053223a171e0b7089871f45e936efd639317b93f711

See more details on using hashes here.

Provenance

The following attestation bundles were made for plateau_triage-0.1.4.tar.gz:

Publisher: release.yml on pixelx-jp/plateau_triage

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file plateau_triage-0.1.4-py3-none-any.whl.

File metadata

  • Download URL: plateau_triage-0.1.4-py3-none-any.whl
  • Upload date:
  • Size: 59.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for plateau_triage-0.1.4-py3-none-any.whl
Algorithm Hash digest
SHA256 31032dd34524484eea86e84cedda535ce14af66b94252e136e990f34e829e273
MD5 abcc7f2e6ac1622c9b6ee7afca0ab83d
BLAKE2b-256 ba5c16d7b7bb0cda56bfff00c17581e1659926fdb34ef0016b4a45f50ac5f697

See more details on using hashes here.

Provenance

The following attestation bundles were made for plateau_triage-0.1.4-py3-none-any.whl:

Publisher: release.yml on pixelx-jp/plateau_triage

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page