akashreddy2103 commited on
Commit
c169990
·
verified ·
1 Parent(s): 5046b0f

Upload folder using huggingface_hub

Browse files
benchmark_summary_for_submission.md CHANGED
@@ -14,7 +14,7 @@ Show measurable improvement and reliability across:
14
  Recommended judge deployment:
15
  - API/UI: Docker via `docker-compose.landfillsentry.yml`
16
  - imagery: DPhi SimSat live API
17
- - inference: Hugging Face Transformers + optional PEFT adapter
18
 
19
  Preflight:
20
  ```bash
 
14
  Recommended judge deployment:
15
  - API/UI: Docker via `docker-compose.landfillsentry.yml`
16
  - imagery: DPhi SimSat live API
17
+ - inference: Hugging Face Transformers + PEFT adapter (`akashreddy2103/landfill`)
18
 
19
  Preflight:
20
  ```bash
docs/Judging_Gap_Closure_Plan.md ADDED
@@ -0,0 +1,174 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # LandfillSentry Judge-Guideline Gap Closure Plan
2
+
3
+ Date: April 22, 2026
4
+ Scope: Backend + Frontend + live-data reliability + demo readiness + fine-tuning evidence
5
+
6
+ ## 1) Judge Criteria to Delivery Map
7
+
8
+ | Judge Criterion | Weight | Current Risk | Required State for Scoring |
9
+ |---|---:|---|---|
10
+ | Use of Satellite Imagery | 10% | Medium | DPhi/SimSat imagery is the primary source in every scan path, with visible provenance and timestamps in UI/API artifacts. |
11
+ | Innovation + Problem/Solution Fit | 35% | Medium-High | Clear domain narrative: satellite-first triage + LFM2-VL reasoning + optional field dongle verification loop. |
12
+ | Technical Implementation | 35% | High | One-command run, no judge debugging, stable live scan and review workflow, deterministic failure messaging. |
13
+ | Demo + Communication | 20% | Medium | End-to-end live demo script, architecture explanation, fallback policy explained without ambiguity. |
14
+
15
+ ## 2) Current Gaps (Observed)
16
+
17
+ 1. Live vs fallback confusion:
18
+ - older fallback/mock incidents may still exist in DB history
19
+ - users need explicit provenance and generation mode visibility
20
+
21
+ 2. Frontend UX quality:
22
+ - engineering labels can leak into user-facing names
23
+ - operator intent must be clearer than raw backend fields
24
+
25
+ 3. Runtime reliability:
26
+ - live scans can fail when SimSat/Mapbox/model output is unavailable or invalid
27
+ - judge mode must fail fast and clearly (never pretend fallback is live)
28
+
29
+ 4. Demo readiness:
30
+ - judges need a repeatable one-command startup + smoke check flow
31
+
32
+ ## 3) Required Changes by Criterion
33
+
34
+ ## 3.1 Use of Satellite Imagery (10%)
35
+
36
+ ### Must Have Status
37
+ - [x] Expose imagery provenance in every incident:
38
+ - `source_chain`
39
+ - per-asset capture timestamps
40
+ - `live_fetch_status`
41
+ - [x] UI transparency:
42
+ - `Live Imagery Provenance` section in site detail
43
+ - `generation mode` visible in summary
44
+
45
+ ### Files Updated
46
+ - `apps/api/routes/api.py`
47
+ - `apps/api/services/imagery_service.py`
48
+ - `apps/web/public/ops-app.jsx`
49
+
50
+ ### Acceptance
51
+ - [x] For displayed incidents, UI shows provenance fields and generation mode.
52
+
53
+ ---
54
+
55
+ ## 3.2 Innovation + Problem/Solution Fit (35%)
56
+
57
+ ### Must Have Status
58
+ - [x] Product story signals in-app:
59
+ - why alert exists (incident summary text)
60
+ - what to inspect first (recommended follow-up/export)
61
+ - confidence visibility
62
+ - [x] Dongle integration path:
63
+ - methane reading ingest endpoint
64
+ - attach reading to incident as `ground_truth_hint`
65
+ - UI badge: `Satellite-only` vs `Satellite + Dongle corroborated`
66
+ - [ ] OpenAPI artifact refreshed to include latest dongle routes
67
+
68
+ ### Files Updated
69
+ - `apps/api/routes/api.py`
70
+ - `apps/api/db/repository.py`
71
+ - `apps/api/schemas/models.py`
72
+ - `apps/web/public/ops-app.jsx`
73
+ - `tests/test_phase8_ui_workflow.py`
74
+
75
+ ### Acceptance
76
+ - [x] One incident can show satellite evidence + attached dongle reading in UI and export.
77
+
78
+ ---
79
+
80
+ ## 3.3 Technical Implementation (35%)
81
+
82
+ ### Must Have Status
83
+ - [x] Strict live-only policy for judge mode:
84
+ - `REQUIRE_LIVE_RESULTS=true` gating
85
+ - strict scan selection for live-generated results in watchlist/detail
86
+ - actionable fast-fail for non-live runtime mismatch
87
+ - [x] One-command run script:
88
+ - `scripts/start_judge_mode.ps1`
89
+ - [x] Deterministic smoke tests:
90
+ - `scripts/live_smoke.py` checks health, scan, live mode, previews, review persistence, export
91
+ - [x] Fallback ambiguity removed:
92
+ - fallback only when explicitly enabled
93
+ - strict mode rejects invalid live outputs
94
+
95
+ ### Files Updated
96
+ - `scripts/start_judge_mode.ps1`
97
+ - `scripts/live_smoke.py`
98
+ - `apps/api/config.py`
99
+ - `apps/api/routes/api.py`
100
+ - `apps/api/services/inference_service.py`
101
+ - `README.md`
102
+ - `tests/test_phase5_inference.py`
103
+
104
+ ### Acceptance
105
+ - [x] Fresh-machine style startup + smoke workflow exists and is documented.
106
+
107
+ ---
108
+
109
+ ## 3.4 Demo + Communication (20%)
110
+
111
+ ### Must Have Status
112
+ - [x] 5-minute demo sequence documented
113
+ - [x] Architecture brief for judges documented
114
+ - [x] Benchmark summary template + reproducible commands documented
115
+ - [ ] Final architecture diagram image asset prepared
116
+ - [x] Final benchmark table populated with tuned vs base numeric deltas
117
+
118
+ ### Files Added
119
+ - `docs/demo_script.md`
120
+ - `docs/architecture_for_judges.md`
121
+ - `docs/benchmark_summary_for_submission.md`
122
+
123
+ ### Acceptance
124
+ - [x] Any teammate can follow the same demo sequence from documentation.
125
+
126
+ ## 4) Priority Execution Plan (Order Matters)
127
+
128
+ 1. Reliability first:
129
+ - [x] strict live-only path + judge-mode run script
130
+
131
+ 2. UX second:
132
+ - [x] operator-first wording and provenance section
133
+
134
+ 3. Dongle path third:
135
+ - [x] lightweight corroboration feature
136
+
137
+ 4. Submission pack fourth:
138
+ - [x] docs scaffolds created
139
+ - [ ] final numeric benchmark fill-in
140
+ - [ ] final architecture diagram export
141
+
142
+ ## 5) Concrete Sprint Backlog
143
+
144
+ ## P0 (Blockers)
145
+ 1. [x] Add `scripts/start_judge_mode.ps1` and `scripts/live_smoke.py`.
146
+ 2. [x] Ensure watchlist/site detail only display strict live-generated incidents in judge mode.
147
+ 3. [x] Add explicit live provenance block in UI and export payload.
148
+
149
+ ## P1 (Score Multipliers)
150
+ 1. [x] Add dongle ingestion endpoint + UI badge integration.
151
+ 2. [x] Add benchmark delta table with final measured numbers.
152
+ 3. [x] Finalize demo script and architecture brief docs.
153
+
154
+ ## P2 (Polish)
155
+ 1. [ ] Copywriting pass for operator persona language.
156
+ 2. [ ] Responsive UI polish + empty/error states.
157
+ 3. [ ] Screenshot pack generation for submission fallback/live comparison.
158
+
159
+ ## 6) Done Definition Before Submission
160
+
161
+ Project is ready only if all are true:
162
+ 1. [x] Judge can run using one command/script, no manual debugging path documented.
163
+ 2. [x] UI displays live-generated incident with satellite provenance fields.
164
+ 3. [x] Review + export flow succeeds end-to-end.
165
+ 4. [x] Base vs tuned improvement table is filled with reproducible measured values.
166
+ 5. [x] Demo narrative explains satellite + LFM2-VL + dongle loop.
167
+
168
+ ## 7) Immediate Next Actions
169
+
170
+ 1. [x] Implement `start_judge_mode.ps1` + `live_smoke.py`.
171
+ 2. [x] Add `Live Imagery Provenance` panel in frontend.
172
+ 3. [x] Add `dongle_readings` table + ingest API skeleton.
173
+ 4. [ ] Re-run strict live screenshot pack for submission assets.
174
+ 5. [ ] Refresh `openapi.json` to include latest dongle endpoints.
docs/annotation-guide.md ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Annotation Guide v1 (Phase 6)
2
+
3
+ This guide defines how LandfillSentry labeling works for LoRA fine-tuning.
4
+
5
+ ## 1) Label Unit
6
+
7
+ One label unit equals one `EvidencePanel` + one structured incident annotation.
8
+
9
+ Required fields per sample:
10
+
11
+ - `sample_id`
12
+ - `site_id`
13
+ - `split` (`train`, `validation`, `test`, `demo`)
14
+ - `panel_artifact_path`
15
+ - `annotation`:
16
+ - `plume_likely` (bool)
17
+ - `bbox_norm` (`[x1, y1, x2, y2]` normalized to `[0,1]`)
18
+ - `likely_source_zone` (`active_face`, `gas_system`, `perimeter_or_unknown`)
19
+ - `priority_tier` (`low`, `medium`, `high`, `urgent`)
20
+ - `provenance`:
21
+ - `source_type` (`manual`, `weak`, `synthetic`)
22
+ - `source_ref`
23
+ - `labeler`
24
+ - `created_at` (ISO 8601 UTC)
25
+ - optional `notes`
26
+
27
+ ## 2) Provenance Policy
28
+
29
+ Every sample must include provenance metadata. No exceptions.
30
+
31
+ Rules:
32
+
33
+ - `manual`: reviewed by human labeler.
34
+ - `weak`: generated by heuristic/system and spot-checked.
35
+ - `synthetic`: augmented from panel transformations.
36
+ - Keep provenance immutable after split freeze.
37
+
38
+ ## 3) Negative Set Policy
39
+
40
+ Negative samples are first-class and must remain in every split.
41
+
42
+ Negative criteria:
43
+
44
+ - no plausible plume indicator,
45
+ - cloud/shadow artifacts not mistaken as plume,
46
+ - uncertainty defaults to `plume_likely=false`.
47
+
48
+ ## 4) Split Freeze Policy
49
+
50
+ Split files are generated once and treated as frozen artifacts:
51
+
52
+ - manifest: `data/manifests/dataset_manifest_v1.json`
53
+ - splits: `data/manifests/dataset_splits_v1.json`
54
+
55
+ Rules:
56
+
57
+ - `validation` and `demo` samples cannot be reused in `train`.
58
+ - any sample change requires a new manifest version (v2, v3, ...).
59
+ - keep `manifest_checksum` in training records for reproducibility.
60
+
61
+ ## 5) Quality Checks Before Training
62
+
63
+ Minimum checks:
64
+
65
+ - all samples validate required schema fields,
66
+ - all `bbox_norm` arrays contain exactly 4 values,
67
+ - every sample has provenance block,
68
+ - split counts are non-zero for `train`, `validation`, and `demo`.
69
+
70
+ ## 6) Output Contract Reminder
71
+
72
+ Fine-tuning must preserve the same incident-output contract used by Phase 5.
73
+
74
+ That means:
75
+
76
+ - same prompt/output schema alignment,
77
+ - same enum values,
78
+ - same validation fallback logic in API pipeline.
79
+
docs/architecture.md ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # LandfillSentry Ops Architecture (Phase 1 Freeze)
2
+
3
+ ## Frozen MVP Workflow
4
+
5
+ 1. Operator opens watchlist and selects a site.
6
+ 2. Backend retrieves current and historical imagery.
7
+ 3. Candidate generator proposes suspicious regions.
8
+ 4. Panel builder creates evidence artifacts.
9
+ 5. VLM inference produces structured incident JSON.
10
+ 6. Incident is stored with `review_status=proposed`.
11
+ 7. UI shows evidence, recommendation, and review controls.
12
+ 8. Human review sets final state (`published`, `dismissed`, or `needs_review`).
13
+
14
+ ## Incident Lifecycle (Frozen)
15
+
16
+ ```text
17
+ proposed -> published
18
+ proposed -> dismissed
19
+ proposed -> needs_review
20
+ needs_review -> published
21
+ needs_review -> dismissed
22
+ needs_review -> needs_review
23
+ ```
24
+
25
+ ## MVP Scope (Frozen)
26
+
27
+ - watchlist-first workflow
28
+ - single-incident object with explainable fields
29
+ - human review before incident publication
30
+ - live and cached execution paths
31
+ - synchronous scan path for MVP
32
+
33
+ ## Explicit Non-Goals (Phase 1)
34
+
35
+ - regulatory-grade quantification
36
+ - autonomous enforcement decisions
37
+ - enterprise multi-tenant administration
38
+ - full atmospheric inversion
39
+ - global generalized methane platform in MVP
docs/demo-script.md ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Demo Script Placeholder
2
+
3
+ Phase 1 freeze:
4
+
5
+ 1. Watchlist opens with frozen demo sites.
6
+ 2. Site scan returns incident object and evidence panel.
7
+ 3. Operator reviews incident and sets review action.
8
+ 4. Incident export path is demonstrated.
9
+ 5. Cached fallback path is explicitly shown.
10
+
11
+ Final script polish happens in Phase 9.
docs/demo-site-selection-rubric.md ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Demo-Site Selection Rubric (Frozen in Phase 1)
2
+
3
+ ## Goal
4
+
5
+ Select and freeze `3-5` landfill demo sites with reliable imagery access and clear storytelling value.
6
+
7
+ ## Hard Filters (Must Pass)
8
+
9
+ - Site is a real landfill or operationally plausible landfill location.
10
+ - SimSat retrieval path is available for current and historical views.
11
+ - Site can support cached replay for demo fallback.
12
+ - Site metadata includes at least id, name, lat, lon, country.
13
+
14
+ ## Scoring Rubric (100 Points)
15
+
16
+ - `30` Data availability and retrieval reliability
17
+ - `25` Visual signal separability (clear candidate-worthy regions)
18
+ - `15` Cloud resilience across recent history
19
+ - `15` Geographic diversity contribution
20
+ - `15` Demo narrative usefulness (operator actionability)
21
+
22
+ ## Selection Process
23
+
24
+ 1. Build shortlist of `8-12` candidate sites.
25
+ 2. Score each site using the rubric in `assets/demo_sites/demo_site_selection_matrix.csv`.
26
+ 3. Pick top `3-5` sites while preserving geographic diversity.
27
+ 4. Freeze selected sites in `assets/demo_sites/frozen_demo_sites.template.json`.
28
+ 5. Mark each frozen site as one of: `positive`, `negative`, `cloudy`, `missing_data`.
29
+
30
+ ## Freeze Policy
31
+
32
+ - Frozen sites are not changed during a phase unless a blocker is logged.
33
+ - Any site replacement requires a documented reason in change log.
34
+ - Cached assets must be prepared for every frozen site.
docs/demo_video_shotlist.md ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Demo Video Shot List
2
+
3
+ Target length: 3-5 minutes.
4
+
5
+ ## Pre-Record Checklist
6
+
7
+ Run:
8
+
9
+ ```powershell
10
+ powershell -ExecutionPolicy Bypass -File scripts/start_judge_mode.ps1 -RestartApi
11
+ ```
12
+
13
+ Verify these are ready:
14
+ - `http://127.0.0.1:8000/ops`
15
+ - `docs/latest_live_smoke_proof.md`
16
+ - `docs/latest_live_scan_artifact.md`
17
+ - `docs/benchmark_summary_for_submission.md`
18
+
19
+ ## Recording Flow
20
+
21
+ 1. Problem framing, 20s
22
+ Landfill operators need to know which site to inspect first and why, not just see another map.
23
+
24
+ 2. Architecture, 35s
25
+ Show the flow: watchlist site -> DPhi SimSat Sentinel/Mapbox imagery -> candidate/evidence panel -> LFM2.5-VL incident JSON -> operator review/export.
26
+
27
+ 3. Live proof, 45s
28
+ Show `docs/latest_live_smoke_proof.md`: status `PASS`, scan `scan_083`, inference mode `live`, all previews present.
29
+
30
+ 4. Product walkthrough, 90s
31
+ Open `/ops`, select the scan/site, show evidence previews, provenance, source chain, timestamps, priority, confidence, and review status.
32
+
33
+ 5. Reliability, 30s
34
+ Explain strict mode: if live imagery or inference is unavailable, the app fails with an actionable error instead of pretending cached/mock output is live.
35
+
36
+ 6. Fine-tune and benchmark, 45s
37
+ Show `docs/benchmark_summary_for_submission.md`: Modal LoRA run `lora_run_20260504T181913Z`, 78 live-scan samples, public adapter `akashreddy2103/landfill`, validation-loss improvement, and the base-vs-tuned metric table.
38
+
39
+ 7. Close, 20s
40
+ Emphasize the useful operator outcome: auditable, reviewable methane incident triage with live satellite provenance.
41
+
42
+ ## Must-Say Lines
43
+
44
+ - "This is strict live mode: no fallback is presented as live."
45
+ - "DPhi SimSat is the primary imagery provider, with current Sentinel, historical Sentinel, and Mapbox context recorded in provenance."
46
+ - "The output is not just a caption; it becomes a persisted incident with review state and exportable evidence."
docs/evaluation.md ADDED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Phase 7 Evaluation Guide
2
+
3
+ This document defines the Phase 7 evaluation and reliability workflow.
4
+
5
+ ## Scope
6
+
7
+ Phase 7 compares three model paths:
8
+
9
+ - `heuristic` (candidate-only projection)
10
+ - `base_model` (no adapter)
11
+ - `fine_tuned_model` (adapter-enabled contract path)
12
+
13
+ and validates reliability for known failure modes. The evaluator now runs repeated positive,
14
+ negative, and cloudy fixture cases so the report is no longer based on a single sample per class.
15
+
16
+ ## Run Command
17
+
18
+ ```bash
19
+ python scripts/benchmark_models.py
20
+ ```
21
+
22
+ ## Generated Artifacts
23
+
24
+ The command writes these files to `data/manifests/`:
25
+
26
+ - `phase7_evaluation_report.json`
27
+ - `phase7_baseline_comparison.md`
28
+ - `phase7_null_scene_report.json`
29
+ - `phase7_human_actionability_rubric_v1.json`
30
+ - `phase7_reliability_report.json`
31
+
32
+ ## Metrics
33
+
34
+ Per model, the harness computes:
35
+
36
+ - `json_valid_rate`
37
+ - `incident_f1`
38
+ - `zone_accuracy`
39
+ - `bbox_iou`
40
+ - `human_usefulness_score`
41
+ - confusion matrix (`tp`, `fp`, `tn`, `fn`)
42
+ - per-fixture plume and zone accuracy
43
+ - Wilson confidence intervals for schema validity, plume accuracy, zone accuracy, and null-scene false positives
44
+
45
+ Null-scene trust is reported separately as:
46
+
47
+ - `false_positive_count`
48
+ - `false_positive_rate`
49
+ - confidence interval for `false_positive_rate`
50
+
51
+ ## Quality Gates
52
+
53
+ The report includes pass/fail gates for the fine-tuned path:
54
+
55
+ - `json_valid_rate >= 1.00`
56
+ - `incident_f1 >= 0.80`
57
+ - `zone_accuracy >= 0.75`
58
+ - `bbox_iou >= 0.50`
59
+ - `human_usefulness_score >= 0.80`
60
+ - `null_false_positive_rate <= 0.25`
61
+
62
+ `validation_summary.validation_strength` is `moderate` only when the suite has at least
63
+ 12 cases per model, the fine-tuned path passes all gates, and it shows meaningful deltas
64
+ over the base projection. Otherwise it remains `limited`.
65
+
66
+ ## Human Actionability Rubric (v1)
67
+
68
+ Each incident is scored on:
69
+
70
+ - actionability
71
+ - clarity
72
+ - plausibility
73
+ - followup_quality
74
+ - trustworthiness
75
+
76
+ Each criterion is scored 1-5 and normalized to `[0,1]`.
77
+
78
+ ## Failure Injection Coverage
79
+
80
+ The reliability harness explicitly tests:
81
+
82
+ - invalid JSON model output retry path
83
+ - empty candidate handling path
84
+ - Mapbox API configuration failure path
85
+ - slow inference detection path
86
+
87
+ These checks feed into `phase7_reliability_report.json`.
docs/field-dictionary.md ADDED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Field Dictionary (Phase 1 Contract Freeze)
2
+
3
+ ## Site
4
+
5
+ - `site_id`: unique stable site identifier
6
+ - `name`: human-readable site name
7
+ - `lat`: centroid latitude
8
+ - `lon`: centroid longitude
9
+ - `country`: country label
10
+ - `operator`: operator label
11
+ - `watchlist_enabled`: include site in watchlist scans
12
+ - `polygon_geojson`: optional polygon boundary
13
+ - `metadata`: extensible metadata object
14
+
15
+ ## ImageAsset
16
+
17
+ - `asset_id`: unique asset identifier
18
+ - `site_id`: parent site
19
+ - `source`: imagery source (`dphi-simsat`, `dphi-simsat-sentinel`, `dphi-simsat-mapbox`, `mapbox`, `cache`, `other`)
20
+ - `timestamp_requested`: request time
21
+ - `timestamp_captured`: capture time
22
+ - `cloud_cover`: cloud metric in `[0,1]`
23
+ - `bands`: band list or channel descriptors
24
+ - `local_path`: cache path for asset
25
+ - `cache_key`: deterministic cache key
26
+
27
+ ## Candidate
28
+
29
+ - `candidate_id`: candidate identifier
30
+ - `site_id`: parent site
31
+ - `job_id`: scan/job identifier
32
+ - `bbox_norm`: normalized bbox `[x1, y1, x2, y2]`
33
+ - `candidate_score`: candidate confidence score
34
+ - `temporal_recurrence`: recurrence feature score
35
+ - `cloud_penalty`: cloud penalty score
36
+ - `likely_source_zone_prior`: coarse zone prior enum
37
+
38
+ ## EvidencePanel
39
+
40
+ - `panel_id`: evidence panel identifier
41
+ - `site_id`: parent site
42
+ - `candidate_id`: candidate link
43
+ - `panel_version`: panel composer version
44
+ - `current_rgb_path`: path to current RGB panel image
45
+ - `spectral_composite_path`: path to methane-sensitive composite
46
+ - `temporal_diff_path`: path to temporal difference panel
47
+ - `mapbox_context_path`: required map context image path
48
+ - `metadata_json`: serialized panel metadata
49
+
50
+ ## Incident
51
+
52
+ - `incident_id`: incident identifier
53
+ - `site_id`: parent site
54
+ - `job_id`: scan/job identifier
55
+ - `analysis_time`: inference timestamp
56
+ - `plume_likely`: plume-likely classification
57
+ - `confidence`: confidence in `[0,1]`
58
+ - `bbox_norm`: normalized bbox `[x1, y1, x2, y2]`
59
+ - `likely_source_zone`: predicted zone enum
60
+ - `persistence_score`: persistence in `[0,1]`
61
+ - `priority_tier`: triage priority enum
62
+ - `severity_tier`: incident severity enum
63
+ - `review_status`: review lifecycle enum
64
+ - `feedback_status`: feedback enum
65
+ - `evidence_summary`: concise rationale text
66
+ - `recommended_followup`: next operational action
67
+ - `model_version`: model or adapter identifier
68
+
69
+ ## ReviewAction
70
+
71
+ - `incident_id`: target incident
72
+ - `review_status`: requested review state transition
73
+ - `feedback_status`: optional operator feedback
74
+ - `review_comment`: optional human note
75
+
76
+ ## EvaluationRecord
77
+
78
+ - `eval_id`: evaluation row identifier
79
+ - `split`: dataset split (`train`, `validation`, `test`, `demo`)
80
+ - `site_id`: evaluated site
81
+ - `baseline_model`: baseline model id
82
+ - `candidate_model`: model under evaluation
83
+ - `json_valid_rate`: valid JSON generation rate
84
+ - `incident_f1`: incident-level F1 metric
85
+ - `zone_accuracy`: source-zone accuracy
86
+ - `bbox_iou`: bbox IoU metric
87
+ - `human_usefulness_score`: reviewer usefulness score
docs/global_live_api_probe_report.md ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Global Live API Probe Report
2
+
3
+ Generated: 2026-04-28T17:02:13+00:00
4
+
5
+ - Target samples: 180
6
+ - Successes: 0
7
+ - Failures: 0
8
+ - Unique successful sites: 0
9
+
10
+ | Site | Region | Country | Probe OK | Scan Successes | Scan Failures |
11
+ |---|---|---|---|---:|---:|
12
+ | LF_GLOBAL_001 | North America | United States | yes | 0 | 0 |
13
+ | LF_GLOBAL_002 | North America | United States | yes | 0 | 0 |
14
+ | LF_GLOBAL_003 | North America | United States | yes | 0 | 0 |
15
+ | LF_GLOBAL_004 | North America | United States | yes | 0 | 0 |
16
+ | LF_GLOBAL_005 | North America | United States | yes | 0 | 0 |
17
+ | LF_GLOBAL_006 | Latin America | Mexico | yes | 0 | 0 |
18
+ | LF_GLOBAL_007 | Latin America | Brazil | yes | 0 | 0 |
19
+ | LF_GLOBAL_008 | Latin America | Chile | yes | 0 | 0 |
20
+ | LF_GLOBAL_009 | Latin America | Argentina | yes | 0 | 0 |
21
+ | LF_GLOBAL_010 | Latin America | Colombia | yes | 0 | 0 |
22
+ | LF_GLOBAL_011 | Asia | India | yes | 0 | 0 |
23
+ | LF_GLOBAL_012 | Asia | India | yes | 0 | 0 |
24
+ | LF_GLOBAL_013 | Asia | Indonesia | yes | 0 | 0 |
25
+ | LF_GLOBAL_014 | Asia | South Korea | yes | 0 | 0 |
26
+ | LF_GLOBAL_015 | Asia | China | yes | 0 | 0 |
27
+ | LF_GLOBAL_016 | Asia | Singapore | yes | 0 | 0 |
28
+ | LF_GLOBAL_017 | Asia | Philippines | yes | 0 | 0 |
29
+ | LF_GLOBAL_018 | Africa | Nigeria | yes | 0 | 0 |
30
+ | LF_GLOBAL_019 | Africa | Kenya | yes | 0 | 0 |
31
+ | LF_GLOBAL_020 | Africa | Ghana | yes | 0 | 0 |
32
+ | LF_GLOBAL_021 | Africa | Morocco | yes | 0 | 0 |
33
+ | LF_GLOBAL_022 | Africa | South Africa | yes | 0 | 0 |
34
+ | LF_GLOBAL_023 | Middle East | United Arab Emirates | yes | 0 | 0 |
35
+ | LF_GLOBAL_024 | Middle East | Israel | yes | 0 | 0 |
36
+ | LF_GLOBAL_025 | Oceania | Australia | yes | 0 | 0 |
37
+ | LF_GLOBAL_026 | Oceania | New Zealand | yes | 0 | 0 |
docs/global_live_dataset_summary.md ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Global Live Dataset Summary
2
+
3
+ Date: April 28, 2026
4
+
5
+ ## What Changed
6
+
7
+ The Phase 6 training dataset is no longer Europe-only. A global site seed file was added at:
8
+
9
+ - `assets/demo_sites/global_sites.26rows.csv`
10
+
11
+ The collection script probes DPhi SimSat first, then only scans sites whose current Sentinel, historical Sentinel, and Mapbox context endpoints are reachable:
12
+
13
+ ```bash
14
+ python scripts/collect_global_live_scans.py --probe-only
15
+ python scripts/collect_global_live_scans.py --target-samples 180 --repeats-per-site 8
16
+ ```
17
+
18
+ Latest all-site probe result:
19
+
20
+ - `26 / 26` global candidate sites passed the DPhi SimSat endpoint probe.
21
+ - Report: `docs/global_live_api_probe_report.md`
22
+
23
+ ## Current Expanded Dataset
24
+
25
+ After the first two global collection batches:
26
+
27
+ - total live-scan samples: `78`
28
+ - total unique sites: `30`
29
+ - global non-Europe successful sites: `20`
30
+ - split counts:
31
+ - train: `49`
32
+ - validation: `20`
33
+ - test: `9`
34
+
35
+ Regions represented:
36
+
37
+ | Region | Samples |
38
+ |---|---:|
39
+ | Europe/legacy | 58 |
40
+ | North America | 5 |
41
+ | Latin America | 5 |
42
+ | Asia | 6 |
43
+ | Africa | 3 |
44
+ | Middle East | 1 |
45
+
46
+ The larger target remains `150-300+` live scans. The pipeline is now ready for that run; at the current live scan speed it should be treated as a longer overnight collection job.
47
+
48
+ ## Manual Label Correction
49
+
50
+ Export review queue:
51
+
52
+ ```bash
53
+ python scripts/export_label_review_queue.py
54
+ ```
55
+
56
+ Then copy corrected rows into:
57
+
58
+ - `data/labels/manual_label_corrections.csv`
59
+
60
+ Template:
61
+
62
+ - `data/labels/manual_label_corrections.template.csv`
63
+
64
+ When `scripts/build_phase6_dataset.py` runs, it applies those manual corrections before writing:
65
+
66
+ - `data/labels/phase6_samples_live_v1.jsonl`
67
+ - `data/manifests/dataset_manifest_v1.json`
68
+ - `data/manifests/dataset_splits_v1.json`
69
+
70
+ ## Latest Modal Run
71
+
72
+ - run id: `lora_run_20260428T165129Z`
73
+ - adapter ref: `modal-volume://landfillsentry-model-artifacts/lora_run_20260428T165129Z/checkpoint-lora-v1`
74
+ - checkpoint record: `data/manifests/tuned_checkpoint_v1.json`
docs/global_live_scan_collection_report.md ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Global Live Scan Collection Report
2
+
3
+ Generated: 2026-04-28T16:50:21+00:00
4
+
5
+ - Target samples: 10
6
+ - Successes: 10
7
+ - Failures: 3
8
+ - Unique successful sites: 10
9
+
10
+ | Site | Region | Country | Probe OK | Scan Successes | Scan Failures |
11
+ |---|---|---|---|---:|---:|
12
+ | LF_GLOBAL_011 | Asia | India | yes | 1 | 0 |
13
+ | LF_GLOBAL_012 | Asia | India | yes | 1 | 0 |
14
+ | LF_GLOBAL_013 | Asia | Indonesia | yes | 0 | 1 |
15
+ | LF_GLOBAL_014 | Asia | South Korea | yes | 1 | 0 |
16
+ | LF_GLOBAL_015 | Asia | China | yes | 1 | 0 |
17
+ | LF_GLOBAL_016 | Asia | Singapore | yes | 1 | 0 |
18
+ | LF_GLOBAL_017 | Asia | Philippines | yes | 1 | 0 |
19
+ | LF_GLOBAL_018 | Africa | Nigeria | yes | 1 | 0 |
20
+ | LF_GLOBAL_019 | Africa | Kenya | yes | 0 | 1 |
21
+ | LF_GLOBAL_020 | Africa | Ghana | yes | 1 | 0 |
22
+ | LF_GLOBAL_021 | Africa | Morocco | yes | 0 | 1 |
23
+ | LF_GLOBAL_022 | Africa | South Africa | yes | 1 | 0 |
24
+ | LF_GLOBAL_023 | Middle East | United Arab Emirates | yes | 1 | 0 |
25
+ | LF_GLOBAL_024 | Middle East | Israel | yes | 0 | 0 |
26
+ | LF_GLOBAL_025 | Oceania | Australia | yes | 0 | 0 |
27
+ | LF_GLOBAL_026 | Oceania | New Zealand | yes | 0 | 0 |
docs/integration-checklist.md ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Phase Integration Checklist
2
+
3
+ Use this checklist before closing any phase.
4
+
5
+ - [ ] Previous-phase contracts remain unchanged or are explicitly versioned
6
+ - [ ] API contract still matches `openapi.json`
7
+ - [ ] Golden fixtures (`positive`, `negative`, `cloudy`, `missing_data`) still run
8
+ - [ ] Live execution path works for minimum smoke case
9
+ - [ ] Cached execution path works for minimum smoke case
10
+ - [ ] Failure behavior is user-readable and non-crashing
11
+ - [ ] Updated verification notes added to master-plan change log
docs/testing-charter.md ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Testing Charter (Phase 1 Lock)
2
+
3
+ ## Purpose
4
+
5
+ Define mandatory testing and integration behavior for all phases.
6
+
7
+ ## Test Pyramid
8
+
9
+ ### Unit
10
+
11
+ - schema validation
12
+ - bbox normalization utilities
13
+ - candidate scoring helpers
14
+ - prompt formatting
15
+ - review-state transition checks
16
+
17
+ ### Integration
18
+
19
+ - SimSat adapter + cache behavior
20
+ - candidate -> panel pipeline compatibility
21
+ - inference output -> schema validator
22
+ - API routes + DB layer
23
+ - web UI fetch/render against cached payloads
24
+
25
+ ### End-to-End
26
+
27
+ - one positive-site live scan
28
+ - one positive-site cached scan
29
+ - one negative-site cached scan
30
+ - one cloudy or missing-data graceful path
31
+
32
+ ## Golden Fixture Matrix (Mandatory)
33
+
34
+ - `positive`: expected anomaly candidate path
35
+ - `negative`: null-scene trust path
36
+ - `cloudy`: cloud-heavy degradation path
37
+ - `missing_data`: retrieval failure degradation path
38
+
39
+ Fixture root: `tests/fixtures/`
40
+
41
+ ## Live + Cached Policy
42
+
43
+ - Every major capability must support both live and cached execution.
44
+ - Cached mode is required for demo resilience.
45
+ - Integration tests should verify equivalent schema outputs between live and cached paths.
46
+
47
+ ## Phase-Close Quality Gate
48
+
49
+ No phase is marked complete unless:
50
+
51
+ - part-level acceptance checks pass,
52
+ - integration checkpoint for the phase passes,
53
+ - required fixture classes are still supported,
54
+ - contract drift against `openapi.json` is resolved.
judge_deployment_runbook.md CHANGED
@@ -26,26 +26,18 @@ Do not switch to llama.cpp, MLX, or ONNX for the judging build unless exported m
26
  - Strict live judge mode.
