thundercode commited on
Commit
bd10916
·
verified ·
1 Parent(s): 48b9650

release: add HF_RELEASE_VERIFICATION.md

Browse files
Files changed (1) hide show
  1. HF_RELEASE_VERIFICATION.md +142 -0
HF_RELEASE_VERIFICATION.md ADDED
@@ -0,0 +1,142 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Hugging Face Release Verification
2
+
3
+ **Phase:** 4 · **Date:** 2026-09-25 · **Repo:** https://huggingface.co/thundercode/SatQuery
4
+ **Result:** **VERIFIED — all 6 artifacts byte-identical, all 4 support files present.**
5
+
6
+ ---
7
+
8
+ ## 1. What was released
9
+
10
+ | Item | Detail |
11
+ |---|---|
12
+ | Repository | `thundercode/SatQuery` (model repo) |
13
+ | Visibility | **public** (`private: false`) |
14
+ | HEAD after release | **`55681e0cddb91a4a5655da98a49bc025e537b657`** |
15
+ | `lastModified` | `2026-09-25T18:21:52Z` |
16
+ | Files on Hub | **22** |
17
+
18
+ ## 2. Pre-flight inspection (what was already there, and what was done with it)
19
+
20
+ | Existing file | Content found | Action |
21
+ |---|---|---|
22
+ | `README.md` | a **25-byte stub** — literally `---\nlicense: unknown\n---`, no content | **replaced** with the model card (nothing of value lost) |
23
+ | `.gitattributes` | the standard Hugging Face **LFS routing template** — already routes `*.pt`, `*.safetensors`, `*.bin` through LFS | **left untouched** (it was already correct and is required for LFS) |
24
+
25
+ **No useful content was overwritten.** The stub README contained no project information.
26
+
27
+ ## 3. Write permission
28
+
29
+ Verified **before** uploading, by reading the token's own scopes from `GET /api/whoami-v2`:
30
+
31
+ ```
32
+ auth.type : access_token
33
+ auth.accessToken.displayName : Workbuddy
34
+ auth.accessToken.role : fineGrained
35
+ scoped[0].entity : user thundercode
36
+ scoped[0].permissions : repo.content.read, repo.access.read, repo.write, …
37
+ ```
38
+
39
+ `repo.write` is present, scoped to the `thundercode` user. This **closes** the earlier
40
+ "write permission unproven" note from Phase 0.
41
+
42
+ ## 4. Uploaded contents
43
+
44
+ | # | Path on Hub | Bytes |
45
+ |---|---|---|
46
+ | 1 | `README.md` (model card) | 26,767 |
47
+ | 2 | `MODEL_CARD.md` | 7,002 |
48
+ | 3 | `models/manifest.json` | 4,458 |
49
+ | 4 | `models/checksums.sha256` | 642 |
50
+ | 5–15 | `docs/*.md` (11 files) | ~84,000 total |
51
+ | 16 | `change/head.pt` | 63,231,009 |
52
+ | 17 | `change_vqa/head.pt` | 5,822,809 |
53
+ | 18 | `optical_sar/head.pt` | 14,427,457 |
54
+ | 19 | `grounding/head.pt` | 12,639,041 |
55
+ | 20 | `router/adapter.pt` | 211,961 |
56
+ | 21 | `vlm/adapter_model.safetensors` | 34,798,048 |
57
+
58
+ Total released weight payload: **131,130,325 bytes (~125 MiB)** across the six trained artifacts.
59
+ **No backbone weights are redistributed.**
60
+
61
+ ## 5. Independent verification (re-downloaded, not trusted)
62
+
63
+ `release/tools/hf_verify.py` **re-downloads each artifact over direct HTTPS** and hashes the bytes it
64
+ receives, comparing against the locally-computed sha256. It does **not** trust the upload step.
65
+
66
+ | STATUS | hf_path | remote bytes | local bytes |
67
+ |---|---|---|---|
68
+ | **MATCH** | `change/head.pt` | 63,231,009 | 63,231,009 |
69
+ | **MATCH** | `change_vqa/head.pt` | 5,822,809 | 5,822,809 |
70
+ | **MATCH** | `optical_sar/head.pt` | 14,427,457 | 14,427,457 |
71
+ | **MATCH** | `grounding/head.pt` | 12,639,041 | 12,639,041 |
72
+ | **MATCH** | `router/adapter.pt` | 211,961 | 211,961 |
73
+ | **MATCH** | `vlm/adapter_model.safetensors` | 34,798,048 | 34,798,048 |
74
+
75
+ ```
76
+ artifacts verified : 6
77
+ artifacts failed : 0
78
+ ```
79
+
80
+ Support files confirmed present: `README.md`, `MODEL_CARD.md`, `models/manifest.json`,
81
+ `models/checksums.sha256` — all `OK`.
82
+
83
+ ### 5.1 A verification method that was itself wrong (recorded)
84
+
85
+ The **first** verification attempt reported all six artifacts `DIFFER`, with every remote hash equal
86
+ to `e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855` — the sha256 of **empty
87
+ content**. The cause was not the upload: `hf_hub_download` returned an empty file in this
88
+ environment (a download-path problem), so the verifier hashed nothing.
89
+
90
+ This was caught by a **second, independent method** (a direct `curl` download), which produced the
91
+ correct hash `8527c3ed28a293e13293d48601d48e3ceafa137b9acabddaf5de31a58a509b5c` for
92
+ `router/adapter.pt` — byte-identical to the local file, and confirmed to be a real PyTorch zip
93
+ (`PK\x03\x04`, containing `adapter/data.pkl`).
94
+
95
+ The verifier was then rewritten to use **direct HTTPS with proxies disabled**. It now reports
96
+ 6/6 MATCH. The failed first attempt is recorded because a verifier that silently hashes an empty
97
+ file would have produced a **false failure** — and, with a different bug, could just as easily have
98
+ produced a **false pass**.
99
+
100
+ ## 6. Cross-checks against independently-recorded hashes
101
+
102
+ Two of the six hashes can be checked against values recorded elsewhere in the project, independent
103
+ of this release:
104
+
105
+ | Artifact | Recorded elsewhere | Computed here | Agree |
106
+ |---|---|---|---|
107
+ | `change_vqa_head` | `cfae5e43…d63a82a` (`artifacts/change_vqa/run/PROMOTION.json`) | `cfae5e43…d63a82a` | **yes** |
108
+ | `vlm_lora_adapter` | `07c76a75…a5adf5e` (adapter provenance) | `07c76a75…a5adf5e` | **yes** |
109
+
110
+ ## 7. Access verification
111
+
112
+ - The repository is **public** — the URLs resolve without a token.
113
+ - `GET /api/models/thundercode/SatQuery` returns the repo with `private: false`, `gated: false`,
114
+ `disabled: false`.
115
+ - Every artifact is retrievable at
116
+ `https://huggingface.co/thundercode/SatQuery/resolve/main/<path>`.
117
+
118
+ ## 8. Secrets
119
+
120
+ **No secret was uploaded.** The uploaded set is: the model card, the manifest, the checksums, the 11
121
+ docs, and the six weight files. No tokens, keys, environment files, or credentials exist in any
122
+ uploaded file. The token used for the upload is **not** written into any released file.
123
+
124
+ ## 9. Reproduce this verification
125
+
126
+ ```bash
127
+ export HF_TOKEN=... # token with repo.content.read
128
+ python release/tools/hf_verify.py
129
+ ```
130
+
131
+ Exit code 0 with `artifacts failed : 0` means the release is intact. Committed output:
132
+ `release/tools/hf_verify_report.txt`.
133
+
134
+ ## 10. Notes and caveats
135
+
136
+ - The Hub's own **README metadata validator** emitted a warning during upload
137
+ (`empty or missing yaml metadata in repo card`) for one intermediate commit. The final README
138
+ carries full YAML frontmatter (`license: other`, tags, `pipeline_tag: image-to-text`).
139
+ - The released docs are the **detailed** versions; the model card's relative links
140
+ (`docs/LIMITATIONS.md`, `models/manifest.json`) resolve because both are uploaded.
141
+ - **The six artifacts are small trained modules over frozen backbones.** Anyone using them must also
142
+ fetch the pinned backbones listed in `models/manifest.json` / `docs/MODELS.md`.