orbitquant 0.1.2__tar.gz → 0.1.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. {orbitquant-0.1.2 → orbitquant-0.1.4}/.github/workflows/publish-pypi.yml +1 -1
  2. {orbitquant-0.1.2 → orbitquant-0.1.4}/PKG-INFO +42 -2
  3. {orbitquant-0.1.2 → orbitquant-0.1.4}/README.md +40 -0
  4. {orbitquant-0.1.2 → orbitquant-0.1.4}/docs/kernel-audit.md +10 -3
  5. {orbitquant-0.1.2 → orbitquant-0.1.4}/docs/kernel-hub-approval-request.md +10 -0
  6. orbitquant-0.1.4/docs/release-0.1.3.md +25 -0
  7. orbitquant-0.1.4/docs/release-0.1.4.md +36 -0
  8. {orbitquant-0.1.2 → orbitquant-0.1.4}/docs/release-gates.md +110 -8
  9. {orbitquant-0.1.2 → orbitquant-0.1.4}/pyproject.toml +2 -2
  10. {orbitquant-0.1.2 → orbitquant-0.1.4}/scripts/run_cuda_kernel_checks.sh +2 -2
  11. {orbitquant-0.1.2 → orbitquant-0.1.4}/scripts/run_mps_kernel_checks.sh +1 -1
  12. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/__init__.py +1 -1
  13. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/artifacts/benchmark.py +5 -0
  14. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/artifacts/model_card.py +110 -9
  15. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/cli/main.py +614 -1
  16. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/eval/external_export.py +2 -1
  17. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/eval/external_metrics.py +20 -9
  18. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/eval/external_plan.py +1 -1
  19. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/kernels/native_packed_matmul.py +4 -6
  20. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/layers.py +11 -1
  21. {orbitquant-0.1.2 → orbitquant-0.1.4}/tests/test_artifact_writer.py +45 -0
  22. {orbitquant-0.1.2 → orbitquant-0.1.4}/tests/test_cli.py +545 -0
  23. {orbitquant-0.1.2 → orbitquant-0.1.4}/tests/test_external_eval_plan.py +10 -1
  24. {orbitquant-0.1.2 → orbitquant-0.1.4}/tests/test_external_export.py +26 -5
  25. {orbitquant-0.1.2 → orbitquant-0.1.4}/tests/test_model_card.py +69 -0
  26. {orbitquant-0.1.2 → orbitquant-0.1.4}/tests/test_native_packed_matmul.py +81 -3
  27. {orbitquant-0.1.2 → orbitquant-0.1.4}/tests/test_optional_dependencies.py +11 -0
  28. {orbitquant-0.1.2 → orbitquant-0.1.4}/tests/test_orbit_linear.py +30 -0
  29. {orbitquant-0.1.2 → orbitquant-0.1.4}/tests/test_readme.py +5 -0
  30. {orbitquant-0.1.2 → orbitquant-0.1.4}/tests/test_release_gates.py +145 -2
  31. {orbitquant-0.1.2 → orbitquant-0.1.4}/uv.lock +3 -3
  32. {orbitquant-0.1.2 → orbitquant-0.1.4}/.github/workflows/ci.yml +0 -0
  33. {orbitquant-0.1.2 → orbitquant-0.1.4}/.gitignore +0 -0
  34. {orbitquant-0.1.2 → orbitquant-0.1.4}/LICENSE +0 -0
  35. {orbitquant-0.1.2 → orbitquant-0.1.4}/docs/paper-methodology-audit.md +0 -0
  36. {orbitquant-0.1.2 → orbitquant-0.1.4}/docs/publication-checklist.md +0 -0
  37. {orbitquant-0.1.2 → orbitquant-0.1.4}/docs/release-0.1.0.md +0 -0
  38. {orbitquant-0.1.2 → orbitquant-0.1.4}/docs/release-0.1.1.md +0 -0
  39. {orbitquant-0.1.2 → orbitquant-0.1.4}/docs/release-0.1.2.md +0 -0
  40. {orbitquant-0.1.2 → orbitquant-0.1.4}/native-kernels/orbitquant-packed-matmul/CARD.md +0 -0
  41. {orbitquant-0.1.2 → orbitquant-0.1.4}/native-kernels/orbitquant-packed-matmul/benchmarks/benchmark.py +0 -0
  42. {orbitquant-0.1.2 → orbitquant-0.1.4}/native-kernels/orbitquant-packed-matmul/build.toml +0 -0
  43. {orbitquant-0.1.2 → orbitquant-0.1.4}/native-kernels/orbitquant-packed-matmul/example.py +0 -0
  44. {orbitquant-0.1.2 → orbitquant-0.1.4}/native-kernels/orbitquant-packed-matmul/flake.lock +0 -0
  45. {orbitquant-0.1.2 → orbitquant-0.1.4}/native-kernels/orbitquant-packed-matmul/flake.nix +0 -0
  46. {orbitquant-0.1.2 → orbitquant-0.1.4}/native-kernels/orbitquant-packed-matmul/orbitquant_packed_matmul_cuda/packed_matmul.cu +0 -0
  47. {orbitquant-0.1.2 → orbitquant-0.1.4}/native-kernels/orbitquant-packed-matmul/orbitquant_packed_matmul_metal/packed_matmul.metal +0 -0
  48. {orbitquant-0.1.2 → orbitquant-0.1.4}/native-kernels/orbitquant-packed-matmul/orbitquant_packed_matmul_metal/packed_matmul.mm +0 -0
  49. {orbitquant-0.1.2 → orbitquant-0.1.4}/native-kernels/orbitquant-packed-matmul/tests/__init__.py +0 -0
  50. {orbitquant-0.1.2 → orbitquant-0.1.4}/native-kernels/orbitquant-packed-matmul/tests/test_packed_matmul.py +0 -0
  51. {orbitquant-0.1.2 → orbitquant-0.1.4}/native-kernels/orbitquant-packed-matmul/torch-ext/orbitquant_packed_matmul/__init__.py +0 -0
  52. {orbitquant-0.1.2 → orbitquant-0.1.4}/native-kernels/orbitquant-packed-matmul/torch-ext/torch_binding.cpp +0 -0
  53. {orbitquant-0.1.2 → orbitquant-0.1.4}/native-kernels/orbitquant-packed-matmul/torch-ext/torch_binding.h +0 -0
  54. {orbitquant-0.1.2 → orbitquant-0.1.4}/scripts/run_hf_compat_checks.sh +0 -0
  55. {orbitquant-0.1.2 → orbitquant-0.1.4}/scripts/run_paper_methodology_checks.sh +0 -0
  56. {orbitquant-0.1.2 → orbitquant-0.1.4}/scripts/runpod_ssh_health.sh +0 -0
  57. {orbitquant-0.1.2 → orbitquant-0.1.4}/scripts/verify_hf_kernel_model_artifact.py +0 -0
  58. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/adaln.py +0 -0
  59. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/artifacts/__init__.py +0 -0
  60. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/artifacts/assets.py +0 -0
  61. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/artifacts/checksums.py +0 -0
  62. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/artifacts/comparisons.py +0 -0
  63. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/artifacts/loader.py +0 -0
  64. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/artifacts/manifest.py +0 -0
  65. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/artifacts/refresh.py +0 -0
  66. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/artifacts/repair.py +0 -0
  67. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/artifacts/validator.py +0 -0
  68. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/artifacts/writer.py +0 -0
  69. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/benchmarks.py +0 -0
  70. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/cli/__init__.py +0 -0
  71. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/codebooks/__init__.py +0 -0
  72. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/codebooks/lloyd_max.py +0 -0
  73. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/config.py +0 -0
  74. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/errors.py +0 -0
  75. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/eval/__init__.py +0 -0
  76. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/eval/assets.py +0 -0
  77. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/eval/metrics.py +0 -0
  78. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/eval/native_plan.py +0 -0
  79. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/eval/native_runner.py +0 -0
  80. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/eval/native_settings.py +0 -0
  81. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/eval/prompts.py +0 -0
  82. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/eval/report.py +0 -0
  83. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/functional.py +0 -0
  84. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/hub.py +0 -0
  85. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/kernels/__init__.py +0 -0
  86. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/kernels/dispatch.py +0 -0
  87. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/kernels/mps.py +0 -0
  88. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/kernels/triton_cuda.py +0 -0
  89. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/modeling.py +0 -0
  90. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/packing/__init__.py +0 -0
  91. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/packing/bitpack.py +0 -0
  92. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/pipeline.py +0 -0
  93. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/policies/__init__.py +0 -0
  94. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/policies/flux.py +0 -0
  95. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/policies/flux2.py +0 -0
  96. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/policies/generic_dit.py +0 -0
  97. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/policies/wan.py +0 -0
  98. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/policies/z_image.py +0 -0
  99. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/quantizer.py +0 -0
  100. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/rotations/__init__.py +0 -0
  101. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/rotations/fwht.py +0 -0
  102. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/rotations/rpbh.py +0 -0
  103. {orbitquant-0.1.2 → orbitquant-0.1.4}/src/orbitquant/transformers_ops.py +0 -0
  104. {orbitquant-0.1.2 → orbitquant-0.1.4}/tests/test_adaln_rtn.py +0 -0
  105. {orbitquant-0.1.2 → orbitquant-0.1.4}/tests/test_benchmarks.py +0 -0
  106. {orbitquant-0.1.2 → orbitquant-0.1.4}/tests/test_bitpack.py +0 -0
  107. {orbitquant-0.1.2 → orbitquant-0.1.4}/tests/test_ci.py +0 -0
  108. {orbitquant-0.1.2 → orbitquant-0.1.4}/tests/test_cli_report.py +0 -0
  109. {orbitquant-0.1.2 → orbitquant-0.1.4}/tests/test_codebooks.py +0 -0
  110. {orbitquant-0.1.2 → orbitquant-0.1.4}/tests/test_config.py +0 -0
  111. {orbitquant-0.1.2 → orbitquant-0.1.4}/tests/test_diffusers_modelmixin_integration.py +0 -0
  112. {orbitquant-0.1.2 → orbitquant-0.1.4}/tests/test_distribution.py +0 -0
  113. {orbitquant-0.1.2 → orbitquant-0.1.4}/tests/test_eval_assets.py +0 -0
  114. {orbitquant-0.1.2 → orbitquant-0.1.4}/tests/test_eval_prompts.py +0 -0
  115. {orbitquant-0.1.2 → orbitquant-0.1.4}/tests/test_eval_report.py +0 -0
  116. {orbitquant-0.1.2 → orbitquant-0.1.4}/tests/test_hub.py +0 -0
  117. {orbitquant-0.1.2 → orbitquant-0.1.4}/tests/test_kernel_model_verifier.py +0 -0
  118. {orbitquant-0.1.2 → orbitquant-0.1.4}/tests/test_kernels.py +0 -0
  119. {orbitquant-0.1.2 → orbitquant-0.1.4}/tests/test_manifest.py +0 -0
  120. {orbitquant-0.1.2 → orbitquant-0.1.4}/tests/test_model_quantization.py +0 -0
  121. {orbitquant-0.1.2 → orbitquant-0.1.4}/tests/test_native_kernel_package.py +0 -0
  122. {orbitquant-0.1.2 → orbitquant-0.1.4}/tests/test_native_runner.py +0 -0
  123. {orbitquant-0.1.2 → orbitquant-0.1.4}/tests/test_native_settings.py +0 -0
  124. {orbitquant-0.1.2 → orbitquant-0.1.4}/tests/test_paper_alignment.py +0 -0
  125. {orbitquant-0.1.2 → orbitquant-0.1.4}/tests/test_paper_methodology.py +0 -0
  126. {orbitquant-0.1.2 → orbitquant-0.1.4}/tests/test_pipeline_helpers.py +0 -0
  127. {orbitquant-0.1.2 → orbitquant-0.1.4}/tests/test_policies.py +0 -0
  128. {orbitquant-0.1.2 → orbitquant-0.1.4}/tests/test_prompt_jobs.py +0 -0
  129. {orbitquant-0.1.2 → orbitquant-0.1.4}/tests/test_prompt_selection.py +0 -0
  130. {orbitquant-0.1.2 → orbitquant-0.1.4}/tests/test_quantizer_adapter.py +0 -0
  131. {orbitquant-0.1.2 → orbitquant-0.1.4}/tests/test_rpbh.py +0 -0
  132. {orbitquant-0.1.2 → orbitquant-0.1.4}/tests/test_target_policies.py +0 -0
  133. {orbitquant-0.1.2 → orbitquant-0.1.4}/tests/test_transformers_pretrained_integration.py +0 -0
