Skip to main content

Post-disaster building damage record layer: 🔴危険 / 🟡要注意 / 🟢調査済 / ⬜未調査 + confidence + provenance, bound to persistent building IDs. Honest by construction: covered=false ⇒ value=null.

Project description

Yodo Labs

plateau-triage 🚩

English · 日本語

Post-disaster building damage record layer

Turn disaster imagery into a per-building, ID-bound record of damage state — with confidence, provenance, and, above all, an explicit "not yet surveyed".

pip install plateau-triage · docs · DESIGN · Code Apache-2.0 · Data CC BY 4.0

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

After the quake, the most important thing to know is not which buildings are broken — it's which ones you haven't checked yet.

plateau-triage Noto demo — red/yellow/green extruded buildings with grey unsurveyed slabs, a coverage meter, and a legend
Noto demo: 🔴危険 / 🟡要注意 / 🟢調査済 extruded by severity, ⬜未調査 as the visible grey gaps, with the coverage meter. make demo && make viz-dev

Every building in a stricken city is one honest record, in one of four states:

state meaning record
🔴 危険 dangerous covered=true, value="危険"
🟡 要注意 needs caution covered=true, value="要注意"
🟢 調査済 inspected, safe covered=true, value="調査済"
未調査 not yet surveyed = unknown covered=false, value=null

The first three mirror Japan's 応急危険度判定 (emergency risk-assessment) red/yellow/green tags. The fourth, 未調査, is the literal form of the stack-wide honesty invariant covered=false ⇒ value=null: a building nobody has looked at is never defaulted to "safe". That honesty contract — plus binding to a persistent building ID — is the moat, not the damage-classification model.


Quickstart

pip install plateau-triage          # from PyPI (pydantic, jsonschema, shapely, duckdb)
plateau-triage demo --out out/      # runs on the bundled Copernicus Noto sample
# point at your own data:  plateau-triage demo --input your_footprints.geojson --out out/
# from a clone, for dev:    pip install -e ".[dev,shacl]"   # + ruff, pyshacl/rdflib
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:
    geojson      out/triage.geojson      # red/yellow/green/grey choropleth (plateau-r3f / any viewer)
    coverage     out/coverage.json       # the coverage meter
    duckdb       out/records.duckdb       # the record layer (DuckDB; also writes .parquet on request)
    support_csv  out/support_system.csv  # 被災者支援システム (victim-support system) screening feed
    risai_csv    out/risai_shomei.csv    # 罹災証明 (disaster certificate) pre-fill candidate — 認定調査 still required

This is the Noto go/no-go demo: zero fieldwork, zero PLATEAU/network dependency. It uses public Copernicus-shaped damage footprints near Wajima (輪島), which is not in PLATEAU — so records bind dataset_footprint IDs and render in 2.5D. Binding to PLATEAU 建物ID + 3D is the production path, on covered cities.

The bundled fixture is a 12-footprint synthetic sample mirroring the Copernicus EMS Noto 2024 schema. Point --input at the real FeatureCollection to run it for real.

Visualisation (plateau-r3f)

The red/yellow/green/grey 2.5D choropleth + coverage meter + click-to-trace, with a bilingual JP/EN UI.

make demo && make viz-data      # writes the feed into viz/public/demo.geojson
make viz-install                # cd viz && npm install
make viz-dev                    # http://localhost:5173   (or: make viz-build)

Click-to-trace provenance panel showing a building's state, confidence, dataset, observed-at and ID-binding confidence
Click-to-trace: state, confidence, dataset, observed-at, ID-binding confidence. An unsurveyed building is shown as "not assumed safe".

Field capture (drone · street)

plateau-triage capture --out out/   # runs on the bundled drone capture sample

A weak or unseen building abstains to 未調査, never defaulted to safe (§6.2 graceful degradation); VSRD/SfM/SAM are pluggable backends.

Feed existing systems

plateau-triage export --records out/records.duckdb --out out/feed.csv --format both

Emits both the 被災者支援システム feed and the 罹災証明 pre-fill candidate (never the certificate itself — the 認定調査 always governs). See docs/integration.md.


