Phase 17 β Riprap end-to-end integration of all NYC AMD fine-tunes
Goal
Wire the four AMD-trained NYC fine-tunes (Phase 2 LULC + Phase 12 TiM
- Phase 13 Buildings + Phase 14 Prithvi-NYC + Phase 16 TTM-NYC) into Riprap's existing FSM as production specialists. The hackathon submission then demonstrates the full briefing flow with all six foundation models running locally on AMD.
This experiment is the deployment story β taking the published HF checkpoints and showing them serve real Riprap queries, not just the isolated Gradio demo.
Scope
NOT a fine-tune. Pure integration work β porting code from
experiments/05_terramind_nyc_finetune/publish/space/local_app.py
into Riprap's app/ modules with proper FSM hooks.
What gets touched
New specialists
app/context/sentinel_live.py β fetch_recent_chips(lat, lon) from
Earth Search (S2 + DEM) + PC (S1 RTC), with multi-source fallback and
per-MGRS-cell cache. From experiments/11_live_sentinel_fetch.
app/context/terramind_nyc.py β wraps the AMD-trained NYC LULC + TiM
- Buildings checkpoints. Returns a single dict with class fractions,
imperviousness, building density, and freshness disclosures. Replaces
app/context/terramind_synthesis.py's zero-shot path while keeping the same output schema for backward compatibility.
Modified specialists
app/flood_layers/prithvi_water.py β gains a prithvi_live mode that
uses the Phase 14 NYC pluvial fine-tune on a freshly-fetched S2 chip,
in addition to the existing point-in-polygon test against
prithvi_ida_2021.geojson.
app/live/ttm_forecast.py β model-id swap from zero-shot TTM r2 to
the Phase 16 NYC-fine-tuned variant.
FSM updates
app/fsm.py:step_terramind already exists; just point it at
terramind_nyc instead of terramind_synthesis. No new action
needed β the dict shape matches.
app/reconcile.py:579-608 (the TerraMind doc-message block) updates
the framing from "tentative ESRI labels" to "WorldCover macro-classes
(confirmed) + AMD-trained NYC fine-tune". Drops the "tentative"
disclaimer since labels are now real ground truth.
Tests
tests/test_terramind_nyc.py β three NYC reference points (Manhattan
center, Brighton Beach, Bronx Zoo). Expected class distributions
(Manhattan should be β₯70% developed; Brighton Beach should have β₯10%
water; Bronx Zoo should have β₯15% forest). Mock the live Sentinel
fetch in CI.
Success criteria
- A real Riprap query for "Empire State Building" returns a briefing
whose
terramind_nycdoc body cites:- imperviousness (= developed%)
- green-space %
- water %
- building-density % (if Phase 13/15 lands)
- flood-prediction % (if Phase 14 lands)
- S2 acquisition age in days
- S1 acquisition age in days
- The reconciler's Mellea grounding pass succeeds on those numbers.
- The full flow runs in < 12 s end-to-end, including the live Sentinel
fetch (
5 s) plus all 14 specialists (6 s) plus reconciliation.
Plan
- Scaffold (this file).
- Port
local_app.pychip-fetch + inference logic intoapp/context/terramind_nyc.py. Mirror the dict shape fromapp/context/terramind_synthesis.py:fetch(). - Port the live Sentinel multi-source fetch from Phase 11 into
app/context/sentinel_live.py. - Wire
step_terramindinapp/fsm.pyto use the new module. - Update
app/reconcile.pyframing (drop "tentative" disclaimer whenlabel_schemasays "confirmed"). - Add unit tests for the new modules in
tests/. - Run a smoke briefing for "2940 Brighton 3rd St, Brooklyn" (the existing worked example in ARCHITECTURE.md Β§3.2). Confirm the new sentence appears in the briefing.
- Update ARCHITECTURE.md Β§7 to add TerraMind-NYC + the AMD-fine-tune provenance line.
What this enables for the submission
A judge clicking through the Riprap UI sees:
- Type address β live trace shows
step_terramind_nycrunning with the AMD-fine-tuned ckpt loading - The briefing paragraph cites imperviousness, green-space %, building
density β with
[terramind_nyc]citations - The bottom-of-briefing "what models powered this" section lists six foundation models, one of them flagged AMD-trained
- The MapLibre overlay shows the predicted LULC polygons
That's the demo for the video.
Risk
Low. All the heavy ML is done by this phase; this is just plumbing. Estimated half-day for a clean port.
Reproduction (planned)
# After fine-tunes published to HF:
git pull origin main # latest Riprap with the integration
RIPRAP_TERRAMIND_VARIANT=nyc \
RIPRAP_PRITHVI_VARIANT=nyc \
RIPRAP_TTM_VARIANT=nyc \
.venv/bin/uvicorn web.main:app --port 7860