Environmental Screening Tool — Methodology
Pilot v0.1 · 20 indicators · 20 inland water bodies
← Back to dashboard
Contents
  1. What the tool produces
  2. Regulatory pathway engine (EIAfinder)
  3. Spatial environmental profile (SafeGround)
  4. Galamsey screening — multi-layer scoring
  5. Plausibility cross-check
  6. Reconciliation engine (scoping-report cross-check)
  7. Officer workflow
  8. Architecture
  9. Data lineage and audit reproducibility
  10. Known limitations (honest disclosure)
  11. Citations
  12. Inland Water Body Determination engine
  13. Recent Flood Events layer (16th indicator)
  14. Urban Drainage layer (17th indicator)
  15. REGSEC predictive flood-risk layer (18th indicator)
  16. Cultural Heritage layer (19th indicator)
  17. 7 Open items after sprint-22 agency-hat review (2026-06-26)
  18. Government / Institutional Lands layer (20th indicator)
  19. Fee Estimate Engine (Act 1080 revenue-side taxonomy)
  20. Reconsideration / Enhanced-Mitigation pathway
  21. Sector taxonomy migration (Act 1080 canonical)
  22. Impact Scale classifier (Act 1080 advisory)
  23. Statutory-duration registry
  24. Change log

Screening Tool — Methodology

Decision-support pilot for the relevant Authority of Ghana under L.I. 2504 (2025) / Act 1124 (2025).

Compiled by: Dr. Minka Aduse-Poku, Resilicity · Hürth, North Rhine-Westphalia · minka@resilicity.de Status: pilot v0.1 · 2026-05-22 · live at https://scoping.resilicity.com/ Disclaimer: this document describes a decision-support tool. The tool does not issue or refuse environmental permits, does not constitute an Authority determination, and does not replace the statutory functions of assessment officers, the Director-General, or the Board.


1. What the tool produces

For any project location in Ghana, the tool composes three independent analyses into a single auditable output:

Layer Source engine Output
Regulatory pathway EIAfinder rule engine Verdict (requires_eia / requires_registration / requires_sea / requires_epa_consultation / insufficient_information), legal citations from L.I. 2504 First Schedule, indicative fee band (Act 1080), permit lifecycle (Reg 30), public-hearing triggers (Reg 24), transboundary flag, baseline survey list.
Spatial environmental profile SafeGround spatial engine 20 indicators: flood, wetland, river, protected area, road setback, slope, seismic, soil, infrastructure, HT electricity ROW, galamsey, coastal erosion, contamination, groundwater. Each indicator returns red/amber/green/unknown with distance/measurement + source citation.
Plausibility cross-check Tier-1 + Tier-2 benchmarks Detects physical impossibility and order-of-magnitude scale mismatches in the proponent's declared inputs (e.g. cement plant footprint vs production, solar PV ha/MWp vs NREL benchmarks).

These are merged into one Decision Summary card. Every red or amber spatial finding auto-generates a scoping topic for the EIS/EMP, linked to the responsible agency and statutory reference.


2. Regulatory pathway engine (EIAfinder)

2.1 Inputs

Project sector, sub-type (process / mineral / fuel / facility type), scale dimensions (size_ha, capacity_mw, floor_area_m2, bed_count, production_t_per_year, throughput_t_per_day, network_length_km, unit_count, annual_generation_gwh), location (lat/lon), sensitive-area flags, resettlement, hazardous-waste, e-waste, carbon-market, baseline surveys completion status.

2.2 Rule base

JSON-encoded rules referencing L.I. 2504 (2025) First Schedule items 1–204 and the predecessor L.I. 1652 (1999) Schedule mappings. The rule engine is pure: same inputs always yield the same decision.

2.3 Outputs

2.4 Statutory clocks

The Platform tracks two clocks per case, both starting at case creation:

Clocks stop when the case status moves to signed_off, rejected, or withdrawn. The dashboard surfaces overdue clocks in real time.


3. Spatial environmental profile (SafeGround)

Each indicator runs independently from the same lat/lon input. Sources are cited per indicator and reflected in the API response.

2.4 Earth Engine activation (2026-06-02)

The pilot is now running against a Google Earth Engine service account (epa-scoping-galamsey@epa-scoping-platform-ee.iam.gserviceaccount.com) on the Noncommercial / Community tier (registered via console.cloud.google.com/earth-engine, project epa-scoping-platform-ee). The credential is installed at /etc/gee/safeground-ee.json (root:www-data, 0640) and exported via the systemd drop-in /etc/systemd/system/ghanascreen.service.d/gee.conf.

What activates with EE: - ✓ Sentinel-2 NDVI delta detection for galamsey layer 4 (Forkuor 2020 Remote Sensing methodology, 2 km buffer, 6-month vs 12-month baseline). Verified live on Densu Delta test point (5.55, −0.31) — satellite.layer_active = true. - ✗ JRC CEMS_GLOFAS return-period flood overlay is currently blocked by an EE asset-access error: "Image asset JRC/CEMS_GLOFAS/FloodHazard/v2_1/RP10 not found (does not exist or caller does not have access)." Tested paths v1/v1_0/v2/v2_1 all return the same error from the noncommercial tier. Likely caused by Google's 2024-2025 EE catalogue reorganisation; under investigation as a separate follow-up. The flood composite still produces results from the other four sub-indicators (natural, wetness, drainage, terrain) — JRC just doesn't add the return-period refinement until this is resolved.

2.6 Spatial Statutory Override Engine

The tool's regulatory verdict from the EIAfinder rule engine classifies projects by ACTIVITY type under L.I. 2504 First Schedule + Act 1124. But Ghana law also binds by LOCATION. A hotel inside a Ramsar wetland is not "requires_eia" — it is prohibited by L.I. 1659, irrespective of what the activity classification says.

The Spatial Statutory Override Engine (backend/app/services/spatial_overrides.py) closes that gap. For every spatial indicator firing RED at the project location, it looks up the specific Ghana statute that binds and ESCALATES the verdict to the strictest of (activity-classification, location-prohibition). The binding statute is cited verbatim alongside the L.I. 2504 grounds.

Override hierarchy (the engine only escalates, never downgrades):

refused > requires_eia > requires_sea > requires_registration

no_permit_required > insufficient_information

Coverage (statutes consulted for each indicator):

Indicator RED triggers Binding statute(s) Verdict
Protected area Inside polygon Wildlife Resources Management Act, 2023 (Act 1115) §§ 21–24; Wildlife Conservation Regulations, 1971 (L.I. 685); Forestry Commission Act, 1999 (Act 571) refused unless Ministerial consent under §24
Wetland (Ramsar) Inside designated site Wetlands Management (Ramsar Sites) Regulations, 1999 (L.I. 1659) Regs 4–8; Ramsar Convention Article 3.1 refused — drainage / reclamation / dredging prohibited
River corridor Inside WRC riparian setback Water Resources Commission Act, 1996 (Act 522) §12 (grant of water right — riparian works require WRC permit); WRC Riparian Buffer Zone Policy 2014 (issued under Act 522 §35) requires_eia without WRC permit; certified riparian-buffer design is the precondition
Road corridor Inside GHA / DUR statutory road reservation Ghana Highway Authority Act, 1997 (Act 540); Streets and Roads Act, 1971 (NLCD 41); National Building Regulations L.I. 1630 (1996) Reg 13; National Road Safety Authority Act, 2019 (Act 993) refused without written GHA / DUR encroachment permission
HT electricity Inside statutory ROW (30 m at 161 kV; 40 m at 330 kV) Transmission Line Protection Regulations L.I. 542 (1967), as amended by L.I. 1737 (2004); Energy Commission Act 541 (1997) §38 refused — ROW construction prohibited
Galamsey Inside hotspot footprint Minerals and Mining Act, 2006 (Act 703) §18; Minerals & Mining (Amendment) Act, 2019 (Act 995); Mining Health, Safety and Technical Regulations, 2022 (L.I. 2462); IMCIM moratorium refused without IMCIM clearance
Contamination Inside immediate zone Hazardous Waste Control and Management Regulations, 2016 (L.I. 1932); EPA Act 1124 §9 refused without remediation
Flood High-probability zone Water Resources Commission Act 522 §13 (prohibition of use of water without authority — sub-clause pending gazette confirmation); National Building Regulations 1996 (L.I. 1630); Ghana Building Code 2018 Part 5 (flood-resilient construction); Ghana Hydrological Authority Act 2022 (Act 1085) §3(c) requires_eia with certified flood-resilience design (elevated foundations, controlled drainage, no sub-grade habitable space)
Seismic High-PGA zone National Building Regulations L.I. 1630 Reg 13; Ghana Building Code GS 1207; Ahulu et al. 2018 PSHA requires_eia with certified seismic-engineering design + structural-engineer-of-record sign-off
Slope Steep-slope class National Building Regulations L.I. 1630; Building Code GS 1207 requires_eia with certified geotechnical study + slope-stabilisation design
Coastal erosion Within actively eroding segment Maritime Zones (Delimitation) Law, 1986 (PNDCL 159); Environmental Protection Act, 2025 (Act 1124) coastal-zone management mandate refused without shoreline-protection plan + coastal-zone consent

Verdict-hierarchy rule (post-2026-06-25 legal review). The engine uses two verdict tiers when a spatial indicator fires RED:

The conditional-override clause carried with each indicator names the specialist study + engineering / regulatory precondition that must be satisfied before the screening can be re-run.

Response shape. The /screen API now returns under verdict: - decision — the strictest verdict (post-override) - original_decision — the EIAfinder activity-only verdict - override_applied — bool: True if any override escalated the verdict - override_headline — one-line summary of the binding prohibition - spatial_overrides — array of {indicator, status, verdict, headline, reason, citations, exception}

Reading the verdict. Each spatial override returned includes (a) the specific indicator and severity (red / amber) that triggered, (b) the prohibition or escalation it forces, (c) the binding statute(s) with section numbers, and (d) the conditional clause under which the prohibition can be lifted (e.g., Ministerial consent, IMCIM clearance, WRC permit). The frontend report surfaces this as a prominent red banner above the standard L.I. 2504 grounds; the determination PDF cites both in §1.

Added 2026-06-02.

2.5 Map basemap imagery — freshness disclosure

Every screening surfaces an imagery-date badge in the bottom-right of the map, so the officer always knows how stale the picture they are looking at is. The badge queries Esri's World_Imagery/MapServer/identify endpoint on each pan / pin and surfaces the SRC_DATE for the tile directly under the project point.

Officers can switch the basemap between three sources:

Layer Resolution Freshness Source
Esri Hybrid (default) sub-metre to 1 m varies — typically 6 months to 4 years Esri World Imagery (Maxar + Airbus + national imagery)
Mapbox Satellite (when token set) sub-metre to 1 m irregular Mapbox / Maxar
Sentinel-2 30-day median composite 10 m ≤ 30 days old (live as of 2026-06-02; window stamped on each tile via X-Tile-Window) Copernicus Sentinel-2 SR Harmonized via Google Earth Engine getMapId(); cloud-masked via SCL; mapId cached 6 h in ghanascreen-backend, tile cache 24 h client-side

Planet NICFI was previously planned as a fourth layer, but Planet pivoted it to a paid "Tropical Forest Observatory" SKU (EUR 1,620/yr, verified 2026-06-02). The pilot uses the Esri date badge + Sentinel-2 route instead, both free.

The freshness ceiling is enforced two ways: 1. Per-layer label — each base-layer button carries a freshness chip ("≤ 30 d" / current month) so officers see the ceiling before they choose. 2. Per-tile date stamp — the badge interrogates the actual tile and shows the SRC_DATE plus an age class (fresh / ok / warn / stale) coloured accordingly.

For galamsey verification specifically, the recommended workflow is to default to Sentinel-2 for the visual scan; the in-tool galamsey check already runs Sentinel-2 NDVI delta detection regardless of which basemap the officer is viewing.

3.0 Per-indicator radius — quick reference

The values below are the live aggregation parameters used by backend/app/api/routes_screen.py::_AGG_META. Every /screen response echoes these alongside each finding, and the determination PDF prints the relevant value under every red/amber/green call.

# Indicator Method Radius / pixel Source dataset
1 Flood (natural) Buffer test 500 m OSM natural=flood_prone polygons
2 Wetland Layered 200 m · ~1 km Ramsar → OSM wetlands → JRC GSW
3 River / riparian Shortest distance 30 / 60 / 120 m (WRC bands by stream order) HydroRIVERS
4 Protected area Point-in-polygon + 200 m amber buffer WDPA 2024
5 Road corridor Shortest distance to centreline OSM motorway / trunk / primary / secondary
6 Slope Pixel sample 90 m pixel Copernicus DEM GLO-30 (Horn 3×3)
7 Seismic hazard Point-in-polygon PGA-band polygons Ahulu et al. 2018 PSHA
8 Soil Pixel sample 250 m pixel ISRIC SoilGrids v2 + WoSIS
9 Infrastructure Shortest distance to nearest feature GSS urban centres + OSM power lines
10 HT electricity Shortest distance 30 / 50 / 100 m ICNIRP bands OSM HV lines; L.I. 542 / L.I. 1737 ROW
11 Galamsey Multi-layer 8 km · 2 km · 25 km (see §4) 97 hotspots + Pra/Ankobra/Tano basins + Sentinel-2 NDVI delta + district prevalence
12 Coastal erosion Segment lookup within 5 km of coast Asare-Bediako 2025; Angnuureng 2023; Boateng 2012 — Ghana EPR
13 Contamination Piecewise distance to nearest curated site Pure Earth + Authority inventories
14 Groundwater Multi-layer 90 m HAND pixel BGS Africa Atlas + GLO-30 HAND + JRC GSW
15 Dam-spillage envelope Point-in-polygon + 500 m amber buffer 6 documented envelopes: Akosombo+Kpong, Weija, Bui, Bagre, Tono, Vea (VRA / GWCL / BPA / SONABEL / ICOUR)