Pipeline

                         GeoJSON footprints + damage_grade        drone / street capture session
                                  │  accrue.ingest_batch                  │  accrue.ingest_capture
                                  │  (missing grade ⇒ 未調査)              │  (weak / unseen ⇒ 未調査)
                                  ▼                                       ▼
                                       honest Records  ── accrue.state_extract (honesty policy)
                                            │  bind   (resolve() → persistent id + geom_binding_conf)
                                            ▼
   ┌──────────────────────────── record layer (store: GeoParquet / DuckDB) ────────────────────────────┐
   │  query (RecordIndex: by id / bbox / triage queue / explicit unknown) ── caveat-mcp mounts this      │
   │  coverage ("8 / 12 assessed; 33% unknown")                                                          │
   │  viz (red/yellow/green/grey GeoJSON → plateau-r3f)                                                  │
   │  export (被災者支援システム · 罹災証明 pre-fill)                                                       │
   │  eval (self-proving: calibration + symmetric honesty penalty)                                       │
   └─────────────────────────────────────────────────────────────────────────────────────────────────┘
module role
plateau_triage.record the one honest record contract (states + model + frozen-schema validator)
plateau_triage.accrue.ingest_batch batch import of public damage datasets → records
plateau_triage.accrue.ingest_capture drone/street capture session → records (unseen ⇒ 未調査)
plateau_triage.accrue.state_extract per-building damage extraction + the honesty/abstention policy
plateau_triage.bind pin records to a persistent building id (Resolver plug; StubResolver for the demo)
plateau_triage.coverage the coverage meter + triage ordering
plateau_triage.store record-layer persistence (flat GeoParquet / DuckDB)
plateau_triage.query honest query surface (by id / bbox / triage queue / explicit unknown) — caveat-mcp mounts it
plateau_triage.viz red/yellow/green/grey GeoJSON feed for plateau-r3f
plateau_triage.export 被災者支援システム + 罹災証明 screening feeds
plateau_triage.eval self-proving honesty eval (ECE + symmetric penalty)
viz/ the plateau-r3f front-end (Vite + React Three Fiber, bilingual)

Honesty, enforced everywhere

The invariant is guarded independently so drift is a test failure, not a silent regression — see docs/honesty-spec.md:

  1. Write sideRecord (pydantic) makes it structurally impossible to build a covered=false record with a value or a confidence.
  2. Wire side (JSON)validate_record() checks the serialised record against the frozen contracts/record.schema.json shared by all seven repos. Wire side (RDF) — the optional [shacl] extra validates the same invariant natively in SHACL over a SOSA/PROV-O projection (docs/standards.md).
  3. Extraction — field perception abstains to 未調査 below its confidence threshold.
  4. Ingest — an unseen / poorly-localised AOI building is explicitly 未調査; a later "safe" reading can never bury an earlier danger.
  5. Export — refuses to emit a known/safe claim for an unsurveyed building (FalseSafeError).
  6. Query — answers "unknown, not safe" for a building it has no record of.

Contract

record.schema.json is the frozen, shared "universal honest record" plug (state, rules and hazard are the same shape — only attribute differs). It is vendored at plateau_triage/contracts/record.schema.json; binding to a persistent id is delegated to plateau-id-resolve via the Resolver interface. The same record also projects onto SOSA + PROV-O (record.context.jsonld) and is checkable in SHACL (record.shacl.ttl) — standards alignment, not a new standard (docs/standards.md).

Test

python -m pytest             # 118 tests (incl. SHACL when the extra is installed)
pip install -e ".[shacl]"    # optional: RDF/SHACL honesty check (rdflib + pyshacl)
cd viz && npm run build      # the plateau-r3f front-end builds clean

Docs

License

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

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.2.tar.gz (65.1 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.2-py3-none-any.whl (60.0 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: plateau_triage-0.1.2.tar.gz
  • Upload date:
  • Size: 65.1 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.2.tar.gz
Algorithm Hash digest
SHA256 3ff33197a2f5f6a1ab353780148ac3da72cc16808e02e9a3e1d6ab88dfb0184d
MD5 879b44f90b4a325cb48f157495f71e8e
BLAKE2b-256 873dfff21fe92881275dc28b59de8b5bc5ca0565a131b0c6824f51a36dea3d5b

See more details on using hashes here.

Provenance

The following attestation bundles were made for plateau_triage-0.1.2.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.2-py3-none-any.whl.

File metadata

  • Download URL: plateau_triage-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 60.0 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.2-py3-none-any.whl
Algorithm Hash digest
SHA256 dc244148e3501a81b774349b5ad63150a3f814cfa19cd0e364b8ac56a2846e04
MD5 8e7236ade1b5d9165965ddeb36fa790f
BLAKE2b-256 ae52d12115acd3ae3d7f291467a9d0d04af1c42acce30ee36b412fde42632b96

See more details on using hashes here.

Provenance

The following attestation bundles were made for plateau_triage-0.1.2-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