Instructions to use akashreddy2103/landfill with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- PEFT
How to use akashreddy2103/landfill with PEFT:
from peft import PeftModel from transformers import AutoModelForCausalLM base_model = AutoModelForCausalLM.from_pretrained("LiquidAI/LFM2.5-VL-450M") model = PeftModel.from_pretrained(base_model, "akashreddy2103/landfill") - Notebooks
- Google Colab
- Kaggle
Upload folder using huggingface_hub
Browse files- benchmark_summary_for_submission.md +1 -1
- docs/Judging_Gap_Closure_Plan.md +174 -0
- docs/annotation-guide.md +79 -0
- docs/architecture.md +39 -0
- docs/demo-script.md +11 -0
- docs/demo-site-selection-rubric.md +34 -0
- docs/demo_video_shotlist.md +46 -0
- docs/evaluation.md +87 -0
- docs/field-dictionary.md +87 -0
- docs/global_live_api_probe_report.md +37 -0
- docs/global_live_dataset_summary.md +74 -0
- docs/global_live_scan_collection_report.md +27 -0
- docs/integration-checklist.md +11 -0
- docs/testing-charter.md +54 -0
- judge_deployment_runbook.md +6 -14
- phase7_baseline_comparison.md +5 -0
- project_README.md +268 -0
- project_docs/LandfillSentry_Ops_Answers_to_Open_Questions.md +748 -0
- project_docs/LandfillSentry_Ops_Detailed_Report.md +2093 -0
- project_docs/LandfillSentry_Ops_Master_Project_Plan.md +1959 -0
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 +
|
| 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 |
-
-
|
| 30 |
- Modal training scaffold and checkpoint record.
|
| 31 |
- Benchmark/evaluation artifacts for a small domain-adaptation fixture proxy.
|
| 32 |
|
| 33 |
-
##
|
| 34 |
|
| 35 |
-
|
| 36 |
|
| 37 |
-
- `HF_ADAPTER_ID
|
| 38 |
- `HF_TOKEN`: a token that can read the base model and adapter during judging.
|
| 39 |
- `MAPBOX_TOKEN`: needed by SimSat Mapbox imagery.
|
| 40 |
-
-
|
| 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=
|
| 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.
|