@@ -6,7 +6,7 @@ on:
6
6
  version:
7
7
  description: Version to publish
8
8
  required: true
9
- default: "0.1.2"
9
+ default: "0.1.4"
10
10
 
11
11
  jobs:
12
12
  build:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: orbitquant
3
- Version: 0.1.2
3
+ Version: 0.1.4
4
4
  Summary: Clean-room OrbitQuant implementation for diffusion transformers
5
5
  Project-URL: Homepage, https://github.com/iamwavecut/OrbitQuant
6
6
  Project-URL: Repository, https://github.com/iamwavecut/OrbitQuant
@@ -39,7 +39,7 @@ Requires-Dist: diffusers>=0.35; extra == 'hf'
39
39
  Requires-Dist: transformers>=4.53; extra == 'hf'
40
40
  Provides-Extra: kernels
41
41
  Requires-Dist: kernels>=0.16; extra == 'kernels'
42
- Requires-Dist: triton>=3.5; extra == 'kernels'
42
+ Requires-Dist: triton>=3.5; (platform_system == 'Linux') and extra == 'kernels'
43
43
  Description-Content-Type: text/markdown
44
44
 
45
45
  # OrbitQuant
@@ -402,6 +402,42 @@ reproduction targets:
402
402
  User-facing comparison assets are generated at the native settings above. Small
