LordNeel commited on
Commit
7c01a4f
·
verified ·
1 Parent(s): 16abb00

Add machine-readable serving profile catalog

Browse files
ARTIFACT_MANIFEST.json CHANGED
@@ -20,7 +20,7 @@
20
  "warning_checks": 0
21
  }
22
  },
23
- "generated_at": "2026-06-28T00:52:18.227594+00:00",
24
  "known_remaining_gaps": [
25
  "No release-candidate SFT/post-training adapter exists because SFT was stopped and checkpoint-8000 failed behavior gates.",
26
  "The recommended strong repair blend and resume preflight are prepared CPU-side, but no resumed GPU training has been run from them.",
@@ -146,18 +146,18 @@
146
  }
147
  ],
148
  "release_readiness": {
149
- "latest_report_generated_at": "2026-06-28T00:51:35.069342+00:00",
150
  "markdown_report": "probes/release-readiness-report.md",
151
  "note": "Serving GGUF release readiness is separated from full project completion because the SFT adapter remains unreleased.",
152
  "report": "probes/release-readiness-report.json",
153
  "script": "scripts/build_release_readiness_report.py",
154
  "summary": {
155
- "checks": 22,
156
  "failed_checks": 0,
157
  "full_project_status": "incomplete",
158
  "serving_release_status": "pass",
159
  "status_counts": {
160
- "pass": 17,
161
  "warn": 5
162
  },
163
  "warning_checks": 5
@@ -183,7 +183,7 @@
183
  "script": "scripts/verify_hf_release.py"
184
  },
185
  "remote_file_count_before_upload": 241,
186
- "remote_head_before_upload": "7dcf02d87d07e4b173d7b375e9fc747605d80652",
187
  "repair_artifacts": {
188
  "code_only_extract_format": {
189
  "assistant_code_fence": 0.0,
@@ -293,37 +293,54 @@
293
  "sft_status": "stopped; no GPU training is running; no LoRA adapter released"
294
  },
295
  "repo_id": "LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1",
296
- "staged_file_count_excluding_generated_audit_files": 213,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
297
  "staged_files": [
298
  {
299
- "bytes": 12198,
300
  "path": "MODEL_INVESTIGATION_HARNESS.md",
301
  "remote_before_upload": {
302
  "blob_id": "11d19ea8434b8a6b792692c62612340ab47f22c4",
303
  "bytes": 12198,
304
  "exists": true
305
  },
306
- "sha256": "5de5c74adce1e5594cc45066be1982a0d2165b453620bbf90e42f0403f55dccf"
307
  },
308
  {
309
- "bytes": 8575,
310
  "path": "PROJECT_STATUS_AUDIT.md",
311
  "remote_before_upload": {
312
  "blob_id": "12abd37fee2e13cdc59ac09f34ad41047c37532c",
313
  "bytes": 8575,
314
  "exists": true
315
  },
316
- "sha256": "6fb7495e6102142f15e7f828a63afd5191364876783cbb60b556873ed47cf764"
317
  },
318
  {
319
- "bytes": 10523,
320
  "path": "README.md",
321
  "remote_before_upload": {
322
- "blob_id": "e95d5292315da9d193e383e8830dc8e9fb41b046",
323
- "bytes": 10499,
324
  "exists": true
325
  },
326
- "sha256": "33910886eb0e18d0b41441c9a515841d30e10d3a1ee15479db54968816141566"
327
  },
328
  {
329
  "bytes": 12029,
@@ -1626,14 +1643,22 @@
1626
  "sha256": "84efb88c5d571d9942e118cd9cde458fda9ce327b5e71b671c55c9c2836a6a43"
1627
  },
1628
  {
1629
- "bytes": 2287,
1630
  "path": "configs/serving_matrix.yaml",
1631
  "remote_before_upload": {
1632
  "blob_id": "63d4c96c5aaace66eff3a86ce72c379c948422bc",
1633
  "bytes": 2287,
1634
  "exists": true
1635
  },
1636
- "sha256": "0c8f6d4f79ca9867c417121320020e8d5f3fb08fc6644d3ffc694ad2b671f812"
 
 
 
 
 
 
 
 
1637
  },
1638
  {
1639
  "bytes": 5232,
@@ -1936,24 +1961,40 @@
1936
  "sha256": "fa01e4d58c37d581786ad78b0b773547acefb1dbce0a08373ca36eb6c7229eb7"
1937
  },
1938
  {
1939
- "bytes": 8562,
1940
  "path": "probes/release-readiness-report.json",
1941
  "remote_before_upload": {
1942
- "blob_id": "8447a31f6294be99561ce4de7bfac79736299419",
1943
  "bytes": 8562,
1944
  "exists": true
1945
  },
1946
- "sha256": "2634236a47b00ed8dd8f279c3f890771b766432d2e952f6482232eb5ee983085"
1947
  },
1948
  {
1949
- "bytes": 3017,
1950
  "path": "probes/release-readiness-report.md",
1951
  "remote_before_upload": {
1952
- "blob_id": "c5d5658958875c290da1aa18753ef4c58969869a",
1953
  "bytes": 3017,
1954
  "exists": true
1955
  },
1956
- "sha256": "50c326ab01c6cd617c84e163c7cb4328dac6b37a413410c6c5c1183b4d302652"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1957
  },
1958
  {
1959
  "bytes": 1267,
@@ -2186,14 +2227,14 @@
2186
  "sha256": "cf2d52ac14ac23b9c84aa35a8a4c965afed5573f711221411eb93acd634ef526"
2187
  },
2188
  {
2189
- "bytes": 15496,
2190
  "path": "scripts/build_release_readiness_report.py",
2191
  "remote_before_upload": {
2192
  "blob_id": "a7dc67e2fce48ab06d6a9afe0c24f8e992b4c064",
2193
  "bytes": 15496,
2194
  "exists": true
2195
  },
2196
- "sha256": "fac895b30e79c25037428bbf7118de4b4cd6d8f6ee7ef90f68d9dbcf28f3861c"
2197
  },
2198
  {
2199
  "bytes": 4467,
@@ -2405,6 +2446,14 @@
2405
  },
2406
  "sha256": "340edc3ee4e104e9bf8145195b05ce9f106c63f3b128c32d181ed0512140868a"
2407
  },
 
 
 
 
 
 
 
 
2408
  {
2409
  "bytes": 15231,
2410
  "path": "scripts/validate_sft_jsonl.py",
@@ -2416,14 +2465,14 @@
2416
  "sha256": "b1db75a43b9b3415cba337b868638a496f960cf492bbdfa4c31ad978c277908c"
2417
  },
2418
  {
2419
- "bytes": 19576,
2420
  "path": "scripts/verify_hf_release.py",
2421
  "remote_before_upload": {
2422
  "blob_id": "8aa8b46de86b2f23902e09b03ecd0d76d6079759",
2423
  "bytes": 19576,
2424
  "exists": true
2425
  },
2426
- "sha256": "5d7e71481492ee07056e035be32ed72b7e46d949b159eeef0cb9b492f820e5e5"
2427
  }
2428
  ]
2429
  }
 
20
  "warning_checks": 0
21
  }
22
  },
23
+ "generated_at": "2026-06-28T00:58:55.373853+00:00",
24
  "known_remaining_gaps": [
25
  "No release-candidate SFT/post-training adapter exists because SFT was stopped and checkpoint-8000 failed behavior gates.",
26
  "The recommended strong repair blend and resume preflight are prepared CPU-side, but no resumed GPU training has been run from them.",
 
146
  }
147
  ],
148
  "release_readiness": {
149
+ "latest_report_generated_at": "2026-06-28T00:58:25.555064+00:00",
150
  "markdown_report": "probes/release-readiness-report.md",
151
  "note": "Serving GGUF release readiness is separated from full project completion because the SFT adapter remains unreleased.",
152
  "report": "probes/release-readiness-report.json",
153
  "script": "scripts/build_release_readiness_report.py",
154
  "summary": {
155
+ "checks": 25,
156
  "failed_checks": 0,
157
  "full_project_status": "incomplete",
158
  "serving_release_status": "pass",
159
  "status_counts": {
160
+ "pass": 20,
161
  "warn": 5
162
  },
163
  "warning_checks": 5
 
183
  "script": "scripts/verify_hf_release.py"
184
  },
185
  "remote_file_count_before_upload": 241,
186
+ "remote_head_before_upload": "16abb00acc4a1c89dbc5c357252fe677205931cd",
187
  "repair_artifacts": {
188
  "code_only_extract_format": {
189
  "assistant_code_fence": 0.0,
 
293
  "sft_status": "stopped; no GPU training is running; no LoRA adapter released"
294
  },
295
  "repo_id": "LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1",
296
+ "serving_profiles": {
297
+ "config": "configs/serving_profiles.yaml",
298
+ "latest_report_generated_at": "2026-06-28T00:56:49.528851+00:00",
299
+ "markdown_report": "probes/serving-profile-validation.md",
300
+ "note": "Machine-readable single-GPU llama.cpp serving profiles with Q4 default, Q3 lowest-memory, IQ4_XS middle-footprint, and adaptive MTP entries.",
301
+ "report": "probes/serving-profile-validation.json",
302
+ "script": "scripts/validate_serving_profiles.py",
303
+ "summary": {
304
+ "checks": 43,
305
+ "failed_checks": 0,
306
+ "status": "pass",
307
+ "status_counts": {
308
+ "pass": 43
309
+ },
310
+ "warnings": 0
311
+ }
312
+ },
313
+ "staged_file_count_excluding_generated_audit_files": 217,
314
  "staged_files": [
315
  {
316
+ "bytes": 12795,
317
  "path": "MODEL_INVESTIGATION_HARNESS.md",
318
  "remote_before_upload": {
319
  "blob_id": "11d19ea8434b8a6b792692c62612340ab47f22c4",
320
  "bytes": 12198,
321
  "exists": true
322
  },
323
+ "sha256": "0275706ac68b747d6ab6b2e65131f8d621b109937939779aa354227effeb367f"
324
  },
325
  {
326
+ "bytes": 9338,
327
  "path": "PROJECT_STATUS_AUDIT.md",
328
  "remote_before_upload": {
329
  "blob_id": "12abd37fee2e13cdc59ac09f34ad41047c37532c",
330
  "bytes": 8575,
331
  "exists": true
332
  },
333
+ "sha256": "1f38f8f0ef4085cfbc0a7e708af86f2ea200130e8df84316e3a5f1258e36f3e9"
334
  },
335
  {
336
+ "bytes": 11157,
337
  "path": "README.md",
338
  "remote_before_upload": {
339
+ "blob_id": "fcbe763783bc5975c28adec65acd1c66a9b7cbdf",
340
+ "bytes": 10523,
341
  "exists": true
342
  },
343
+ "sha256": "f67e32ef769791b92ea113ccc825d783edae9e514ed4304f114d80da551a365d"
344
  },
345
  {
346
  "bytes": 12029,
 
1643
  "sha256": "84efb88c5d571d9942e118cd9cde458fda9ce327b5e71b671c55c9c2836a6a43"
1644
  },
1645
  {
1646
+ "bytes": 2630,
1647
  "path": "configs/serving_matrix.yaml",
1648
  "remote_before_upload": {
1649
  "blob_id": "63d4c96c5aaace66eff3a86ce72c379c948422bc",
1650
  "bytes": 2287,
1651
  "exists": true
1652
  },
1653
+ "sha256": "580b74248e913b8208bbe040267b8bc40e440c7b8643b7621884dfa1a49f86c1"
1654
+ },
1655
+ {
1656
+ "bytes": 5432,
1657
+ "path": "configs/serving_profiles.yaml",
1658
+ "remote_before_upload": {
1659
+ "exists": false
1660
+ },
1661
+ "sha256": "f3a8638b6aae46ac552984f655a39a000f3ebf188524cc24a28ae6e97cbdeee6"
1662
  },
1663
  {
1664
  "bytes": 5232,
 
1961
  "sha256": "fa01e4d58c37d581786ad78b0b773547acefb1dbce0a08373ca36eb6c7229eb7"
1962
  },
1963
  {
1964
+ "bytes": 9923,
1965
  "path": "probes/release-readiness-report.json",
1966
  "remote_before_upload": {
1967
+ "blob_id": "6b35d98f285cb24ab5b918bc78143860a85d1d97",
1968
  "bytes": 8562,
1969
  "exists": true
1970
  },
1971
+ "sha256": "7cb6f2ca33e64d751a833a16cbed4206321fcf031b5f09fcb85c09e88d423e4d"
1972
  },
1973
  {
1974
+ "bytes": 3287,
1975
  "path": "probes/release-readiness-report.md",
1976
  "remote_before_upload": {
1977
+ "blob_id": "d0cc1a5f7a22ef1656f0b17850127d0cbb20d325",
1978
  "bytes": 3017,
1979
  "exists": true
1980
  },
1981
+ "sha256": "92ea357c21517714878c1024543ca2100da8b80f0c23a0590dbeaa22d76b68e0"
1982
+ },
1983
+ {
1984
+ "bytes": 17664,
1985
+ "path": "probes/serving-profile-validation.json",
1986
+ "remote_before_upload": {
1987
+ "exists": false
1988
+ },
1989
+ "sha256": "1e272a261e35d60c710890471a3adb2dbc03e4685a3ee179fadf6bed48c1dac0"
1990
+ },
1991
+ {
1992
+ "bytes": 5737,
1993
+ "path": "probes/serving-profile-validation.md",
1994
+ "remote_before_upload": {
1995
+ "exists": false
1996
+ },
1997
+ "sha256": "0e4d13af8d1f1c7d7694361e16e0d121f04c45700b89fe773d01c8534e6b7824"
1998
  },
1999
  {
2000
  "bytes": 1267,
 
2227
  "sha256": "cf2d52ac14ac23b9c84aa35a8a4c965afed5573f711221411eb93acd634ef526"
2228
  },
2229
  {
2230
+ "bytes": 16856,
2231
  "path": "scripts/build_release_readiness_report.py",
2232
  "remote_before_upload": {
2233
  "blob_id": "a7dc67e2fce48ab06d6a9afe0c24f8e992b4c064",
2234
  "bytes": 15496,
2235
  "exists": true
2236
  },
2237
+ "sha256": "05190a4ce370af14c88853a566b52410d62abd562b49179a55bb2fe3bc6c42d0"
2238
  },
2239
  {
2240
  "bytes": 4467,
 
2446
  },
2447
  "sha256": "340edc3ee4e104e9bf8145195b05ce9f106c63f3b128c32d181ed0512140868a"
2448
  },
2449
+ {
2450
+ "bytes": 9335,
2451
+ "path": "scripts/validate_serving_profiles.py",
2452
+ "remote_before_upload": {
2453
+ "exists": false
2454
+ },
2455
+ "sha256": "7cd47c2fb7b723daa2f1b493e6cc8642499eac0f50057463786ed4dac26cc9f2"
2456
+ },
2457
  {
2458
  "bytes": 15231,
2459
  "path": "scripts/validate_sft_jsonl.py",
 
2465
  "sha256": "b1db75a43b9b3415cba337b868638a496f960cf492bbdfa4c31ad978c277908c"
2466
  },
2467
  {
2468
+ "bytes": 20402,
2469
  "path": "scripts/verify_hf_release.py",
2470
  "remote_before_upload": {
2471
  "blob_id": "8aa8b46de86b2f23902e09b03ecd0d76d6079759",
2472
  "bytes": 19576,
2473
  "exists": true
2474
  },
2475
+ "sha256": "a4afcad099491fa52fbaffe10927966c82ac9c4c8d532144432e441a8f31bdd0"
2476
  }
2477
  ]
2478
  }
