seriffic Claude Opus 4.7 (1M context) commited on
Commit
17dd76d
Β·
1 Parent(s): c099105

Add pitch deck (Marp) + landscape research

Browse files

Three artefacts for the AMD x lablab.ai hackathon submission video.

slides/deck.md + slides/riprap.css β€” 8-slide Marp deck targeting the
5-minute video format. The theme ports the SvelteKit UI's design
tokens 1:1: IBM Plex (Sans / Mono / Serif), paper register
(#FAFAF7), the four-tier epistemic palette, the five-Stone hint
colours, the orange β–Œ accent block from the wordmark. Slides 1–6
land in ~2.5 min of voiceover; slide 7 hands off to the live demo;
slide 8 is the closing CTA. `slides/Makefile` builds PDF / HTML /
PPTX in one command; `slides/README.md` documents the per-slide
voiceover beats.

Slide arc: title β†’ "climate risk data is a black box" + Zillow's
Dec-2025 First Street pullout as the hook β†’ "every number cites
its source or it doesn't appear" with a real cited paragraph β†’
the stack flaunt (3 of 4 hackathon tracks: Agents + Fine-Tuning +
Vision/Multimodal) β†’ the receipts (5/5 probe pass, Mellea 4/4,
5.8–13.1 s) β†’ civic-tech case (NY disclosure law, $30B DEP plan,
EJNYC FVI) β†’ demo handoff β†’ CTA.

RESEARCH.md β€” landscape pass underpinning the deck. Direct comps
(First Street, ClimateCheck, Jupiter), NYC government tools
(FloodHelpNY, NYC Flood Hazard Mapper, FloodNet, EJNYC FVI),
academic comps (Flood-LLM Brisbane, GIS-Integrated Flood LLM,
FloodLense). Six stakeholder demo arcs with concrete query
examples (resident, real-estate attorney, OEM/DEP planner,
underwriter, journalist, architect). Ten lateral use cases. Risk
register (real-estate pushback, redlining hazard, disclosure
liability, cold-start, geocoder edge cases).

.gitignore β€” exclude regenerable deck render artefacts
(deck.pdf / .html / .pptx).

CLAUDE.md β€” note the deliverables landed and the "3 of 4 tracks"
framing locked in.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

Files changed (6) hide show
  1. .gitignore +5 -0
  2. RESEARCH.md +366 -0
  3. slides/Makefile +19 -0
  4. slides/README.md +62 -0
  5. slides/deck.md +170 -0
  6. slides/riprap.css +520 -0
.gitignore CHANGED
@@ -34,3 +34,8 @@ experiments/**/*.jpg
34
  experiments/**/*.parquet
35
  experiments/**/*.npy
36
  pitch/screenshots-*/
 
 
 
 
 
 
34
  experiments/**/*.parquet
35
  experiments/**/*.npy
36
  pitch/screenshots-*/
37
+
38
+ # Marp deck render artefacts (regenerable via `make` in slides/)
39
+ slides/deck.pdf
40
+ slides/deck.html
41
+ slides/deck.pptx
RESEARCH.md ADDED
@@ -0,0 +1,366 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Riprap β€” landscape research
2
+
3
+ Captured 2026-05-06 as part of the AMD x lablab.ai hackathon polish
4
+ phase. This document underpins the pitch deck (`slides/deck.md`) and
5
+ the demo-script choices. Re-validate against the live web before
6
+ re-using any specific figure.
7
+
8
+ ---
9
+
10
+ ## What Riprap is, distinctly
11
+
12
+ A **citation-grounded LLM that writes audit-quality flood-exposure
13
+ briefings for NYC addresses** by fusing 17+ live, historical,
14
+ modeled, and projected data sources, with **Mellea rejection
15
+ sampling** that refuses to publish a numeric claim it can't cite.
16
+ The output isn't a score β€” it's a four-section prose briefing with
17
+ `[doc_id]` citations on every numeric assertion, where each
18
+ `doc_id` resolves to one specific dataset (Sandy 2012 zone, NYC
19
+ DEP scenario, USGS HWM, Sentinel-2 chip, NOAA gauge reading,
20
+ NPCC4 SLR projection).
21
+
22
+ Granite 4.1 8B drives the prose; Granite Embedding 278M + GLiNER
23
+ drive policy-doc retrieval; Prithvi-EO 2.0 + TerraMind LULC/
24
+ Buildings + Granite TTM r2 drive the EO and forecast specialists,
25
+ with three Apache-2.0 NYC fine-tunes trained on AMD MI300X published
26
+ on HF Hub.
27
+
28
+ The architectural commitments other tools don't make:
29
+
30
+ 1. **Silence over confabulation** β€” when a specialist returns no
31
+ data, the briefing omits the section rather than papering over it.
32
+ 2. **Five-stone epistemic structure** so the user can see what's
33
+ empirical vs modeled vs proxy vs synthetic.
34
+ 3. **Fully open-source pipeline** β€” Apache-2.0 end-to-end on
35
+ public-record data, no commercial APIs touched at runtime.
36
+ 4. **Deployable on either local Ollama or AMD MI300X via vLLM**
37
+ with auto-failover.
38
+
39
+ Stack as of 2026-05-06: SvelteKit UI on HF Spaces (cpu-basic) at
40
+ the AMD-hackathon org, FastAPI agent FSM, two-container droplet
41
+ (vLLM + riprap-models) on MI300X, full address probe suite at 5/5
42
+ PASS in 5.8–13.1 s end-to-end.
43
+
44
+ ---
45
+
46
+ ## Landscape map
47
+
48
+ ### Direct comps β€” score-based property risk tools
49
+
50
+ | Tool | What it gives | Who it serves | Hidden cost |
51
+ |---|---|---|---|
52
+ | **First Street Risk Factor** (Flood Factor) | Score 1–10 + 30-yr risk narrative; powers Redfin, Realtor.com (until Dec 2025 also Zillow) | Homebuyers; some lenders | Closed model; commercial partnerships; Zillow removed it under industry pressure in Dec 2025 |
53
+ | **ClimateCheck** | Score 1–100 + ~30-page property report; 2050 projections | Homeowners + REIT/PE diligence | Subscription tiers; methodology behind paywall |
54
+ | **Jupiter ClimateScore Global** | Enterprise SaaS / API; financial metrics (CapEx, OpEx, credit risk) | Banks, insurers, asset managers | Enterprise pricing; not consumer-facing |
55
+ | **Cervest / Climate X / ICEYE** | Variants of above for ESG / reinsurance | Corporate finance & insurance | Same |
56
+
57
+ Score-based tools all converge on the same shape: **one number,
58
+ one chart, an explainer paragraph**. None show what claim is
59
+ grounded in which dataset. None expose the audit trail.
60
+
61
+ ### NYC-specific government tools
62
+
63
+ - **FloodHelpNY** (City + State, IDEO-designed) β€” address lookup
64
+ β†’ flood-zone label + insurance + free resiliency audit. Forms-
65
+ based; consumer-facing; doesn't fuse live signals.
66
+ - **NYC Flood Hazard Mapper** β€” ArcGIS web map of FEMA + NPCC +
67
+ Sandy + future scenarios. Static visualization; no narrative.
68
+ - **NYC OEM Flood Maps page** β€” index of the above.
69
+ - **EJNYC Flood Vulnerability Index** (released 2024-04 by
70
+ Mayor's Office of Climate & EJ) β€” first-ever city FVI, used to
71
+ direct spending under NY's "Disadvantaged Communities" framework
72
+ (35% of climate spend by law).
73
+ - **FloodNet NYC** (NYU + CUNY + city) β€” 350+ ultrasonic sensors
74
+ at 1-min cadence, growing to 500 by end-2026. Has a public
75
+ dashboard but no narrative layer.
76
+
77
+ ### Federal / authoritative
78
+
79
+ - **FEMA Flood Map Service Center / NFHL** β€” official; covers 90%+
80
+ population; static GIS layer + PDFs. The disclosure-of-record but
81
+ not a synthesis tool.
82
+
83
+ ### Real-estate platforms (the volatile zone)
84
+
85
+ - **Redfin** β€” still shows First Street Flood Factor on every
86
+ listing.
87
+ - **Realtor.com** β€” still shows it on 110M+ listings.
88
+ - **Zillow** β€” **removed climate risk display in December 2025**
89
+ under California Regional MLS pressure. Still links out but it's
90
+ hidden. **This created a vacuum that an open citation-grounded
91
+ alternative could fill.**
92
+
93
+ ### Closest academic / AI comps
94
+
95
+ - **Flood-LLM** (Brisbane, MDPI Sustainability 2026) β€” multi-source
96
+ LLM for property-level flood risk, validated on Brisbane against
97
+ official labels. Academic, not deployed; no Mellea-style citation
98
+ discipline; no live signals.
99
+ - **GIS-Integrated Flood LLM** (Tandfonline 2024) β€” LLM constrained
100
+ by a flood knowledge graph + GIS interaction. Research artefact.
101
+ - **FloodLense** (arXiv 2024) β€” UNet/RDN/ViT + LLM for satellite
102
+ flood detection. Research; image-only.
103
+
104
+ ---
105
+
106
+ ## Where Riprap fits β€” differentiators that demo well
107
+
108
+ Ranked by visibility in a 3-minute demo:
109
+
110
+ 1. **Citation prose vs scores.** Riprap returns *"Hurricane Sandy
111
+ flooded this address on October 29–30, 2012, according to the
112
+ empirical inundation zone [sandy]. 19 flood-related 311 service
113
+ requests were logged within 200 m over five years [nyc311]."* Every
114
+ number cites a doc; each doc resolves to a footer source row.
115
+ First Street returns "Flood Factor 8/10". This gap is the demo.
116
+ 2. **Live + historical + modeled + projected, in one paragraph.**
117
+ Sandy 2012 (empirical), DEP 2080 stormwater scenarios (modeled),
118
+ 311 last 5 years (proxy), FloodNet last 3 years (empirical,
119
+ hyperlocal), NPCC4 SLR (projected), Granite TTM r2 surge nowcast
120
+ (96-h forecast). No comp combines all four temporal modes.
121
+ 3. **Open-source NYC fine-tunes.** Three Apache-2.0 models
122
+ (`Prithvi-EO-2.0-NYC-Pluvial`, `TerraMind-NYC-Adapters`,
123
+ `Granite-TTM-r2-Battery-Surge`) trained on AMD MI300X β€” anyone
124
+ can reproduce, fork to other cities, or audit. First Street's
125
+ model is closed; ClimateCheck's methodology is behind a paywall.
126
+ 4. **AMD hardware story.** The whole stack runs on MI300X via vLLM
127
+ (LLM) + a sibling ROCm container (specialists). All Apache-2.0.
128
+ This is the AMD hackathon track's preferred narrative: open
129
+ models, open infra, open data, real GPU acceleration.
130
+ 5. **Mellea grounding receipts.** The four checks
131
+ (`numerics_grounded` / `no_placeholder_tokens` / `citations_dense`
132
+ / `citations_resolve`) are the audit. The meta card surfaces
133
+ "4/4 grounding checks passed, 1 reroll" β€” that's audit
134
+ credibility no consumer comp shows.
135
+ 6. **Self-aware silence.** Touchstone shows "FloodNet sensor: 0
136
+ events in 3 years" with `silent_by_design`. Lodestone shows
137
+ "TTM Battery surge forecast: peak |residual| < 0.3 m, omitted."
138
+ Most tools always render a value. Riprap's silence is a feature.
139
+
140
+ ---
141
+
142
+ ## Stakeholder demos to craft
143
+
144
+ Six concrete personas, each with a query that exercises a different
145
+ part of the system. These are the demo arcs to rehearse.
146
+
147
+ ### 1. Resident / homebuyer (the FloodHelpNY swap-in)
148
+
149
+ > *"I'm thinking about renting an apartment at 80 Pioneer Street,
150
+ > Brooklyn β€” should I worry?"*
151
+
152
+ **Demo arc.** Type the address. Watch the planner classify
153
+ `single_address`, then 19 specialists fire across the four Stones
154
+ in ~13 s. Briefing names Sandy 2012 inundation, 65 311 complaints,
155
+ 2 FloodNet sensors with 4 events including a 51 mm peak on a
156
+ specific date, Ida 2021 HWM 130 m away, microtopo HAND 3.81 m + TWI
157
+ 14.79 (very high saturation propensity). Footer shows 7+ named
158
+ primary sources.
159
+
160
+ **Demo hook.** "Compare what we just generated to First Street's
161
+ number-and-bar-chart for the same address. Which would you trust
162
+ to make a $4,000/month decision?"
163
+
164
+ ### 2. Real-estate attorney / disclosure compliance
165
+
166
+ > *"Does 100 Gold Street, Manhattan need to disclose flood risk
167
+ > under RPL Β§462(2)?"*
168
+
169
+ **Demo arc.** Same single_address path. Briefing produces a citable
170
+ narrative covering FEMA designation, prior flood claims (where
171
+ present), terrain, recent complaints. Mellea grounding check is
172
+ the *qualifier* β€” "this prose is grounded against four invariants
173
+ and passed 4/4."
174
+
175
+ **Demo hook.** New York's March-2024 amended Property Condition
176
+ Disclosure Statement requires sellers to disclose flood history
177
+ and FEMA-floodplain status. RPL Β§231-b requires every residential
178
+ lease to disclose prior flood damage. Riprap is the citable
179
+ narrative tool β€” show how the briefing maps line-by-line to the
180
+ disclosure requirements.
181
+
182
+ ### 3. NYC OEM / DEP planner
183
+
184
+ > *"Hollis, Queens"*
185
+
186
+ **Demo arc.** Neighborhood intent fires (9 steps), produces NTA-
187
+ level briefing β€” 434 flood-related 311 over 3 years (87 catch-
188
+ basin clogged, 42 street-flooding), 4.3% of neighborhood projected
189
+ to flood under DEP moderate-2050 scenario, 25% of cells with
190
+ HAND<1 m. RAG retrieval pulls relevant DEP/NPCC4 policy paragraphs.
191
+
192
+ **Demo hook.** DEP just announced a $30B stormwater priority list
193
+ (86 locations) and a $68M Brooklyn Bluebelt expansion in Prospect
194
+ Park. Riprap supports the prioritization argument with citable
195
+ per-NTA evidence. Pair with the EJNYC Flood Vulnerability Index for
196
+ the EJ-spending overlay (35%-to-disadvantaged-communities legal
197
+ mandate).
198
+
199
+ ### 4. Insurance underwriter / actuary
200
+
201
+ > *"442 East Houston Street, Manhattan"*
202
+
203
+ **Demo arc.** Same as resident demo, but emphasize the **provenance
204
+ trace** UI β€” every Specialist row, every doc_id, every source URL,
205
+ vintage, and tier glyph.
206
+
207
+ **Demo hook.** When an underwriter writes a risk memo, the audit
208
+ chain matters. First Street's "we used a proprietary catastrophe
209
+ model" doesn't survive a regulator review the way "we used FEMA
210
+ Sandy 2012 polygon, NYC DEP 2021 stormwater scenario, USGS Ida
211
+ HWM Event 312, NOAA gauge 8518750, NWS station KNYC, Granite TTM
212
+ r2 fine-tune (test MAE 0.1091 m vs 0.1467 zero-shot, citable)" does.
213
+
214
+ ### 5. Climate journalist / advocacy
215
+
216
+ > *"Coney Island, Brooklyn"*
217
+
218
+ **Demo arc.** Neighborhood briefing β€” 87.5% of NTA in 2012 Sandy
219
+ zone, 382 flood complaints over 3 years, 7.8% projected flooded
220
+ under 2050 moderate, 38.9% of DEM cells with HAND<1 m, DEP
221
+ extreme-2080 β†’ 44.2% flooded.
222
+
223
+ **Demo hook.** ProPublica/NYTimes/THE CITY-style data journalism.
224
+ Every claim in a Riprap briefing is reproducible β€” anyone can paste
225
+ the same query and get a near-identical narrative. The journalist
226
+ can publish the briefing as the methods section.
227
+
228
+ ### 6. Architect / developer
229
+
230
+ > *"What are they building in Gowanus and is it risky"*
231
+
232
+ **Demo arc.** Planner classifies `development_check`. FSM pulls
233
+ DOB filings + flood layers for the project sites. Briefing comments
234
+ on which proposed buildings sit inside Sandy 2012, which intersect
235
+ DEP extreme-2080, what the microtopo says.
236
+
237
+ **Demo hook.** Pre-design siting check. The Gowanus rezoning is
238
+ one of NYC's largest active development zones, well known to flood.
239
+ Show how the tool surfaces flood concerns before architects pour
240
+ concrete.
241
+
242
+ ---
243
+
244
+ ## Lateral & unexpected use cases
245
+
246
+ 10 bets, ordered roughly from most-buildable to most-speculative.
247
+
248
+ 1. **Pre-storm cohort briefings.** Subscribe Riprap to NWS flood-
249
+ watch alerts. When a watch lands, fan out one briefing per
250
+ affected NTA + push to OEM / press / advocacy lists. Citable
251
+ evidence on demand for the press cycle that follows.
252
+ 2. **Climate-grant evidence sections.** HUD CDBG-DR and FEMA BRIC
253
+ applications need an auditable evidence base. Riprap auto-
254
+ generates the "vulnerability assessment" section so a community
255
+ group can apply for resilience funding without hiring a consultant.
256
+ 3. **Local Law disclosure boilerplate.** Plug into a brokerage's
257
+ listing flow: when an agent enters an address, auto-generate
258
+ the NY RPL Β§231-b lease addendum or Β§462(2) disclosure draft.
259
+ ROI is high since the law took effect 2024 and many landlords
260
+ are still figuring out compliance.
261
+ 4. **MTA station-hardening prioritization.** Riprap already has the
262
+ MTA-entrance specialist (KEY-001 in the demo). Run the FSM
263
+ across all subway entrances; rank by exposure Γ— ridership. The
264
+ MTA's October-2025 Climate Resilience Roadmap Update is the
265
+ policy hook.
266
+ 5. **DOE school siting.** When DOE reviews proposed school sites
267
+ or selects schools for retrofit, Riprap briefings (with `expect_311_ge`
268
+ + Sandy + DEP overlays) would catch flood exposure that form-
269
+ style screens miss.
270
+ 6. **Time-machine variant.** Re-run the FSM with snapshot data
271
+ from a past date β€” *"what would Riprap have said about Hollis
272
+ on August 31, 2021, the day before Ida?"* Useful for retrospective
273
+ analysis, expert testimony, and stress-testing the system.
274
+ 7. **Cross-city scaffold.** The architecture is NYC-specific by
275
+ data choice, not by code. Port to Houston (post-Harvey + Hurricane
276
+ Beryl 2024), Miami (king tides), Boston (CSO floods), Charleston
277
+ (chronic tidal), with a per-city specialist set + RAG corpus.
278
+ 8. **Federation with FloodNet alerts.** When a sensor triggers a
279
+ flood event NOW, fire a Riprap live_now briefing for the
280
+ surrounding NTA: *"what's at stake in the next 6 hours."*
281
+ Connects FloodNet's hyperlocal sensor reads to the OEM decision
282
+ loop.
283
+ 9. **EJNYC Γ— Riprap pairing.** Rank all 188 NTAs by Riprap-detected
284
+ exposure, intersect with state DAC designations. Output: a map
285
+ of "underserved + underwater" β€” the most underfunded high-
286
+ exposure neighborhoods.
287
+ 10. **Court testimony / expert witness.** Citable, reproducible
288
+ flood narrative as a court exhibit. The Mellea passes-record +
289
+ provenance trace are the kind of artefact a regulator or judge
290
+ can audit. Especially relevant after the December-2025 Zillow
291
+ controversy created public discussion of climate-data integrity.
292
+
293
+ ---
294
+
295
+ ## Risks & framing
296
+
297
+ - **Real-estate industry pushback.** December 2025: Zillow removed
298
+ First Street's climate scores under MLS pressure because the data
299
+ was hurting transaction volume. A free, citation-grounded
300
+ alternative could face the same reflex. Riprap's defence is that
301
+ it's a *narrative tool for professional analytical work*, not a
302
+ buy/don't-buy verdict β€” keep the disclaimer footer prominent.
303
+ - **Redlining hazard.** Exposure narratives can be misused by
304
+ landlords or insurers to discriminate against high-flood-risk
305
+ (often disproportionately disadvantaged) neighborhoods.
306
+ Mitigations: (a) the citation transparency makes biased reasoning
307
+ auditable, (b) the EJNYC pairing in lateral-use #9 reframes
308
+ exposure data as a tool *for* affected communities, not against
309
+ them, (c) keep "for professional analytical work, not personal
310
+ property decisions" front and center.
311
+ - **Disclosure-status liability.** A briefing is *evidence* but
312
+ probably not *the* Β§462(2) disclosure under New York real-estate
313
+ law. Don't position it as legal disclosure-of-record without a
314
+ real-estate-attorney review.
315
+ - **Cold-start latency.** First query after droplet redeploy is
316
+ ~30 s while models warm. For demos, ping the Space + run one
317
+ warm-up query 5 minutes before showtime.
318
+ - **Geocoder edge cases.** "PS 188, Lower East Side" geocoded to
319
+ a Brooklyn PS 188 in our test suite. For demos, pick fully-
320
+ qualified street addresses; document the disambiguation behavior.
321
+
322
+ ---
323
+
324
+ ## Polish punch-list (deck-driven)
325
+
326
+ Concrete polish items the research surfaces, ranked by demo value:
327
+
328
+ 1. **Sample-query pills on landing.** Six clickable pills below
329
+ the search bar β€” one per persona above. Let the audience demo
330
+ themselves.
331
+ 2. **A "What this is" bar at the top of the landing.** Three-line:
332
+ *"Citation-grounded NYC flood briefings. Every number cites a
333
+ primary source. Open-source, public data, audit-grade synthesis."*
334
+ 3. **Compare-mode link from the briefing.** Once Riprap delivers a
335
+ single_address briefing, surface "compare with another address"
336
+ as a one-click affordance. The compare intent already exists in
337
+ the planner.
338
+ 4. **EJNYC-FVI overlay** on the map sidebar (#9 above) β€” Riprap's
339
+ exposure Γ— DAC designation, two clicks to a powerful editorial
340
+ demo.
341
+ 5. **First-query warm-up message** during the cold start: *"loading
342
+ specialists on AMD MI300X β€” first query after redeploy takes
343
+ ~30 s; subsequent queries 5–13 s."*
344
+
345
+ ---
346
+
347
+ ## Sources
348
+
349
+ - [First Street Foundation β€” Flood Factor methodology](https://firststreet.org/methodology/flood)
350
+ - [FloodHelpNY β€” NYC + IDEO consumer tool](https://www.floodhelpny.org/en)
351
+ - [ClimateCheck β€” flood risk methodology](https://climatecheck.com/risks/flood)
352
+ - [Jupiter Intelligence β€” ClimateScore Global / FloodScore](https://www.jupiterintel.com/climatescore-global)
353
+ - [FEMA Flood Map Service Center](https://msc.fema.gov/)
354
+ - [NY State β€” RPL Β§231-b residential lease flood disclosure (2023)](https://www.nysenate.gov/legislation/bills/2021/S5472)
355
+ - [NYSBA β€” Property Condition Disclosure flood-risk amendment (Mar 2024)](https://nysba.org/breaking-news-new-rules-on-property-condition-disclosure-and-flood-risk-go-into-effect-today/)
356
+ - [CNN β€” Zillow removes climate risk data under industry pressure (Dec 2025)](https://www.cnn.com/2025/12/02/climate/zillow-climate-data-extreme-weather-first-street-redfin)
357
+ - [NYC Stormwater Resiliency Plan](https://www.nyc.gov/assets/orr/pdf/publications/stormwater-resiliency-plan.pdf)
358
+ - [FloodNet NYC β€” methodology + sensor network](https://www.floodnet.nyc/methodology)
359
+ - [FloodNet WRR 2024 β€” peer-reviewed sensor paper](https://agupubs.onlinelibrary.wiley.com/doi/full/10.1029/2023WR036806)
360
+ - [EJNYC Report β€” Mayor's Office of Climate & Environmental Justice](https://climate.cityofnewyork.us/ejnyc-report/the-state-of-environmental-justice-in-nyc/)
361
+ - [Flood-LLM β€” Brisbane case study (MDPI 2026)](https://www.mdpi.com/2071-1050/18/6/2957)
362
+ - [GIS-Integrated Flood LLM (Tandfonline 2024)](https://www.tandfonline.com/doi/full/10.1080/13658816.2024.2306167)
363
+ - [THE CITY β€” Disadvantaged Communities flood funding (NY Climate Law)](https://www.thecity.nyc/2022/05/02/billions-ny-climate-law-disadvantaged-communities-flood/)
364
+ - [Inman β€” Redfin First Street integration](https://www.inman.com/2021/02/18/redfin-starts-displaying-flood-risk-data-on-listings/)
365
+ - [FACTUM β€” citation-hallucination detection in long-form RAG](https://arxiv.org/pdf/2601.05866)
366
+ - [AMD x lablab.ai Developer Hackathon (May 4–10, 2026)](https://lablab.ai/ai-hackathons/amd-developer)
slides/Makefile ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ DECK := deck.md
2
+ THEME := riprap.css
3
+ MARP := marp $(DECK) --theme $(THEME) --allow-local-files
4
+
5
+ .PHONY: all pdf html pptx clean
6
+
7
+ all: pdf html pptx
8
+
9
+ pdf:
10
+ $(MARP) --pdf --output deck.pdf
11
+
12
+ html:
13
+ $(MARP) --html --output deck.html
14
+
15
+ pptx:
16
+ $(MARP) --pptx --output deck.pptx
17
+
18
+ clean:
19
+ rm -f deck.pdf deck.html deck.pptx
slides/README.md ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Riprap β€” pitch deck
2
+
3
+ Marp-rendered slides for the AMD x lablab.ai hackathon submission
4
+ video (May 4–10, 2026). Eight slides, ~30 s of voiceover each, sized
5
+ to leave 3+ minutes for the live demo inside the 5-minute video cap.
6
+
7
+ ## Files
8
+
9
+ - `deck.md` β€” slide source (Marp markdown).
10
+ - `riprap.css` β€” Marp theme that ports the SvelteKit UI's design
11
+ tokens 1:1: IBM Plex (Sans / Mono / Serif), paper register
12
+ (`#FAFAF7`), Stone palette, the `β–Œ` accent block.
13
+ - `Makefile` β€” one-command builds.
14
+
15
+ ## Render
16
+
17
+ Marp CLI is the simplest path. Install once:
18
+
19
+ ```bash
20
+ npm install -g @marp-team/marp-cli
21
+ ```
22
+
23
+ Build any of the three artefacts:
24
+
25
+ ```bash
26
+ make pdf # β†’ deck.pdf (best for sharing)
27
+ make html # β†’ deck.html (best for live presenting in browser)
28
+ make pptx # β†’ deck.pptx (best for editing in Keynote / PowerPoint)
29
+ make all # all three
30
+ make clean
31
+ ```
32
+
33
+ Or directly:
34
+
35
+ ```bash
36
+ marp deck.md --theme riprap.css --pdf --output deck.pdf
37
+ marp deck.md --theme riprap.css --html --output deck.html
38
+ marp deck.md --theme riprap.css --pptx --output deck.pptx
39
+ ```
40
+
41
+ ## Notes
42
+
43
+ - The theme `@import`s IBM Plex from Google Fonts, so Marp needs
44
+ network access on first build. Cache it to `~/.npm/_marp`/etc by
45
+ building once on a connected machine.
46
+ - The deck targets a 1280Γ—720 16:9 frame.
47
+ - Slide 7 is the demo handoff β€” leave the slide visible while you
48
+ cut to the live screen capture, then return to slide 8 for the
49
+ closing CTA.
50
+
51
+ ## Slide map (5-min video budget)
52
+
53
+ | # | Slide | Voiceover beat | Time |
54
+ |---|---|---|---|
55
+ | 1 | Title | Hook: "Riprap. Citation-grounded NYC flood briefings on AMD MI300X." | 0:10 |
56
+ | 2 | Problem | Zillow yanked First Street in Dec 2025; black-box scores hit a wall | 0:30 |
57
+ | 3 | What it is | Show the cited paragraph; "every number cites its source or it doesn't appear" | 0:35 |
58
+ | 4 | Stack | Three of four hackathon tracks; MI300X, vLLM, three NYC fine-tunes | 0:40 |
59
+ | 5 | Receipts | 5 of 5 probe pass, 5.8–13.1 s, Mellea 4/4 every run | 0:30 |
60
+ | 6 | Civic impact | NY disclosure law, DEP $30B plan, EJNYC FVI β€” open-source matters | 0:25 |
61
+ | 7 | Demo handoff | Cut to the live HF Space; type the query; let the FSM speak | ~3:00 |
62
+ | 8 | Closing CTA | github.com/msradam/riprap-nyc | 0:10 |
slides/deck.md ADDED
@@ -0,0 +1,170 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ marp: true
3
+ theme: riprap
4
+ paginate: true
5
+ size: 16:9
6
+ title: Riprap β€” Citation-grounded NYC flood briefings
7
+ description: AMD x lablab.ai Developer Hackathon, May 4–10 2026
8
+ ---
9
+
10
+ <!-- _class: lead -->
11
+ <!-- _paginate: false -->
12
+
13
+ # Riprap
14
+
15
+ ## Citation-grounded NYC flood-exposure briefings, on AMD MI300X.
16
+
17
+ <div class="meta">
18
+ AMD &times; lablab.ai Developer Hackathon &nbsp;Β·&nbsp; <strong>May 4&ndash;10, 2026</strong>
19
+ </div>
20
+
21
+ ---
22
+
23
+ ## the problem
24
+
25
+ # Climate risk data is a black box.
26
+
27
+ <div class="two-col">
28
+ <div>
29
+
30
+ **First Street.** Score 1–10.
31
+ **ClimateCheck.** Score 1–100.
32
+ **Jupiter.** Enterprise SaaS.
33
+
34
+ A number. A bar chart. A black box.
35
+
36
+ </div>
37
+ <div>
38
+
39
+ > *"Zillow removed flood-risk data from listings in December 2025 after pressure from the real-estate industry."*
40
+
41
+ β€” CNN, Dec 2 2025
42
+
43
+ </div>
44
+ </div>
45
+
46
+ When a number meets resistance, **the only defense is the audit trail**.
47
+
48
+ ---
49
+
50
+ ## what riprap is
51
+
52
+ # Every number cites its source. Or it doesn't appear.
53
+
54
+ Type a NYC address &rarr; **17 specialists fan out** &rarr; one paragraph back, with **`[doc_id]` citations** on every numeric claim. If the model can't cite it, it's silent.
55
+
56
+ <div class="codeblock"><span class="label">Status.</span> 442 East Houston Street, Manhattan, is exposed to flood risk: flooded by Hurricane Sandy in 2012, with recurrent localized flooding evidenced by 19 311 complaints and multiple FloodNet sensor events <span class="cite">[sandy], [nyc311], [floodnet]</span>.
57
+
58
+ <span class="label">Empirical evidence.</span> Sandy flooded this address Oct 29-30, 2012 <span class="cite">[sandy]</span>. 19 flood-related 311 service requests within 200 m over five years <span class="cite">[nyc311]</span>. Three of five FloodNet sensors within 600 m documented events in the past three years <span class="cite">[floodnet]</span>.</div>
59
+
60
+ <span class="smallcaps">Mellea rejection sampling &middot; 4 grounding checks &middot; 4/4 pass = ship</span>
61
+
62
+ ---
63
+
64
+ ## the stack
65
+
66
+ # Three of four hackathon tracks. One project.
67
+
68
+ <div class="stack">
69
+ <div class="stack-row gpu">
70
+ <div class="lbl">MI300X &middot; vLLM</div>
71
+ <div class="body"><strong>IBM Granite 4.1 8B</strong> &mdash; planner + reconciler. ROCm 7. AMD-served.</div>
72
+ </div>
73
+ <div class="stack-row gpu">
74
+ <div class="lbl">MI300X &middot; ROCm</div>
75
+ <div class="body"><strong>Three Apache-2.0 NYC fine-tunes</strong> trained on AMD Developer Cloud:
76
+ <code>Prithvi-EO-2.0-NYC-Pluvial</code>,
77
+ <code>TerraMind-NYC-Adapters</code>,
78
+ <code>Granite-TTM-r2-Battery-Surge</code>.</div>
79
+ </div>
80
+ <div class="stack-row gpu">
81
+ <div class="lbl">MI300X &middot; ROCm</div>
82
+ <div class="body"><strong>Multimodal specialists.</strong> Sentinel-2 chip &rarr; Prithvi pluvial seg &middot; TerraMind LULC + Buildings adapters &middot; Granite Embedding 278M &middot; GLiNER typed extraction.</div>
83
+ </div>
84
+ <div class="stack-row app">
85
+ <div class="lbl">FastAPI</div>
86
+ <div class="body"><strong>Burr FSM agent.</strong> 17 specialists fuse FEMA, NYC DEP, NYC 311, FloodNet, NOAA, NWS, USGS HWMs, Sentinel-2. Streamed via SSE.</div>
87
+ </div>
88
+ </div>
89
+
90
+ <div style="margin-top: 18px;">
91
+ <span class="pill accent">Agents</span><span class="pill accent">Fine-tuning</span><span class="pill accent">Vision/Multimodal</span><span class="pill">Build-in-public</span>
92
+ </div>
93
+
94
+ ---
95
+
96
+ ## the receipts
97
+
98
+ # 5 of 5 NYC addresses. Mellea 4/4 every run.
99
+
100
+ <table>
101
+ <thead>
102
+ <tr><th>address</th><th>intent</th><th>wall</th><th>specialists</th><th>grounding</th></tr>
103
+ </thead>
104
+ <tbody>
105
+ <tr><td>442 E Houston St &middot; LES</td><td>address</td><td>7.6 s</td><td>19</td><td>4/4</td></tr>
106
+ <tr><td>80 Pioneer St &middot; Red Hook</td><td>address</td><td>13.1 s</td><td>19</td><td>4/4</td></tr>
107
+ <tr><td>100 Gold St &middot; Manhattan</td><td>address</td><td>11.2 s</td><td>19</td><td>4/4</td></tr>
108
+ <tr><td>Hollis &middot; Queens</td><td>nbhd</td><td>5.8 s</td><td>9</td><td>4/4</td></tr>
109
+ <tr><td>Coney Island &middot; Brooklyn</td><td>nbhd</td><td>9.9 s</td><td>9</td><td>4/4</td></tr>
110
+ </tbody>
111
+ </table>
112
+
113
+ <span class="smallcaps">scripts/probe_addresses.py &middot; vLLM on MI300X &middot; <strong style="color: var(--accent-text);">5.8&ndash;13.1 s end-to-end</strong></span>
114
+
115
+ ---
116
+
117
+ ## why it matters
118
+
119
+ # The civic-tech case.
120
+
121
+ <div class="two-col">
122
+ <div>
123
+
124
+ **NY Property Disclosure Law &middot; March 2024.** Sellers must disclose flood history. Riprap is the citable narrative.
125
+
126
+ **NYC DEP Stormwater Plan &middot; 2024.** $30B priority list, 86 sites. Riprap is the per-NTA evidence layer.
127
+
128
+ **EJNYC Flood Vulnerability Index &middot; 2024.** 35% of state climate spend goes to "disadvantaged communities." Riprap stays open-source so advocacy can audit.
129
+
130
+ </div>
131
+ <div>
132
+
133
+ <p style="font-family: var(--font-serif); font-style: italic; font-size: 24px; color: var(--ink); line-height: 1.4;">No commercial APIs. No closed models. No black-box scores.</p>
134
+
135
+ <p style="font-size: 18px; color: var(--ink-2); margin-top: 16px;">Every dataset is public-record federal, state, or city. Every foundation model is Apache-2.0. Every claim cites its source.</p>
136
+
137
+ </div>
138
+ </div>
139
+
140
+ ---
141
+
142
+ ## now
143
+
144
+ # Live demo.
145
+
146
+ <div style="margin-top: 24px; font-family: var(--font-mono); font-size: 18px; line-height: 1.6;">
147
+
148
+ <span style="color: var(--accent-text);">β–Ά</span> &nbsp; <code>https://lablab-ai-amd-developer-hackathon-riprap-nyc.hf.space</code>
149
+
150
+ <span style="color: var(--accent-text);">β–Ά</span> &nbsp; query: <em style="font-family: var(--font-serif); font-style: italic; color: var(--ink); border: none; padding: 0;">442 East Houston Street, Manhattan</em>
151
+
152
+ </div>
153
+
154
+ <div style="margin-top: 36px;">
155
+ <blockquote>17 specialists, ~10 seconds, audit-grade prose. Watch the Stones light up.</blockquote>
156
+ </div>
157
+
158
+ ---
159
+
160
+ <!-- _class: cta -->
161
+
162
+ # riprap
163
+
164
+ ## github.com/msradam/riprap-nyc
165
+
166
+ Apache-2.0 &middot; public data &middot; AMD MI300X &middot; IBM Granite 4.1 &middot; Mellea grounding
167
+
168
+ <p style="margin-top: 32px; font-family: var(--font-mono); font-size: 14px; letter-spacing: 0.1em; text-transform: uppercase; color: rgba(250,250,247,0.6);">
169
+ AMD &times; lablab.ai &middot; May 4&ndash;10 2026
170
+ </p>
slides/riprap.css ADDED
@@ -0,0 +1,520 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* @theme riprap
2
+ *
3
+ * Marp theme that mirrors the SvelteKit UI's design tokens 1:1.
4
+ * IBM Plex (Sans / Mono / Serif), paper register, Stone palette,
5
+ * the orange accent block from the wordmark. The same CSS variables
6
+ * defined in web/sveltekit/src/lib/tokens.css live here so a print
7
+ * of a slide and a screenshot of the app feel like one document.
8
+ */
9
+
10
+ @import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600&family=IBM+Plex+Sans:wght@300;400;500;600;700&family=IBM+Plex+Serif:wght@400;600;700&display=swap');
11
+
12
+ :root {
13
+ /* Tier (epistemic) β€” verified WCAG AA against paper. */
14
+ --tier-empirical: #0B5394;
15
+ --tier-modeled: #2A6FA8;
16
+ --tier-proxy: #6B6B6B;
17
+ --tier-synthetic: #2A6FA8;
18
+
19
+ /* Stone accents β€” five muted hint-colors keyed to the FSM stones. */
20
+ --stone-cornerstone: #7C6F5E;
21
+ --stone-keystone: #5E6E7C;
22
+ --stone-touchstone: #6B7C66;
23
+ --stone-lodestone: #7C6E5E;
24
+ --stone-capstone: #5E5E6E;
25
+
26
+ /* Neutrals β€” paper register from the SvelteKit UI. */
27
+ --paper: #FAFAF7;
28
+ --paper-deep: #F2F2EE;
29
+ --ink: #1A1A1A;
30
+ --ink-2: #4A4A4A;
31
+ --ink-3: #6B6B6B;
32
+ --rule: #1A1A1A;
33
+ --rule-soft: #C9C9C5;
34
+
35
+ /* Accent block (the riprap wordmark glyph). */
36
+ --accent: #D17C00;
37
+ --accent-text: #B8620A;
38
+
39
+ --font-sans: "IBM Plex Sans", -apple-system, BlinkMacSystemFont, system-ui, sans-serif;
40
+ --font-mono: "IBM Plex Mono", ui-monospace, "SF Mono", Menlo, monospace;
41
+ --font-serif: "IBM Plex Serif", Georgia, "Times New Roman", serif;
42
+ }
43
+
44
+ /* ── Section ──────────────────────────────────────────────────────────── */
45
+
46
+ section {
47
+ width: 1280px;
48
+ height: 720px;
49
+ padding: 56px 72px;
50
+ background: var(--paper);
51
+ color: var(--ink);
52
+ font-family: var(--font-sans);
53
+ font-size: 24px;
54
+ line-height: 1.45;
55
+ letter-spacing: 0;
56
+ position: relative;
57
+ display: flex;
58
+ flex-direction: column;
59
+ justify-content: flex-start;
60
+ }
61
+
62
+ /* Persistent wordmark on every slide except title β€” bottom-left, mono. */
63
+ section::before {
64
+ content: "β–Œ riprap";
65
+ position: absolute;
66
+ left: 72px;
67
+ bottom: 32px;
68
+ font-family: var(--font-mono);
69
+ font-size: 13px;
70
+ font-weight: 600;
71
+ letter-spacing: 0.06em;
72
+ text-transform: lowercase;
73
+ color: var(--ink);
74
+ }
75
+ section::before {
76
+ /* the leading block β–Œ inherits the accent color via this trick β€” split
77
+ into two pseudo elements isn't supported in Marp; instead we rely on
78
+ the orange β–Œ glyph being colored at render via overprint. */
79
+ }
80
+
81
+ /* Slide number β€” bottom-right, mono. */
82
+ section::after {
83
+ content: attr(data-marpit-pagination) " / " attr(data-marpit-pagination-total);
84
+ position: absolute;
85
+ right: 72px;
86
+ bottom: 32px;
87
+ font-family: var(--font-mono);
88
+ font-size: 12px;
89
+ font-weight: 500;
90
+ letter-spacing: 0.08em;
91
+ color: var(--ink-3);
92
+ }
93
+
94
+ /* ── Headings ─────────────────────────────────────────────────────────── */
95
+
96
+ h1 {
97
+ font-family: var(--font-serif);
98
+ font-weight: 600;
99
+ font-size: 64px;
100
+ line-height: 1.05;
101
+ letter-spacing: -0.02em;
102
+ margin: 0 0 16px;
103
+ color: var(--ink);
104
+ }
105
+
106
+ h2 {
107
+ font-family: var(--font-mono);
108
+ font-weight: 500;
109
+ font-size: 13px;
110
+ letter-spacing: 0.18em;
111
+ text-transform: uppercase;
112
+ color: var(--ink-3);
113
+ margin: 0 0 24px;
114
+ }
115
+
116
+ h3 {
117
+ font-family: var(--font-sans);
118
+ font-weight: 600;
119
+ font-size: 32px;
120
+ line-height: 1.2;
121
+ margin: 0 0 12px;
122
+ color: var(--ink);
123
+ }
124
+
125
+ /* ── Body ─────────────────────────────────────────────────────────────── */
126
+
127
+ p {
128
+ margin: 0 0 16px;
129
+ max-width: 60ch;
130
+ }
131
+
132
+ strong {
133
+ font-weight: 600;
134
+ color: var(--ink);
135
+ }
136
+
137
+ em {
138
+ font-style: normal;
139
+ border-bottom: 2px solid var(--accent);
140
+ padding-bottom: 1px;
141
+ }
142
+
143
+ ul, ol {
144
+ margin: 0 0 16px;
145
+ padding-left: 0;
146
+ list-style: none;
147
+ }
148
+
149
+ ul li, ol li {
150
+ position: relative;
151
+ padding-left: 28px;
152
+ margin: 0 0 14px;
153
+ font-size: 22px;
154
+ line-height: 1.4;
155
+ max-width: 60ch;
156
+ }
157
+
158
+ ul li::before {
159
+ content: "";
160
+ position: absolute;
161
+ left: 0;
162
+ top: 0.65em;
163
+ width: 14px;
164
+ height: 2px;
165
+ background: var(--ink);
166
+ }
167
+
168
+ ol {
169
+ counter-reset: ol-num;
170
+ }
171
+ ol li {
172
+ counter-increment: ol-num;
173
+ }
174
+ ol li::before {
175
+ content: counter(ol-num, decimal-leading-zero);
176
+ position: absolute;
177
+ left: 0;
178
+ top: 0;
179
+ font-family: var(--font-mono);
180
+ font-size: 13px;
181
+ font-weight: 600;
182
+ letter-spacing: 0.04em;
183
+ color: var(--accent-text);
184
+ width: auto;
185
+ height: auto;
186
+ background: transparent;
187
+ }
188
+
189
+ /* ── Code ─────────────────────────────────────────────────────────────── */
190
+
191
+ code {
192
+ font-family: var(--font-mono);
193
+ font-size: 0.9em;
194
+ background: var(--paper-deep);
195
+ padding: 1px 6px;
196
+ border-radius: 2px;
197
+ color: var(--ink);
198
+ }
199
+
200
+ pre {
201
+ font-family: var(--font-mono);
202
+ font-size: 16px;
203
+ line-height: 1.5;
204
+ background: var(--paper-deep);
205
+ border-left: 3px solid var(--accent);
206
+ padding: 18px 22px;
207
+ margin: 12px 0;
208
+ color: var(--ink);
209
+ border-radius: 2px;
210
+ }
211
+
212
+ pre code {
213
+ background: transparent;
214
+ padding: 0;
215
+ font-size: inherit;
216
+ }
217
+
218
+ /* ── Quote / aside / strapline ────────────────────────────────────────── */
219
+
220
+ blockquote {
221
+ font-family: var(--font-serif);
222
+ font-style: italic;
223
+ font-size: 28px;
224
+ line-height: 1.35;
225
+ color: var(--ink-2);
226
+ border-left: 3px solid var(--rule);
227
+ padding: 4px 0 4px 24px;
228
+ margin: 24px 0;
229
+ max-width: 56ch;
230
+ }
231
+
232
+ /* ── Rules ────────────────────────────────────────────────────────────── */
233
+
234
+ hr {
235
+ border: 0;
236
+ border-top: 1px solid var(--rule-soft);
237
+ margin: 24px 0;
238
+ }
239
+
240
+ /* ── Table ────────────────────────────────────────────────────────────── */
241
+
242
+ table {
243
+ border-collapse: collapse;
244
+ font-family: var(--font-sans);
245
+ font-size: 18px;
246
+ margin: 12px 0;
247
+ width: 100%;
248
+ }
249
+ th {
250
+ text-align: left;
251
+ font-family: var(--font-mono);
252
+ font-size: 12px;
253
+ font-weight: 500;
254
+ letter-spacing: 0.1em;
255
+ text-transform: uppercase;
256
+ color: var(--ink-3);
257
+ padding: 10px 12px;
258
+ border-bottom: 1px solid var(--rule);
259
+ }
260
+ td {
261
+ padding: 12px;
262
+ border-bottom: 1px solid var(--rule-soft);
263
+ vertical-align: top;
264
+ }
265
+
266
+ /* ── Title slide variant (lead) ───────────────────────────────────────── */
267
+
268
+ section.lead {
269
+ display: flex;
270
+ flex-direction: column;
271
+ justify-content: center;
272
+ background: var(--paper);
273
+ padding-left: 96px;
274
+ }
275
+ section.lead::before {
276
+ content: "β–Œ";
277
+ position: absolute;
278
+ left: 96px;
279
+ top: 80px;
280
+ bottom: auto;
281
+ font-family: var(--font-mono);
282
+ font-size: 64px;
283
+ font-weight: 600;
284
+ color: var(--accent);
285
+ line-height: 1;
286
+ }
287
+ section.lead h1 {
288
+ font-size: 96px;
289
+ line-height: 0.95;
290
+ letter-spacing: -0.025em;
291
+ margin: 0 0 8px;
292
+ }
293
+ section.lead h2 {
294
+ font-family: var(--font-serif);
295
+ font-style: italic;
296
+ font-weight: 400;
297
+ font-size: 32px;
298
+ letter-spacing: 0;
299
+ text-transform: none;
300
+ color: var(--ink-2);
301
+ margin: 0 0 32px;
302
+ max-width: 28ch;
303
+ }
304
+ section.lead .meta {
305
+ font-family: var(--font-mono);
306
+ font-size: 13px;
307
+ font-weight: 500;
308
+ letter-spacing: 0.12em;
309
+ text-transform: uppercase;
310
+ color: var(--ink-3);
311
+ margin-top: 32px;
312
+ }
313
+ section.lead .meta strong {
314
+ color: var(--ink);
315
+ font-weight: 600;
316
+ }
317
+
318
+ /* ── Closing slide variant ────────────────────────────────────────────── */
319
+
320
+ section.cta {
321
+ background: var(--ink);
322
+ color: var(--paper);
323
+ display: flex;
324
+ flex-direction: column;
325
+ justify-content: center;
326
+ padding-left: 96px;
327
+ }
328
+ section.cta::before {
329
+ content: "β–Œ";
330
+ color: var(--accent);
331
+ font-size: 64px;
332
+ position: absolute;
333
+ left: 96px;
334
+ top: 80px;
335
+ bottom: auto;
336
+ }
337
+ section.cta::after { color: rgba(250, 250, 247, 0.5); }
338
+ section.cta h1 {
339
+ font-size: 80px;
340
+ color: var(--paper);
341
+ margin: 0 0 16px;
342
+ }
343
+ section.cta h2 {
344
+ color: rgba(250, 250, 247, 0.7);
345
+ }
346
+ section.cta p {
347
+ font-size: 22px;
348
+ color: rgba(250, 250, 247, 0.85);
349
+ }
350
+ section.cta a, section.cta code {
351
+ color: var(--accent);
352
+ background: transparent;
353
+ padding: 0;
354
+ }
355
+
356
+ /* ── Two-column variant ───────────────────────────────────────────────── */
357
+
358
+ section.split {
359
+ padding-top: 64px;
360
+ }
361
+ section.split .columns {
362
+ display: grid;
363
+ grid-template-columns: 1fr 1fr;
364
+ gap: 56px;
365
+ margin-top: 12px;
366
+ }
367
+ section.split .columns > div h3 {
368
+ font-size: 22px;
369
+ margin-bottom: 8px;
370
+ }
371
+ section.split .columns > div p,
372
+ section.split .columns > div li {
373
+ font-size: 18px;
374
+ line-height: 1.45;
375
+ }
376
+
377
+ /* ── Stone-tinted heading rules (subtle) ──────────────────────────────── */
378
+
379
+ section[data-stone="cornerstone"] h1 { border-bottom: 4px solid var(--stone-cornerstone); padding-bottom: 8px; display: inline-block; }
380
+ section[data-stone="keystone"] h1 { border-bottom: 4px solid var(--stone-keystone); padding-bottom: 8px; display: inline-block; }
381
+ section[data-stone="touchstone"] h1 { border-bottom: 4px solid var(--stone-touchstone); padding-bottom: 8px; display: inline-block; }
382
+ section[data-stone="lodestone"] h1 { border-bottom: 4px solid var(--stone-lodestone); padding-bottom: 8px; display: inline-block; }
383
+ section[data-stone="capstone"] h1 { border-bottom: 4px solid var(--stone-capstone); padding-bottom: 8px; display: inline-block; }
384
+
385
+ /* ── Big-stat panel ───────────────────────────────────────────────────── */
386
+
387
+ .stat {
388
+ display: flex;
389
+ flex-direction: column;
390
+ gap: 4px;
391
+ }
392
+ .stat-value {
393
+ font-family: var(--font-serif);
394
+ font-weight: 600;
395
+ font-size: 56px;
396
+ line-height: 1;
397
+ color: var(--ink);
398
+ letter-spacing: -0.02em;
399
+ }
400
+ .stat-label {
401
+ font-family: var(--font-mono);
402
+ font-size: 11px;
403
+ font-weight: 500;
404
+ letter-spacing: 0.14em;
405
+ text-transform: uppercase;
406
+ color: var(--ink-3);
407
+ }
408
+
409
+ /* ── Stack diagram (slide 4 visual) ───────────────────────────────────── */
410
+
411
+ .stack {
412
+ display: grid;
413
+ grid-template-columns: 1fr;
414
+ gap: 8px;
415
+ margin-top: 8px;
416
+ }
417
+ .stack-row {
418
+ background: var(--paper-deep);
419
+ border-left: 3px solid var(--rule);
420
+ padding: 14px 18px;
421
+ font-size: 18px;
422
+ display: grid;
423
+ grid-template-columns: 180px 1fr;
424
+ gap: 24px;
425
+ align-items: baseline;
426
+ }
427
+ .stack-row .lbl {
428
+ font-family: var(--font-mono);
429
+ font-size: 12px;
430
+ font-weight: 500;
431
+ letter-spacing: 0.08em;
432
+ text-transform: uppercase;
433
+ color: var(--ink-3);
434
+ }
435
+ .stack-row .body {
436
+ font-family: var(--font-sans);
437
+ color: var(--ink);
438
+ }
439
+ .stack-row.gpu { border-left-color: var(--accent); }
440
+ .stack-row.gpu .lbl { color: var(--accent-text); }
441
+ .stack-row.app { border-left-color: var(--tier-empirical); }
442
+
443
+ /* ── Small caps utility ───────────────────────────────────────────────── */
444
+
445
+ .smallcaps {
446
+ font-family: var(--font-mono);
447
+ font-size: 13px;
448
+ font-weight: 500;
449
+ letter-spacing: 0.12em;
450
+ text-transform: uppercase;
451
+ color: var(--ink-3);
452
+ }
453
+
454
+ /* ── Two-column layout (used on slides 2, 6) ─────────────────────────── */
455
+
456
+ .two-col {
457
+ display: grid;
458
+ grid-template-columns: 1fr 1fr;
459
+ gap: 56px;
460
+ margin-top: 16px;
461
+ }
462
+ .two-col > div p,
463
+ .two-col > div li {
464
+ font-size: 20px;
465
+ line-height: 1.45;
466
+ max-width: none;
467
+ }
468
+ .two-col > div p:last-child,
469
+ .two-col > div li:last-child {
470
+ margin-bottom: 0;
471
+ }
472
+
473
+ /* ── Pseudo-codeblock (HTML-rendered, so inline spans keep color) ─────── */
474
+
475
+ .codeblock {
476
+ font-family: var(--font-mono);
477
+ font-size: 15px;
478
+ line-height: 1.55;
479
+ background: var(--paper-deep);
480
+ border-left: 3px solid var(--accent);
481
+ padding: 18px 22px;
482
+ margin: 12px 0;
483
+ color: var(--ink);
484
+ border-radius: 2px;
485
+ }
486
+ .codeblock p {
487
+ margin: 0 0 12px;
488
+ }
489
+ .codeblock p:last-child {
490
+ margin-bottom: 0;
491
+ }
492
+ .codeblock .cite {
493
+ color: var(--accent-text);
494
+ font-weight: 600;
495
+ }
496
+ .codeblock .label {
497
+ font-weight: 700;
498
+ }
499
+
500
+ /* ── Highlight pill ───────────────────────────────────────────────────── */
501
+
502
+ .pill {
503
+ display: inline-block;
504
+ font-family: var(--font-mono);
505
+ font-size: 12px;
506
+ font-weight: 500;
507
+ letter-spacing: 0.1em;
508
+ text-transform: uppercase;
509
+ background: var(--paper-deep);
510
+ border: 1px solid var(--rule-soft);
511
+ padding: 4px 10px;
512
+ border-radius: 100px;
513
+ color: var(--ink-2);
514
+ margin-right: 6px;
515
+ }
516
+ .pill.accent {
517
+ background: var(--accent);
518
+ color: var(--paper);
519
+ border-color: var(--accent);
520
+ }