403
403
  low-resolution checks are not accepted as published quality evidence.
404
404
 
405
+ To create a local original-vs-OrbitQuant evidence bundle without writing raw
406
+ samples into the model artifact repository, run `compare-native` against a local
407
+ OrbitQuant artifact:
408
+
409
+ ```bash
410
+ orbitquant compare-native \
411
+ --suite flux2-native \
412
+ --artifact ./artifacts/flux2-klein-w4a4 \
413
+ --prompt-id simple-object \
414
+ --output ./reports/native/flux2-klein-w4a4-comparison \
415
+ --device cuda \
416
+ --dtype bfloat16 \
417
+ --runtime-mode auto_fused
418
+ ```
419
+
420
+ The output directory contains the BF16 sample, the OrbitQuant sample, a
421
+ side-by-side WebP comparison, per-split metadata, and `summary.json` with native
422
+ settings, wall time, peak VRAM, requested runtime mode, and available local
423
+ kernel backends. By default `compare-native` validates the completed bundle
424
+ before returning and includes the validation report in its JSON output. Use
425
+ `--skip-comparison-validation` only when you intentionally want to inspect or
426
+ repair an incomplete bundle.
427
+
428
+ Validate a copied or previously generated comparison bundle before using it as
429
+ evidence:
430
+
431
+ ```bash
432
+ orbitquant validate-comparison \
433
+ --input ./reports/native/flux2-klein-w4a4-comparison
434
+ ```
435
+
436
+ The validator accepts bundles copied from a remote GPU host, checks native
437
+ settings and metadata, resolves remote absolute paths by local filename, rejects
438
+ blank-like images, and reports timing, VRAM, and selected OrbitQuant runtime
439
+ counts when the bundle was generated by a recent `compare-native`.
440
+
405
441
  ## Release Metrics
406
442
 
407
443
  Full GenEval and VBench runs are release evidence for paper reproduction,
@@ -443,6 +479,10 @@ orbitquant external-eval-script \
443
479
  For Wan, use the same `external-eval-script` path with `--suite wan-native` to
444
480
  run VBench custom-input dimensions against the native 832x480, 81-frame videos.
445
481
 
482
+ Imported GenEval `geneval_overall` follows upstream GenEval semantics: average
483
+ over task scores. Image-level and prompt-level hit rates are imported as
484
+ `geneval_image_accuracy` and `geneval_prompt_accuracy` when present.
485
+
446
486
  Final publication gates are tracked in
447
487
  [docs/release-gates.md](docs/release-gates.md).
448
488
 
@@ -358,6 +358,42 @@ reproduction targets:
358
358
  User-facing comparison assets are generated at the native settings above. Small
359
359
  low-resolution checks are not accepted as published quality evidence.
360
360
 
361
+ To create a local original-vs-OrbitQuant evidence bundle without writing raw
362
+ samples into the model artifact repository, run `compare-native` against a local
363
+ OrbitQuant artifact:
364
+
365
+ ```bash
366
+ orbitquant compare-native \
367
+ --suite flux2-native \
368
+ --artifact ./artifacts/flux2-klein-w4a4 \
369
+ --prompt-id simple-object \
370
+ --output ./reports/native/flux2-klein-w4a4-comparison \
371
+ --device cuda \
372
+ --dtype bfloat16 \
373
+ --runtime-mode auto_fused
374
+ ```
375
+
376
+ The output directory contains the BF16 sample, the OrbitQuant sample, a
377
+ side-by-side WebP comparison, per-split metadata, and `summary.json` with native
378
+ settings, wall time, peak VRAM, requested runtime mode, and available local
379
+ kernel backends. By default `compare-native` validates the completed bundle
380
+ before returning and includes the validation report in its JSON output. Use
381
+ `--skip-comparison-validation` only when you intentionally want to inspect or
382
+ repair an incomplete bundle.
383
+
384
+ Validate a copied or previously generated comparison bundle before using it as
385
+ evidence:
386
+
387
+ ```bash
388
+ orbitquant validate-comparison \
389
+ --input ./reports/native/flux2-klein-w4a4-comparison
390
+ ```
391
+
392
+ The validator accepts bundles copied from a remote GPU host, checks native
393
+ settings and metadata, resolves remote absolute paths by local filename, rejects
394
+ blank-like images, and reports timing, VRAM, and selected OrbitQuant runtime
395
+ counts when the bundle was generated by a recent `compare-native`.
396
+
361
397
  ## Release Metrics
362
398
 
363
399
  Full GenEval and VBench runs are release evidence for paper reproduction,
@@ -399,6 +435,10 @@ orbitquant external-eval-script \
399
435
  For Wan, use the same `external-eval-script` path with `--suite wan-native` to
400
436
  run VBench custom-input dimensions against the native 832x480, 81-frame videos.
401
437
 
438
+ Imported GenEval `geneval_overall` follows upstream GenEval semantics: average
439
+ over task scores. Image-level and prompt-level hit rates are imported as
440
+ `geneval_image_accuracy` and `geneval_prompt_accuracy` when present.
441
+
402
442
  Final publication gates are tracked in
