Post-disaster building damage record layer: 🔴危険 / 🟡要注意 / 🟢調査済 / ⬜未調査 + confidence + provenance, bound to persistent building IDs. Honest by construction: covered=false ⇒ value=null.
Project description
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
After the quake, the most important thing to know is not which buildings are broken — it's which ones you haven't checked yet.
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
--inputat 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: 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:
- Write side —
Record(pydantic) makes it structurally impossible to build acovered=falserecord with a value or a confidence. - Wire side (JSON) —
validate_record()checks the serialised record against the frozencontracts/record.schema.jsonshared 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). - Extraction — field perception abstains to 未調査 below its confidence threshold.
- Ingest — an unseen / poorly-localised AOI building is explicitly 未調査; a later "safe" reading can never bury an earlier danger.
- Export — refuses to emit a known/safe claim for an unsurveyed building (
FalseSafeError). - 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
- docs/honesty-spec.md — the invariant and where it's enforced
- docs/standards.md — SOSA / PROV-O / nilReason alignment + SHACL
- docs/data-sources.md — data sources, PLATEAU coverage, licensing
- docs/integration.md — feeding existing systems, agents and viewers
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 · 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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3ff33197a2f5f6a1ab353780148ac3da72cc16808e02e9a3e1d6ab88dfb0184d
|
|
| MD5 |
879b44f90b4a325cb48f157495f71e8e
|
|
| BLAKE2b-256 |
873dfff21fe92881275dc28b59de8b5bc5ca0565a131b0c6824f51a36dea3d5b
|
Provenance
The following attestation bundles were made for plateau_triage-0.1.2.tar.gz:
Publisher:
release.yml on pixelx-jp/plateau_triage
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
plateau_triage-0.1.2.tar.gz -
Subject digest:
3ff33197a2f5f6a1ab353780148ac3da72cc16808e02e9a3e1d6ab88dfb0184d - Sigstore transparency entry: 1811108012
- Sigstore integration time:
-
Permalink:
pixelx-jp/plateau_triage@008002af9e5989d4dfd28183b49747dba35b8994 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/pixelx-jp
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@008002af9e5989d4dfd28183b49747dba35b8994 -
Trigger Event:
push
-
Statement type:
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dc244148e3501a81b774349b5ad63150a3f814cfa19cd0e364b8ac56a2846e04
|
|
| MD5 |
8e7236ade1b5d9165965ddeb36fa790f
|
|
| BLAKE2b-256 |
ae52d12115acd3ae3d7f291467a9d0d04af1c42acce30ee36b412fde42632b96
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
plateau_triage-0.1.2-py3-none-any.whl -
Subject digest:
dc244148e3501a81b774349b5ad63150a3f814cfa19cd0e364b8ac56a2846e04 - Sigstore transparency entry: 1811108075
- Sigstore integration time:
-
Permalink:
pixelx-jp/plateau_triage@008002af9e5989d4dfd28183b49747dba35b8994 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/pixelx-jp
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@008002af9e5989d4dfd28183b49747dba35b8994 -
Trigger Event:
push
-
Statement type: