thundercode commited on
Commit
d09af94
Β·
verified Β·
1 Parent(s): a6374c1

release: add docs/CHANGELOG.md

Browse files
Files changed (1) hide show
  1. 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
- what was verified**, and marks unresolved items honestly rather than omitting them.
 
 
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
- deep research/engineering documentation set, model documentation, a Hugging Face model release, a
14
- curated public repository, and a verified evidence archive.
15
 
16
  ### Added
17
 
18
- **Documentation**
19
-
20
- - **Repository README** β€” motivation through citation, with the deployed topology, the six supported
21
- tasks, routing, the eight execution events, measured results, live validation, and known
22
- limitations.
23
- - **Deep architecture reference** (hub + 10 chapters):
24
- | Chapter | Topic |
25
- |---|---|
26
- | `docs/ARCHITECTURE.md` | hub: thesis, sub-document index, cross-cutting principles |
27
- | `docs/architecture/01-system-overview.md` | thesis, component inventory, frozen-backbone strategy |
28
- | `docs/architecture/02-deployment-topology.md` | four tiers, gateway, tunnel, wake flow, cold start |
29
- | `docs/architecture/03-request-lifecycle.md` | the nine-state controller, validation, tiling |
30
- | `docs/architecture/04-router.md` | frozen MiniLM, the 5-head adapter, `interpret()` vs `chooseTask()`, lexical fallback |
31
- | `docs/architecture/05-specialists.md` | all six tasks in depth |
32
- | `docs/architecture/06-evidence-and-confidence.md` | evidence aggregation, temperature scaling, the eight events |
33
- | `docs/architecture/07-configuration-freeze.md` | the registry, enforced invariants, the config hash |
34
- | `docs/architecture/08-api-contract.md` | the four endpoints, envelopes, error codes |
35
- | `docs/architecture/09-frontend.md` | the static pages, real-vs-preview, platform traps |
36
- | `docs/architecture/10-observability-and-ops.md` | health, counters, traces, what is not observed |
37
- - **Research documentation** β€” `MODELS.md`, `BENCHMARKS.md`, `DATASETS.md`, `TRAINING.md`,
38
- `EVALUATION.md`, `DEPLOYMENT.md`, `REPRODUCIBILITY.md`, `LIMITATIONS.md`, `RESEARCH_NOTES.md`,
39
- `CHANGELOG.md`.
40
- - **Model documentation** β€” `MODEL_CARD.md`, plus **generated** `models/manifest.json` and
41
- `models/checksums.sha256` (computed by reading the files, never typed).
42
- - **Metric verification tooling** β€” `release/tools/verify_readme_metrics.py`, which walks every quoted
43
- metric to its source artifact. Result: **`ALL CLAIMS VERIFIED`** (20/20).
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
 
45
  **Release**
46
 
47
- - **Hugging Face release** of the six trained artifacts to `thundercode/SatQuery`, with a verification
48
- record (`HF_RELEASE_VERIFICATION.md`). Independent re-download confirmed **6/6 artifacts
49
- byte-identical**.
50
- - **Curated public repository** at `Anish-lab-blip/SatQuery-AI` with `RELEASE_MANIFEST.md`.
51
- - **Evidence archive** (ZIP64, `artifacts/` verbatim per owner decision G3) with an integrity-verified
52
- extraction and a documented remote location.
 
 
 
 
 
 
 
 
 
 
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
- deployment source. All four were wrong.
60
- - `hf/` documentation was **stale** β€” it asserted the project "does not own any model weights … ships
61
- no weights, no binaries, and no large artifacts" and "has no Hugging Face credentials". Both were
62
- false at release time and are corrected.
 
 
 
 
 
 
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
- pass. Fixed with pre-dispatch form-state assertions. `RESOLVED`.
72
- - **Bundled EO change pair** β€” the demo pair differed in shape (726Β² vs 736Β²) and errored. Replaced
73
- with a same-shape pair (both 720Γ—720). `RESOLVED` (supersedes `FINAL_DELIVERY_REPORT.md` Β§6).
 
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. `OPEN`.
85
- - **No `LICENSE` file** exists. `OPEN`.
 
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; the deployed path uses the
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
- - Diagnosed and fixed the router misroute (region queries β†’ `vqa`): the temporal slot in
107
- `interpret()` now derives from `changeStem` / `pairWording` / `newAsChange`; `built` was dropped as a
108
- change marker; the quantifier `area` was tightened to `\barea\b`.
109
- - Deployed three commits to the frontend.
110
- - Ran **3 independent live validation passes**, 8/8 each β€” **24 live runs, 24 correct dispatches,
111
- 0 mock nodes, trace fill 94.4444 %**.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
- - Live topology settled on **Cloudflare Pages β†’ Render β†’ outbound tunnel β†’ Codespace** (CPU).
120
- - Closed the five historical backend blockers (ASGI stack in requirements; `$PORT` read; `OPTIONS`
121
- preflight; fail-fast app construction; adapter integrity compared against an expected digest).
122
- - Documented cold start; recorded the `transport_mode: auto` fallthrough.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
123
 