403
443
  [docs/release-gates.md](docs/release-gates.md).
404
444
 
@@ -21,9 +21,9 @@ for the current artifact format and runtime modes.
21
21
  the current environment.
22
22
  - `scripts/run_cuda_kernel_checks.sh` is the CUDA correctness and benchmark
23
23
  gate for GPU hosts. It first tries to load a prebuilt
24
- `native_packed_matmul` package through Hugging Face `kernels`,
25
- `LOCAL_KERNELS`, or an importable package. If no compatible prebuilt package
26
- is available, it fails before starting a source build unless
24
+ `native_packed_matmul` package from an importable `orbitquant_packed_matmul`
25
+ module, then through Hugging Face `kernels`/`LOCAL_KERNELS`. If no compatible
26
+ prebuilt package is available, it fails before starting a source build unless
27
27
  `ORBITQUANT_ALLOW_NATIVE_KERNEL_BUILD=1` is set. With that explicit opt-in,
28
28
  it builds the exact
29
29
  `native-kernels/orbitquant-packed-matmul` kernel-builder redistributable
@@ -284,6 +284,13 @@ for the current artifact format and runtime modes.
284
284
  snapshot model repo resolved to commit
285
285
  `cb0ceb1a4d070556c52cfba691aba3f6647c246b`. The native loader therefore
286
286
  still requires `LOCAL_KERNELS`, an importable package, or Kernel Hub approval.
287
+ - A 2026-07-09T15:06Z live refresh found no new reviewer reply after the
288
+ 2026-07-09T14:00Z model-artifact numbers. Discussion 15 remains open,
289
+ `repo_info("WaveCut/orbitquant-packed-matmul", repo_type="model")` resolves
290
+ to commit `cb0ceb1a4d070556c52cfba691aba3f6647c246b`, and
291
+ `repo_info("WaveCut/orbitquant-packed-matmul", repo_type="kernel")` still
292
+ returns 404. Do not describe the native package as remotely loadable until a
293
+ kernel-type repository exists and `get_kernel(...)` has been verified.
287
294
 
288
295
  ## Packaging Boundary
289
296
 
@@ -170,6 +170,16 @@ approval blocker.
170
170
  On 2026-07-09T14:00Z, `WaveCut` posted those actual model artifact numbers in
171
171
  discussion 15.
172
172
 
173
+ Live status refresh:
174
+
175
+ On 2026-07-09T15:06Z, discussion 15 was still open and no newer reviewer reply
176
+ was present after the 2026-07-09T14:00Z model-artifact numbers. The public
177
+ source snapshot repo still resolved as a model repo at commit
178
+ `cb0ceb1a4d070556c52cfba691aba3f6647c246b`; the kernel-type repository still
179
+ returned 404. The remaining action is Hugging Face Kernel Hub publish approval,
180
+ followed by `kernel-builder build-and-upload` and `get_kernel(...)`
181
+ verification.
182
+
173
183
  ## Title
174
184
 
175
185
  Request Kernel Hub publish access for `WaveCut/orbitquant-packed-matmul`
@@ -0,0 +1,25 @@
1
+ # OrbitQuant 0.1.3 Release Notes
2
+
3
+ OrbitQuant 0.1.3 is a packaging patch for cross-platform kernel extras.
4
+
5
+ ## Changes
6
+
7
+ - The `kernels` extra remains the default install target for optimized
8
+ packed-weight inference support:
9
+
10
+ ```bash
11
+ pip install "orbitquant[kernels]==0.1.3"
12
+ ```
13
+
14
+ - `triton>=3.5` is now constrained to Linux installs of the `kernels` extra.
15
+ This keeps CUDA/Triton support available on Linux while allowing macOS/MPS
16
+ users to install `orbitquant[kernels]` for Hugging Face `kernels` package
17
+ support without trying to resolve an unavailable Triton wheel.
18
+ - The package version, CLI version, and `orbitquant.__version__` are aligned at
19
+ `0.1.3`.
20
+
21
+ ## Claim Boundary
22
+
23
+ This release does not change quantization math, artifact format, model cards,
24
+ runtime dispatch policy, or kernel implementations. It only fixes optional
25
+ dependency resolution for platforms where Triton is not published.
@@ -0,0 +1,36 @@
1
+ # OrbitQuant 0.1.4 Release Notes
2
+
3
+ OrbitQuant 0.1.4 is a release-metrics patch for external GenEval and VBench
4
+ metric import.
5
+
6
+ ## Install
7
+
8
+ ```bash
9
+ pip install "orbitquant[hf]==0.1.4"
10
+ ```
11
+
12
+ For optimized packed-weight inference dependencies:
13
+
14
+ ```bash
15
+ pip install "orbitquant[kernels]==0.1.4"
16
+ ```
17
+
18
+ ## Changes
19
+
20
+ - Imported GenEval `geneval_overall` now follows upstream GenEval semantics:
21
+ average over task scores.
22
+ - GenEval image-level and prompt-level hit rates are imported as
23
+ `geneval_image_accuracy` and `geneval_prompt_accuracy` when they are present
24
+ in the external results.
25
+ - VBench external eval commands now pass requested dimensions as separate CLI
26
+ arguments, matching upstream `--dimension` parsing.
27
+ - VBench prompt files now use exported video filenames as keys for custom input
28
+ evaluation.
29
+ - README and generated model cards document GenEval and VBench release metric
30
+ semantics.
31
+
32
+ ## Claim Boundary
33
+
34
+ This release does not change quantization math, artifact format, runtime
35
+ dispatch, kernel implementations, or published model weights. Release-grade
36
+ GenEval/VBench runs remain separate from this package patch.
@@ -196,7 +196,13 @@ URL, or signed-off audit note.
196
196
  source build unless `ORBITQUANT_ALLOW_NATIVE_KERNEL_BUILD=1` is set. A
197
197
  2026-07-09 prebuilt-only loader check still returned 404 for the Kernel Hub
198
198
  repo while the public source snapshot model repo resolved to commit
199
- `cb0ceb1a4d070556c52cfba691aba3f6647c246b`.
199
+ `cb0ceb1a4d070556c52cfba691aba3f6647c246b`. A 2026-07-09T15:06Z live
200
+ refresh confirmed discussion 15 remains open, the public source snapshot
201
+ model repo still resolves to commit
202
+ `cb0ceb1a4d070556c52cfba691aba3f6647c246b`, and
203
+ `repo_info("WaveCut/orbitquant-packed-matmul", repo_type="kernel")` still
204
+ returns 404. The loadable Kernel Hub package therefore remains an external
205
+ approval gate, not a completed release artifact.
200
206
  - [x] Final paper conformance audit is complete against arXiv 2607.02461, with