MODEL_INVESTIGATION_HARNESS.md CHANGED
@@ -100,6 +100,22 @@ For Ornith this reports `serving_release_status=pass` and
100
  serving release is usable, while the fine-tuning/post-training deliverable
101
  remains unreleased after the stopped SFT run.
102
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
103
  ## Serving And Benchmark Flow
104
 
105
  Start a single-GPU llama.cpp server:
 
100
  serving release is usable, while the fine-tuning/post-training deliverable
101
  remains unreleased after the stopped SFT run.
102
 
103
+ Validate the machine-readable serving profile catalog:
104
+
105
+ ```bash
106
+ .venv-lab/bin/python scripts/validate_serving_profiles.py \
107
+ --catalog configs/serving_profiles.yaml \
108
+ --manifest hf_upload/ARTIFACT_MANIFEST.json \
109
+ --hf-root hf_upload \
110
+ --output runs/serving-profile-validation.json \
111
+ --markdown-output runs/serving-profile-validation.md \
112
+ --fail-on-error
113
+ ```
114
+
115
+ The current catalog validates 5 single-GPU llama.cpp profiles with 43/43 checks
116
+ passing: Q4_K_M short-context speed, Q4_K_M coding-context default, Q3_K_M
117
+ lowest memory, IQ4_XS middle footprint, and adaptive IQ4_XS MTP graft.
118
+
119
  ## Serving And Benchmark Flow
120
 
121
  Start a single-GPU llama.cpp server:
PROJECT_STATUS_AUDIT.md CHANGED
@@ -18,7 +18,7 @@ release-candidate adapter.
18
  | Requirement | Status | Evidence | Notes |
19
  |---|---|---|---|
20
  | Single-GPU serving only, `tp=1` | Complete | `hf_upload/ARTIFACT_MANIFEST.json`, `hf_upload/RELEASE_AUDIT.md`, `hf_upload/README.md` | Multi-GPU serving is explicitly out of scope. Both GPUs are used only as independent experiment lanes. |
21
- | Fast serving profile | Complete for GGUF | `benchmarks/llamacpp-quant-benchmarks.md`, `scripts/serve_llamacpp_gpu0.sh`, `scripts/serve_llamacpp_gpu1.sh` | Recommended speed profile is llama.cpp `Q4_K_M` with `REASONING=off`. |
22
  | Integrated MTP serving profile | Complete with adaptive policy | `benchmarks/llamacpp-iq4-xs-mtp-graft-adaptive-profile.md`, `patches/llamacpp-mtp-adaptive-serving-and-recurrent-rollback.patch` | Low concurrency benefits from MTP; saturated c16 should use adaptive throttling via `LLAMA_SPEC_MAX_DRAFTING_SLOTS=1`. Always-on MTP is not recommended for high-concurrency batches. |
23
  | Find/fix model or serving issues | Complete for discovered issues | `probes/investigation-ornith-q4-live.json`, `benchmarks/llamacpp-q4-reasoning-off-fix.md`, llama.cpp patches under `patches/` | Found reasoning-content empty-final issue, vLLM GGUF corruption, upstream config-only MTP gap, and llama.cpp MTP recurrent/scheduler issues. Documented/fixed where locally controllable. |
24
  | Reusable bug-discovery harness | Complete | `MODEL_INVESTIGATION_HARNESS.md`, `configs/model_behavior_suite.yaml`, `scripts/run_model_investigation.py`, `scripts/probe_model_behavior.py`, `scripts/summarize_behavior_matrix.py`, `runs/behavior-regression-matrix.json` | Published to HF with dependencies and gate scripts. Metadata-only smoke passed with 13 checks, 0 failures, 2 low-severity notes. The behavior matrix compares 7 artifacts across 14 reusable checks and separates 5 passing artifacts from 2 known-bad artifacts. |
@@ -32,6 +32,7 @@ release-candidate adapter.
32
  | Reusable HF release verifier | Complete | `scripts/verify_hf_release.py`, `runs/hf-release-verification-final.json` | Verifies model-card metadata, required support files, staged file hashes, generated release-file hashes, all published GGUF artifacts, and SFT gate summaries. Latest local run passed 21/21 checks with 0 warnings. |
33
  | Reusable behavior regression matrix | Complete | `scripts/summarize_behavior_matrix.py`, `runs/behavior-regression-matrix.json`, `runs/behavior-regression-matrix.md` | CPU-only aggregation over existing behavior/investigation reports. Current run: 7 artifacts, 98 checks, 5 passing artifacts, 2 failing artifacts, 9 failed checks, and 6 blocking issues in known-bad profiles. |
34
  | Reusable release-readiness gate | Complete | `scripts/build_release_readiness_report.py`, `runs/release-readiness-report.json`, `runs/release-readiness-report.md` | CPU-only gate over HF readback, manifest, behavior matrix, quant/KLD docs, MTP policy, required docs, and SFT state. Current run: serving release `pass`, full project `incomplete`, 22 checks, 0 failures, 5 warnings. |
 
35
  | Keep GPUs idle after SFT stop | Complete at audit time | `nvidia-smi`: GPU0 10 MiB / 0%, GPU1 2 MiB / 0%; process scan empty | No `train_sft_lora`, watcher, eval, server, quantize, or convert processes were running. |
36
 
37
  ## Current Release State
@@ -40,6 +41,8 @@ release-candidate adapter.
40
  - Last verified remote commit before this status-audit refresh: `04a18958f05ac002c2ff846d7b5ced6361f9af30`
41
  - Latest local HF verifier report: `runs/hf-release-verification-final.json` (`21/21` checks passed, `0` warnings)
42
  - Published HF verifier entrypoint: `scripts/verify_hf_release.py`
 
 
43
  - Latest behavior regression matrix: `runs/behavior-regression-matrix.json` and `runs/behavior-regression-matrix.md`
44
  - Latest release-readiness report: `runs/release-readiness-report.json` and `runs/release-readiness-report.md`
45
  - Release audit: `RELEASE_AUDIT.md`
 
18
  | Requirement | Status | Evidence | Notes |
19
  |---|---|---|---|
20
  | Single-GPU serving only, `tp=1` | Complete | `hf_upload/ARTIFACT_MANIFEST.json`, `hf_upload/RELEASE_AUDIT.md`, `hf_upload/README.md` | Multi-GPU serving is explicitly out of scope. Both GPUs are used only as independent experiment lanes. |
21
+ | Fast serving profile | Complete for GGUF | `configs/serving_profiles.yaml`, `runs/serving-profile-validation.json`, `benchmarks/llamacpp-quant-benchmarks.md`, `scripts/serve_llamacpp_gpu0.sh`, `scripts/serve_llamacpp_gpu1.sh` | Recommended default is llama.cpp `Q4_K_M` coding context with `REASONING=off`. The serving catalog validates 5 single-GPU profiles with 43/43 checks passing. |
22
  | Integrated MTP serving profile | Complete with adaptive policy | `benchmarks/llamacpp-iq4-xs-mtp-graft-adaptive-profile.md`, `patches/llamacpp-mtp-adaptive-serving-and-recurrent-rollback.patch` | Low concurrency benefits from MTP; saturated c16 should use adaptive throttling via `LLAMA_SPEC_MAX_DRAFTING_SLOTS=1`. Always-on MTP is not recommended for high-concurrency batches. |
23
  | Find/fix model or serving issues | Complete for discovered issues | `probes/investigation-ornith-q4-live.json`, `benchmarks/llamacpp-q4-reasoning-off-fix.md`, llama.cpp patches under `patches/` | Found reasoning-content empty-final issue, vLLM GGUF corruption, upstream config-only MTP gap, and llama.cpp MTP recurrent/scheduler issues. Documented/fixed where locally controllable. |
24
  | Reusable bug-discovery harness | Complete | `MODEL_INVESTIGATION_HARNESS.md`, `configs/model_behavior_suite.yaml`, `scripts/run_model_investigation.py`, `scripts/probe_model_behavior.py`, `scripts/summarize_behavior_matrix.py`, `runs/behavior-regression-matrix.json` | Published to HF with dependencies and gate scripts. Metadata-only smoke passed with 13 checks, 0 failures, 2 low-severity notes. The behavior matrix compares 7 artifacts across 14 reusable checks and separates 5 passing artifacts from 2 known-bad artifacts. |
 
32
  | Reusable HF release verifier | Complete | `scripts/verify_hf_release.py`, `runs/hf-release-verification-final.json` | Verifies model-card metadata, required support files, staged file hashes, generated release-file hashes, all published GGUF artifacts, and SFT gate summaries. Latest local run passed 21/21 checks with 0 warnings. |
33
  | Reusable behavior regression matrix | Complete | `scripts/summarize_behavior_matrix.py`, `runs/behavior-regression-matrix.json`, `runs/behavior-regression-matrix.md` | CPU-only aggregation over existing behavior/investigation reports. Current run: 7 artifacts, 98 checks, 5 passing artifacts, 2 failing artifacts, 9 failed checks, and 6 blocking issues in known-bad profiles. |
34
  | Reusable release-readiness gate | Complete | `scripts/build_release_readiness_report.py`, `runs/release-readiness-report.json`, `runs/release-readiness-report.md` | CPU-only gate over HF readback, manifest, behavior matrix, quant/KLD docs, MTP policy, required docs, and SFT state. Current run: serving release `pass`, full project `incomplete`, 22 checks, 0 failures, 5 warnings. |
35
+ | Machine-readable serving profile catalog | Complete | `configs/serving_profiles.yaml`, `scripts/validate_serving_profiles.py`, `runs/serving-profile-validation.json`, `runs/serving-profile-validation.md` | Catalog captures Q4_K_M speed/default, Q3_K_M lowest-memory, IQ4_XS middle-footprint, and adaptive IQ4_XS MTP graft profiles. Validation passes 43/43 checks against manifest, scripts, evidence docs, and tp=1 policy. |
36
  | Keep GPUs idle after SFT stop | Complete at audit time | `nvidia-smi`: GPU0 10 MiB / 0%, GPU1 2 MiB / 0%; process scan empty | No `train_sft_lora`, watcher, eval, server, quantize, or convert processes were running. |
37
 
38
  ## Current Release State
 
41
  - Last verified remote commit before this status-audit refresh: `04a18958f05ac002c2ff846d7b5ced6361f9af30`