27
  - DPhi SimSat imagery integration and provenance.
28
  - Hugging Face Transformers inference path.
29
- - Optional PEFT adapter loading with `HF_ADAPTER_ID`.
30
  - Modal training scaffold and checkpoint record.
31
  - Benchmark/evaluation artifacts for a small domain-adaptation fixture proxy.
32
 
33
- ## What Still Needs Your Input
34
 
35
- To claim fine-tuned public weights strongly, provide:
36
 
37
- - `HF_ADAPTER_ID`: the public Hugging Face adapter repo, for example `your-org/landfillsentry-lfm25vl-lora`.
38
  - `HF_TOKEN`: a token that can read the base model and adapter during judging.
39
  - `MAPBOX_TOKEN`: needed by SimSat Mapbox imagery.
40
- - Confirmation that the public model card links back to this repo's training code and documents the dataset/methodology.
41
-
42
- For your current target repo, the adapter ID will be:
43
-
44
- ```env
45
- HF_ADAPTER_ID=akashreddy2103/landfill
46
- ```
47
-
48
- Set it only after the repo contains real PEFT adapter files.
49
 
50
  ## Local Judge Mode
51
 
@@ -116,7 +108,7 @@ INFERENCE_ALLOW_FALLBACK=false
116
  HF_TOKEN=...
117
  HF_MODEL_ID=LiquidAI/LFM2.5-VL-450M
118
  HF_MODEL_REVISION=main
119
- HF_ADAPTER_ID=your-public-adapter-repo
120
  HF_ADAPTER_REVISION=main
121
  HF_LOCAL_FILES_ONLY=false
122
  ```
 
26
  - Strict live judge mode.
27
  - DPhi SimSat imagery integration and provenance.
28
  - Hugging Face Transformers inference path.
29
+ - PEFT adapter loading with `HF_ADAPTER_ID=akashreddy2103/landfill`.
30
  - Modal training scaffold and checkpoint record.
31
  - Benchmark/evaluation artifacts for a small domain-adaptation fixture proxy.
32
 
33
+ ## Credentials Needed At Runtime
34
 
35
+ For the final judged run, provide:
36
 
37
+ - `HF_ADAPTER_ID=akashreddy2103/landfill`
38
  - `HF_TOKEN`: a token that can read the base model and adapter during judging.
39
  - `MAPBOX_TOKEN`: needed by SimSat Mapbox imagery.
40
+ - The public Hugging Face model card already includes the dataset, methodology, benchmark, proof artifacts, and training code package.
 
 
 
 
 
 
 
 
41
 
42
  ## Local Judge Mode
43
 
 
108
  HF_TOKEN=...
109
  HF_MODEL_ID=LiquidAI/LFM2.5-VL-450M
110
  HF_MODEL_REVISION=main
111
+ HF_ADAPTER_ID=akashreddy2103/landfill
112
  HF_ADAPTER_REVISION=main
113
  HF_LOCAL_FILES_ONLY=false
114
  ```