201
207
  documented deviations, implementation notes, and evidence that accepted
202
208
  deviations are intentional. The required audit checklist is
@@ -228,7 +234,11 @@ URL, or signed-off audit note.
228
234
  metadata, zero remote checksum mismatches, zero README mismatches, and zero
229
235
  forbidden remote files. It also reported `public_count=14`,
230
236
  `private_count=0`, 14/14 policy-inventory-ready, and 144 missing
231
- release-grade metrics.
237
+ release-grade metrics. A 2026-07-09T15:06Z rerun with `--summary-only` and
238
+ the same policy inventory root again passed `--fail-on-artifact-regression`
239
+ with 14/14 artifact-ready, native-smoke-ready, metadata-complete, and
240
+ policy-inventory-ready; it reported `release_eval_applicable_count=10`,
241
+ `release_eval_ready_count=0`, and `missing_required_metric_count=144`.
232
242
  - [x] Full-model module classification inventories are captured for FLUX.2
233
243
  Klein, FLUX.1-schnell, Z-Image-Turbo, and Wan2.1. Raw inventory JSON may
234
244
  remain unpublished, but each published artifact manifest must be
@@ -244,9 +254,9 @@ URL, or signed-off audit note.
244
254
  `scripts/run_hf_compat_checks.sh --mode all`, using the current Torch base.
245
255
  This gate uses registration, pipeline quantization config, and mini
246
256
  integration tests; it does not download model weights or generate samples.
247
- Evidence: passed on 2026-07-08T15:47Z with Torch 2.12.1, current/release
248
- Diffusers 0.39.0 and Transformers 5.13.0, and dev Diffusers 0.40.0.dev0 plus
249
- Transformers 5.14.0.dev0.
257
+ Evidence: passed on 2026-07-09T17:18Z with Torch 2.12.1, current/release
258
+ Diffusers 0.39.0 and Transformers 5.13.0, and dev Diffusers 0.40.0.dev0
259
+ at `208704a` plus Transformers 5.14.0.dev0 at `0bc3554`.
250
260
  - [x] Checkpoint and model repositories are published with artifact-focused
251
261
  model cards, complete file manifests, checksums where applicable, and native
252
262
  comparison assets for the advertised targets. Cards must describe the
@@ -258,7 +268,9 @@ URL, or signed-off audit note.
258
268
  `repo_count=14`, `artifact_ready_count=14`, `metadata_complete_ready_count=14`,
259
269
  `native_smoke_ready_count=14`, `remote_checksum_mismatch_count=0`,
260
270
  `readme_mismatch_count=0`, `forbidden_file_count=0`, `public_count=14`, and
261
- `private_count=0`.
271
+ `private_count=0`. A 2026-07-09T15:06Z `--summary-only` rerun preserved the
272
+ same compact artifact counts and still reported `forbidden_file_count=0`,
273
+ `remote_checksum_mismatch_count=0`, and `readme_mismatch_count=0`.
262
274
  - [x] The GitHub repository is public, tagged, released, and includes the
263
275
  release docs, license, source distribution expectations, and reproducible
264
276
  verification commands.
@@ -289,7 +301,27 @@ URL, or signed-off audit note.
289
301
  `5972b6cfd1d89653fb9ac17668f72818c61a0e3cc5ea1cdd46e59d54405dc1ff` and
290
302
  `orbitquant-0.1.1-py3-none-any.whl` SHA256
291
303
  `b829c5df00093e697872ca24104e6ef38dbe7e7d70b2c2e33560bfaec224cde1`.
292
- - [x] The PyPI package is published as `orbitquant==0.1.1`.
304
+ Patch release notes for compact artifact audit output are
305
+ [release-0.1.2.md](release-0.1.2.md). GitHub CI for commit `f18feb9`
306
+ passed as run `29025114082`, tag `v0.1.2` points at commit
307
+ `f18feb95f7595965f046b3455997d6ce9b8e8e4a`, and GitHub Release
308
+ `https://github.com/iamwavecut/OrbitQuant/releases/tag/v0.1.2` was published
309
+ on 2026-07-09 with exact PyPI-matching assets:
310
+ `orbitquant-0.1.2.tar.gz` SHA256
311
+ `4afc15589fe713345dfa47be30dc078d943484a1f4bbd4861a413532a6ec8377` and
312
+ `orbitquant-0.1.2-py3-none-any.whl` SHA256
313
+ `3bdddebaa46f60307ed50e2ebf4b7ff4fef7817845b512ecfbb6fbf8ba71c91c`.
314
+ Patch release notes for the cross-platform kernel-extra dependency fix are
315
+ [release-0.1.3.md](release-0.1.3.md). GitHub CI for commit `02166ec`
316
+ passed as run `29034308427`, tag `v0.1.3` points at commit
317
+ `02166ec6bdcd8920b0012a1ff930dce8dd976fdb`, and GitHub Release
318
+ `https://github.com/iamwavecut/OrbitQuant/releases/tag/v0.1.3` was published
319
+ on 2026-07-09 with exact PyPI-matching assets:
320
+ `orbitquant-0.1.3.tar.gz` SHA256
321
+ `008f949641d00df46f840580c424b9e9fad0d853b4345d454a0b8042c61f3366` and
322
+ `orbitquant-0.1.3-py3-none-any.whl` SHA256
323
+ `181e9b532a07312ec47b54091d651b5a62d5aefd32c88d40830bd8529a0fdc53`.
324
+ - [x] The PyPI package is published as `orbitquant==0.1.3`.
293
325
  Evidence: commit `ce5c232` added the manual
294
326
  `.github/workflows/publish-pypi.yml` Trusted Publishing workflow. A PyPI
295
327
  pending publisher was registered for project `orbitquant`, owner
@@ -316,6 +348,30 @@ URL, or signed-off audit note.
316
348
  `OrbitQuantConfig().runtime_mode == "auto_fused"`,
317
349
  `OrbitQuantConfig().packed_matmul_block_n == 128`, and
318
350
  `orbitquant --version == "0.1.1"`.