42
  - Latest local HF verifier report: `runs/hf-release-verification-final.json` (`21/21` checks passed, `0` warnings)
43
  - Published HF verifier entrypoint: `scripts/verify_hf_release.py`
44
+ - Serving profile catalog: `configs/serving_profiles.yaml`
45
+ - Latest serving profile validation: `runs/serving-profile-validation.json` and `runs/serving-profile-validation.md`
46
  - Latest behavior regression matrix: `runs/behavior-regression-matrix.json` and `runs/behavior-regression-matrix.md`
47
  - Latest release-readiness report: `runs/release-readiness-report.json` and `runs/release-readiness-report.md`
48
  - Release audit: `RELEASE_AUDIT.md`
README.md CHANGED
@@ -37,6 +37,8 @@ This workspace tracks optimization work for `deepreinforce-ai/Ornith-1.0-35B`.
37
  Current reusable workflow: [MODEL_INVESTIGATION_HARNESS.md](MODEL_INVESTIGATION_HARNESS.md).
38
  Current requirement audit: [PROJECT_STATUS_AUDIT.md](PROJECT_STATUS_AUDIT.md).
39
  SFT remediation plan: [SFT_REMEDIATION_PLAN.md](SFT_REMEDIATION_PLAN.md).
 
 
40
  Behavior regression matrix: [probes/behavior-regression-matrix.md](probes/behavior-regression-matrix.md)
41
  via [scripts/summarize_behavior_matrix.py](scripts/summarize_behavior_matrix.py).
42
  Release readiness report: [probes/release-readiness-report.md](probes/release-readiness-report.md)
@@ -125,6 +127,7 @@ Build the CPU-only release-readiness report:
125
  ```bash
126
  .venv-lab/bin/python scripts/build_release_readiness_report.py \
127
  --allow-unreleased-sft \
 
128
  --required-doc hf_upload/README.md \
129
  --required-doc hf_upload/RELEASE_AUDIT.md \
130
  --required-doc hf_upload/PROJECT_STATUS_AUDIT.md \
@@ -138,6 +141,18 @@ Build the CPU-only release-readiness report:
138
  The current readiness report passes the GGUF serving release and marks the full
139
  project incomplete because no SFT/post-training adapter is released.
140
 
 
 
 
 
 
 
 
 
 
 
 
 
141
  Run reusable behavior probes against any OpenAI-compatible backend:
142
 
143
  ```bash
 
37
  Current reusable workflow: [MODEL_INVESTIGATION_HARNESS.md](MODEL_INVESTIGATION_HARNESS.md).
38
  Current requirement audit: [PROJECT_STATUS_AUDIT.md](PROJECT_STATUS_AUDIT.md).
39
  SFT remediation plan: [SFT_REMEDIATION_PLAN.md](SFT_REMEDIATION_PLAN.md).
40
+ Serving profile catalog: [configs/serving_profiles.yaml](configs/serving_profiles.yaml)
41
+ with validation report [probes/serving-profile-validation.md](probes/serving-profile-validation.md).
42
  Behavior regression matrix: [probes/behavior-regression-matrix.md](probes/behavior-regression-matrix.md)
43
  via [scripts/summarize_behavior_matrix.py](scripts/summarize_behavior_matrix.py).
44
  Release readiness report: [probes/release-readiness-report.md](probes/release-readiness-report.md)
 
127
  ```bash
128
  .venv-lab/bin/python scripts/build_release_readiness_report.py \
129
  --allow-unreleased-sft \
130
+ --serving-profile-validation hf_upload/probes/serving-profile-validation.json \
131
  --required-doc hf_upload/README.md \
132
  --required-doc hf_upload/RELEASE_AUDIT.md \
133
  --required-doc hf_upload/PROJECT_STATUS_AUDIT.md \
 
141
  The current readiness report passes the GGUF serving release and marks the full
142
  project incomplete because no SFT/post-training adapter is released.
143
 
144
+ Validate the machine-readable serving profiles:
145
+
146
+ ```bash
147
+ .venv-lab/bin/python scripts/validate_serving_profiles.py \
148
+ --catalog configs/serving_profiles.yaml \
149
+ --manifest hf_upload/ARTIFACT_MANIFEST.json \
150
+ --hf-root hf_upload \
151
+ --output runs/serving-profile-validation.json \
152
+ --markdown-output runs/serving-profile-validation.md \
153
+ --fail-on-error
154
+ ```
155
+
156
  Run reusable behavior probes against any OpenAI-compatible backend:
157
 
158
  ```bash
RELEASE_AUDIT.md CHANGED
@@ -1,13 +1,14 @@
1
  # Release Audit
2
 
3
- Generated: 2026-06-28T00:52:18.227594+00:00
4
 
5
  - HF repo: `LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1`
6
- - Remote head before this upload: `7dcf02d87d07e4b173d7b375e9fc747605d80652`
7
  - Remote files before this upload: 241
8
- - Staged support files excluding generated audit files: 213
9
  - Overall status: `pass for serving/quant/MTP support files; SFT adapter remains unreleased`
10
  - Latest HF release verifier: `pass` (`25` checks, `0` failures, `1` expected SFT warning)
 
11
  - Latest behavior regression matrix: `5` passing artifacts, `2` known-bad failing artifacts
12
  - Latest release readiness: serving release `pass`, full project `incomplete`
13
 
@@ -72,12 +73,22 @@ Generated: 2026-06-28T00:52:18.227594+00:00
72
  - Known-bad artifacts are intentionally included: the old reasoning-on Q4
73
  profile and the stopped checkpoint-8000 LoRA adapter.
74
 
 
 
 
 
 
 
 
 
 
 
75
  ## Release Readiness
76
 
77
  - Script: `scripts/build_release_readiness_report.py`
78
  - Latest report: `probes/release-readiness-report.json`
79
  - Markdown summary: `probes/release-readiness-report.md`
80
- - Current run: `22` checks, `0` failures, `5` warnings.
81
  - Serving GGUF release status: `pass`.
82
  - Full project status: `incomplete` because no SFT/post-training adapter is
83
  released.
 
1
  # Release Audit
2
 
3
+ Generated: 2026-06-28T00:58:55.373853+00:00
4
 
5
  - HF repo: `LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1`
6
+ - Remote head before this upload: `16abb00acc4a1c89dbc5c357252fe677205931cd`
7
  - Remote files before this upload: 241
8
+ - Staged support files excluding generated audit files: 217
9
  - Overall status: `pass for serving/quant/MTP support files; SFT adapter remains unreleased`
10
  - Latest HF release verifier: `pass` (`25` checks, `0` failures, `1` expected SFT warning)
11
+ - Latest serving profile validation: `pass` (`43/43` checks)
12
  - Latest behavior regression matrix: `5` passing artifacts, `2` known-bad failing artifacts
13
  - Latest release readiness: serving release `pass`, full project `incomplete`
14
 
 
73
  - Known-bad artifacts are intentionally included: the old reasoning-on Q4
74
  profile and the stopped checkpoint-8000 LoRA adapter.
75
 
76
+ ## Serving Profiles
77
+
78
+ - Catalog: `configs/serving_profiles.yaml`
79
+ - Validator: `scripts/validate_serving_profiles.py`
80
+ - Latest report: `probes/serving-profile-validation.json`
81
+ - Markdown summary: `probes/serving-profile-validation.md`
82
+ - Current run: `43/43` checks passed, `0` failures, `0` warnings.
83
+ - Profiles: Q4_K_M speed/default, Q3_K_M lowest-memory, IQ4_XS
84
+ middle-footprint, and adaptive IQ4_XS MTP graft.
85
+
86
  ## Release Readiness
87
 
88
  - Script: `scripts/build_release_readiness_report.py`
89
  - Latest report: `probes/release-readiness-report.json`
90
  - Markdown summary: `probes/release-readiness-report.md`
91
+ - Current run: `25` checks, `0` failures, `5` warnings.
92
  - Serving GGUF release status: `pass`.
93
  - Full project status: `incomplete` because no SFT/post-training adapter is
94
  released.
configs/serving_matrix.yaml CHANGED
@@ -13,16 +13,20 @@ policy:
13
  - multi_gpu_serving
14
 
15
  current_baseline:
16
- date: "2026-06-26"
17
- winner: vllm_bf16_tp1
18
- reason: higher aggregate output throughput and lower p95 TTFT than the current SGLang profile at concurrency 4+
19
  constraints:
20
  tensor_parallel_size: 1
21
  max_model_len: 131072
22
- dtype: bfloat16
 
 
23
  benchmark_notes:
24
- vllm_profile: runs/vllm-initial-profile.md
25
- sglang_profile: runs/sglang-initial-profile.md
 
 
26
 
27
  serving_candidates:
28
  - name: sglang_bf16_tp1
@@ -57,6 +61,8 @@ serving_candidates:
57
  expected_strengths:
58
  - fast_gguf_loading
59
  - small_memory_footprint
 
 
60
 
61
  benchmarks:
62
  smoke:
 
13
  - multi_gpu_serving
14
 
15
  current_baseline:
16
+ date: "2026-06-28"
17
+ winner: llamacpp_gguf_q4_k_m_tp1
18
+ reason: verified GGUF release path; Q4_K_M is the fastest validated llama.cpp quant, vLLM GGUF remains unsupported for this model family, and BF16 baselines are retained only as historical notes
19
  constraints:
20
  tensor_parallel_size: 1
21
  max_model_len: 131072
22
+ quant: Q4_K_M
23
+ backend: llama.cpp
24
+ reasoning: off
25
  benchmark_notes:
26
+ serving_profiles: configs/serving_profiles.yaml
27
+ quant_benchmarks: benchmarks/llamacpp-quant-benchmarks.md
28
+ behavior_matrix: probes/behavior-regression-matrix.md
29
+ release_readiness: probes/release-readiness-report.md
30
 
31
  serving_candidates:
32
  - name: sglang_bf16_tp1
 
61
  expected_strengths:
62
  - fast_gguf_loading
63
  - small_memory_footprint
64
+ - verified_hf_release_artifact
65
+ - reasoning_off_final_answer_mode
66
 
67
  benchmarks:
68
  smoke:
configs/serving_profiles.yaml ADDED
@@ -0,0 +1,173 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ model:
2
+ hf_repo: deepreinforce-ai/Ornith-1.0-35B
3
+ release_repo: LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1
4
+ served_name: Ornith-1.0-35B
5
+
6
+ policy:
7
+ serving_parallelism: tp1_only
8
+ tensor_parallel_size: 1
9
+ backend: llama.cpp
10
+ reasoning: "off"
11
+ gpu_usage_note: Use one independent model copy per GPU. Do not split one serving replica across GPUs.
12
+ forbidden:
13
+ - tensor_parallel_size_gt_1
14
+ - multi_gpu_serving
15
+
16
+ default_profile: llamacpp_q4_k_m_coding_context
17
+ lowest_memory_profile: llamacpp_q3_k_m_short_context
18
+ middle_footprint_profile: llamacpp_iq4_xs_short_context
19
+ adaptive_mtp_profile: llamacpp_iq4_xs_mtp_graft_adaptive
20
+
21
+ profiles:
22
+ - id: llamacpp_q4_k_m_short_context
23
+ status: recommended_speed_benchmark
24
+ backend: llama.cpp
25
+ tensor_parallel_size: 1
26
+ artifact: ornith-1.0-35b-Q4_K_M.gguf
27
+ quant: Q4_K_M
28
+ command:
29
+ script: scripts/serve_llamacpp_gpu0.sh
30
+ env:
31
+ QUANT: Q4_K_M
32
+ PORT: "8002"
33
+ CTX_SIZE: "8192"
34
+ PARALLEL: "16"
35
+ BATCH_SIZE: "4096"
36
+ UBATCH_SIZE: "512"
37
+ REASONING: "off"
38
+ measured:
39
+ loaded_vram_gib: 21.31
40
+ c1_output_tps: 243.3
41
+ c16_output_tps: 655.6
42
+ c16_p95_ttft_ms: 650.0
43
+ behavior_gate: pass
44
+ evidence:
45
+ benchmark: benchmarks/llamacpp-quant-benchmarks.md
46
+ behavior: probes/behavior-llamacpp-q4-script-default.json
47
+ notes:
48
+ - Short-context benchmark profile exposes about 512 tokens per slot because CTX_SIZE is split across PARALLEL slots.
49
+
50
+ - id: llamacpp_q4_k_m_coding_context
51
+ status: recommended_default
52
+ backend: llama.cpp
53
+ tensor_parallel_size: 1
54
+ artifact: ornith-1.0-35b-Q4_K_M.gguf
55
+ quant: Q4_K_M
56
+ command:
57
+ script: scripts/serve_llamacpp_gpu0.sh
58
+ env:
59
+ QUANT: Q4_K_M
60
+ PORT: "8002"
61
+ CTX_SIZE: "131072"
62
+ PARALLEL: "16"
63
+ BATCH_SIZE: "4096"
64
+ UBATCH_SIZE: "512"
65
+ REASONING: "off"
66
+ measured:
67
+ loaded_vram_gib_short_context: 21.31
68
+ c16_output_tps_short_context: 655.6
69
+ behavior_gate: pass
70
+ evidence:
71
+ benchmark: benchmarks/llamacpp-quant-benchmarks.md
72
+ behavior: probes/behavior-llamacpp-q4-script-default.json
73
+ notes:
74
+ - Practical coding-serving profile with 16 slots and about 8k context per slot.
75
+ - Throughput numbers come from the matched short-context sweep.
76
+
77
+ - id: llamacpp_q3_k_m_short_context
78
+ status: lowest_memory_validated
79
+ backend: llama.cpp
80
+ tensor_parallel_size: 1
81
+ artifact: ornith-1.0-35b-Q3_K_M.gguf
82
+ quant: Q3_K_M
83
+ command:
84
+ script: scripts/serve_llamacpp_gpu0.sh
85
+ env:
86
+ QUANT: Q3_K_M
87
+ PORT: "8002"
88
+ CTX_SIZE: "8192"
89
+ PARALLEL: "16"
90
+ BATCH_SIZE: "4096"
91
+ UBATCH_SIZE: "512"
92
+ REASONING: "off"
93
+ measured:
94
+ gguf_gib: 15.61
95
+ loaded_vram_gib: 17.27
96
+ c1_output_tps: 240.5
97
+ c16_output_tps: 493.0
98
+ mean_kld_nats_vs_bf16_top64: 0.3620
99
+ behavior_gate: pass
100
+ evidence:
101
+ benchmark: benchmarks/llamacpp-quant-benchmarks.md
102
+ kld: benchmarks/kld-quant-vs-bf16-top64.md
103
+ behavior: probes/behavior-llamacpp-q3-k-m-parallel16.json
104
+
105
+ - id: llamacpp_iq4_xs_short_context
106
+ status: middle_footprint_validated
107
+ backend: llama.cpp
108
+ tensor_parallel_size: 1
109
+ artifact: ornith-1.0-35b-IQ4_XS.gguf
110
+ quant: IQ4_XS
111
+ command:
112
+ script: scripts/serve_llamacpp_gpu0.sh
113
+ env:
114
+ QUANT: IQ4_XS
115
+ PORT: "8002"
116
+ CTX_SIZE: "8192"
117
+ PARALLEL: "16"
118
+ BATCH_SIZE: "4096"
119
+ UBATCH_SIZE: "512"
120
+ REASONING: "off"
121
+ measured:
122
+ gguf_gib: 17.64
123
+ loaded_vram_gib: 19.34
124
+ c1_output_tps: 234.1
125
+ c16_output_tps: 476.0
126
+ mean_kld_nats_vs_bf16_top64: 0.1426
127
+ behavior_gate: pass
128
+ evidence:
129
+ benchmark: benchmarks/llamacpp-quant-benchmarks.md
130
+ kld: benchmarks/kld-quant-vs-bf16-top64.md
131
+ behavior: probes/behavior-llamacpp-iq4-xs-parallel16.json
132
+
133
+ - id: llamacpp_iq4_xs_mtp_graft_adaptive
134
+ status: experimental_adaptive_mtp
135
+ backend: llama.cpp
136
+ tensor_parallel_size: 1
137
+ artifact: ornith-1.0-35b-IQ4_XS-MTP-graft-headQ6.gguf
138
+ quant: IQ4_XS_with_Q6_MTP_head
139
+ command:
140
+ script: scripts/serve_llamacpp_gpu0.sh
141
+ env:
142
+ MODEL_PATH: ornith-1.0-35b-IQ4_XS-MTP-graft-headQ6.gguf
143
+ ALIAS: Ornith-1.0-35B-GGUF-IQ4_XS-MTP
144
+ PORT: "8002"
145
+ CTX_SIZE: "8192"
146
+ PARALLEL: "16"
147
+ BATCH_SIZE: "4096"
148
+ UBATCH_SIZE: "512"
149
+ REASONING: "off"
150
+ SPEC_TYPE: draft-mtp
151
+ SPEC_DRAFT_N_MAX: "2"
152
+ SPEC_DRAFT_N_MIN: "0"
153
+ SPEC_DRAFT_BACKEND_SAMPLING: "1"
154
+ LLAMA_SPEC_MAX_DRAFTING_SLOTS: "1"
155
+ LLAMA_MTP_FAST_BACKEND_SAMPLE: "1"
156
+ LLAMA_MTP_DRAFT_TOP_K: "1"
157
+ LLAMA_MTP_DRAFT_TOP_P: "1"
158
+ LLAMA_MTP_DRAFT_TEMP: "1"
159
+ measured:
160
+ c1_ar_tps: 221.80
161
+ c1_mtp_adaptive_tps: 319.53
162
+ c1_acceptance_by_position:
163
+ - 0.953
164
+ - 0.865
165
+ c16_ar_tps: 568.57
166
+ c16_adaptive_tps: 564.48
167
+ c16_threshold1_tps: 592.45
168
+ evidence:
169
+ benchmark: benchmarks/llamacpp-iq4-xs-mtp-graft-adaptive-profile.md
170
+ patch: patches/llamacpp-mtp-adaptive-serving-and-recurrent-rollback.patch
171
+ caveats:
172
+ - Always-on MTP is not recommended at saturated c16 because it was slower than target-only decoding.
173
+ - Adaptive throttling uses MTP for low-concurrency requests and disables it under saturated batches.
probes/release-readiness-report.json CHANGED
@@ -180,6 +180,52 @@
180
  "recommendation": "Keep known-bad profiles labeled and do not promote them as release candidates.",
181
  "status": "warn"
182
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
183
  {
184
  "detail": "stopped; no GPU training is running; no LoRA adapter released",
185
  "evidence": [
@@ -280,22 +326,23 @@
280
  "status": "pass"
281
  }
282
  ],
283
- "generated_at": "2026-06-28T00:51:35.069342+00:00",
284
  "inputs": {
285
  "behavior_matrix": "hf_upload/probes/behavior-regression-matrix.json",
286
  "hf_verification": "hf_upload/probes/hf-release-verification.json",
287
  "kld_report": "hf_upload/benchmarks/kld-quant-vs-bf16-top64.md",
288
  "manifest": "hf_upload/ARTIFACT_MANIFEST.json",
289
  "mtp_profile": "hf_upload/benchmarks/llamacpp-iq4-xs-mtp-graft-adaptive-profile.md",
290
- "quant_benchmarks": "hf_upload/benchmarks/llamacpp-quant-benchmarks.md"
 
291
  },
292
  "summary": {
293
- "checks": 22,
294
  "failed_checks": 0,
295
  "full_project_status": "incomplete",
296
  "serving_release_status": "pass",
297
  "status_counts": {
298
- "pass": 17,
299
  "warn": 5
300
  },
301
  "warning_checks": 5
 
180
  "recommendation": "Keep known-bad profiles labeled and do not promote them as release candidates.",
181
  "status": "warn"
182
  },
183
+ {
184
+ "detail": "serving profile validation report exists",
185
+ "evidence": [
186
+ "hf_upload/probes/serving-profile-validation.json"
187
+ ],
188
+ "metrics": {},
189
+ "name": "serving_profiles:validation_exists",
190
+ "recommendation": null,
191
+ "status": "pass"
192
+ },
193
+ {
194
+ "detail": "serving profile validation status is 'pass'",
195
+ "evidence": [
196
+ "hf_upload/probes/serving-profile-validation.json"
197
+ ],
198
+ "metrics": {
199
+ "checks": 43,
200
+ "failed_checks": 0,
201
+ "status": "pass",
202
+ "status_counts": {
203
+ "pass": 43
204
+ },
205
+ "warnings": 0
206
+ },
207
+ "name": "serving_profiles:validation_status",
208
+ "recommendation": null,
209
+ "status": "pass"
210
+ },
211
+ {
212
+ "detail": "5 serving profiles are validated",
213
+ "evidence": [
214
+ "hf_upload/probes/serving-profile-validation.json"
215
+ ],
216
+ "metrics": {
217
+ "profiles": [
218
+ "llamacpp_q4_k_m_short_context",
219
+ "llamacpp_q4_k_m_coding_context",
220
+ "llamacpp_q3_k_m_short_context",
221
+ "llamacpp_iq4_xs_short_context",
222
+ "llamacpp_iq4_xs_mtp_graft_adaptive"
223
+ ]
224
+ },
225
+ "name": "serving_profiles:profile_count",
226
+ "recommendation": null,
227
+ "status": "pass"
228
+ },
229
  {
230
  "detail": "stopped; no GPU training is running; no LoRA adapter released",
231
  "evidence": [
 
326
  "status": "pass"
327
  }
328
  ],
329
+ "generated_at": "2026-06-28T00:58:25.555064+00:00",
330
  "inputs": {
331
  "behavior_matrix": "hf_upload/probes/behavior-regression-matrix.json",
332
  "hf_verification": "hf_upload/probes/hf-release-verification.json",
333
  "kld_report": "hf_upload/benchmarks/kld-quant-vs-bf16-top64.md",
334
  "manifest": "hf_upload/ARTIFACT_MANIFEST.json",
335
  "mtp_profile": "hf_upload/benchmarks/llamacpp-iq4-xs-mtp-graft-adaptive-profile.md",
336
+ "quant_benchmarks": "hf_upload/benchmarks/llamacpp-quant-benchmarks.md",
337
+ "serving_profile_validation": "hf_upload/probes/serving-profile-validation.json"
338
  },