phase7_baseline_comparison.md ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ | Model | JSON Valid | Incident F1 | Zone Accuracy | BBox IoU | Human Usefulness | Null FP Rate |
2
+ |---|---:|---:|---:|---:|---:|---:|
3
+ | heuristic | 1.00 | 1.00 | 1.00 | 1.00 | 0.97 | 0.00 |
4
+ | base_model | 1.00 | 0.50 | 0.33 | 0.20 | 0.73 | 1.00 |
5
+ | fine_tuned_model | 1.00 | 1.00 | 1.00 | 1.00 | 0.97 | 0.00 |
project_README.md ADDED
@@ -0,0 +1,268 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # LandfillSentry Ops
2
+
3
+ Operator-first landfill methane incident triage copilot.
4
+
5
+ This repository now includes Phase 1 to Phase 7 implementation artifacts:
6
+
7
+ - frozen workflow and incident lifecycle
8
+ - frozen schema and enum contracts
9
+ - first-draft `openapi.json`
10
+ - demo-site selection rubric and template
11
+ - testing policy, fixture matrix, and integration checklist
12
+ - SQLite-backed site registry
13
+ - DPhi SimSat + Mapbox imagery adapters (live-first, strict mode supported)
14
+ - persistent cache-backed image retrieval paths
15
+ - DPhi SimSat API integration path (`/data/current/image/sentinel`, `/data/image/sentinel`, `/data/current/image/mapbox`)
16
+ - Phase 3 candidate generation with zone priors and temporal recurrence
17
+ - Phase 4 evidence panel builder, prompt contract metadata, and schema-validation loop scaffolding
18
+ - Phase 5 base model inference path with Hugging Face model loading and incident persistence/review integration
19
+ - Phase 6 dataset manifest freeze, annotation guidance, and Modal GPU PEFT LoRA fine-tuning artifacts
20
+ - Phase 7 evaluation harness, baseline comparison table, null-scene report, and reliability injection checks
21
+ - Phase 8 watchlist UI, site evidence drill-down, review controls, and incident export flow
22
+
23
+ ## Quick Layout
24
+
25
+ - `docs/` planning contracts and governance docs
26
+ - `apps/api/` backend API scaffold and typed schemas
27
+ - `apps/web/` frontend placeholder structure
28
+ - `ml/` ML pipeline placeholders
29
+ - `data/` data, cache, labels, and manifests structure
30
+ - `tests/` schema and contract checks with fixture placeholders
31
+ - `assets/demo_sites/` demo-site rubric templates
32
+
33
+ ## Current Status
34
+
35
+ - Phase 1 outputs are frozen as implementation baselines.
36
+ - Phase 2 foundation is implemented with registry, retrieval adapters, and cache flow.
37
+ - Phase 3 candidate generation and persistence are implemented.
38
+ - Phase 4 deterministic panel and contract-validation layer are implemented.
39
+ - Phase 5 base-model inference and incident lifecycle path are implemented.
40
+ - Phase 6 dataset build and Modal PEFT LoRA adapter training flow are implemented.
41
+ - Phase 7 evaluation and reliability hardening artifacts are implemented.
42
+ - Phase 8 watchlist/review/export operator UI and API workflows are implemented.
43
+ - Phase 8+ frontend is a production-style FastAPI-served ops console at `/ops`.
44
+
45
+ ## Ops Console (Phase 8)
46
+
47
+ - Open the operator console at `GET /ops`
48
+ - Frontend source:
49
+ - `apps/web/ops.html`
50
+ - `apps/web/ops.css`
51
+ - `apps/web/ops.js`
52
+ - The UI is served directly by FastAPI; no separate frontend build step is required for judging.
53
+ - Core API routes:
54
+ - `GET /watchlist`
55
+ - `GET /sites/{site_id}/detail`
56
+ - `GET /runtime/status`
57
+ - `GET /ops/summary`
58
+ - `GET /overlays/plumes`
59
+ - `GET /scan-progress/{progress_id}`
60
+ - `POST /sites/{site_id}/dongle-readings`
61
+ - `GET /sites/{site_id}/dongle-readings`
62
+ - `POST /incidents/{incident_id}/review`
63
+ - `GET /incidents/{incident_id}/export?format=markdown|json`
64
+
65
+ ## Judge Quick Start (Strict Live)
66
+
67
+ Use this path for judging/demo runs where fallback should never be presented as live output.
68
+
69
+ Judge-facing brief: `docs/judge_submission_brief.md`
70
+ Deployment runbook: `docs/judge_deployment_runbook.md`
71
+ Fine-tuning methodology: `docs/fine_tuning_methodology.md`
72
+
73
+ 1. Configure `.env.local` with real keys/tokens:
74
+ - `SIMSAT_MODE=live`
75
+ - `MAPBOX_MODE=live`
76
+ - `INFERENCE_MODE=live`
77
+ - `REQUIRE_LIVE_RESULTS=true`
78
+ - `INFERENCE_ALLOW_FALLBACK=false`
79
+ - `SIMSAT_BASE_URL=http://localhost:9005` (or hosted SimSat)
80
+ - `MAPBOX_TOKEN=...`
81
+ - `HF_TOKEN=...`
82
+ 2. Start everything + run smoke checks:
83
+ ```powershell
84
+ powershell -ExecutionPolicy Bypass -File scripts/start_judge_mode.ps1
85
+ ```
86
+ This command uses the project `.venv` when available, writes service logs under `data/logs/`, and saves smoke proof to:
87
+ - `docs/latest_live_smoke_proof.md`
88
+ - `data/processed/live_smoke_proof.json`
89
+ 3. Open UI:
90
+ - `http://127.0.0.1:8000/ops`
91
+ 4. Validate live behavior:
92
+ - `generation mode` must show `live`
93
+ - `Live Imagery Provenance` panel must show DPhi SimSat Sentinel/Mapbox provenance
94
+ - scans should fail fast with actionable errors if live dependencies are down
95
+
96
+ Smoke test script can also be run directly:
97
+
98
+ ```bash
99
+ python scripts/live_smoke.py --api-base-url http://127.0.0.1:8000 --simsat-base-url http://127.0.0.1:9005
100
+ ```
101
+
102
+ Archive the latest successful live scan:
103
+
104
+ ```bash
105
+ python scripts/save_live_scan_artifact.py --api-base-url http://127.0.0.1:8000 --scan-id scan_083
106
+ ```
107
+
108
+ Preflight the repository before handoff:
109
+
110
+ ```bash
111
+ python scripts/export_openapi.py
112
+ python scripts/judge_preflight.py
113
+ ```
114
+
115
+ Require a public adapter ID for final fine-tuned-weights claims:
116
+
117
+ ```bash
118
+ python scripts/judge_preflight.py --strict-public-weights
119
+ ```
120
+
121
+ ## Docker Judge Deployment
122
+
123
+ Run the API/UI and SimSat API together:
124
+
125
+ ```powershell
126
+ docker compose --env-file .env.local -f docker-compose.landfillsentry.yml up --build
127
+ ```
128
+
129
+ Open:
130
+
131
+ - LandfillSentry: `http://127.0.0.1:8000/ops`
132
+ - SimSat API: `http://127.0.0.1:9005`
133
+
134
+ ## SimSat Backend Setup
135
+
136
+ LandfillSentry uses the hackathon-provided DPhi SimSat API contract as the official live imagery backend:
137
+
138
+ - Repository: `https://github.com/DPhi-Space/SimSat`
139
+ - Expected local API: `http://localhost:9005`
140
+
141
+ 1. Start SimSat locally from `DPhi-Space/SimSat`:
142
+ - `cd external/SimSat`
143
+ - `docker compose up --build`
144
+ 2. Ensure SimSat API is reachable at `http://localhost:9005`.
145
+ 3. Set required env values in this project:
146
+ - `SIMSAT_MODE=live`
147
+ - `MAPBOX_MODE=live`
148
+ - `SIMSAT_BASE_URL=http://localhost:9005`
149
+ - `SIMSAT_USE_FOR_MAPBOX=true`
150
+ 4. In the SimSat project environment, set `MAPBOX_ACCESS_TOKEN` before startup so SimSat can serve Mapbox imagery.
151
+
152
+ If `SIMSAT_USE_FOR_MAPBOX=false`, this project falls back to direct Mapbox static API calls using `MAPBOX_TOKEN`.
153
+
154
+ ### Endpoint Usage (Implemented)
155
+
156
+ - Sentinel historical data: `GET /data/image/sentinel`
157
+ - Sentinel current site-coordinate data: `GET /data/image/sentinel`
158
+ - Mapbox site-coordinate context data: `GET /data/image/mapbox`
159
+ - Runtime provenance: `GET /runtime/status` includes the DPhi SimSat repository and required endpoints.
160
+
161
+ ## LFM2.5-VL Usage (Configured)
162
+
163
+ This project now includes a runnable script based on the official `LiquidAI/LFM2.5-VL-450M` examples:
164
+
165
+ - image question answering
166
+ - visual grounding (bbox JSON output)
167
+ - tool-use style response generation
168
+
169
+ Judge-mode inference tooling:
170
+ - inference engine: Hugging Face Transformers
171
+ - adapter loader: PEFT
172
+ - base model: `LiquidAI/LFM2.5-VL-450M`
173
+ - public adapter: `akashreddy2103/landfill`
174
+
175
+ Run:
176
+
177
+ ```bash
178
+ python scripts/run_lfm25_examples.py
179
+ ```
180
+
181
+ Notes:
182
+
183
+ - Set `HF_TOKEN` / `HUGGINGFACE_TOKEN` in `.env.local`.
184
+ - `INFERENCE_MODE=live` is the default runtime path.
185
+ - Use `INFERENCE_MODE=mock` only for offline/local test runs.
186
+ - `INFERENCE_ALLOW_FALLBACK=false` is recommended so failed live inference does not silently produce fallback-style incidents.
187
+ - `HF_LOCAL_FILES_ONLY=false` is recommended on a clean judge machine so the model can download; use `true` only when the model is already cached.
188
+ - The example script forces live model usage internally for demonstration.
189
+
190
+ ## Modal GPU Setup (Configured)
191
+
192
+ The project is now wired for Modal GPU orchestration for Phase 6 LoRA runs.
193
+
194
+ 1. Install dependencies:
195
+ ```bash
196
+ python -m pip install -r requirements.txt
197
+ ```
198
+ 2. Create Modal token:
199
+ ```bash
200
+ modal token new
201
+ ```
202
+ 3. Put credentials in `.env.local`:
203
+ ```env
204
+ MODAL_TOKEN_ID=...
205
+ MODAL_TOKEN_SECRET=...
206
+ MODAL_GPU=T4
207
+ MODAL_APP_NAME=landfillsentry-lora-train
208
+ MODAL_ARTIFACT_VOLUME=landfillsentry-model-artifacts
209
+ HF_ADAPTER_ID=
210
+ HF_ADAPTER_REVISION=main
211
+ ```
212
+ 4. Run GPU check + LoRA train job:
213
+ ```bash
214
+ python scripts/train_lora.py
215
+ ```
216
+
217
+ Underlying Modal app:
218
+ - `ml/training/modal_lora_train.py`
219
+ - `scripts/modal_gpu_check.py`
220
+ - `ml/training/lora_artifacts.py`
221
+
222
+ Latest public adapter:
223
+
224
+ - Hugging Face repo: `akashreddy2103/landfill`
225
+ - Run id: `lora_run_20260504T181913Z`
226
+ - Training mode: `peft_lora_supervised`
227
+ - Completed optimizer steps: `24`
228
+ - Validation loss: `2.410613179206848` -> `1.3696070164442062`
229
+
230
+ Phase 6 dataset freeze inputs/outputs (live-first):
231
+
232
+ - Preferred labels source (auto-generated from real scans): `data/labels/phase6_samples_live_v1.jsonl`
233
+ - Seed fallback labels source (used only when no live scans exist): `data/labels/phase6_samples_v1.jsonl`
234
+ - Frozen manifest: `data/manifests/dataset_manifest_v1.json`
235
+ - Frozen splits: `data/manifests/dataset_splits_v1.json`
236
+ - Checkpoint record: `data/manifests/tuned_checkpoint_v1.json`
237
+
238
+ Generate dataset artifacts only:
239
+
240
+ ```bash
241
+ python scripts/build_phase6_dataset.py
242
+ ```
243
+
244
+ Global dataset expansion:
245
+
246
+ ```bash
247
+ python scripts/collect_global_live_scans.py --probe-only
248
+ python scripts/collect_global_live_scans.py --target-samples 180 --repeats-per-site 8
249
+ python scripts/export_label_review_queue.py
250
+ python scripts/build_phase6_dataset.py
251
+ python scripts/train_lora.py
252
+ ```
253
+
254
+ Current expanded dataset summary:
255
+ - `docs/global_live_dataset_summary.md`
256
+ - `assets/demo_sites/global_sites.26rows.csv`
257
+ - `docs/global_live_api_probe_report.md`
258
+ - `docs/global_live_scan_collection_report.md`
259
+
260
+ Current implementation behavior:
261
+
262
+ - Phase 2/3 scan flow uses current Sentinel + current Mapbox for inference context.
263
+ - The same scan flow also fetches Sentinel historical data to support temporal features and fine-tuning data collection.
264
+
265
+ Dataset roles (as provided by SimSat docs):
266
+
267
+ - Sentinel-2: high temporal revisit, multispectral, medium spatial resolution.
268
+ - Mapbox: high spatial resolution RGB context, static imagery (not time-dependent).
project_docs/LandfillSentry_Ops_Answers_to_Open_Questions.md ADDED
@@ -0,0 +1,748 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # LandfillSentry Ops: Decision Log and Answers to Open Questions
2
+
3
+ Version: 1.0
4
+ Purpose: This document answers the full question list for LandfillSentry Ops and freezes the recommended operating assumptions for the hackathon build. It is intended to act as the single decision file that aligns product, engineering, data, evaluation, and delivery.
5
+
6
+ ---
7
+
8
+ ## How to read this document
9
+
10
+ These answers are written as **recommended defaults**, not abstract options.
11
+ The goal is to remove ambiguity so the team can start building immediately.
12
+
13
+ Where relevant, each answer includes:
14
+
15
+ - **Decision**: the recommended choice
16
+ - **Why**: short justification
17
+ - **Implementation effect**: what changes in the build plan because of this choice
18
+
19
+ ---
20
+
21
+ # 1. Scope and Outcome
22
+
23
+ ### 1. Is the primary goal to win the hackathon, build a real MVP, or create a startup-grade product plan?
24
+ **Decision:** The primary goal is to **win the hackathon with a real MVP**, while laying a credible foundation for a startup-grade product later.
25
+
26
+ **Why:** A hackathon winner needs a working product, not only slides. At the same time, the idea should feel commercially serious enough that judges believe it can grow beyond the event.
27
+
28
+ **Implementation effect:**
29
+ - Prioritize a working end to end system over feature breadth
30
+ - Keep architecture production-aware, but do not overbuild enterprise features
31
+ - Include a short post-hackathon roadmap, but do not let it dominate MVP scope
32
+
33
+ ---
34
+
35
+ ### 2. Should the final plan optimize for hackathon execution over the next 7 to 14 days, or for a 2 to 3 month build after the hackathon?
36
+ **Decision:** Optimize primarily for **7 to 14 day execution**, with a compact 2 to 3 month extension path.
37
+
38
+ **Why:** The fastest way to lose is to design a beautiful plan that cannot be implemented in time.
39
+
40
+ **Implementation effect:**
41
+ - Choose tools with low integration friction
42
+ - Prefer simple pipelines, cached assets, and deterministic demos
43
+ - Defer advanced quantification, multi-tenant systems, and deep workflow automation
44
+
45
+ ---
46
+
47
+ ### 3. Is the product definitely operator-first, or do you want municipality and compliance users treated as equal priority?
48
+ **Decision:** The product is **definitely operator-first**.
49
+
50
+ **Why:** Operators have the clearest action after an alert: inspect and mitigate. Municipality and compliance users are important, but they are better treated as secondary audiences for the first version.
51
+
52
+ **Implementation effect:**
53
+ - UI language should focus on inspection priority and site action
54
+ - Incident object should emphasize source zone and follow-up recommendations
55
+ - Compliance export remains future work, not the main workflow
56
+
57
+ ---
58
+
59
+ ### 4. Do you want the master plan to stay hackathon-scoped, or include a serious post-hackathon roadmap too?
60
+ **Decision:** Include both, but with clear separation: **hackathon MVP first, post-hackathon roadmap second**.
61
+
62
+ **Why:** Judges like believable growth, but they score what exists now.
63
+
64
+ **Implementation effect:**
65
+ - Main body focuses on MVP
66
+ - Final section includes phase 2 and phase 3 roadmap
67
+ - No roadmap item should be required to validate MVP success
68
+
69
+ ---
70
+
71
+ ### 5. Should the plan sound like a product strategy document, an engineering build plan, or both equally?
72
+ **Decision:** **Both equally**, with engineering slightly dominant.
73
+
74
+ **Why:** The team needs something buildable, but the demo and judging also require a crisp product story.
75
+
76
+ **Implementation effect:**
77
+ - Include product framing, user workflow, pricing logic, and competitors
78
+ - Include APIs, schemas, architecture, tests, milestones, and evaluation
79
+
80
+ ---
81
+
82
+ ### 6. What is the single most important thing judges and users should remember about LandfillSentry?
83
+ **Decision:**
84
+ **LandfillSentry turns satellite imagery into an explainable methane incident object that tells operators where to inspect first.**
85
+
86
+ **Why:** This is clearer and stronger than saying “we detect methane” or “we built a dashboard.”
87
+
88
+ **Implementation effect:**
89
+ - Every demo screen and API output should reinforce this sentence
90
+ - Avoid generic Earth observation storytelling
91
+
92
+ ---
93
+
94
+ # 2. User and Workflow
95
+
96
+ ### 7. Who exactly is the primary user in your head?
97
+ **Decision:** The primary user is a **landfill operations manager** or site operations lead.
98
+
99
+ **Why:** This role has direct responsibility, understands site zones, and can act quickly.
100
+
101
+ **Implementation effect:**
102
+ - Design screens for operational triage, not policy reporting
103
+ - Use plain operational wording rather than policy-heavy terminology
104
+
105
+ ---
106
+
107
+ ### 8. What is the intended user action after an alert?
108
+ **Decision:** The intended action is: **inspect a zone on site**, then optionally log or escalate if needed.
109
+
110
+ **Why:** “Inspect the site” is too broad. “Inspect a zone” is actionable.
111
+
112
+ **Implementation effect:**
113
+ - The incident object must include a likely source zone and priority tier
114
+ - Recommendations should be site-action oriented
115
+
116
+ ---
117
+
118
+ ### 9. Do you want the product to prioritize single-site deep analysis or multi-site watchlist triage as the first-class workflow?
119
+ **Decision:** **Multi-site watchlist triage** should be the first-class workflow, with drill-down into single-site analysis.
120
+
121
+ **Why:** It feels more like a real product and is stronger in demo form. It also matches how operators or municipalities would prioritize scarce field effort.
122
+
123
+ **Implementation effect:**
124
+ - Home view should be a watchlist of monitored sites
125
+ - Clicking a site opens the incident timeline and evidence details
126
+
127
+ ---
128
+
129
+ ### 10. Should the incident object include only recommendation text, or also a structured priority and severity tier?
130
+ **Decision:** Include **structured priority and severity tiers** in addition to recommendation text.
131
+
132
+ **Why:** Structured outputs are easier for downstream systems and better for judge evaluation.
133
+
134
+ **Implementation effect:**
135
+ - Add fields such as `priority_tier`, `severity_tier`, and `recommended_followup`
136
+ - Use controlled enums rather than free text only
137
+
138
+ ---
139
+
140
+ ### 11. Do you want operator feedback in v1, such as confirmed, dismissed, or needs review?
141
+ **Decision:** **Yes**, but keep it minimal.
142
+
143
+ **Why:** Feedback closes the loop, enables future learning, and makes the product feel more real.
144
+
145
+ **Implementation effect:**
146
+ - Add a simple status field: `confirmed`, `dismissed`, `needs_review`
147
+ - Store feedback in the incident table
148
+ - Do not build active learning automation yet
149
+
150
+ ---
151
+
152
+ ### 12. Should there be a human review step before any incident becomes official in the UI?
153
+ **Decision:** **Yes**, at least in v1.
154
+
155
+ **Why:** This is the safest and most defensible framing. The system is a triage copilot, not final truth.
156
+
157
+ **Implementation effect:**
158
+ - Incidents first appear as `proposed`
159
+ - Human action promotes them to `published` or `dismissed`
160
+
161
+ ---
162
+
163
+ # 3. Geography and Demo Sites
164
+
165
+ ### 13. Are you already committed to a specific country or region for demo sites?
166
+ **Decision:** No hard commitment. Use a **globally framed product** with a small curated demo set from regions where imagery and site context look clean.
167
+
168
+ **Why:** This avoids unnecessary geographic narrowing and lets you pick visually strong examples.
169
+
170
+ **Implementation effect:**
171
+ - Product copy remains global
172
+ - Demo dataset can include 3 to 5 sites from different regions if useful
173
+
174
+ ---
175
+
176
+ ### 14. Do you already have 3 to 5 demo landfill coordinates or polygons selected?
177
+ **Decision:** Not yet, but you **should select them early and freeze them**.
178
+
179
+ **Why:** Demo stability depends on fixed sites.
180
+
181
+ **Implementation effect:**
182
+ - Define a frozen demo site list in the first implementation phase
183
+ - Cache assets and panels for those sites
184
+
185
+ ---
186
+
187
+ ### 15. Are your demo sites meant to be real known landfill sites, or semi-fictionalized demo locations?
188
+ **Decision:** Use **real known landfill sites**, but present them carefully as demonstrative case study sites.
189
+
190
+ **Why:** Real sites increase credibility and make the demo feel grounded.
191
+
192
+ **Implementation effect:**
193
+ - Use publicly observable sites
194
+ - Avoid making legal claims about actual emissions without proper qualification
195
+
196
+ ---
197
+
198
+ ### 16. Do you want the plan to assume site polygons are available, or only point coordinates?
199
+ **Decision:** Assume **point coordinates are always available** and **polygons are optional enhancements**.
200
+
201
+ **Why:** Coordinates are easier to obtain consistently. Polygons improve zoning, but should not block the MVP.
202
+
203
+ **Implementation effect:**
204
+ - MVP works with center point plus fixed buffer
205
+ - Polygon-aware workflows can be layered later
206
+
207
+ ---
208
+
209
+ ### 17. Should we include a path for facility-zone priors such as active face, gas infrastructure, cover system, perimeter from day one?
210
+ **Decision:** **Yes, include the path from day one**, but only implement the simplest version in MVP.
211
+
212
+ **Why:** Source-zone reasoning is one of the most differentiated parts of the idea.
213
+
214
+ **Implementation effect:**
215
+ - Start with coarse zone categories: `active_face`, `gas_system`, `perimeter_or_unknown`
216
+ - Expand the taxonomy later
217
+
218
+ ---
219
+
220
+ ### 18. Do you want India-specific examples in the final plan, or keep it globally framed?
221
+ **Decision:** Keep the product **globally framed**, with optional India-specific examples in a note or appendix if desired.
222
+
223
+ **Why:** Global framing is stronger for the hackathon.
224
+
225
+ **Implementation effect:**
226
+ - Do not anchor the entire pitch to India
227
+ - Use India only if a selected demo site is visually strong or strategically relevant
228
+
229
+ ---
230
+
231
+ # 4. Data and Labeling
232
+
233
+ ### 19. How many labeled examples do you realistically think you can create before the deadline?
234
+ **Decision:** Plan for **80 to 200 usable labeled examples** total, depending on bandwidth.
235
+
236
+ **Why:** This is realistic for a hackathon-scale manual effort when combined with synthetic and weak labels.
237
+
238
+ **Implementation effect:**
239
+ - Do not assume thousands of hand labels
240
+ - Lean on candidate generation, synthetic overlays, and curated negatives
241
+
242
+ ---
243
+
244
+ ### 20. Will labels be created by you alone, or is there a team?
245
+ **Decision:** Assume **you are the primary labeler**, with optional support if teammates help.
246
+
247
+ **Why:** Planning around a team that may not deliver creates risk.
248
+
249
+ **Implementation effect:**
250
+ - Annotation guidelines must be simple and fast
251
+ - Labeling workflow should be optimized for one primary operator
252
+
253
+ ---
254
+
255
+ ### 21. Do you want synthetic plume data to be a major part of the training set, or just a bootstrap layer?
256
+ **Decision:** Synthetic plume data should be a **major bootstrap component**, but not the only component.
257
+
258
+ **Why:** Synthetic examples help coverage, especially early, but real examples and hard negatives are necessary for credibility.
259
+
260
+ **Implementation effect:**
261
+ - Treat synthetic as a training accelerator
262
+ - Keep validation and demo splits as real as possible
263
+
264
+ ---
265
+
266
+ ### 22. Do you want weak labels and manual labels tracked separately in the plan?
267
+ **Decision:** **Yes, absolutely.**
268
+
269
+ **Why:** Provenance matters for debugging and evaluation.
270
+
271
+ **Implementation effect:**
272
+ - Every sample should have a `label_source` field
273
+ - Allowed values: `manual`, `weak`, `synthetic`, `mixed`
274
+
275
+ ---
276
+
277
+ ### 23. Should negative examples be explicitly budgeted and tracked as a first-class dataset requirement?
278
+ **Decision:** **Yes.**
279
+
280
+ **Why:** Null scenes, false positives, and visually confusing negatives are crucial for this product.
281
+
282
+ **Implementation effect:**
283
+ - Maintain a negative-example target in the dataset plan
284
+ - Include clouds, smoke-like patterns, bright surfaces, and visually complex landfill scenes
285
+
286
+ ---
287
+
288
+ ### 24. Do you want a frozen validation split and a frozen demo split defined early?
289
+ **Decision:** **Yes.**
290
+
291
+ **Why:** Without frozen splits, the evaluation story becomes weak and the demo becomes unstable.
292
+
293
+ **Implementation effect:**
294
+ - Define train, validation, and demo manifests early
295
+ - Never fine-tune on the demo split
296
+
297
+ ---
298
+
299
+ ### 25. Should the plan include dataset versioning with manifests and provenance per sample?
300
+ **Decision:** **Yes.**
301
+
302
+ **Why:** This is worth the small setup cost.
303
+
304
+ **Implementation effect:**
305
+ - Store manifest JSON or CSV files
306
+ - Track site id, date, imagery source, label source, panel generator version, and split
307
+
308
+ ---
309
+
310
+ ### 26. Do you want annotation guidance written into the plan, including what counts as plume_likely and how bbox labels are set?
311
+ **Decision:** **Yes.**
312
+
313
+ **Why:** Consistency matters even with a small dataset.
314
+
315
+ **Implementation effect:**
316
+ - Write a short annotation handbook
317
+ - Include edge cases, confidence rules, and box placement guidance
318
+
319
+ ---
320
+
321
+ # 5. Technical Choices
322
+
323
+ ### 27. Is SimSat the only imagery path we should assume for MVP, or may the plan include fallback retrieval options?
324
+ **Decision:** **SimSat is the primary imagery path for MVP**, but the plan may mention fallback retrieval options as future or contingency paths.
325
+
326
+ **Why:** The hackathon explicitly centers SimSat and DPhi imagery.
327
+
328
+ **Implementation effect:**
329
+ - All required MVP flows should work with SimSat only
330
+ - Fallbacks should not be dependency blockers
331
+
332
+ ---
333
+
334
+ ### 28. Is Mapbox context mandatory for MVP, or optional if token and setup become painful?
335
+ **Decision:** Mapbox context is **strongly recommended but not mandatory**.
336
+
337
+ **Why:** It improves site grounding and demo quality, but the product should still run without it.
338
+
339
+ **Implementation effect:**
340
+ - The pipeline must gracefully degrade if Mapbox is unavailable
341
+ - Missing Mapbox becomes a tested failure mode, not a blocker
342
+
343
+ ---
344
+
345
+ ### 29. Do you want Project Eucalyptus integrated into MVP, or treated as a recommended enhancement or benchmark path?
346
+ **Decision:** Treat Project Eucalyptus as a **recommended benchmark and bootstrap path**, with selective integration where practical.
347
+
348
+ **Why:** It is valuable, but should not become an integration trap.
349
+
350
+ **Implementation effect:**
351
+ - Reuse ideas, training assets, or post-processing patterns
352
+ - Do not make MVP success depend on deep codebase coupling
353
+
354
+ ---
355
+
356
+ ### 30. Should candidate generation start heuristic-first, model-assisted-first, or hybrid from day one?
357
+ **Decision:** Use a **hybrid** approach from day one, but keep the heuristic layer simple and dependable.
358
+
359
+ **Why:** Pure heuristics may be brittle; pure model-first may be unstable. Hybrid is safer.
360
+
361
+ **Implementation effect:**
362
+ - Start with spectral or temporal anomaly heuristics
363
+ - Allow optional candidate ranking or refinement from learned components
364
+
365
+ ---
366
+
367
+ ### 31. Do you want FastAPI locked in as backend, or still open?
368
+ **Decision:** **Lock in FastAPI.**
369
+
370
+ **Why:** It is fast to build, easy to document, and good for typed JSON APIs.
371
+
372
+ **Implementation effect:**
373
+ - Define API contracts early
374
+ - Use FastAPI for both local and deployable backend modes
375
+
376
+ ---
377
+
378
+ ### 32. Do you want React for the web app, or would Streamlit be acceptable for the first shipping version?
379
+ **Decision:** **React for the primary web app**. Streamlit is acceptable only as an internal prototyping aid.
380
+
381
+ **Why:** Judges reward polished demos, and React gives better control.
382
+
383
+ **Implementation effect:**
384
+ - Build a lightweight React app with a few strong screens
385
+ - Keep Streamlit optional for internal analysis only
386
+
387
+ ---
388
+
389
+ ### 33. For storage, do you want SQLite first, or Postgres from the beginning?
390
+ **Decision:** Start with **SQLite**.
391
+
392
+ **Why:** It is enough for MVP and simpler to ship.
393
+
394
+ **Implementation effect:**
395
+ - Use SQLModel or SQLAlchemy with migration-ready schema design
396
+ - Keep schema compatible with later Postgres migration
397
+
398
+ ---
399
+
400
+ ### 34. Should inference be synchronous for MVP, or do you want background jobs and polling or websocket flow designed from the start?
401
+ **Decision:** Use **synchronous inference for MVP**, with small cached workflows. Background jobs can be a future upgrade.
402
+
403
+ **Why:** Synchronous flow is easier to reason about and demo.
404
+
405
+ **Implementation effect:**
406
+ - API calls can block briefly during scan generation
407
+ - Heavy jobs should be precomputed or cached
408
+
409
+ ---
410
+
411
+ ### 35. Do you want Transformers to be the only supported inference path in the first plan, or should we spec a fallback like ONNX or GGUF too?
412
+ **Decision:** Use **Transformers as the main path**, but mention ONNX and GGUF as deployment fallbacks.
413
+
414
+ **Why:** The first implementation needs one canonical path. Fallbacks are useful for later optimization and edge deployment narratives.
415
+
416
+ **Implementation effect:**
417
+ - Build and test on one primary inference stack
418
+ - Keep deployment abstraction thin so fallback export remains possible
419
+
420
+ ---
421
+
422
+ # 6. Model and Evaluation
423
+
424
+ ### 36. Is fine-tuning mandatory for success, or is prompt-only plus structured output acceptable as fallback?
425
+ **Decision:** Fine-tuning is **strongly preferred and should be treated as a major goal**, but prompt-only structured output is an acceptable fallback.
426
+
427
+ **Why:** The hackathon explicitly rewards domain fine-tuning. Still, a backup path is smart.
428
+
429
+ **Implementation effect:**
430
+ - Build the system so base-model prompting works first
431
+ - Add LoRA fine-tuning as the quality upgrade path
432
+
433
+ ---
434
+
435
+ ### 37. Which matters more for you: bbox quality, JSON validity, source-zone accuracy, persistence score quality, or operator usefulness?
436
+ **Decision:** The ranking should be:
437
+ 1. **Operator usefulness**
438
+ 2. **JSON validity**
439
+ 3. **Source-zone accuracy**
440
+ 4. **BBox quality**
441
+ 5. **Persistence score quality**
442
+
443
+ **Why:** The product wins if the output is useful and reliable for action. A perfect score that nobody can act on is less valuable.
444
+
445
+ **Implementation effect:**
446
+ - Evaluation should not be over-optimized on one visual metric
447
+ - Human actionability scoring should be included
448
+
449
+ ---
450
+
451
+ ### 38. Do you want the plan to commit to numeric targets now, or keep some as provisional until we see real data?
452
+ **Decision:** Keep most targets **provisional**, with a few directional targets.
453
+
454
+ **Why:** Hard numeric claims made too early can backfire.
455
+
456
+ **Implementation effect:**
457
+ - Use target ranges instead of rigid commitments
458
+ - Example: JSON validity above 95 percent on validation set, null-scene false positive rate below a chosen threshold, but mark them as provisional
459
+
460
+ ---
461
+
462
+ ### 39. Should we evaluate on held-out sites, held-out dates, or both?
463
+ **Decision:** Evaluate on **both held-out sites and held-out dates**.
464
+
465
+ **Why:** Generalization matters across geography and time.
466
+
467
+ **Implementation effect:**
468
+ - Create separate evaluation views
469
+ - Report both temporal generalization and cross-site transfer
470
+
471
+ ---
472
+
473
+ ### 40. Do you want baseline comparison against base LFM2.5-VL-450M, candidate-only heuristics, and fine-tuned model all three?
474
+ **Decision:** **Yes, compare all three.**
475
+
476
+ **Why:** This creates a stronger scientific and product story.
477
+
478
+ **Implementation effect:**
479
+ - Baseline A: heuristic or candidate-only
480
+ - Baseline B: base LFM2.5-VL
481
+ - Final: fine-tuned LFM2.5-VL
482
+
483
+ ---
484
+
485
+ ### 41. Should the plan include human scoring of actionability and explainability?
486
+ **Decision:** **Yes.**
487
+
488
+ **Why:** These are central to the product and often missed by purely technical metrics.
489
+
490
+ **Implementation effect:**
491
+ - Add a small rubric for human review
492
+ - Score whether the incident object is understandable and useful for follow-up
493
+
494
+ ---
495
+
496
+ ### 42. Do you want calibration or confidence-threshold tuning explicitly included?
497
+ **Decision:** **Yes, lightly.**
498
+
499
+ **Why:** Thresholds matter for operational usefulness.
500
+
501
+ **Implementation effect:**
502
+ - Include simple threshold sweeps
503
+ - Do not overcomplicate with heavy calibration research in MVP
504
+
505
+ ---
506
+
507
+ ### 43. Should no anomaly or null-scene performance be a major metric?
508
+ **Decision:** **Yes, it should be a major metric.**
509
+
510
+ **Why:** False positives will destroy trust quickly.
511
+
512
+ **Implementation effect:**
513
+ - Track null-scene precision or false positive rate explicitly
514
+ - Build a robust negative set
515
+
516
+ ---
517
+
518
+ # 7. Testing and Integration
519
+
520
+ ### 44. Do you want a formal rule that no phase is marked done until it passes an integration checkpoint with previous phases?
521
+ **Decision:** **Yes.**
522
+
523
+ **Why:** Integration failures kill hackathon projects.
524
+
525
+ **Implementation effect:**
526
+ - Each phase closes only after a working end-to-end checkpoint
527
+
528
+ ---
529
+
530
+ ### 45. Should every phase end with one live path and one cached offline path?
531
+ **Decision:** **Yes.**
532
+
533
+ **Why:** Cached offline paths protect the demo and speed debugging.
534
+
535
+ **Implementation effect:**
536
+ - Every major flow should have reproducible cached artifacts
537
+ - Live and offline modes should both be supported
538
+
539
+ ---
540
+
541
+ ### 46. Do you want unit, integration, and end-to-end tests all explicitly planned in every phase?
542
+ **Decision:** **Yes**, but keep the scope pragmatic.
543
+
544
+ **Why:** This gives quality without going overboard.
545
+
546
+ **Implementation effect:**
547
+ - Unit tests for helpers and parsers
548
+ - Integration tests for API and inference contracts
549
+ - At least one end-to-end scan test
550
+
551
+ ---
552
+
553
+ ### 47. Should we define golden fixtures for at least one positive site, one negative site, one cloudy site, and one missing-data site?
554
+ **Decision:** **Yes.**
555
+
556
+ **Why:** These become the backbone of reliability testing.
557
+
558
+ **Implementation effect:**
559
+ - Freeze fixture data early
560
+ - Use them across backend and UI tests
561
+
562
+ ---
563
+
564
+ ### 48. Do you want frontend smoke tests in the plan, or keep frontend verification manual for MVP?
565
+ **Decision:** Include **basic frontend smoke tests**, but keep most UI verification manual.
566
+
567
+ **Why:** A few smoke tests are worth it, full automation is not necessary for MVP.
568
+
569
+ **Implementation effect:**
570
+ - Test critical render and API-wiring paths
571
+ - Validate most styling and interactions manually
572
+
573
+ ---
574
+
575
+ ### 49. Should we include API contract tests and a committed openapi.json as part of the plan?
576
+ **Decision:** **Yes.**
577
+
578
+ **Why:** Strong APIs are part of the product thesis.
579
+
580
+ **Implementation effect:**
581
+ - Generate and commit OpenAPI schema
582
+ - Write contract tests for main endpoints
583
+
584
+ ---
585
+
586
+ ### 50. Do you want failure-injection tests for invalid JSON, empty candidates, missing Mapbox, and slow inference?
587
+ **Decision:** **Yes.**
588
+
589
+ **Why:** These are highly likely failures in the real build.
590
+
591
+ **Implementation effect:**
592
+ - Add specific tests for each failure mode
593
+ - UI must degrade gracefully
594
+
595
+ ---
596
+
597
+ ### 51. Should we require one full end-to-end scan after every 2 phases before advancing?
598
+ **Decision:** **Yes.**
599
+
600
+ **Why:** This keeps momentum aligned around a real working system.
601
+
602
+ **Implementation effect:**
603
+ - Insert hard demo checkpoints throughout the build plan
604
+ - No long isolated implementation branches
605
+
606
+ ---
607
+
608
+ # 8. Delivery and Business Framing
609
+
610
+ ### 52. Do you want the plan to include pricing, GTM, and buyer wedge in detail, or keep it mostly technical?
611
+ **Decision:** Include **light but serious GTM and buyer wedge detail**, while keeping the document mostly technical.
612
+
613
+ **Why:** The hackathon entry should sound commercially credible, but not become a sales deck.
614
+
615
+ **Implementation effect:**
616
+ - Include buyer, pricing logic, and wedge narrative
617
+ - Keep most pages focused on implementation and product design
618
+
619
+ ---
620
+
621
+ ### 53. Should the final plan explicitly position LandfillSentry relative to WasteMAP, UNEP MARS, and Carbon Mapper, or only lightly reference them?
622
+ **Decision:** **Explicitly position it relative to them.**
623
+
624
+ **Why:** Judges and future users will care about differentiation.
625
+
626
+ **Implementation effect:**
627
+ - Add a concise competitor positioning section
628
+ - Explain that LandfillSentry is an operator-first triage copilot, not a global methane data platform
629
+
630
+ ---
631
+
632
+ ### 54. Do you want the final plan to include security, secrets, licensing, and model and data usage risks?
633
+ **Decision:** **Yes.**
634
+
635
+ **Why:** These are practical startup and deployment concerns and make the document stronger.
636
+
637
+ **Implementation effect:**
638
+ - Add a short security and risk section
639
+ - Cover API tokens, model licenses, data licensing, and disclosure risks
640
+
641
+ ---
642
+
643
+ ### 55. Should we include a roadmap for compliance evidence export and regulator-facing workflows, or leave that as future work?
644
+ **Decision:** Include it as **future work on the roadmap**, not as MVP.
645
+
646
+ **Why:** It is valuable, but not necessary to win the hackathon.
647
+
648
+ **Implementation effect:**
649
+ - Mention evidence export templates, audit trails, and regulator workflows in phase 2 or phase 3
650
+ - Do not let them expand MVP scope
651
+
652
+ ---
653
+
654
+ ### 56. Do you want the final document to remain single-file like AdaptOpt, with appended execution cards and change log?
655
+ **Decision:** **Yes.**
656
+
657
+ **Why:** A single-file master document is easier to manage during a fast build.
658
+
659
+ **Implementation effect:**
660
+ - Keep one canonical Markdown file
661
+ - Append execution cards, assumptions, change log, and milestone updates at the end
662
+
663
+ ---
664
+
665
+ # Recommended frozen defaults summary
666
+
667
+ This section compresses the decisions into one quick-reference view.
668
+
669
+ ## Product
670
+ - Goal: Win the hackathon with a real MVP
671
+ - Product type: Operator-first methane incident triage copilot
672
+ - Core memory line: Turn satellite imagery into an explainable incident object telling operators where to inspect first
673
+
674
+ ## User
675
+ - Primary user: Landfill operations manager
676
+ - Primary action: Inspect a likely source zone
677
+ - First-class workflow: Multi-site watchlist triage with single-site drill-down
678
+ - Human review: Required before incident is official
679
+ - Feedback loop: Minimal v1 support
680
+
681
+ ## Geography
682
+ - Global framing
683
+ - Freeze 3 to 5 demo sites early
684
+ - Use real sites with careful wording
685
+ - Coordinates required, polygons optional
686
+
687
+ ## Data
688
+ - 80 to 200 usable labeled examples target
689
+ - One primary labeler assumption
690
+ - Synthetic plumes: major bootstrap layer
691
+ - Weak and manual labels tracked separately
692
+ - Negative examples first-class
693
+ - Frozen validation and demo splits
694
+ - Dataset manifests and provenance required
695
+ - Annotation guidelines required
696
+
697
+ ## Tech
698
+ - SimSat-first
699
+ - Mapbox recommended but optional
700
+ - FastAPI backend
701
+ - React frontend
702
+ - SQLite for MVP
703
+ - Synchronous inference first
704
+ - Transformers primary inference path
705
+ - ONNX or GGUF mentioned as future fallback
706
+
707
+ ## Model
708
+ - Fine-tuning preferred, prompt-only fallback allowed
709
+ - Prioritize usefulness, valid JSON, and zone accuracy
710
+ - Numeric targets provisional
711
+ - Evaluate on held-out sites and dates
712
+ - Compare heuristics, base model, and fine-tuned model
713
+ - Include actionability and explainability review
714
+ - Include threshold tuning
715
+ - Track null-scene performance
716
+
717
+ ## Testing
718
+ - Integration gate per phase
719
+ - Live plus cached path per phase
720
+ - Unit, integration, and end-to-end tests
721
+ - Golden fixtures required
722
+ - Basic frontend smoke tests
723
+ - OpenAPI contract committed
724
+ - Failure injection required
725
+ - Full end-to-end scan after every 2 phases
726
+
727
+ ## Business and delivery
728
+ - Mostly technical document with light GTM
729
+ - Explicit competitor positioning
730
+ - Security, licensing, and secrets included
731
+ - Compliance export kept for roadmap
732
+ - Single-file canonical plan
733
+
734
+ ---
735
+
736
+ # Suggested next action
737
+
738
+ The next document should convert these frozen answers into a **master execution plan** with:
739
+ 1. phased milestones,
740
+ 2. repo structure,
741
+ 3. dataset schema,
742
+ 4. API definitions,
743
+ 5. evaluation table,
744
+ 6. demo script,
745
+ 7. execution cards,
746
+ 8. change log.
747
+
748
+ This document is now the source of truth for those choices.
project_docs/LandfillSentry_Ops_Detailed_Report.md ADDED
@@ -0,0 +1,2093 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ # LandfillSentry Ops
3
+ ## Detailed Product, Architecture, Data, API, and Execution Report
4
+ ### Version 1.0
5
+ ### Date: 19 April 2026
6
+
7
+ ---
8
+
9
+ ## Document Purpose
10
+
11
+ This document is a complete starter dossier for building **LandfillSentry Ops**, an operator-first landfill methane triage copilot for the Liquid AI x DPhi Space AI in Space Hackathon. It is written to be the single document a team can use to move from idea to implementation without needing a separate concept note, architecture memo, or initial build plan.
12
+
13
+ The report covers:
14
+
15
+ - problem framing and product thesis
16
+ - why this use case is a strong fit for the hackathon
17
+ - target users and buyer wedge
18
+ - detailed system architecture
19
+ - external APIs, datasets, and open-source frameworks
20
+ - internal API design
21
+ - model strategy and fine-tuning plan
22
+ - evaluation plan and success criteria
23
+ - deployment design
24
+ - security, risk, and failure modes
25
+ - implementation plan, sprint plan, and repository structure
26
+ - hackathon demo strategy
27
+ - roadmap beyond the hackathon
28
+
29
+ This document is intentionally detailed. It is optimized for execution, not just persuasion.
30
+
31
+ ---
32
+
33
+ ## Table of Contents
34
+
35
+ 1. Executive Summary
36
+ 2. Why This Idea Wins the Hackathon
37
+ 3. Problem Definition
38
+ 4. Product Vision
39
+ 5. Users, Stakeholders, and Initial Buyer
40
+ 6. Why Landfill Methane Instead of Other Domains
41
+ 7. Solution Overview
42
+ 8. System Requirements
43
+ 9. High-Level Architecture
44
+ 10. Data Sources and External Systems
45
+ 11. External APIs and Frameworks Required
46
+ 12. Internal Service Design
47
+ 13. Detailed Data Flow
48
+ 14. Detection and Candidate Generation Pipeline
49
+ 15. Vision-Language Model Layer
50
+ 16. Fine-Tuning Strategy
51
+ 17. Dataset Strategy
52
+ 18. Prompting and Output Schemas
53
+ 19. Evaluation Plan
54
+ 20. Product UX and Demo Flow
55
+ 21. Backend API Specification
56
+ 22. Data Models
57
+ 23. Deployment and Infrastructure
58
+ 24. GPU and Training Plan
59
+ 25. Implementation Roadmap
60
+ 26. Repository Structure
61
+ 27. Engineering Work Breakdown
62
+ 28. Risks and Mitigations
63
+ 29. Stretch Features
64
+ 30. Submission Strategy
65
+ 31. Final Build Recommendation
66
+ 32. References
67
+
68
+ ---
69
+
70
+ ## 1. Executive Summary
71
+
72
+ **LandfillSentry Ops** is an operator-first landfill methane triage copilot that turns multispectral satellite imagery into explainable incident alerts for landfill teams. The product scans landfill sites using **Sentinel-2** imagery retrieved through **SimSat**, uses temporal and spectral analysis to generate candidate methane-emission regions, grounds those candidates with **Mapbox** facility context imagery, and passes a compact evidence panel to a fine-tuned **Liquid AI LFM2.5-VL-450M** model. The model returns a structured incident object with:
73
+
74
+ - plume likely or not likely
75
+ - bounding box
76
+ - likely source zone
77
+ - persistence score
78
+ - evidence summary
79
+ - recommended inspection priority
80
+
81
+ The product is deliberately framed as a **triage and prioritization system**, not a final regulatory quantification engine. That framing is important both technically and strategically. It matches the strengths of the available sensor stack, aligns with what a small fine-tuned VLM can do well, and is more defensible within hackathon scope.
82
+
83
+ The core thesis is simple:
84
+
85
+ > Existing methane monitoring ecosystems increasingly detect and map methane events, but landfill operators still need a lightweight product that turns raw or semi-processed geospatial evidence into an actionable, facility-specific incident object.
86
+
87
+ That gap is where LandfillSentry Ops sits.
88
+
89
+ ### Why this is a strong hackathon idea
90
+
91
+ This idea matches the Liquid Track unusually well:
92
+
93
+ 1. **Use of satellite imagery is central, not decorative.**
94
+ The product depends on Sentinel-2 multispectral imagery for methane-sensitive analysis and on Mapbox imagery for facility context.
95
+
96
+ 2. **Liquid’s VLM is not bolted on.**
97
+ The VLM is used for grounded interpretation, structured incident generation, evidence summarization, and operator guidance. LFM2.5-VL’s bounding-box capability is especially valuable here.
98
+
99
+ 3. **There is a clean fine-tuning path.**
100
+ Liquid explicitly recommends fine-tuning LFM2.5-VL-450M for use-case-specific performance. Project Eucalyptus gives us a methane-domain bootstrapper with models, post-processing tooling, and synthetic plume generation.
101
+
102
+ 4. **The problem is real and commercially believable.**
103
+ Waste-sector methane is large, actionable, and under-addressed relative to oil and gas. Multiple public initiatives now show operator, policy, and mitigation demand.
104
+
105
+ 5. **The demo can be strong and clean.**
106
+ The system can be demonstrated end to end with a simple, memorable operator workflow.
107
+
108
+ ### One-line pitch
109
+
110
+ **LandfillSentry Ops turns Sentinel-2 and Mapbox imagery into explainable methane incident alerts that tell landfill operators where to inspect first.**
111
+
112
+ ---
113
+
114
+ ## 2. Why This Idea Wins the Hackathon
115
+
116
+ The hackathon rewards four things:
117
+
118
+ - use of DPhi satellite imagery
119
+ - innovation and problem-solution fit
120
+ - technical implementation that runs cleanly
121
+ - demo clarity
122
+
123
+ This product scores well across all four.
124
+
125
+ ### 2.1 Use of DPhi satellite imagery
126
+
127
+ SimSat provides current and historical access to Sentinel-2 and Mapbox imagery. Sentinel-2 is the main source for temporal and multispectral analysis, while Mapbox provides sharper RGB context for interpreting site structure and grounding operator actions. This is exactly the kind of combined imagery workflow the SimSat stack enables best.
128
+ Source: [SimSat GitHub README](https://github.com/DPhi-Space/SimSat)
129
+
130
+ ### 2.2 Innovation and problem-solution fit
131
+
132
+ A generic “satellite dashboard” is not enough. This product is more specific and therefore more compelling:
133
+
134
+ - it is focused on **landfills**, not all methane sources
135
+ - it is focused on **operations**, not generic environmental storytelling
136
+ - it returns a **developer-ready incident object**, not just a visualization
137
+ - it uses the VLM to produce **grounded interpretation**, not vague captioning
138
+
139
+ The combination of a methane-sensitive candidate-generation step plus a fine-tuned small VLM is also differentiated. The first stage handles spectral physics better than a generic VLM could. The second stage handles interpretation, ranking, and operator communication better than a pure CV system could.
140
+
141
+ ### 2.3 Technical implementation fit
142
+
143
+ This is executable within hackathon scope because the stack can be decomposed into practical stages:
144
+
145
+ - data ingestion via SimSat
146
+ - candidate generation using spectral composites and temporal differencing
147
+ - optional methane bootstrap via Project Eucalyptus
148
+ - evidence-panel construction
149
+ - structured inference via LFM2.5-VL-450M
150
+ - results served through a simple FastAPI backend
151
+ - demo UI built in React or Streamlit
152
+
153
+ Nothing in that chain requires inventing new science during the hackathon.
154
+
155
+ ### 2.4 Demo fit
156
+
157
+ Judges respond well to clear operational narratives. “Here is a suspected methane issue, here is the part of the landfill to inspect, and here is why the system believes that” is much easier to communicate than a generic Earth observation product.
158
+
159
+ ---
160
+
161
+ ## 3. Problem Definition
162
+
163
+ Landfills are major methane sources. Methane is a short-lived but highly potent greenhouse gas, and waste-sector methane is a significant share of anthropogenic methane emissions. Public reporting and mitigation efforts are improving, but current inventories and routine monitoring approaches remain incomplete, inconsistent, or delayed in many regions.
164
+ Sources:
165
+ - [METER preprint](https://essd.copernicus.org/preprints/essd-2026-124/essd-2026-124.pdf)
166
+ - [ESA Landfill Methane Monitor](https://business.esa.int/projects/landfill-methane-monitor-lmm)
167
+ - [CATF waste methane trends 2026](https://www.catf.us/2026/03/three-trends-shaping-waste-sector-methane-mitigation-2026/)
168
+
169
+ ### 3.1 The operator’s actual problem
170
+
171
+ A landfill operator does not merely want to know that methane exists at the site. They want to know:
172
+
173
+ - whether there is a likely event worth investigating
174
+ - which zone of the facility is most likely involved
175
+ - whether this looks persistent or transient
176
+ - how urgent the issue is relative to other sites or zones
177
+ - what evidence supports the alert
178
+
179
+ Many current tools in the ecosystem focus on mapping emissions, generating public data portals, or enabling scientific and policy analysis. Those are valuable, but operators often still need something simpler and more direct: a triage system that compresses geospatial evidence into a usable action object.
180
+
181
+ ### 3.2 Why this gap matters
182
+
183
+ If a satellite workflow only says “possible methane plume near this facility,” there is still too much cognitive load on the user:
184
+
185
+ - Which part of the facility should I inspect?
186
+ - Is this likely a persistent issue or just a one-off anomaly?
187
+ - Is the source likely near the active surface, gas collection system, or another facility zone?
188
+ - Is this likely a real signal or a data artifact?
189
+
190
+ LandfillSentry Ops is designed to answer these questions.
191
+
192
+ ---
193
+
194
+ ## 4. Product Vision
195
+
196
+ LandfillSentry Ops should be understood as a **developer API plus operator UI**.
197
+
198
+ ### 4.1 Product definition
199
+
200
+ At its core, the product converts geospatial evidence into a standardized incident object.
201
+
202
+ **Input**
203
+ - landfill coordinates or polygon
204
+ - time window
205
+ - image size
206
+ - spectral configuration
207
+ - optional site metadata
208
+
209
+ **Output**
210
+ - site ID
211
+ - alert timestamp
212
+ - plume likely boolean
213
+ - candidate region bounding box
214
+ - likely source zone label
215
+ - persistence score
216
+ - confidence score
217
+ - short evidence summary
218
+ - recommended next action
219
+
220
+ ### 4.2 Product promise
221
+
222
+ > “Give us your landfill watchlist and we will tell you where to inspect first, based on multispectral satellite evidence and a fine-tuned grounded vision-language model.”
223
+
224
+ ### 4.3 Product boundaries
225
+
226
+ This product **does not** aim to deliver:
227
+ - regulatory-grade quantification
228
+ - final legal liability attribution
229
+ - full atmospheric inversion
230
+ - nighttime continuous coverage
231
+ - final safety-critical decision authority
232
+
233
+ Those can be future directions, but they are not the correct first scope.
234
+
235
+ ---
236
+
237
+ ## 5. Users, Stakeholders, and Initial Buyer
238
+
239
+ ### 5.1 Primary user
240
+
241
+ **Landfill operations manager or environmental compliance lead**
242
+
243
+ What they care about:
244
+ - which sites require attention
245
+ - which areas within a site may be responsible
246
+ - which issues look persistent
247
+ - which alerts merit inspection first
248
+
249
+ ### 5.2 Secondary users
250
+
251
+ - municipal solid waste authority
252
+ - environmental consultant
253
+ - climate program team
254
+ - insurer or risk analyst
255
+ - policy monitoring team
256
+
257
+ ### 5.3 Initial buyer wedge
258
+
259
+ The strongest first buyer is the **operator-side team**, not the insurer or regulator.
260
+
261
+ Why:
262
+ - clearer daily workflow
263
+ - stronger demo story
264
+ - easier to show immediate value
265
+ - lower proof burden than full compliance systems
266
+ - more believable hackathon MVP
267
+
268
+ ### 5.4 Expansion path
269
+
270
+ After hackathon MVP:
271
+ 1. operator triage
272
+ 2. municipality dashboard
273
+ 3. compliance evidence export
274
+ 4. insurer/portfolio risk scoring
275
+ 5. waste-sector benchmarking
276
+
277
+ ---
278
+
279
+ ## 6. Why Landfill Methane Instead of Other Domains
280
+
281
+ This section summarizes why this domain beat the main alternatives during idea selection.
282
+
283
+ ### 6.1 Versus crop monitoring
284
+
285
+ Crop monitoring is a good fit for Sentinel-2, but it is crowded and highly familiar. Judges are likely to see many variants of crop stress, irrigation, and yield analytics.
286
+
287
+ ### 6.2 Versus wildfire
288
+
289
+ Wildfire is compelling, but the strongest operational wildfire systems typically rely on thermal imagery or broader sensor stacks. SimSat’s strongest advantage is Sentinel-2 plus Mapbox, not thermal fire-detection constellations.
290
+
291
+ ### 6.3 Versus marine or illegal fishing
292
+
293
+ Those use cases typically require richer maritime context, vessel tracking data, and other modalities. They are less cleanly aligned with the available imagery stack.
294
+
295
+ ### 6.4 Versus generic oil-and-gas methane
296
+
297
+ Oil-and-gas methane is highly relevant and technically strong, but the category is crowded. Public and private systems such as MARS, Kayrros, and Carbon Mapper already make the space feel more saturated. Landfill methane is still real and urgent, but the product whitespace is cleaner.
298
+ Sources:
299
+ - [UNEP MARS](https://www.unep.org/topics/energy/methane/methane-alert-and-response-system-mars)
300
+ - [Carbon Mapper](https://carbonmapper.org/)
301
+ - [CATF waste-sector article](https://www.catf.us/2026/03/three-trends-shaping-waste-sector-methane-mitigation-2026/)
302
+
303
+ ### 6.5 Why landfill methane is the sweet spot
304
+
305
+ This use case has:
306
+ - strong satellite dependence
307
+ - meaningful temporal analysis
308
+ - facility context value from high-res imagery
309
+ - real operational and climate relevance
310
+ - manageable scope for a hackathon MVP
311
+
312
+ ---
313
+
314
+ ## 7. Solution Overview
315
+
316
+ LandfillSentry Ops uses a two-stage intelligence pipeline:
317
+
318
+ ### Stage A: Candidate Generation
319
+ Generate likely methane candidate regions using Sentinel-2 imagery and historical comparisons.
320
+
321
+ ### Stage B: Incident Interpretation
322
+ Use a fine-tuned Liquid VLM to convert evidence panels into grounded, structured, human-usable incident objects.
323
+
324
+ This split is important. It prevents the VLM from having to discover everything from scratch and improves reliability.
325
+
326
+ ### 7.1 Core product output
327
+
328
+ ```json
329
+ {
330
+ "site_id": "LF_IND_001",
331
+ "analysis_time": "2026-04-19T11:15:00Z",
332
+ "plume_likely": true,
333
+ "confidence": 0.84,
334
+ "bbox_norm": [0.32, 0.18, 0.56, 0.43],
335
+ "likely_source_zone": "active_face",
336
+ "persistence_score": 0.72,
337
+ "evidence_summary": "A persistent SWIR anomaly appears near the active working area and recurs across recent cloud-acceptable scenes.",
338
+ "recommended_followup": "Inspect active face gas capture and cover integrity within 24 hours.",
339
+ "model_version": "lfm25vl450m-landfillsentry-lora-v1"
340
+ }
341
+ ```
342
+
343
+ ---
344
+
345
+ ## 8. System Requirements
346
+
347
+ ### 8.1 Functional requirements
348
+
349
+ The system must:
350
+ 1. ingest current and historical imagery for a given landfill
351
+ 2. support multiple spectral-band configurations
352
+ 3. generate candidate methane-risk regions
353
+ 4. build compact evidence panels for model input
354
+ 5. run VLM inference locally or on a GPU server
355
+ 6. return a standardized incident object
356
+ 7. expose results through a backend API
357
+ 8. show results in a simple web UI
358
+
359
+ ### 8.2 Non-functional requirements
360
+
361
+ The system should:
362
+ - run reproducibly on judges’ machines or a hosted instance
363
+ - avoid fragile dependencies
364
+ - fail gracefully when imagery is missing or too cloudy
365
+ - return structured JSON, not only free text
366
+ - keep inference latency acceptable for demo conditions
367
+
368
+ ### 8.3 Hackathon constraints
369
+
370
+ - app must run without debugging
371
+ - fine-tuning is rewarded
372
+ - use of SimSat imagery is mandatory
373
+ - documentation and demo quality matter
374
+
375
+ ---
376
+
377
+ ## 9. High-Level Architecture
378
+
379
+ ```mermaid
380
+ flowchart TD
381
+ A[User / Watchlist] --> B[LandfillSentry API Gateway]
382
+ B --> C[Site Registry / Metadata]
383
+ B --> D[Imagery Retrieval Service]
384
+ D --> E[SimSat Sentinel-2 API]
385
+ D --> F[SimSat Mapbox API]
386
+
387
+ E --> G[Preprocessing & QC]
388
+ F --> G
389
+
390
+ G --> H[Candidate Generation Engine]
391
+ H --> I[Evidence Panel Builder]
392
+
393
+ I --> J[Liquid VLM Inference Service]
394
+ J --> K[Incident Object Generator]
395
+
396
+ K --> L[Results Store]
397
+ K --> M[Operator UI / Dashboard]
398
+ K --> N[Webhook / Export / Evidence Pack]
399
+ ```
400
+
401
+ ### 9.1 Major components
402
+
403
+ 1. **API Gateway**
404
+ Accepts requests, validates input, manages watchlist scans, exposes results.
405
+
406
+ 2. **Site Registry**
407
+ Stores landfill coordinates, polygons, metadata, and operator labels.
408
+
409
+ 3. **Imagery Retrieval Service**
410
+ Fetches imagery from SimSat current and historical endpoints.
411
+
412
+ 4. **Preprocessing and Quality Control**
413
+ Handles clouds, band selection, normalization, and temporal selection.
414
+
415
+ 5. **Candidate Generation Engine**
416
+ Produces candidate regions based on spectral heuristics, temporal changes, and optional methane-specific models.
417
+
418
+ 6. **Evidence Panel Builder**
419
+ Converts raw imagery and metadata into a compact multimodal input for the VLM.
420
+
421
+ 7. **Liquid VLM Inference Service**
422
+ Runs fine-tuned LFM2.5-VL-450M and emits structured JSON.
423
+
424
+ 8. **Incident Object Generator**
425
+ Validates output, applies business logic, computes alert priority.
426
+
427
+ 9. **Results Store and UI**
428
+ Stores incidents, serves web UI, exports evidence packs.
429
+
430
+ ---
431
+
432
+ ## 10. Data Sources and External Systems
433
+
434
+ ### 10.1 SimSat
435
+
436
+ SimSat is the official starting point for the hackathon. It provides:
437
+ - a simulation dashboard
438
+ - a control API
439
+ - current satellite position
440
+ - Sentinel-2 imagery endpoints
441
+ - Mapbox imagery endpoints
442
+ Source: [SimSat GitHub README](https://github.com/DPhi-Space/SimSat)
443
+
444
+ Relevant endpoints include:
445
+ - `GET /data/current/position`
446
+ - `GET /data/current/image/sentinel`
447
+ - `GET /data/current/image/mapbox`
448
+ - `GET /data/image/sentinel`
449
+ - `GET /data/image/mapbox`
450
+
451
+ ### 10.2 Sentinel-2
452
+
453
+ Sentinel-2 is the backbone for:
454
+ - multispectral evidence
455
+ - temporal history
456
+ - wide-area site scanning
457
+ - cloud metadata
458
+
459
+ SimSat exposes band selection and historical windowing on top of Sentinel-2 retrieval.
460
+
461
+ ### 10.3 Mapbox
462
+
463
+ Mapbox imagery is used for:
464
+ - high-resolution site context
465
+ - explaining where within the facility the candidate event is located
466
+ - producing more intuitive operator visuals
467
+
468
+ SimSat requires a `MAPBOX_ACCESS_TOKEN` to enable this path.
469
+ Source: [SimSat GitHub README](https://github.com/DPhi-Space/SimSat)
470
+
471
+ ### 10.4 METER
472
+
473
+ METER is a global database of methane-emitting infrastructure that contains over 12.3 million entries and includes a first global estimate of landfill locations, with roughly 13,000 landfill sites and large ML-generated coverage.
474
+ Source: [METER preprint](https://essd.copernicus.org/preprints/essd-2026-124/essd-2026-124.pdf)
475
+
476
+ Use in this project:
477
+ - seed landfill watchlists
478
+ - site matching
479
+ - facility metadata enrichment
480
+ - future benchmarking
481
+
482
+ ### 10.5 Project Eucalyptus
483
+
484
+ Project Eucalyptus provides:
485
+ - trained methane-plume models
486
+ - end-to-end methane inference tooling
487
+ - synthetic plume generation
488
+ - post-processing and evaluation notebooks
489
+ - Sentinel-2 support
490
+ Sources:
491
+ - [Project Eucalyptus GitHub](https://github.com/Orbio-Earth/Project-Eucalyptus)
492
+ - [Project Eucalyptus docs](https://orbio-earth.github.io/Project-Eucalyptus/)
493
+
494
+ Use in this project:
495
+ - bootstrap methane candidate generation
496
+ - generate synthetic training examples
497
+ - benchmark spectral candidate stages
498
+
499
+ ### 10.6 Optional weather or wind inputs
500
+
501
+ Optional external sources may improve evidence interpretation or synthetic training:
502
+ - Open-Meteo
503
+ - ERA5
504
+ - local meteorological APIs
505
+
506
+ These are not required for the first MVP, but are useful if you want wind-aware synthetic plumes or better persistence interpretation.
507
+
508
+ ---
509
+
510
+ ## 11. External APIs and Frameworks Required
511
+
512
+ This section lists everything needed to build the MVP.
513
+
514
+ ### 11.1 Required external APIs
515
+
516
+ #### A. SimSat API
517
+ Purpose:
518
+ - current position
519
+ - current Sentinel-2 image
520
+ - current Mapbox image
521
+ - historical Sentinel-2 image
522
+ - historical Mapbox image
523
+
524
+ Required for MVP: **Yes**
525
+
526
+ #### B. Mapbox Access Token
527
+ Purpose:
528
+ - required by SimSat to return Mapbox imagery
529
+
530
+ Required for MVP: **Yes, if Mapbox context is used**
531
+ Source: [SimSat GitHub README](https://github.com/DPhi-Space/SimSat)
532
+
533
+ ### 11.2 Strongly recommended external model assets
534
+
535
+ #### A. LiquidAI/LFM2.5-VL-450M
536
+ Purpose:
537
+ - multimodal structured reasoning
538
+ - grounded bounding-box output
539
+ - evidence summarization
540
+
541
+ Required for MVP: **Yes**
542
+ Source: [LFM2.5-VL-450M model card](https://huggingface.co/LiquidAI/LFM2.5-VL-450M)
543
+
544
+ #### B. Project Eucalyptus assets
545
+ Purpose:
546
+ - methane-specific candidate generation
547
+ - synthetic plume training bootstrap
548
+
549
+ Required for MVP: **Strongly recommended**
550
+ Source: [Project Eucalyptus GitHub](https://github.com/Orbio-Earth/Project-Eucalyptus)
551
+
552
+ ### 11.3 Optional external datasets
553
+
554
+ #### A. METER
555
+ Purpose:
556
+ - site priors and watchlist enrichment
557
+ Required for MVP: **Recommended**
558
+
559
+ #### B. WasteMAP
560
+ Purpose:
561
+ - contextual understanding of waste methane landscape
562
+ Required for MVP: **Optional**
563
+ Source: [WasteMAP](https://wastemap.earth/)
564
+
565
+ ### 11.4 Required frameworks and libraries
566
+
567
+ #### Backend
568
+ - Python 3.11+
569
+ - FastAPI
570
+ - Uvicorn
571
+ - Pydantic
572
+ - SQLAlchemy
573
+ - PostgreSQL or SQLite for MVP
574
+ - Redis optional for job queue
575
+
576
+ #### ML and data
577
+ - PyTorch
578
+ - Transformers
579
+ - PEFT
580
+ - Unsloth or TRL
581
+ - NumPy
582
+ - Rasterio
583
+ - xarray optional
584
+ - GeoPandas
585
+ - shapely
586
+ - Pillow
587
+ - OpenCV optional
588
+ - scikit-image
589
+ - scikit-learn
590
+
591
+ #### Geospatial ML
592
+ - TorchGeo
593
+ - TerraTorch optional
594
+ - SamGeo optional
595
+
596
+ #### Frontend
597
+ - React + Vite, or
598
+ - Next.js, or
599
+ - Streamlit for faster MVP
600
+
601
+ #### Deployment
602
+ - Docker
603
+ - Docker Compose
604
+ - Modal for training or remote GPU
605
+ - vLLM optional if serving on a larger GPU
606
+ - ONNX Runtime optional for deployment experimentation
607
+
608
+ ### 11.5 Why these frameworks
609
+
610
+ **TorchGeo** provides CRS-aware datasets, multispectral transforms, spatial samplers, and pretrained models for geospatial ML.
611
+ Source: [TorchGeo](https://torchgeo.org/)
612
+
613
+ **TerraTorch** provides a configurable toolkit for fine-tuning geospatial foundation models and supports segmentation, classification, and pixel-wise regression workflows through configuration-driven training.
614
+ Source: [TerraTorch GitHub](https://github.com/terrastackai/terratorch)
615
+
616
+ **SamGeo** simplifies segmentation workflows over geospatial imagery, which is useful for facility-zone overlays or optional polygon assist tools.
617
+ Source: [SamGeo docs](https://samgeo.gishub.org/)
618
+
619
+ **Modal** is practical for GPU-backed LoRA fine-tuning and supports Unsloth-based training flows.
620
+ Source: [Modal Unsloth example](https://modal.com/docs/examples/unsloth_finetune)
621
+
622
+ ---
623
+
624
+ ## 12. Internal Service Design
625
+
626
+ The recommended backend is a small service-oriented monolith, not a complex microservice architecture. Keep it simple for the hackathon, but design it cleanly enough to evolve.
627
+
628
+ ### 12.1 Services
629
+
630
+ #### A. API Gateway / Orchestrator
631
+ Handles:
632
+ - scan requests
633
+ - watchlist operations
634
+ - site lookup
635
+ - inference job triggering
636
+ - response aggregation
637
+
638
+ #### B. Site Registry Service
639
+ Handles:
640
+ - site metadata
641
+ - landfill polygons or point locations
642
+ - zone definitions
643
+ - labels and notes
644
+
645
+ #### C. Imagery Service
646
+ Handles:
647
+ - fetch from SimSat
648
+ - historical image retrieval
649
+ - image caching
650
+ - metadata capture
651
+ - cloud and availability filtering
652
+
653
+ #### D. Candidate Generation Service
654
+ Handles:
655
+ - spectral heuristics
656
+ - temporal differencing
657
+ - optional Eucalyptus model execution
658
+ - candidate bbox generation
659
+ - anomaly scoring
660
+
661
+ #### E. VLM Inference Service
662
+ Handles:
663
+ - prompt assembly
664
+ - evidence panel construction
665
+ - model loading
666
+ - inference
667
+ - JSON validation
668
+ - confidence normalization
669
+
670
+ #### F. Incident Service
671
+ Handles:
672
+ - final incident object creation
673
+ - persistence scoring
674
+ - priority assignment
675
+ - storage and export
676
+
677
+ #### G. UI Service
678
+ Handles:
679
+ - results display
680
+ - site map
681
+ - image overlays
682
+ - evidence cards
683
+ - operator workflow
684
+
685
+ ### 12.2 Why not microservices first
686
+
687
+ Hackathons punish complexity. Use a modular codebase with clear boundaries, but deploy as one backend application unless you have a very strong reason not to.
688
+
689
+ ---
690
+
691
+ ## 13. Detailed Data Flow
692
+
693
+ ```mermaid
694
+ sequenceDiagram
695
+ participant U as User
696
+ participant API as FastAPI Backend
697
+ participant SIM as SimSat
698
+ participant CAND as Candidate Engine
699
+ participant VLM as Liquid VLM
700
+ participant DB as Database
701
+
702
+ U->>API: POST /scan-site
703
+ API->>SIM: GET historical Sentinel-2 images
704
+ API->>SIM: GET current Sentinel-2 image
705
+ API->>SIM: GET Mapbox context image
706
+ API->>CAND: preprocess and score anomaly regions
707
+ CAND-->>API: candidate bbox + features
708
+ API->>VLM: evidence panel + prompt
709
+ VLM-->>API: structured JSON incident
710
+ API->>DB: store result
711
+ API-->>U: incident object + visual assets
712
+ ```
713
+
714
+ ### 13.1 Step-by-step logic
715
+
716
+ 1. User requests scan for a landfill or selects a watchlist item.
717
+ 2. Backend fetches:
718
+ - current Sentinel-2 image
719
+ - N historical Sentinel-2 images
720
+ - Mapbox image for same target
721
+ 3. Backend filters poor scenes:
722
+ - no image available
723
+ - excessive cloud cover
724
+ - missing bands
725
+ 4. Candidate engine computes:
726
+ - spectral composites
727
+ - temporal differences
728
+ - anomaly scores
729
+ - candidate region proposals
730
+ 5. Evidence panel builder produces:
731
+ - RGB panel
732
+ - SWIR or methane-sensitive panel
733
+ - temporal comparison panel
734
+ - Mapbox context panel
735
+ - site metadata text
736
+ 6. Fine-tuned Liquid model receives evidence panel and prompt.
737
+ 7. Model emits structured JSON.
738
+ 8. Post-processing validates schema and computes final alert priority.
739
+ 9. UI displays incident and export card.
740
+
741
+ ---
742
+
743
+ ## 14. Detection and Candidate Generation Pipeline
744
+
745
+ This is the most important non-VLM stage.
746
+
747
+ ### 14.1 Why a separate candidate stage is necessary
748
+
749
+ A small VLM should not be asked to infer methane events directly from arbitrary full-scene imagery. That would be unreliable and inefficient. Instead, we should give it a compact, evidence-rich panel focused on promising regions.
750
+
751
+ ### 14.2 Candidate pipeline options
752
+
753
+ #### Option A: Heuristic spectral screening
754
+ Use a small set of domain-inspired spectral differences and temporal contrast rules to identify suspicious regions.
755
+
756
+ Pros:
757
+ - fast
758
+ - easy to explain
759
+ - no training required for first version
760
+
761
+ Cons:
762
+ - more false positives
763
+ - weaker methane specificity
764
+
765
+ #### Option B: Eucalyptus-assisted methane candidate generation
766
+ Use Project Eucalyptus models and/or post-processing to propose plume-like candidate zones.
767
+
768
+ Pros:
769
+ - domain-specific
770
+ - stronger methane alignment
771
+ - better training bootstrap
772
+
773
+ Cons:
774
+ - more integration work
775
+ - may require adaptation to SimSat output formatting
776
+
777
+ #### Option C: Hybrid candidate generator
778
+ Use heuristics first, then optional Eucalyptus refinement.
779
+
780
+ **Recommended approach for MVP:** Hybrid
781
+
782
+ ### 14.3 Candidate scoring features
783
+
784
+ The candidate engine can compute:
785
+ - anomaly magnitude
786
+ - recurrence across historical windows
787
+ - cloud-adjusted confidence
788
+ - distance to likely landfill operational zones
789
+ - overlap with active or open areas inferred from Mapbox
790
+ - spatial compactness
791
+ - edge consistency
792
+
793
+ ### 14.4 Candidate outputs
794
+
795
+ ```json
796
+ {
797
+ "candidate_id": "cand_001",
798
+ "site_id": "LF_IND_001",
799
+ "bbox_px": [128, 76, 241, 162],
800
+ "bbox_norm": [0.25, 0.15, 0.47, 0.32],
801
+ "candidate_score": 0.71,
802
+ "temporal_recurrence": 0.64,
803
+ "cloud_penalty": 0.12,
804
+ "spectral_signal_score": 0.78
805
+ }
806
+ ```
807
+
808
+ ### 14.5 Landfill zone priors
809
+
810
+ Later versions can split landfill space into coarse zones:
811
+ - active face / working face
812
+ - capped area
813
+ - perimeter
814
+ - gas collection field
815
+ - leachate or utility area
816
+ - unknown
817
+
818
+ This can be inferred weakly from Mapbox imagery or manually provided for demo sites.
819
+
820
+ ---
821
+
822
+ ## 15. Vision-Language Model Layer
823
+
824
+ ### 15.1 Why LFM2.5-VL-450M
825
+
826
+ Liquid’s LFM2.5-VL-450M is a very strong fit because it offers:
827
+ - enhanced instruction following
828
+ - bounding-box prediction and object detection
829
+ - function calling for structured output
830
+ - multiple deployment formats including native, GGUF, ONNX, and MLX
831
+ - recommended fine-tuning via LoRA
832
+ Source: [LFM2.5-VL-450M model card](https://huggingface.co/LiquidAI/LFM2.5-VL-450M)
833
+
834
+ ### 15.2 What the model should do
835
+
836
+ The model should **not** act as the primary methane detector. Instead, it should act as a grounded multimodal interpreter that:
837
+ - reviews a focused evidence panel
838
+ - localizes the most likely operationally relevant region
839
+ - classifies source-zone type
840
+ - summarizes evidence
841
+ - recommends follow-up action
842
+
843
+ ### 15.3 Inputs to the model
844
+
845
+ Each model call should include:
846
+ 1. current RGB crop
847
+ 2. methane-sensitive spectral composite crop
848
+ 3. temporal-difference crop
849
+ 4. Mapbox context crop
850
+ 5. short metadata text:
851
+ - site ID
852
+ - cloud cover
853
+ - time delta
854
+ - recurrence score
855
+ - candidate score
856
+
857
+ ### 15.4 Output format
858
+
859
+ Always force JSON.
860
+
861
+ Example prompt contract:
862
+
863
+ ```text
864
+ You are an environmental operations assistant analyzing landfill imagery.
865
+ Given the evidence panel and metadata, determine whether there is a likely methane-related incident worth operator inspection.
866
+
867
+ Return valid JSON only with these fields:
868
+ plume_likely: boolean
869
+ confidence: float between 0 and 1
870
+ bbox_norm: [x1, y1, x2, y2] normalized coordinates
871
+ likely_source_zone: one of ["active_face", "cover_system", "perimeter", "gas_infrastructure", "unknown"]
872
+ persistence_score: float between 0 and 1
873
+ evidence_summary: short string under 40 words
874
+ recommended_followup: short string under 20 words
875
+ ```
876
+
877
+ ### 15.5 Why bounding boxes matter
878
+
879
+ Bounding boxes are the bridge between imagery and action. They allow:
880
+ - explainable localization
881
+ - visual overlay in the UI
882
+ - compatibility with downstream segmentation or export tools
883
+ - simple evaluation against labels
884
+
885
+ ---
886
+
887
+ ## 16. Fine-Tuning Strategy
888
+
889
+ ### 16.1 Why fine-tune
890
+
891
+ Liquid explicitly recommends fine-tuning LFM2.5-VL-450M on specific use cases to maximize performance. The model card lists SFT notebooks for LoRA fine-tuning via Unsloth and TRL.
892
+ Source: [LFM2.5-VL-450M model card](https://huggingface.co/LiquidAI/LFM2.5-VL-450M)
893
+
894
+ This is important because our task is narrow:
895
+ - landfill methane triage
896
+ - structured incident generation
897
+ - bounded vocabulary of source zones
898
+ - repeated evidence panel format
899
+
900
+ That is exactly the kind of task where LoRA can help.
901
+
902
+ ### 16.2 Fine-tuning objective
903
+
904
+ Train the model to map evidence panels to structured incident outputs.
905
+
906
+ ### 16.3 Recommended tuning method
907
+
908
+ Use **LoRA supervised fine-tuning** with:
909
+ - model: `LiquidAI/LFM2.5-VL-450M`
910
+ - framework: Unsloth or TRL
911
+ - training objective: next-token generation over JSON outputs
912
+ - loss masking: output-focused
913
+ - low learning rate
914
+ - small batch with gradient accumulation
915
+
916
+ ### 16.4 Training data format
917
+
918
+ Each example contains:
919
+ - panel image
920
+ - user prompt
921
+ - assistant JSON answer
922
+
923
+ ### 16.5 Stage-wise tuning
924
+
925
+ #### Phase 1: Synthetic and weakly labeled SFT
926
+ Use:
927
+ - Eucalyptus synthetic plumes
928
+ - manually curated landfill-like scenes
929
+ - heuristic or rule-assisted labels
930
+
931
+ #### Phase 2: Human-corrected validation and tuning
932
+ Curate a smaller, high-quality validation set where outputs are manually checked.
933
+
934
+ #### Phase 3: Optional instruction refinement
935
+ Refine for short, consistent evidence summaries and more stable source-zone outputs.
936
+
937
+ ### 16.6 Suggested LoRA settings
938
+
939
+ These are starting points, not fixed truths:
940
+ - rank: 16 or 32
941
+ - alpha: 16 or 32
942
+ - dropout: 0.05
943
+ - epochs: 2 to 5
944
+ - optimizer: AdamW or paged AdamW
945
+ - precision: bf16 or fp16 depending hardware
946
+ - sequence length: enough for image tokens + short JSON outputs
947
+
948
+ ### 16.7 What not to do
949
+
950
+ - Do not overfit on tiny manually labeled examples alone.
951
+ - Do not train on unconstrained natural-language outputs first.
952
+ - Do not ask the model for long scientific narratives.
953
+ - Do not mix too many tasks in one first pass.
954
+
955
+ Keep the task narrow and consistent.
956
+
957
+ ---
958
+
959
+ ## 17. Dataset Strategy
960
+
961
+ ### 17.1 Dataset design goals
962
+
963
+ We need a dataset that teaches the model to:
964
+ - distinguish likely incident vs non-incident
965
+ - localize the candidate zone
966
+ - classify the likely source zone coarsely
967
+ - produce concise evidence text
968
+ - emit valid JSON consistently
969
+
970
+ ### 17.2 Dataset sources
971
+
972
+ #### A. SimSat historical Sentinel-2 imagery
973
+ Use for:
974
+ - site windows
975
+ - temporal comparisons
976
+ - current vs history panel generation
977
+
978
+ #### B. Project Eucalyptus synthetic plumes
979
+ Use for:
980
+ - supervised candidate learning
981
+ - diverse plume geometry generation
982
+ - hard negative creation
983
+ Source: [Project Eucalyptus docs](https://orbio-earth.github.io/Project-Eucalyptus/)
984
+
985
+ #### C. METER landfill locations
986
+ Use for:
987
+ - watchlist seed set
988
+ - site diversification
989
+ - data sampling across geography
990
+ Source: [METER preprint](https://essd.copernicus.org/preprints/essd-2026-124/essd-2026-124.pdf)
991
+
992
+ #### D. Manual labeling
993
+ Use for:
994
+ - high-quality eval set
995
+ - prompt/output validation
996
+ - operationally meaningful source-zone labels
997
+
998
+ ### 17.3 Label taxonomy
999
+
1000
+ #### Incident label
1001
+ - likely_incident
1002
+ - unlikely_incident
1003
+
1004
+ #### Source zone label
1005
+ - active_face
1006
+ - cover_system
1007
+ - perimeter
1008
+ - gas_infrastructure
1009
+ - unknown
1010
+
1011
+ #### Persistence label
1012
+ - transient
1013
+ - possible_persistent
1014
+ - persistent
1015
+
1016
+ ### 17.4 Negative examples are essential
1017
+
1018
+ Train on hard negatives:
1019
+ - cloud artifacts
1020
+ - bright soil
1021
+ - seasonal changes
1022
+ - water-edge contrast
1023
+ - landfill-adjacent industrial structures
1024
+ - non-landfill methane-like anomalies outside facility zone
1025
+
1026
+ ### 17.5 Suggested dataset splits
1027
+
1028
+ - train: 70%
1029
+ - validation: 15%
1030
+ - test: 15%
1031
+
1032
+ But more importantly, split by **site**, not only by image. Otherwise leakage will make results look better than they are.
1033
+
1034
+ ---
1035
+
1036
+ ## 18. Prompting and Output Schemas
1037
+
1038
+ ### 18.1 Prompt design principles
1039
+
1040
+ Prompt design should:
1041
+ - constrain output strongly
1042
+ - keep reasoning implicit
1043
+ - minimize verbosity
1044
+ - force structured fields
1045
+ - avoid asking the model to quantify emissions
1046
+
1047
+ ### 18.2 Core prompt template
1048
+
1049
+ ```text
1050
+ You are a landfill operations assistant.
1051
+
1052
+ Analyze the evidence panel for a possible methane-related issue at a landfill.
1053
+
1054
+ Use the visual evidence and metadata only.
1055
+ Do not invent facts.
1056
+ Return valid JSON only.
1057
+
1058
+ Schema:
1059
+ {
1060
+ "plume_likely": boolean,
1061
+ "confidence": float,
1062
+ "bbox_norm": [float, float, float, float],
1063
+ "likely_source_zone": "active_face" | "cover_system" | "perimeter" | "gas_infrastructure" | "unknown",
1064
+ "persistence_score": float,
1065
+ "evidence_summary": string,
1066
+ "recommended_followup": string
1067
+ }
1068
+ ```
1069
+
1070
+ ### 18.3 Metadata text block
1071
+
1072
+ ```text
1073
+ Site metadata:
1074
+ site_type: landfill
1075
+ candidate_score: 0.71
1076
+ temporal_recurrence: 0.64
1077
+ cloud_cover_current: 9.2
1078
+ history_scenes_used: 4
1079
+ mapbox_context_available: true
1080
+ ```
1081
+
1082
+ ### 18.4 Output validation
1083
+
1084
+ Use Pydantic models to validate:
1085
+ - correct keys
1086
+ - numeric ranges
1087
+ - bbox ordering
1088
+ - enum membership
1089
+ - max summary length
1090
+
1091
+ If validation fails:
1092
+ - retry once with a stricter system prompt
1093
+ - otherwise mark result as `needs_review`
1094
+
1095
+ ---
1096
+
1097
+ ## 19. Evaluation Plan
1098
+
1099
+ ### 19.1 Why evaluation matters
1100
+
1101
+ The hackathon rewards fine-tuning when there is a documented methodology and measurable improvement over the base model. This means we need evaluation from the beginning.
1102
+
1103
+ ### 19.2 Primary evaluation metrics
1104
+
1105
+ #### A. Incident classification
1106
+ - accuracy
1107
+ - precision
1108
+ - recall
1109
+ - F1
1110
+
1111
+ #### B. Localization quality
1112
+ - IoU of predicted bbox vs label
1113
+ - center-point distance
1114
+
1115
+ #### C. Source-zone classification
1116
+ - accuracy
1117
+ - macro F1
1118
+
1119
+ #### D. Persistence scoring
1120
+ - MAE if numeric
1121
+ - ordinal accuracy if bucketed
1122
+
1123
+ #### E. JSON reliability
1124
+ - valid JSON rate
1125
+ - schema compliance rate
1126
+
1127
+ #### F. Operational usefulness
1128
+ Human review rubric on:
1129
+ - clarity
1130
+ - actionability
1131
+ - low hallucination
1132
+ - brevity
1133
+
1134
+ ### 19.3 Baselines
1135
+
1136
+ Compare against:
1137
+ 1. base LFM2.5-VL-450M with prompt only
1138
+ 2. fine-tuned LFM2.5-VL-450M
1139
+ 3. candidate-only heuristic pipeline without VLM interpretation
1140
+
1141
+ ### 19.4 Success thresholds for MVP
1142
+
1143
+ Good hackathon MVP targets:
1144
+ - valid JSON rate > 95%
1145
+ - plume classification F1 > baseline by at least 5 to 10 points
1146
+ - bbox IoU meaningfully above prompt-only baseline
1147
+ - short evidence summaries judged useful in manual review
1148
+
1149
+ ### 19.5 Evaluation table template
1150
+
1151
+ | Metric | Heuristic Only | Base LFM2.5-VL | Fine-Tuned LFM2.5-VL |
1152
+ |---|---:|---:|---:|
1153
+ | Incident F1 | 0.58 | 0.66 | 0.75 |
1154
+ | Source-Zone Accuracy | 0.41 | 0.52 | 0.68 |
1155
+ | BBox IoU | 0.33 | 0.44 | 0.59 |
1156
+ | Valid JSON Rate | 1.00 | 0.88 | 0.97 |
1157
+ | Human Actionability Score | 2.6/5 | 3.5/5 | 4.4/5 |
1158
+
1159
+ Populate this honestly when you run experiments.
1160
+
1161
+ ---
1162
+
1163
+ ## 20. Product UX and Demo Flow
1164
+
1165
+ ### 20.1 Core UI screens
1166
+
1167
+ #### Screen 1: Watchlist
1168
+ List of landfill sites with:
1169
+ - last scan time
1170
+ - incident count
1171
+ - highest priority alert
1172
+ - persistence flag
1173
+
1174
+ #### Screen 2: Site detail
1175
+ Show:
1176
+ - current Sentinel image
1177
+ - historical comparison panel
1178
+ - Mapbox site view
1179
+ - alert overlays
1180
+ - incident cards
1181
+
1182
+ #### Screen 3: Evidence pack
1183
+ Show:
1184
+ - alert summary
1185
+ - bbox overlay
1186
+ - likely source zone
1187
+ - recommended follow-up
1188
+ - export JSON
1189
+
1190
+ ### 20.2 Demo script
1191
+
1192
+ 1. Open watchlist.
1193
+ 2. Select a site with a flagged incident.
1194
+ 3. Show current vs historical imagery.
1195
+ 4. Explain candidate generation briefly.
1196
+ 5. Run Liquid model inference live or replay cached result.
1197
+ 6. Display structured incident object.
1198
+ 7. Show bbox on Mapbox and explain likely source zone.
1199
+ 8. End with operator value:
1200
+ “This tells the landfill team where to inspect first.”
1201
+
1202
+ ### 20.3 What to avoid in the demo
1203
+
1204
+ - too many scientific details before value is shown
1205
+ - unclear jargon around methane retrieval physics
1206
+ - long free-text model outputs
1207
+ - unstable inference calls during live judging
1208
+ - overclaiming quantification accuracy
1209
+
1210
+ ---
1211
+
1212
+ ## 21. Backend API Specification
1213
+
1214
+ This section specifies the APIs for the LandfillSentry backend.
1215
+
1216
+ ### 21.1 API style
1217
+
1218
+ - REST for MVP
1219
+ - JSON responses
1220
+ - async jobs for longer scans
1221
+ - predictable schema
1222
+
1223
+ ### 21.2 Core endpoints
1224
+
1225
+ #### A. Health
1226
+
1227
+ `GET /health`
1228
+
1229
+ Response:
1230
+ ```json
1231
+ {
1232
+ "status": "ok",
1233
+ "service": "landfillsentry-api",
1234
+ "model_loaded": true
1235
+ }
1236
+ ```
1237
+
1238
+ #### B. Register site
1239
+
1240
+ `POST /sites`
1241
+
1242
+ Request:
1243
+ ```json
1244
+ {
1245
+ "site_id": "LF_IND_001",
1246
+ "name": "Demo Landfill A",
1247
+ "lat": 16.306,
1248
+ "lon": 80.436,
1249
+ "country": "IN",
1250
+ "metadata": {
1251
+ "operator": "Demo Operator",
1252
+ "notes": "Hackathon demo site"
1253
+ }
1254
+ }
1255
+ ```
1256
+
1257
+ #### C. List sites
1258
+
1259
+ `GET /sites`
1260
+
1261
+ #### D. Scan site
1262
+
1263
+ `POST /scan-site`
1264
+
1265
+ Request:
1266
+ ```json
1267
+ {
1268
+ "site_id": "LF_IND_001",
1269
+ "timestamp": "2026-04-19T10:00:00Z",
1270
+ "history_days": 30,
1271
+ "size_km": 5.0,
1272
+ "spectral_bands": ["red", "green", "blue"],
1273
+ "include_mapbox": true
1274
+ }
1275
+ ```
1276
+
1277
+ Response:
1278
+ ```json
1279
+ {
1280
+ "job_id": "job_123",
1281
+ "status": "queued"
1282
+ }
1283
+ ```
1284
+
1285
+ #### E. Get scan result
1286
+
1287
+ `GET /scan-result/{job_id}`
1288
+
1289
+ Response:
1290
+ ```json
1291
+ {
1292
+ "job_id": "job_123",
1293
+ "status": "completed",
1294
+ "site_id": "LF_IND_001",
1295
+ "incident": {
1296
+ "plume_likely": true,
1297
+ "confidence": 0.84,
1298
+ "bbox_norm": [0.32, 0.18, 0.56, 0.43],
1299
+ "likely_source_zone": "active_face",
1300
+ "persistence_score": 0.72,
1301
+ "evidence_summary": "A recurring anomaly appears near the active working area.",
1302
+ "recommended_followup": "Inspect active face and nearby gas capture."
1303
+ }
1304
+ }
1305
+ ```
1306
+
1307
+ #### F. Fetch evidence pack
1308
+
1309
+ `GET /evidence-pack/{job_id}`
1310
+
1311
+ Returns:
1312
+ - JSON
1313
+ - optional image overlays
1314
+ - markdown summary
1315
+
1316
+ #### G. Watchlist scan
1317
+
1318
+ `POST /watchlists/{id}/scan`
1319
+
1320
+ Request:
1321
+ ```json
1322
+ {
1323
+ "timestamp": "2026-04-19T10:00:00Z"
1324
+ }
1325
+ ```
1326
+
1327
+ #### H. Export incidents
1328
+
1329
+ `GET /incidents/export?format=json`
1330
+
1331
+ ### 21.3 Internal adapters for SimSat
1332
+
1333
+ #### Sentinel current
1334
+ `GET {SIMSAT_BASE}/data/current/image/sentinel`
1335
+
1336
+ #### Sentinel historical
1337
+ `GET {SIMSAT_BASE}/data/image/sentinel`
1338
+
1339
+ Parameters:
1340
+ - lon
1341
+ - lat
1342
+ - timestamp
1343
+ - spectral_bands
1344
+ - size_km
1345
+ - return_type
1346
+ - window_seconds
1347
+
1348
+ #### Mapbox current
1349
+ `GET {SIMSAT_BASE}/data/current/image/mapbox`
1350
+
1351
+ #### Mapbox historical-style by satellite geometry
1352
+ `GET {SIMSAT_BASE}/data/image/mapbox`
1353
+
1354
+ ### 21.4 Backend job flow
1355
+
1356
+ For scans longer than a few seconds:
1357
+ - store job in queue
1358
+ - mark `queued`
1359
+ - process async
1360
+ - allow polling or websocket updates
1361
+
1362
+ For hackathon MVP:
1363
+ - Celery optional
1364
+ - RQ optional
1365
+ - plain `BackgroundTasks` in FastAPI often enough
1366
+
1367
+ ---
1368
+
1369
+ ## 22. Data Models
1370
+
1371
+ ### 22.1 Site
1372
+
1373
+ ```json
1374
+ {
1375
+ "site_id": "LF_IND_001",
1376
+ "name": "Demo Landfill A",
1377
+ "lat": 16.306,
1378
+ "lon": 80.436,
1379
+ "country": "IN",
1380
+ "operator": "Demo Operator",
1381
+ "metadata": {}
1382
+ }
1383
+ ```
1384
+
1385
+ ### 22.2 Image Asset
1386
+
1387
+ ```json
1388
+ {
1389
+ "asset_id": "img_001",
1390
+ "site_id": "LF_IND_001",
1391
+ "source": "sentinel",
1392
+ "timestamp_requested": "2026-04-19T10:00:00Z",
1393
+ "timestamp_captured": "2026-04-14T05:32:00Z",
1394
+ "cloud_cover": 9.2,
1395
+ "bands": ["red", "green", "blue"],
1396
+ "size_km": 5.0,
1397
+ "local_path": "cache/sentinel/LF_IND_001_20260419_rgb.png"
1398
+ }
1399
+ ```
1400
+
1401
+ ### 22.3 Candidate
1402
+
1403
+ ```json
1404
+ {
1405
+ "candidate_id": "cand_001",
1406
+ "site_id": "LF_IND_001",
1407
+ "job_id": "job_123",
1408
+ "bbox_norm": [0.25, 0.15, 0.47, 0.32],
1409
+ "candidate_score": 0.71,
1410
+ "temporal_recurrence": 0.64,
1411
+ "cloud_penalty": 0.12
1412
+ }
1413
+ ```
1414
+
1415
+ ### 22.4 Incident
1416
+
1417
+ ```json
1418
+ {
1419
+ "incident_id": "inc_001",
1420
+ "site_id": "LF_IND_001",
1421
+ "job_id": "job_123",
1422
+ "plume_likely": true,
1423
+ "confidence": 0.84,
1424
+ "bbox_norm": [0.32, 0.18, 0.56, 0.43],
1425
+ "likely_source_zone": "active_face",
1426
+ "persistence_score": 0.72,
1427
+ "evidence_summary": "A recurring anomaly appears near the active working area.",
1428
+ "recommended_followup": "Inspect active face and nearby gas capture.",
1429
+ "model_version": "lfm25vl450m-landfillsentry-lora-v1"
1430
+ }
1431
+ ```
1432
+
1433
+ ### 22.5 Evaluation Record
1434
+
1435
+ ```json
1436
+ {
1437
+ "eval_id": "eval_001",
1438
+ "split": "validation",
1439
+ "site_id": "LF_IND_001",
1440
+ "baseline_model": "lfm25vl450m-base",
1441
+ "candidate_model": "lfm25vl450m-landfillsentry-lora-v1",
1442
+ "incident_f1": 0.75,
1443
+ "zone_accuracy": 0.68,
1444
+ "bbox_iou": 0.59,
1445
+ "json_valid_rate": 0.97
1446
+ }
1447
+ ```
1448
+
1449
+ ---
1450
+
1451
+ ## 23. Deployment and Infrastructure
1452
+
1453
+ ### 23.1 MVP deployment shape
1454
+
1455
+ Use three runtime components:
1456
+
1457
+ 1. **SimSat**
1458
+ 2. **LandfillSentry backend**
1459
+ 3. **Frontend UI**
1460
+
1461
+ Optional fourth:
1462
+ 4. **Model-serving container**
1463
+
1464
+ ### 23.2 Recommended local setup
1465
+
1466
+ ```mermaid
1467
+ flowchart LR
1468
+ A[Docker Compose] --> B[SimSat Dashboard]
1469
+ A --> C[SimSat API]
1470
+ A --> D[Backend API]
1471
+ A --> E[Frontend]
1472
+ A --> F[Postgres/SQLite]
1473
+ ```
1474
+
1475
+ ### 23.3 Hosted setup
1476
+
1477
+ For hackathon demo you can host:
1478
+ - frontend on Vercel or Netlify
1479
+ - backend on Railway, Render, Fly.io, or a GPU-backed VM
1480
+ - training on Modal
1481
+ - inference on a dedicated GPU instance or local GPU
1482
+
1483
+ ### 23.4 Inference options
1484
+
1485
+ #### Option A: Transformers native
1486
+ Best for:
1487
+ - ease of implementation
1488
+ - direct control
1489
+ - hackathon reproducibility
1490
+
1491
+ #### Option B: vLLM
1492
+ Best for:
1493
+ - higher throughput
1494
+ - production-style GPU serving
1495
+
1496
+ #### Option C: ONNX Runtime
1497
+ Best for:
1498
+ - edge or CPU experimentation
1499
+ - portability
1500
+
1501
+ #### Option D: llama.cpp with GGUF
1502
+ Best for:
1503
+ - CPU-only fallback demos
1504
+ - smaller local footprints
1505
+
1506
+ ### 23.5 Recommended inference path for MVP
1507
+
1508
+ Use **Transformers** for first implementation. Add ONNX or GGUF only if needed later.
1509
+
1510
+ ---
1511
+
1512
+ ## 24. GPU and Training Plan
1513
+
1514
+ ### 24.1 Training target
1515
+
1516
+ Train one useful, stable LoRA adapter rather than many weak experiments.
1517
+
1518
+ ### 24.2 Why Modal is a good option
1519
+
1520
+ Modal provides GPU-backed Python workflows and has public examples for Unsloth-based fine-tuning. This is a practical way to run LoRA jobs without building heavy infrastructure.
1521
+ Source: [Modal Unsloth example](https://modal.com/docs/examples/unsloth_finetune)
1522
+
1523
+ ### 24.3 Suggested training workflow
1524
+
1525
+ 1. Prepare panel images and JSON labels.
1526
+ 2. Store dataset as local files or object storage.
1527
+ 3. Create a training script using Transformers + PEFT + Unsloth.
1528
+ 4. Launch on Modal or another GPU provider.
1529
+ 5. Save adapter weights.
1530
+ 6. Merge or load adapter at inference time.
1531
+ 7. Benchmark against base model.
1532
+
1533
+ ### 24.4 Hardware guidance
1534
+
1535
+ For hackathon scope:
1536
+ - one mid-range GPU is likely enough for LoRA fine-tuning of 450M model
1537
+ - inference can run on a single consumer GPU or a CPU-friendly quantized deployment depending speed requirements
1538
+
1539
+ ### 24.5 Training artifacts to save
1540
+
1541
+ - adapter weights
1542
+ - config file
1543
+ - training script
1544
+ - dataset manifest
1545
+ - eval results
1546
+ - sample outputs
1547
+
1548
+ These are important for judging because documented methodology is rewarded.
1549
+
1550
+ ---
1551
+
1552
+ ## 25. Implementation Roadmap
1553
+
1554
+ ### 25.1 MVP milestone sequence
1555
+
1556
+ #### Milestone 1: Base system skeleton
1557
+ - set up SimSat locally
1558
+ - create backend skeleton
1559
+ - add site registry
1560
+ - fetch imagery successfully
1561
+
1562
+ #### Milestone 2: Preprocessing
1563
+ - cache images
1564
+ - compute temporal history
1565
+ - add cloud filtering
1566
+ - create panel builder
1567
+
1568
+ #### Milestone 3: Candidate generation
1569
+ - implement heuristic anomaly stage
1570
+ - integrate Eucalyptus if possible
1571
+ - output candidate bbox
1572
+
1573
+ #### Milestone 4: Base model inference
1574
+ - run LFM2.5-VL-450M with prompt only
1575
+ - force JSON schema
1576
+ - visualize results
1577
+
1578
+ #### Milestone 5: Fine-tuning
1579
+ - prepare narrow SFT dataset
1580
+ - train LoRA
1581
+ - compare with base
1582
+
1583
+ #### Milestone 6: UI and demo polish
1584
+ - operator dashboard
1585
+ - overlays
1586
+ - evidence pack export
1587
+ - rehearsed demo
1588
+
1589
+ ### 25.2 Compressed hackathon sprint plan
1590
+
1591
+ #### Day 1
1592
+ - SimSat setup
1593
+ - imagery fetch working
1594
+ - choose 3 to 5 demo sites
1595
+ - define schemas
1596
+
1597
+ #### Day 2
1598
+ - historical retrieval
1599
+ - panel builder
1600
+ - basic UI
1601
+ - candidate heuristics
1602
+
1603
+ #### Day 3
1604
+ - VLM prompt-only pipeline
1605
+ - end-to-end first demo
1606
+
1607
+ #### Day 4
1608
+ - dataset prep
1609
+ - synthetic examples
1610
+ - LoRA fine-tuning
1611
+
1612
+ #### Day 5
1613
+ - evaluation
1614
+ - error fixing
1615
+ - better overlays
1616
+
1617
+ #### Day 6
1618
+ - demo script
1619
+ - evidence export
1620
+ - architecture diagrams
1621
+
1622
+ #### Day 7
1623
+ - stabilization
1624
+ - dry runs
1625
+ - submission assets
1626
+
1627
+ ---
1628
+
1629
+ ## 26. Repository Structure
1630
+
1631
+ A clean repo structure will save time.
1632
+
1633
+ ```text
1634
+ landfillsentry-ops/
1635
+ ├─ README.md
1636
+ ├─ docs/
1637
+ │ ├─ architecture.md
1638
+ │ ├─ demo-script.md
1639
+ │ └─ evaluation.md
1640
+ ├─ apps/
1641
+ │ ├─ api/
1642
+ │ │ ├─ main.py
1643
+ │ │ ├─ routes/
1644
+ │ │ ├─ schemas/
1645
+ │ │ ├─ services/
1646
+ │ │ └─ db/
1647
+ │ └─ web/
1648
+ │ ├─ src/
1649
+ │ └─ public/
1650
+ ├─ ml/
1651
+ │ ├─ candidate_generation/
1652
+ │ ├─ panel_builder/
1653
+ │ ├─ vlm/
1654
+ │ ├─ training/
1655
+ │ └─ evaluation/
1656
+ ├─ data/
1657
+ │ ├─ raw/
1658
+ │ ├─ processed/
1659
+ │ ├─ cache/
1660
+ │ ├─ labels/
1661
+ │ └─ manifests/
1662
+ ├─ notebooks/
1663
+ │ ├─ simsat_fetch.ipynb
1664
+ │ ├─ candidate_debug.ipynb
1665
+ │ ├─ panel_examples.ipynb
1666
+ │ └─ eval_dashboard.ipynb
1667
+ ├─ scripts/
1668
+ │ ├─ fetch_site_history.py
1669
+ │ ├─ build_panels.py
1670
+ │ ├─ run_inference.py
1671
+ │ ├─ train_lora.py
1672
+ │ └─ benchmark_models.py
1673
+ ├─ infra/
1674
+ │ ├─ docker/
1675
+ │ ├─ compose/
1676
+ │ └─ modal/
1677
+ ├─ tests/
1678
+ │ ├─ test_api.py
1679
+ │ ├─ test_panel_builder.py
1680
+ │ ├─ test_schema_validation.py
1681
+ │ └─ test_inference_smoke.py
1682
+ └─ assets/
1683
+ ├─ demo_sites/
1684
+ ├─ screenshots/
1685
+ └─ diagrams/
1686
+ ```
1687
+
1688
+ ---
1689
+
1690
+ ## 27. Engineering Work Breakdown
1691
+
1692
+ ### 27.1 Backend engineer
1693
+ - FastAPI routes
1694
+ - job orchestration
1695
+ - site registry
1696
+ - result storage
1697
+ - schema validation
1698
+
1699
+ ### 27.2 ML engineer
1700
+ - candidate generation
1701
+ - panel builder
1702
+ - inference logic
1703
+ - LoRA fine-tuning
1704
+ - evaluation
1705
+
1706
+ ### 27.3 Frontend engineer
1707
+ - watchlist view
1708
+ - site detail panel
1709
+ - bbox overlay
1710
+ - evidence card
1711
+ - demo polish
1712
+
1713
+ ### 27.4 Product/demo owner
1714
+ - narrative
1715
+ - site selection
1716
+ - benchmarks
1717
+ - submission materials
1718
+ - final walkthrough
1719
+
1720
+ ### 27.5 If only one or two people
1721
+ Priority order:
1722
+ 1. end-to-end scan pipeline
1723
+ 2. structured JSON output
1724
+ 3. UI overlay
1725
+ 4. fine-tuning
1726
+ 5. evaluation polish
1727
+ 6. stretch features
1728
+
1729
+ ---
1730
+
1731
+ ## 28. Risks and Mitigations
1732
+
1733
+ ### 28.1 Risk: Sentinel image not available
1734
+ Cause:
1735
+ - ocean or unsuitable location
1736
+ - no image in time window
1737
+
1738
+ Mitigation:
1739
+ - use historical endpoint with wider window
1740
+ - maintain backup demo sites
1741
+ - pre-cache assets
1742
+
1743
+ ### 28.2 Risk: Cloud cover too high
1744
+ Mitigation:
1745
+ - filter scenes by cloud cover
1746
+ - use last acceptable scene
1747
+ - show cloud penalty in UI
1748
+ - preselect demo cases
1749
+
1750
+ ### 28.3 Risk: Candidate engine too noisy
1751
+ Mitigation:
1752
+ - increase threshold
1753
+ - restrict to facility polygon
1754
+ - use recurrence score
1755
+ - add Mapbox-informed spatial prior
1756
+
1757
+ ### 28.4 Risk: VLM output invalid JSON
1758
+ Mitigation:
1759
+ - use strong schema prompts
1760
+ - add parser-retry loop
1761
+ - validate with Pydantic
1762
+ - clamp fallback outputs
1763
+
1764
+ ### 28.5 Risk: Fine-tuning does not help enough
1765
+ Mitigation:
1766
+ - narrow the task further
1767
+ - reduce output diversity
1768
+ - improve label quality
1769
+ - train on fewer but cleaner examples
1770
+ - compare structured tasks, not open-ended text
1771
+
1772
+ ### 28.6 Risk: Overclaiming science
1773
+ Mitigation:
1774
+ - describe product as triage and prioritization
1775
+ - avoid emission-rate claims unless validated
1776
+ - clearly separate candidate signal from final field confirmation
1777
+
1778
+ ### 28.7 Risk: Demo instability
1779
+ Mitigation:
1780
+ - cache results
1781
+ - precompute panels
1782
+ - host a known-good inference path
1783
+ - have static fallback screenshots and exported JSON
1784
+
1785
+ ---
1786
+
1787
+ ## 29. Stretch Features
1788
+
1789
+ These are optional and should not distract from the MVP.
1790
+
1791
+ ### 29.1 WorkFace Radar
1792
+ A sub-view specifically focused on active-face localization, inspired by emerging findings that open or active landfill surfaces are often major methane source regions.
1793
+ Source: [Carbon Mapper work-face article](https://carbonmapper.org/articles/landfill-work-face-emissions)
1794
+
1795
+ ### 29.2 Operator prioritization queue
1796
+ Rank alerts across sites by:
1797
+ - confidence
1798
+ - persistence
1799
+ - recurrence
1800
+ - proximity to active zones
1801
+
1802
+ ### 29.3 Evidence-pack PDF or markdown export
1803
+ Generate an operator-ready report:
1804
+ - image panels
1805
+ - bbox overlay
1806
+ - summary
1807
+ - recommended action
1808
+
1809
+ ### 29.4 Natural-language chat over incidents
1810
+ Allow user to ask:
1811
+ - “Why was this flagged?”
1812
+ - “Show the last 3 similar incidents.”
1813
+ - “Which sites have persistent alerts?”
1814
+
1815
+ ### 29.5 Segmentation assist
1816
+ Use SamGeo or similar tools for better facility-zone mapping and overlay visuals.
1817
+
1818
+ ---
1819
+
1820
+ ## 30. Submission Strategy
1821
+
1822
+ ### 30.1 What judges need to see
1823
+
1824
+ Judges do not just need “a smart model.” They need:
1825
+ - clear problem
1826
+ - strong fit to SimSat
1827
+ - obvious fit to Liquid
1828
+ - a working app
1829
+ - measurable fine-tuning story
1830
+
1831
+ ### 30.2 Submission assets checklist
1832
+
1833
+ #### Required
1834
+ - running application
1835
+ - code repository
1836
+ - demo video
1837
+ - architecture explanation
1838
+ - fine-tuning notes
1839
+ - reproducible instructions
1840
+
1841
+ #### Recommended
1842
+ - benchmark table
1843
+ - example alert exports
1844
+ - before-vs-after fine-tuning outputs
1845
+ - clean UI screenshots
1846
+ - short one-page summary
1847
+
1848
+ ### 30.3 Best demo narrative
1849
+
1850
+ Use this storyline:
1851
+
1852
+ 1. Landfill methane is large and under-addressed.
1853
+ 2. Operators need triage, not just raw imagery.
1854
+ 3. SimSat gives us Sentinel-2 + Mapbox.
1855
+ 4. We generate methane-risk candidates.
1856
+ 5. We fine-tune Liquid’s LFM2.5-VL to convert evidence into a structured incident object.
1857
+ 6. The result tells the operator where to inspect first.
1858
+
1859
+ ### 30.4 Best claims to make
1860
+
1861
+ Strong, defensible claims:
1862
+ - “We use DPhi imagery as the core input.”
1863
+ - “We fine-tuned Liquid’s VLM on a narrow satellite triage task.”
1864
+ - “Our output is a grounded incident object.”
1865
+ - “The system is designed for operator actionability.”
1866
+
1867
+ Claims to avoid:
1868
+ - “We accurately quantify methane mass flow for regulatory use.”
1869
+ - “We replace field inspection.”
1870
+ - “We are a full MRV platform.”
1871
+
1872
+ ---
1873
+
1874
+ ## 31. Final Build Recommendation
1875
+
1876
+ ### 31.1 The version to build
1877
+
1878
+ **Build the operator-first version.**
1879
+
1880
+ Do not build:
1881
+ - a generic emissions portal
1882
+ - a policy dashboard
1883
+ - an insurer analytics portal
1884
+ - a research-only methane notebook
1885
+
1886
+ Those are weaker first demos.
1887
+
1888
+ ### 31.2 The best MVP definition
1889
+
1890
+ A successful MVP for this hackathon does the following:
1891
+
1892
+ 1. user selects a landfill
1893
+ 2. system retrieves historical and current imagery from SimSat
1894
+ 3. candidate stage proposes a suspicious region
1895
+ 4. evidence panel is constructed
1896
+ 5. fine-tuned LFM2.5-VL-450M returns valid JSON
1897
+ 6. UI shows the bbox, likely zone, summary, and recommended action
1898
+ 7. export function produces a clean evidence pack
1899
+
1900
+ If you achieve those seven things cleanly, the product will already feel much stronger than many hackathon entries.
1901
+
1902
+ ### 31.3 What to freeze early
1903
+
1904
+ Freeze these early:
1905
+ - JSON schema
1906
+ - prompt contract
1907
+ - evidence panel format
1908
+ - site list for demo
1909
+ - evaluation metrics
1910
+ - UI layout
1911
+
1912
+ Do not keep changing the output task once training starts.
1913
+
1914
+ ### 31.4 Final recommendation in one paragraph
1915
+
1916
+ The best path is to build **LandfillSentry Ops** as a narrow, operator-facing methane incident API with a simple UI. Use SimSat Sentinel-2 imagery for temporal and multispectral evidence, Mapbox for facility context, a hybrid candidate-generation stage for likely methane event proposals, and a fine-tuned LFM2.5-VL-450M model for grounded, structured incident generation. Keep the task framed as triage and prioritization, demonstrate measurable gains over the base model, and show a crisp end-to-end operator workflow. That is the version most likely to score well across all major judging dimensions.
1917
+
1918
+ ---
1919
+
1920
+ ## 32. References
1921
+
1922
+ 1. DPhi Space. **SimSat GitHub repository**.
1923
+ https://github.com/DPhi-Space/SimSat
1924
+
1925
+ 2. Liquid AI. **LFM2.5-VL-450M model card**.
1926
+ https://huggingface.co/LiquidAI/LFM2.5-VL-450M
1927
+
1928
+ 3. Liquid AI. **LFM2.5-VL-450M blog post**.
1929
+ https://www.liquid.ai/blog/lfm2-5-vl-450m
1930
+
1931
+ 4. Orbio Earth. **Project Eucalyptus GitHub**.
1932
+ https://github.com/Orbio-Earth/Project-Eucalyptus
1933
+
1934
+ 5. Orbio Earth. **Project Eucalyptus documentation**.
1935
+ https://orbio-earth.github.io/Project-Eucalyptus/
1936
+
1937
+ 6. Jackson et al. **MEthane Tracking Emissions Reference (METER): A global database of methane-emitting infrastructure**.
1938
+ https://essd.copernicus.org/preprints/essd-2026-124/essd-2026-124.pdf
1939
+
1940
+ 7. ESA Space Solutions. **Landfill Methane Monitor (LMM)**.
1941
+ https://business.esa.int/projects/landfill-methane-monitor-lmm
1942
+
1943
+ 8. Clean Air Task Force. **Three trends shaping waste sector methane mitigation in 2026**.
1944
+ https://www.catf.us/2026/03/three-trends-shaping-waste-sector-methane-mitigation-2026/
1945
+
1946
+ 9. Carbon Mapper. **Landfill work face emissions present major methane mitigation opportunities**.
1947
+ https://carbonmapper.org/articles/landfill-work-face-emissions
1948
+
1949
+ 10. Carbon Mapper. **Main site / data and impact framing**.
1950
+ https://carbonmapper.org/
1951
+
1952
+ 11. WasteMAP. **Waste methane assessment platform**.
1953
+ https://wastemap.earth/
1954
+
1955
+ 12. RMI. **Introducing WasteMAP**.
1956
+ https://rmi.org/introducing-wastemap-a-new-tool-to-track-and-reduce-waste-methane-emissions/
1957
+
1958
+ 13. UNEP. **Methane Alert and Response System (MARS)**.
1959
+ https://www.unep.org/topics/energy/methane/methane-alert-and-response-system-mars
1960
+
1961
+ 14. UNEP. **How MARS works**.
1962
+ https://www.unep.org/topics/energy/methane/how-mars-works
1963
+
1964
+ 15. TorchGeo. **Official site**.
1965
+ https://torchgeo.org/
1966
+
1967
+ 16. TorchGeo Docs. **Official documentation**.
1968
+ https://torchgeo.readthedocs.io/
1969
+
1970
+ 17. TerraTorch. **GitHub repository**.
1971
+ https://github.com/terrastackai/terratorch
1972
+
1973
+ 18. IBM Research. **Simplifying geospatial AI with TerraTorch 1.0**.
1974
+ https://research.ibm.com/blog/simplifying-geospatial-ai-with-terra-torch-1-0
1975
+
1976
+ 19. SamGeo. **Documentation**.
1977
+ https://samgeo.gishub.org/
1978
+
1979
+ 20. Modal. **Unsloth fine-tuning example**.
1980
+ https://modal.com/docs/examples/unsloth_finetune
1981
+
1982
+ 21. Copernicus Sentinel Success Story. **Sentinel-2 data help monitor methane point source emissions**.
1983
+ https://sentinels.copernicus.eu/web/success-stories/-/copernicus-sentinel-2-data-help-monitor-methane-point-source-emissions
1984
+
1985
+ 22. Copernicus Sentinel Success Story. **Sentinel-2 helps in methane monitoring**.
1986
+ https://sentinels.copernicus.eu/web/success-stories/-/copernicus-sentinel-2-helps-in-methane-monitoring
1987
+
1988
+ 23. Nature. **Global satellite survey reveals uncertainty in landfill methane emissions and waste-site area**.
1989
+ https://www.nature.com/articles/s41586-025-09683-8
1990
+
1991
+ 24. USGS. **Sentinel-2 chlorophyll-a water quality monitoring review**.
1992
+ https://www.usgs.gov/publications/sentinel-2-chlorophyll-a-water-quality-monitoring-a-review-validation-evidence-and
1993
+
1994
+ 25. NASA Earthdata. **Global Automated Bloom Analysis Network (GABAN)**.
1995
+ https://www.earthdata.nasa.gov/data/projects/nsite/solutions/gaban
1996
+
1997
+ ---
1998
+
1999
+ ## Appendix A: Environment Variables
2000
+
2001
+ ```bash
2002
+ SIMSAT_API_BASE=http://localhost:9005
2003
+ SIMSAT_DASHBOARD_BASE=http://localhost:8000
2004
+ MAPBOX_ACCESS_TOKEN=your_token_here
2005
+ HF_MODEL_ID=LiquidAI/LFM2.5-VL-450M
2006
+ HF_TOKEN=your_hf_token
2007
+ DATABASE_URL=sqlite:///./landfillsentry.db
2008
+ CACHE_DIR=./data/cache
2009
+ MODEL_DEVICE=cuda
2010
+ USE_EUCALYPTUS=true
2011
+ ```
2012
+
2013
+ ---
2014
+
2015
+ ## Appendix B: Minimal Python Pydantic Schema
2016
+
2017
+ ```python
2018
+ from typing import Literal, List
2019
+ from pydantic import BaseModel, Field
2020
+
2021
+ class IncidentOutput(BaseModel):
2022
+ plume_likely: bool
2023
+ confidence: float = Field(ge=0.0, le=1.0)
2024
+ bbox_norm: List[float] = Field(min_length=4, max_length=4)
2025
+ likely_source_zone: Literal[
2026
+ "active_face",
2027
+ "cover_system",
2028
+ "perimeter",
2029
+ "gas_infrastructure",
2030
+ "unknown"
2031
+ ]
2032
+ persistence_score: float = Field(ge=0.0, le=1.0)
2033
+ evidence_summary: str
2034
+ recommended_followup: str
2035
+ ```
2036
+
2037
+ ---
2038
+
2039
+ ## Appendix C: Example Inference Pseudocode
2040
+
2041
+ ```python
2042
+ def analyze_site(site_id: str, timestamp: str):
2043
+ current = fetch_current_sentinel(site_id, timestamp)
2044
+ history = fetch_history_sentinel(site_id, timestamp, days=30)
2045
+ mapbox = fetch_mapbox_context(site_id, timestamp)
2046
+
2047
+ clean_history = filter_cloudy_scenes(history)
2048
+ candidate = generate_candidate(current, clean_history)
2049
+
2050
+ panel = build_evidence_panel(
2051
+ current=current,
2052
+ history=clean_history,
2053
+ mapbox=mapbox,
2054
+ candidate=candidate
2055
+ )
2056
+
2057
+ prompt = build_prompt(candidate)
2058
+ raw_output = run_lfm25vl(panel, prompt)
2059
+ incident = validate_and_normalize(raw_output)
2060
+
2061
+ save_incident(site_id, incident, panel)
2062
+ return incident
2063
+ ```
2064
+
2065
+ ---
2066
+
2067
+ ## Appendix D: First-Week Acceptance Criteria
2068
+
2069
+ By the end of the first full build week, the project should satisfy:
2070
+
2071
+ - SimSat running locally
2072
+ - imagery retrieval working for at least 3 demo landfill sites
2073
+ - evidence panels generated automatically
2074
+ - one candidate generation path implemented
2075
+ - LFM2.5-VL base model producing valid JSON
2076
+ - UI showing current image, bbox, and summary
2077
+ - one end-to-end demo path recorded successfully
2078
+
2079
+ ---
2080
+
2081
+ ## Appendix E: Optional Future Research Directions
2082
+
2083
+ After the hackathon, future extensions may include:
2084
+ - better plume physics integration
2085
+ - wind-aware incident ranking
2086
+ - coupling with onsite sensor logs
2087
+ - quantification confidence intervals
2088
+ - active learning loops for operator feedback
2089
+ - multi-site global prioritization
2090
+
2091
+ These are future opportunities, not MVP requirements.
2092
+
2093
+ ---
project_docs/LandfillSentry_Ops_Master_Project_Plan.md ADDED
@@ -0,0 +1,1959 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # LandfillSentry Ops Master Project Plan
2
+
3
+ > Canonical execution document for building LandfillSentry Ops as a hackathon-winning MVP with a credible path to a startup-grade product.
4
+ >
5
+ > Planning basis:
6
+ > - Product and architecture source: `LandfillSentry_Ops_Detailed_Report.md`
7
+ > - Frozen defaults and scope decisions: `LandfillSentry_Ops_Answers_to_Open_Questions.md`
8
+ > - Planning structure reference: `UNIVERSAL_LLM_PROJECT_PLAN_TEMPLATE.md`
9
+
10
+ ### Operating Mode
11
+
12
+ Use this document as a 2-layer system:
13
+
14
+ 1. Master Plan: strategy, constraints, architecture, phases, testing rules, and acceptance logic.
15
+ 2. Execution Cards: small, timeboxed tasks used during implementation.
16
+
17
+ Rules:
18
+ - Keep this file as the single source of truth.
19
+ - No phase is complete until it passes its integration checkpoint.
20
+ - Every major capability must support both a live path and a cached offline path.
21
+ - Every two phases must end with one full end-to-end scan.
22
+ - Prefer one stable implementation path over multiple half-working alternatives.
23
+
24
+ ### Lean Usage Mode for This Project
25
+
26
+ Because LandfillSentry is both product-heavy and system-heavy, the following sections are mandatory for this plan:
27
+
28
+ - `0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 18, 19`
29
+
30
+ The following sections are included because they materially reduce execution risk:
31
+
32
+ - `13, 14, 15`
33
+
34
+ ---
35
+
36
+ ## 0) Project Identity
37
+
38
+ - **Project Name:** `LandfillSentry Ops`
39
+ - **Status:** `in progress`
40
+ - **Version:** `Master Plan v1.0 - Full Draft`
41
+ - **Primary Mode:** `Hackathon MVP first, product-grade foundation second`
42
+ - **Core Product Identity:** `Operator-first landfill methane incident triage copilot`
43
+ - **One-line Memory Hook:** `LandfillSentry turns satellite imagery into an explainable methane incident object that tells operators where to inspect first.`
44
+
45
+ ### 0.1 Strategic Positioning
46
+
47
+ LandfillSentry Ops is not a generic remote sensing dashboard, and it is not a regulatory methane quantification system.
48
+
49
+ It is:
50
+ - a triage and prioritization product,
51
+ - built around landfill operations,
52
+ - using satellite imagery as the core evidence source,
53
+ - with a structured incident object as the product output,
54
+ - and a human review step before incidents become official.
55
+
56
+ ### 0.2 Product Thesis
57
+
58
+ Existing methane monitoring ecosystems increasingly provide detections, maps, and broad emissions context. Landfill operators still lack a lightweight operational workflow that converts mixed satellite evidence into a facility-specific, explainable, inspectable incident recommendation.
59
+
60
+ LandfillSentry exists to close that gap.
61
+
62
+ ---
63
+
64
+ ## 1) Goal
65
+
66
+ ### Primary Goal
67
+
68
+ Build a hackathon-winning MVP that scans a watchlist of landfill sites using SimSat imagery, generates methane-risk candidates, converts compact evidence panels into structured incident objects using Liquid's `LFM2.5-VL-450M`, and shows operators which zone to inspect first.
69
+
70
+ ### Secondary Goals
71
+
72
+ - Demonstrate a credible fine-tuning story rather than a prompt-only demo.
73
+ - Prove operator usefulness through structured outputs, explainable evidence, and a clear action recommendation.
74
+ - Build the architecture so it can realistically evolve into a startup-grade product after the hackathon.
75
+ - Produce a polished demo that is robust to live failures through cached assets and offline-safe flows.
76
+
77
+ ### 1.1 Definition of MVP Success
78
+
79
+ The MVP succeeds if it can do the following reliably for a small frozen demo set:
80
+
81
+ 1. retrieve current and historical imagery for a selected site,
82
+ 2. generate a plausible methane-risk candidate region,
83
+ 3. build an evidence panel for model interpretation,
84
+ 4. return valid structured incident JSON,
85
+ 5. display the incident clearly in a watchlist-first UI,
86
+ 6. allow human review before publication,
87
+ 7. export a clean evidence summary,
88
+ 8. and survive demo conditions using both live and cached execution paths.
89
+
90
+ ---
91
+
92
+ ## 2) Context & Problem Statement
93
+
94
+ ### Current State
95
+
96
+ The waste sector is a large methane source, and landfill emissions are increasingly visible through remote sensing and public methane initiatives. Yet most available systems are designed for mapping, scientific interpretation, portfolio-level visibility, or policy action rather than day-to-day operational triage by landfill teams.
97
+
98
+ Existing tools can tell users that methane matters or that a site may be emitting. They often do not compress that evidence into a site-specific operational question:
99
+
100
+ `Where should my team inspect first, and why?`
101
+
102
+ ### Problem
103
+
104
+ Landfill operators face three linked problems:
105
+
106
+ 1. methane evidence arrives as raw or semi-processed imagery rather than operational guidance,
107
+ 2. interpreting site structure, source zone, and urgency requires manual reasoning,
108
+ 3. false positives or ambiguous alerts quickly destroy trust if outputs are not explainable and reviewable.
109
+
110
+ ### Why It Matters Now
111
+
112
+ - Waste methane is gaining more policy and operational attention globally.
113
+ - Remote sensing is increasingly being used to guide waste-sector methane action.
114
+ - Landfill work-face and facility-zone attribution are becoming more important for mitigation prioritization.
115
+ - The hackathon stack creates an unusually strong fit: `SimSat` for imagery, `Liquid` for compact grounded multimodal reasoning, and open methane tooling such as Project Eucalyptus for domain bootstrapping.
116
+
117
+ ### Who Is Impacted
118
+
119
+ - Primary: landfill operations managers and site operations leads
120
+ - Secondary: environmental compliance leads, consultants, municipalities, insurers, and climate program teams
121
+
122
+ ### 2.1 Product Value Statement
123
+
124
+ LandfillSentry reduces operator cognitive load by turning imagery, temporal comparison, and contextual metadata into a compact incident object that can be reviewed, prioritized, and acted on quickly.
125
+
126
+ ### 2.2 Explicit Non-Claims
127
+
128
+ LandfillSentry does not claim to provide:
129
+
130
+ - regulatory-grade methane quantification,
131
+ - legal attribution of emissions,
132
+ - continuous coverage,
133
+ - full atmospheric inversion,
134
+ - or autonomous final decision authority.
135
+
136
+ It is a triage copilot, not a final truth engine.
137
+
138
+ ---
139
+
140
+ ## 3) Constraints & Boundaries
141
+
142
+ ### Tech Stack Constraints
143
+
144
+ - **Imagery sources for MVP:** `SimSat` and `Mapbox` are both required imagery/context inputs.
145
+ - **Backend:** `FastAPI`
146
+ - **Frontend:** `React`
147
+ - **Storage:** `SQLite` first
148
+ - **Primary inference path:** `Transformers`
149
+ - **Primary model:** `LiquidAI/LFM2.5-VL-450M`
150
+ - **Model registry and artifact source:** `Hugging Face` is required for model and adapter distribution.
151
+ - **Training method:** `LoRA` or similarly lightweight adapter tuning
152
+ - **Training infrastructure:** `Modal GPU` is required for training runs.
153
+ - **Execution model:** synchronous inference for MVP with caching
154
+
155
+ ### Performance Constraints
156
+
157
+ - Demo flows must feel responsive enough for judge interaction.
158
+ - Live scan latency can be several seconds if clearly signaled, but cached demo paths should be near-instant.
159
+ - JSON validation and rendering must remain deterministic even if model latency varies.
160
+
161
+ ### Security / Privacy / Licensing Constraints
162
+
163
+ - API tokens must never be hardcoded.
164
+ - SimSat, Mapbox, Hugging Face, and Modal credentials must be environment-driven.
165
+ - Model and dataset licenses must be reviewed and documented.
166
+ - Real sites may be used, but wording must avoid unvalidated legal or regulatory claims.
167
+ - Synthetic, weak, and manual labels must remain provenance-tracked.
168
+
169
+ ### Data Constraints
170
+
171
+ - Manual labeled data is limited to approximately `80-200` usable examples.
172
+ - One primary labeler is assumed.
173
+ - Negative examples are first-class and must be budgeted intentionally.
174
+ - Validation and demo splits must be frozen early.
175
+
176
+ ### Hackathon Constraints
177
+
178
+ - The system must run reliably under demo conditions.
179
+ - Fine-tuning is highly desirable, but the product needs a fallback path if the fine-tuned model underperforms.
180
+ - Architecture must support storytelling and judging clarity, not just technical completeness.
181
+
182
+ ### Non-Goals
183
+
184
+ - Full compliance workflow
185
+ - Multi-tenant enterprise administration
186
+ - Full atmospheric modeling
187
+ - Advanced job orchestration infrastructure
188
+ - Complete automated active learning loop
189
+ - Production-scale global monitoring
190
+ - A generalized methane platform spanning all facility classes in MVP
191
+
192
+ ### 3.1 Boundary Rule
193
+
194
+ If a feature does not directly improve one of the following, it is not MVP-critical:
195
+
196
+ - operator usefulness,
197
+ - valid incident generation,
198
+ - demo stability,
199
+ - fine-tuning credibility,
200
+ - or evaluation clarity.
201
+
202
+ ---
203
+
204
+ ## 4) Success Metrics (Measurable)
205
+
206
+ Directional metrics are preferred over overconfident hard claims at this stage. Final thresholds can be refined after the first end-to-end evaluation pass.
207
+
208
+ - [ ] **Metric 1: End-to-end Incident Reliability** - baseline: `not yet measured`, target: `stable valid JSON on >95% of frozen validation examples`, measurement: `schema validation pass rate across validation and golden fixtures`
209
+ - [ ] **Metric 2: Operator Usefulness** - baseline: `not yet measured`, target: `majority of reviewed incidents rated actionable by human rubric`, measurement: `manual scoring rubric on usefulness and explainability`
210
+ - [ ] **Metric 3: Null-Scene Trustworthiness** - baseline: `not yet measured`, target: `false positive rate below agreed threshold on negative split`, measurement: `negative-scene evaluation report`
211
+ - [ ] **Metric 4: Zone Guidance Quality** - baseline: `not yet measured`, target: `meaningful improvement over prompt-only baseline`, measurement: `source-zone accuracy / coarse zone agreement`
212
+ - [ ] **Metric 5: Demo Stability** - baseline: `not yet measured`, target: `100% success on frozen demo path`, measurement: `rehearsed runs on cached demo fixtures`
213
+ - [ ] **Metric 6: Model Improvement Story** - baseline: `base prompt-only model`, target: `fine-tuned model outperforms base on structured output reliability and human usefulness`, measurement: `baseline comparison table`
214
+
215
+ ### 4.1 Prioritized Metric Hierarchy
216
+
217
+ Metrics are not equally important. The project should optimize in this order:
218
+
219
+ 1. operator usefulness,
220
+ 2. JSON validity,
221
+ 3. null-scene trustworthiness,
222
+ 4. source-zone accuracy,
223
+ 5. bbox quality,
224
+ 6. persistence scoring quality.
225
+
226
+ ### 4.2 MVP Success Threshold Narrative
227
+
228
+ The MVP is considered strong if it can show:
229
+
230
+ - a believable operational workflow,
231
+ - high structured-output reliability,
232
+ - low embarrassing false positives on golden negatives,
233
+ - an understandable action recommendation,
234
+ - and a measurable improvement path from heuristics and base-model prompting to fine-tuned performance.
235
+
236
+ ---
237
+
238
+ ## 5) Architecture Snapshot
239
+
240
+ ### 5.1 System Components
241
+
242
+ - **API Gateway / Orchestrator**
243
+ - receives site scan requests,
244
+ - coordinates imagery retrieval, candidate generation, panel building, inference, validation, and persistence.
245
+
246
+ - **Site Registry**
247
+ - stores demo sites, watchlist metadata, coordinates, optional polygons, and status metadata.
248
+
249
+ - **Imagery Retrieval Service**
250
+ - fetches current and historical imagery from `SimSat`,
251
+ - retrieves required Mapbox context,
252
+ - caches responses and normalized assets.
253
+
254
+ - **Preprocessing & Quality Control**
255
+ - handles cloud filtering, band selection, temporal selection, normalization, and failure handling when imagery is weak or absent.
256
+
257
+ - **Candidate Generation Engine**
258
+ - produces one or more suspicious methane-risk candidate regions using hybrid logic:
259
+ - spectral heuristics,
260
+ - temporal differencing,
261
+ - optional ranking/refinement informed by methane-domain assets.
262
+
263
+ - **Evidence Panel Builder**
264
+ - combines current crop, methane-sensitive spectral composite, temporal comparison crop, required Mapbox context, and compact metadata into a stable multimodal input.
265
+
266
+ - **VLM Inference Service**
267
+ - runs `LFM2.5-VL-450M`,
268
+ - initially in prompt-only mode,
269
+ - then with a fine-tuned adapter path.
270
+
271
+ - **Incident Object Generator**
272
+ - validates and normalizes model output,
273
+ - computes priority and severity tiers,
274
+ - assigns review state,
275
+ - and stores structured records.
276
+
277
+ - **Results Store**
278
+ - persists sites, assets, candidates, incidents, feedback, and evaluation records.
279
+
280
+ - **React UI**
281
+ - watchlist-first workflow,
282
+ - drill-down site detail,
283
+ - evidence pack view,
284
+ - review and publication actions.
285
+
286
+ ### 5.2 Interfaces / Contracts
287
+
288
+ Core contract objects:
289
+
290
+ - `Site`
291
+ - `ImageAsset`
292
+ - `Candidate`
293
+ - `EvidencePanel`
294
+ - `Incident`
295
+ - `EvaluationRecord`
296
+ - `ReviewAction`
297
+
298
+ Contract rules:
299
+
300
+ - Incident outputs must always validate through typed schemas.
301
+ - Controlled enums should be used for fields like `priority_tier`, `severity_tier`, `review_status`, and `likely_source_zone`.
302
+ - API responses must be versionable and covered by `openapi.json`.
303
+ - Cached artifacts must be reusable across backend tests, UI smoke flows, and demo runs.
304
+
305
+ ### 5.3 API Contract Artifact (`openapi.json`)
306
+
307
+ Artifact policy:
308
+
309
+ - Keep a committed `openapi.json` at repo root.
310
+ - Refresh it whenever API contracts change.
311
+ - Treat stale contract drift as a blocker for frontend work.
312
+ - Contract tests must cover the main endpoints:
313
+ - health,
314
+ - register site,
315
+ - list sites,
316
+ - scan site,
317
+ - get result,
318
+ - fetch evidence pack,
319
+ - watchlist scan,
320
+ - export incidents.
321
+
322
+ ### 5.4 Data & State Strategy
323
+
324
+ - **Source of truth:** `SQLite` for MVP
325
+ - **Cache:** local filesystem + DB-linked asset metadata
326
+ - **Model artifacts:** stored separately and versioned by training run
327
+ - **Frozen artifacts:** demo panels, golden fixtures, evaluation manifests
328
+ - **Consistency model:** application-level consistency is acceptable for MVP; strict transactional complexity is unnecessary beyond core scan persistence
329
+
330
+ ### 5.5 Key Risks in Architecture
331
+
332
+ - `SimSat` imagery inconsistency or missing scenes
333
+ - cloud-heavy scenes degrading candidate quality
334
+ - model outputs becoming invalid or verbose
335
+ - weak candidate generation overwhelming the VLM
336
+ - Mapbox dependency becoming a hard runtime dependency if credentials or quotas fail
337
+ - evaluation drift if splits and fixtures are not frozen early
338
+
339
+ ### 5.6 Architectural Principle
340
+
341
+ The VLM should interpret evidence, not replace the full detection pipeline.
342
+
343
+ That means:
344
+
345
+ - candidate generation remains an explicit stage,
346
+ - evidence packing remains deterministic and inspectable,
347
+ - the VLM produces structured incident interpretation,
348
+ - and post-processing remains typed and auditable.
349
+
350
+ ### 5.7 Differentiation Snapshot
351
+
352
+ LandfillSentry should be positioned as:
353
+
354
+ - not a global methane portal like `WasteMAP`,
355
+ - not a government-facing methane notification system like `UNEP MARS`,
356
+ - not a broad remote sensing emissions visibility platform like `Carbon Mapper`,
357
+ - but an operator-first triage copilot that converts imagery into an actionable incident object for landfill teams.
358
+
359
+ ---
360
+
361
+ ## 6) Phase Plan
362
+
363
+ This plan uses nine phases. The phases are intentionally integration-aware rather than function-siloed.
364
+
365
+ ## Phase 1: Foundation Lock
366
+
367
+ ### Objective
368
+
369
+ Freeze product scope, schemas, demo-site strategy, repo structure, contracts, and testing rules before implementation complexity grows.
370
+
371
+ ### Deliverables
372
+
373
+ - [x] canonical master plan initialized
374
+ - [x] repo structure finalized
375
+ - [x] core schemas defined
376
+ - [x] `openapi.json` first draft generated
377
+ - [x] frozen demo-site selection process defined
378
+ - [x] testing and integration policy defined
379
+
380
+ ### In-Scope / Out-of-Scope
381
+
382
+ - **In scope:** planning freeze, repo conventions, contract design, fixture planning
383
+ - **Out of scope:** full production implementation
384
+
385
+ ### Dependencies
386
+
387
+ - **Requires:** detailed report, answers doc
388
+ - **Blocks:** all downstream implementation quality
389
+
390
+ ### Parts in This Phase
391
+
392
+ - `1.1` Product and workflow lock
393
+ - `1.2` Data and schema contract lock
394
+ - `1.3` Testing and integration policy lock
395
+
396
+ ### Phase Exit Criteria
397
+
398
+ - [x] Scope is frozen for MVP
399
+ - [x] JSON schema and API direction are frozen
400
+ - [x] Demo-site selection method is frozen
401
+ - [x] Golden fixture categories are defined
402
+ - [x] One integration checklist exists for future phases
403
+
404
+ ---
405
+
406
+ ## Phase 2: Site Registry, Imagery, and Cache
407
+
408
+ ### Objective
409
+
410
+ Create the stable acquisition layer for sites, current imagery, historical imagery, required Mapbox context, and offline caching.
411
+
412
+ ### Deliverables
413
+
414
+ - [x] site registry working
415
+ - [x] SimSat retrieval working for frozen demo sites
416
+ - [x] Mapbox retrieval working for frozen demo sites
417
+ - [x] caching layer working
418
+ - [x] basic cloud / missing-data handling working
419
+ - [x] live and cached retrieval path verified
420
+
421
+ ### In-Scope / Out-of-Scope
422
+
423
+ - **In scope:** site metadata, image fetching, cache persistence, retrieval errors
424
+ - **Out of scope:** final methane interpretation quality
425
+
426
+ ### Dependencies
427
+
428
+ - **Requires:** Phase 1 contracts
429
+ - **Blocks:** candidate generation, panel building, demo assets
430
+
431
+ ### Parts in This Phase
432
+
433
+ - `2.1` Site registry and watchlist model
434
+ - `2.2` SimSat imagery adapters
435
+ - `2.3` Cache and image asset persistence
436
+
437
+ ### Phase Exit Criteria
438
+
439
+ - [x] At least one positive and one negative demo site fetch cleanly
440
+ - [x] Mapbox context fetch and cache replay work for frozen demo sites
441
+ - [x] Cached replay works without live calls
442
+ - [x] Missing-data and cloud-heavy paths fail gracefully
443
+ - [x] API contract remains valid
444
+ - [x] Integration checkpoint with Phase 1 passes
445
+
446
+ ---
447
+
448
+ ## Phase 3: Candidate Generation and Zone Priors
449
+
450
+ ### Objective
451
+
452
+ Build the hybrid candidate engine that proposes suspicious regions and coarse source-zone hypotheses, using Phase 2 imagery assets from live/cached SimSat Sentinel (current + historical) and required Mapbox context.
453
+
454
+ ### Deliverables
455
+
456
+ - [x] heuristic candidate stage implemented
457
+ - [x] temporal differencing implemented
458
+ - [x] coarse source-zone prior logic implemented
459
+ - [x] candidate scoring contract finalized
460
+ - [x] positive, negative, cloudy, and missing-data fixtures supported
461
+ - [x] live candidate path verified against SimSat current Sentinel (`/data/current/image/sentinel`), historical Sentinel (`/data/image/sentinel`), and current Mapbox context (`/data/current/image/mapbox`)
462
+
463
+ ### In-Scope / Out-of-Scope
464
+
465
+ - **In scope:** suspicious-region proposal, simple ranking, zone priors, and candidate operation on both live and cached imagery bundles
466
+ - **Out of scope:** final full incident interpretation
467
+
468
+ ### Dependencies
469
+
470
+ - **Requires:** imagery and cache layer, SimSat live endpoint availability (or source bootstrap runner), and Mapbox token for live context retrieval
471
+ - **Blocks:** evidence panels and model inference
472
+
473
+ ### Parts in This Phase
474
+
475
+ - `3.1` Heuristic anomaly generation
476
+ - `3.2` Temporal recurrence features
477
+ - `3.3` Zone prior and candidate scoring
478
+
479
+ ### Phase Exit Criteria
480
+
481
+ - [x] Candidate object emits valid schema
482
+ - [x] Null-scene behavior is acceptable on golden negatives
483
+ - [x] Candidate outputs are inspectable in logs or notebook form
484
+ - [x] Cached and live candidate paths both run
485
+ - [x] Live Phase 3 scan path runs with SimSat current+historical Sentinel and required current Mapbox context
486
+ - [x] Integration checkpoint with Phases 1-2 passes
487
+
488
+ ---
489
+
490
+ ## Phase 4: Evidence Panels and Prompt Contract
491
+
492
+ ### Objective
493
+
494
+ Build the deterministic evidence-packing layer and freeze the prompt / output contract used for base-model inference and later fine-tuning.
495
+
496
+ ### Deliverables
497
+
498
+ - [x] evidence panel format frozen
499
+ - [x] panel builder implemented
500
+ - [x] required Mapbox panel input integrated
501
+ - [x] metadata text block finalized
502
+ - [x] prompt contract finalized
503
+ - [x] output schema validation loop implemented
504
+
505
+ ### In-Scope / Out-of-Scope
506
+
507
+ - **In scope:** panel composition, prompt format, schema validation
508
+ - **Out of scope:** fine-tuned model quality gains
509
+
510
+ ### Dependencies
511
+
512
+ - **Requires:** candidate outputs and imagery
513
+ - **Blocks:** base inference, training dataset format
514
+
515
+ ### Parts in This Phase
516
+
517
+ - `4.1` Panel composition pipeline
518
+ - `4.2` Prompt and metadata contract
519
+ - `4.3` Output schema and retry policy
520
+
521
+ ### Phase Exit Criteria
522
+
523
+ - [x] Panels render consistently for frozen fixtures
524
+ - [x] Every panel includes required Mapbox context artifact
525
+ - [x] Prompt contract is frozen for training
526
+ - [x] Incident schema validates on canned responses
527
+ - [x] Live and cached panel-building paths both work
528
+ - [x] First full end-to-end scan checkpoint passes across Phases 1-4
529
+
530
+ ---
531
+
532
+ ## Phase 5: Base Model Inference and Incident Pipeline
533
+
534
+ ### Objective
535
+
536
+ Run the base `LFM2.5-VL-450M` model end to end with prompt-only structured output and complete the first fully functioning incident pipeline.
537
+
538
+ ### Deliverables
539
+
540
+ - [x] base-model inference service working
541
+ - [x] Hugging Face model pull and auth path working
542
+ - [x] structured JSON validation working
543
+ - [x] incident object persistence working
544
+ - [x] review state lifecycle working
545
+ - [x] priority / severity logic working
546
+
547
+ ### In-Scope / Out-of-Scope
548
+
549
+ - **In scope:** prompt-only incident generation, post-processing, storage
550
+ - **Out of scope:** tuned model superiority
551
+
552
+ ### Dependencies
553
+
554
+ - **Requires:** frozen evidence and output contract, Hugging Face credentials and model access
555
+ - **Blocks:** baseline benchmarking, UI truth wiring
556
+
557
+ ### Parts in This Phase
558
+
559
+ - `5.1` Base inference runner
560
+ - `5.2` Incident normalization and review flow
561
+ - `5.3` Structured persistence and retrieval
562
+
563
+ ### Phase Exit Criteria
564
+
565
+ - [x] Prompt-only pipeline works on frozen demo path
566
+ - [x] Inference path resolves model artifacts from Hugging Face with pinned revision
567
+ - [x] Invalid JSON path is handled gracefully
568
+ - [x] Review states work correctly
569
+ - [x] API retrieval endpoints function against real saved incidents
570
+ - [x] Integration checkpoint with prior phases passes
571
+
572
+ ---
573
+
574
+ ## Phase 6: Dataset Build and Fine-Tuning
575
+
576
+ ### Objective
577
+
578
+ Assemble a compact, provenance-aware training set and train a useful LoRA adapter that improves structured incident quality.
579
+
580
+ ### Deliverables
581
+
582
+ - [x] dataset manifest v1
583
+ - [x] annotation guidance v1
584
+ - [x] train / validation / demo split frozen
585
+ - [x] LoRA training script working
586
+ - [x] Modal GPU training job orchestration working
587
+ - [x] first tuned checkpoint produced
588
+
589
+ ### In-Scope / Out-of-Scope
590
+
591
+ - **In scope:** label taxonomy, manifests, synthetic + manual + weak data separation, LoRA training
592
+ - **Out of scope:** large-scale research-grade dataset creation
593
+
594
+ ### Dependencies
595
+
596
+ - **Requires:** frozen prompt and panel contract, Modal account access, Hugging Face artifact push/pull path
597
+ - **Blocks:** benchmark comparison and final demo quality story
598
+
599
+ ### Parts in This Phase
600
+
601
+ - `6.1` Dataset assembly and provenance
602
+ - `6.2` Annotation rules and negative set
603
+ - `6.3` Fine-tuning run and checkpointing
604
+
605
+ ### Phase Exit Criteria
606
+
607
+ - [x] Every sample has provenance metadata
608
+ - [x] Validation and demo splits are frozen and respected
609
+ - [x] Fine-tuned checkpoint can run in the same pipeline contract as the base model
610
+ - [x] At least one full fine-tuning run completes on Modal GPU
611
+ - [x] Training artifacts are saved and reproducible
612
+ - [x] Second full end-to-end scan checkpoint passes across Phases 5-6
613
+
614
+ ---
615
+
616
+ ## Phase 7: Evaluation and Reliability Hardening
617
+
618
+ ### Objective
619
+
620
+ Compare heuristics, base model, and fine-tuned model while hardening the system against likely failures.
621
+
622
+ ### Deliverables
623
+
624
+ - [x] evaluation harness working
625
+ - [x] baseline comparison table working
626
+ - [x] human actionability rubric working
627
+ - [x] null-scene report working
628
+ - [x] failure-injection tests working
629
+
630
+ ### In-Scope / Out-of-Scope
631
+
632
+ - **In scope:** comparative evaluation, threshold tuning, reliability testing
633
+ - **Out of scope:** long-form scientific paper claims
634
+
635
+ ### Dependencies
636
+
637
+ - **Requires:** stable base and fine-tuned inference paths
638
+ - **Blocks:** credible demo and submission narrative
639
+
640
+ ### Parts in This Phase
641
+
642
+ - `7.1` Quantitative evaluation
643
+ - `7.2` Human usefulness and explainability review
644
+ - `7.3` Failure mode and threshold tuning
645
+
646
+ ### Phase Exit Criteria
647
+
648
+ - [x] Heuristic, base, and fine-tuned comparisons are available
649
+ - [x] Null-scene performance is explicitly reported
650
+ - [x] Invalid JSON, empty candidates, Mapbox API failures, and slow inference are tested
651
+ - [x] Reliability results feed demo wording and claims
652
+ - [x] Integration checkpoint with prior phases passes
653
+
654
+ ---
655
+
656
+ ## Phase 8: Watchlist UI, Review Workflow, and Export
657
+
658
+ ### Objective
659
+
660
+ Build the operator-facing React UI that makes the product feel real, operational, and demo-ready.
661
+
662
+ ### Deliverables
663
+
664
+ - [x] watchlist screen
665
+ - [x] site detail screen
666
+ - [x] evidence panel view
667
+ - [x] review and publication controls
668
+ - [x] export flow for incident evidence
669
+
670
+ ### In-Scope / Out-of-Scope
671
+
672
+ - **In scope:** core operator UX and demo flow
673
+ - **Out of scope:** full workflow automation or enterprise administration
674
+
675
+ ### Dependencies
676
+
677
+ - **Requires:** stable backend and incident contracts
678
+ - **Blocks:** final demo polish
679
+
680
+ ### Parts in This Phase
681
+
682
+ - `8.1` Watchlist-first triage experience
683
+ - `8.2` Site drill-down and evidence view
684
+ - `8.3` Review controls and evidence export
685
+
686
+ ### Phase Exit Criteria
687
+
688
+ - [x] Critical screens render from real API responses
689
+ - [x] Manual smoke path works for frozen demo sites
690
+ - [x] Frontend smoke tests pass for key routes
691
+ - [x] Cached demo mode works
692
+ - [x] Third full end-to-end scan checkpoint passes across Phases 7-8
693
+
694
+ ---
695
+
696
+ ## Phase 9: Deployment, Demo Stability, and Submission Assets
697
+
698
+ ### Objective
699
+
700
+ Package the system into a robust hackathon submission with stable runtime, polished story, and clear evidence of fine-tuning and product value.
701
+
702
+ ### Deliverables
703
+
704
+ - [ ] deployment path finalized
705
+ - [ ] demo script finalized
706
+ - [ ] screenshots and fallback assets prepared
707
+ - [ ] architecture and benchmark slides prepared
708
+ - [ ] production secrets contract finalized for SimSat, Mapbox, Hugging Face, and Modal
709
+ - [ ] submission package finalized
710
+
711
+ ### In-Scope / Out-of-Scope
712
+
713
+ - **In scope:** runtime stability, documentation, demo, and submission readiness
714
+ - **Out of scope:** broad product expansion
715
+
716
+ ### Dependencies
717
+
718
+ - **Requires:** working system and evaluation outputs
719
+ - **Blocks:** final submission quality
720
+
721
+ ### Parts in This Phase
722
+
723
+ - `9.1` Deployment and environment hardening
724
+ - `9.2` Demo preparation and fallback assets
725
+ - `9.3` Submission materials and final smoke checks
726
+
727
+ ### Phase Exit Criteria
728
+
729
+ - [ ] Live demo path works
730
+ - [ ] Cached fallback demo path works
731
+ - [ ] SimSat, Mapbox, Hugging Face, and Modal secrets are validated in deployment profile
732
+ - [ ] Final smoke tests pass
733
+ - [ ] Submission claims match measured evidence
734
+ - [ ] No unresolved P1 defects remain
735
+
736
+ ---
737
+
738
+ ## 7) Detailed Part Breakdown
739
+
740
+ This section turns the phase map into implementation-grade parts. Each part is intentionally small enough to be decomposed into execution cards and large enough to represent a meaningful integration boundary.
741
+
742
+ ### 7.1 Phase 1 Parts - Foundation Lock
743
+
744
+ | Part | Why | In Scope | Key Outputs | Verification | Integration Gate |
745
+ |---|---|---|---|---|---|
746
+ | `1.1` Product and workflow lock | Prevents scope drift before implementation starts | watchlist-first workflow, human review state, incident lifecycle, operator action definition | frozen workflow diagram, incident state model, MVP/non-goal list | manual walkthrough of primary user flow, incident-state schema test | Phase 1 cannot close unless all downstream contracts use the same workflow assumptions |
747
+ | `1.2` Data and schema contract lock | Prevents backend / ML / UI drift | `Site`, `ImageAsset`, `Candidate`, `EvidencePanel`, `Incident`, `ReviewAction`, enums | schema definitions, JSON examples, field dictionary, `openapi.json` draft | schema snapshot tests, example payload validation | All later phases must consume the same field names and enum values |
748
+ | `1.3` Testing and integration policy lock | Forces quality discipline early | test pyramid, golden fixture classes, live/cached policy, E2E cadence | testing charter, fixture matrix, phase-close checklist | checklist review, test scaffold placeholder | No later phase is marked done without adopting the policy |
749
+
750
+ ### 7.2 Phase 2 Parts - Site Registry, Imagery, and Cache
751
+
752
+ | Part | Why | In Scope | Key Outputs | Verification | Integration Gate |
753
+ |---|---|---|---|---|---|
754
+ | `2.1` Site registry and watchlist model | All workflows begin at the site layer | site CRUD, watchlist listing, metadata storage, optional polygon support | site table, register/list endpoints, frozen demo-site manifest | API contract tests, DB schema tests | UI and scan logic must both read the same registry records |
755
+ | `2.2` SimSat and Mapbox imagery adapters | Makes the product actually dependent on DPhi imagery and required context inputs, not mock assets alone | current Sentinel retrieval, historical Sentinel retrieval, required Mapbox retrieval | adapter module, retrieval error handling, normalized responses | adapter tests against cached/live fixtures | Candidate pipeline must run off adapter outputs without ad hoc reshaping |
756
+ | `2.3` Cache and image asset persistence | Protects the demo and reduces repeated failures | local asset cache, image metadata persistence, replay mode | cache paths, asset records, cache invalidation rules | cached replay test, missing-data fallback test | One site scan must succeed with zero live calls after warm cache |
757
+
758
+ ### 7.3 Phase 3 Parts - Candidate Generation and Zone Priors
759
+
760
+ | Part | Why | In Scope | Key Outputs | Verification | Integration Gate |
761
+ |---|---|---|---|---|---|
762
+ | `3.1` Heuristic anomaly generation | Gives the system a dependable first candidate stage | spectral anomaly rules, thresholding, bbox proposal from SimSat-fed assets | heuristic engine, score fields, candidate examples | candidate unit tests, golden positive/negative checks | Candidate object must be ingestible by panel builder without manual edits |
763
+ | `3.2` Temporal recurrence features | Helps distinguish transient noise from persistent suspicion | historical comparison, recurrence scoring, cloud penalties, and source provenance of current/historical imagery | temporal feature calculator, recurrence score, diagnostics metadata | recurrence tests on cached history, cloudy-scene regression tests | Candidate scoring must include historical context in stable field names |
764
+ | `3.3` Zone prior and candidate scoring | Makes the product operational rather than generic | coarse zones, facility heuristics, ranking, and required Mapbox-context dependency in scan path | `likely_source_zone_prior`, `candidate_score`, zone rationale | schema tests, manual review on demo sites, one live-path smoke scan | Incident model must consume candidate priors directly |
765
+
766
+ ### 7.4 Phase 4 Parts - Evidence Panels and Prompt Contract
767
+
768
+ | Part | Why | In Scope | Key Outputs | Verification | Integration Gate |
769
+ |---|---|---|---|---|---|
770
+ | `4.1` Panel composition pipeline | The VLM only works if evidence is consistently shaped | current crop, methane-sensitive composite, temporal difference, required Mapbox, metadata | panel builder, deterministic layout, saved panel assets | panel render regression tests, cached fixture panel snapshots | Same panel spec must be used for inference, training, and demo |
771
+ | `4.2` Prompt and metadata contract | Freeze the language interface before training | system prompt, user prompt, metadata block, task instructions | prompt templates, metadata serializer | prompt formatting tests, sample schema-validation runs | Fine-tuning cannot begin until this contract is frozen |
772
+ | `4.3` Output schema and retry policy | Keeps model behavior bounded | schema validator, retry logic, fallback normalization | typed output validator, retry rules, invalid-output handler | invalid JSON failure test, canned-response normalization test | Incident persistence must only accept validated outputs |
773
+
774
+ ### 7.5 Phase 5 Parts - Base Model Inference and Incident Pipeline
775
+
776
+ | Part | Why | In Scope | Key Outputs | Verification | Integration Gate |
777
+ |---|---|---|---|---|---|
778
+ | `5.1` Base inference runner | Establishes the prompt-only baseline before tuning | Hugging Face model loading, inference invocation, deterministic config | base inference module, latency logging, model-revision config | smoke inference test, schema-valid output test | Must run on the exact same panel format as Phase 4 |
779
+ | `5.2` Incident normalization and review flow | Product value depends on usable incident objects | review states, priority tier, severity tier, recommended action, confidence normalization | incident assembler, state machine, follow-up rules | state-transition tests, enum validation tests | UI and export layers must read the same normalized object |
780
+ | `5.3` Structured persistence and retrieval | Makes the backend a real product surface | incident storage, result retrieval, evidence retrieval | incidents table, result endpoints, audit metadata | endpoint tests, persistence regression tests | Watchlist and site detail endpoints must render directly from saved incidents |
781
+
782
+ ### 7.6 Phase 6 Parts - Dataset Build and Fine-Tuning
783
+
784
+ | Part | Why | In Scope | Key Outputs | Verification | Integration Gate |
785
+ |---|---|---|---|---|---|
786
+ | `6.1` Dataset assembly and provenance | Prevents training chaos and unverifiable claims | manifests, split membership, label source tracking, panel version tracking | dataset manifest v1, split files, provenance schema | manifest validation script, duplicate/leakage checks | Demo split and validation split must be frozen before training |
787
+ | `6.2` Annotation rules and negative set | Label consistency matters more than dataset size | annotation handbook, negative taxonomy, bbox guidance, plume-likely criteria | annotation guide, reviewer checklist, negative set targets | inter-pass consistency review, negative coverage audit | Training should not proceed until guidelines exist and are applied |
788
+ | `6.3` Fine-tuning run and checkpointing | Creates the quality-improvement story | LoRA config, Modal GPU training script, adapter artifacts, evaluation hooks | train script, adapter checkpoint, Modal run metadata | train smoke test, post-train inference smoke test | Fine-tuned model must drop into the same inference contract as the base model |
789
+
790
+ ### 7.7 Phase 7 Parts - Evaluation and Reliability Hardening
791
+
792
+ | Part | Why | In Scope | Key Outputs | Verification | Integration Gate |
793
+ |---|---|---|---|---|---|
794
+ | `7.1` Quantitative evaluation | Gives objective evidence for judging and iteration | heuristics vs base vs tuned comparisons, held-out sites, held-out dates | benchmark table, metric reports, threshold sweep notes | evaluation harness tests, split integrity tests | Same fixture and split policy must be respected across all comparisons |
795
+ | `7.2` Human usefulness and explainability review | Product quality is not captured by one numeric metric | actionability rubric, explainability rubric, reviewer notes | human review form, scored examples, summary table | manual rubric completion on validation slice | Results must feed demo claims and not sit in isolation |
796
+ | `7.3` Failure mode and threshold tuning | Reliability wins hackathons | invalid JSON, empty candidates, Mapbox API failures, slow inference, null scenes | failure-injection suite, tuned confidence thresholds, degradation policy | targeted failure tests, null-scene report | UI and backend must handle all tested failures without collapsing |
797
+
798
+ ### 7.8 Phase 8 Parts - Watchlist UI, Review Workflow, and Export
799
+
800
+ | Part | Why | In Scope | Key Outputs | Verification | Integration Gate |
801
+ |---|---|---|---|---|---|
802
+ | `8.1` Watchlist-first triage experience | This is the product's strongest narrative frame | multi-site list, incident status, priority ordering, quick glance metadata | watchlist screen, site ranking logic | manual watchlist walkthrough, frontend smoke test | Data must come from real API payloads, not static placeholders |
803
+ | `8.2` Site drill-down and evidence view | Needed to explain why an alert exists | imagery panels, bbox overlay, evidence summary, history slice | site detail screen, evidence pack UI | drill-down render test, overlay smoke test | Evidence panel fields must match backend payloads exactly |
804
+ | `8.3` Review controls and evidence export | Makes the system feel like an operations tool | confirm/dismiss/review state changes, export card or markdown/PDF | review actions UI, export endpoint, export template | review action test, export smoke test | Review state changes must persist and reflect in watchlist immediately |
805
+
806
+ ### 7.9 Phase 9 Parts - Deployment, Demo Stability, and Submission Assets
807
+
808
+ | Part | Why | In Scope | Key Outputs | Verification | Integration Gate |
809
+ |---|---|---|---|---|---|
810
+ | `9.1` Deployment and environment hardening | Prevents demo-day surprises | env var handling, compose scripts, startup commands, model path config, mandatory SimSat/Mapbox/HuggingFace/Modal secrets wiring | `.env.example`, startup docs, deployment profile | startup smoke test, dependency checklist | Live and cached demo paths must both boot cleanly |
811
+ | `9.2` Demo preparation and fallback assets | Judges see stability first | frozen screenshots, cached outputs, architecture slides, script | demo script, fallback images, known-good JSON outputs | rehearsal checklist, timed dry run | Cached mode must fully support the demo narrative |
812
+ | `9.3` Submission materials and final smoke checks | The last mile matters | README polish, benchmark summary, fine-tuning notes, repo cleanup | submission pack, final smoke report, claim check | final full walkthrough, repo sanity check | No claim in the submission may exceed measured evidence |
813
+
814
+ ### 7.10 Cross-Phase Integration Gates
815
+
816
+ The full build should pass these hard checkpoints:
817
+
818
+ 1. **Checkpoint A (after Phase 2):** site registry + imagery + cache can fetch and replay one demo site.
819
+ 2. **Checkpoint B (after Phase 4):** one site can produce a candidate and a renderable evidence panel (including Mapbox context) from live and cached assets.
820
+ 3. **Checkpoint C (after Phase 6):** base and fine-tuned models can both consume the same panel and schema contract end to end.
821
+ 4. **Checkpoint D (after Phase 8):** watchlist UI can render and review incidents from real backend data in cached mode.
822
+ 5. **Checkpoint E (after Phase 9):** full demo succeeds in live mode and cached fallback mode.
823
+
824
+ ---
825
+
826
+ ## 8) Task Input Contract for LLM (Critical)
827
+
828
+ Use this contract for every implementation card.
829
+
830
+ - **Task ID:**
831
+ - **Objective (1 sentence):**
832
+ - **Context files/links:**
833
+ - **Allowed files to change:**
834
+ - **Do-not-touch files:**
835
+ - **Constraints:**
836
+ - **Expected output:**
837
+ - **Acceptance tests/checks:**
838
+ - **Definition of done:**
839
+
840
+ ### Prompt Skeleton
841
+
842
+ `You are implementing Task <ID>.`
843
+
844
+ `Goal: <objective>.`
845
+
846
+ `Context: <key files and constraints>.`
847
+
848
+ `Make the smallest safe change.`
849
+
850
+ `Then run/describe verification: <tests/lint/typecheck/smoke path>.`
851
+
852
+ `Return: summary, files changed, why, and verification results.`
853
+
854
+ ---
855
+
856
+ ## 9) Execution Protocol (LLM + Human)
857
+
858
+ 1. Work on the smallest task that moves the system forward.
859
+ 2. Freeze contracts early; avoid changing schemas casually once training or UI wiring starts.
860
+ 3. Build one canonical path before supporting alternatives.
861
+ 4. Add a cached offline path whenever a live dependency is introduced.
862
+ 5. Verify immediately after each task.
863
+ 6. Close every phase with an integration checkpoint.
864
+ 7. Run one full end-to-end scan after every two phases.
865
+ 8. If a task exceeds 45 minutes, split it.
866
+ 9. If a live dependency becomes unstable, preserve momentum through cached artifacts and keep moving.
867
+ 10. Do not promote demo claims beyond measured evidence.
868
+
869
+ ### 9.1 Integration Rule
870
+
871
+ No phase is marked done unless it satisfies:
872
+
873
+ - local functionality,
874
+ - previous-phase compatibility,
875
+ - one live path,
876
+ - one cached offline path,
877
+ - and documented verification.
878
+
879
+ ---
880
+
881
+ ## 10) Verification Matrix
882
+
883
+ | Category | Check | Tool/Method | Frequency | Pass/Fail |
884
+ |---|---|---|---|---|
885
+ | Functional | Site scan returns valid incident object | API + schema tests | Every relevant task | |
886
+ | Quality | Lint / typecheck / formatting | Local CI commands | Every task touching code | |
887
+ | Contract | API matches `openapi.json` | Contract tests + schema diff | Every API change | |
888
+ | Data | Manifests, splits, provenance valid | Dataset validation script | Every dataset update | |
889
+ | Candidate Reliability | Positive/negative fixture behavior | Golden fixture tests | Per candidate change | |
890
+ | Model Output | JSON validity and enum correctness | Pydantic validation + retry tests | Every inference change | |
891
+ | Integration | End-to-end scan across current stack | Live + cached scan test | Every phase / 2 phases | |
892
+ | Frontend | Key screens render and bind data | Basic smoke tests + manual QA | Per UI milestone | |
893
+ | Failure Handling | Mapbox API failures, empty candidates, slow model, invalid JSON | Failure-injection tests | Per major milestone | |
894
+ | Demo Readiness | Frozen demo path completes reliably | Rehearsal checklist | Before submission | |
895
+
896
+ ### 10.1 Test Pyramid for This Project
897
+
898
+ - **Unit tests**
899
+ - schema validators
900
+ - bbox normalization
901
+ - candidate scoring helpers
902
+ - panel builder helpers
903
+ - prompt formatting
904
+ - review state transitions
905
+
906
+ - **Integration tests**
907
+ - SimSat adapter + cache
908
+ - candidate pipeline + panel builder
909
+ - inference + schema validator
910
+ - API endpoints + DB layer
911
+ - UI fetch + render path against mocked or cached backend responses
912
+
913
+ - **End-to-end tests**
914
+ - one positive-site live scan
915
+ - one positive-site cached scan
916
+ - one negative-site cached scan
917
+ - one cloudy / missing-data graceful-degradation path
918
+
919
+ ### 10.2 Golden Fixtures (Mandatory)
920
+
921
+ Maintain at least:
922
+
923
+ - one positive site,
924
+ - one negative site,
925
+ - one cloudy site,
926
+ - one missing-data site.
927
+
928
+ These fixtures are shared across backend, evaluation, and demo validation.
929
+
930
+ ---
931
+
932
+ ## 11) Progress Tracker
933
+
934
+ Status legend: `TODO | WIP | BLOCKED | DONE`
935
+
936
+ - [x] ✅ Phase 1 - Foundation Lock
937
+ - [x] ✅ Phase 2 - Site Registry, Imagery, and Cache
938
+ - [x] ✅ Phase 3 - Candidate Generation and Zone Priors
939
+ - [x] ✅ Phase 4 - Evidence Panels and Prompt Contract
940
+ - [x] ✅ Phase 5 - Base Model Inference and Incident Pipeline
941
+ - [x] ✅ Phase 6 - Dataset Build and Fine-Tuning
942
+ - [x] ✅ Phase 7 - Evaluation and Reliability Hardening
943
+ - [x] ✅ Phase 8 - Watchlist UI, Review Workflow, and Export
944
+ - [ ] Phase 9 - Deployment, Demo Stability, and Submission Assets
945
+
946
+ ---
947
+
948
+ ## 12) Change Log
949
+
950
+ | Date | Task ID | Files Changed | Summary | Verification | Status |
951
+ |---|---|---|---|---|---|
952
+ | `2026-04-19` | `PLAN-CHUNK-01` | `LandfillSentry_Ops_Master_Project_Plan.md` | Initialized master plan with strategy, architecture, phase map, and verification framework | Manual review against frozen decisions and source reports | `done` |
953
+ | `2026-04-19` | `PLAN-FULL-DRAFT` | `LandfillSentry_Ops_Master_Project_Plan.md` | Expanded plan into full draft with detailed phase parts, operational deep dive, execution wave, data governance, API spec, evaluation plan, UX, deployment, GTM, and risk matrix | Manual structural review for completeness against detailed report and frozen answers | `done` |
954
+ | `2026-04-19` | `PHASE1-IMPLEMENTATION` | `README.md`, `openapi.json`, `docs/*`, `apps/api/*`, `tests/*`, `assets/demo_sites/*`, `scripts/*` | Implemented Phase 1 foundation lock artifacts: repo skeleton, schema and enum contracts, API scaffold, OpenAPI draft, demo-site selection rubric, golden fixture matrix, and integration checklist | `python -m unittest tests/test_api_contract.py`, `python -m unittest tests/test_schema_validation.py`, `python -m compileall apps scripts` | `done` |
955
+ | `2026-04-19` | `PLAN-MANDATORY-DEPENDENCIES` | `LandfillSentry_Ops_Master_Project_Plan.md` | Updated plan to make Mapbox, Hugging Face, and Modal GPU mandatory; aligned phase deliverables, part breakdowns, deployment/security requirements, and execution cards | Manual consistency review across sections 3, 6, 7, 16, and 17 | `done` |
956
+ | `2026-04-19` | `PHASE2-IMPLEMENTATION` | `apps/api/main.py`, `apps/api/routes/api.py`, `apps/api/runtime.py`, `apps/api/config.py`, `apps/api/db/*`, `apps/api/services/*`, `scripts/fetch_site_history.py`, `tests/test_phase2_integration.py`, `openapi.json`, `.env.example`, `README.md`, `LandfillSentry_Ops_Master_Project_Plan.md` | Implemented Phase 2: SQLite-backed site registry, SimSat+Mapbox adapters, cache/replay flow, and persisted scan evidence path | `python -m unittest tests/test_api_contract.py`, `python -m unittest tests/test_schema_validation.py`, `python -m unittest tests/test_phase2_integration.py`, `python -m compileall apps scripts tests` | `done` |
957
+ | `2026-04-19` | `PHASE2-SIMSAT-REPO-INTEGRATION` | `apps/api/config.py`, `apps/api/services/imagery_service.py`, `.env.example`, `README.md`, `tests/test_phase2_integration.py` | Aligned live imagery implementation to DPhi SimSat repository API contract using `/data/image/sentinel` and `/data/image/mapbox` endpoints and metadata headers | `python -m unittest tests/test_api_contract.py tests/test_schema_validation.py tests/test_phase2_integration.py`, `python -m compileall apps scripts tests` | `done` |
958
+ | `2026-04-20` | `PHASE3-IMPLEMENTATION` | `apps/api/services/candidate_service.py`, `apps/api/routes/api.py`, `apps/api/runtime.py`, `apps/api/db/repository.py`, `apps/api/services/__init__.py`, `tests/test_phase3_candidates.py`, `LandfillSentry_Ops_Master_Project_Plan.md` | Implemented Phase 3 hybrid candidate engine with heuristic anomaly scoring, temporal recurrence features, zone priors, candidate persistence, and scan/evidence integration | `python -m unittest tests/test_api_contract.py tests/test_schema_validation.py tests/test_phase2_integration.py tests/test_phase3_candidates.py`, `python -m compileall apps scripts tests` | `done` |
959
+ | `2026-04-20` | `SIMSAT-ENDPOINT-ALIGNMENT` | `apps/api/services/imagery_service.py`, `tests/test_phase2_integration.py`, `README.md` | Updated live endpoint usage to SimSat contract split: current inference (`/data/current/image/sentinel`, `/data/current/image/mapbox`) plus historical Sentinel retrieval (`/data/image/sentinel`) for temporal and fine-tuning workflows | `python -m unittest tests/test_api_contract.py tests/test_schema_validation.py tests/test_phase2_integration.py tests/test_phase3_candidates.py`, `python -m compileall apps scripts tests` | `done` |
960
+ | `2026-04-20` | `PHASE3-LIVE-DATA-ALIGNMENT` | `LandfillSentry_Ops_Master_Project_Plan.md` | Updated Phase 3 plan details to explicitly require and verify live candidate operation using SimSat current/historical Sentinel and required current Mapbox context, while retaining cached fallback behavior | Manual consistency review across sections 6, 7.3, 11, 12, and 17 (`3.1` card) | `done` |
961
+ | `2026-04-20` | `PHASE4-IMPLEMENTATION` | `apps/api/routes/api.py`, `apps/api/runtime.py`, `apps/api/db/repository.py`, `apps/api/services/panel_service.py`, `apps/api/services/prompt_contract_service.py`, `apps/api/services/output_validation_service.py`, `apps/api/services/__init__.py`, `tests/test_phase4_panels.py`, `LandfillSentry_Ops_Master_Project_Plan.md` | Implemented Phase 4 deterministic evidence panel builder, required Mapbox panel slot integration, frozen prompt/output contract metadata, and incident output schema validation loop with retry trace persisted in scan evidence | `python -m unittest tests/test_api_contract.py tests/test_schema_validation.py tests/test_phase2_integration.py tests/test_phase3_candidates.py tests/test_phase4_panels.py`; live scan smoke check via `scan_site` with SimSat backend | `done` |
962
+ | `2026-04-20` | `PHASE5-IMPLEMENTATION` | `apps/api/config.py`, `apps/api/runtime.py`, `apps/api/routes/api.py`, `apps/api/services/inference_service.py`, `apps/api/services/__init__.py`, `tests/test_phase5_inference.py`, `scripts/run_lfm25_examples.py`, `requirements.txt`, `.env.example`, `.env.local`, `README.md`, `LandfillSentry_Ops_Master_Project_Plan.md` | Implemented Phase 5 base-model inference pipeline with Hugging Face model loading (`LiquidAI/LFM2.5-VL-450M@main`), prompt-only image inference integration, structured output validation/fallback, persisted incident/review lifecycle support, and inference metadata trace in evidence payloads | `python -m unittest tests/test_api_contract.py tests/test_schema_validation.py tests/test_phase2_integration.py tests/test_phase3_candidates.py tests/test_phase4_panels.py tests/test_phase5_inference.py`; live end-to-end `scan_site` run with `INFERENCE_MODE=live`; `python scripts/run_lfm25_examples.py --max-new-tokens 24` | `done` |
963
+ | `2026-04-21` | `PHASE8-IMPLEMENTATION` | `apps/api/main.py`, `apps/api/db/repository.py`, `apps/api/routes/api.py`, `apps/web/public/ops.html`, `apps/web/public/ops.css`, `apps/web/public/ops-app.jsx`, `apps/web/README.md`, `tests/test_phase8_ui_workflow.py`, `README.md`, `LandfillSentry_Ops_Master_Project_Plan.md` | Implemented Phase 8 operator UX and workflow: watchlist API + screen, site drill-down evidence view, persisted review controls, incident export endpoint (markdown/json), and `/ops` console route with frontend smoke coverage | `python -m unittest tests/test_phase8_ui_workflow.py`; `python -m unittest tests/test_api_contract.py tests/test_schema_validation.py tests/test_phase2_integration.py tests/test_phase3_candidates.py tests/test_phase4_panels.py tests/test_phase5_inference.py tests/test_phase6_training.py tests/test_phase7_evaluation.py tests/test_phase7_reliability.py tests/test_phase8_ui_workflow.py`; `python -m compileall apps scripts tests` | `done` |
964
+
965
+ ---
966
+
967
+ ## 13) Blockers & Decisions Log
968
+
969
+ ### Active Blockers
970
+
971
+ - Blocker: No active Phase 8 blockers
972
+ - Next action: begin Phase 9 (`9.1` deployment and environment hardening)
973
+ - ETA: `Phase 9`
974
+
975
+ ### Key Decisions
976
+
977
+ - Decision: operator-first product
978
+ - Why chosen: clearest action loop and strongest demo fit
979
+ - Impact: watchlist triage and source-zone guidance become core UX
980
+
981
+ - Decision: synchronous inference for MVP
982
+ - Why chosen: simplest stable path under hackathon constraints
983
+ - Impact: caching and precomputation become essential
984
+
985
+ - Decision: phase completion requires integration
986
+ - Why chosen: reduces end-stage collapse risk
987
+ - Impact: more frequent checkpoints and fewer isolated branches
988
+
989
+ ---
990
+
991
+ ## 14) Release & Rollback Plan
992
+
993
+ - **Release strategy:** `single MVP release with cached demo fallback`
994
+ - **Pre-release checklist:**
995
+ - [ ] Demo sites frozen
996
+ - [ ] Golden fixtures frozen
997
+ - [ ] Fine-tuned or fallback prompt-only path selected
998
+ - [ ] Cached offline demo path validated
999
+ - [ ] All required secrets documented in `.env.example`
1000
+ - **Rollback criteria:**
1001
+ - Prompt-only model outperforms or stabilizes better than tuned model
1002
+ - Live dependency threatens demo reliability
1003
+ - UI instability exceeds acceptable demo risk
1004
+ - **Rollback steps:**
1005
+ - Revert to cached incident outputs and panels
1006
+ - Switch to prompt-only model path if fine-tuned path is unstable
1007
+ - Reduce optional features before reducing the core scan-to-incident workflow
1008
+ - **Post-release validation:**
1009
+ - final smoke scan,
1010
+ - final watchlist walkthrough,
1011
+ - final export path check.
1012
+
1013
+ ---
1014
+
1015
+ ## 15) Post-Phase Retro Template
1016
+
1017
+ - What went well:
1018
+ - What broke or drifted:
1019
+ - What integration issue appeared:
1020
+ - What should be frozen more aggressively next phase:
1021
+ - What can be simplified:
1022
+
1023
+ ---
1024
+
1025
+ ## 16) Operational Deep Dive
1026
+
1027
+ ### 16.1 External Data Sources and Their Role
1028
+
1029
+ | Dependency | MVP Role | Why It Exists in the System | MVP Criticality |
1030
+ |---|---|---|---|
1031
+ | `SimSat Sentinel-2` | primary multispectral imagery source | current and historical imagery for anomaly generation and temporal comparison | Required |
1032
+ | `SimSat Mapbox` | required high-resolution context | sharper facility interpretation, stronger zone context, and demo grounding | Required |
1033
+ | `LFM2.5-VL-450M` | vision-language interpretation model | turns evidence panels into structured incident objects | Required |
1034
+ | `Hugging Face` | model and adapter artifact registry | canonical source for model revisions and fine-tuned adapter versions | Required |
1035
+ | `Modal GPU` | training execution platform | reproducible LoRA fine-tuning runs under hackathon timelines | Required |
1036
+ | `Project Eucalyptus` | benchmark and bootstrap asset source | methane-domain priors, synthetic plume generation ideas, optional candidate improvements | Recommended |
1037
+ | `METER` | watchlist enrichment source | landfill site discovery and metadata support | Recommended |
1038
+ | weather / wind sources | contextual enhancement only | future persistence interpretation and synthetic realism | Optional |
1039
+
1040
+ ### 16.2 Internal Service Design
1041
+
1042
+ The internal design should remain modular without becoming prematurely microservice-heavy.
1043
+
1044
+ - **API Gateway / Orchestrator**
1045
+ - validates incoming requests,
1046
+ - coordinates retrieval, candidate generation, panel building, inference, and persistence.
1047
+
1048
+ - **Site Registry Service**
1049
+ - manages site metadata,
1050
+ - stores frozen demo-site list,
1051
+ - supports watchlist and optional polygons.
1052
+
1053
+ - **Imagery Service**
1054
+ - wraps SimSat calls,
1055
+ - normalizes metadata,
1056
+ - stores assets to cache,
1057
+ - surfaces cloud or missing-data signals.
1058
+
1059
+ - **Candidate Generation Service**
1060
+ - computes anomaly candidates,
1061
+ - adds recurrence and zone priors,
1062
+ - emits ranked candidates.
1063
+
1064
+ - **Panel Builder Service**
1065
+ - assembles evidence packs consistently,
1066
+ - writes panel assets to cache,
1067
+ - stores panel generator version metadata.
1068
+
1069
+ - **VLM Inference Service**
1070
+ - loads base or fine-tuned model,
1071
+ - runs structured prompting,
1072
+ - validates and retries outputs.
1073
+
1074
+ - **Incident Service**
1075
+ - normalizes model outputs,
1076
+ - computes review state,
1077
+ - publishes incidents to API consumers.
1078
+
1079
+ - **UI Service**
1080
+ - watchlist-first workflow,
1081
+ - site drill-down,
1082
+ - review and export actions.
1083
+
1084
+ ### 16.3 End-to-End Data Flow
1085
+
1086
+ 1. User opens the watchlist or requests a scan for a site.
1087
+ 2. Backend loads site coordinates and optional polygon.
1088
+ 3. Imagery service fetches current Sentinel-2 imagery and historical scenes via SimSat.
1089
+ 4. Mapbox context is fetched as a required panel input.
1090
+ 5. Preprocessing filters weak scenes and normalizes imagery metadata.
1091
+ 6. Candidate generator proposes one or more suspicious regions.
1092
+ 7. Panel builder assembles multimodal evidence.
1093
+ 8. Base or fine-tuned `LFM2.5-VL-450M` receives panel plus prompt.
1094
+ 9. Output is validated and normalized into an incident object.
1095
+ 10. Incident is stored as `proposed`.
1096
+ 11. UI displays the result to the operator.
1097
+ 12. Human review promotes incident to `published`, `dismissed`, or keeps it in `needs_review`.
1098
+
1099
+ ### 16.4 Candidate Generation Pipeline
1100
+
1101
+ **Recommended MVP mode:** hybrid candidate generation
1102
+
1103
+ The candidate engine should combine:
1104
+
1105
+ - simple spectral anomaly screening,
1106
+ - temporal differencing against recent acceptable scenes,
1107
+ - coarse zone priors,
1108
+ - optional model-assisted ranking where practical.
1109
+
1110
+ Candidate scoring features should include:
1111
+
1112
+ - anomaly intensity,
1113
+ - temporal recurrence,
1114
+ - cloud penalty,
1115
+ - facility-center proximity or heuristic zone prior,
1116
+ - panel confidence support fields.
1117
+
1118
+ Candidate output contract:
1119
+
1120
+ ```json
1121
+ {
1122
+ "candidate_id": "cand_001",
1123
+ "site_id": "LF_DEMO_001",
1124
+ "bbox_norm": [0.25, 0.15, 0.47, 0.32],
1125
+ "candidate_score": 0.71,
1126
+ "temporal_recurrence": 0.64,
1127
+ "cloud_penalty": 0.12,
1128
+ "likely_source_zone_prior": "active_face"
1129
+ }
1130
+ ```
1131
+
1132
+ ### 16.5 Evidence Panel Specification
1133
+
1134
+ The panel format must be frozen before fine-tuning.
1135
+
1136
+ Required components:
1137
+
1138
+ 1. current RGB crop,
1139
+ 2. methane-sensitive spectral composite crop,
1140
+ 3. temporal-difference crop,
1141
+ 4. Mapbox context crop,
1142
+ 5. metadata text block,
1143
+ 6. candidate bbox and score metadata.
1144
+
1145
+ Metadata text should include:
1146
+
1147
+ - site id,
1148
+ - timestamp requested,
1149
+ - timestamp captured,
1150
+ - cloud score,
1151
+ - candidate score,
1152
+ - recurrence score,
1153
+ - zone prior,
1154
+ - Mapbox request metadata and retrieval timestamp.
1155
+
1156
+ ### 16.6 Incident Object and Enum Contract
1157
+
1158
+ Minimum required fields:
1159
+
1160
+ ```json
1161
+ {
1162
+ "incident_id": "inc_001",
1163
+ "site_id": "LF_DEMO_001",
1164
+ "analysis_time": "2026-04-19T11:15:00Z",
1165
+ "plume_likely": true,
1166
+ "confidence": 0.84,
1167
+ "bbox_norm": [0.32, 0.18, 0.56, 0.43],
1168
+ "likely_source_zone": "active_face",
1169
+ "persistence_score": 0.72,
1170
+ "priority_tier": "high",
1171
+ "severity_tier": "medium",
1172
+ "review_status": "proposed",
1173
+ "evidence_summary": "Recurring anomaly near the active working area across recent cloud-acceptable scenes.",
1174
+ "recommended_followup": "Inspect active face cover integrity and nearby gas capture within 24 hours.",
1175
+ "model_version": "lfm25vl450m-landfillsentry-lora-v1"
1176
+ }
1177
+ ```
1178
+
1179
+ Recommended controlled enums:
1180
+
1181
+ - `likely_source_zone`: `active_face | gas_system | perimeter_or_unknown`
1182
+ - `priority_tier`: `low | medium | high | urgent`
1183
+ - `severity_tier`: `low | medium | high`
1184
+ - `review_status`: `proposed | published | dismissed | needs_review`
1185
+ - `feedback_status`: `confirmed | dismissed | needs_review | unresolved`
1186
+
1187
+ ### 16.7 Dataset and Annotation Governance
1188
+
1189
+ #### Dataset design goals
1190
+
1191
+ - small but high-signal,
1192
+ - provenance-aware,
1193
+ - strong negative coverage,
1194
+ - frozen demo and validation sets,
1195
+ - consistent panel format between training and inference.
1196
+
1197
+ #### Sample sources
1198
+
1199
+ - real historical/current site panels from SimSat,
1200
+ - synthetic plume overlays or derived methane-domain examples,
1201
+ - weak labels from heuristic or candidate-stage confidence,
1202
+ - manual labels on selected panels.
1203
+
1204
+ #### Required dataset metadata per sample
1205
+
1206
+ - `sample_id`
1207
+ - `site_id`
1208
+ - `timestamp`
1209
+ - `split`
1210
+ - `label_source`
1211
+ - `panel_version`
1212
+ - `candidate_version`
1213
+ - `imagery_sources_present`
1214
+ - `annotator_id`
1215
+ - `notes`
1216
+
1217
+ Allowed `label_source` values:
1218
+
1219
+ - `manual`
1220
+ - `weak`
1221
+ - `synthetic`
1222
+ - `mixed`
1223
+
1224
+ #### Split policy
1225
+
1226
+ - **Train:** mixed real + synthetic + weak data
1227
+ - **Validation:** frozen real-heavy set
1228
+ - **Demo:** frozen set reserved for product demo only
1229
+ - Never fine-tune on demo examples
1230
+
1231
+ #### Negative example policy
1232
+
1233
+ Negative examples must explicitly include:
1234
+
1235
+ - null scenes with no obvious anomaly,
1236
+ - cloud-heavy scenes,
1237
+ - bright or reflective surfaces,
1238
+ - visually complex landfill scenes that should not trigger high confidence,
1239
+ - suspicious but ultimately unconvincing candidates.
1240
+
1241
+ #### Annotation rules
1242
+
1243
+ - `plume_likely = true` only when the evidence pack supports a plausible, spatially localizable suspicious region.
1244
+ - Bounding boxes should be tight enough to indicate the suspicious region without pretending scientific precision.
1245
+ - If zone attribution is weak, label `perimeter_or_unknown` instead of forcing a precise class.
1246
+ - Annotators should prefer consistency over ambition.
1247
+
1248
+ ### 16.8 Fine-Tuning Strategy
1249
+
1250
+ Recommended approach:
1251
+
1252
+ - start with prompt-only pipeline,
1253
+ - freeze panel and prompt contracts,
1254
+ - build a narrow supervised dataset,
1255
+ - fine-tune with LoRA,
1256
+ - compare against the base model on the same validation slices.
1257
+
1258
+ Suggested stage order:
1259
+
1260
+ 1. synthetic and weakly labeled SFT bootstrap,
1261
+ 2. manual correction and validation refinement,
1262
+ 3. optional instruction polishing if time remains.
1263
+
1264
+ Training artifacts to save:
1265
+
1266
+ - adapter weights,
1267
+ - training config,
1268
+ - dataset manifest,
1269
+ - eval summary,
1270
+ - sample outputs,
1271
+ - panel format version,
1272
+ - prompt contract version.
1273
+
1274
+ ### 16.9 Prompting and Output Rules
1275
+
1276
+ Prompt design principles:
1277
+
1278
+ - be explicit about structured output,
1279
+ - reinforce that the product is triage, not quantification,
1280
+ - constrain zone taxonomy and enum values,
1281
+ - ask for concise evidence summaries,
1282
+ - forbid unsupported claims.
1283
+
1284
+ Core output rules:
1285
+
1286
+ - JSON only or clearly parseable structured response,
1287
+ - no extra narrative outside contract unless debugging mode is enabled,
1288
+ - bbox normalized to `[x1, y1, x2, y2]`,
1289
+ - confidence in `[0,1]`,
1290
+ - persistence score in `[0,1]`.
1291
+
1292
+ ### 16.10 Evaluation Framework
1293
+
1294
+ #### Baselines
1295
+
1296
+ 1. candidate-only heuristic path
1297
+ 2. base `LFM2.5-VL-450M` with prompt-only inference
1298
+ 3. fine-tuned `LFM2.5-VL-450M`
1299
+
1300
+ #### Core metrics
1301
+
1302
+ | Metric | Why It Matters | Target Style |
1303
+ |---|---|---|
1304
+ | JSON validity rate | system reliability | directional target, ideally >95% on validation |
1305
+ | Operator usefulness | product value | majority of reviewed outputs considered actionable |
1306
+ | Null-scene false positive rate | trust preservation | explicitly minimized and reported |
1307
+ | Zone accuracy / agreement | operational focus | improve over base prompt-only baseline |
1308
+ | BBox quality | localization utility | useful, not necessarily scientifically perfect |
1309
+ | Human explainability score | demo and trust | clearly understandable evidence chain |
1310
+
1311
+ #### Evaluation slices
1312
+
1313
+ - held-out sites,
1314
+ - held-out dates,
1315
+ - frozen demo set,
1316
+ - golden negative set.
1317
+
1318
+ #### Human review rubric
1319
+
1320
+ Each reviewed incident should be scored on:
1321
+
1322
+ - actionability,
1323
+ - clarity,
1324
+ - plausibility,
1325
+ - usefulness of follow-up guidance,
1326
+ - trustworthiness of explanation.
1327
+
1328
+ ### 16.11 Product UX and Demo Flow
1329
+
1330
+ Core screens:
1331
+
1332
+ 1. **Watchlist**
1333
+ - prioritized sites,
1334
+ - alert count,
1335
+ - review status,
1336
+ - latest scan snapshot.
1337
+
1338
+ 2. **Site Detail**
1339
+ - current incident summary,
1340
+ - candidate zone,
1341
+ - confidence,
1342
+ - priority,
1343
+ - review actions.
1344
+
1345
+ 3. **Evidence Pack**
1346
+ - imagery panel,
1347
+ - bbox overlay,
1348
+ - evidence summary,
1349
+ - recommended follow-up,
1350
+ - export action.
1351
+
1352
+ Recommended demo sequence:
1353
+
1354
+ 1. open watchlist,
1355
+ 2. show prioritized site list,
1356
+ 3. select a flagged site,
1357
+ 4. show current vs historical imagery and candidate zone,
1358
+ 5. explain how evidence is assembled,
1359
+ 6. show structured incident object,
1360
+ 7. review and publish or dismiss,
1361
+ 8. export evidence pack,
1362
+ 9. mention cached fallback and fine-tuning result briefly.
1363
+
1364
+ ### 16.12 Backend API Specification
1365
+
1366
+ | Endpoint | Method | Purpose | MVP Status |
1367
+ |---|---|---|---|
1368
+ | `/health` | `GET` | runtime health | Required |
1369
+ | `/sites` | `POST` | register a site | Required |
1370
+ | `/sites` | `GET` | list watchlist sites | Required |
1371
+ | `/sites/{id}` | `GET` | get site metadata | Recommended |
1372
+ | `/sites/{id}/scan` | `POST` | run synchronous scan | Required |
1373
+ | `/scans/{id}` | `GET` | get scan result | Required |
1374
+ | `/scans/{id}/evidence` | `GET` | get evidence pack | Required |
1375
+ | `/watchlist/scan` | `POST` | batch scan or precompute watchlist | Recommended |
1376
+ | `/incidents/{id}/review` | `POST` | confirm, dismiss, needs review | Required |
1377
+ | `/incidents/export` | `GET` | export JSON / markdown / PDF-ready payload | Required |
1378
+
1379
+ OpenAPI policy:
1380
+
1381
+ - generate `openapi.json`,
1382
+ - commit it,
1383
+ - regenerate when route or schema changes,
1384
+ - block frontend drift against stale contracts.
1385
+
1386
+ ### 16.13 Data Models
1387
+
1388
+ #### Site
1389
+
1390
+ - `site_id`
1391
+ - `name`
1392
+ - `lat`
1393
+ - `lon`
1394
+ - `country`
1395
+ - `operator`
1396
+ - `watchlist_enabled`
1397
+ - `polygon_geojson` optional
1398
+ - `metadata`
1399
+
1400
+ #### ImageAsset
1401
+
1402
+ - `asset_id`
1403
+ - `site_id`
1404
+ - `source`
1405
+ - `timestamp_requested`
1406
+ - `timestamp_captured`
1407
+ - `cloud_cover`
1408
+ - `bands`
1409
+ - `local_path`
1410
+ - `cache_key`
1411
+
1412
+ #### Candidate
1413
+
1414
+ - `candidate_id`
1415
+ - `site_id`
1416
+ - `job_id`
1417
+ - `bbox_norm`
1418
+ - `candidate_score`
1419
+ - `temporal_recurrence`
1420
+ - `cloud_penalty`
1421
+ - `likely_source_zone_prior`
1422
+
1423
+ #### EvidencePanel
1424
+
1425
+ - `panel_id`
1426
+ - `site_id`
1427
+ - `candidate_id`
1428
+ - `panel_version`
1429
+ - `current_rgb_path`
1430
+ - `spectral_composite_path`
1431
+ - `temporal_diff_path`
1432
+ - `mapbox_context_path`
1433
+ - `metadata_json`
1434
+
1435
+ #### Incident
1436
+
1437
+ - `incident_id`
1438
+ - `site_id`
1439
+ - `job_id`
1440
+ - `plume_likely`
1441
+ - `confidence`
1442
+ - `bbox_norm`
1443
+ - `likely_source_zone`
1444
+ - `persistence_score`
1445
+ - `priority_tier`
1446
+ - `severity_tier`
1447
+ - `review_status`
1448
+ - `feedback_status`
1449
+ - `evidence_summary`
1450
+ - `recommended_followup`
1451
+ - `model_version`
1452
+
1453
+ #### EvaluationRecord
1454
+
1455
+ - `eval_id`
1456
+ - `split`
1457
+ - `site_id`
1458
+ - `baseline_model`
1459
+ - `candidate_model`
1460
+ - `json_valid_rate`
1461
+ - `incident_f1`
1462
+ - `zone_accuracy`
1463
+ - `bbox_iou`
1464
+ - `human_usefulness_score`
1465
+
1466
+ ### 16.14 Repository Structure
1467
+
1468
+ ```text
1469
+ landfillsentry-ops/
1470
+ ├── README.md
1471
+ ├── openapi.json
1472
+ ├── docs/
1473
+ │ ├── architecture.md
1474
+ │ ├── evaluation.md
1475
+ │ ├── annotation-guide.md
1476
+ │ └── demo-script.md
1477
+ ├── apps/
1478
+ │ ├── api/
1479
+ │ │ ├── main.py
1480
+ │ │ ├── routes/
1481
+ │ │ ├── schemas/
1482
+ │ │ ├── services/
1483
+ │ │ └── db/
1484
+ │ └── web/
1485
+ │ ├── src/
1486
+ │ └── public/
1487
+ ├── ml/
1488
+ │ ├── candidate_generation/
1489
+ │ ├── panel_builder/
1490
+ │ ├── vlm/
1491
+ │ ├── training/
1492
+ │ └── evaluation/
1493
+ ├── data/
1494
+ │ ├── raw/
1495
+ │ ├── processed/
1496
+ │ ├── cache/
1497
+ │ ├── labels/
1498
+ │ └── manifests/
1499
+ ├── scripts/
1500
+ │ ├── fetch_site_history.py
1501
+ │ ├── build_panels.py
1502
+ │ ├── run_inference.py
1503
+ │ ├── train_lora.py
1504
+ │ └── benchmark_models.py
1505
+ ├── tests/
1506
+ │ ├── fixtures/
1507
+ │ ├── test_api.py
1508
+ │ ├── test_candidates.py
1509
+ │ ├── test_panels.py
1510
+ │ ├── test_schema_validation.py
1511
+ │ ├── test_inference_smoke.py
1512
+ │ └── test_frontend_smoke.md
1513
+ └── assets/
1514
+ ├── demo_sites/
1515
+ ├── screenshots/
1516
+ └── diagrams/
1517
+ ```
1518
+
1519
+ ### 16.15 Deployment, Infrastructure, and Training
1520
+
1521
+ Recommended MVP runtime:
1522
+
1523
+ 1. SimSat
1524
+ 2. Mapbox
1525
+ 3. Hugging Face (model registry/auth)
1526
+ 4. FastAPI backend
1527
+ 5. React frontend
1528
+ 6. optional separate model-serving container
1529
+
1530
+ Recommended local setup:
1531
+
1532
+ - Docker Compose for local services
1533
+ - SQLite file in local volume
1534
+ - filesystem cache for panel assets
1535
+ - local or remote GPU path for inference
1536
+
1537
+ Recommended hosted setup:
1538
+
1539
+ - frontend on Vercel / Netlify,
1540
+ - backend on Railway / Render / Fly.io or similar,
1541
+ - training on Modal GPU (mandatory),
1542
+ - inference on a GPU instance or local GPU depending demo constraints.
1543
+
1544
+ Inference strategy:
1545
+
1546
+ - first path: `Transformers`
1547
+ - future path: `ONNX` or `GGUF` fallback
1548
+
1549
+ ### 16.16 Security, Secrets, Licensing, and Usage Risk
1550
+
1551
+ Must document:
1552
+
1553
+ - SimSat base URL and credentials,
1554
+ - Mapbox token,
1555
+ - Hugging Face token,
1556
+ - Modal token / workspace config and GPU runtime settings,
1557
+ - model license constraints,
1558
+ - Project Eucalyptus non-commercial or usage conditions if reused,
1559
+ - dataset provenance,
1560
+ - wording guardrails for real-site claims.
1561
+
1562
+ Minimum security checklist:
1563
+
1564
+ - `.env.example` committed,
1565
+ - secrets never committed,
1566
+ - cached artifacts reviewed for sensitive metadata,
1567
+ - export outputs avoid overclaiming or legal language.
1568
+
1569
+ ### 16.17 Competitor Positioning and Buyer Wedge
1570
+
1571
+ | System | Primary Mode | What It Does Well | LandfillSentry Difference |
1572
+ |---|---|---|---|
1573
+ | `WasteMAP` | transparency and decision support platform | broad waste methane visibility, scenario planning | LandfillSentry is site-operator-first and incident-oriented |
1574
+ | `UNEP MARS` | detect / attribute / notify ecosystem | large-event notification and public-interest action chain | LandfillSentry is not a global notification system; it is a facility triage workflow |
1575
+ | `Carbon Mapper` | emissions visibility and attribution | high-quality emissions detection and data products | LandfillSentry focuses on turning evidence into a workflow-ready incident object for operators |
1576
+
1577
+ Light GTM framing:
1578
+
1579
+ - **initial buyer wedge:** landfill operator or operator-adjacent environmental compliance lead
1580
+ - **near-term value:** inspection prioritization and reviewable incident workflow
1581
+ - **future expansion:** municipality dashboards, evidence export, insurer workflows, portfolio scoring
1582
+
1583
+ ### 16.18 Risk Matrix
1584
+
1585
+ | Risk | Probability | Impact | Mitigation | Fallback |
1586
+ |---|---|---|---|---|
1587
+ | SimSat imagery unavailable | Medium | High | freeze demo sites early, cache assets | cached demo path |
1588
+ | cloud cover too high | Medium | Medium | cloud filters and historical selection | use last acceptable scene |
1589
+ | candidate engine too noisy | Medium | High | thresholds, recurrence score, negatives | simpler ranking and stricter cutoffs |
1590
+ | invalid model JSON | Medium | High | schema prompts, retries, validation | normalization fallback or reject |
1591
+ | fine-tuning underdelivers | Medium | Medium | keep prompt-only baseline strong | demo prompt-only path |
1592
+ | Mapbox API outage or quota exhaustion | Medium | High | retries, quota monitoring, and warm cached Mapbox artifacts for frozen sites | cached Mapbox context for demo path |
1593
+ | overclaiming science | Medium | High | strict wording guardrails | reset narrative to triage copilot |
1594
+ | demo runtime instability | Medium | High | cached panels and results | full offline demo path |
1595
+
1596
+ ### 16.19 Post-Hackathon Roadmap
1597
+
1598
+ #### Phase 2 Productization
1599
+
1600
+ - better facility polygons and zone maps,
1601
+ - asynchronous scans and queueing,
1602
+ - stronger export formats,
1603
+ - operator feedback analytics,
1604
+ - improved threshold calibration.
1605
+
1606
+ #### Phase 3 Product Expansion
1607
+
1608
+ - municipality and compliance workflows,
1609
+ - audit trail and evidence lifecycle,
1610
+ - broader landfill portfolio monitoring,
1611
+ - richer weather and wind context,
1612
+ - active learning loop from operator feedback.
1613
+
1614
+ ---
1615
+
1616
+ ## 17) Initial Execution Wave
1617
+
1618
+ ### 17.1 Compressed 14-Day Build Plan
1619
+
1620
+ | Window | Focus | Required Output |
1621
+ |---|---|---|
1622
+ | Days 1-2 | Foundation lock | schemas, repo structure, demo-site shortlist, OpenAPI draft |
1623
+ | Days 3-4 | Site registry + imagery + cache | working live and cached imagery retrieval |
1624
+ | Days 5-6 | Candidate engine + panel builder | renderable evidence panels from frozen sites |
1625
+ | Days 7-8 | Base model incident pipeline | valid incident JSON and persistence |
1626
+ | Days 9-10 | Dataset prep + LoRA training | dataset manifest and first tuned checkpoint |
1627
+ | Days 11-12 | Evaluation + reliability | baseline comparison and failure tests |
1628
+ | Days 13-14 | React UI + demo hardening | watchlist workflow, export, final demo path |
1629
+
1630
+ ### 17.2 Recommended Initial Execution Cards
1631
+
1632
+ | Card ID | Title | Phase | Outcome |
1633
+ |---|---|---|---|
1634
+ | `EC-1-1-01` | Freeze incident schema and enums | `1.2` | stable contract for backend, ML, and UI |
1635
+ | `EC-1-1-02` | Freeze review-state workflow | `1.1` | proposed / published / dismissed / needs_review lifecycle |
1636
+ | `EC-1-2-01` | Draft and commit `openapi.json` | `1.2` | API contract baseline |
1637
+ | `EC-1-3-01` | Define golden fixture matrix | `1.3` | positive / negative / cloudy / missing-data fixtures |
1638
+ | `EC-1-3-02` | Select and freeze demo-site shortlist rubric | `1.1` | repeatable site-selection method |
1639
+ | `EC-2-1-01` | Implement site registry table and routes | `2.1` | list/register/get sites |
1640
+ | `EC-2-2-01` | Implement SimSat Sentinel retrieval adapter | `2.2` | current + historical Sentinel fetch |
1641
+ | `EC-2-2-02` | Implement required Mapbox retrieval adapter | `2.2` | mandatory context path for every scan |
1642
+ | `EC-2-3-01` | Implement image asset cache and replay | `2.3` | live/cached imagery modes |
1643
+ | `EC-3-1-01` | Build first heuristic candidate scorer | `3.1` | candidate bbox and score |
1644
+ | `EC-4-1-01` | Build evidence panel composer | `4.1` | stable panel output |
1645
+ | `EC-5-1-01` | Run prompt-only base model end to end | `5.1` | first valid incident object |
1646
+ | `EC-5-1-02` | Wire Hugging Face model auth and pinned revision load | `5.1` | reproducible model load path |
1647
+ | `EC-6-3-02` | Run first LoRA training job on Modal GPU | `6.3` | mandatory training-platform proof |
1648
+
1649
+ ### 17.3 Active Execution Cards (Recommended Starting Set)
1650
+
1651
+ ### `1.2` Contract Freeze
1652
+
1653
+ ### Card Identity
1654
+
1655
+ - **Card ID:** `EC-1-1-01`
1656
+ - **Title:** `Freeze Incident Schema And Enums`
1657
+ - **Phase/Part:** `1.2`
1658
+ - **Status:** `DONE`
1659
+
1660
+ ### Objective (1 sentence)
1661
+
1662
+ Define and freeze the `Incident` contract, enum values, and sample payloads so backend, ML, and frontend work from the same object.
1663
+
1664
+ ### Scope Guardrails
1665
+
1666
+ - **In scope:** schema fields, enums, sample JSON, validation rules
1667
+ - **Out of scope:** model inference implementation
1668
+ - **Do not change:** product scope or phase structure
1669
+
1670
+ ### Inputs
1671
+
1672
+ - Files/docs to read first: detailed report, answers doc, master plan sections `1-5`
1673
+ - Assumptions: operator-first triage and review flow are frozen
1674
+ - Dependencies/preconditions: none beyond planning baseline
1675
+
1676
+ ### Allowed File Changes
1677
+
1678
+ - `docs/architecture.md`
1679
+ - `apps/api/schemas/*`
1680
+ - `openapi.json`
1681
+
1682
+ ### Planned Output
1683
+
1684
+ - Expected code/artifact result: typed schema and example incident payload
1685
+ - User-visible behavior/result: downstream features all speak the same language
1686
+
1687
+ ### Verification
1688
+
1689
+ - Required checks: schema validation tests, example payload parse
1690
+ - Acceptance criteria:
1691
+ - [x] Incident schema validates sample payloads
1692
+ - [x] Enums are explicitly frozen and documented
1693
+ - [x] Review-state fields exist
1694
+
1695
+ ### Integration Check
1696
+
1697
+ - Previous phase dependency verified: `yes`
1698
+ - Live path verified: `n/a`
1699
+ - Cached path verified: `n/a`
1700
+
1701
+ ### Timebox & Control
1702
+
1703
+ - **Hard stop at (+45 min):** `split card`
1704
+
1705
+ ### `1.3` Testing Policy
1706
+
1707
+ ### Card Identity
1708
+
1709
+ - **Card ID:** `EC-1-3-01`
1710
+ - **Title:** `Define Golden Fixture Matrix`
1711
+ - **Phase/Part:** `1.3`
1712
+ - **Status:** `DONE`
1713
+
1714
+ ### Objective (1 sentence)
1715
+
1716
+ Freeze the minimum fixture classes that all later tests and demo hardening will use.
1717
+
1718
+ ### Scope Guardrails
1719
+
1720
+ - **In scope:** fixture taxonomy, storage convention, naming policy
1721
+ - **Out of scope:** full fixture creation
1722
+ - **Do not change:** core product thesis
1723
+
1724
+ ### Verification
1725
+
1726
+ - Acceptance criteria:
1727
+ - [x] Positive fixture defined
1728
+ - [x] Negative fixture defined
1729
+ - [x] Cloudy fixture defined
1730
+ - [x] Missing-data fixture defined
1731
+
1732
+ ### `2.1` Site Registry
1733
+
1734
+ ### Card Identity
1735
+
1736
+ - **Card ID:** `EC-2-1-01`
1737
+ - **Title:** `Implement Site Registry Endpoints`
1738
+ - **Phase/Part:** `2.1`
1739
+ - **Status:** `DONE`
1740
+
1741
+ ### Objective (1 sentence)
1742
+
1743
+ Create site storage and API routes so the watchlist and scan pipeline have a stable source of truth for demo sites.
1744
+
1745
+ ### Scope Guardrails
1746
+
1747
+ - **In scope:** register, list, get site
1748
+ - **Out of scope:** complex auth, multi-tenant management
1749
+ - **Do not change:** SQLite-first storage choice
1750
+
1751
+ ### Verification
1752
+
1753
+ - Acceptance criteria:
1754
+ - [x] Site create endpoint works
1755
+ - [x] Site list endpoint works
1756
+ - [x] Site read endpoint works
1757
+ - [x] Contracts align with `openapi.json`
1758
+
1759
+ ### `2.2` Imagery Adapter
1760
+
1761
+ ### Card Identity
1762
+
1763
+ - **Card ID:** `EC-2-2-01`
1764
+ - **Title:** `Implement SimSat Sentinel Adapter`
1765
+ - **Phase/Part:** `2.2`
1766
+ - **Status:** `DONE`
1767
+
1768
+ ### Objective (1 sentence)
1769
+
1770
+ Fetch current and historical Sentinel-2 imagery from SimSat and normalize the response for downstream services.
1771
+
1772
+ ### Scope Guardrails
1773
+
1774
+ - **In scope:** adapter, request params, response normalization, error handling
1775
+ - **Out of scope:** candidate scoring
1776
+ - **Do not change:** SimSat-first MVP assumption
1777
+
1778
+ ### Verification
1779
+
1780
+ - Acceptance criteria:
1781
+ - [x] Current imagery fetch works for one demo site
1782
+ - [x] Historical imagery fetch works for one demo site
1783
+ - [x] Missing-data path is handled cleanly
1784
+
1785
+ ### `2.3` Cache Layer
1786
+
1787
+ ### Card Identity
1788
+
1789
+ - **Card ID:** `EC-2-3-01`
1790
+ - **Title:** `Implement Image Cache And Replay`
1791
+ - **Phase/Part:** `2.3`
1792
+ - **Status:** `DONE`
1793
+
1794
+ ### Objective (1 sentence)
1795
+
1796
+ Persist fetched imagery and metadata so scans can replay without live dependency calls.
1797
+
1798
+ ### Scope Guardrails
1799
+
1800
+ - **In scope:** cache directory layout, DB asset metadata, replay mode
1801
+ - **Out of scope:** distributed caching
1802
+ - **Do not change:** local-first MVP architecture
1803
+
1804
+ ### Verification
1805
+
1806
+ - Acceptance criteria:
1807
+ - [x] Asset metadata persists
1808
+ - [x] Cached replay succeeds with live calls disabled
1809
+ - [x] Cache path integrates with fixture strategy
1810
+
1811
+ ### `3.1` Candidate Heuristics
1812
+
1813
+ ### Card Identity
1814
+
1815
+ - **Card ID:** `EC-3-1-01`
1816
+ - **Title:** `Build First Candidate Scorer`
1817
+ - **Phase/Part:** `3.1`
1818
+ - **Status:** `DONE`
1819
+
1820
+ ### Objective (1 sentence)
1821
+
1822
+ Produce at least one ranked candidate bbox and score from cached imagery using a simple stable heuristic path.
1823
+
1824
+ ### Scope Guardrails
1825
+
1826
+ - **In scope:** simple anomaly rule, bbox proposal, score field
1827
+ - **Out of scope:** learned ranking model
1828
+ - **Do not change:** candidate object contract
1829
+
1830
+ ### Verification
1831
+
1832
+ - Acceptance criteria:
1833
+ - [x] Candidate object validates
1834
+ - [x] Positive fixture produces a nontrivial candidate
1835
+ - [x] Negative fixture does not trigger high-confidence output
1836
+ - [x] Live scan path for candidate stage works with SimSat current/historical Sentinel plus required current Mapbox context
1837
+
1838
+ ### `4.1` Evidence Panels
1839
+
1840
+ ### Card Identity
1841
+
1842
+ - **Card ID:** `EC-4-1-01`
1843
+ - **Title:** `Build Evidence Panel Composer`
1844
+ - **Phase/Part:** `4.1`
1845
+ - **Status:** `DONE`
1846
+
1847
+ ### Objective (1 sentence)
1848
+
1849
+ Generate a deterministic evidence panel from imagery, candidate, and metadata that can be reused for both inference and training.
1850
+
1851
+ ### Scope Guardrails
1852
+
1853
+ - **In scope:** image panel layout, metadata block, panel file output
1854
+ - **Out of scope:** model inference
1855
+ - **Do not change:** frozen panel contract once accepted
1856
+
1857
+ ### Verification
1858
+
1859
+ - Acceptance criteria:
1860
+ - [x] Panel renders for one positive fixture
1861
+ - [x] Panel renders for one negative fixture
1862
+ - [x] Panel metadata includes required fields
1863
+
1864
+ ### 17.4 Immediate Planning-to-Build Handoff
1865
+
1866
+ The very first implementation wave should stop only after this mini-checklist is true:
1867
+
1868
+ - `Incident` schema frozen
1869
+ - golden fixture matrix frozen
1870
+ - demo-site selection rubric frozen
1871
+ - site registry running
1872
+ - live and cached SimSat retrieval working
1873
+ - first candidate object emitted
1874
+ - first evidence panel rendered
1875
+
1876
+ At that point the plan has successfully crossed from architecture into working software.
1877
+
1878
+ ---
1879
+
1880
+ ## 18) Execution Card Template (Embedded)
1881
+
1882
+ ### Card Identity
1883
+
1884
+ - **Card ID:** `EC-<phase>-<part>-<task>`
1885
+ - **Title:** `<short action title>`
1886
+ - **Phase/Part:** `<e.g., 2.2>`
1887
+ - **Status:** `TODO | WIP | BLOCKED | DONE`
1888
+
1889
+ ### Objective (1 sentence)
1890
+
1891
+ Describe exactly what must be true when this card is done.
1892
+
1893
+ ### Scope Guardrails
1894
+
1895
+ - **In scope:**
1896
+ - **Out of scope:**
1897
+ - **Do not change:**
1898
+
1899
+ ### Inputs
1900
+
1901
+ - Files/docs to read first:
1902
+ - Assumptions:
1903
+ - Dependencies/preconditions:
1904
+
1905
+ ### Allowed File Changes
1906
+
1907
+ - `path/to/file1`
1908
+ - `path/to/file2`
1909
+
1910
+ ### Planned Output
1911
+
1912
+ - Expected code/artifact result:
1913
+ - User-visible behavior/result:
1914
+
1915
+ ### Verification
1916
+
1917
+ - Required checks (tests/lint/typecheck/run path):
1918
+ - Acceptance criteria:
1919
+ - [ ] Criteria 1
1920
+ - [ ] Criteria 2
1921
+
1922
+ ### Integration Check
1923
+
1924
+ - Previous phase dependency verified:
1925
+ - Live path verified:
1926
+ - Cached path verified:
1927
+
1928
+ ### Timebox & Control
1929
+
1930
+ - **Started at:**
1931
+ - **Checkpoint at (+25 min):**
1932
+ - **Hard stop at (+45 min):**
1933
+ - **If not done by hard stop:** `split card | mark blocked`
1934
+
1935
+ ### Execution Log
1936
+
1937
+ - **Attempt 1:**
1938
+ - Summary:
1939
+ - Files changed:
1940
+ - Verification result:
1941
+ - Outcome: `continue | done | blocked`
1942
+
1943
+ ### Completion
1944
+
1945
+ - **Ended at:**
1946
+ - **Elapsed (minutes):**
1947
+ - **Final status:** `DONE | BLOCKED | SPLIT`
1948
+
1949
+ ---
1950
+
1951
+ ## 19) Final Usage Pattern (Single File)
1952
+
1953
+ 1. Use this file as the canonical planning artifact.
1954
+ 2. Treat sections `0-17` as the strategy-and-execution baseline.
1955
+ 3. Use section `17` to start work immediately.
1956
+ 4. Add more execution cards under section `18` as implementation expands.
1957
+ 5. Update the progress tracker after each completed phase or major card.
1958
+ 6. Update the change log after every meaningful planning or implementation milestone.
1959
+ 7. Treat integration checkpoints as hard gates, not advisory notes.