351
+ Patch publish run `29025225397` completed successfully on 2026-07-09 from
352
+ head SHA `f18feb95f7595965f046b3455997d6ce9b8e8e4a`, including full pytest,
353
+ `ruff check`, package build, `twine check`, wheel smoke, OIDC publication,
354
+ and PyPI digital attestations. The PyPI JSON API reports version `0.1.2` with
355
+ `orbitquant-0.1.2.tar.gz` SHA256
356
+ `4afc15589fe713345dfa47be30dc078d943484a1f4bbd4861a413532a6ec8377` and
357
+ `orbitquant-0.1.2-py3-none-any.whl` SHA256
358
+ `3bdddebaa46f60307ed50e2ebf4b7ff4fef7817845b512ecfbb6fbf8ba71c91c`; a fresh
359
+ venv installed `orbitquant==0.1.2` from PyPI and verified
360
+ `orbitquant.__version__ == "0.1.2"`,
361
+ `OrbitQuantConfig().runtime_mode == "auto_fused"`,
362
+ `orbitquant --version == "0.1.2"`, and `orbitquant audit-hf-artifacts --help`
363
+ includes `--summary-only`.
364
+ Patch publish run `29034405916` completed successfully on 2026-07-09 from
365
+ head SHA `02166ec6bdcd8920b0012a1ff930dce8dd976fdb`, including full pytest,
366
+ `ruff check`, package build, `twine check`, wheel smoke, OIDC publication,
367
+ and PyPI digital attestations. The PyPI JSON API reports version `0.1.3` with
368
+ `orbitquant-0.1.3.tar.gz` SHA256
369
+ `008f949641d00df46f840580c424b9e9fad0d853b4345d454a0b8042c61f3366` and
370
+ `orbitquant-0.1.3-py3-none-any.whl` SHA256
371
+ `181e9b532a07312ec47b54091d651b5a62d5aefd32c88d40830bd8529a0fdc53`; a fresh
372
+ venv installed `orbitquant[kernels]==0.1.3` from PyPI on macOS and verified
373
+ `orbitquant.__version__ == "0.1.3"`, installed `kernels==0.16.0`, and did
374
+ not install Triton because the `triton>=3.5` extra is Linux-only.
319
375
  - [x] ComfyUI compatibility is verified after the relevant schema stabilizes,
320
376
  including load, graph execution, artifact metadata behavior, and kernel extra
321
377
  install guidance for the default `auto_fused` runtime.
@@ -332,7 +388,53 @@ URL, or signed-off audit note.
332
388
  `ruff`, package build, and `twine check`, and passed GitHub CI run
333
389
  `29020564152` on 2026-07-09. A live GitHub check then reported
334
390
  `iamwavecut/ComfyUI-OrbitQuant` as `PUBLIC`, Apache-2.0 licensed, with
335
- default branch `main`.
391
+ default branch `main`. Follow-up commit `85527ee` required
392
+ `orbitquant>=0.1.1` after the packed-matmul default update and passed
393
+ GitHub CI run `29022774661`. Commit `4832d4a` requires
394
+ `orbitquant>=0.1.2`, updates the README install commands for both
395
+ `orbitquant>=0.1.2` and `orbitquant[kernels]>=0.1.2`, refreshes `uv.lock`
396
+ to the PyPI `orbitquant` 0.1.2 release hashes, and passed GitHub CI run
397
+ `29027011708` on 2026-07-09. GitHub Release
398
+ `https://github.com/iamwavecut/ComfyUI-OrbitQuant/releases/tag/v0.1.0` was
399
+ published on 2026-07-09T15:12Z from commit
400
+ `4832d4addb39681e82f38e07627a2bb682e4332d` with assets
401
+ `comfyui_orbitquant-0.1.0.tar.gz` SHA256
402
+ `630628c56e5ed35626cd7cca6749c51056cb78a0041b7c1268cf0b5e995d28c0` and
403
+ `comfyui_orbitquant-0.1.0-py3-none-any.whl` SHA256
404
+ `0c774c20a6759bea18d5d02b598035c3446a72ee4efaa0be6c1f325f4b3e928b`.
405
+ Before release, local `uv run pytest -q`, `uv run ruff check .`, package
406
+ build, and `twine check` passed for the node pack. Follow-up commit
407
+ `ca62b7a` added the manual `.github/workflows/publish-pypi.yml` Trusted
408
+ Publishing workflow for a future `comfyui-orbitquant` PyPI release. GitHub
409
+ reported both `CI` and `Publish PyPI` workflows as active, and ComfyUI CI run
410
+ `29028857599` passed on 2026-07-09 with node-pack tests, lint, package
411
+ build, package metadata check, and wheel smoke. The GitHub `pypi`
412
+ environment was created on 2026-07-09T15:21Z. After PyPI password
413
+ confirmation, the pending publisher for `comfyui-orbitquant` was registered
414
+ and workflow run `29029534070` published `comfyui-orbitquant==0.1.0` through
415
+ Trusted Publishing on 2026-07-09. The PyPI version JSON for `0.1.0` reports
416
+ `comfyui_orbitquant-0.1.0-py3-none-any.whl` SHA256
417
+ `0c774c20a6759bea18d5d02b598035c3446a72ee4efaa0be6c1f325f4b3e928b` and
418
+ `comfyui_orbitquant-0.1.0.tar.gz` SHA256
419
+ `9a2c1e23e7c7674bb8fb7c350473c9ad636c952c5495b71d805a91996a00b51f`. A fresh
420
+ venv installed `comfyui-orbitquant==0.1.0` from PyPI and imported
421
+ `comfyui_orbitquant.NODE_CLASS_MAPPINGS`.
422
+ Current commit `7e5fc4c` requires `orbitquant>=0.1.3`, exposes the
423
+ `comfyui-orbitquant[kernels]` extra through `orbitquant[kernels]>=0.1.3`,
424
+ refreshes `uv.lock` to the PyPI OrbitQuant 0.1.3 release, and passed GitHub
425
+ CI run `29034705959` on 2026-07-09. Publish run `29034761024` published
426
+ `comfyui-orbitquant==0.1.2` from head SHA
427
+ `7e5fc4c0f74dbcb341b755b2b53cb0edf40cb311`. GitHub Release
428
+ `https://github.com/iamwavecut/ComfyUI-OrbitQuant/releases/tag/v0.1.2` was
429
+ published on 2026-07-09 with exact PyPI-matching assets:
430
+ `comfyui_orbitquant-0.1.2.tar.gz` SHA256
431
+ `48ea3909f96620baba3f2acf52532b15330fc89cb847557f13da915969f4e42b` and
432
+ `comfyui_orbitquant-0.1.2-py3-none-any.whl` SHA256
433
+ `2fbcf8a4fecb7d4384d2461001fa33b291a02720d20cf465e7e2669ad145fd83`. A fresh
434
+ venv installed `comfyui-orbitquant[kernels]==0.1.2` from PyPI on macOS and
435
+ verified `comfyui-orbitquant==0.1.2`, `orbitquant==0.1.3`,
436
+ `kernels==0.16.0`, no Triton install, and exported FLUX, Z-Image, Wan,
437
+ generic component-loader, and artifact-inspector nodes.
336
438
  - [x] MPS shader-only gate can be run independently from the native packed