339
  "summary": {
340
+ "checks": 25,
341
  "failed_checks": 0,
342
  "full_project_status": "incomplete",
343
  "serving_release_status": "pass",
344
  "status_counts": {
345
+ "pass": 20,
346
  "warn": 5
347
  },
348
  "warning_checks": 5
probes/release-readiness-report.md CHANGED
@@ -1,12 +1,12 @@
1
  # Release Readiness Report
2
 
3
- Generated: 2026-06-28T00:51:35.069342+00:00
4
 
5
  ## Summary
6
 
7
  - Serving release status: `pass`
8
  - Full project status: `incomplete`
9
- - Checks: 22
10
  - Failures: 0
11
  - Warnings: 5
12
 
@@ -27,6 +27,9 @@ Generated: 2026-06-28T00:51:35.069342+00:00
27
  | `behavior_matrix:exists` | `pass` | behavior regression matrix exists |
28
  | `behavior_matrix:passing_artifacts` | `pass` | 5 artifacts pass the behavior matrix |
29
  | `behavior_matrix:known_bad_artifacts_disclosed` | `warn` | 2 failing artifacts are present in the matrix for regression visibility |
 
 
 
30
  | `sft:release_adapter_state` | `warn` | stopped; no GPU training is running; no LoRA adapter released |
31
  | `docs:README.md` | `pass` | required evidence doc README.md exists |
32
  | `docs:RELEASE_AUDIT.md` | `pass` | required evidence doc RELEASE_AUDIT.md exists |
 
1
  # Release Readiness Report
2
 
3
+ Generated: 2026-06-28T00:58:25.555064+00:00
4
 
5
  ## Summary
6
 
7
  - Serving release status: `pass`
8
  - Full project status: `incomplete`
9
+ - Checks: 25
10
  - Failures: 0
11
  - Warnings: 5
12
 
 
27
  | `behavior_matrix:exists` | `pass` | behavior regression matrix exists |
28
  | `behavior_matrix:passing_artifacts` | `pass` | 5 artifacts pass the behavior matrix |
29
  | `behavior_matrix:known_bad_artifacts_disclosed` | `warn` | 2 failing artifacts are present in the matrix for regression visibility |
30
+ | `serving_profiles:validation_exists` | `pass` | serving profile validation report exists |
31
+ | `serving_profiles:validation_status` | `pass` | serving profile validation status is 'pass' |
32
+ | `serving_profiles:profile_count` | `pass` | 5 serving profiles are validated |
33
  | `sft:release_adapter_state` | `warn` | stopped; no GPU training is running; no LoRA adapter released |
34
  | `docs:README.md` | `pass` | required evidence doc README.md exists |
35
  | `docs:RELEASE_AUDIT.md` | `pass` | required evidence doc RELEASE_AUDIT.md exists |
probes/serving-profile-validation.json ADDED
@@ -0,0 +1,566 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "checks": [
3
+ {
4
+ "detail": "catalog exists: configs/serving_profiles.yaml",
5
+ "name": "catalog:exists",
6
+ "status": "pass"
7
+ },
8
+ {
9
+ "detail": "serving policy is single-GPU tp=1",
10
+ "metrics": {
11
+ "backend": "llama.cpp",
12
+ "forbidden": [
13
+ "tensor_parallel_size_gt_1",
14
+ "multi_gpu_serving"
15
+ ],
16
+ "gpu_usage_note": "Use one independent model copy per GPU. Do not split one serving replica across GPUs.",
17
+ "reasoning": "off",
18
+ "serving_parallelism": "tp1_only",
19
+ "tensor_parallel_size": 1
20
+ },
21
+ "name": "policy:tp1_only",
22
+ "status": "pass"
23
+ },
24
+ {
25
+ "detail": "multi-GPU serving and tensor_parallel_size>1 are explicitly forbidden",
26
+ "metrics": {
27
+ "forbidden": [
28
+ "multi_gpu_serving",
29
+ "tensor_parallel_size_gt_1"
30
+ ]
31
+ },
32
+ "name": "policy:multi_gpu_forbidden",
33
+ "status": "pass"
34
+ },
35
+ {
36
+ "detail": "default serving policy disables reasoning final-answer leakage",
37
+ "metrics": {
38
+ "reasoning": "off"
39
+ },
40
+ "name": "policy:reasoning_off",
41
+ "status": "pass"
42
+ },
43
+ {
44
+ "detail": "5 serving profiles are listed",
45
+ "metrics": {
46
+ "profiles": [
47
+ "llamacpp_q4_k_m_short_context",
48
+ "llamacpp_q4_k_m_coding_context",
49
+ "llamacpp_q3_k_m_short_context",
50
+ "llamacpp_iq4_xs_short_context",
51
+ "llamacpp_iq4_xs_mtp_graft_adaptive"
52
+ ]
53
+ },
54
+ "name": "profiles:count",
55
+ "status": "pass"
56
+ },
57
+ {
58
+ "detail": "default_profile points to a listed profile",
59
+ "metrics": {
60
+ "value": "llamacpp_q4_k_m_coding_context"
61
+ },
62
+ "name": "profiles:default_profile",
63
+ "status": "pass"
64
+ },
65
+ {
66
+ "detail": "lowest_memory_profile points to a listed profile",
67
+ "metrics": {
68
+ "value": "llamacpp_q3_k_m_short_context"
69
+ },
70
+ "name": "profiles:lowest_memory_profile",
71
+ "status": "pass"
72
+ },
73
+ {
74
+ "detail": "middle_footprint_profile points to a listed profile",
75
+ "metrics": {
76
+ "value": "llamacpp_iq4_xs_short_context"
77
+ },
78
+ "name": "profiles:middle_footprint_profile",
79
+ "status": "pass"
80
+ },
81
+ {
82
+ "detail": "adaptive_mtp_profile points to a listed profile",
83
+ "metrics": {
84
+ "value": "llamacpp_iq4_xs_mtp_graft_adaptive"
85
+ },
86
+ "name": "profiles:adaptive_mtp_profile",
87
+ "status": "pass"
88
+ },
89
+ {
90
+ "detail": "profile uses tensor_parallel_size=1",
91
+ "metrics": {
92
+ "tensor_parallel_size": 1
93
+ },
94
+ "name": "profile:llamacpp_q4_k_m_short_context:tp1",
95
+ "status": "pass"
96
+ },
97
+ {
98
+ "detail": "serving script exists: scripts/serve_llamacpp_gpu0.sh",
99
+ "evidence": [
100
+ "hf_upload/scripts/serve_llamacpp_gpu0.sh"
101
+ ],
102
+ "name": "profile:llamacpp_q4_k_m_short_context:script",
103
+ "status": "pass"
104
+ },
105
+ {
106
+ "detail": "profile sets REASONING=off",
107
+ "metrics": {
108
+ "REASONING": "off"
109
+ },
110
+ "name": "profile:llamacpp_q4_k_m_short_context:reasoning_off",
111
+ "status": "pass"
112
+ },
113
+ {
114
+ "detail": "artifact is published: ornith-1.0-35b-Q4_K_M.gguf",
115
+ "metrics": {
116
+ "artifact": "ornith-1.0-35b-Q4_K_M.gguf"
117
+ },
118
+ "name": "profile:llamacpp_q4_k_m_short_context:artifact_published",
119
+ "status": "pass"
120
+ },
121
+ {
122
+ "detail": "evidence exists: benchmarks/llamacpp-quant-benchmarks.md",
123
+ "evidence": [
124
+ "hf_upload/benchmarks/llamacpp-quant-benchmarks.md"
125
+ ],
126
+ "name": "profile:llamacpp_q4_k_m_short_context:evidence:benchmark",
127
+ "status": "pass"
128
+ },
129
+ {
130
+ "detail": "evidence exists: probes/behavior-llamacpp-q4-script-default.json",
131
+ "evidence": [
132
+ "hf_upload/probes/behavior-llamacpp-q4-script-default.json"
133
+ ],
134
+ "name": "profile:llamacpp_q4_k_m_short_context:evidence:behavior",
135
+ "status": "pass"
136
+ },
137
+ {
138
+ "detail": "profile uses tensor_parallel_size=1",
139
+ "metrics": {
140
+ "tensor_parallel_size": 1
141
+ },
142
+ "name": "profile:llamacpp_q4_k_m_coding_context:tp1",
143
+ "status": "pass"
144
+ },
145
+ {
146
+ "detail": "serving script exists: scripts/serve_llamacpp_gpu0.sh",
147
+ "evidence": [
148
+ "hf_upload/scripts/serve_llamacpp_gpu0.sh"
149
+ ],
150
+ "name": "profile:llamacpp_q4_k_m_coding_context:script",
151
+ "status": "pass"
152
+ },
153
+ {
154
+ "detail": "profile sets REASONING=off",
155
+ "metrics": {
156
+ "REASONING": "off"
157
+ },
158
+ "name": "profile:llamacpp_q4_k_m_coding_context:reasoning_off",
159
+ "status": "pass"
160
+ },
161
+ {
162
+ "detail": "artifact is published: ornith-1.0-35b-Q4_K_M.gguf",
163
+ "metrics": {
164
+ "artifact": "ornith-1.0-35b-Q4_K_M.gguf"
165
+ },
166
+ "name": "profile:llamacpp_q4_k_m_coding_context:artifact_published",
167
+ "status": "pass"
168
+ },
169
+ {
170
+ "detail": "evidence exists: benchmarks/llamacpp-quant-benchmarks.md",
171
+ "evidence": [
172
+ "hf_upload/benchmarks/llamacpp-quant-benchmarks.md"
173
+ ],
174
+ "name": "profile:llamacpp_q4_k_m_coding_context:evidence:benchmark",
175
+ "status": "pass"
176
+ },
177
+ {
178
+ "detail": "evidence exists: probes/behavior-llamacpp-q4-script-default.json",
179
+ "evidence": [
180
+ "hf_upload/probes/behavior-llamacpp-q4-script-default.json"
181
+ ],
182
+ "name": "profile:llamacpp_q4_k_m_coding_context:evidence:behavior",
183
+ "status": "pass"
184
+ },
185
+ {
186
+ "detail": "profile uses tensor_parallel_size=1",
187
+ "metrics": {
188
+ "tensor_parallel_size": 1
189
+ },
190
+ "name": "profile:llamacpp_q3_k_m_short_context:tp1",
191
+ "status": "pass"
192
+ },
193
+ {
194
+ "detail": "serving script exists: scripts/serve_llamacpp_gpu0.sh",
195
+ "evidence": [
196
+ "hf_upload/scripts/serve_llamacpp_gpu0.sh"
197
+ ],
198
+ "name": "profile:llamacpp_q3_k_m_short_context:script",
199
+ "status": "pass"
200
+ },
201
+ {
202
+ "detail": "profile sets REASONING=off",
203
+ "metrics": {
204
+ "REASONING": "off"
205
+ },
206
+ "name": "profile:llamacpp_q3_k_m_short_context:reasoning_off",
207
+ "status": "pass"
208
+ },
209
+ {
210
+ "detail": "artifact is published: ornith-1.0-35b-Q3_K_M.gguf",
211
+ "metrics": {
212
+ "artifact": "ornith-1.0-35b-Q3_K_M.gguf"
213
+ },
214
+ "name": "profile:llamacpp_q3_k_m_short_context:artifact_published",
215
+ "status": "pass"
216
+ },
217
+ {
218
+ "detail": "evidence exists: benchmarks/llamacpp-quant-benchmarks.md",
219
+ "evidence": [
220
+ "hf_upload/benchmarks/llamacpp-quant-benchmarks.md"
221
+ ],
222
+ "name": "profile:llamacpp_q3_k_m_short_context:evidence:benchmark",
223
+ "status": "pass"
224
+ },
225
+ {
226
+ "detail": "evidence exists: benchmarks/kld-quant-vs-bf16-top64.md",
227
+ "evidence": [
228
+ "hf_upload/benchmarks/kld-quant-vs-bf16-top64.md"
229
+ ],
230
+ "name": "profile:llamacpp_q3_k_m_short_context:evidence:kld",
231
+ "status": "pass"
232
+ },
233
+ {
234
+ "detail": "evidence exists: probes/behavior-llamacpp-q3-k-m-parallel16.json",
235
+ "evidence": [
236
+ "hf_upload/probes/behavior-llamacpp-q3-k-m-parallel16.json"
237
+ ],
238
+ "name": "profile:llamacpp_q3_k_m_short_context:evidence:behavior",
239
+ "status": "pass"
240
+ },
241
+ {
242
+ "detail": "profile uses tensor_parallel_size=1",
243
+ "metrics": {
244
+ "tensor_parallel_size": 1
245
+ },
246
+ "name": "profile:llamacpp_iq4_xs_short_context:tp1",
247
+ "status": "pass"
248
+ },
249
+ {
250
+ "detail": "serving script exists: scripts/serve_llamacpp_gpu0.sh",
251
+ "evidence": [
252
+ "hf_upload/scripts/serve_llamacpp_gpu0.sh"
253
+ ],
254
+ "name": "profile:llamacpp_iq4_xs_short_context:script",
255
+ "status": "pass"
256
+ },
257
+ {
258
+ "detail": "profile sets REASONING=off",
259
+ "metrics": {
260
+ "REASONING": "off"
261
+ },
262
+ "name": "profile:llamacpp_iq4_xs_short_context:reasoning_off",
263
+ "status": "pass"
264
+ },
265
+ {
266
+ "detail": "artifact is published: ornith-1.0-35b-IQ4_XS.gguf",
267
+ "metrics": {
268
+ "artifact": "ornith-1.0-35b-IQ4_XS.gguf"
269
+ },
270
+ "name": "profile:llamacpp_iq4_xs_short_context:artifact_published",
271
+ "status": "pass"
272
+ },
273
+ {
274
+ "detail": "evidence exists: benchmarks/llamacpp-quant-benchmarks.md",
275
+ "evidence": [
276
+ "hf_upload/benchmarks/llamacpp-quant-benchmarks.md"
277
+ ],
278
+ "name": "profile:llamacpp_iq4_xs_short_context:evidence:benchmark",
279
+ "status": "pass"
280
+ },
281
+ {
282
+ "detail": "evidence exists: benchmarks/kld-quant-vs-bf16-top64.md",
283
+ "evidence": [
284
+ "hf_upload/benchmarks/kld-quant-vs-bf16-top64.md"
285
+ ],
286
+ "name": "profile:llamacpp_iq4_xs_short_context:evidence:kld",
287
+ "status": "pass"
288
+ },
289
+ {
290
+ "detail": "evidence exists: probes/behavior-llamacpp-iq4-xs-parallel16.json",
291
+ "evidence": [
292
+ "hf_upload/probes/behavior-llamacpp-iq4-xs-parallel16.json"
293
+ ],
294
+ "name": "profile:llamacpp_iq4_xs_short_context:evidence:behavior",
295
+ "status": "pass"
296
+ },
297
+ {
298
+ "detail": "profile uses tensor_parallel_size=1",
299
+ "metrics": {
300
+ "tensor_parallel_size": 1
301
+ },
302
+ "name": "profile:llamacpp_iq4_xs_mtp_graft_adaptive:tp1",
303
+ "status": "pass"
304
+ },
305
+ {
306
+ "detail": "serving script exists: scripts/serve_llamacpp_gpu0.sh",
307
+ "evidence": [
308
+ "hf_upload/scripts/serve_llamacpp_gpu0.sh"
309
+ ],
310
+ "name": "profile:llamacpp_iq4_xs_mtp_graft_adaptive:script",
311
+ "status": "pass"
312
+ },
313
+ {
314
+ "detail": "profile sets REASONING=off",
315
+ "metrics": {
316
+ "REASONING": "off"
317
+ },
318
+ "name": "profile:llamacpp_iq4_xs_mtp_graft_adaptive:reasoning_off",
319
+ "status": "pass"
320
+ },
321
+ {
322
+ "detail": "artifact is published: ornith-1.0-35b-IQ4_XS-MTP-graft-headQ6.gguf",
323
+ "metrics": {
324
+ "artifact": "ornith-1.0-35b-IQ4_XS-MTP-graft-headQ6.gguf"
325
+ },
326
+ "name": "profile:llamacpp_iq4_xs_mtp_graft_adaptive:artifact_published",
327
+ "status": "pass"
328
+ },
329
+ {
330
+ "detail": "evidence exists: benchmarks/llamacpp-iq4-xs-mtp-graft-adaptive-profile.md",
331
+ "evidence": [
332
+ "hf_upload/benchmarks/llamacpp-iq4-xs-mtp-graft-adaptive-profile.md"
333
+ ],
334
+ "name": "profile:llamacpp_iq4_xs_mtp_graft_adaptive:evidence:benchmark",
335
+ "status": "pass"
336
+ },
337
+ {
338
+ "detail": "evidence exists: patches/llamacpp-mtp-adaptive-serving-and-recurrent-rollback.patch",
339
+ "evidence": [
340
+ "hf_upload/patches/llamacpp-mtp-adaptive-serving-and-recurrent-rollback.patch"
341
+ ],
342
+ "name": "profile:llamacpp_iq4_xs_mtp_graft_adaptive:evidence:patch",
343
+ "status": "pass"
344
+ },
345
+ {
346
+ "detail": "adaptive MTP profile uses draft-mtp with max drafting slots 1 and n_max 2",
347
+ "metrics": {
348
+ "LLAMA_SPEC_MAX_DRAFTING_SLOTS": "1",
349
+ "SPEC_DRAFT_N_MAX": "2",
350
+ "SPEC_TYPE": "draft-mtp"
351
+ },
352
+ "name": "profile:llamacpp_iq4_xs_mtp_graft_adaptive:adaptive_mtp_throttle",
353
+ "status": "pass"
354
+ },
355
+ {
356
+ "detail": "MTP saturated-c16 caveat is documented",
357
+ "metrics": {
358
+ "caveats": [
359
+ "Always-on MTP is not recommended at saturated c16 because it was slower than target-only decoding.",
360
+ "Adaptive throttling uses MTP for low-concurrency requests and disables it under saturated batches."
361
+ ]
362
+ },
363
+ "name": "profile:llamacpp_iq4_xs_mtp_graft_adaptive:mtp_caveat",
364
+ "status": "pass"
365
+ }
366
+ ],
367
+ "generated_at": "2026-06-28T00:56:49.528851+00:00",
368
+ "inputs": {
369
+ "catalog": "configs/serving_profiles.yaml",
370
+ "hf_root": "hf_upload",
371
+ "manifest": "hf_upload/ARTIFACT_MANIFEST.json"
372
+ },
373
+ "profiles": [
374
+ {
375
+ "artifact": "ornith-1.0-35b-Q4_K_M.gguf",
376
+ "backend": "llama.cpp",
377
+ "command": {
378
+ "env": {
379
+ "BATCH_SIZE": "4096",
380
+ "CTX_SIZE": "8192",
381
+ "PARALLEL": "16",
382
+ "PORT": "8002",
383
+ "QUANT": "Q4_K_M",
384
+ "REASONING": "off",
385
+ "UBATCH_SIZE": "512"
386
+ },
387
+ "script": "scripts/serve_llamacpp_gpu0.sh"
388
+ },
389
+ "evidence": {
390
+ "behavior": "probes/behavior-llamacpp-q4-script-default.json",
391
+ "benchmark": "benchmarks/llamacpp-quant-benchmarks.md"
392
+ },
393
+ "id": "llamacpp_q4_k_m_short_context",
394
+ "measured": {
395
+ "behavior_gate": "pass",
396
+ "c16_output_tps": 655.6,
397
+ "c16_p95_ttft_ms": 650.0,
398
+ "c1_output_tps": 243.3,
399
+ "loaded_vram_gib": 21.31
400
+ },
401
+ "notes": [
402
+ "Short-context benchmark profile exposes about 512 tokens per slot because CTX_SIZE is split across PARALLEL slots."
403
+ ],
404
+ "quant": "Q4_K_M",
405
+ "status": "recommended_speed_benchmark",
406
+ "tensor_parallel_size": 1
407
+ },
408
+ {
409
+ "artifact": "ornith-1.0-35b-Q4_K_M.gguf",
410
+ "backend": "llama.cpp",
411
+ "command": {
412
+ "env": {
413
+ "BATCH_SIZE": "4096",
414
+ "CTX_SIZE": "131072",
415
+ "PARALLEL": "16",
416
+ "PORT": "8002",
417
+ "QUANT": "Q4_K_M",
418
+ "REASONING": "off",
419
+ "UBATCH_SIZE": "512"
420
+ },
421
+ "script": "scripts/serve_llamacpp_gpu0.sh"
422
+ },
423
+ "evidence": {
424
+ "behavior": "probes/behavior-llamacpp-q4-script-default.json",
425
+ "benchmark": "benchmarks/llamacpp-quant-benchmarks.md"
426
+ },
427
+ "id": "llamacpp_q4_k_m_coding_context",
428
+ "measured": {
429
+ "behavior_gate": "pass",
430
+ "c16_output_tps_short_context": 655.6,
431
+ "loaded_vram_gib_short_context": 21.31
432
+ },
433
+ "notes": [
434
+ "Practical coding-serving profile with 16 slots and about 8k context per slot.",
435
+ "Throughput numbers come from the matched short-context sweep."
436
+ ],
437
+ "quant": "Q4_K_M",
438
+ "status": "recommended_default",
439
+ "tensor_parallel_size": 1
440
+ },
441
+ {
442
+ "artifact": "ornith-1.0-35b-Q3_K_M.gguf",
443
+ "backend": "llama.cpp",
444
+ "command": {
445
+ "env": {
446
+ "BATCH_SIZE": "4096",
447
+ "CTX_SIZE": "8192",
448
+ "PARALLEL": "16",
449
+ "PORT": "8002",
450
+ "QUANT": "Q3_K_M",
451
+ "REASONING": "off",
452
+ "UBATCH_SIZE": "512"
453
+ },
454
+ "script": "scripts/serve_llamacpp_gpu0.sh"
455
+ },
456
+ "evidence": {
457
+ "behavior": "probes/behavior-llamacpp-q3-k-m-parallel16.json",
458
+ "benchmark": "benchmarks/llamacpp-quant-benchmarks.md",
459
+ "kld": "benchmarks/kld-quant-vs-bf16-top64.md"
460
+ },
461
+ "id": "llamacpp_q3_k_m_short_context",
462
+ "measured": {
463
+ "behavior_gate": "pass",
464
+ "c16_output_tps": 493.0,
465
+ "c1_output_tps": 240.5,
466
+ "gguf_gib": 15.61,
467
+ "loaded_vram_gib": 17.27,
468
+ "mean_kld_nats_vs_bf16_top64": 0.362
469
+ },
470
+ "quant": "Q3_K_M",
471
+ "status": "lowest_memory_validated",
472
+ "tensor_parallel_size": 1
473
+ },
474
+ {
475
+ "artifact": "ornith-1.0-35b-IQ4_XS.gguf",
476
+ "backend": "llama.cpp",
477
+ "command": {
478
+ "env": {
479
+ "BATCH_SIZE": "4096",
480
+ "CTX_SIZE": "8192",
481
+ "PARALLEL": "16",
482
+ "PORT": "8002",
483
+ "QUANT": "IQ4_XS",
484
+ "REASONING": "off",
485
+ "UBATCH_SIZE": "512"
486
+ },
487
+ "script": "scripts/serve_llamacpp_gpu0.sh"
488
+ },
489
+ "evidence": {
490
+ "behavior": "probes/behavior-llamacpp-iq4-xs-parallel16.json",
491
+ "benchmark": "benchmarks/llamacpp-quant-benchmarks.md",
492
+ "kld": "benchmarks/kld-quant-vs-bf16-top64.md"
493
+ },
494
+ "id": "llamacpp_iq4_xs_short_context",
495
+ "measured": {
496
+ "behavior_gate": "pass",
497
+ "c16_output_tps": 476.0,
498
+ "c1_output_tps": 234.1,
499
+ "gguf_gib": 17.64,
500
+ "loaded_vram_gib": 19.34,
501
+ "mean_kld_nats_vs_bf16_top64": 0.1426
502
+ },
503
+ "quant": "IQ4_XS",
504
+ "status": "middle_footprint_validated",
505
+ "tensor_parallel_size": 1
506
+ },
507
+ {
508
+ "artifact": "ornith-1.0-35b-IQ4_XS-MTP-graft-headQ6.gguf",
509
+ "backend": "llama.cpp",
510
+ "caveats": [
511
+ "Always-on MTP is not recommended at saturated c16 because it was slower than target-only decoding.",
512
+ "Adaptive throttling uses MTP for low-concurrency requests and disables it under saturated batches."
513
+ ],
514
+ "command": {
515
+ "env": {
516
+ "ALIAS": "Ornith-1.0-35B-GGUF-IQ4_XS-MTP",
517
+ "BATCH_SIZE": "4096",
518
+ "CTX_SIZE": "8192",
519
+ "LLAMA_MTP_DRAFT_TEMP": "1",
520
+ "LLAMA_MTP_DRAFT_TOP_K": "1",
521
+ "LLAMA_MTP_DRAFT_TOP_P": "1",
522
+ "LLAMA_MTP_FAST_BACKEND_SAMPLE": "1",
523
+ "LLAMA_SPEC_MAX_DRAFTING_SLOTS": "1",
524
+ "MODEL_PATH": "ornith-1.0-35b-IQ4_XS-MTP-graft-headQ6.gguf",
525
+ "PARALLEL": "16",
526
+ "PORT": "8002",
527
+ "REASONING": "off",
528
+ "SPEC_DRAFT_BACKEND_SAMPLING": "1",
529
+ "SPEC_DRAFT_N_MAX": "2",
530
+ "SPEC_DRAFT_N_MIN": "0",
531
+ "SPEC_TYPE": "draft-mtp",
532
+ "UBATCH_SIZE": "512"
533
+ },
534
+ "script": "scripts/serve_llamacpp_gpu0.sh"
535
+ },
536
+ "evidence": {
537
+ "benchmark": "benchmarks/llamacpp-iq4-xs-mtp-graft-adaptive-profile.md",
538
+ "patch": "patches/llamacpp-mtp-adaptive-serving-and-recurrent-rollback.patch"
539
+ },
540
+ "id": "llamacpp_iq4_xs_mtp_graft_adaptive",
541
+ "measured": {
542
+ "c16_adaptive_tps": 564.48,
543
+ "c16_ar_tps": 568.57,
544
+ "c16_threshold1_tps": 592.45,
545
+ "c1_acceptance_by_position": [
546
+ 0.953,
547
+ 0.865
548
+ ],
549
+ "c1_ar_tps": 221.8,
550
+ "c1_mtp_adaptive_tps": 319.53
551
+ },
552
+ "quant": "IQ4_XS_with_Q6_MTP_head",
553
+ "status": "experimental_adaptive_mtp",
554
+ "tensor_parallel_size": 1
555
+ }
556
+ ],
557
+ "summary": {
558
+ "checks": 43,
559
+ "failed_checks": 0,
560
+ "status": "pass",
561
+ "status_counts": {
562
+ "pass": 43
563
+ },
564
+ "warnings": 0
565
+ }
566
+ }
probes/serving-profile-validation.md ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Serving Profile Validation
2
+
3
+ Generated: 2026-06-28T00:56:49.528851+00:00
4
+
5
+ ## Summary
6
+
7
+ - Status: `pass`
8
+ - Checks: 43
9
+ - Failures: 0
10
+ - Warnings: 0
11
+
12
+ ## Profiles
13
+
14
+ | Profile | Status | Backend | Artifact |
15
+ |---|---|---|---|
16
+ | `llamacpp_q4_k_m_short_context` | `recommended_speed_benchmark` | llama.cpp | `ornith-1.0-35b-Q4_K_M.gguf` |
17
+ | `llamacpp_q4_k_m_coding_context` | `recommended_default` | llama.cpp | `ornith-1.0-35b-Q4_K_M.gguf` |
18
+ | `llamacpp_q3_k_m_short_context` | `lowest_memory_validated` | llama.cpp | `ornith-1.0-35b-Q3_K_M.gguf` |
19
+ | `llamacpp_iq4_xs_short_context` | `middle_footprint_validated` | llama.cpp | `ornith-1.0-35b-IQ4_XS.gguf` |
20
+ | `llamacpp_iq4_xs_mtp_graft_adaptive` | `experimental_adaptive_mtp` | llama.cpp | `ornith-1.0-35b-IQ4_XS-MTP-graft-headQ6.gguf` |
21
+
22
+ ## Checks
23
+
24
+ | Check | Status | Detail |
25
+ |---|---:|---|
26
+ | `catalog:exists` | `pass` | catalog exists: configs/serving_profiles.yaml |
27
+ | `policy:tp1_only` | `pass` | serving policy is single-GPU tp=1 |
28
+ | `policy:multi_gpu_forbidden` | `pass` | multi-GPU serving and tensor_parallel_size>1 are explicitly forbidden |
29
+ | `policy:reasoning_off` | `pass` | default serving policy disables reasoning final-answer leakage |
30
+ | `profiles:count` | `pass` | 5 serving profiles are listed |
31
+ | `profiles:default_profile` | `pass` | default_profile points to a listed profile |
32
+ | `profiles:lowest_memory_profile` | `pass` | lowest_memory_profile points to a listed profile |
33
+ | `profiles:middle_footprint_profile` | `pass` | middle_footprint_profile points to a listed profile |
34
+ | `profiles:adaptive_mtp_profile` | `pass` | adaptive_mtp_profile points to a listed profile |
35
+ | `profile:llamacpp_q4_k_m_short_context:tp1` | `pass` | profile uses tensor_parallel_size=1 |
36
+ | `profile:llamacpp_q4_k_m_short_context:script` | `pass` | serving script exists: scripts/serve_llamacpp_gpu0.sh |
37
+ | `profile:llamacpp_q4_k_m_short_context:reasoning_off` | `pass` | profile sets REASONING=off |
38
+ | `profile:llamacpp_q4_k_m_short_context:artifact_published` | `pass` | artifact is published: ornith-1.0-35b-Q4_K_M.gguf |
39
+ | `profile:llamacpp_q4_k_m_short_context:evidence:benchmark` | `pass` | evidence exists: benchmarks/llamacpp-quant-benchmarks.md |
40
+ | `profile:llamacpp_q4_k_m_short_context:evidence:behavior` | `pass` | evidence exists: probes/behavior-llamacpp-q4-script-default.json |
41
+ | `profile:llamacpp_q4_k_m_coding_context:tp1` | `pass` | profile uses tensor_parallel_size=1 |
42
+ | `profile:llamacpp_q4_k_m_coding_context:script` | `pass` | serving script exists: scripts/serve_llamacpp_gpu0.sh |
43
+ | `profile:llamacpp_q4_k_m_coding_context:reasoning_off` | `pass` | profile sets REASONING=off |
44
+ | `profile:llamacpp_q4_k_m_coding_context:artifact_published` | `pass` | artifact is published: ornith-1.0-35b-Q4_K_M.gguf |
45
+ | `profile:llamacpp_q4_k_m_coding_context:evidence:benchmark` | `pass` | evidence exists: benchmarks/llamacpp-quant-benchmarks.md |
46
+ | `profile:llamacpp_q4_k_m_coding_context:evidence:behavior` | `pass` | evidence exists: probes/behavior-llamacpp-q4-script-default.json |
47
+ | `profile:llamacpp_q3_k_m_short_context:tp1` | `pass` | profile uses tensor_parallel_size=1 |
48
+ | `profile:llamacpp_q3_k_m_short_context:script` | `pass` | serving script exists: scripts/serve_llamacpp_gpu0.sh |
49
+ | `profile:llamacpp_q3_k_m_short_context:reasoning_off` | `pass` | profile sets REASONING=off |
50
+ | `profile:llamacpp_q3_k_m_short_context:artifact_published` | `pass` | artifact is published: ornith-1.0-35b-Q3_K_M.gguf |
51
+ | `profile:llamacpp_q3_k_m_short_context:evidence:benchmark` | `pass` | evidence exists: benchmarks/llamacpp-quant-benchmarks.md |
52
+ | `profile:llamacpp_q3_k_m_short_context:evidence:kld` | `pass` | evidence exists: benchmarks/kld-quant-vs-bf16-top64.md |
53
+ | `profile:llamacpp_q3_k_m_short_context:evidence:behavior` | `pass` | evidence exists: probes/behavior-llamacpp-q3-k-m-parallel16.json |
54
+ | `profile:llamacpp_iq4_xs_short_context:tp1` | `pass` | profile uses tensor_parallel_size=1 |
55
+ | `profile:llamacpp_iq4_xs_short_context:script` | `pass` | serving script exists: scripts/serve_llamacpp_gpu0.sh |
56
+ | `profile:llamacpp_iq4_xs_short_context:reasoning_off` | `pass` | profile sets REASONING=off |
57
+ | `profile:llamacpp_iq4_xs_short_context:artifact_published` | `pass` | artifact is published: ornith-1.0-35b-IQ4_XS.gguf |
58
+ | `profile:llamacpp_iq4_xs_short_context:evidence:benchmark` | `pass` | evidence exists: benchmarks/llamacpp-quant-benchmarks.md |
59
+ | `profile:llamacpp_iq4_xs_short_context:evidence:kld` | `pass` | evidence exists: benchmarks/kld-quant-vs-bf16-top64.md |
60
+ | `profile:llamacpp_iq4_xs_short_context:evidence:behavior` | `pass` | evidence exists: probes/behavior-llamacpp-iq4-xs-parallel16.json |
61
+ | `profile:llamacpp_iq4_xs_mtp_graft_adaptive:tp1` | `pass` | profile uses tensor_parallel_size=1 |
62
+ | `profile:llamacpp_iq4_xs_mtp_graft_adaptive:script` | `pass` | serving script exists: scripts/serve_llamacpp_gpu0.sh |
63
+ | `profile:llamacpp_iq4_xs_mtp_graft_adaptive:reasoning_off` | `pass` | profile sets REASONING=off |
64
+ | `profile:llamacpp_iq4_xs_mtp_graft_adaptive:artifact_published` | `pass` | artifact is published: ornith-1.0-35b-IQ4_XS-MTP-graft-headQ6.gguf |
65
+ | `profile:llamacpp_iq4_xs_mtp_graft_adaptive:evidence:benchmark` | `pass` | evidence exists: benchmarks/llamacpp-iq4-xs-mtp-graft-adaptive-profile.md |
66
+ | `profile:llamacpp_iq4_xs_mtp_graft_adaptive:evidence:patch` | `pass` | evidence exists: patches/llamacpp-mtp-adaptive-serving-and-recurrent-rollback.patch |
67
+ | `profile:llamacpp_iq4_xs_mtp_graft_adaptive:adaptive_mtp_throttle` | `pass` | adaptive MTP profile uses draft-mtp with max drafting slots 1 and n_max 2 |
68
+ | `profile:llamacpp_iq4_xs_mtp_graft_adaptive:mtp_caveat` | `pass` | MTP saturated-c16 caveat is documented |
scripts/build_release_readiness_report.py CHANGED
@@ -191,6 +191,33 @@ def check_behavior_matrix(path: Path, min_passing_artifacts: int) -> list[Check]
191
  return checks