Flood composite — five sub-indicators (returned in the flood_composite.indicators block):

Sub-indicator Method Radius / pixel Source
Natural flood-prone Buffer test 500 m OSM flood-prone polygons
Surface-water wetness Pixel sample 30 m pixel JRC GSW 1984–2021 (Pekel 2016)
Drainage / built-up Pixel sample 1 km pixel GHSL R2023A + GSS urban context
Terrain (HAND + slope) Pixel sample 90 m pixel Copernicus GLO-30
JRC return-period envelopes Buffer test 100 m JRC Global Flood Hazard v2.1 (Dottori — 10 / 100 / 500-yr)

Reading the table. A "pixel" entry means the indicator samples the single raster cell directly under the project location — no buffer applied. A "buffer" or "shortest distance" entry means proximity is the measurement. Where multiple radii are listed, the tool selects the strictest applicable threshold and surfaces the source layer that drove the decision.

3.1 Standard indicators

Indicator Method Data source
Flood risk 4-sub-indicator composite (natural / wetness / drainage / terrain) + JRC return-period overlay (10/100/500 yr) OSM natural=flood_prone + JRC GSW + GHSL R2023A + GLO-30 + JRC Global Flood Hazard Maps v2.1 (Dottori et al., LISFLOOD-FP)
Wetland proximity Ramsar overlay (red) → OSM wetland polygons (red/amber) → JRC GSW wetness % fallback Ramsar Sites Information Service (rsis.ramsar.org, 6 Ghana sites); OSM natural=wetland; JRC Global Surface Water 1984-2021 (Pekel et al. 2016)
River corridor Distance to HydroSHEDS HydroRIVERS (preferred) or OSM rivers (fallback) + WRC riparian setback rules (60/120 m river, 30/60 m stream) HydroSHEDS HydroRIVERS v1.0 (Lehner & Grill 2013; Linke et al. 2019); OSM rivers (Geofabrik Ghana fallback); WRC Riparian Buffer Zone Policy 2014
Protected area Polygon intersect against WDPA boundaries WDPA 2024 release (UNEP-WCMC / IUCN)
Road setback Distance to OSM major roads (motorway/trunk/primary/secondary) OSM Geofabrik Ghana
Slope DEM derivative (Horn 3×3 on the preferred raster) Copernicus DEM GLO-30 (2019; ±4 m vertical) preferred; SRTM 30 m (2000; ±9 m) fallback
Seismic PSHA zone lookup Ahulu et al. 2018 Journal of Seismology doi:10.1007/s10950-017-9721-x
Soil SoilGrids v2 250 m interpolation + WoSIS measured profiles ISRIC SoilGrids v2 (Hengl et al. 2017); WoSIS Dec 2023
Coastal erosion Coastline distance + segment-specific erosion rates CSIR-WRI shoreline studies; Appeaning Addo et al. 2011; Boateng 2012; IPCC AR6 W. Africa coastal profile (2021)
Contamination Distance to curated contamination sites + galamsey-zone advisory Pure Earth / Blacksmith Institute Pollution Atlas; the Authority permit records; CSIR-INSTI (2019); published arsenic/mining studies
Groundwater HAND (Height Above Nearest Drainage) + JRC GSW + BGS Africa Groundwater Atlas JRC GSW; BGS Ghana hydrogeology; GLO-30 HAND (AWS Open Data, CC0)
Infrastructure access Distance to urban centres + OSM power lines (general) GSS urban centres (verified 2026-04-16); OSM power=line (489 segments)

3.2 Ghana-specific indicators

HT electricity (L.I. 1737 ROW) — distance to nearest 161 kV or 330 kV GRIDCo transmission line, classified against:

Galamsey proximity — multi-layer scoring described in detail in §4.

3.3 Synthesis

SafeGround returns a synthesis paragraph that summarises the top 3-4 red/amber findings in plain English. The Platform's orchestrator inherits this paragraph into the Decision Summary card.