337
439
  matmul package gate. Evidence: on 2026-07-09,
338
440
  `ORBITQUANT_RUN_NATIVE_KERNEL_PACKAGE_CI=0` with tiny benchmark dimensions
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "orbitquant"
7
- version = "0.1.2"
7
+ version = "0.1.4"
8
8
  description = "Clean-room OrbitQuant implementation for diffusion transformers"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -38,7 +38,7 @@ hf = [
38
38
  ]
39
39
  kernels = [
40
40
  "kernels>=0.16",
41
- "triton>=3.5",
41
+ "triton>=3.5; platform_system == 'Linux'",
42
42
  ]
43
43
  eval = [
44
44
  "imageio>=2.37",
@@ -237,14 +237,14 @@ PY
237
237
  printf '%s\n' \
238
238
  "native kernel package CI could not load a compatible prebuilt native packed-matmul kernel." \
239
239
  "The script will not start a kernel-builder/Nix source build unless ORBITQUANT_ALLOW_NATIVE_KERNEL_BUILD=1 is set, because uncached CUDA builds can compile the CUDA/NCCL stack on paid GPU hosts." \
240
- "Use a loadable Hugging Face Kernel Hub artifact, set LOCAL_KERNELS to a compatible built CUDA variant, or rerun with ORBITQUANT_ALLOW_NATIVE_KERNEL_BUILD=1 only on a host where the build cache/toolchain is intentional." \
240
+ "Make a compatible orbitquant_packed_matmul package importable, use a loadable Hugging Face Kernel Hub artifact, set LOCAL_KERNELS to a compatible built CUDA variant, or rerun with ORBITQUANT_ALLOW_NATIVE_KERNEL_BUILD=1 only on a host where the build cache/toolchain is intentional." \
241
241
  >&2
242
242
  exit 1
243
243
  fi
244
244
  if ! command -v nix >/dev/null 2>&1; then
245
245
  printf '%s\n' \
246
246
  "native kernel package CI requires either a loadable prebuilt native packed-matmul kernel or nix for kernel-builder." \
247
- "Install nix, use a GPU image with nix, set LOCAL_KERNELS to a compatible built variant, wait for the Hugging Face kernel repo to become loadable, or set ORBITQUANT_RUN_NATIVE_KERNEL_PACKAGE_CI=0 only when intentionally skipping native package closure." \
247
+ "Install nix, make a compatible orbitquant_packed_matmul package importable, set LOCAL_KERNELS to a compatible built variant, wait for the Hugging Face kernel repo to become loadable, or set ORBITQUANT_RUN_NATIVE_KERNEL_PACKAGE_CI=0 only when intentionally skipping native package closure." \
248
248
  >&2
249
249
  exit 1
250
250
  fi
@@ -94,7 +94,7 @@ if [[ "$RUN_NATIVE_KERNEL_PACKAGE_CI" == "1" && -z "${LOCAL_KERNELS:-}" ]]; then
94
94
  stage "native-packed-matmul-local-variant-missing status=$native_kernel_variant_status"
95
95
  printf '%s\n' \
96
96
  "native packed matmul local variant was not found for this MPS runtime." \
97
- "Set LOCAL_KERNELS=$NATIVE_KERNEL_REPO_ID=/absolute/path/to/a/built/variant containing metadata.json, build the matching kernel-builder variant, or set ORBITQUANT_RUN_NATIVE_KERNEL_PACKAGE_CI=0 to run only the inline Metal shader checks." \
97
+ "Make a compatible orbitquant_packed_matmul package importable, set LOCAL_KERNELS=$NATIVE_KERNEL_REPO_ID=/absolute/path/to/a/built/variant containing metadata.json, build the matching kernel-builder variant, or set ORBITQUANT_RUN_NATIVE_KERNEL_PACKAGE_CI=0 to run only the inline Metal shader checks." \
98
98
  >&2
99
99
  fi
100
100
  fi
@@ -12,7 +12,7 @@ from orbitquant.pipeline import (
12
12
  )
13
13
  from orbitquant.quantizer import register_hf_quantizers
14
14
 
15
- __version__ = "0.1.2"
15
+ __version__ = "0.1.4"
16
16
 
17
17
  register_hf_quantizers()
18
18
 
@@ -11,6 +11,7 @@ from orbitquant.artifacts.checksums import (
11
11
  write_sha256sums_from_manifest,
12
12
  )
13
13
  from orbitquant.artifacts.manifest import OrbitQuantManifest
14
+ from orbitquant.artifacts.model_card import render_model_card
14
15
  from orbitquant.artifacts.validator import validate_required_artifact_files
15
16
 
16
17
  _VALID_METRIC_SPLITS = {"original", "orbitquant"}
@@ -126,6 +127,10 @@ def record_artifact_metrics(
126
127
  )
127
128
  if not refresh_checksums_enabled:
128
129
  return record
130
+ (artifact_path / "README.md").write_text(
131
+ render_model_card(manifest, benchmark_summary=summary),
132
+ encoding="utf-8",
133
+ )
129
134
  checksums = _write_manifest_with_refreshed_checksums(
130
135
  artifact_path, manifest, changed_paths
131
136
  )
@@ -5,6 +5,31 @@ from typing import Any
5
5
  from orbitquant.artifacts.manifest import OrbitQuantManifest
6
6
  from orbitquant.eval.native_settings import NativeSuite, list_native_suites
7
7
 
8
+ _GENEVAL_METRICS = (
9
+ "geneval_overall",
10
+ "geneval_per_task_single_object",
11
+ "geneval_per_task_two_object",
12
+ "geneval_per_task_counting",
13
+ "geneval_per_task_colors",
14
+ "geneval_per_task_position",
15
+ "geneval_per_task_color_attr",
16
+ )
17
+ _VBENCH_METRICS = (
18
+ "vbench_imaging_quality",
19
+ "vbench_aesthetic_quality",
20
+ "vbench_motion_smoothness",
21
+ "vbench_dynamic_degree",
22
+ "vbench_background_consistency",
23
+ "vbench_subject_consistency",
24
+ "vbench_scene",
25
+ "vbench_overall_consistency",
26
+ )
27
+ _RELEASE_METRICS_BY_MODEL = {
28
+ "black-forest-labs/FLUX.1-schnell": ("GenEval", _GENEVAL_METRICS),
29
+ "Tongyi-MAI/Z-Image-Turbo": ("GenEval", _GENEVAL_METRICS),
30
+ "Wan-AI/Wan2.1-T2V-1.3B-Diffusers": ("VBench", _VBENCH_METRICS),
31
+ }
32
+
8
33
 
9
34
  def _comparison_assets(checksums: dict[str, str]) -> list[str]:
10
35
  assets = []
@@ -168,18 +193,70 @@ def _native_settings_section(source_model_id: str) -> list[str]:
168
193
  return lines
169
194
 
170
195
 
171
- def _validation_status_section(source_model_id: str) -> list[str]:
172
- release_metric = {
173
- "black-forest-labs/FLUX.1-schnell": "GenEval",
174
- "Tongyi-MAI/Z-Image-Turbo": "GenEval",
175
- "Wan-AI/Wan2.1-T2V-1.3B-Diffusers": "VBench",
176
- }.get(source_model_id)
196
+ def _latest_metrics_by_split(
197
+ benchmark_summary: dict[str, Any] | None,
198
+ ) -> dict[str, dict[str, Any]]:
199
+ if not isinstance(benchmark_summary, dict):
200
+ return {}
201
+ split_payload = benchmark_summary.get("metrics")
202
+ if not isinstance(split_payload, dict):
203
+ return {}
204
+ metrics_by_split: dict[str, dict[str, Any]] = {}
205
+ for split in ("original", "orbitquant"):
206
+ latest = split_payload.get(split, {}).get("latest")
207
+ if not isinstance(latest, dict):
208
+ continue
209
+ metrics = latest.get("metrics")
210
+ if isinstance(metrics, dict):
211
+ metrics_by_split[split] = metrics
212
+ return metrics_by_split
213
+
214
+
215
+ def _format_metric_value(value: Any) -> str:
216
+ if isinstance(value, bool) or not isinstance(value, int | float):
217
+ return ""
218
+ return f"`{value:.4g}`"
219
+
220
+
221
+ def _release_metric_rows(
222
+ source_model_id: str,
223
+ benchmark_summary: dict[str, Any] | None,
224
+ ) -> tuple[str | None, list[tuple[str, str, str]]]:
225
+ release = _RELEASE_METRICS_BY_MODEL.get(source_model_id)
226
+ if release is None:
227
+ return None, []
228
+ release_metric, metric_names = release
229
+ metrics_by_split = _latest_metrics_by_split(benchmark_summary)
230
+ rows = []
231
+ for metric in metric_names:
232
+ original = metrics_by_split.get("original", {}).get(metric)
233
+ orbitquant = metrics_by_split.get("orbitquant", {}).get(metric)
234
+ if original is None and orbitquant is None:
235
+ continue
236
+ rows.append(
237
+ (
238
+ metric,
239
+ _format_metric_value(original),
240
+ _format_metric_value(orbitquant),
241
+ )
242
+ )
243
+ return release_metric, rows
244
+
245
+
246
+ def _validation_status_section(
247
+ source_model_id: str,
248
+ benchmark_summary: dict[str, Any] | None,
249
+ ) -> list[str]:
250
+ release_metric, release_rows = _release_metric_rows(source_model_id, benchmark_summary)
177
251
  release_line = (
178
- f"- Release-grade {release_metric} metrics: not included in this artifact."
252
+ f"- Release-grade {release_metric} metrics: included below."
253
+ if release_metric
254
+ and release_rows
255
+ else f"- Release-grade {release_metric} metrics: not included in this artifact."
179
256
  if release_metric
180
257
  else "- Release-grade paper metrics: not applicable to this extra target."
181
258
  )
182
- return [
259
+ lines = [
183
260
  "## Validation Status",
184
261
  "",
185
262
  "- Native BF16-vs-OrbitQuant comparison: included when the visual matrix "
@@ -188,6 +265,28 @@ def _validation_status_section(source_model_id: str) -> list[str]:
188
265
  "- The model card reports artifact-level validation status only.",
189
266
  "",
190
267
  ]
268
+ if release_rows:
269
+ lines.extend(
270
+ [
271
+ f"### Release-Grade {release_metric} Metrics",
272
+ "",
273
+ (
274
+ "GenEval `geneval_overall` follows upstream GenEval semantics: "
275
+ "average over task scores."
276
+ if release_metric == "GenEval"
277
+ else "VBench metrics follow the upstream dimension names."
278
+ ),
279
+ "",
280
+ "| Metric | BF16 source | OrbitQuant |",
281
+ "| --- | ---: | ---: |",
282
+ ]
283
+ )
284
+ lines.extend(
285
+ f"| `{metric}` | {original or '-'} | {orbitquant or '-'} |"
286
+ for metric, original, orbitquant in release_rows
287
+ )
288
+ lines.append("")
289
+ return lines
191
290
 
192
291
 
193
292
  def _native_validation_proof_section(
@@ -253,7 +352,9 @@ def render_model_card(
253
352
  bits = f"W{data['weight_bits']}A{data['activation_bits']}"
254
353
  comparison_assets = _comparison_assets(data["checksums"])
255
354
  native_settings_lines = _native_settings_section(data["source_model_id"])
256
- validation_status_lines = _validation_status_section(data["source_model_id"])
355
+ validation_status_lines = _validation_status_section(
356
+ data["source_model_id"], benchmark_summary
357
+ )
257
358
  native_validation_proof_lines = _native_validation_proof_section(benchmark_summary)
258
359
  adaln_group_size = int(data.get("adaln_group_size", 64))
259
360
  adaln_default_note = (