192
 
193
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
194
  def check_sft_state(manifest_path: Path, allow_unreleased_sft: bool) -> list[Check]:
195
  if not manifest_path.exists():
196
  return [
@@ -253,6 +280,7 @@ def build_report(args: argparse.Namespace) -> dict[str, Any]:
253
  checks.extend(check_hf_verifier(args.hf_verification))
254
  checks.extend(check_manifest(args.manifest, args.min_gguf))
255
  checks.extend(check_behavior_matrix(args.behavior_matrix, args.min_passing_artifacts))
 
256
  checks.extend(check_sft_state(args.manifest, args.allow_unreleased_sft))
257
  checks.extend(check_required_docs(args.required_doc or []))
258
 
@@ -297,6 +325,7 @@ def build_report(args: argparse.Namespace) -> dict[str, Any]:
297
  "manifest": str(args.manifest),
298
  "hf_verification": str(args.hf_verification),
299
  "behavior_matrix": str(args.behavior_matrix),
 
300
  "quant_benchmarks": str(args.quant_benchmarks),
301
  "kld_report": str(args.kld_report),
302
  "mtp_profile": str(args.mtp_profile),
@@ -372,6 +401,7 @@ def parse_args() -> argparse.Namespace:
372
  parser.add_argument("--manifest", type=Path, default=Path("hf_upload/ARTIFACT_MANIFEST.json"))
373
  parser.add_argument("--hf-verification", type=Path, default=Path("runs/hf-release-verification-behavior-matrix.json"))
374
  parser.add_argument("--behavior-matrix", type=Path, default=Path("runs/behavior-regression-matrix.json"))
 
375
  parser.add_argument("--quant-benchmarks", type=Path, default=Path("hf_upload/benchmarks/llamacpp-quant-benchmarks.md"))
376
  parser.add_argument("--kld-report", type=Path, default=Path("hf_upload/benchmarks/kld-quant-vs-bf16-top64.md"))
377
  parser.add_argument("--mtp-profile", type=Path, default=Path("hf_upload/benchmarks/llamacpp-iq4-xs-mtp-graft-adaptive-profile.md"))
 
191
  return checks
192
 
193
 
194
+ def check_serving_profile_validation(path: Path) -> list[Check]:
195
+ checks = [exists_check("serving_profiles:validation_exists", path, "serving profile validation report")]
196
+ if not path.exists():
197
+ return checks
198
+ report = load_json(path)
199
+ summary = report.get("summary", {})
200
+ checks.append(
201
+ Check(
202
+ name="serving_profiles:validation_status",
203
+ status=PASS if summary.get("status") == "pass" and summary.get("failed_checks") == 0 else FAIL,
204
+ detail=f"serving profile validation status is {summary.get('status')!r}",
205
+ evidence=[str(path)],
206
+ metrics=summary,
207
+ )
208
+ )
209
+ checks.append(
210
+ Check(
211
+ name="serving_profiles:profile_count",
212
+ status=PASS if len(report.get("profiles") or []) >= 5 else FAIL,
213
+ detail=f"{len(report.get('profiles') or [])} serving profiles are validated",
214
+ evidence=[str(path)],
215
+ metrics={"profiles": [profile.get("id") for profile in report.get("profiles") or []]},
216
+ )
217
+ )
218
+ return checks
219
+
220
+
221
  def check_sft_state(manifest_path: Path, allow_unreleased_sft: bool) -> list[Check]:
222
  if not manifest_path.exists():
223
  return [
 
280
  checks.extend(check_hf_verifier(args.hf_verification))
281
  checks.extend(check_manifest(args.manifest, args.min_gguf))
282
  checks.extend(check_behavior_matrix(args.behavior_matrix, args.min_passing_artifacts))
283
+ checks.extend(check_serving_profile_validation(args.serving_profile_validation))
284
  checks.extend(check_sft_state(args.manifest, args.allow_unreleased_sft))
285
  checks.extend(check_required_docs(args.required_doc or []))
286
 
 
325
  "manifest": str(args.manifest),
326
  "hf_verification": str(args.hf_verification),
327
  "behavior_matrix": str(args.behavior_matrix),
328
+ "serving_profile_validation": str(args.serving_profile_validation),
329
  "quant_benchmarks": str(args.quant_benchmarks),
330
  "kld_report": str(args.kld_report),
331
  "mtp_profile": str(args.mtp_profile),
 
401
  parser.add_argument("--manifest", type=Path, default=Path("hf_upload/ARTIFACT_MANIFEST.json"))
402
  parser.add_argument("--hf-verification", type=Path, default=Path("runs/hf-release-verification-behavior-matrix.json"))
403
  parser.add_argument("--behavior-matrix", type=Path, default=Path("runs/behavior-regression-matrix.json"))
404
+ parser.add_argument("--serving-profile-validation", type=Path, default=Path("runs/serving-profile-validation.json"))
405
  parser.add_argument("--quant-benchmarks", type=Path, default=Path("hf_upload/benchmarks/llamacpp-quant-benchmarks.md"))
406
  parser.add_argument("--kld-report", type=Path, default=Path("hf_upload/benchmarks/kld-quant-vs-bf16-top64.md"))
407
  parser.add_argument("--mtp-profile", type=Path, default=Path("hf_upload/benchmarks/llamacpp-iq4-xs-mtp-graft-adaptive-profile.md"))
scripts/validate_serving_profiles.py ADDED
@@ -0,0 +1,278 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """Validate the machine-readable serving profile catalog."""
3
+
4
+ from __future__ import annotations
5
+
6
+ import argparse
7
+ import json
8
+ from collections import Counter
9
+ from datetime import UTC, datetime
10
+ from pathlib import Path
11
+ from typing import Any
12
+
13
+ import yaml
14
+
15
+
16
+ PASS = "pass"
17
+ WARN = "warn"
18
+ FAIL = "fail"
19
+
20
+
21
+ def load_yaml(path: Path) -> dict[str, Any]:
22
+ with path.open("r", encoding="utf-8") as handle:
23
+ return yaml.safe_load(handle) or {}
24
+
25
+
26
+ def load_json(path: Path) -> dict[str, Any]:
27
+ with path.open("r", encoding="utf-8") as handle:
28
+ return json.load(handle)
29
+
30
+
31
+ def add_check(
32
+ checks: list[dict[str, Any]],
33
+ name: str,
34
+ status: str,
35
+ detail: str,
36
+ **extra: Any,
37
+ ) -> None:
38
+ item = {"name": name, "status": status, "detail": detail}
39
+ item.update(extra)
40
+ checks.append(item)
41
+
42
+
43
+ def rel_exists(root: Path, rel: str) -> bool:
44
+ return (root / rel).exists()
45
+
46
+
47
+ def validate_policy(checks: list[dict[str, Any]], catalog: dict[str, Any]) -> None:
48
+ policy = catalog.get("policy") or {}
49
+ add_check(
50
+ checks,
51
+ "policy:tp1_only",
52
+ PASS
53
+ if policy.get("serving_parallelism") == "tp1_only"
54
+ and int(policy.get("tensor_parallel_size") or 0) == 1
55
+ else FAIL,
56
+ "serving policy is single-GPU tp=1",
57
+ metrics=policy,
58
+ )
59
+ forbidden = set(policy.get("forbidden") or [])
60
+ add_check(
61
+ checks,
62
+ "policy:multi_gpu_forbidden",
63
+ PASS if {"tensor_parallel_size_gt_1", "multi_gpu_serving"} <= forbidden else FAIL,
64
+ "multi-GPU serving and tensor_parallel_size>1 are explicitly forbidden",
65
+ metrics={"forbidden": sorted(forbidden)},
66
+ )
67
+ add_check(
68
+ checks,
69
+ "policy:reasoning_off",
70
+ PASS if str(policy.get("reasoning")) == "off" else FAIL,
71
+ "default serving policy disables reasoning final-answer leakage",
72
+ metrics={"reasoning": policy.get("reasoning")},
73
+ )
74
+
75
+
76
+ def validate_profiles(
77
+ checks: list[dict[str, Any]],
78
+ *,
79
+ catalog: dict[str, Any],
80
+ manifest: dict[str, Any],
81
+ hf_root: Path,
82
+ ) -> None:
83
+ profiles = catalog.get("profiles") or []
84
+ profile_ids = [profile.get("id") for profile in profiles]
85
+ manifest_artifacts = {
86
+ item.get("path")
87
+ for item in manifest.get("published_gguf", [])
88
+ if item.get("published") is True
89
+ }
90
+
91
+ add_check(
92
+ checks,
93
+ "profiles:count",
94
+ PASS if len(profiles) >= 5 else FAIL,
95
+ f"{len(profiles)} serving profiles are listed",
96
+ metrics={"profiles": profile_ids},
97
+ )
98
+ for field in ("default_profile", "lowest_memory_profile", "middle_footprint_profile", "adaptive_mtp_profile"):
99
+ value = catalog.get(field)
100
+ add_check(
101
+ checks,
102
+ f"profiles:{field}",
103
+ PASS if value in profile_ids else FAIL,
104
+ f"{field} points to a listed profile" if value in profile_ids else f"{field}={value!r} is not listed",
105
+ metrics={"value": value},
106
+ )
107
+
108
+ for profile in profiles:
109
+ profile_id = str(profile.get("id") or "unknown")
110
+ tp = int(profile.get("tensor_parallel_size") or 0)
111
+ add_check(
112
+ checks,
113
+ f"profile:{profile_id}:tp1",
114
+ PASS if tp == 1 else FAIL,
115
+ "profile uses tensor_parallel_size=1",
116
+ metrics={"tensor_parallel_size": tp},
117
+ )
118
+
119
+ command = profile.get("command") or {}
120
+ script = command.get("script")
121
+ add_check(
122
+ checks,
123
+ f"profile:{profile_id}:script",
124
+ PASS if script and rel_exists(hf_root, script) else FAIL,
125
+ f"serving script exists: {script}",
126
+ evidence=[str(hf_root / str(script))] if script else [],
127
+ )
128
+
129
+ env = command.get("env") or {}
130
+ reasoning = env.get("REASONING")
131
+ add_check(
132
+ checks,
133
+ f"profile:{profile_id}:reasoning_off",
134
+ PASS if reasoning == "off" else FAIL,
135
+ "profile sets REASONING=off",
136
+ metrics={"REASONING": reasoning},
137
+ )
138
+
139
+ artifact = profile.get("artifact")
140
+ add_check(
141
+ checks,
142
+ f"profile:{profile_id}:artifact_published",
143
+ PASS if artifact in manifest_artifacts else FAIL,
144
+ f"artifact is published: {artifact}",
145
+ metrics={"artifact": artifact},
146
+ )
147
+
148
+ evidence = profile.get("evidence") or {}
149
+ for key, rel in evidence.items():
150
+ if not isinstance(rel, str):
151
+ continue
152
+ add_check(
153
+ checks,
154
+ f"profile:{profile_id}:evidence:{key}",
155
+ PASS if rel_exists(hf_root, rel) else FAIL,
156
+ f"evidence exists: {rel}",
157
+ evidence=[str(hf_root / rel)],
158
+ )
159
+
160
+ if "mtp" in profile_id:
161
+ add_check(
162
+ checks,
163
+ f"profile:{profile_id}:adaptive_mtp_throttle",
164
+ PASS
165
+ if env.get("LLAMA_SPEC_MAX_DRAFTING_SLOTS") == "1"
166
+ and env.get("SPEC_TYPE") == "draft-mtp"
167
+ and env.get("SPEC_DRAFT_N_MAX") == "2"
168
+ else FAIL,
169
+ "adaptive MTP profile uses draft-mtp with max drafting slots 1 and n_max 2",
170
+ metrics={
171
+ "LLAMA_SPEC_MAX_DRAFTING_SLOTS": env.get("LLAMA_SPEC_MAX_DRAFTING_SLOTS"),
172
+ "SPEC_TYPE": env.get("SPEC_TYPE"),
173
+ "SPEC_DRAFT_N_MAX": env.get("SPEC_DRAFT_N_MAX"),
174
+ },
175
+ )
176
+ caveats = profile.get("caveats") or []
177
+ add_check(
178
+ checks,
179
+ f"profile:{profile_id}:mtp_caveat",
180
+ PASS if any("saturated c16" in str(item) for item in caveats) else WARN,
181
+ "MTP saturated-c16 caveat is documented",
182
+ metrics={"caveats": caveats},
183
+ )
184
+
185
+
186
+ def render_markdown(report: dict[str, Any]) -> str:
187
+ summary = report["summary"]
188
+ lines = [
189
+ "# Serving Profile Validation",
190
+ "",
191
+ f"Generated: {report['generated_at']}",
192
+ "",
193
+ "## Summary",
194
+ "",
195
+ f"- Status: `{summary['status']}`",
196
+ f"- Checks: {summary['checks']}",
197
+ f"- Failures: {summary['failed_checks']}",
198
+ f"- Warnings: {summary['warnings']}",
199
+ "",
200
+ "## Profiles",
201
+ "",
202
+ "| Profile | Status | Backend | Artifact |",
203
+ "|---|---|---|---|",
204
+ ]
205
+ for profile in report["profiles"]:
206
+ lines.append(
207
+ f"| `{profile.get('id')}` | `{profile.get('status')}` | {profile.get('backend')} | `{profile.get('artifact')}` |"
208
+ )
209
+ lines.extend(["", "## Checks", "", "| Check | Status | Detail |", "|---|---:|---|"])
210
+ for check in report["checks"]:
211
+ lines.append(f"| `{check['name']}` | `{check['status']}` | {check['detail']} |")
212
+ lines.append("")
213
+ return "\n".join(lines)
214
+
215
+
216
+ def build_report(args: argparse.Namespace) -> dict[str, Any]:
217
+ catalog = load_yaml(args.catalog)
218
+ manifest = load_json(args.manifest)
219
+ checks: list[dict[str, Any]] = []
220
+
221
+ add_check(
222
+ checks,
223
+ "catalog:exists",
224
+ PASS if args.catalog.exists() else FAIL,
225
+ f"catalog exists: {args.catalog}",
226
+ )
227
+ validate_policy(checks, catalog)
228
+ validate_profiles(checks, catalog=catalog, manifest=manifest, hf_root=args.hf_root)
229
+
230
+ failures = [check for check in checks if check["status"] == FAIL]
231
+ warnings = [check for check in checks if check["status"] == WARN]
232
+ report = {
233
+ "generated_at": datetime.now(UTC).isoformat(),
234
+ "inputs": {
235
+ "catalog": str(args.catalog),
236
+ "manifest": str(args.manifest),
237
+ "hf_root": str(args.hf_root),
238
+ },
239
+ "summary": {
240
+ "status": PASS if not failures else FAIL,
241
+ "checks": len(checks),
242
+ "failed_checks": len(failures),
243
+ "warnings": len(warnings),
244
+ "status_counts": dict(Counter(check["status"] for check in checks)),
245
+ },
246
+ "profiles": catalog.get("profiles") or [],
247
+ "checks": checks,
248
+ }
249
+ return report
250
+
251
+
252
+ def parse_args() -> argparse.Namespace:
253
+ parser = argparse.ArgumentParser(description=__doc__)
254
+ parser.add_argument("--catalog", type=Path, default=Path("configs/serving_profiles.yaml"))
255
+ parser.add_argument("--manifest", type=Path, default=Path("hf_upload/ARTIFACT_MANIFEST.json"))
256
+ parser.add_argument("--hf-root", type=Path, default=Path("hf_upload"))
257
+ parser.add_argument("--output", type=Path, required=True)
258
+ parser.add_argument("--markdown-output", type=Path)
259
+ parser.add_argument("--fail-on-error", action="store_true")
260
+ return parser.parse_args()
261
+
262
+
263
+ def main() -> int:
264
+ args = parse_args()
265
+ report = build_report(args)
266
+ args.output.parent.mkdir(parents=True, exist_ok=True)
267
+ args.output.write_text(json.dumps(report, indent=2, sort_keys=True) + "\n")
268
+ if args.markdown_output:
269
+ args.markdown_output.parent.mkdir(parents=True, exist_ok=True)
270
+ args.markdown_output.write_text(render_markdown(report), encoding="utf-8")
271
+ print(json.dumps(report["summary"], indent=2, sort_keys=True))
272
+ if args.fail_on_error and report["summary"]["status"] != PASS:
273
+ return 1
274
+ return 0
275
+
276
+
277
+ if __name__ == "__main__":
278
+ raise SystemExit(main())
scripts/verify_hf_release.py CHANGED
@@ -63,6 +63,7 @@ def collect_required_support_files(manifest: dict[str, Any]) -> set[str]:
63
  release_verification = manifest.get("release_verification", {})
64
  behavior_matrix = manifest.get("behavior_regression_matrix", {})
65
  release_readiness = manifest.get("release_readiness", {})
 
66
 
67
  for key in ("scripts", "reports", "published_synthetic_data"):
68
  required.update(str(path) for path in repair.get(key, []) if path)
@@ -77,8 +78,8 @@ def collect_required_support_files(manifest: dict[str, Any]) -> set[str]:
77
  if value:
78
  required.add(str(value))
79
 
80
- for section in (behavior_matrix, release_readiness):
81
- for key in ("script", "report", "markdown_report"):
82
  value = section.get(key)
83
  if value:
84
  required.add(str(value))
@@ -350,6 +351,26 @@ def check_release_readiness_summary(checks: list[dict[str, Any]], manifest: dict
350
  )
351
 
352
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
353
  def check_local_and_remote_hashes(
354
  checks: list[dict[str, Any]],
355
  *,
@@ -523,6 +544,7 @@ def build_report(args: argparse.Namespace) -> dict[str, Any]:
523
  check_sft_gate_summaries(checks, manifest)
524
  check_behavior_matrix_summary(checks, manifest)
525
  check_release_readiness_summary(checks, manifest)
 
526
  hash_stats = check_local_and_remote_hashes(
527
  checks,
528
  repo_id=repo_id,
 
63
  release_verification = manifest.get("release_verification", {})
64
  behavior_matrix = manifest.get("behavior_regression_matrix", {})
65
  release_readiness = manifest.get("release_readiness", {})
66
+ serving_profiles = manifest.get("serving_profiles", {})
67
 
68
  for key in ("scripts", "reports", "published_synthetic_data"):
69
  required.update(str(path) for path in repair.get(key, []) if path)
 
78
  if value:
79
  required.add(str(value))
80
 
81
+ for section in (behavior_matrix, release_readiness, serving_profiles):
82
+ for key in ("script", "config", "report", "markdown_report"):
83
  value = section.get(key)
84
  if value:
85
  required.add(str(value))
 
351
  )
352
 
353
 
354
+ def check_serving_profiles_summary(checks: list[dict[str, Any]], manifest: dict[str, Any]) -> None:
355
+ serving = manifest.get("serving_profiles")
356
+ if not serving:
357
+ add_check(
358
+ checks,
359
+ "serving_profiles:manifest_section",
360
+ "warn",
361
+ "serving profiles manifest section is not present",
362
+ )
363
+ return
364
+ summary = serving.get("summary", {})
365
+ add_check(
366
+ checks,
367
+ "serving_profiles:validation_status",
368
+ "pass" if summary.get("status") == "pass" and summary.get("failed_checks") == 0 else "fail",
369
+ "serving profile validation passes with zero failed checks",
370
+ metrics=summary,
371
+ )
372
+
373
+
374
  def check_local_and_remote_hashes(
375
  checks: list[dict[str, Any]],
376
  *,
 
544
  check_sft_gate_summaries(checks, manifest)
545
  check_behavior_matrix_summary(checks, manifest)
546
  check_release_readiness_summary(checks, manifest)
547
+ check_serving_profiles_summary(checks, manifest)
548
  hash_stats = check_local_and_remote_hashes(
549
  checks,
550
  repo_id=repo_id,