124
  ---
125
 
126
  ## [0.7.0] β€” Grounding and change heads
127
 
128
- - **Grounding**: trainable head over frozen RemoteCLIP ViT-B/32. Resolution **224 chosen, 448
129
- REJECTED** by a pre-registered paired test (mean best IoU βˆ’0.0147, t = βˆ’22.63).
130
- - **Change**: STANet-style Siamese detector on LEVIR-CD-256 β€” the only `VERIFIED` headline metric
131
- (pooled IoU 0.8122 / macro IoU 0.8457 / pooled F1 0.8964).
132
- - **Optical-SAR**: CROMA-base fusion head, armA/armB Γ— seeds 100–104 sweep, pre-registered 115-class
133
- metric (accuracy 0.931 / macro-F1 0.434161, ruling `OPEN`).
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
134
 
135
  ---
136
 
137
  ## [0.6.0] β€” VLM adaptation
138
 
139
- - SmolVLM-500M LoRA adapter trained (PEFT 0.19.1, r = 16, Ξ± = 32, dropout 0.05, fp16).
140
- - Metrics usable (exact_match 0.963, F1 0.96432) but **ACCEPTANCE-REJECTED** for promotion.
141
- `REJECTED`.
142
- - Findings F5-1/F5-2/F5-3 recorded (loader class, ~17Γ— processor overrun, chat-template requirement).
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
143
 
144
  ---
145
 
146
  ## [0.5.0] β€” Router
147
 
148
- - 50,822-parameter adapter over frozen MiniLM; cached embeddings; CPU-only training (0.28 s for 20
149
- epochs / 4,096 vectors).
150
- - Group-based splits with hard negatives placed in the test split.
151
- - Deterministic lexical fallback with ordered precedence and a `self_check()` against curated hard
152
- negatives.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
153
 
154
  ---
155
 
156
  ## [0.1.0] β€” Foundation
157
 
158
- - Monorepo, frozen configuration registry (`configs/base.yaml`), config-hash freeze
159
- (`78f1e3700da15aa1`), nine-state controller, four-endpoint inference contract, evidence schema
160
- (`Region` / `ChangeRegion` / `Evidence`), eight frontend execution events.
 
 
 
 
 
 
 
 
 
 
 
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
- | File | Purpose |
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
181
  |---|---|
182
- | `README.md` | repository front page |
183
- | `MODEL_CARD.md` | model card for the six trained artifacts |
184
- | `docs/ARCHITECTURE.md` + `docs/architecture/01…10` | the deep architecture reference |
185
- | `docs/MODELS.md` | model detail, hyperparameters, acceptance status |
186
- | `docs/BENCHMARKS.md` | every measured metric with its artifact and protocol |
187
- | `docs/DATASETS.md` | dataset provenance, splits, leakage controls |
188
- | `docs/TRAINING.md` | training procedures and hyperparameters |
189
- | `docs/EVALUATION.md` | evaluation protocols and honesty rules |
190
- | `docs/DEPLOYMENT.md` | live topology, env vars, mechanics, traps |
191
- | `docs/REPRODUCIBILITY.md` | what can and cannot be reproduced |
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` |