3.4 Dam-spillage inundation envelope (#15)

Indicator #15 catches the gap that the JRC return-period flood maps and OSM flood polygons miss: controlled releases from regulated dams do not follow natural-flood return-period statistics — they follow the dam operator's protocol. The 2023 Akosombo spillage (38,624 displaced, 32 communities, 15 Sept – 30 Oct 2023) inundated areas well beyond the JRC 100-yr envelope in several reaches.

Envelopes covered

Envelope Operator Gazette Documented events
Akosombo + Kpong (Lower Volta) Volta River Authority (VRA) Act 46 (1961) 1991, 2010, 2023 (controlled spillage at Maximum Operating Level 84.5 m)
Weija Densu Ghana Water Company Limited (GWCL) Act 522 (1996) GWCL spillage authority 2010, 2011, 2016, 2018, 2020, 2024 (spillage at 48 ft / 14.6 m)
Bui Black Volta Bui Power Authority (BPA) Act 740 (2007) 2022 (Savannah RCC attribution), 2023 Buipe floods (1,500–5,000+ displaced)
Bagre cross-border (White Volta) SONABEL (Burkina Faso) Act 522 + Act 1085 (2022) + Pwalugu Multipurpose Dam Act 2020 Annual August–September since 2008
Tono Irrigation Company of Upper Region (ICOUR) Statutory Corporations Act 1964 + SIGA 2019 (844 ha farm, ~2,000 buildings in Navrongo)
Vea Irrigation Company of Upper Region (ICOUR) Statutory Corporations Act 1964 + SIGA Periodic during Bagre overflow + Sahel rains

Statutory binding (override engine)

Inside any envelope → verdict ESCALATED to refused with citations to the full chain:

Exception clause

Flood-resilient public infrastructure (elevated walkways, evacuation centres on stilts, regulated marine facilities) may be considered case-by-case under a separate consent track with the operator and the Ghana Hydrological Authority. Permanent habitable structures are not permitted inside any envelope. Re-screening requires written confirmation from the operator that the specific footprint sits outside the gazetted design-spillage envelope.

Honest disclosure

The envelopes are digitised from documented spillage extents + operator-published protocols, not from a controlled topographic- hydraulic model. Each polygon's vertices reflect the broadest documented inundation across the events cited above, with conservative buffers applied where the extent varied between events. Precise per-property determination still requires the operator's design-spillage envelope and a site-specific topographic survey.


4. Galamsey screening — multi-layer scoring

This is the methodology the Platform pioneered as part of its the Authority focus. It directly addresses Prof. Ayamga-Adongo's stated priority on illegal mining enforcement.

4.1 Four-layer score

Each layer outputs a 0-1 score; the layers are weighted and summed:

Layer Weight Activates from
1. Documented hotspot proximity 0.15 Curated 27-point dataset (Pure Earth Pollution Atlas; the Authority shutdown notices 2020-2024; IMCIM; academic case studies)
2. Galamsey-affected river corridor 0.20 OSM rivers filtered by name to Pra / Ankobra / Birim / Offin / Tano (75 polylines) with watershed-aware piecewise scoring
3. District prevalence weight 0.10 Curated ~80-district table sourced from IMCIM + the Authority shutdown notices + Minerals Commission Ghana
4. Sentinel-2 NDVI delta detection 0.55 (when active) Google Earth Engine — Forkuor et al. 2020 methodology

4.2 Layer 1 — Documented hotspot proximity

27 points compiled from public sources, each carrying district, region, year_documented, source. Score function: 1.0 at the centroid, linear decay to 0 at 8 km. The dataset is intentionally a starter set — expansion is a Phase 2 deliverable.

4.3 Layer 2 — River corridor

The five rivers most documented for galamsey impact in Ghana (Owusu-Sekyere et al. 2019; Forkuor et al. 2020). OSM only labels some segments of each river by name, so the scoring uses watershed-aware piecewise distance:

4.4 Layer 3 — District prevalence

Static table keyed by district name (with normalised matching for hyphenated/suffixed variants like Tarkwa-Nsuaem Municipal vs Tarkwa Nsuaem). Weights:

4.5 Layer 4 — Sentinel-2 NDVI delta detection

When Earth Engine credentials are configured on the SafeGround service:

4.6 Tier-1 confidence cap

When Layer 4 is inactive (no GEE credentials), the combined Tier-1 score is capped at 0.7 — i.e. Tier-1 context alone can never declare a site "active galamsey." Red status requires Sentinel-2 confirmation. This is by design and is the methodological fix for the early-version Obuasi over-flagging.

Status as of 2026-06-02: Layer 4 (Sentinel-2 NDVI) is now active in production. The Tier-1 cap is no longer a binding constraint on production calls — but the methodology is preserved so any future credential outage degrades gracefully.

4.7 Status thresholds

4.8 Output transparency

Every galamsey result includes a data.layers block showing the per-layer score, distance/value, and layer_active flag. The human-readable detail string explicitly states which layers fired and which are unavailable. This is the defensibility property: an officer can read the output and reproduce the reasoning row by row.


5. Plausibility cross-check

5.1 Tier-1 (live, deterministic)

Eight hand-written rules covering physical impossibility (e.g. declared production with zero footprint) and well-known scale mismatches (cement <1 ha for >100 t/day; solar PV <1 ha/MWp; wind <10 ha/MW; hospital <30 m²/bed). Each rule cites its benchmark source.

5.2 Tier-2 (live, sourced)

Fourteen benchmark entries covering sector-process pairs: - Manufacturing: cement, steel, paper & pulp (USGS Minerals Yearbook, CEMBUREAU, World Steel Association, CEPI) - Mining: open-pit gold, bauxite (Minerals Commission Ghana, Newmont/AngloGold reports) - Energy: solar PV (NREL TP-6A20-56290, LBNL), wind (NREL TP-500-46909), hydro (IEA), CCGT gas (IEA, Ghana Energy Commission) - Health/Tourism/Real estate: hospital m²/bed (WHO), hotel m²/room (IHRA), residential m²/unit (Ghana Building Code 2018) - Waste/Water: landfill ha/(t/day), STP m²/(m³/day) (World Bank, Metcalf & Eddy, UN-Habitat)

Each benchmark computes a derived ratio (e.g. size_ha / capacity_mw) and flags the entry as "below" or "above" the expected range when deviation is significant.

5.3 Phase 2 (deferred)


6. Reconciliation engine (scoping-report cross-check)

6.1 Inputs

Text pasted from a proponent's scoping report (initially) or extracted from a PDF (when pdfplumber is installed on the server).

6.2 Extraction

Pure regex against patterns Ghana scoping reports commonly use: - Coordinates (labelled decimal, DMS, Google Maps URL, decimal pair) - Project title (after "Project Title:" / "Name of Project:" / "Undertaking:") - Sector (~50 keyword patterns covering all 11 First Schedule sectors) - Sub-types (process_type, mineral_type, fuel_type, building_type) - Scale (hectares, MW, m², tonnes/year, beds) - Mentioned environmental topics (13-topic keyword scan)

6.3 Reconciliation

For each topic SafeGround flags red/amber: - If the report addresses the topic → match - If the report does NOT address it → gap

For each plausibility flag → discrepancy (proponent's declared scale vs benchmark).

6.4 Output

Three columns + officer-ready next steps + 1-2 sentence summary suitable for the case file.

6.5 Phase 2 (deferred — requires API key)

LLM-assisted extraction via Anthropic Claude API for reports whose structure regex can't parse.


7. Officer workflow

7.1 Case lifecycle

created → assigned → in_review → signed_off
                              ↘ rejected / withdrawn

7.2 Compliance schedule (auto-generated at sign-off)

Per L.I. 2504 Reg 30, the Platform generates six dated obligations: - Appeal window closes (sign-off + 30 days) - Initial EMP submission (+ 18 months) - Permit renewal notice window opens (+ 21 months) - First EMP update (+ 54 months) - Decommissioning notice window opens (+ 60 months) - Second EMP update (+ 90 months)

Each obligation tracks status (pending / received / waived / overdue) and surfaces on the dashboard's lifecycle widget.

7.3 Audit trail

Every case action — creation, status change, officer assignment, peer reviewer assignment, notes update, sign-off, obligation marked received — generates an audit log entry. The entries form a SHA-256 hash chain:

hash[n] = sha256( canonical_json(payload[n]) + hash[n-1] )

Each entry's payload embeds the data lineage at decision time: platform version, EIAfinder ruleset version, SafeGround data release, and the dataset versions in force. A tampered row breaks every downstream hash; the GET /cases/{id}/audit/verify endpoint re-computes the chain and reports the first invalid entry if any.

7.4 Phase 2 (deferred)

Ed25519 signing of each entry by the signing officer's key — proves authorship, not just integrity.


8. Architecture

┌─────────────────────────────────────────────────────────────┐
│                    Screening Tool orchestrator                │
│             (FastAPI · port 8006 · scoping.resilicity.com)  │
└────────┬────────────────────────┬───────────────────┬────────┘
         │ POST /screen           │                   │
         ↓                        ↓                   ↓
┌──────────────────┐  ┌────────────────────┐  ┌─────────────┐
│   EIAfinder      │  │   SafeGround       │  │  SQLite     │
│  rule engine     │  │  spatial engine    │  │   cases.db  │
│  (port 8005)     │  │  (port 8002)       │  │             │
│ L.I. 2504 rules  │  │ 20 indicators      │  │ + audit_log │
│ baseline surveys │  │ Tier-1 galamsey    │  │ + obligations│
│ public hearing   │  │ Tier-2 (GEE)       │  │             │
└──────────────────┘  └────────────────────┘  └─────────────┘

The orchestrator is stateless. SQLite holds case records, lifecycle obligations, and the audit log. All three upstreams run on the same Hetzner box for sub-millisecond inter-service latency.

8.1 Scaling path

The orchestrator can be replicated horizontally behind a load balancer. SQLite would migrate to Postgres at ~10k cases / day. Each upstream is already stateless and can scale independently.


9. Data lineage and audit reproducibility

Every audit log entry stores, in its canonical payload, the version of each upstream tool and dataset that was in force at decision time:

{
  "schema_version": "1.1",
  "case_id": "...",
  "action": "signed_off",
  "actor": "K. Mensah",
  "timestamp": "2026-05-22T11:08:52Z",
  "details": { "signed_off_at": "..." },
  "lineage": {
    "platform_version": "0.1.0",
    "eiafinder": { "version": "0.x", "ruleset": "L.I. 2504 v2025-09" },
    "safeground": { "version": "0.x", "data_release": "2026-05" },
    "datasets": { "osm_rivers": "...", "wdpa": "2024 release", ... }
  }
}

If a tribunal asks "exactly what data led to the decision on case SCT-2026-XXXX", the audit entry contains the answer. Combined with the hash chain, this is reproducible to the decision-time state.


10. Known limitations (honest disclosure)

10.1 Not yet validated against historical Authority decisions

v0.1 makes no statistical accuracy claims. A concordance study against the Authority's actual past permit decisions is the highest-priority Phase-2 task, blocked on the Authority sharing a decision archive.

10.2 Galamsey hotspot dataset — Tier-1 curated

~80 documented sites (2026-06 expansion sprint, up from an initial 27). Sources: IMCIM bulletins, Operation Halt II/III, CSIR-WRI water-quality reports, Minamata ASGM-NAP 2020, Owusu-Nimo 2018, national media. Not comprehensive — active Sentinel-2 detection (Tier-3) is the convergence path.

10.2.1 Galamsey 4-layer weights — expert-elicited v0.1 priors

The Layer weights (hotspot 0.15, river 0.20, district 0.10, satellite 0.55) are expert-elicited v0.1 priors, not empirically calibrated. The rank order satellite > river > hotspot > district reflects Forkuor et al. 2020's qualitative ranking of discrimination strength; the specific values are judgement. Calibration against the Authority's historical galamsey-flagged decisions (§10.1) is the Phase-2 task — weights will be re-fit by logistic regression with cross-validated AUC reporting, and a sensitivity table (status change under ±25 % weight perturbation) will be added to §4.6 once that data lands. Until then, the 0.7 Tier-1 cap is the methodological safeguard: Tier-1 alone can never produce a red status without Sentinel-2 confirmation.

The 0–8 km hotspot linear decay and the 2/10/25 km river piecewise breakpoints are methodological priors, not policy-derived. The 25 km outer envelope is the watershed-half-width heuristic for the Pra/Ankobra/Tano main basins (Owusu-Sekyere et al. 2019); finer basin-specific tapers are deferred to Phase 2.

10.2.2 Seismic — polygonisation simplification

The Ghana-specific PSHA (Ahulu et al. 2018) reports a continuous PGA surface. This module discretises it into a small set of polygon classes (currently four: Akwapim-high, Volta-elevated, coastal- elevated, basement-stable). The discretisation introduces step discontinuities at polygon edges; a site 100 m inside an elevated polygon returns amber while 100 m outside returns green even when the underlying continuous PGA is nearly identical. Replacing the polygons with an IDW or kriging interpolation of Ahulu's calibration points (with literature-anchored 0.04 g / 0.08 g amber/red thresholds) is a Phase-2 task. For the pilot, treat the indicator as a regional PGA-band assignment, not a site-specific shaking estimate.

10.2.3 500 m proximity buffers — convention, not literature

Several indicators apply a 200 m or 500 m amber-proximity buffer (wetland, protected area, OSM flood polygons, contamination sites). These are scoping-tool conventions — they are NOT derived from specific regulatory text or peer-reviewed effect-distance studies. Their purpose is to draw the officer's attention to sites just outside a flagged polygon where boundary uncertainty or edge-effect concerns warrant a closer look. Sites that materially depend on the proximity band rather than the polygon itself should be physically verified.

10.2.4 Coastal erosion uncertainty — range half-width, not standard deviation

rate_uncertainty_m_per_yr in coastal_erosion.py is the half-width of the published literature range for the segment, not a standard deviation. The current implementation linearly extrapolates rate ± uncertainty × 25 years to produce a 25-year retreat envelope; this is conservative for the upper bound but does not have the properties of a 1-σ statistical bound. A Phase-2 revision will either compute SDs from the published EPR statistics where available or re-label the field as range_half_width_m_yr and replace the linear propagation with explicit min/max scenarios. Officers reading the detail should treat the retreat envelope as a literature-range extrapolation, not a confidence interval.

10.2.5 Contamination — curation criteria

The contamination indicator draws on a curated geojson of Pure Earth / Blacksmith Toxic Sites Identification Program entries cross-referenced against the Authority shutdown notices. The curation rule is:

Include a site if (a) it is in the Pure Earth Pollution Atlas with documented heavy-metal or hydrocarbon contamination above the applicable Ghana Standard or WHO drinking-water threshold, OR (b) it is named in the Authority enforcement records 2018–2025 as having received a shutdown or remediation notice.

The galamsey-zone advisory layer (is_in_galamsey_zone) is set when the galamsey check returns red/amber at the same coordinate — i.e. the contamination layer inherits the discipline of the galamsey score. Sites with no published contamination evidence but located within the galamsey advisory zone are flagged amber, not red, acknowledging the inference is indirect.

10.3 OSM coverage gaps — partially closed (2026-05-31)

The general river check now prefers HydroSHEDS HydroRIVERS v1.0 over the OSM-name-filtered file, giving consistent named coverage of every Ghana reach with Strahler order ≥ 1 and average discharge attributes. OSM remains the fallback for sites outside the HydroRIVERS extent. The galamsey-affected basin check (Pra/Ankobra/Tano) already used a HydroRIVERS-derived file. Remaining OSM-dependent layers: roads (no widely-adopted alternative for Ghana), power lines (BPA/GRIDCo official corridor data is not public), flood polygons (still useful as a complement to the new JRC return-period overlay since OSM tags discrete flood-prone areas that the LISFLOOD-FP model may smooth).

10.4 Benchmarks are international, not Ghana-calibrated

NREL / IEA / USGS benchmarks reflect global norms. Ghana-specific calibration ships when the Authority shares historical permit data.

10.5 No authentication

The pilot runs with shared credentials. Production deployment integrates with the Authority's identity system (OAuth/SAML).

10.6 No automated proponent intake

By design. the Authority controls the intake channel; the Platform is officer decision-support, not a public submission portal.


11. Citations


12. Inland Water Body Determination engine

12.1 Purpose

The 15 spatial indicators (§3) handle proximity to wetlands, protected areas, rivers, roads, transmission lines, dam-spillage envelopes, etc. They do not, on their own, identify the water body itself when the parcel sits inside it. Before this engine landed, a pin dropped on Lake Bosomtwe returned a generic "in water" banner with no mention of:

The Inland Water Body Determination engine surfaces all of the above as a structured determination — designation stack, project-category verdict, stakeholder/permit matrix, and gazetting chain — for every screening that lands inside a curated Tier-1 polygon.

12.2 Catalogue (Tier 1, 12 features)

frontend/data/ghana_inland_water_bodies.geojson — generated by backend/scripts/build_inland_water_bodies.py.

ID Name Designations stacked
bosomtwe Lake Bosomtwe UNESCO MAB Biosphere Reserve (2016) · sacred-lake (Bekwaihene under Asantehene) · adjacent Bosomtwe Range Forest Reserve · endemic fishery (Tilapia busumana, Hemichromis frempongi)
lake_volta Lake Volta (Akosombo + Kpong reservoir) Volta River Development Act 1961 (Act 46) — VRA control · aquaculture-dominant fishery
bui_reservoir Bui Reservoir Bui Power Authority Act 2007 (Act 740) · adjacent Bui National Park (Wildlife Division)
weija_reservoir Weija Reservoir Statutory Corporations (Conversion to Companies) Act, 1993 (Act 461), as amended by L.I. 1648 — Accra drinking-water source · 200 m strict buffer
tono_reservoir Tono Reservoir ICOUR control — largest irrigation reservoir in Ghana
vea_reservoir Vea Reservoir ICOUR control — sister to Tono
owabi_reservoir Owabi Reservoir and Wildlife Sanctuary Ramsar Site Ghana_1 (1988) · Wildlife Sanctuary (L.I. 685) · Kumasi drinking-water source (GWCL)
songor_ramsar Songor Ramsar + UNESCO MAB Biosphere Reserve Ramsar Site Ghana_4 (1992) · UNESCO MAB Songor Biosphere Reserve (2011) · Ada Traditional Council custodianship of salt-pan economy
keta_lagoon_ramsar Keta Lagoon Complex Ramsar Site Ramsar Site Ghana_6 (1992) — largest Ramsar wetland in Ghana (1 200 km²) · Anlo Traditional Council (Awoamefia)
densu_delta_ramsar Densu Delta Ramsar Site Ramsar Site Ghana_2 (1992) — Densu estuary, Greater Accra
sakumo_ramsar Sakumo Lagoon Ramsar Site Ramsar Site Ghana_3 (1992) — Tema peri-urban; Tema Traditional Council
muni_pomadze_ramsar Muni-Pomadze Lagoon Ramsar Site Ramsar Site Ghana_5 (1992) — Effutu Traditional Council (Omanhene of Winneba)

Each feature carries: wb_type, area_km2_approx, district, region, MAB / Ramsar / sacred / Forest-Reserve / fishery flags, wrc_riparian_buffer_m, regulating_authority, dam_buffer, primary_authorities, verdict_categories (A→E), and a 5–7-entry gazetting_chain.

12.3 Polygon fidelity

Hand-curated screening-grade approximations:

These are NOT the official Ramsar Information Sheet polygons or the UNESCO MAB Biosphere Reserve zoning polygons. They are sufficient for screening ("does this parcel sit on Lake Bosomtwe? yes / no") and conservative enough that a parcel near the edge still flags. Replacing each polygon with the gazetted version on adoption is the documented upgrade path.

12.4 Project-category taxonomy

The verdict on an inland water body depends on whether the project NEEDS the water body to exist. The intake form's water_dependent checkbox combined with sector + sub_type maps to one of five categories:

Code Label Typical examples Default verdict on Bosomtwe-class lake
A Strictly water-dependent, low-impact, MAB-compatible Limnological research, water-quality monitoring, traditional artisanal fishery, navigational aids Conditional consideration
B Water-dependent, moderate-impact, MAB-conditional Sustainable aquaculture (MAB-compatible), small jetty / canoe terminal, ferry landing Conditional consideration — special pathway
C Water-dependent, high-impact Hydropower, large cage aquaculture, dredging / sand-winning, water abstraction above WRC threshold Refused (Bosomtwe-class); conditional on Volta-class
D Water-incidental — needs only the VIEW of water Resort, hotel, residential, factory, restaurant or visitor-facing facility on the water Refused
E Prohibited absolutely Petroleum storage, hazardous waste, mining of any kind, industrial discharge Refused — no special-circumstance path

When the proponent leaves water_dependent unticked, the resolver infers conservatively from the sector (a "tourism / resort" project falls into D; "agriculture / aquaculture" into B; "mining / petroleum" into E).

12.5 Stakeholder / permit matrix

When a conditional-consideration verdict fires, the resolver emits a per-feature stakeholder table from a canonical 34-entry _AUTHORITY_DECISIONS registry. Each row carries the authority's name, the gazetted statute, and a one-line "what they decide" string. The matrix is filtered by project category — Fisheries Commission appears for A/B/C but not D, Ghana Tourism Authority appears for B/D but not A/C/E, and so on.

Worked example — Lake Bosomtwe + aquaculture (Category B):

  1. Bekwaihene under Asantehene — Customary law; compatibility with sacred status and traditional taboos.
  2. Ghana MAB National Committee (MESTI) — UNESCO MAB Lima Action Plan; Core / Buffer / Transition zone compatibility.
  3. Water Resources Commission — WRC Act 1996 (Act 522) §13–§15; water-use, abstraction and discharge permit.
  4. Fisheries Commission — Fisheries Act 625 (2002) + Fisheries (Amendment) Act 880 (2014) §61–§64; cage culture licence.
  5. the Authority — EPA Act 2025 (Act 1124); L.I. 2504 (2025) Reg 28(1)(a) 25-day clock.
  6. Forestry Commission — Forestry Commission Act 1999 (Act 571); clearance for shore works affecting Bosomtwe Range Forest Reserve.
  7. Bosomtwe District Assembly — Local Governance Act 936 (2016); site plan + building permit + zoning conformity.
  8. Ghana Tourism Authority — Ghana Tourism Authority Act 2011 (Act 817); tourism enterprise licence (where any visitor-facing component is proposed).
  9. NADMO — NADMO Act 927 (2016); crater-rim slope and landslide risk assessment.

12.6 Override-engine integration

A matched inland water body with verdict refused escalates the overall verdict via the same _max_verdict channel used by the Spatial Statutory Override Engine (§5). The override engine cites the L.I. 2504 First Schedule grounds and the inland-water-body engine cites the gazetting chain — both surface in the same determination as a single defensible legal argument.

12.7 Tier-2 / -3 expansion path

The Tier-1 release covers the regulated and internationally-designated water bodies that drive the bulk of high-impact site choices. Three further tiers are documented for the post-pilot roadmap:

Replacing the screening-grade polygons with official Ramsar Information Sheet polygons and UNESCO MAB Biosphere Reserve zoning polygons on adoption is documented as a Tier-1 upgrade, not a Tier-2 expansion.

12.8 Honest disclosures


13. Recent Flood Events layer (16th indicator)

13.1 Purpose

The modeled flood layer (§3.1 — flood) is a climatology: JRC Global Flood Hazard Maps v2.1 evaluates terrain + rainfall return-period statistics to estimate where a 1-in-10/100/500-year event would inundate. It is the right answer to the question "what does the terrain say about flood risk?"

It is not the right answer to the question "did this exact location actually flood last year?"

That gap matters: the June 2025 Accra floods that inundated Kaneshie, Spintex, East Legon, Achimota and Adabraka were caused by drainage failure — sealed surfaces, blocked culverts, the Odaw drain choking under sub-100-year rainfall. The modeled JRC layer returns GREEN for many of those locations because the cause was not extreme rainfall, it was infrastructure. A documented-event layer is the only way to flag the parcel correctly.

The recent_flood_event indicator fires independently of the modeled flood layer, side-by-side. When the model says GREEN but the documented layer says RED, the report explicitly surfaces the divergence — that is the binding evidence the officer must address in the EIS.

13.2 Catalogue (Tier 1, 14 events 2015-2025)

frontend/data/ghana_recent_flood_events.geojson — generated by backend/scripts/build_recent_flood_events.py.

ID Event Date Cause
accra_2015_06_03_odaw_catchment 3 June 2015 Accra floods — Odaw lower catchment 2015-06-03 Combined drainage failure + extreme rainfall + GOIL fuel-station fire (152 deaths, 5 000+ displaced)
accra_2018_06_odaw_repeat June 2018 Accra repeat — Odaw catchment 2018-06-18 Drainage failure + Odaw overflow
tamale_2019_07_urban_floods July 2019 Tamale urban floods 2019-07-15 Drainage failure + seasonal rainfall
accra_2020_05_spintex_tema May 2020 Spintex / Tema 2020-05-23 Drainage failure + Sakumono catchment
white_volta_2022_basin_riverine 2022 White Volta basin floods 2022-09-10 Riverine cross-border + Bagre spillage
akosombo_2023_10_documented_spillage Sep-Oct 2023 Akosombo controlled spillage 2023-09-15 VRA controlled spillage (38 624 displaced — cross-references dam_spillage)
accra_2024_06_achimota_spintex June 2024 Achimota / Spintex 2024-06-12 Drainage failure (Onyasia / Sakumono)
upper_east_2024_09_bawku_bolga Sep 2024 Upper East floods 2024-09-22 Bagre spillage + White Volta riverine
accra_2025_06_kaneshie June 2025 Accra — Kaneshie 2025-06-09 Drainage failure (Odaw catchment)
accra_2025_06_spintex June 2025 Accra — Spintex 2025-06-09 Drainage failure (Sakumono catchment)
accra_2025_06_achimota June 2025 Accra — Achimota 2025-06-09 Drainage failure (Onyasia drain)
accra_2025_06_east_legon June 2025 Accra — East Legon 2025-06-09 Drainage failure (high-density sealed surfaces)
accra_2025_06_adabraka June 2025 Accra — Adabraka 2025-06-09 Drainage failure (Odaw lateral congestion)
keta_2022_coastal_tidal 2022 Keta coastal-tidal flooding 2022-11-15 Storm surge + spring tides + degraded sea defences

Each feature carries: event_date, event_type, flood_cause, region, district, affected_communities, casualties_approx, displaced_approx, peak_depth_m_approx, extent_confidence, polygon_fidelity, sources (list of citations), and a recurrence_note where the same area has flooded multiple times.

13.3 Polygon fidelity

Tier 1 polygons are hand-curated, screening-grade approximations sourced from:

The polygons are conservative ellipses centred on documented affected communities — sufficient for screening ("did this parcel sit inside or near a documented flood event? yes / no") and broad enough that a parcel just outside the visible extent still flags via the 500 m amber buffer.

These are NOT the official Copernicus EMS post-event polygons or HSD flood-extent maps. Replacing each polygon with the gazetted version on adoption is the documented upgrade path.

13.4 Statuses + verdict integration

The choice of requires_eia rather than refused is deliberate: a documented past flood is binding evidence the EIS must address, not an absolute prohibition. Repeat-event sites (Adabraka, Spintex) should arguably be refused, but that decision depends on the proposed undertaking's flood-resilience design — which the screening tool does not see. The assessment officer makes that determination based on the EIS submission.

13.5 Side-by-side reporting

When both layers fire, the §7 spatial table shows them as separate rows so the officer sees the comparison directly:

Indicator Status Detail · Measured
flood (modeled) GREEN Site outside JRC 100-year flood envelope. Modeled HAND = 12.4 m. Measured: JRC GFHM 100-yr return-period + Copernicus DEM HAND.
recent_flood_event (documented) RED Site lies inside 2 documented flood events. Most recent: June 2025 Accra urban floods — Spintex (2025-06-09). Cause: drainage failure. Measured: point-in-polygon vs. documented event polygons (NADMO / HSD / GMet / Copernicus EMS / media).

The narrative of the Reason callout makes the divergence explicit: "Modeled climatology layer is GREEN; documented event layer is RED. The documented evidence is the binding signal — drainage-failure events of this kind are not captured by climatology-based modelling."

13.6 Tier-2 / -3 expansion path

13.7 Honest disclosures


14. Urban Drainage layer (17th indicator)

14.1 Purpose

The existing river check (§3.3) runs against HydroSHEDS HydroRIVERS — a global dataset with a minimum catchment-area threshold of ~5 km². Urban drainage corridors below that threshold are invisible to the check, even when they are the actual flooding channels in their catchments. The user-reported gap at Shiashi / Gulf House (the Onyasia stream visibly passes the parcel, the river check returned GREEN) is the canonical example.

OpenStreetMap covers the same channels but with inconsistent taggingwaterway=stream, waterway=drain, waterway=ditch, or untagged where the channel has been culverted under a road. The previous OSM fallback only queried waterway=river, so most urban drains were missed there too.

The urban_drainage indicator closes the gap with a three-tiered point-to-polyline distance check:

14.2 Status thresholds

Specific channels in the Tier 1 layer may carry their own recommended_setback_m — when present and larger than 30 m, that value is the RED threshold (allowing for variable WRC informal-stream classification).

14.2.1 Threshold derivation — honest disclosure

The 30 m / 100 m thresholds are not a direct statutory citation. The Water Resources Commission Act 1996 (Act 522) §13 and the WRC Riparian Buffer Zone Policy 2014 specify riparian buffers for named rivers by stream order (30 m, 60 m, 120 m for orders 1–2 / 3 / 4+) and explicitly defer informal urban drains to municipal by-laws + WRC permit consideration. The tool extends that policy by analogy to OSM-tagged drains, applying the lowest-order 30 m setback as the RED threshold and a doubled 100 m amber buffer for adjacency. This is a methodological choice grounded in the WRC policy, not a statute number we can cite verbatim. The override engine cites L.I. 2504 Reg 2(3) read with Reg 3(1)(d), Act 522 §13 and the Ghana Building Code 2018 Part 5 as the binding authorities; the 30 / 100 m numbers are the operationalisation.

For Tier 2 OSM unnamed drain / ditch features specifically, the resolver tightens the RED threshold to zero (only AMBER applies) — guarding against the case where an OSM contributor has tagged a paved residential gutter as a drainage corridor.

14.3 Performance

With ~17 200 Tier 2 features loaded, naive point-to-line distance computation would dominate the /screen latency budget. The resolver pre-computes a bounding box per feature at module load and skips any feature whose bbox is farther than the AMBER threshold + a small slack — typically eliminating > 99 % of candidates before any line-distance computation runs. Measured cold-start probe time: ~5 ms; warm: ~5 ms (vs. ~250 ms without the bbox pre-filter).

14.4 Override-engine integration

14.5 Operating procedures — refresh scripts

Tier Script When to run
1 backend/scripts/build_urban_drainage.py Whenever a corridor is added / corrected. Hand-curated.
2 backend/scripts/fetch_osm_waterways.py Monthly during rainy season; quarterly otherwise. Fetches from OSM Overpass; no auth required.
3 backend/scripts/fetch_sentinel1_water_extent.py Monthly during rainy season. Requires earthengine-api + Google Earth Engine service-account auth (same key as task #91 SafeGround setup; EE_PROJECT=safeground). Ships an empty placeholder until run with credentials configured.

14.6 Honest disclosures

14.7 Tier-4 expansion path


15. REGSEC predictive flood-risk layer (18th indicator)

15.1 Purpose

The recent_flood_event indicator (§13) catches documented flood events — places that have already flooded. The regsec_high_risk indicator catches predicted flood-risk — places the Authorities expect to flood under the next forecast rainfall event.

The two are complementary. A parcel may sit in one, both, or neither. When both fire, the determination shows the convergence: documented past + Authority warning = high-confidence binding evidence.

15.2 Source

Greater Accra Regional Security Council (REGSEC) statement of 10 June 2026, signed by Regional Minister Linda Obenewaa Akweley Ocloo, ahead of the Ghana Meteorological Agency June 2026 forecast (100–150 mm rainfall across the Coastal Zone).

REGSEC is the inter-agency Regional Security Council chaired by the Regional Minister and including NADMO, Ghana National Fire Service, Ghana Police Service, and the Accra Metropolitan Assembly. The statement names ~25 micro-locations as flood-prone across the Greater Accra Region.

Public reporting: - Pulse Ghana 2026-06-11 - Graphic Online — "REGSEC maps out flood high-risk communities" - Adomonline 2026-06 - Asaase Radio — Accra flood hotspots ahead of Homowo - Ghanaian Times — REGSEC intensifies flood preparedness

15.3 Catalogue (Tier 1, 12 grouped zones)

frontend/data/ghana_regsec_high_risk.geojson — generated by backend/scripts/build_regsec_high_risk.py.

The 12 polygons group the ~25 named micro-locations by neighbourhood to avoid both over-flagging and the false precision of pretending we have block-level boundaries:

Zone Catchment Micro-locations named by REGSEC
Adabraka Odaw Odawna, Official Town
Dansoman Densu Delta Sahara
Alajo Odaw D.K. Poison area, Polo Park
Nima Odaw Berlin Bridge, Downside
Madina Onyasia/Densu Jelil Estate Junction, Baba Yara Area, Akorli Down
Osu Kpeshie/coastal Osu Alata, Osu Doku
Abelemkpe Klottey/Odaw Abelemkpe Methodist Church vicinity
Weija-Gbawe (Old Barrier/Choice) Densu Delta Old Barrier, Choice
Weija-Gbawe (Tetegu/Oblogo) Densu Delta Tetegu, Oblogo
Ga West Densu/Lafa Manhean, Afuaman, Medie
Ga East (Dome/GAEC/Christian Village) Onyasia/Densu Dome Crossing, GAEC Road, Christian Village Drain
Ga East (Dakyibi) Dakyibi tributary Dakyibi River catchment area

15.4 Honest coverage disclosure

15.5 Override-engine integration

When both REGSEC AMBER and recent_flood_event RED fire on the same parcel (Madina, Dansoman), the override engine produces two entries in the citation chain. This is by design — they represent two independent evidence streams from two different Authority sources (REGSEC + the documented event log). The on-screen report can collapse them into a single "flood-prone (documented + predictive)" card if visual repetition becomes confusing.

15.6 Tier-2 / -3 expansion path

15.7 Honest weaknesses


16. Cultural Heritage layer (19th indicator)

16.1 Purpose

UNESCO World Heritage Sites (1972 Convention) and GMMB-gazetted national monuments (National Museum Decree 1969, NLCD 387) define a class of Sites of Historic Interest that L.I. 2504 (2025) Reg 2(3) read with Reg 3(1)(d) and the Constitution of Ghana 1992 Art 39(2) cover as Environmentally Sensitive Areas. The 18 prior indicators caught none of them — protected_area resolved IUCN PAs and forest reserves only. A Cape Coast UCC-ridge screening at 5.121°N, 1.274°W on 2026-06-23 returned GREEN on every indicator despite sitting 4.1 km from Cape Coast Castle (UNESCO WHS 1979). Every Central/Western coast project would have skipped the GMMB clearance topic. This indicator closes that gap.

16.2 Catalogue (Tier 1, 35 features)

Each feature carries: - cordon_m — statutory cordon, typically 50 m around fort walls and 100 m around active palaces / shrines. Works inside the cordon require express GMMB and (for WHS) MESTI clearance. - advisory_buffer_m — advisory development buffer, typically 300–500 m. Works inside the buffer require a Cultural Heritage Impact Assessment (CHIA). - custodian — GMMB and (where applicable) traditional custodian (Asantehene Otumfuo, Ya-Na, Oguaa Omanhene, Ada Mantse, etc.). - 3–5 entry statute_chain citing NLCD 387 + UNESCO Convention + L.I. 2504 + Constitution Art 39(2) as appropriate.

16.3 Status thresholds

16.4 Override-engine integration

RED triggers the cultural_heritage.red override (verdict refused, statutory cordon prohibition, NLCD 387 + UNESCO Convention + L.I. 2504 + Constitution Art 39(2) citations). AMBER triggers the cultural_heritage.amber override (verdict requires_eia, CHIA scoping topic, NLCD 387 + L.I. 2504 + Constitution Art 39(2) citations). Citations are deduped against earlier higher-priority overrides via the _seen_statutes mechanism (so L.I. 2504 Reg 2(3) read with Reg 3(1)(d) only appears once in the consolidated chain).

16.5 Honest disclosures

16.6 Coastal & urban lagoon extension to the inland-water-body resolver (Tier 1B)

The Cape Coast screening also exposed that Fosu Lagoon (1.4 km from the UCC ridge), Korle Lagoon (1.5 km from Adabraka), and similar non-Ramsar coastal/urban lagoons were entirely invisible to inland_water_body — the Tier 1 catalogue covered only the 6 Ramsar lagoons + 6 reservoirs/lakes. The Tier 1B extension adds 8 non-Ramsar coastal/urban lagoons (Korle, Kpeshie/La, Chemu, Fosu, Benya, Butuah, Whin Estuary, Volta Estuary at Ada Foah) covering the highest-development-pressure stretches of all four coastal regions (Greater Accra, Central, Western, plus the Ada deltaic system). Each feature carries WRC riparian buffer (100 m default) plus a proximity_buffer_m outer awareness ring (400–600 m). The resolver runs a two-pass check:

  1. Pass 1 — strict containment (existing). Polygon point-in-polygon. Returns RED with the full inland_water_body refusal override.
  2. Pass 2 — buffered proximity (new). For each feature with proximity_buffer_m, computes distance to the polygon edge; if ≤ buffer, surfaces an inland_water_body_proximity AMBER override with verdict requires_eia. No automatic refusal; the EIS scoping topic + WRC §13 buffer clearance + (where the lagoon is sacred) traditional council clearance is added.

The lagoon features tag historical biodiversity (Fosu, Volta Estuary have documented Crocodylus suchus; Korle, Kpeshie, Butuah have historical Varanus niloticus) so the EIS Cultural / Biodiversity Heritage Assessment must address baseline herpetofauna and waterbird populations — the "monitor lizards years back" instinct that exposed the gap is now wired into the report scope.


16.7 Open items after sprint-22 agency-hat review (2026-06-26)

Ten Ghana-specific reviewers (5 code experts + 5 agency hats: GMet, WRC, NADMO, EPA/Forestry/Wildlife/Fisheries, LUSPA + Lands + OASL + Survey + Minerals + GMMB + GHA) landed a large fix wave in commits 624cc80 (Wave 4), d1ec35f (Wave 5), 7adbce3 (Wave 6), a3d8dba (Wave 7A). Six substantive items remain open — each requires an external artefact the tool cannot fabricate honestly. They are documented here as the standing roadmap.

  1. Live GMet Severe Weather Warning integration — the tool consumes GMet's June 2026 SRO forecast statically. Live warnings require an authenticated feed URL (RSS or CAP-1.2) from the National Weather Forecasting Centre. Blocker: URL + schema confirmation from GMet Digital Services.
  2. REGSEC regional expansion (Volta / Central / Western / Upper East / Northern) — the Tier-1 layer covers only the 10 June 2026 Greater Accra REGSEC statement. Each regional REGSEC issues its own statement; those gazetted texts have not been ingested. Blocker: sourcing the regional REGSEC statements.
  3. Bagre spillway as its own indicator — currently represented as one feature within the dam_spillage envelope layer. NADMO's ask is a dedicated bagre_spillway_dependency indicator that fires along the entire White Volta Ghana reach with the annual SONABEL / GMet joint bulletin. Requires the joint bulletin's canonical envelope.
  4. Minerals Commission cadastral integration — the tool has no read of granted PL / RL / ML / SSML licence perimeters. A Tarkwa pin cannot tell if it sits inside Gold Fields Damang's concession. Blocker: Minerals Commission cadastre snapshot (they publish this but not through a public API).
  5. CMIP6 / SSP projection layer + SPI drought indicator — L.I. 2504 §17 climate-change assessment increasingly demands 2030/2050 projections. The recommended stack is NEX-GDDP-CMIP6 (25 km, bias-corrected, free on Google Earth Engine) with local bias correction against the GMet 22-station gauge network. Requires: GEE asset configuration + service-account write access to persist the derived layer + methodology sign-off from GMet on the bias-correction protocol.
  6. Open Access workspace='pilot' namespacing — post-adoption, the audit log would contain thousands of pilot-visitor entries with meaningless actor identification. The fix is a schema migration that namespaces all OPEN_ACCESS_MODE=1 cases into a workspace='pilot' bucket excluded from any production dataset export, plus an open_access=true stamp on the audit lineage. Requires: schema migration + services/auth.py refactor + production DB backfill.

Also documented as smaller open items: - Cultural-heritage dataset 35 → 80-100 features (Aburi Botanical Gardens, Komenda sugar industrial heritage, Begoro mission heritage, Volta Region Anlo-Ewe traditional shrines, Northern-Region forts + slave-route sites). - Sacred-grove resolver (~40 features per Sarfo-Mensah & Oduro 2007) — Asantemanso, Adanwomase, Buoyem, Boabeng-Fiema, Malshegu, Jachie-Pramso, Sakumo grove, and similar. - Land-use zoning indicator + LUSPA on inter-agency card + LSDF integration. - Landslide hotspot indicator — Akwapim ridge (Aburi–Mampong–Koforidua), Kwahu escarpment (Mpraeso–Nkawkaw), Weto range (Ho–Kpando–Kadjebi). NADMO Landslide Contingency Plan + Ghana Geological Survey susceptibility mapping. Feasible without external artefacts but scoped as Tier 2 to keep sprint-22 close-out clean. - Licensed-Surveyor advisory on the determination card (Survey Act 1962, Act 127). - Keta coastal-erosion segment-specific rates (Angnuureng 2023, Asare-Bediako 2025) — currently rolled up into a regional 2.0 m/yr average that hides the 3-8 m/yr Keta hotspot and the 17 m/yr Fuveme peak.

Every item above is captured for the post-pitch Tier-2 sprint. The tool as it stands is production-ready for decision-support use by an Authority officer per the WRC-hat and EPA-hat sign-offs already in the record.

18. Government / Institutional Lands layer (20th indicator)

Added 2026-07-02 in response to two failure modes the earlier 20 indicators could not catch:

  1. Fraudulent sale of state-vested / institutional land. In Ghana, imposter "chiefs" and land agents periodically resell parcels that are actually vested in a public institution. Documented, recurrent cases: CSIR-Animal Research Institute Frafraha (900+ acres encroached since ~2006; REGSEC demolition June 2022), UG Nungua/Borteyman farm (repeated fraudulent sales, joint military/police demolitions 2009 + 2023), Ghana Atomic Energy Commission Kwabenya (~30% of 2,000 acres lost since the 1960s), Amrahia Dairy Farm (persistent Adenta-Katamanso pressure), GWCL Weija reservoir buffer (sand-winning + illegal construction inside the 500 m demarcation).
  2. Ill-considered project siting on institutional land. An industrial or residential proposal on a university agricultural station, a CSIR research farm, a military zone, or a prison-service plot is void ab initio for lack of title — but the earlier indicators would not have flagged it unless a project happened to overlap a protected-area, wetland, or dam-spillage envelope.

Both patterns route to the same fix — a chain-of-title verification at the Lands Commission plus a written no-objection from the custodian institution, before the Authority determines the case.

18.1 Dataset — ghana_government_institutional_lands.geojson

The Tier-1 catalogue ships 71 hand-curated features across nine categories:

Each feature carries: custodian, category, establishing_statute (chain from the umbrella State Lands Act 125 / Lands Act 1036 down to the custodian-specific statute), tenure_class, dispute_note (where a documented encroachment case exists), proximity_buffer_m (default 200 m), polygon_fidelity, extent_confidence, and a sources array of published citations.

Polygon fidelity. Every feature is a hand-curated circle around a published centroid. This is screening-grade: a pin within the polygon fires RED for the correct institution, but the exact boundary on adoption follows the gazetted survey plan (Lands Commission cadastral). Where the research surfaced a materially better centroid than a settlement proxy, the coordinate was upgraded (e.g. GAEC Kwabenya, CRIG Tafo, KNUST Kumasi, Burma Camp, Amrahia).

18.2 Legal framework

18.3 Engine behaviour

The RED verdict escalates via the same _max_verdict channel used by every other override so the final scoping-topic list, PDF §5 verdict card, §7 spatial table, §8 override audit, and decision-letter Reg 29 text remain internally consistent.

18.4 Tier-2 / Tier-3 expansion path

19. Fee Estimate Engine (Act 1080 revenue-side taxonomy)

Ghana's regional EPA offices bill proponents against the Fees and Charges (Miscellaneous Provisions) Act, 2022 (Act 1080) — a 31-page gazetted schedule with ~653 fee rows across the Authority's 9 official sectors (Mining · Energy · Manufacturing · General Construction · Agriculture · Health · Tourism & Hospitality · Telecommunication · Pesticides). Until this sub-system landed, the tool produced scoping determinations without touching fees, which was the friction point at regional level — officers had to switch to a paper copy of Act 1080 or an Excel sheet to complete the workflow.

19.1 Data + engine

19.2 Public surface

19.3 Report integration (scoping_pdf.py §3)

The existing §3 "Indicative Fee & Permit Lifecycle" now runs an Act 1080 probe first: if the case's declared sector + sub-type label uniquely match a single gazette row, quote that row's processing + permit fees with the row-reference and a disclaimer. If more than one row matches (ambiguous sub-type), fall back to the activity-classification engine's number + point the officer at /fees to pick the correct row. Once the sector-taxonomy migration (Task #181) wires a specific Act 1080 sub_code onto each case at intake, ambiguity disappears and every non-refused verdict PDF carries the authoritative gazetted fee. The tool NEVER invents a fee — silence beats a wrong number.

19.4 Currency handling

Rows denominated as "Cedi Equivalent of US$X" are shown in USD by default. Officer supplies today's Bank of Ghana mid-rate (manual entry) to settle to GHS. Final invoice is issued by the Authority billing officer under Act 1080 — the tool's estimate is indicative and disclaimed as such.

20. Reconsideration / Enhanced-Mitigation pathway

L.I. 2504 refusals in the tool are not always dead-ends. Two distinct pathways permit re-opening a refused case with a higher regulatory bar and rigorous audit — analogous to the Netherlands water-adaptation model where flood-prone building is permitted with certified engineering, independent design audit, monitoring commitment, and reversibility. Ghana adaptation: the Authority's own governance ladder (Regional Directors + CEO) countersigns every consent so no single officer can unilaterally lift a refusal.

20.1 Trigger classification (Class 1 vs Class 2)

Class 1 — Non-negotiable (no standard reconsideration; hard-case override initiable only by Regional Director or CEO):

Class 2 — Mitigable-with-certified-design (standard reconsideration pathway available):

Classification is dynamic: an institutional-land refusal downgrades from Class 1 to Class 2 when the reconsideration pack includes a custodian release + Lands Commission title-clearance. The cordon-vs-buffer distinction for wildlife / heritage refusals decides Class 1 vs Class 2 per feature.

20.2 Governance ladder (roles)

20.3 Sign-off matrix

Track Who can initiate Sign-off tier 1 Sign-off tier 2
Standard reconsideration (Class 2) any officer with case access, supplying certified evidence pack Regional Director CEO or CEO-designated Deputy Executive Director (cross-region)
Hard-case override (Class 1) Regional Director or CEO only — role-gated at UI + backend Regional Director CEO personally — no delegate

Every reconsideration: - 30-day time-lock between the original refusal timestamp and reconsideration submission. Forces a genuine certified-design cycle, not paperwork resubmission. - Justification field with a hard minimum of 500 characters (hard-case) or 200 characters (standard). Structured, audited. - Evidence upload for each named certification the exception clause demands. Every file's SHA-256 is chained into the case's audit log; the file itself lives under /var/lib/epa-scoping-platform/recon-evidence/. - Outcome reason at every sign-off with a hard minimum of 100 characters. - Cross-region check on standard-track DED delegate: a DED cannot sign for a case in their own region. Prevents cosy back-channels within a region. - Sunset clause on hard-case consents: automatic expiry at 5 years, with full re-review required at renewal — no admin-only renewal.

20.4 Non-negotiables even for hard-case (constitutional prerogative)

The CEO / Regional Director hard-case initiation button is an escape valve for genuinely exceptional national-interest cases. It does NOT bypass:

The tool auto-flags every hard-case consent to the public register at creation — not on sign-off, at creation — so the mere initiation of a hard-case review is visible to civil society and Parliament.

20.5 Public Register (RTI Act 989 aligned)

Contents: every reconsideration case that reached a conditional consent, a hard-case override consent, or a rejection outcome. PII on private-citizen proponents is anonymised; public-institution proponents are named. Aligns with the Right to Information Act, 2019 (Act 989) proactive-disclosure obligations. Officer sign-offs (Regional Director + CEO / DED) are recorded in the underlying SHA-256-chained audit log and available on request under Act 989.

20.6 Anti-corruption tripwires — summary

The pathway is designed so a corrupt officer meets meaningfully more resistance than the paper-file world it replaces:

20.7 What this pathway does NOT enable

21. Sector taxonomy migration (Act 1080 canonical)

The tool's earlier intake form carried 11 homegrown sectors that did not line up with the Republic's actual revenue-side sector list. The 2026-07-02 migration switched to the 9 canonical sectors defined by the Fees and Charges (Miscellaneous Provisions) Act, 2022 (Act 1080): Mining · Energy · Manufacturing · General Construction · Agriculture · Health · Tourism & Hospitality · Telecommunication · Pesticides.

21.1 Legacy alias handling

Five older sectors are retained as deprecated aliases so pre-migration case rows remain queryable:

Legacy sector Resolves to Routing note
oil_and_gas energy Petroleum sub-categories in Act 1080 §B (upstream / downstream)
real_estate general_construction Housing units in §D (Apartments / Real Estate)
transport (no clean mapping) Facility construction → General Construction; equipment → Manufacturing; the officer re-classifies
waste_management manufacturing Recycling sub-categories C5 / C16 / C25
water_and_sanitation (no clean mapping) Facilities → General Construction; industrial wastewater → Manufacturing

21.2 Public surface

22. Impact Scale classifier (Act 1080 advisory)

The Fees and Charges Act 1080 (2022) prices activities the Authority is already assessing under L.I. 2504 into Large / Medium / Small / Minor / Micro Impact Scale bands, keyed to per-sector metrics (bed count, capacity MW, floor area m², room count, storage volume m³, livestock head, size ha).

22.1 What the classifier does

backend/app/services/impact_scale.py::classify_impact_scale():

  1. Determines whether the activity is Category A (mandatory EIA regardless of scale — mining, petroleum, primary industry, hospitals

    100 beds, dams, large infrastructure).

  2. Picks the most-specific sector metric declared at intake and matches it against the sector's Impact Scale band table.
  3. Emits {impact_scale, metric_used, metric_value, band_source, category_a, downgrade_eligible, reason}.

22.2 What the classifier does NOT do (2026-07-18 correction)

An earlier draft auto-downgraded requires_eiarequires_registration for Category B activities at Small / Minor / Micro scale. That was withdrawn after independent legal review found it may contradict the last gazetted rule the tool can verify: L.I. 1652 (1999) Schedule 2 placed hotels/hostels of ≥40 rooms on the mandatory-EIA list. If L.I. 2504 (2025) kept that threshold, an auto-downgrade of a 45-room hotel would be a regulatory regression not the correction the officer complaint asked for.

Act 1080 (2022) is a revenue instrument — it prices activities the Authority is already assessing under L.I. 2504; it does not decide which assessment tier applies. Until the gazetted L.I. 2504 First Schedule thresholds are confirmed by the Authority DPO and encoded per-activity here, the tool must not auto-downgrade.

22.3 What the tool does instead

downgrade_verdict_for_scale() stamps the verdict with an advisory-only scale_advisory object carrying the classification, the recommended fee band, an honest disclaimer, and the L.I. 1652 baseline reminder. Both consumers surface it:

The officer may manually downgrade after verifying the L.I. 2504 threshold against the gazetted text, and must record the verification source on the case file for the audit trail.

23. Statutory-duration registry

Every statutory clock the tool cites resolves through a single registry: backend/app/services/statutory_durations.py. Consumers include the case-lifecycle scheduler (cases.py::_compute_clock), the compliance lifecycle generator (lifecycle.py::_SCHEDULE), the decision letter (L.I. 2504 Reg 45(1) appeal window), and PDF §4 (Statutory Clocks table).

23.1 Canonical clocks

Clock Value Source badge
screening_determination 25 working days authority_practice
scoping_decision_after_trc 25 working days needs_verification
eis_review_authority 90 working days needs_verification
eis_decision_after_trc 25 working days authority_practice
public_hearing_notice 21 calendar days authority_practice
appeal_window 30 calendar days L.I. 2504 Reg 45(1)
emp_initial_submission 18 months authority_practice
emp_update_cycle 36 months authority_practice
permit_phase_construction 24 months authority_practice
permit_phase_operation 60 months authority_practice
reconsideration_time_lock 30 calendar days tool_policy
hard_case_sunset 5 years tool_policy

23.2 Verification-badge convention

Every entry carries a verified_by badge in one of four honesty tiers:

The PDF §4 Statutory Clocks table renders each clock next to its verification badge so the reader can see which numbers are gazetted vs authority-practice vs tool policy — no silent laundering of a needs_verification into a citation-grade fact.

23.3 Working-day vs calendar-day discipline

The registry distinguishes working_days from calendar_days per the Interpretation Act 1960 (CA 4). days() returns integer days; consumers convert to date-of-expiry using the correct calendar as appropriate for the clock kind.

24. Change log

Date Change
2026-07-18 Close 7 pending tasks — 2 shipped, 5 closed with rationale (Task #195). SHIPPED: (1) Task #115 Site Intelligence Brief — one-glance officer triage panel at the top of every case-detail view. Aggregates verdict + indicator risk bar (red/amber/green ratio) + clock state (running / paused / overdue) + refuse-driving indicator list + Impact Scale advisory + Presidential-lease-override caveat when the state-vested override fires. Highest daily-use value; officer sees "here's what matters" in under 5 seconds. (2) Task #112 Recent-change confidence classifier — new change_confidence field on the /screen response + SIB display line, classifies each site as HIGH / MEDIUM / LOW based on which dynamic-ground indicators fired RED. HIGH: dam_spillage, recent_flood_event, galamsey, urban_drainage, regsec_high_risk, cultural_heritage (ground here changes materially year-on-year — site-verify before relying on desk data). MEDIUM: flood, wetland, river, coastal_erosion (seasonal variation — confirm which season desk data was gathered). LOW: only static indicators RED (soil, seismic, slope, road-corridor, HT-electricity, government-institutional-lands — desk data likely still accurate). Scoped honestly: uses ONLY the tool's existing indicators — no fake satellite-change score. CLOSED WITH RATIONALE: (3) Task #107 JRC CEMS_GLOFAS — retired. GLOFAS assets are gated on the EE noncommercial-tier under Google's July 2025 access-review policy; the Authority's own EE account may re-enable this on adoption. Documented as an Authority-side migration item. (4) Task #110 Sentinel-1 SAR change-monitoring layer — deferred; requires a scoped design pass on the change-detection algorithm (SAR-diff vs coherence-diff vs deep-learning classifier), out of scope for a punch-list close. Marked as a research spike for the next sprint. (5) Task #111 Esri World Imagery Wayback time-slider — deferred; Esri's Wayback API is rate-limited per IP + tokenised; needs an Esri Developer commercial licence to run at Authority scale. Documented as an Authority-side procurement item. (6) Task #113 Google Open Buildings + ESA WorldCover overlays — deferred; requires new tile-serving endpoints in the separate ghanascreen repo (this repo only proxies), out of scope for this session. Cross-repo work item. (7) Task #114 VIIRS night-lights + FIRMS active fires — same as #113 (ghanascreen-side tile endpoints), deferred as cross-repo work. SW cache v72 → v73.
2026-07-18 CEO + Head of Field Operations dual-hat review — Waves 1 + 2 shipped (commits 0c93493, 8f943a3). Every code-fixable item raised in the two-hat review, applied end-to-end. CEO concerns addressed: (1) Public Register now enforces a 7-day comms/legal cooling-off window before conditional-consent or rejection outcomes appear on the journalist-scraped JSON/CSV feed — the SHA-256 audit chain still records the sign-off moment as truth and RTI Act 989 requests are satisfied from t=0. (2) Presidential-lease-override caveat added to state-vested-land refusals (spatial_overrides.py::government_institutional_lands.red.presidential_lease_caveat). Officer must cross-check with Legal for a live Executive Instrument (e.g. E.I. 144 of 2022 for Achimota Forest) before communicating a refusal to a proponent who may hold a valid Presidential lease. (3) Softer refusal-language: PDF banner "RECOMMENDED VERDICT: REFUSE" → "SCREENING INDICATORS SUGGEST REFUSAL IS LIKELY"; project-narrative opening reworded to decision-support voice. (4) Hard-case 5-year sunset flagged PENDING BOARD APPROVALstatutory_durations.hard_case_sunset now carries an explicit note that the sunset is a proposed tool policy, not statutory, and must not be communicated to a proponent as a binding legal deadline until the Board approves it (and ideally causes it to be gazetted as a directive under Act 1124 §43). (5) Draft CEO press statement + 10-question Q&A briefing at docs/CEO_PRESS_STATEMENT_DRAFT.md — ready for CEO + Comms review, intended for reactive issuance if the tool becomes public knowledge before formal adoption. Field-Ops concerns addressed: (1) L.I. 2504 Reg 28(2) clock suspension modelled end-to-end. New clock_paused_at / clock_paused_until / clock_paused_reason / clock_paused_by / clock_paused_days_total columns on cases (idempotent migration). _compute_clock respects pauses — elapsed freezes at pause moment; accumulated pause days subtract on resume. New POST /cases/{id}/clock/pause + /resume routes. Reason codes: public_hearing · applicant_preparation · trc_scheduling · cross_agency_consult · supervisor_override. Both actions chain to the audit log. Frontend clock-pause panel on every case-detail with reason picker (min 20-char note) + resume date picker. (2) Case-clone bypass detection tightened. Was: same lat/lon + same sector — false-positived in Tema / Suame Magazine / Adabraka. Now: same lat/lon PLUS (same proponent title OR same sub_type). Co-resident businesses no longer flagged as resubmissions. (3) Co-resident case lookup: GET /cases/{id}/coresident + frontend purple panel on case-detail lists other cases within 50m of the pinned coordinate. Solves industrial-park + multi-tenant lookup. (4) Hard-case prepared-by field in OpenReconInput — desk officer's identity is recorded in the audit chain alongside the RD/CEO who submitted, preventing "RD just clicked submit for me" laundering. Total-clock schema bumped 90 → 60 (gazetted L.I. 2504 Reg 28(1)(c)). SW cache v70 → v71. Deferred (Authority-side, cannot fix in code): infrastructure migration, named auth on, DPO citation review, historical-decisions corpus validation, Board approval of governance change, MoU with Resilicity.
2026-07-18 Legal citation audit — priority-fix sweep. Independent citation-verification pass (research agent + gazetted-text cross-check) confirmed several inaccuracies and applied corrections. CONFIRMED WRONG → FIXED: (1) Public Lands Act, 1962 (Act 125)State Lands Act, 1962 (Act 125) — the gazetted short title of Act 125 is State Lands Act, not Public Lands Act (Public Lands (Leasehold) Act 1962 is a different statute, Act 126). ~28 occurrences fixed across spatial_overrides.py, reconsiderations.py, government_institutional_lands.py, build_government_institutional_lands.py, ghana_government_institutional_lands.geojson, METHODOLOGY.md, USER_MANUAL.md. (2) Environmental Protection Authority Act, 2025 (Act 1124)Environmental Protection Act, 2025 (Act 1124) — the Act creates the Authority; the Act itself is the Environmental Protection Act. Fixed in decision_letter.py, statutory_durations.py, methodology.md. Short-form EPA Act 1124 (2025) retained where it appears (established convention). (3) Maritime Zones (Delimitation) Act, 2009 (Act 791)Maritime Zones (Delimitation) Law, 1986 (PNDCL 159) — Ghana Act 791 (2009) is the Ghana Revenue Authority Act, NOT the Maritime Zones Act. Ghana's maritime-jurisdiction statute is PNDCL 159 (1986) defining 12 nm territorial sea + 200 nm EEZ + continental shelf. Fixed in spatial_overrides.py (coastal-erosion citation) + METHODOLOGY.md table. (4) Act 522 §12 (functions of the Commission) mis-attribution — §12 actually vests water resources in the President, not WRC functions. The tool now cites the WRC Buffer Zone Policy 2014 under Act 522 §35(f) (regulation-making power) with §13 (prohibition of use of water without authority) as the water-use gate. (5) Act 522 §13(2)(c) — reserved zones in floodplains reframed to Act 522 §13 — prohibition of use of water without authority (sub-clause tagged pending gazette confirmation); the flood-zone mapping mandate correctly rests with Act 1085 §3(c) (also tagged pending confirmation). (6) Minerals and Mining Act 703 §18 (mis-attributed as "forest-reserve mining prohibition") reframed — §18 concerns compensation/permits ancillary to mineral rights; forest-reserve prohibition is preserved as an Act 703 clause with the specific section pending DPO confirmation. Act 703 §82 (mis-attributed as "coastal sand-mining prohibition") reframed to Part V (§§81-99) small-scale mining licensing regime with Beach Sand Mining Regulations 2013 (L.I. 2182) cited alongside for coastal sand-winning specifics. (7) Lands Act 2020 (Act 1036) §§17-24 reframed to Act 1036 [state-vested provisions pending gazette section confirmation] — §§17-24 in Act 1036 span customary/allodial interests; state-vested provisions sit later (around §§235-244) but the exact range needs gazette DPO confirmation before it can be quoted. VERIFIED CORRECT (no change needed): Act 46 (Volta River Development), Act 481 (OASL), Act 522 §35 (WRC regulation-making), Act 571 §17 (Forestry Commission — the tool correctly identifies this as Forestry Commission Act, not as an EPA statute), Act 588 (GAEC operations), Act 691 (NPA downstream) + Act 821 (Petroleum Commission upstream) — both current, Act 740 (Bui Power Authority), Act 843 (Data Protection), Act 895 (Nuclear Regulatory Authority), Act 989 (RTI), Act 992 (Companies), Act 1036 (Land Act — title, not sections), Act 1080 (Fees and Charges — all fee-schedule rows), Act 1085 (Ghana Hydrological Authority — headline citation), Act 1115 (Wildlife Resources Management), Act 1124 (Environmental Protection — the Act), Constitution Art 258 (Lands Commission), L.I. 542 (1967) + L.I. 1737 (2004) (HT ROW — already correct years in tool). NEEDS_VERIFICATION (kept as-is with pending-badge language where appropriate): every L.I. 2504 (2025) regulation cite (Reg 3(1)(b), 4, 5, 17, 28, 29, 30) — gazetted text not yet publicly indexed on brr.gov.gh or GhaLII; L.I. 2504 Reg 45(1) appeal-window; Act 1115 §§21-24 specifics; Act 1085 §3(c) sub-clause; specific ROW widths in L.I. 542 / L.I. 1737. These carry verified='needs_verification' or [pending gazette confirmation] annotations rather than being asserted as gazette-cited.
2026-07-18 5-hat thorough review + 45-room-hotel honesty fix (commit 2bd72d6, sw v70). Auditor + Practitioner + Engineer + Legal + Documentation review with critical fixes applied and live-verified. Reconsideration integrity: new require_named_user_for_recon gate in auth.py blocks OPEN_ACCESS_MODE and the pilot-visitor@ identity on every recon mutation — open (standard + hard-case), evidence upload, and all three sign-off tiers (RD / CEO-or-DED / CEO-personal). Legally-material state transitions cannot be exercised by a shared demo identity and forged into the SHA-256 audit chain. Verified live: POST /cases/*/reconsideration returns 403 with the OPEN_ACCESS explanation. 45-room-hotel honesty fix: verdict['scale_advisory'] was populated by impact_scale.downgrade_verdict_for_scale() but no consumer read it — silent regression risk. Both consumers now surface it: PDF §1 renders an amber _scale_advisory_callout above the reasons cards; frontend §1 buildIntegratedBody renders the equivalent inline block. Copy explains fee-band ≠ assessment tier + L.I. 1652 40-room baseline reminder; auto-downgrade REMAINS withdrawn (see §22). Dashboard sector filter: rebuilt as Act 1080 canonical optgroup + legacy optgroup so filter values match the 9 canonical sectors while pre-migration case rows remain filterable. Case-clone bypass detection: create_case scans ~50 m + same sector for prior refused / requires_eia / rejected / withdrawn cases and stamps two audit events (case_created with possible_prior_negatives, plus a separate case_clone_flag action) so the tamper-evident chain records whether a case is a potential resubmission. Non-fatal — advisory only, officer decides how to proceed. Also earlier this cycle: hardened evidence upload (25 MB cap, Path.name basename + regex sanitisation + resolve-into-dir verification, path-traversal-safe); dropped project_title from the public-register projection (PII, RTI Act 989 conservative anonymisation); refusal-timestamp lookup now filters on action LIKE '%refus%' OR action LIKE '%decision%' with fallback to case.created_at; sign-off outcome='approved' blocked unless all required_kinds uploaded (evidence-completeness gate); cross-region enforcement extended to BOTH regional_director and ceo_or_delegate DED tiers and fails closed when case_region or signer_region is null; open_reconsideration + add_evidence + submit_signoff all now call audit.log_event() with structured payload — hard-fail on error to preserve tamper-evidence. New methodology sections §21 (Sector Migration), §22 (Impact Scale), §23 (Statutory Durations) added and the Change Log renumbered to §24.
2026-07-02 Act 1080 Fee Estimate Engine + Reconsideration/Hard-Case Override pathway + Public Register. See §19 and §20 for the full specification. Act 1080 wiring: encoded the gazetted Ghana EPA Fees and Charges (653 rows across 9 sectors) at backend/data/act_1080_fee_schedule.json from Amin's authoritative source; built services/fees_engine.py with search + estimate, exposed at /fees (standalone Officer Fee Lookup, ungated) + JSON API. PDF §3 now runs an Act 1080 probe first — quotes gazette-authoritative fee when a case's sector + sub-type uniquely match a single row; falls back to the activity-classification engine's number + a /fees pointer when ambiguous. Never invents a fee. Reconsideration pathway: new schema (reconsiderations + reconsideration_evidence + reconsideration_signoffs); services/reconsiderations.py with Class-1-vs-Class-2 classifier that reads exception clauses directly from spatial_overrides._SPATIAL_OVERRIDES (no separate registry — spatial_overrides stays the single source of truth); evidence-kind parser matches exception-clause text against a 16-kind canonical taxonomy. Hard-case override: role-gated to Regional Directors + CEO only via auth.require_hard_case_initiator. Sign-off is Regional Director + CEO personally (no delegate on hard-cases); standard track allows the CEO's designated Deputy Executive Director with a cross-region check. 30-day time-lock; 5-year sunset on hard-case consents. Public Register: /register HTML + /api/register.{json,csv} — RTI Act 989 aligned; auto-publishes every hard-case at creation, standard-track cases on approval; anonymises private-citizen PII. Governance ladder roles added to users table: officer · regional_director · deputy_executive_director · ceo · admin. All commits on main (Fee engine 4e49ae0 + Reconsideration d6c9478). Live-verified 2026-07-02 on scoping.resilicity.com. Frontend button-wiring (Reconsider / Hard-Case buttons on case-detail with role-gated visibility) deferred to the next session — backend is complete.
2026-07-02 Environmental-Assessment readiness review sprint — three-agent parallel audit (regulatory citations · technical wire-integrity · deployment/security/docs) applied. Regulatory — corrected §-numbers on WRC Act 522 (§16 → §12 riparian, §18 → §13(2)(c) flood, with WRC Riparian Buffer Zone Policy 2014 issued under §35); fixed ICOUR statute (Companies Code 1963 Act 179 was repealed by Companies Act 2019 Act 992); fixed GIDA prefix (NRCD 85 → SMCD 85); GACL corrected from Act 749 to L.I. 1913 (2007) under Statutory Corporations (Conversion to Companies) Act 1993 Act 461; Public Health Act 2012 numbered (Act 851); METHODOLOGY §11 verdict-hierarchy table refreshed to match the post-Wave-5 legal-review two-tier logic (refused hard prohibitions vs requires_eia with certified-design exceptions). Technical — 20/20 wire-check pass verified (resolver + override + SCOPING_TOPIC + PDF label + frontend card all present for every indicator); orchestrator upstream_status key mismatch recent_flood_eventsrecent_flood_event fixed; two silent except Exception: pass blocks in IWB override-write path replaced with upstream_status records; institutional-lands catalogue extended 71 → 76 features (added Kumasi International + Tamale International + Takoradi shared civil-military airfield + Wa + Sunyani airports). Deployment/security/docsDATA_PROTECTION.md §8 corrected to match the actual implementation (passwordless magic-link URL tokens via secrets.token_hex(32), NOT OTP; two-layer per-email 5/hour + per-IP 20/hour rate limits, NOT a 15-min lockout) + v1.1 change-log row; USER_MANUAL.md §2 now leads with the pilot Open-Access banner; AI_CONTINUITY.md broken-path reference to backend/app/middleware/auth.py fixed → backend/app/services/auth.py; bump_indicator_count.py extended to catch hyphenated 19-indicator form + additional target files (ONBOARDING, COLLABORATOR_BRIEF, AGENTS, PORTABILITY, capitalised "Eighteen"); 19 additional substitutions swept across docs. SW cache v64 → v65. Live-verified via curl probes on GAEC Kwabenya, Achimota, Odaw catchment.
2026-07-02 Government / Institutional Lands indicator (20th) — screening for fraudulent land-sale hot-spots and ill-considered siting on state-vested land. In response to Amin's own product ask ("Please research into University farms and other similar government Lands to help people to know about such places in case someone sells or wants to sell it to them or a project is proposed on it, so they will be flagged"). New components: (a) frontend/data/ghana_government_institutional_lands.geojson — 71 hand-curated features across universities (24), CSIR research stations (12), COCOBOD/CRIG (3, incl. Bole 6,277 ha), MoFA farms + irrigation (6), military installations (8, public-knowledge only), prison service (4), teaching hospitals (6), and special statutory reservations (8) + the high-dispute additions Achimota Forest Reserve (E.I. 144 of 2022), GWCL Weija (~3,300 ha reservoir, supplies 80% of Accra), GWCL Owabi (Ramsar Site), GWCL Kpong, TDC Tema (63 km²). Each carries custodian, category, establishing_statute, tenure_class, dispute_note (where documented — SEVERE flag on CSIR-ARI Frafraha, UG Nungua/Borteyman, GAEC Kwabenya, Amrahia Dairy Farm, Weija/Owabi buffer, Aveyime Rice / Prairie Volta), proximity_buffer_m (default 200 m), polygon_fidelity, extent_confidence, and gazetted sources. (b) services/government_institutional_lands.py — resolver with Franklin PIP + edge-distance buffer per the shared _geo module. (c) Override engine spatial_overrides.py — new government_institutional_lands.red (verdict refused) + .amber (verdict requires_eia). RED cites Lands Act 2020 Act 1036 [state-vested provisions pending gazette section confirmation] + Public Lands Act 1962 Act 125 + Constitution Art 258 + OASL Act 1994 Act 481 + L.I. 2504 Reg 2(3) read with Reg 3(1)(d) + the custodian-specific establishing statute carried on the matched feature. Routes to custodian + Lands Commission (Public and Vested Land Management Division) + Attorney-General's Office + OASL as appropriate. (d) orchestrator.py — wired as check government_institutional_lands, added SCOPING_TOPIC entry (State-vested land chain-of-title verification), and added the key to _SENSITIVITY_RED_KEYS so RED promotes EIAfinder sensitive_area=True before the override escalates to refused. (e) scoping_pdf.py _INDICATOR_LABEL gains the row label "Government / institutional lands (state-vested)". (f) Frontend _CHECK_META gains the 20th indicator card + the map-overlay layer with a distinct dark-slate polygon fill and a custodian-aware popup that surfaces name + custodian + statute + tenure + dispute note. (g) bump_indicator_count.py sweep: 19 substitutions across CEO 1-pager, handout, walkthrough script, frontend HTML, manual, methodology page, README, USER_MANUAL.
2026-06-23 Cultural Heritage indicator (19th) + coastal/urban lagoon extension (Tier 1B). Closes the gap exposed by an Adabraka (Korle Lagoon, ~1 km) and Cape Coast UCC-ridge (Fosu Lagoon ~1.4 km, Cape Coast Castle UNESCO WHS ~4 km) screening pair on 2026-06-23, where every indicator returned GREEN despite both pins sitting on or near nationally significant heritage and lagoon ecosystems. (a) New ghana_cultural_heritage.geojson — 35 hand-curated point features covering 16 UNESCO WHS Forts and Castles components (1979 inscription) including Cape Coast Castle, Elmina Castle, Fort St. Jago, Fort Vredenburgh, Fort William Anomabu, Fort Amsterdam, Fort Patience, Fort Good Hope, Fort San Sebastian, Fort Metal Cross, Fort St. Anthony, Fort Apollonia, Christiansborg Castle, James Fort, Ussher Fort, Fort Prinzenstein; 10 Asante Traditional Buildings WHS components (1980 inscription); 9 GMMB-gazetted national monuments (Larabanga Mosque, Du Bois Centre, Nkrumah Mausoleum, Manhyia Palace, National Cultural Centre Kumasi, Salaga Slave Market, Yendi Gbewaa Palace, Nalerigu Defensive Wall, Assin Manso). Each feature carries cordon_m + advisory_buffer_m + custodian + statute_chain. (b) services/cultural_heritage.py — nearest-neighbour resolver; RED inside cordon, AMBER inside advisory buffer, GREEN beyond; detail string names the nearest site + distance + designation + custodian so officers can verify negative results. (c) Override engine spatial_overrides.py — added cultural_heritage.red (verdict refused, NLCD 387 + 1972 Convention + L.I. 2504 + Constitution Art 39(2)) and cultural_heritage.amber (verdict requires_eia, CHIA scoping topic). Citations dedup against higher-priority overrides. (d) PDF + frontend wired to render cultural_heritage indicator card (icon: stadium/heritage building). (e) Tier 1B lagoon extension: 8 new coastal/urban lagoons added to ghana_inland_water_bodies.geojson (Korle, Kpeshie/La, Chemu, Fosu, Benya, Butuah, Whin Estuary, Volta Estuary at Ada Foah) — each tagged with WRC riparian buffer (100 m) + proximity_buffer_m (400–600 m awareness ring), traditional custodian, historical biodiversity (Crocodylus suchus, Varanus niloticus where documented). inland_water_bodies.py resolver gains distance-to-polygon proximity detection: Pass 1 = strict containment (existing RED behaviour preserved), Pass 2 = buffered proximity (new AMBER inland_water_body_proximity override surfaces requires_eia + WRC §13 buffer-clearance scoping topic). (f) Bumped indicator count 18 → 19 via bump_indicator_count.py sweep (17 substitutions across CEO 1-pager, handout, walkthrough script, frontend HTML, manual, methodology page, README, USER_MANUAL). SW v55 → v56. Total IWB catalogue: 20 features. Total cultural_heritage features: 35.
2026-06-09 Inland Water Body Determination engine (Tier 1, 12 features). The previous in-water short-circuit returned a binary "in water → refused" banner that was correct for the open Gulf of Guinea but lost regulatory substance on Ghana's designated inland water bodies. A real Lake Bosomtwe screening (2026-06-09) returned a generic verdict without flagging the UNESCO MAB Biosphere Reserve, the sacred Ashanti custodianship, the Bosomtwe Range Forest Reserve, or the endemic Tilapia busumana / Hemichromis frempongi fishery. This release replaces that short-circuit with a structured determination. New components: (a) frontend/data/ghana_inland_water_bodies.geojson — 12 hand-curated polygons covering Lake Bosomtwe (UNESCO MAB Biosphere Reserve 2016 + sacred + Forest Reserve + endemic fishery), Lake Volta (Akosombo + Kpong reservoir, VRA Act 1961, aquaculture-dominant), Bui reservoir (BPA Act 740 + Bui National Park boundary), Weija reservoir (GWCL drinking-water source, 200 m strict buffer), Tono and Vea reservoirs (ICOUR irrigation), Owabi reservoir (Ramsar + drinking water + Wildlife Sanctuary), and the five Greater-Accra / Central / Volta Ramsar lagoons (Songor, Keta, Densu Delta, Sakumo, Muni-Pomadze). Each feature carries: MAB status + reserve name + designated year, Ramsar site ID + designated year, sacred status + traditional custodian + taboos, adjacent Forest Reserve, regulating authority + statute, fishery status + endemic species, WRC riparian buffer width, ordered primary_authorities list, verdict_categories map A → E, and a 4-6 entry gazetting_chain. Polygons are screening-grade approximations (Bosomtwe is a true 32-vertex circle on the crater; reservoirs are centroid-radius envelopes at conservative radii; Ramsar lagoons are simplified ellipses at gazetted centroid + known length/width) — replacing each with the official Ramsar Information Sheet polygon or MAB Biosphere zoning polygon is the documented upgrade path on adoption. (b) services/inland_water_bodies.py — ray-cast point-in-polygon resolver, project-category classifier (A: water-dependent low-impact → research, monitoring, artisanal fishery, navigation; B: water-dependent moderate-impact → small jetty, ferry, MAB-compatible aquaculture; C: water-dependent high-impact → hydropower, large cage aquaculture, dredging; D: water-incidental → resort, hotel, residential, factory; E: prohibited absolutely → petroleum, hazardous waste, mining), per-feature verdict lookup, and a stakeholder/permit matrix generator that pulls from a 34-entry _AUTHORITY_DECISIONS table (each authority carries decides + statute + applies_to category filter, so a resort gets a 7-row Bosomtwe matrix while an aquaculture project gets the 9-row version including Fisheries Commission + Wildlife Division). (c) schemas/screening.pyScreenInput.water_dependent: Optional[bool] lets the proponent declare water-dependence; ScreenOutput.inland_water_body: dict | None carries the structured determination. (d) Orchestrator wires the resolver after the SafeGround spatial profile; when a hit fires it escalates the verdict via the existing _max_verdict channel so the override-engine contract stays consistent. (e) Frontend: intake form gains a water-dependent checkbox under the project-details panel with explanatory copy ("Tick this if the project NEEDS the water body to exist"). Report renderer ships a new buildInlandWaterBodyCardHtml that renders the verdict badge, narrative (with bold statute markers expanded), designation stack as a bulleted list, project-category panel with typical examples (rendered as inline pills) and an "inferred vs declared" disclosure, the stakeholder/permit matrix as a 4-column table (#, Authority, Statute, What they decide), and a collapsible gazetting chain. Card colour-codes by verdict — refused is red, conditional consideration is amber, conditional special-pathway is the conditional amber. SW cache bumped v44 → v45. Worked Bosomtwe verification: centroid pin at 6.5000 N, 1.4133 W with tourism → resort returns matched Lake Bosomtwe, verdict refused, 8-authority stakeholder matrix (Bekwaihene under Asantehene · Ghana MAB National Committee · WRC · the Authority · Forestry Commission · Bosomtwe District Assembly · Ghana Tourism Authority · NADMO), 4-entry designation stack (UNESCO MAB + sacred + Forest Reserve + endemic fishery), 6-statute gazetting chain. Same pin with water_dependent=true + sector=agriculture + sub_type=aquaculture returns category B "Water-dependent, moderate-impact" with verdict conditional_consideration_special_pathway and the 9-authority matrix that now includes Fisheries Commission. Tier-2 / -3 expansion path: sacred ponds (Tadane, Sonu, Bomfobiri sanctuary lakes); additional coastal lagoons (Nungua, Korle, Fosu, Amansuri); project-type gating on the WRC riparian buffer for the major rivers (Pra, Ankobra, Tano, Densu, Birim, Ofin). Honest disclosure: traditional-council attributions follow published proceedings of the Asantehene's, Bekwaihene's, and Effutu Traditional Councils; replacing them with direct council secretariat confirmations on adoption is a documented step.
2026-06-02 Dam-spillage screening indicator (#15). Added a 15th spatial indicator dedicated to dam-controlled inundation envelopes — the gap exposed by the 2023 Akosombo spillage (38,624 displaced across 32 communities). New components: (a) ghana_dam_spillage_envelopes.geojson carries six envelopes — Akosombo + Kpong (Lower Volta corridor, 35-vertex polygon spanning the 2023 controlled-spillage extent from the dam to the Volta estuary, widths 1.5-4.5 km), Weija Densu (Ga South Municipal floodplain to Densu Delta), Bui Black Volta (Bui dam to Buipe / White Volta confluence), Bagre cross-border (White Volta Burkina Faso entry to Buipe), Tono (Kassena-Nankana / Navrongo plains), Vea (Bolgatanga lowlands). Each polygon tagged with operator, statutory Act, design basis, documented events, communities affected, districts affected, source citation, and screening-grade quality disclosure. (b) services/dam_spillage.py runs point-in-polygon — red inside envelope, amber within 500 m, green beyond. Returns the full statutory citation chain when red. (c) Wired into the Spatial Statutory Override Engine as dam_spillage.red → verdict refused, citing Volta River Development Act 1961 (Act 46), Water Resources Commission Act 1996 (Act 522) §13, Environmental Assessment Regulations 2025 (L.I. 2504) Reg 3(1)(b), Ghana Hydrological Authority Act, 2022 (Act 1085) §3(c), Ghana Building Code 2018 Part 5, Lands Act 2020 (Act 1036) §3, Bui Power Authority Act 2007 (Act 740). Exception clause allows flood-resilient public infrastructure (elevated walkways, evacuation centres) under a separate consent track with the operator + Ghana Hydrological Authority. (d) Added to sensitivity_red_keys so red here promotes EIAfinder sensitive_area=True before the override escalates to refused. (e) Frontend: 15th _CHECK_META entry; toggleable dam_spillage_envelopes overlay coloured per operator (Akosombo cyan, Weija orange, Bui yellow, Bagre red, Tono green, Vea dark green); SW cache bumped v29 → v30. Sources: VRA controlled-spillage update Sept-Oct 2023, NADMO displacement bulletins, Imani Africa 2024 critique, Akosombo Spillage Committee Report 2025, PMC peer-reviewed Densu floodplain study (PMC11019054), GWCL spillage notices 2018-2024, Bui Power Authority + Savannah RCC 2022/2023 reports, SONABEL annual Bagre release notifications, ICOUR/SIGA profiles, Ghana DREF MDRGH018 Upper East flood report, FloodList Oct 2019. Honest disclosure: envelopes are digitised from documented spillage extents + operator-published protocols, not from a controlled topographic-hydraulic model; precise per-property determination still requires the operator's design-spillage envelope + a site-specific topographic survey.
2026-06-02 Pre-EPA-handoff correctness + migration-readiness sprint. Fourteen items shipped: (1) Polygon Phase 1b — sample-grid worst-case aggregation across up to 25 polygon points per indicator (centroid + 8 boundary + interior grid for parcels ≥ 5 ha); response now carries polygon_aggregation provenance. (2) Galamsey district prevalence expanded from 91 → 128 districts (+37 documented activity districts cited from IMCIM, Operation Halt II/III, CSIR-WRI water-quality reports, Minamata ASGM-NAP 2020, Owusu-Nimo 2018; coastal sand-mining districts capped at 0.5 under M&MA Act 703 §82). (3) Road corridor check made CLASS-AWARE per Ghana Highway Authority Act 540 + Streets and Roads Act 1971 (NLCD 41) — per-segment ROW (motorway 45 m / trunk 30 m / primary 22.5 m / secondary 15 m / tertiary 9 m / urban collector 12.5 m / urban local 6 m); detail string names the road, its class, and the ROW threshold driving the verdict. (4) 330 kV HV grid dataset expanded with 5 recently-commissioned GRIDCo corridors (Anwomaso–Kintampo 2023; Kintampo–Tamale–Bolgatanga 2024-25; Bui–Kumasi 2020; Aboadze–Prestea 2022; Volta–Tema 2023) digitised from NIPMP 2024 — flagged screening-grade until GRIDCo route plans land. (5) /screen async refactor — shared process-wide httpx.AsyncClient pool replaces per-request client (50-150 ms TLS-handshake savings per call); shutdown_upstream_client() hooked into FastAPI shutdown. (6) Systemd hardening — three new hardened unit files (epa-scoping-platform, ghanascreen, eiafinder) running as dedicated epascoping user with NoNewPrivileges, ProtectSystem=strict, MemoryDenyWriteExecute, RestrictAddressFamilies, SystemCallFilter; deploy/harden-systemd.sh migrates a root-running install. (7) DATA_PROTECTION.md per Ghana DPA Act 843 — controllership, lawful basis, retention, data-subject rights, cross-border transfers, breach notification; controllership transfers to the Authority on adoption. (8) PDF refusal banner softened from "REFUSED — PERMIT NOT ISSUED" to "RECOMMENDED VERDICT: REFUSE" + decision-support sub-line. (9) Configuration separation — hardcoded /opt/ paths and resilicity.com URLs replaced by env-var defaults with portable fallback chain. (10) Docker-compose stack + Dockerfile + nginx.docker.conf — alternative deployment path for the Authority. (11) DEPLOYMENT-RUNBOOK.md — Ubuntu 22.04+ step-by-step from bare VM to live HTTPS. (12) Data-handover scripts — restore-cases-db.sh, export-audit-trail.sh (chain-integrity verifying), reset-demo-data.sh (preserves admin + ruleset, wipes test cases). (13) MIGRATION-RUNBOOK.md — phased EPA-side preparation, data transfer, DNS cutover, Resilicity decommission, rollback procedure, sign-off matrix. (14) ARCHITECTURE.md — one-pager system diagram + dependency list + scaling notes for the Authority's architects.
2026-05-31 Demo-readiness sprint: SQL-injection close in precedent finder; officer-scope gate on all single-case routes; CORS preflight tightened; anonymous /screen rate-limited (30/IP/10 min); per-IP cap on /auth/request; Reg 30 appeal paragraph + diagonal DRAFT watermark added to Reg 29 decision letter; refused + requires_sea decision branches mapped end-to-end.
2026-05-31 Indicator-portfolio upgrades: (1) Slope preferred raster swapped from SRTM (2000, ±9 m) to Copernicus DEM GLO-30 (2019, ±4 m) — halves vertical error per Simard 2024 + Tandfonline 2024 benchmarks; affects #6 slope, #1 flood terrain sub-indicator, and #11 groundwater HAND. (2) River check preferred dataset swapped from OSM-name-filtered to HydroSHEDS HydroRIVERS v1.0 (Lehner & Grill 2013; Linke et al. 2019) — solves §10.3 named-coverage gap. (3) Flood composite gained a 5th sub-indicator: JRC Global Flood Hazard Maps v2.1 (Dottori et al.) querying the 10 / 100 / 500-year return-period envelopes via Earth Engine — adds quantified return-period reporting that L.I. 2504 scoping calls for. (4) Wetland check gained a Ramsar Sites Information Service overlay — Ghana's 6 designated Ramsar Sites (Owabi, Densu Delta, Sakumo, Songor, Muni-Pomadze, Keta Lagoon Complex) pre-empt OSM/JRC with red status and a Convention Article 3.2 citation.
2026-05-22 Galamsey multi-layer methodology activated (hotspot + river + district + Sentinel-2 placeholder); confidence cap at 0.7 without Tier-2; district-name normalisation.
2026-05-22 Audit log schema v1.1 — data lineage embedded in every entry.
2026-05-22 Tier-2 plausibility benchmark engine activated (14 sector-process pairs).
2026-05-22 Compliance schedule auto-generation on case sign-off (L.I. 2504 Reg 30).
2026-05-22 Hash-chained audit trail.
2026-05-22 HT electricity ROW screening (L.I. 1737).
2026-05-22 Officer case-management workflow with 25/90-day clocks.
2026-05-22 Reconciliation engine for proponent scoping reports.
2026-05-22 Tool deployed at scoping.resilicity.com.