Image-to-Text
PyTorch
Safetensors
PEFT
English
remote-sensing
satellite-imagery
earth-observation
change-detection
visual-grounding
image-captioning
visual-question-answering
optical-sar-fusion
sar
multimodal
lora
Instructions to use thundercode/SatQuery with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- PEFT
How to use thundercode/SatQuery with PEFT:
Task type is invalid.
- Notebooks
- Google Colab
- Kaggle
release: add docs/CHANGELOG.md
Browse files- docs/CHANGELOG.md +523 -97
docs/CHANGELOG.md
CHANGED
|
@@ -1,94 +1,162 @@
|
|
| 1 |
# Changelog
|
| 2 |
|
| 3 |
-
All notable changes to SatQuery AI. Dates are ISO-8601. This changelog records **what changed and
|
| 4 |
-
|
|
|
|
|
|
|
| 5 |
|
| 6 |
-
Status tags: `RESOLVED` Β· `OPEN` Β· `CLOSED` Β· `DEFERRED` Β· `REJECTED`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 7 |
|
| 8 |
---
|
| 9 |
|
| 10 |
## [1.0.0] β 2026-09-25 β Final documentation, model release and archival freeze
|
| 11 |
|
| 12 |
-
The release that makes the project legible, citable and reproducible: repository documentation, a
|
| 13 |
-
|
| 14 |
-
|
| 15 |
|
| 16 |
### Added
|
| 17 |
|
| 18 |
-
**
|
| 19 |
-
|
| 20 |
-
- **Repository README** β motivation through citation
|
| 21 |
-
tasks, routing, the eight execution events, measured results, live validation, and known
|
| 22 |
-
limitations.
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 44 |
|
| 45 |
**Release**
|
| 46 |
|
| 47 |
-
- **Hugging Face release** of the six trained artifacts to `thundercode/SatQuery`, with a
|
| 48 |
-
record (`HF_RELEASE_VERIFICATION.md`). Independent
|
| 49 |
-
byte-identical**.
|
| 50 |
-
|
| 51 |
-
- **
|
| 52 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 53 |
|
| 54 |
### Changed
|
| 55 |
|
| 56 |
- The monorepo `README.md` was **materially stale** and is superseded by this release's README. The
|
| 57 |
stale version called the frontend "hermetic β no backend calls", put Render/Codespace as
|
| 58 |
-
"in progress", described a `/v1/*` contract, and pointed at the untracked `deploy/` as the
|
| 59 |
-
|
| 60 |
-
- `hf/` documentation was **stale** β it asserted the project "does not own any model weights β¦ ships
|
| 61 |
-
|
| 62 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 63 |
|
| 64 |
### Fixed
|
| 65 |
|
| 66 |
- **Router defect** β *"Where are the built-up areas in this image?"* collapsed to `vqa` and answered
|
| 67 |
"River". Fixed in the dispatch path and validated across three independent live passes (8/8 each).
|
| 68 |
-
`RESOLVED`.
|
| 69 |
- **Live-validation harness false positive** β synthetic CDP key events were silently dropped when the
|
| 70 |
-
window lacked OS focus, so the harness dispatched the page's default query and recorded a false
|
| 71 |
-
|
| 72 |
-
- **Bundled EO change pair** β the demo pair differed in shape (726Β² vs 736Β²) and errored
|
| 73 |
-
with a same-shape pair (both 720Γ720). `RESOLVED`
|
|
|
|
| 74 |
- **B-01 (Hugging Face header link)** β previously `BLOCKED`; the link is now live on all 11 pages.
|
| 75 |
`CLOSED`.
|
| 76 |
- **Metric-verifier dotted-path bug** β the resolver split the artifact key `"0.50"` on its own dot,
|
| 77 |
producing a false `NOKEY` for the two grounding recall claims. Fixed to prefer the **longest**
|
| 78 |
-
matching key at each step.
|
| 79 |
|
| 80 |
### Known issues at this release
|
| 81 |
|
| 82 |
- **B-07** β transient tunnel-agent gaps; a request can hang or return 504. Patch prepared, **NOT
|
| 83 |
deployed**. `OPEN`.
|
| 84 |
-
- **B-02** β `/api/health` `codespace_name` carries a trailing `\n`. Cosmetic
|
| 85 |
-
|
|
|
|
| 86 |
- **No system-level end-to-end benchmark** exists. `NOT RUN`.
|
| 87 |
- **Router test split** never scored. `NOT RUN`.
|
| 88 |
- **Calibration** worsened ECE (0.013755 β 0.014929). Retained as part of the frozen config only.
|
| 89 |
-
- **VLM adapter** is `ACCEPTANCE-REJECTED` despite usable metrics
|
| 90 |
-
unadapted model.
|
| 91 |
- **optical-SAR** and **change-VQA** rulings remain `OPEN`.
|
|
|
|
|
|
|
|
|
|
|
|
|
| 92 |
|
| 93 |
### Deployment revisions at this release
|
| 94 |
|
|
@@ -99,65 +167,341 @@ curated public repository, and a verified evidence archive.
|
|
| 99 |
| Inference | `5a0936ace491` |
|
| 100 |
| Public umbrella | `3dcabd32da41` |
|
| 101 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 102 |
---
|
| 103 |
|
| 104 |
## [0.9.0] β 2026-09-25 β Router-defect sprint
|
| 105 |
|
| 106 |
-
|
| 107 |
-
|
| 108 |
-
|
| 109 |
-
|
| 110 |
-
-
|
| 111 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 112 |
- Wrote the delivery report and the handoff.
|
| 113 |
-
- Prepared (but did not deploy) the B-07 backend patch
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 114 |
|
| 115 |
---
|
| 116 |
|
| 117 |
## [0.8.0] β 2026-09-24/25 β Deployment hardening
|
| 118 |
|
| 119 |
-
|
| 120 |
-
|
| 121 |
-
|
| 122 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 123 |
|
| 124 |
---
|
| 125 |
|
| 126 |
## [0.7.0] β Grounding and change heads
|
| 127 |
|
| 128 |
-
|
| 129 |
-
|
| 130 |
-
|
| 131 |
-
|
| 132 |
-
|
| 133 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 134 |
|
| 135 |
---
|
| 136 |
|
| 137 |
## [0.6.0] β VLM adaptation
|
| 138 |
|
| 139 |
-
|
| 140 |
-
|
| 141 |
-
|
| 142 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 143 |
|
| 144 |
---
|
| 145 |
|
| 146 |
## [0.5.0] β Router
|
| 147 |
|
| 148 |
-
|
| 149 |
-
|
| 150 |
-
-
|
| 151 |
-
|
| 152 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 153 |
|
| 154 |
---
|
| 155 |
|
| 156 |
## [0.1.0] β Foundation
|
| 157 |
|
| 158 |
-
- Monorepo
|
| 159 |
-
(`78f1e3700da15aa1`)
|
| 160 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 161 |
|
| 162 |
---
|
| 163 |
|
|
@@ -172,24 +516,106 @@ curated public repository, and a verified evidence archive.
|
|
| 172 |
| Resolve the optical-SAR and change-VQA rulings | **OPEN** |
|
| 173 |
| Plot the calibrated reliability curve | **NOT RUN** |
|
| 174 |
| Replace the illustrative benchmark adapter numbers with real runs | **NOT RUN** |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 175 |
|
| 176 |
---
|
| 177 |
|
| 178 |
## Documentation inventory shipped in 1.0.0
|
| 179 |
|
| 180 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 181 |
|---|---|
|
| 182 |
-
| `
|
| 183 |
-
|
|
| 184 |
-
| `
|
| 185 |
-
|
|
| 186 |
-
| `docs/
|
| 187 |
-
|
|
| 188 |
-
| `docs/
|
| 189 |
-
| `docs/
|
| 190 |
-
| `docs/
|
| 191 |
-
| `
|
| 192 |
-
| `docs/LIMITATIONS.md` | the full limitation catalogue |
|
| 193 |
-
| `docs/RESEARCH_NOTES.md` | engineering findings and negative results |
|
| 194 |
-
| `docs/CHANGELOG.md` | this file |
|
| 195 |
-
| `models/manifest.json`, `models/checksums.sha256` | generated artifact identities |
|
|
|
|
| 1 |
# Changelog
|
| 2 |
|
| 3 |
+
All notable changes to SatQuery AI. Dates are ISO-8601. This changelog records **what changed and what
|
| 4 |
+
was verified**, and marks unresolved items honestly rather than omitting them. It follows the same
|
| 5 |
+
no-fabrication rule as the rest of the documentation set: an item that is `NOT RUN` stays `NOT RUN`, a
|
| 6 |
+
`REJECTED` verdict is never softened, and a negative result is reported as one.
|
| 7 |
|
| 8 |
+
**Status tags:** `RESOLVED` Β· `OPEN` Β· `CLOSED` Β· `DEFERRED` Β· `REJECTED` Β· `NOT RUN` Β· `BLOCKED` Β·
|
| 9 |
+
`VERIFIED` Β· `MEASURED`.
|
| 10 |
+
|
| 11 |
+
**Conventions.** Versions are the project's own release line, not the plan's phase numbers (owner
|
| 12 |
+
decision D-5: the master plan's numbering is authoritative for *phases*; this changelog's numbering is
|
| 13 |
+
the *release* line). Where an earlier statement in a linked document was later found wrong, the original
|
| 14 |
+
is retained and a dated correction is appended β a retained-and-corrected record is more useful than a
|
| 15 |
+
silently overwritten one (`docs/OWNER_DECISIONS_2026-09-23.md`, convention).
|
| 16 |
+
|
| 17 |
+
**Related documents.** [`../MODEL_CARD.md`](../MODEL_CARD.md) Β· [`MODELS.md`](MODELS.md) Β·
|
| 18 |
+
[`BENCHMARKS.md`](BENCHMARKS.md) Β· [`TRAINING.md`](TRAINING.md) Β· [`EVALUATION.md`](EVALUATION.md) Β·
|
| 19 |
+
[`LIMITATIONS.md`](LIMITATIONS.md) Β· [`RESEARCH_NOTES.md`](RESEARCH_NOTES.md) Β·
|
| 20 |
+
[`ARCHITECTURE.md`](ARCHITECTURE.md).
|
| 21 |
|
| 22 |
---
|
| 23 |
|
| 24 |
## [1.0.0] β 2026-09-25 β Final documentation, model release and archival freeze
|
| 25 |
|
| 26 |
+
The release that makes the project legible, citable and reproducible: repository documentation, a deep
|
| 27 |
+
research/engineering documentation set, model documentation, a Hugging Face model release, a curated
|
| 28 |
+
public repository, and a verified evidence archive.
|
| 29 |
|
| 30 |
### Added
|
| 31 |
|
| 32 |
+
**Repository documentation**
|
| 33 |
+
|
| 34 |
+
- **Repository README** β 27 sections, from motivation through citation: the deployed topology, the six
|
| 35 |
+
supported tasks, routing, the eight execution events, measured results, live validation, and known
|
| 36 |
+
limitations. **All 20 quoted metrics were verified against their source artifacts** at the README's
|
| 37 |
+
printed precision (`release/tools/readme_metrics_report.txt` β `ALL CLAIMS VERIFIED`).
|
| 38 |
+
- **Eight real screenshots** captured from the post-fix live run
|
| 39 |
+
(`release/repo/screenshots/`), each confirmed to show a live run (run id + config hash
|
| 40 |
+
`78f1e3700da15aa1` + specialist evidence), not a mock.
|
| 41 |
+
|
| 42 |
+
**Deep architecture reference** (hub + 10 chapters)
|
| 43 |
+
|
| 44 |
+
| Chapter | Topic |
|
| 45 |
+
|---|---|
|
| 46 |
+
| `docs/ARCHITECTURE.md` | hub: thesis, sub-document index, cross-cutting principles |
|
| 47 |
+
| `docs/architecture/01-system-overview.md` | thesis, component inventory, frozen-backbone strategy |
|
| 48 |
+
| `docs/architecture/02-deployment-topology.md` | four tiers, gateway, tunnel, wake flow, cold start |
|
| 49 |
+
| `docs/architecture/03-request-lifecycle.md` | the nine-state controller, validation, tiling |
|
| 50 |
+
| `docs/architecture/04-router.md` | frozen MiniLM, the 5-head adapter, `interpret()` vs `chooseTask()`, lexical fallback |
|
| 51 |
+
| `docs/architecture/05-specialists.md` | all six tasks in depth |
|
| 52 |
+
| `docs/architecture/06-evidence-and-confidence.md` | evidence aggregation, temperature scaling, the eight events |
|
| 53 |
+
| `docs/architecture/07-configuration-freeze.md` | the registry, enforced invariants, the config hash |
|
| 54 |
+
| `docs/architecture/08-api-contract.md` | the four endpoints, envelopes, error codes |
|
| 55 |
+
| `docs/architecture/09-frontend.md` | the static pages, real-vs-preview, platform traps |
|
| 56 |
+
| `docs/architecture/10-observability-and-ops.md` | health, counters, traces, what is not observed |
|
| 57 |
+
|
| 58 |
+
**Research documentation** β `MODELS.md`, `BENCHMARKS.md`, `DATASETS.md`, `TRAINING.md`,
|
| 59 |
+
`EVALUATION.md`, `DEPLOYMENT.md`, `REPRODUCIBILITY.md`, `LIMITATIONS.md`, `RESEARCH_NOTES.md`,
|
| 60 |
+
`CHANGELOG.md`.
|
| 61 |
+
|
| 62 |
+
**Extended engineering-documentation set** (added in the same release, deep-reference depth):
|
| 63 |
+
|
| 64 |
+
`SECURITY.md`, `TESTING.md`, `GEOSPATIAL.md`, `DATA_PIPELINE.md`, `OPERATIONS.md`, `DEVELOPMENT.md`,
|
| 65 |
+
`PERFORMANCE.md`, `GLOSSARY.md`, `FRONTEND.md`, `SERVING.md`. See the
|
| 66 |
+
[complete documentation inventory](#documentation-inventory-shipped-in-100) below.
|
| 67 |
+
|
| 68 |
+
**Model documentation**
|
| 69 |
+
|
| 70 |
+
- **`MODEL_CARD.md`** β the Hugging Face model card, expanded to deep-reference depth in this pass: an
|
| 71 |
+
overview; the six-artifact table with byte counts and full sha256; backbone dependencies with pinned
|
| 72 |
+
revisions; intended and out-of-scope use; a per-artifact section (architecture, hyperparameters,
|
| 73 |
+
training data, evaluation protocol, measured numbers, acceptance status, limitations) for each of the
|
| 74 |
+
six artifacts; the full measured-performance table; the calibration negative result; the
|
| 75 |
+
acceptance-status table; the evaluation gaps; the limitations; a training summary; provenance and
|
| 76 |
+
verification; licence; and citation. Retains its YAML frontmatter (`license: other`, tags,
|
| 77 |
+
`pipeline_tag: image-to-text`, `config_hash: 78f1e3700da15aa1`).
|
| 78 |
+
- **`models/manifest.json`** and **`models/checksums.sha256`** β **generated by reading the files**
|
| 79 |
+
(`release/tools/generate_model_manifest.py`), never typed by hand. Six artifacts, each with
|
| 80 |
+
`status: "PRESENT"` and the frozen config hash. Two digests (`change_vqa`, `vlm`) **agree exactly**
|
| 81 |
+
with values recorded independently at promotion/fit time β an external cross-check, not a
|
| 82 |
+
self-consistency claim.
|
| 83 |
+
|
| 84 |
+
**Metric verification tooling**
|
| 85 |
+
|
| 86 |
+
- **`release/tools/verify_readme_metrics.py`** β walks every quoted metric to its source artifact and
|
| 87 |
+
the exact key path inside it. Result: **`ALL CLAIMS VERIFIED`** (20/20), plus status assertions (VLM
|
| 88 |
+
headline contains `ACCEPTANCE-REJECTED`; router `corpus_limited` with `n_val` 86; calibration
|
| 89 |
+
`ece_improvement` negative). Output committed as `release/tools/readme_metrics_report.txt`.
|
| 90 |
|
| 91 |
**Release**
|
| 92 |
|
| 93 |
+
- **Hugging Face release** of the six trained artifacts to `thundercode/SatQuery` (public), with a
|
| 94 |
+
verification record ([`../HF_RELEASE_VERIFICATION.md`](../HF_RELEASE_VERIFICATION.md)). Independent
|
| 95 |
+
re-download over direct HTTPS confirmed **6/6 artifacts byte-identical**, 0 failed. Total released
|
| 96 |
+
weight payload **131,130,325 bytes (~125 MiB)**; **no backbone weights are redistributed**.
|
| 97 |
+
- **Curated public repository** target `Anish-lab-blip/SatQuery-AI`, with
|
| 98 |
+
[`../RELEASE_MANIFEST.md`](../RELEASE_MANIFEST.md) (42 files, 8,401,031 bytes, each with size and
|
| 99 |
+
sha256, generated from disk).
|
| 100 |
+
- **Evidence archive** β scope set by owner decision G3 (`artifacts/` verbatim, ~3.7 GB, requiring
|
| 101 |
+
ZIP64), with an integrity-verified extraction and a documented remote location (owner decision G2:
|
| 102 |
+
Hugging Face Hub).
|
| 103 |
+
|
| 104 |
+
**This pass (documentation depth)**
|
| 105 |
+
|
| 106 |
+
- **`MODEL_CARD.md` expanded in place** to deep-reference depth (see Model documentation above).
|
| 107 |
+
- **`CHANGELOG.md` expanded in place** β the full 1.0.0 entry, the earlier version entries (0.9.0 β
|
| 108 |
+
0.1.0), an Unreleased/Open section, and the **complete documentation inventory** below.
|
| 109 |
|
| 110 |
### Changed
|
| 111 |
|
| 112 |
- The monorepo `README.md` was **materially stale** and is superseded by this release's README. The
|
| 113 |
stale version called the frontend "hermetic β no backend calls", put Render/Codespace as
|
| 114 |
+
"in progress", described a `/v1/*` contract, and pointed at the untracked `deploy/` as the deployment
|
| 115 |
+
source. **All four were wrong.**
|
| 116 |
+
- `hf/` documentation was **stale** β it asserted the project "does not own any model weights β¦ ships no
|
| 117 |
+
weights, no binaries, and no large artifacts" and "has no Hugging Face credentials". **Both were false
|
| 118 |
+
at release time** and are corrected.
|
| 119 |
+
- **Documentation set expanded.** Ten new deep-reference docs were added after `RELEASE_MANIFEST.md` and
|
| 120 |
+
the Hugging Face upload were generated. **Consequence, stated plainly:** the release manifest (42
|
| 121 |
+
files) and the Hub's 26 markdown files **do not yet include** those ten documents. The manifest and the
|
| 122 |
+
Hub listing are therefore **stale relative to the local release tree** and must be regenerated /
|
| 123 |
+
re-uploaded before they can be treated as authoritative. See
|
| 124 |
+
[the inventory](#documentation-inventory-shipped-in-100).
|
| 125 |
|
| 126 |
### Fixed
|
| 127 |
|
| 128 |
- **Router defect** β *"Where are the built-up areas in this image?"* collapsed to `vqa` and answered
|
| 129 |
"River". Fixed in the dispatch path and validated across three independent live passes (8/8 each).
|
| 130 |
+
`RESOLVED`. (Details in 0.9.0.)
|
| 131 |
- **Live-validation harness false positive** β synthetic CDP key events were silently dropped when the
|
| 132 |
+
window lacked OS focus, so the harness dispatched the page's default query and recorded a false pass.
|
| 133 |
+
Fixed with pre-dispatch form-state assertions (`q_ok`, `obs_ok`, `t0_ok`). `RESOLVED`.
|
| 134 |
+
- **Bundled EO change pair** β the demo pair differed in shape (726Β² vs 736Β²) and errored
|
| 135 |
+
(`T1 and T2 must have the same shape`). Replaced with a same-shape pair (both 720Γ720). `RESOLVED`
|
| 136 |
+
(supersedes `docs/FINAL_DELIVERY_REPORT.md` Β§6).
|
| 137 |
- **B-01 (Hugging Face header link)** β previously `BLOCKED`; the link is now live on all 11 pages.
|
| 138 |
`CLOSED`.
|
| 139 |
- **Metric-verifier dotted-path bug** β the resolver split the artifact key `"0.50"` on its own dot,
|
| 140 |
producing a false `NOKEY` for the two grounding recall claims. Fixed to prefer the **longest**
|
| 141 |
+
matching key at each step. `RESOLVED`.
|
| 142 |
|
| 143 |
### Known issues at this release
|
| 144 |
|
| 145 |
- **B-07** β transient tunnel-agent gaps; a request can hang or return 504. Patch prepared, **NOT
|
| 146 |
deployed**. `OPEN`.
|
| 147 |
+
- **B-02** β `/api/health` `codespace_name` carries a trailing `\n`. Cosmetic; the wake path strips it.
|
| 148 |
+
`OPEN`.
|
| 149 |
+
- **No `LICENSE` file** exists in the source repository. `OPEN`.
|
| 150 |
- **No system-level end-to-end benchmark** exists. `NOT RUN`.
|
| 151 |
- **Router test split** never scored. `NOT RUN`.
|
| 152 |
- **Calibration** worsened ECE (0.013755 β 0.014929). Retained as part of the frozen config only.
|
| 153 |
+
- **VLM adapter** is `ACCEPTANCE-REJECTED` despite usable metrics (exact_match 0.963, F1 0.96432); the
|
| 154 |
+
deployed path uses the unadapted model.
|
| 155 |
- **optical-SAR** and **change-VQA** rulings remain `OPEN`.
|
| 156 |
+
- **GitHub push** β at the time of `release/RELEASE_EXECUTION_CHECKLIST.md` Phase 5 the push to
|
| 157 |
+
`Anish-lab-blip/SatQuery-AI` was `BLOCKED` (`403 Resource not accessible by personal access token`;
|
| 158 |
+
the token was read-only for repository contents). Owner action.
|
| 159 |
+
- **Release manifest / Hub doc set** stale relative to the ten new deep docs (see *Changed*).
|
| 160 |
|
| 161 |
### Deployment revisions at this release
|
| 162 |
|
|
|
|
| 167 |
| Inference | `5a0936ace491` |
|
| 168 |
| Public umbrella | `3dcabd32da41` |
|
| 169 |
|
| 170 |
+
**Live validation.** 3 passes Γ 8 cases, **8/8 each**, **24 live runs, 24 correct dispatches, 0 mock
|
| 171 |
+
nodes**, trace fill **94.4444 %**. Representative real run ids: vqa `run_ddf81a1c3871`, caption
|
| 172 |
+
`run_15d7b9ecf594`, grounding `run_d124d8b9adea` (3 regions, calibrated 0.52), change
|
| 173 |
+
`run_c6249437253d`, optical_sar `run_028b200fb710` (`docs/FINAL_DELIVERY_REPORT.md` Β§4).
|
| 174 |
+
|
| 175 |
+
### The six released artifacts at this release
|
| 176 |
+
|
| 177 |
+
Generated identities from [`../models/manifest.json`](../models/manifest.json); see
|
| 178 |
+
[`../MODEL_CARD.md`](../MODEL_CARD.md) Β§3 for the full table with source paths and cross-checks.
|
| 179 |
+
|
| 180 |
+
| Task | Kind | File | Bytes | sha256 (full) |
|
| 181 |
+
|---|---|---|---|---|
|
| 182 |
+
| `change` | trained head | `change/head.pt` | 63,231,009 | `c5ef31277b67aa01a593aec0eac503eeaccc6d674349fda20ca44c9cc6f8e9fa` |
|
| 183 |
+
| `change_vqa` | trained head | `change_vqa/head.pt` | 5,822,809 | `cfae5e43b97ca930f568dc5b8ae4f36b24e9ff717af226159802206ffd63a82a` |
|
| 184 |
+
| `optical_sar` | trained head | `optical_sar/head.pt` | 14,427,457 | `785815729a3a39fc34dc41894efaf00d8739365d970a3f830a326e68ae888dab` |
|
| 185 |
+
| `grounding` | trained head | `grounding/head.pt` | 12,639,041 | `93432f7034be91a8ffd9c1a84e3eeec00bed7832c043fe7f83d2be230284c6bb` |
|
| 186 |
+
| `router` | trained adapter | `router/adapter.pt` | 211,961 | `8527c3ed28a293e13293d48601d48e3ceafa137b9acabddaf5de31a58a509b5c` |
|
| 187 |
+
| `vlm` | LoRA adapter | `vlm/adapter_model.safetensors` | 34,798,048 | `07c76a75fa04624880ed7730590f5fdd7b145a8232e3c0af411c3c545a5adf5e` |
|
| 188 |
+
|
| 189 |
+
Every digest above is copied from [`../models/manifest.json`](../models/manifest.json); consult the
|
| 190 |
+
manifest, which wins over any hand-typed copy.
|
| 191 |
+
|
| 192 |
+
Total released weight payload: **131,130,325 bytes (~125 MiB)**. No backbone weights are redistributed.
|
| 193 |
+
|
| 194 |
+
### Measured results at this release
|
| 195 |
+
|
| 196 |
+
Every row names its source artifact; all 20 numeric claims are checked by
|
| 197 |
+
`release/tools/verify_readme_metrics.py` (`ALL CLAIMS VERIFIED`). The full annotated version is
|
| 198 |
+
[`../MODEL_CARD.md`](../MODEL_CARD.md) Β§8 and [`BENCHMARKS.md`](BENCHMARKS.md) Β§1.
|
| 199 |
+
|
| 200 |
+
| Capability | Metric | Value | Split / protocol | n | Status |
|
| 201 |
+
|---|---|---|---|---|---|
|
| 202 |
+
| Change | pooled IoU / macro IoU / pooled F1 | **0.8122 / 0.8457 / 0.8964** | LEVIR-CD-256 test, thr 0.50 | 2,048 | **VERIFIED** |
|
| 203 |
+
| Grounding | mean best IoU / recall@0.5 | **0.2838 / 0.2198** (canonical); **0.2566 / 0.1938** (matched6) | VRSBench | 16,159 | MEASURED (2 protocols) |
|
| 204 |
+
| Grounding | head-argmax / zero-shot IoU | **0.1215 / 0.0972** | canonical | 16,159 | MEASURED |
|
| 205 |
+
| Optical-SAR | accuracy / macro-F1 | **0.931 / 0.434161** | held-out test, 19 classes | 4,000 | MEASURED, ruling **OPEN** |
|
| 206 |
+
| Change-VQA | accuracy / macro-F1 | **0.697626 / 0.378373** (test); **0.651469 / 0.372309** (test2) | two test sets | 39,686 / 31,036 | MEASURED, ruling **OPEN** |
|
| 207 |
+
| VLM (adapted) | exact_match / F1 | **0.963 / 0.96432** | frozen 1,000-question subset | 1,000 | **ACCEPTANCE-REJECTED** |
|
| 208 |
+
| Router | overall **ungated** accuracy | **0.965116** | val, corpus-limited | 86 | MEASURED β **TEST NOT RUN** |
|
| 209 |
+
| Calibration | ECE before β after | **0.013755 β 0.014929** | val, T = 0.9773 | 16,441 | MEASURED β **worse** |
|
| 210 |
+
| System | end-to-end accuracy | β | β | β | **NOT RUN β none exists** |
|
| 211 |
+
|
| 212 |
+
### Status of every claim at this release
|
| 213 |
+
|
| 214 |
+
The facts most likely to be misstated, and their correct form. These are the same statements the release
|
| 215 |
+
README, the model card and the benchmark doc carry; they are repeated here so a reader of the changelog
|
| 216 |
+
alone cannot misread the release.
|
| 217 |
+
|
| 218 |
+
| Fact | Correct statement | Never say |
|
| 219 |
+
|---|---|---|
|
| 220 |
+
| Grounding | two protocols **and** two decode variants: canonical 0.2838/0.2198, matched6 0.2566/0.1938, head_argmax 0.1215, zero-shot 0.0972 | "grounding is 0.28" |
|
| 221 |
+
| Calibration | ECE **worsened** 0.013755 β 0.014929; retained only because it is in the frozen config | "calibration improved confidence" |
|
| 222 |
+
| VLM adapter | metrics usable, status **ACCEPTANCE-REJECTED**; deployed path uses the unadapted model | "the VLM is accepted" / "the VLM is broken" |
|
| 223 |
+
| Optical-SAR | accuracy **0.931 always with macro-F1 0.434161**; ruling `OPEN`; single-label subset only | "0.931 accuracy" alone |
|
| 224 |
+
| Change-VQA | **two** test sets, both quoted; ruling `OPEN` | "change-VQA is 0.70" |
|
| 225 |
+
| Router | **0.965116 is validation, ungated, n = 86**; test `NOT RUN` | "router test accuracy" |
|
| 226 |
+
| End-to-end | no system-level benchmark exists; none is claimed | any end-to-end accuracy |
|
| 227 |
+
| Change | pooled IoU 0.8122 / macro IoU 0.8457 / pooled F1 0.8964 β the only `VERIFIED` headline | treating it as system-level |
|
| 228 |
+
|
| 229 |
+
### Verification and reproduction at this release
|
| 230 |
+
|
| 231 |
+
```bash
|
| 232 |
+
# 1. Verify every quoted metric against its source artifact (cheap, no GPU)
|
| 233 |
+
python release/tools/verify_readme_metrics.py
|
| 234 |
+
# -> STATUS ... MATCH ... / RESULT: ALL CLAIMS VERIFIED
|
| 235 |
+
|
| 236 |
+
# 2. Verify the released artifact identities
|
| 237 |
+
sha256sum -c models/checksums.sha256
|
| 238 |
+
# -> change/head.pt: OK ... vlm/adapter_model.safetensors: OK
|
| 239 |
+
|
| 240 |
+
# 3. Re-download and re-hash the Hugging Face release (independent of the upload step)
|
| 241 |
+
python release/tools/hf_verify.py
|
| 242 |
+
# -> artifacts verified : 6 / artifacts failed : 0
|
| 243 |
+
|
| 244 |
+
# 4. Regenerate the artifact manifest from disk (must not change any value)
|
| 245 |
+
python release/tools/generate_model_manifest.py
|
| 246 |
+
```
|
| 247 |
+
|
| 248 |
+
`release/tools/readme_metrics_report.txt` and `release/tools/hf_verify_report.txt` are the committed
|
| 249 |
+
outputs of steps 1 and 3.
|
| 250 |
+
|
| 251 |
+
### Compatibility and migration notes
|
| 252 |
+
|
| 253 |
+
- **Frozen config hash.** `78f1e3700da15aa1` is the sha256 of `configs/base.yaml` truncated to 16
|
| 254 |
+
characters. Every artifact records it. Editing the registry moves the hash and detaches every
|
| 255 |
+
published number from its configuration β new defaults therefore live in **code** (e.g.
|
| 256 |
+
`DEFAULT_HEAD_PATH`), not in `base.yaml` (owner decision D-4). A test
|
| 257 |
+
(`test_the_frozen_config_hash_has_not_moved`) pins this.
|
| 258 |
+
- **Grounding default semantics changed.** `head_path = None` **no longer means "no head"** β it now
|
| 259 |
+
means *"use the shipped head if present."* An explicit `head_path` still wins. Any caller that relied
|
| 260 |
+
on `None` meaning "disable the head" must now pass a path that does not resolve (D-4).
|
| 261 |
+
- **VLM adapter opt-in.** The Phase 6 adapter is attached only when the `SATQUERY_VLM_ADAPTER`
|
| 262 |
+
environment variable (or an explicit `adapter_path` argument) is set. It is **not** the deployed
|
| 263 |
+
default.
|
| 264 |
+
- **`optical_sar` capability reporting.** `/api/capabilities` keeps `available = false` for
|
| 265 |
+
`optical_sar` even though the capability is locally executable β the under-report is a statement about
|
| 266 |
+
*deployment certification*, not about code, and two tests pin it (owner decision D-7).
|
| 267 |
+
- **Phase numbering.** The master plan's numbering is authoritative for phases; the repository's
|
| 268 |
+
historical numbering is retained as history with a mapping (`docs/PHASE_NUMBERING_MAP.md`). This
|
| 269 |
+
changelog's version numbers are the *release* line, independent of both (D-5).
|
| 270 |
+
|
| 271 |
---
|
| 272 |
|
| 273 |
## [0.9.0] β 2026-09-25 β Router-defect sprint
|
| 274 |
|
| 275 |
+
### The defect
|
| 276 |
+
|
| 277 |
+
Two functions with different information:
|
| 278 |
+
|
| 279 |
+
- **`interpret()`** β produces the console's *reading*; **asset-count-blind** (text only).
|
| 280 |
+
- **`chooseTask()`** β performs *dispatch*; **asset-count-aware**.
|
| 281 |
+
|
| 282 |
+
*"Where are the built-up areas in this image?"* collapsed to **`vqa`** and answered **"River"** instead
|
| 283 |
+
of routing to `grounding`; *"Where is the new airport?"* behaved the same way. The defect was in the
|
| 284 |
+
dispatch path's handling of spatial/lexical cues, so region queries fell through to the generic VQA
|
| 285 |
+
specialist.
|
| 286 |
+
|
| 287 |
+
### The fix
|
| 288 |
+
|
| 289 |
+
- The temporal slot in `interpret()` now derives from `changeStem` / `pairWording` / `newAsChange`.
|
| 290 |
+
- `built` was dropped as a change marker.
|
| 291 |
+
- The quantifier `area` was tightened to `\barea\b`.
|
| 292 |
+
|
| 293 |
+
### Verification
|
| 294 |
+
|
| 295 |
+
Three commits deployed to the frontend; **3 independent live validation passes**, 8/8 each β **24 live
|
| 296 |
+
runs, 24 correct dispatches, 0 mock nodes, trace fill 94.4444 %**.
|
| 297 |
+
|
| 298 |
+
| Pass | Deployed HEAD | Result |
|
| 299 |
+
|---|---|---|
|
| 300 |
+
| 1 | `ff46eba42b18` + `d413d3672311` | 8/8 |
|
| 301 |
+
| 2 | `2d7ae53b482d` | 8/8 |
|
| 302 |
+
| 3 | `2d7ae53b482d` | 8/8 |
|
| 303 |
+
|
| 304 |
+
Both defect queries now dispatch to `grounding`:
|
| 305 |
+
|
| 306 |
+
| Query | Run id | Dispatched |
|
| 307 |
+
|---|---|---|
|
| 308 |
+
| Where are the built-up areas in this image? | `run_467ffa406f22` | `grounding` |
|
| 309 |
+
| Where is the new airport? | `run_46980ba55c62` | `grounding` |
|
| 310 |
+
|
| 311 |
+
### Harness false positive β caught before it could lie
|
| 312 |
+
|
| 313 |
+
An earlier live-validation harness typed queries with **synthetic CDP key events**, which Chrome
|
| 314 |
+
**silently drops when the window lacks OS focus**. The harness therefore dispatched the page's *default*
|
| 315 |
+
query and still recorded a "result" β a **false pass**. Fixed by asserting form state before dispatch
|
| 316 |
+
(`q_ok`, `obs_ok`, `t0_ok`) and using deterministic query entry (a `js()` value-set plus `type_text()`
|
| 317 |
+
via CDP `Input.insertText`). The earlier 8/8 run was re-examined and confirmed **not** infected β its
|
| 318 |
+
answers were query-specific and the query text was embedded in the answers.
|
| 319 |
+
|
| 320 |
+
### Also in this sprint
|
| 321 |
+
|
| 322 |
- Wrote the delivery report and the handoff.
|
| 323 |
+
- Prepared (but did **not** deploy) the B-07 backend patch: it adds `forward_unavailable` (503) and
|
| 324 |
+
`upstream_timeout` (504) codes plus the `codespace_name` `.strip()` fix; verified `py_compile` clean.
|
| 325 |
+
**Status: `OPEN` β prepared, NOT deployed.**
|
| 326 |
+
|
| 327 |
+
`RESOLVED` for the router defect and the harness bug. Root cause and lessons recorded in
|
| 328 |
+
[`RESEARCH_NOTES.md`](RESEARCH_NOTES.md) Β§3βΒ§4.
|
| 329 |
|
| 330 |
---
|
| 331 |
|
| 332 |
## [0.8.0] β 2026-09-24/25 β Deployment hardening
|
| 333 |
|
| 334 |
+
### Topology settled
|
| 335 |
+
|
| 336 |
+
```
|
| 337 |
+
Browser β Cloudflare Pages (satquery.pages.dev)
|
| 338 |
+
β Render hub (satquery-orchestrator)
|
| 339 |
+
β outbound TUNNEL (/tunnel/agent long-poll)
|
| 340 |
+
β GitHub Codespace (FastAPI inference, CPU)
|
| 341 |
+
β models (change Β· change_vqa Β· optical_sar fusion Β· grounding Β· VLM/CROMA)
|
| 342 |
+
β real ResultEnvelope β Render β browser
|
| 343 |
+
```
|
| 344 |
+
|
| 345 |
+
The tunnel exists because a forwarded Codespace port on a **private** repo returns `302`. Deploy sources
|
| 346 |
+
are three private repositories; the local `deploy/` is stale/untracked and is **not** the deployed
|
| 347 |
+
source.
|
| 348 |
+
|
| 349 |
+
### The five historical backend blockers β closed
|
| 350 |
+
|
| 351 |
+
1. ASGI stack present in `requirements`;
|
| 352 |
+
2. `$PORT` read;
|
| 353 |
+
3. `OPTIONS` preflight handled;
|
| 354 |
+
4. fail-fast app construction;
|
| 355 |
+
5. adapter integrity compared against an expected digest.
|
| 356 |
+
|
| 357 |
+
### Live topology verification (probed, not asserted)
|
| 358 |
+
|
| 359 |
+
| Probe | Result |
|
| 360 |
+
|---|---|
|
| 361 |
+
| `GET /api/health` | 200, `agent_connected: true` |
|
| 362 |
+
| `GET /api/capabilities` | 200, six tasks each `available: true` |
|
| 363 |
+
| `POST /api/infer {}` | 422 `invalid_request` |
|
| 364 |
+
| response header | `x-satquery-transport: tunnel` |
|
| 365 |
+
|
| 366 |
+
### Behaviour recorded (not fixed, because it is not a defect)
|
| 367 |
+
|
| 368 |
+
- **Cold start** is tens of seconds; the Render free tier sleeps and the Codespace may be stopped.
|
| 369 |
+
- **`transport_mode: auto` fallthrough** β in `auto` mode a tunnel timeout falls through to the forward
|
| 370 |
+
path, burning `wake_timeout_s` (120 s) on a `302`; worst case β **249 s** (150 + 120). Measured. This
|
| 371 |
+
is the root shape of B-07 (`OPEN`).
|
| 372 |
+
|
| 373 |
+
`RESOLVED` for the five blockers; the `auto` fallthrough is documented and carried forward.
|
| 374 |
|
| 375 |
---
|
| 376 |
|
| 377 |
## [0.7.0] β Grounding and change heads
|
| 378 |
|
| 379 |
+
### Grounding β resolution frozen at 224
|
| 380 |
+
|
| 381 |
+
Trainable head over frozen RemoteCLIP ViT-B/32. **224 chosen, 448 REJECTED** by a pre-registered paired
|
| 382 |
+
test over all 16,159 VRSBench eval records: mean best IoU β0.0147, recall@0.5 β0.0022, recall@0.10
|
| 383 |
+
β0.0699, recall@0.25 β0.0243, at **1.59Γ** the latency; paired 95 % CI [β0.0160, β0.0134],
|
| 384 |
+
**t = β22.63**; 448 better on 8.5 %, worse on **20.9 %** of records. The pre-registered rule and the
|
| 385 |
+
paired test **agree** on 224, and the artifact records
|
| 386 |
+
`rule_changed_since_preregistration: false`. `RESOLVED`. Evidence:
|
| 387 |
+
`docs/PHASE7_RESOLUTION_DECISION.md`.
|
| 388 |
+
|
| 389 |
+
Head design: per-cell feature `concat([patch, text, patch*text, global_pool]) = 4 Γ 512 = 2048`;
|
| 390 |
+
cell-relative (YOLO-style) boxes; exactly one positive cell per target (the one containing the
|
| 391 |
+
ground-truth box centre); `positive_confidence_weight: 20.0` to stop the 1-of-49 objectness collapse.
|
| 392 |
+
|
| 393 |
+
### Change β the only VERIFIED headline
|
| 394 |
+
|
| 395 |
+
STANet-style Siamese detector on LEVIR-CD-256 (`train 7,120 / val 1,024 / test 2,048`), ResNet-18 + PAM,
|
| 396 |
+
tile 256, threshold 0.50. Measured on the held-out test split (n = 2048): **pooled IoU 0.8122 / macro
|
| 397 |
+
IoU 0.8457 / pooled F1 0.8964** β the only headline in the project carrying the `VERIFIED` tag.
|
| 398 |
+
|
| 399 |
+
### Optical-SAR β measured, ruling OPEN
|
| 400 |
+
|
| 401 |
+
CROMA-base fusion head (`2318 β 512 β 19`), mandatory channel/band dropout, availability mask consumed
|
| 402 |
+
by the head (not CROMA). Sweep: **10 runs Γ 2 arms Γ seeds 100β104**. Arm decision on
|
| 403 |
+
`best_val_accuracy`: A 0.837100 vs B 0.839100, floor 0.0285 β **Arm A retained** (owner ruling R-14).
|
| 404 |
+
Pre-registered 115-class metric on the held-out split (n = 4,000): **accuracy 0.931 / macro-F1
|
| 405 |
+
0.434161**, ruling `OPEN`. The 224 localisation floor for zero-shot grounding is **1/7 of image width
|
| 406 |
+
per token**, documented as a known limitation.
|
| 407 |
|
| 408 |
---
|
| 409 |
|
| 410 |
## [0.6.0] β VLM adaptation
|
| 411 |
|
| 412 |
+
### Training
|
| 413 |
+
|
| 414 |
+
SmolVLM-500M LoRA adapter (PEFT, `r = 16`, `alpha = 32`, `dropout = 0.05`, fp16; **224** target modules
|
| 415 |
+
across `q/k/v/o/gate/up/down_proj`, all inside `model.text_model`; **8,683,520** trainable params =
|
| 416 |
+
**1.6823 %** of the 516,165,824-param base; seed 42). The **vision tower was left untouched**
|
| 417 |
+
(`trainable_subtrees = {"model.text_model": 8683520}`; the 86,433,024-param vision model and the
|
| 418 |
+
11,796,480-param connector are in `frozen_params`).
|
| 419 |
+
|
| 420 |
+
### Metrics usable, artifact REJECTED
|
| 421 |
+
|
| 422 |
+
Adapted exact_match **0.963**, F1 **0.96432**, aggregate test delta **+49.50 pp** (46.80 β 96.30). But
|
| 423 |
+
the pre-registered rule **v002** passes V1 and fails its **V2** per-class guardrail on the independent
|
| 424 |
+
test split: class *Mixed forest* (`n = 33`) drops **12.1212 pp** with `lost_questions 4`, `z 2.1335` β
|
| 425 |
+
failing **both** halves of v002. Per item V, a complete run that fails V2 is `REJECTED`.
|
| 426 |
+
|
| 427 |
+
Both rejection records are preserved (Run 1's own manifest under v001 on val; the test-split
|
| 428 |
+
adjudication under v002 on test); the val-split `ACCEPTED` under v002 is recorded **for completeness
|
| 429 |
+
only** and is not final acceptance β it decides on the same val subset that motivated v002.
|
| 430 |
+
|
| 431 |
+
### Findings
|
| 432 |
+
|
| 433 |
+
- **F5-1** β `AutoModelForVision2Seq` **does not exist** in transformers 5.17.0 (not merely deprecated);
|
| 434 |
+
the loader class is resolved by feature detection over `("AutoModelForImageTextToText",
|
| 435 |
+
"AutoModelForVision2Seq", "AutoModelForMultimodalLM")`.
|
| 436 |
+
- **F5-2** β the processor's default `longest_edge` is 2048, which upscales a 512-px tile 4Γ and then
|
| 437 |
+
splits it into **17** sub-images and 1142 prompt tokens. The plan estimated a 4Γ cost overrun; the real
|
| 438 |
+
figure is **~17Γ**. `processor_longest_edge` is pinned to 512 and enforced at config load.
|
| 439 |
+
- **F5-3** β SmolVLM requires one `<image>` token per image; hand-written prompt strings raise
|
| 440 |
+
`ValueError`, so prompts are always built through `processor.apply_chat_template()`.
|
| 441 |
+
|
| 442 |
+
### Closure
|
| 443 |
+
|
| 444 |
+
Phase 6 closed **without retraining or modifying** the adapter. Evidence:
|
| 445 |
+
`artifacts/vlm/phase6_closure.json`, `docs/PHASE6_CLOSURE.md`. Two traps recorded: `adapter_sha256` names
|
| 446 |
+
a **tree hash** (`5c6b8631β¦`) and a **file** sha256 (`07c76a75β¦`), which are not interchangeable; and the
|
| 447 |
+
promoted adapter is **not** `checkpoint-2000`.
|
| 448 |
|
| 449 |
---
|
| 450 |
|
| 451 |
## [0.5.0] β Router
|
| 452 |
|
| 453 |
+
### Architecture
|
| 454 |
+
|
| 455 |
+
A 50,822-parameter five-head adapter over frozen MiniLM embeddings (`router/adapter.py`): `LayerNorm β
|
| 456 |
+
Linear(384 β 128) β GELU β Dropout(0.10)`, then `task_head (β6)`, `modality_head (β4)` and three binary
|
| 457 |
+
heads `temporal`/`spatial`/`language` (each `β1` logit). Heads use small-std init (`std 0.02`, zero
|
| 458 |
+
bias) so the initial sigmoid sits near 0.5. The adapter does **not** back-propagate into MiniLM.
|
| 459 |
+
|
| 460 |
+
### Training
|
| 461 |
+
|
| 462 |
+
Encoder frozen β embeddings cached β **CPU-only training**. Measured: **20 epochs over 4,096 Γ 384
|
| 463 |
+
vectors in 0.28 s**. Config: 60 epochs, batch 64, lr 0.001, weight decay 0.01; loss weights task 1.0 /
|
| 464 |
+
modality 0.3 / binary 0.5; `val_ratio` 0.15; `hard_negatives_to_test: true`.
|
| 465 |
+
|
| 466 |
+
### Data and splits
|
| 467 |
+
|
| 468 |
+
A synthetic query corpus: **576** queries in **54** groups, split `train 410 / val 86 / test 80`. Splits
|
| 469 |
+
are **by group** (template / hard-negative family), never by example, so template variants cannot leak
|
| 470 |
+
across the boundary (finding F4-3). Hard-negative families are placed in the **test** split so their
|
| 471 |
+
accuracy measures generalisation, not memorisation.
|
| 472 |
+
|
| 473 |
+
### Validation-only threshold sweep
|
| 474 |
+
|
| 475 |
+
50 thresholds `0.50 β¦ 0.99`, `select_by: covered_accuracy`. Shipped threshold **0.70** (coverage
|
| 476 |
+
0.848837, covered accuracy 0.972603, fallback 0.151163, n_covered 73); the sweep's selected row is
|
| 477 |
+
threshold 0.76 (coverage 0.790698, covered accuracy 1.0, n_covered 68). Overall **ungated** accuracy
|
| 478 |
+
**0.965116** on **val n = 86** β corpus-limited (plan minimum 500 val queries, 100 hard negatives; val
|
| 479 |
+
carries 0 hard negatives by design). **Test split NOT RUN** (`test_split_touched: false`).
|
| 480 |
+
|
| 481 |
+
### Deterministic fallback
|
| 482 |
+
|
| 483 |
+
A lexical fallback with ordered precedence and a `self_check()` against curated hard negatives, so the
|
| 484 |
+
router degrades to a deterministic rule rather than to an arbitrary class when the adapter is
|
| 485 |
+
low-confidence.
|
| 486 |
|
| 487 |
---
|
| 488 |
|
| 489 |
## [0.1.0] β Foundation
|
| 490 |
|
| 491 |
+
- Monorepo; frozen configuration registry (`configs/base.yaml`); **config-hash freeze**
|
| 492 |
+
(`78f1e3700da15aa1`); **nine-state controller** (`RECEIVE β PARSE β VALIDATE β PLAN β PREPROCESS β
|
| 493 |
+
EXECUTE β AGGREGATE β VERIFY β RESPOND`); **four-endpoint** inference contract; evidence schema
|
| 494 |
+
(`Region` / `ChangeRegion` / `Evidence`, `max_items` 32, coordinate system `normalized_0_1`); **eight
|
| 495 |
+
frontend execution events**.
|
| 496 |
+
- Enforced invariants established at load time: fusion width `3 Γ 768 + 12 + 2 = 2318`; grounding head
|
| 497 |
+
feature `4 Γ 512 = 2048`; CROMA `image_resolution % 8 == 0` (native 120 β 225 patches); router
|
| 498 |
+
`max_length β€ 256`; VLM `processor_longest_edge β€ image.tile_size`; change tile 256; VLM
|
| 499 |
+
`prompt_must_use_chat_template: true`.
|
| 500 |
+
- Input geometry and normalisation frozen: `image.max_pixels` 25,000,000; `tile_size` 512;
|
| 501 |
+
`tile_overlap` 128; `max_tiles` 64; `top_k_tiles` 4. Optical percentile 2β98; SAR dB clip [β30, 5].
|
| 502 |
+
- The rule that shaped every later decision: **"no magic numbers anywhere in Python; everything tunable
|
| 503 |
+
lives here"** β and, from the outset, the no-fabrication rule that a missing dependency, corpus or
|
| 504 |
+
checkpoint produces a diagnosable error, never a plausible number.
|
| 505 |
|
| 506 |
---
|
| 507 |
|
|
|
|
| 516 |
| Resolve the optical-SAR and change-VQA rulings | **OPEN** |
|
| 517 |
| Plot the calibrated reliability curve | **NOT RUN** |
|
| 518 |
| Replace the illustrative benchmark adapter numbers with real runs | **NOT RUN** |
|
| 519 |
+
| Regenerate `RELEASE_MANIFEST.md` and re-upload the ten new deep docs to the Hub | **NOT RUN** |
|
| 520 |
+
| Push the curated release to `Anish-lab-blip/SatQuery-AI` (token scope) | **BLOCKED** β owner action |
|
| 521 |
+
| Fix B-02 (`codespace_name` trailing newline) | **OPEN** (cosmetic) |
|
| 522 |
+
| Cross-dataset, human, robustness and adversarial evaluation | **NOT RUN** |
|
| 523 |
|
| 524 |
---
|
| 525 |
|
| 526 |
## Documentation inventory shipped in 1.0.0
|
| 527 |
|
| 528 |
+
**Every documentation file in the release tree.** Sizes are the measured byte counts in
|
| 529 |
+
`release/repo/`, as of the 2026-09-26 documentation pass. The **"in manifest / Hub"** column records
|
| 530 |
+
whether the file was included in `RELEASE_MANIFEST.md` and the Hugging Face upload β the ten newest deep
|
| 531 |
+
docs were written **after** both were generated, so they are present locally but **not yet** in the
|
| 532 |
+
manifest or on the Hub.
|
| 533 |
+
|
| 534 |
+
### Root-level documents
|
| 535 |
+
|
| 536 |
+
| File | Purpose | Bytes | In manifest / Hub |
|
| 537 |
+
|---|---|---|---|
|
| 538 |
+
| `README.md` | repository front page (27 sections) | 86,336 | yes |
|
| 539 |
+
| `MODEL_CARD.md` | model card for the six trained artifacts (Hugging Face card) | 57,166 | yes (previous revision; **expanded in this pass**) |
|
| 540 |
+
| `RELEASE_MANIFEST.md` | every released file with size + sha256 | 10,402 | yes |
|
| 541 |
+
| `HF_RELEASE_VERIFICATION.md` | independent HF re-download verification (6/6 MATCH) | 6,443 | yes |
|
| 542 |
+
|
| 543 |
+
### Research and engineering documents (`docs/`)
|
| 544 |
+
|
| 545 |
+
| File | Purpose | Bytes | In manifest / Hub |
|
| 546 |
+
|---|---|---|---|
|
| 547 |
+
| `docs/ARCHITECTURE.md` | architecture hub: thesis, sub-document index, cross-cutting principles | 7,672 | yes |
|
| 548 |
+
| `docs/MODELS.md` | per-model detail: hyperparameters, acceptance status, measured params | 103,145 | yes |
|
| 549 |
+
| `docs/BENCHMARKS.md` | every measured metric with its artifact and protocol | 55,999 | yes |
|
| 550 |
+
| `docs/DATASETS.md` | dataset provenance, splits, leakage controls | 67,723 | yes |
|
| 551 |
+
| `docs/TRAINING.md` | training procedures and hyperparameters | 90,697 | yes |
|
| 552 |
+
| `docs/EVALUATION.md` | evaluation protocols and honesty rules | 111,672 | yes |
|
| 553 |
+
| `docs/DEPLOYMENT.md` | live topology, env vars, mechanics, traps | 16,041 | yes |
|
| 554 |
+
| `docs/REPRODUCIBILITY.md` | what can and cannot be reproduced | 65,200 | yes |
|
| 555 |
+
| `docs/LIMITATIONS.md` | the full limitation catalogue | 8,356 | yes |
|
| 556 |
+
| `docs/RESEARCH_NOTES.md` | engineering findings and negative results | 11,513 | yes |
|
| 557 |
+
| `docs/CHANGELOG.md` | this file | *(this file)* | yes (previous revision; **expanded in this pass**) |
|
| 558 |
+
| `docs/MASTER_ARCHITECTURE_PLAN.md` | the original master plan, included as a historical document | 65,304 | yes |
|
| 559 |
+
| `docs/SECURITY.md` | security posture, trust boundaries, rate limiting, secrets hygiene | 114,342 | **no β new** |
|
| 560 |
+
| `docs/TESTING.md` | the test suites, guards, and what is not covered | 96,897 | **no β new** |
|
| 561 |
+
| `docs/GEOSPATIAL.md` | CRS, transforms, alignment, coordinate systems | 92,888 | **no β new** |
|
| 562 |
+
| `docs/DATA_PIPELINE.md` | ingestion, extraction, feature caches, split policy | 66,285 | **no β new** |
|
| 563 |
+
| `docs/OPERATIONS.md` | running the system: health, counters, traces, runbooks | 62,277 | **no β new** |
|
| 564 |
+
| `docs/DEVELOPMENT.md` | local development, invariants, contribution mechanics | 69,367 | **no β new** |
|
| 565 |
+
| `docs/PERFORMANCE.md` | latency, memory, throughput, cost notes | 52,946 | **no β new** |
|
| 566 |
+
| `docs/GLOSSARY.md` | terms, abbreviations, status vocabulary | 40,998 | **no β new** |
|
| 567 |
+
| `docs/FRONTEND.md` | the static frontend: pages, real-vs-preview, platform traps | 73,926 | **no β new** |
|
| 568 |
+
| `docs/SERVING.md` | the serving path: endpoints, envelopes, error codes, wiring | 75,797 | **no β new** |
|
| 569 |
+
|
| 570 |
+
### Architecture reference (`docs/architecture/`)
|
| 571 |
+
|
| 572 |
+
| File | Topic | Bytes | In manifest / Hub |
|
| 573 |
+
|---|---|---|---|
|
| 574 |
+
| `docs/architecture/01-system-overview.md` | thesis, component inventory, frozen-backbone strategy | 8,376 | yes |
|
| 575 |
+
| `docs/architecture/02-deployment-topology.md` | four tiers, gateway, tunnel, wake flow, cold start | 85,979 | yes |
|
| 576 |
+
| `docs/architecture/03-request-lifecycle.md` | the nine-state controller, validation, tiling | 130,175 | yes |
|
| 577 |
+
| `docs/architecture/04-router.md` | frozen MiniLM, the 5-head adapter, `interpret()` vs `chooseTask()` | 262,652 | yes |
|
| 578 |
+
| `docs/architecture/05-specialists.md` | all six tasks in depth | 252,171 | yes |
|
| 579 |
+
| `docs/architecture/06-evidence-and-confidence.md` | evidence aggregation, temperature scaling, the eight events | 108,044 | yes |
|
| 580 |
+
| `docs/architecture/07-configuration-freeze.md` | the registry, enforced invariants, the config hash | 106,023 | yes |
|
| 581 |
+
| `docs/architecture/08-api-contract.md` | the four endpoints, envelopes, error codes | 127,341 | yes |
|
| 582 |
+
| `docs/architecture/09-frontend.md` | the static pages, real-vs-preview, platform traps | 78,287 | yes |
|
| 583 |
+
| `docs/architecture/10-observability-and-ops.md` | health, counters, traces, what is not observed | 104,695 | yes |
|
| 584 |
+
|
| 585 |
+
### Generated artifacts and tooling
|
| 586 |
+
|
| 587 |
+
| File | Purpose | Bytes | In manifest / Hub |
|
| 588 |
+
|---|---|---|---|
|
| 589 |
+
| `models/manifest.json` | generated manifest of the six trained artifacts (bytes + sha256) | 4,458 | yes |
|
| 590 |
+
| `models/checksums.sha256` | generated checksums, keyed by repository path | 642 | yes |
|
| 591 |
+
| `tools/verify_readme_metrics.py` | walks every quoted metric to its source artifact | 6,911 | yes |
|
| 592 |
+
| `tools/readme_metrics_report.txt` | its output (`ALL CLAIMS VERIFIED`) | 4,027 | yes |
|
| 593 |
+
| `tools/generate_model_manifest.py` | generates `models/manifest.json` + `checksums.sha256` from disk | 6,868 | yes |
|
| 594 |
+
| `tools/generate_release_manifest.py` | generates `RELEASE_MANIFEST.md` from disk | 4,100 | yes |
|
| 595 |
+
| `tools/hf_verify.py` | re-downloads and re-hashes the released artifacts | 3,878 | yes |
|
| 596 |
+
| `tools/verify_archive.py` | verifies the evidence archive extraction | 4,946 | yes |
|
| 597 |
+
| `tools/build_archive.py` | builds the ZIP64 evidence archive | 8,351 | yes |
|
| 598 |
+
|
| 599 |
+
**Inventory totals.** 4 root-level documents Β· 22 documents in `docs/` Β· 10 architecture chapters Β·
|
| 600 |
+
9 generated-artifact / tooling files. **45 files.** The ten newest deep docs (`SECURITY.md`,
|
| 601 |
+
`TESTING.md`, `GEOSPATIAL.md`, `DATA_PIPELINE.md`, `OPERATIONS.md`, `DEVELOPMENT.md`, `PERFORMANCE.md`,
|
| 602 |
+
`GLOSSARY.md`, `FRONTEND.md`, `SERVING.md`) are the only ones not yet reflected in
|
| 603 |
+
`RELEASE_MANIFEST.md` / the Hub; regenerating the manifest and re-uploading is an `Unreleased` item
|
| 604 |
+
above.
|
| 605 |
+
|
| 606 |
+
---
|
| 607 |
+
|
| 608 |
+
## Where the evidence lives
|
| 609 |
+
|
| 610 |
+
| Topic | Evidence |
|
| 611 |
|---|---|
|
| 612 |
+
| All measured metrics | `artifacts/**/*.json`, verified by `release/tools/verify_readme_metrics.py` |
|
| 613 |
+
| Release identity and byte counts | `models/manifest.json`, `models/checksums.sha256`, `RELEASE_MANIFEST.md` |
|
| 614 |
+
| Hugging Face release integrity | [`../HF_RELEASE_VERIFICATION.md`](../HF_RELEASE_VERIFICATION.md), `release/tools/hf_verify_report.txt` |
|
| 615 |
+
| Router defect + 3 live passes | [`RESEARCH_NOTES.md`](RESEARCH_NOTES.md) Β§3βΒ§4 |
|
| 616 |
+
| Grounding resolution rejection | `docs/PHASE7_RESOLUTION_DECISION.md` |
|
| 617 |
+
| VLM rejection / Phase 6 closure | `artifacts/vlm/phase6_closure.json`, `docs/PHASE6_CLOSURE.md` |
|
| 618 |
+
| Optical-SAR metric | `docs/PHASE12_115_METRIC_COMPUTED.md`, `artifacts/optical_sar/fusion_head_production_v001/pre_registered_115_metric.json` |
|
| 619 |
+
| Owner decisions | `docs/OWNER_DECISIONS_2026-09-23.md` |
|
| 620 |
+
| Documentation reconciliation | `docs/DOCUMENTATION_RECONCILIATION.md` |
|
| 621 |
+
| Release execution state | `release/RELEASE_EXECUTION_CHECKLIST.md`, `release/CURRENT_RELEASE_STATE.md` |
|
|
|
|
|
|
|
|
|
|
|
|