axquant 1.3.0__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 (250) hide show
  1. axquant-1.3.0/.github/workflows/ci.yml +62 -0
  2. axquant-1.3.0/.github/workflows/release.yml +112 -0
  3. axquant-1.3.0/.gitignore +26 -0
  4. axquant-1.3.0/CHANGELOG.md +291 -0
  5. axquant-1.3.0/CONTRIBUTING.md +94 -0
  6. axquant-1.3.0/LICENSE +21 -0
  7. axquant-1.3.0/PKG-INFO +1049 -0
  8. axquant-1.3.0/README.md +1012 -0
  9. axquant-1.3.0/THIRD_PARTY_NOTICES.md +33 -0
  10. axquant-1.3.0/data/eval/coding.jsonl +15 -0
  11. axquant-1.3.0/data/eval/instruction.jsonl +15 -0
  12. axquant-1.3.0/data/eval/json.jsonl +15 -0
  13. axquant-1.3.0/data/eval/json_tool.jsonl +15 -0
  14. axquant-1.3.0/data/eval/long_context.jsonl +15 -0
  15. axquant-1.3.0/data/eval/multilingual.jsonl +15 -0
  16. axquant-1.3.0/data/eval/reasoning.jsonl +15 -0
  17. axquant-1.3.0/data/eval/tool.jsonl +15 -0
  18. axquant-1.3.0/docs/ci-root-causes.md +163 -0
  19. axquant-1.3.0/docs/compatibility.md +51 -0
  20. axquant-1.3.0/docs/flagship-certification.md +101 -0
  21. axquant-1.3.0/docs/known-issues.md +81 -0
  22. axquant-1.3.0/docs/migration-v1.1.md +74 -0
  23. axquant-1.3.0/docs/migration-v1.2.md +66 -0
  24. axquant-1.3.0/docs/model-fleet-v2.md +214 -0
  25. axquant-1.3.0/docs/roadmap/README.md +29 -0
  26. axquant-1.3.0/docs/roadmap/adr/0001-certification-freeze-discipline.md +40 -0
  27. axquant-1.3.0/docs/roadmap/adr/0002-gptq-act-order.md +53 -0
  28. axquant-1.3.0/docs/roadmap/adr/0003-kernel-latency-aware-cost-model.md +53 -0
  29. axquant-1.3.0/docs/roadmap/adr/0004-holdout-safe-interaction-optimization.md +48 -0
  30. axquant-1.3.0/docs/roadmap/adr/0005-sidecar-and-tower-quantization-scope.md +44 -0
  31. axquant-1.3.0/docs/roadmap/adr/0006-out-of-scope-tracks.md +42 -0
  32. axquant-1.3.0/docs/roadmap/implementation-plan.md +173 -0
  33. axquant-1.3.0/docs/roadmap/prd.md +173 -0
  34. axquant-1.3.0/docs/roadmap/tech-spec.md +240 -0
  35. axquant-1.3.0/examples/agent-protected.yaml +43 -0
  36. axquant-1.3.0/examples/benchmark-evidence-request.yaml +30 -0
  37. axquant-1.3.0/examples/expert-memory-tier-v0.1.yaml +77 -0
  38. axquant-1.3.0/examples/hardware-registry-request.yaml +18 -0
  39. axquant-1.3.0/examples/mtp-diagnose-request.yaml +50 -0
  40. axquant-1.3.0/examples/qwen36-27b-manual-v0.1.yaml +35 -0
  41. axquant-1.3.0/examples/qwen36-compatibility-request.yaml +20 -0
  42. axquant-1.3.0/examples/qwen36-experimental-2bit-v0.1.yaml +67 -0
  43. axquant-1.3.0/examples/refinement-execution-request.yaml +24 -0
  44. axquant-1.3.0/examples/release-audit-request.yaml +19 -0
  45. axquant-1.3.0/examples/release-validation-request.yaml +8 -0
  46. axquant-1.3.0/pyproject.toml +102 -0
  47. axquant-1.3.0/scripts/ci-local.sh +94 -0
  48. axquant-1.3.0/scripts/hf_to_mlx_bf16.py +270 -0
  49. axquant-1.3.0/scripts/index-ext4t-packages.py +370 -0
  50. axquant-1.3.0/scripts/migrate-to-ext4t.sh +404 -0
  51. axquant-1.3.0/scripts/plan-ext4t-from-index.py +590 -0
  52. axquant-1.3.0/scripts/prepare_development_model_card.py +30 -0
  53. axquant-1.3.0/scripts/setup-ext4t-hf.sh +449 -0
  54. axquant-1.3.0/scripts/studio-finalize-ext4t-layout.sh +189 -0
  55. axquant-1.3.0/scripts/sync-ext4t-hf-fleet.sh +531 -0
  56. axquant-1.3.0/scripts/sync-ext4t-peers.sh +363 -0
  57. axquant-1.3.0/src/axquant/__init__.py +5 -0
  58. axquant-1.3.0/src/axquant/__main__.py +3 -0
  59. axquant-1.3.0/src/axquant/activation_cache.py +512 -0
  60. axquant-1.3.0/src/axquant/analyzer.py +141 -0
  61. axquant-1.3.0/src/axquant/architectures/__init__.py +4 -0
  62. axquant-1.3.0/src/axquant/architectures/dense_family.py +419 -0
  63. axquant-1.3.0/src/axquant/architectures/nemotron3.py +156 -0
  64. axquant-1.3.0/src/axquant/architectures/qwen36.py +141 -0
  65. axquant-1.3.0/src/axquant/architectures/registry.py +105 -0
  66. axquant-1.3.0/src/axquant/architectures/types.py +19 -0
  67. axquant-1.3.0/src/axquant/artifact_paths.py +67 -0
  68. axquant-1.3.0/src/axquant/awq.py +271 -0
  69. axquant-1.3.0/src/axquant/benchmark.py +1532 -0
  70. axquant-1.3.0/src/axquant/benchmark_evidence.py +347 -0
  71. axquant-1.3.0/src/axquant/calibration.py +92 -0
  72. axquant-1.3.0/src/axquant/calibration_dataset.py +107 -0
  73. axquant-1.3.0/src/axquant/campaign.py +955 -0
  74. axquant-1.3.0/src/axquant/capture.py +818 -0
  75. axquant-1.3.0/src/axquant/capture_binding.py +150 -0
  76. axquant-1.3.0/src/axquant/certification/__init__.py +18 -0
  77. axquant-1.3.0/src/axquant/certification/common.py +226 -0
  78. axquant-1.3.0/src/axquant/certification/dispatch.py +75 -0
  79. axquant-1.3.0/src/axquant/certification/flagship.py +852 -0
  80. axquant-1.3.0/src/axquant/certification/packaging.py +123 -0
  81. axquant-1.3.0/src/axquant/certification/policy.py +26 -0
  82. axquant-1.3.0/src/axquant/certification/qwen3_next_direct.py +1832 -0
  83. axquant-1.3.0/src/axquant/certification/registry.py +127 -0
  84. axquant-1.3.0/src/axquant/claims.py +311 -0
  85. axquant-1.3.0/src/axquant/cli/__init__.py +2349 -0
  86. axquant-1.3.0/src/axquant/cli/_parser.py +1354 -0
  87. axquant-1.3.0/src/axquant/coding_sandbox.py +992 -0
  88. axquant-1.3.0/src/axquant/coding_suite.py +919 -0
  89. axquant-1.3.0/src/axquant/compatibility.py +380 -0
  90. axquant-1.3.0/src/axquant/converter.py +1436 -0
  91. axquant-1.3.0/src/axquant/data/__init__.py +0 -0
  92. axquant-1.3.0/src/axquant/data/convert_ladders.yaml +85 -0
  93. axquant-1.3.0/src/axquant/data/messages.yaml +18 -0
  94. axquant-1.3.0/src/axquant/data/profiles.yaml +118 -0
  95. axquant-1.3.0/src/axquant/data/quantizer_defaults.yaml +13 -0
  96. axquant-1.3.0/src/axquant/data/reference_calibration.jsonl +160 -0
  97. axquant-1.3.0/src/axquant/data/role_preferences.yaml +26 -0
  98. axquant-1.3.0/src/axquant/dataset_overlap.py +194 -0
  99. axquant-1.3.0/src/axquant/deferred.py +68 -0
  100. axquant-1.3.0/src/axquant/direct_quality.py +185 -0
  101. axquant-1.3.0/src/axquant/dwq.py +43 -0
  102. axquant-1.3.0/src/axquant/errors.py +50 -0
  103. axquant-1.3.0/src/axquant/experimental_bits.py +93 -0
  104. axquant-1.3.0/src/axquant/feasibility.py +583 -0
  105. axquant-1.3.0/src/axquant/gptq.py +347 -0
  106. axquant-1.3.0/src/axquant/hardware_registry.py +842 -0
  107. axquant-1.3.0/src/axquant/head_to_head.py +228 -0
  108. axquant-1.3.0/src/axquant/identity.py +155 -0
  109. axquant-1.3.0/src/axquant/inspector.py +654 -0
  110. axquant-1.3.0/src/axquant/kernel_latency.py +214 -0
  111. axquant-1.3.0/src/axquant/kv_exec.py +139 -0
  112. axquant-1.3.0/src/axquant/kv_probe.py +417 -0
  113. axquant-1.3.0/src/axquant/kv_quality.py +60 -0
  114. axquant-1.3.0/src/axquant/ladders.py +180 -0
  115. axquant-1.3.0/src/axquant/lifecycle.py +102 -0
  116. axquant-1.3.0/src/axquant/logging.py +22 -0
  117. axquant-1.3.0/src/axquant/manual.py +344 -0
  118. axquant-1.3.0/src/axquant/model_card.py +808 -0
  119. axquant-1.3.0/src/axquant/module_paths.py +199 -0
  120. axquant-1.3.0/src/axquant/mtp_sidecar.py +841 -0
  121. axquant-1.3.0/src/axquant/multimodal_backend.py +181 -0
  122. axquant-1.3.0/src/axquant/naming.py +106 -0
  123. axquant-1.3.0/src/axquant/numeric.py +39 -0
  124. axquant-1.3.0/src/axquant/package_data.py +52 -0
  125. axquant-1.3.0/src/axquant/pareto.py +79 -0
  126. axquant-1.3.0/src/axquant/planner.py +920 -0
  127. axquant-1.3.0/src/axquant/predicate.py +247 -0
  128. axquant-1.3.0/src/axquant/probe.py +1282 -0
  129. axquant-1.3.0/src/axquant/probe_capacity.py +261 -0
  130. axquant-1.3.0/src/axquant/profiles.py +55 -0
  131. axquant-1.3.0/src/axquant/publisher.py +672 -0
  132. axquant-1.3.0/src/axquant/quality.py +462 -0
  133. axquant-1.3.0/src/axquant/quantize.py +297 -0
  134. axquant-1.3.0/src/axquant/quantizers.py +786 -0
  135. axquant-1.3.0/src/axquant/recipes.py +234 -0
  136. axquant-1.3.0/src/axquant/recovery.py +392 -0
  137. axquant-1.3.0/src/axquant/refinement.py +1354 -0
  138. axquant-1.3.0/src/axquant/refinement_runner.py +611 -0
  139. axquant-1.3.0/src/axquant/release_audit.py +2109 -0
  140. axquant-1.3.0/src/axquant/release_exceptions.py +244 -0
  141. axquant-1.3.0/src/axquant/release_validation.py +151 -0
  142. axquant-1.3.0/src/axquant/reporting.py +1018 -0
  143. axquant-1.3.0/src/axquant/reproduction.py +285 -0
  144. axquant-1.3.0/src/axquant/revisions.py +11 -0
  145. axquant-1.3.0/src/axquant/role_policy.py +163 -0
  146. axquant-1.3.0/src/axquant/runtime.py +803 -0
  147. axquant-1.3.0/src/axquant/schema/__init__.py +535 -0
  148. axquant-1.3.0/src/axquant/schema/_base.py +27 -0
  149. axquant-1.3.0/src/axquant/schema/artifacts.py +2054 -0
  150. axquant-1.3.0/src/axquant/schema/campaign.py +647 -0
  151. axquant-1.3.0/src/axquant/schema/certification.py +844 -0
  152. axquant-1.3.0/src/axquant/schema/claims.py +116 -0
  153. axquant-1.3.0/src/axquant/schema/coding_suite.py +184 -0
  154. axquant-1.3.0/src/axquant/schema/enums.py +167 -0
  155. axquant-1.3.0/src/axquant/schema/flagship.py +55 -0
  156. axquant-1.3.0/src/axquant/schema/flagship_audit.py +276 -0
  157. axquant-1.3.0/src/axquant/schema/inventory.py +104 -0
  158. axquant-1.3.0/src/axquant/schema/kernel_latency.py +117 -0
  159. axquant-1.3.0/src/axquant/schema/lifecycle.py +189 -0
  160. axquant-1.3.0/src/axquant/schema/planning.py +747 -0
  161. axquant-1.3.0/src/axquant/schema/sensitivity.py +303 -0
  162. axquant-1.3.0/src/axquant/scoreboard.py +525 -0
  163. axquant-1.3.0/src/axquant/serde.py +156 -0
  164. axquant-1.3.0/src/axquant/simple_convert.py +305 -0
  165. axquant-1.3.0/src/axquant/source_prep.py +491 -0
  166. axquant-1.3.0/src/axquant/suites.py +329 -0
  167. axquant-1.3.0/src/axquant/support_policy.py +252 -0
  168. axquant-1.3.0/src/axquant/unified_sensitivity.py +192 -0
  169. axquant-1.3.0/src/axquant/validator.py +696 -0
  170. axquant-1.3.0/src/axquant/versioning.py +70 -0
  171. axquant-1.3.0/tests/_capture_helpers.py +73 -0
  172. axquant-1.3.0/tests/conftest.py +146 -0
  173. axquant-1.3.0/tests/test_activation_cache.py +561 -0
  174. axquant-1.3.0/tests/test_analyzer.py +85 -0
  175. axquant-1.3.0/tests/test_architectures.py +594 -0
  176. axquant-1.3.0/tests/test_artifact_paths.py +36 -0
  177. axquant-1.3.0/tests/test_awq.py +139 -0
  178. axquant-1.3.0/tests/test_benchmark.py +1103 -0
  179. axquant-1.3.0/tests/test_benchmark_evidence.py +458 -0
  180. axquant-1.3.0/tests/test_calibration.py +104 -0
  181. axquant-1.3.0/tests/test_campaign.py +1024 -0
  182. axquant-1.3.0/tests/test_capture.py +761 -0
  183. axquant-1.3.0/tests/test_certification_dispatch.py +151 -0
  184. axquant-1.3.0/tests/test_claims.py +180 -0
  185. axquant-1.3.0/tests/test_cli.py +521 -0
  186. axquant-1.3.0/tests/test_coding_suite.py +595 -0
  187. axquant-1.3.0/tests/test_compatibility.py +559 -0
  188. axquant-1.3.0/tests/test_converter.py +1464 -0
  189. axquant-1.3.0/tests/test_dataset_overlap.py +103 -0
  190. axquant-1.3.0/tests/test_documentation.py +123 -0
  191. axquant-1.3.0/tests/test_dwq.py +42 -0
  192. axquant-1.3.0/tests/test_eval_datasets.py +37 -0
  193. axquant-1.3.0/tests/test_experimental_bits_qp3.py +221 -0
  194. axquant-1.3.0/tests/test_ext4t_index_plan.py +305 -0
  195. axquant-1.3.0/tests/test_feasibility.py +556 -0
  196. axquant-1.3.0/tests/test_flagship_release_audit.py +871 -0
  197. axquant-1.3.0/tests/test_gptq.py +311 -0
  198. axquant-1.3.0/tests/test_hardware_registry.py +559 -0
  199. axquant-1.3.0/tests/test_head_to_head.py +209 -0
  200. axquant-1.3.0/tests/test_hf_to_mlx_bf16.py +146 -0
  201. axquant-1.3.0/tests/test_identity.py +167 -0
  202. axquant-1.3.0/tests/test_inspector.py +654 -0
  203. axquant-1.3.0/tests/test_integration_mac.py +339 -0
  204. axquant-1.3.0/tests/test_integration_pipeline.py +209 -0
  205. axquant-1.3.0/tests/test_kernel_latency.py +198 -0
  206. axquant-1.3.0/tests/test_kv_exec.py +31 -0
  207. axquant-1.3.0/tests/test_kv_probe.py +654 -0
  208. axquant-1.3.0/tests/test_kv_quality.py +251 -0
  209. axquant-1.3.0/tests/test_lifecycle.py +187 -0
  210. axquant-1.3.0/tests/test_manual.py +315 -0
  211. axquant-1.3.0/tests/test_model_card.py +418 -0
  212. axquant-1.3.0/tests/test_mtp_sidecar.py +569 -0
  213. axquant-1.3.0/tests/test_naming.py +44 -0
  214. axquant-1.3.0/tests/test_p0_p1_p2_productization.py +351 -0
  215. axquant-1.3.0/tests/test_package_data.py +74 -0
  216. axquant-1.3.0/tests/test_packaging.py +69 -0
  217. axquant-1.3.0/tests/test_pareto.py +206 -0
  218. axquant-1.3.0/tests/test_planner.py +804 -0
  219. axquant-1.3.0/tests/test_predicate.py +485 -0
  220. axquant-1.3.0/tests/test_probe.py +925 -0
  221. axquant-1.3.0/tests/test_profiles.py +20 -0
  222. axquant-1.3.0/tests/test_publication_privacy.py +134 -0
  223. axquant-1.3.0/tests/test_publisher.py +637 -0
  224. axquant-1.3.0/tests/test_quality.py +248 -0
  225. axquant-1.3.0/tests/test_quality_checks.py +120 -0
  226. axquant-1.3.0/tests/test_quantize.py +276 -0
  227. axquant-1.3.0/tests/test_quantizers.py +334 -0
  228. axquant-1.3.0/tests/test_qwen3_next_certification_schema.py +313 -0
  229. axquant-1.3.0/tests/test_qwen3_next_release_audit.py +1680 -0
  230. axquant-1.3.0/tests/test_recipe_bundle.py +354 -0
  231. axquant-1.3.0/tests/test_recovery_qp2.py +369 -0
  232. axquant-1.3.0/tests/test_reference_dataset.py +95 -0
  233. axquant-1.3.0/tests/test_refinement.py +1012 -0
  234. axquant-1.3.0/tests/test_refinement_runner.py +307 -0
  235. axquant-1.3.0/tests/test_release_audit.py +2189 -0
  236. axquant-1.3.0/tests/test_release_exceptions.py +302 -0
  237. axquant-1.3.0/tests/test_release_validation.py +373 -0
  238. axquant-1.3.0/tests/test_reporting.py +1356 -0
  239. axquant-1.3.0/tests/test_revisions.py +13 -0
  240. axquant-1.3.0/tests/test_role_policy_qp1.py +458 -0
  241. axquant-1.3.0/tests/test_runtime.py +941 -0
  242. axquant-1.3.0/tests/test_scoreboard.py +294 -0
  243. axquant-1.3.0/tests/test_serde.py +115 -0
  244. axquant-1.3.0/tests/test_simple_convert.py +241 -0
  245. axquant-1.3.0/tests/test_source_prep.py +321 -0
  246. axquant-1.3.0/tests/test_suites.py +83 -0
  247. axquant-1.3.0/tests/test_support_policy.py +123 -0
  248. axquant-1.3.0/tests/test_validator.py +464 -0
  249. axquant-1.3.0/tests/test_versioning.py +46 -0
  250. axquant-1.3.0/tests/test_workflows.py +40 -0
@@ -0,0 +1,62 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ jobs:
13
+ lint:
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - uses: actions/checkout@v7
17
+ - uses: actions/setup-python@v7
18
+ with:
19
+ python-version: "3.13"
20
+ - name: Install dev dependencies
21
+ run: pip install -e ".[dev]"
22
+ - name: Ruff lint
23
+ run: ruff check .
24
+ - name: Ruff format
25
+ run: ruff format --check .
26
+ - name: mypy
27
+ run: mypy src
28
+
29
+ python-compatibility:
30
+ runs-on: ubuntu-latest
31
+ strategy:
32
+ fail-fast: false
33
+ matrix:
34
+ python-version: ["3.11", "3.12", "3.13"]
35
+ steps:
36
+ - uses: actions/checkout@v7
37
+ - uses: actions/setup-python@v7
38
+ with:
39
+ python-version: ${{ matrix.python-version }}
40
+ - name: Install dev dependencies
41
+ run: pip install -e ".[dev]"
42
+ - name: Run non-MLX tests
43
+ run: pytest -m "not integration"
44
+
45
+ test:
46
+ runs-on: macos-14
47
+ steps:
48
+ - uses: actions/checkout@v7
49
+ - uses: actions/setup-python@v7
50
+ with:
51
+ python-version: "3.13"
52
+ - name: Install with MLX extras
53
+ run: pip install -e ".[dev,mlx]"
54
+ - name: Run test suite
55
+ run: pytest -m "not integration"
56
+ - name: Run real-hardware integration suite
57
+ run: |
58
+ if test -f tests/test_integration_mac.py; then
59
+ pytest -m integration
60
+ else
61
+ echo "No tracked real-hardware integration tests yet"
62
+ fi
@@ -0,0 +1,112 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags: ["v*"]
6
+
7
+ jobs:
8
+ dist:
9
+ runs-on: ubuntu-latest
10
+ permissions:
11
+ attestations: write
12
+ contents: write
13
+ id-token: write
14
+ steps:
15
+ - uses: actions/checkout@v7
16
+ - uses: actions/setup-python@v7
17
+ with:
18
+ python-version: "3.13"
19
+ - name: Verify tag matches package version
20
+ run: >-
21
+ python -c 'import os, tomllib; version =
22
+ tomllib.load(open("pyproject.toml", "rb"))["project"]["version"];
23
+ tag = os.environ["GITHUB_REF_NAME"];
24
+ assert tag == f"v{version}", f"tag {tag!r} does not match package v{version}"'
25
+ - name: Build sdist and wheel
26
+ run: |
27
+ pip install build
28
+ python -m build
29
+ - name: Generate SHA256SUMS
30
+ run: |
31
+ cd dist
32
+ shasum -a 256 -- * > SHA256SUMS.txt
33
+ - name: Attest build provenance
34
+ uses: actions/attest-build-provenance@v4
35
+ with:
36
+ subject-path: "dist/*"
37
+ - name: Extract curated release notes from CHANGELOG.md
38
+ run: >-
39
+ python -c 'import os, pathlib, re; version =
40
+ os.environ["GITHUB_REF_NAME"].removeprefix("v");
41
+ text = pathlib.Path("CHANGELOG.md").read_text(encoding="utf-8");
42
+ m = re.search(rf"^## \[{re.escape(version)}\][^\n]*\n(.*?)(?=^## \[|\Z)",
43
+ text, re.S | re.M);
44
+ assert m and m.group(1).strip(),
45
+ f"CHANGELOG.md has no notes section for {version}";
46
+ pathlib.Path("release-notes.md").write_text(m.group(1).strip() + "\n",
47
+ encoding="utf-8")'
48
+ - name: Upload artifacts to the GitHub Release
49
+ run: |
50
+ gh release view "${GITHUB_REF_NAME}" >/dev/null 2>&1 || \
51
+ gh release create "${GITHUB_REF_NAME}" --verify-tag \
52
+ --title "${GITHUB_REF_NAME}" --notes-file release-notes.md
53
+ gh release edit "${GITHUB_REF_NAME}" --title "${GITHUB_REF_NAME}"
54
+ gh release upload "${GITHUB_REF_NAME}" dist/* --clobber
55
+ env:
56
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
57
+ - name: Hand dists to the publish job
58
+ uses: actions/upload-artifact@v7
59
+ with:
60
+ name: dist
61
+ path: dist/*
62
+ retention-days: 1
63
+ - name: Note PyPI publish gate
64
+ run: |
65
+ if [ "${{ vars.ENABLE_PYPI_PUBLISH }}" = "true" ]; then
66
+ echo "ENABLE_PYPI_PUBLISH=true — pypi job will run Trusted Publishing."
67
+ else
68
+ echo "ENABLE_PYPI_PUBLISH is not true — pypi job skipped."
69
+ echo "GitHub Release assets are still published by this dist job."
70
+ echo "After registering a Trusted Publisher on pypi.org for"
71
+ echo "defai-digital/axquant workflow release.yml, set the repository"
72
+ echo "variable ENABLE_PYPI_PUBLISH=true and re-run Release."
73
+ echo "See docs/ci-root-causes.md."
74
+ fi
75
+
76
+ # OIDC Trusted Publishing requires a matching publisher on pypi.org / test.pypi.org.
77
+ # Without that operator config, the exchange fails with invalid-publisher and reds
78
+ # every tag push even though GitHub Release assets already succeeded. Gate the job
79
+ # on repository variable ENABLE_PYPI_PUBLISH so Releases stay green until configured.
80
+ pypi:
81
+ needs: dist
82
+ if: ${{ vars.ENABLE_PYPI_PUBLISH == 'true' }}
83
+ runs-on: ubuntu-latest
84
+ permissions:
85
+ contents: read
86
+ id-token: write
87
+ steps:
88
+ - uses: actions/download-artifact@v8
89
+ with:
90
+ name: dist
91
+ path: dist
92
+ - name: Drop non-package files
93
+ run: rm -f dist/SHA256SUMS.txt
94
+ # Prerelease tags (vX.Y.ZrcN) go to TestPyPI; final tags go to PyPI.
95
+ - name: Publish to TestPyPI (prerelease)
96
+ if: contains(github.ref_name, 'rc')
97
+ uses: pypa/gh-action-pypi-publish@release/v1
98
+ with:
99
+ repository-url: https://test.pypi.org/legacy/
100
+ - name: Publish to PyPI
101
+ if: ${{ !contains(github.ref_name, 'rc') }}
102
+ uses: pypa/gh-action-pypi-publish@release/v1
103
+ - name: Trusted publisher guidance
104
+ if: failure()
105
+ run: |
106
+ cat <<'EOF'
107
+ PyPI Trusted Publishing failed (invalid-publisher is usually missing config).
108
+ Register a Trusted Publisher on pypi.org / test.pypi.org for:
109
+ owner=defai-digital repo=axquant workflow=release.yml
110
+ Environment: leave empty (this job does not set one).
111
+ Then keep ENABLE_PYPI_PUBLISH=true. Details: docs/ci-root-causes.md
112
+ EOF
@@ -0,0 +1,26 @@
1
+ .DS_Store
2
+ .coverage
3
+ .mypy_cache/
4
+ .pytest_cache/
5
+ .ruff_cache/
6
+ .venv/
7
+ .qoder/
8
+ .vscode/
9
+ .claude/
10
+ __pycache__/
11
+ build/
12
+ dist/
13
+ *.egg-info/
14
+ *.py[cod]
15
+ *.safetensors
16
+ *.gguf
17
+ *.npz
18
+ .env
19
+ credentials.json
20
+ # Local-only product/engineering notes and scratch (never publish).
21
+ .internal/
22
+ **/.internal/
23
+ # Agent convention docs (internal only; not published to GitHub).
24
+ AGENTS.md
25
+ Agents.md
26
+ agents.md
@@ -0,0 +1,291 @@
1
+ # Changelog
2
+
3
+ All notable changes to AXQuant are documented here. The format follows
4
+ [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and the project uses
5
+ [Semantic Versioning](https://semver.org/spec/v2.0.0.html). The release workflow extracts the
6
+ matching section from this file as the curated GitHub Release notes and fails the release when
7
+ the section is missing — add an entry in the same change as any user-facing modification.
8
+
9
+ ## [Unreleased]
10
+
11
+ ## [1.3.0] - 2026-08-06
12
+
13
+ ### Added
14
+
15
+ - Group-preserving GPTQ act-order as the new `gptq-act` method (ADR-0002): groups process in
16
+ descending Hessian-mass order and columns by Hessian diagonal, while group membership and the
17
+ portable affine packed layout stay byte-compatible with static-grid GPTQ. Registered as a
18
+ distinct probe/plan/convert method label so the measured frontier — not the literature —
19
+ decides adoption per tensor.
20
+ - Measured-holdout-safe interaction optimization (`optimize_candidate_interactions`, ADR-0004):
21
+ complete-candidate selection driven by measured evaluations on development dataset roles,
22
+ with a fail-closed guard that rejects formal-holdout or missing `dataset_role` provenance and
23
+ a separate `interaction_measurement_set_sha256` binding so the formal holdout binding stays
24
+ free for final selection.
25
+ - Kernel-latency-aware planning (ADR-0003): `benchmark-kernels` measures decode/prefill GEMM
26
+ latency per (bits, group size) on the current host into a host-scoped
27
+ `axquant.kernel-latency.v1` table; `plan --latency-table` re-ranks candidates by measured
28
+ kernel speed strictly inside the quality near-tie window and records
29
+ `cost_model` / `kernel_latency_sha256` / host provenance on the plan. Without a table,
30
+ planning is bit-identical to before.
31
+ - Method near-tie surfacing (RM-14): plans record `method_near_ties` (capped, most fragile
32
+ first, with an explicit omitted count) wherever a losing packing method lands within the
33
+ configurable `method_near_tie_epsilon` of the winner at the same storage key.
34
+ - Report-only measured-KV serving-quality artifact (`axquant.kv-serving-quality.v1`, RM-21):
35
+ binds the executed per-layer KV plan digest to dual-profile short/long-context quality
36
+ retention versus BF16 KV, and fails closed unless the mlx-lm-kv runtime check proved exact
37
+ per-layer execution.
38
+ - Formal MTP A/B admissibility (`formal_mtp_bundle_issues`, RM-20): an MTP off/on evaluation
39
+ pair is authorizing only when both halves bind the frozen formal-host contract (device, chip,
40
+ OS, power mode), share identical controls, datasets, seeds, and checkpoint, and report zero
41
+ kernel fallbacks.
42
+ - Opt-in quantized MTP sidecar (`quantize_qwen36_mtp_sidecar`, ADR-0005): a separate
43
+ `axquant-portable-affine-u8` artifact emitted alongside the untouched byte-preserved default,
44
+ gated on a recorded passing AX Engine capability check for the quantized MTP layout.
45
+ - End-to-end CLI and audit wiring for the new evidence paths: `refine-select --interaction`
46
+ runs the holdout-safe interaction selection; `quantize-mtp-sidecar` executes a live AX Engine
47
+ capability probe (`--capability-command`, subprocess JSON contract) or consumes a recorded
48
+ check (`--capability-result`) before emitting the quantized sidecar; `kv-serving-quality`
49
+ builds the report-only KV artifact from an executed plan, kv_exec summary, and measured
50
+ results; and the flagship M7 gate now loads both MTP A/B bundles from the release validation
51
+ chain and enforces `formal_mtp_bundle_issues` against the frozen `mbp-m5` contract and the
52
+ digest-bound hardware-registry device identity.
53
+
54
+ ### Changed
55
+
56
+ - Experimental 2/3-bit assignment is restricted to robust-trunk tensor classes (MLP and expert
57
+ projections, RM-42); attention and all protected roles keep 4-bit-and-up candidates, and
58
+ experimental plans now list every low-bit tensor with its predicted loss in the plan warnings.
59
+ - The default hardware profile is `ax-engine-apple-silicon-affine-dwq-v3`, adding `gptq-act`
60
+ to the supported method set. Previously serialized plans keep their recorded v2 profile.
61
+
62
+ - Qwen3-ASR 1.7B and Qwen3-VL 8B Instruct text-path conversion through public MLX-Audio and
63
+ MLX-VLM APIs, protected BF16 modality towers, architecture-specific runtime metadata, media
64
+ generation smokes, and four stable-name AXQ v2 development repositories.
65
+ - Revision-pinned Qwen3-ASR BF16 normalization in `scripts/hf_to_mlx_bf16.py`; the helper forces
66
+ the public MLX-Audio STT backend and records the key/layout remap in `axquant_source.json`.
67
+ - Explicit development-artifact edition metadata and the completed 28-repository AXQ v2
68
+ migration from 14 immutable sources. Stable repository names now serve receipt-bound v2
69
+ revisions on `main` and tag `v2`, while `legacy-pre-v2` preserves each replaced artifact.
70
+ Every promoted revision passed pre/post-upload MLX-LM checks, reverified Hub trees and hashes,
71
+ evidence-safe sibling links/model-card metadata, and a verified stable-name catalog entry.
72
+ - Additive `qwen36-mtp-v2` flagship certification contracts: path-neutral `CheckpointKey` and
73
+ `CandidateKey`, frozen campaigns with disjoint dataset roles, exact-`mbp-m5` preflight,
74
+ formal-cycle/holdout consumption state, durable archive proof, independent review, clean-host
75
+ reproduction review, a separate final publication-claim review, and final M0–M8 dispatch.
76
+ - Append-only artifact lifecycle events and semantic impact scans. Certified candidates become
77
+ ineligible for certified rendering/publication after `superseded` or `revoked`.
78
+ - Deterministic measured-BPW certified naming, bound public metric claims, and generated
79
+ certified model cards.
80
+ - CLI commands `campaign-freeze`, `campaign-preflight`, `campaign-start-formal`,
81
+ `campaign-complete-formal`, `campaign-close-no-go`, `campaign-overlap`,
82
+ `campaign-frontier`, `campaign-record-publication`, `artifact-lifecycle`, and `claim-render`.
83
+ - Checksum-bound cheapest-failure-first frontier/no-go records and formal raw-evidence/custodian
84
+ attestations, so candidate selection, formal failure, and no-feasible-candidate closure are
85
+ evidence-backed rather than boolean declarations.
86
+ - Downloaded publication inventory and runtime-verification records; `published` campaign state is
87
+ unreachable until the exact Hub revision, checkpoint bytes, final audit, claim, lifecycle,
88
+ AX Engine/MLX-LM smokes, and zero-fallback result are reverified.
89
+ - A fail-closed flagship publication privacy scan for credentials, private host/path data,
90
+ oversized or invalid text evidence, sensitive filenames, and formal raw holdout files. It
91
+ rechecks the exact post-packaging tree and scans legitimate large `tokenizer.json` assets
92
+ without treating them as oversized evidence.
93
+ - A non-symlinked durable-root boundary for the complete campaign/state-transition tree and
94
+ six-part formal-host evidence whose results bind the exact frozen `mbp-m5` contract.
95
+
96
+ ### Fixed
97
+
98
+ - Qwen3-ASR inspection now rejects the unnormalized upstream `thinker.*` layout for planning and
99
+ conversion instead of counting its duplicated tied LM head as an independently convertible
100
+ tensor. The error points to the pinned BF16 normalization helper.
101
+ - Multimodal runtime smokes require real transcript/image-generation output: ASR no longer passes
102
+ on log text without a transcript, VLM runs non-verbose, and simple conversion rejects a smoke
103
+ from the wrong architecture backend before conversion.
104
+ - Qwen3-ASR and Qwen3-VL model-card commands now use MLX-Audio's required `--output-path` and
105
+ MLX-VLM's supported `--temperature` option.
106
+ - Converted-checkpoint verification now accepts only documented MLX-LM output identities:
107
+ one-to-one wrapper aliases, Qwen packed gate/up one-to-many splits, contiguous indexed-expert
108
+ many-to-one stacks, and the exact Qwen 3.5/Qwen3-Next/Nemotron-H `Conv1d` sanitize-axis
109
+ transforms. Membership, precision, parameter count, metadata, and shapes remain fail-closed.
110
+ - Budget allocation preserves the deterministic marginal-gain order with a priority queue instead
111
+ of rescanning every tensor after every upgrade, removing quadratic planning time on
112
+ 74,000-tensor Qwen3-Coder-Next checkpoints.
113
+ - The AXQ v2 migration uses immutable Mistral-published BF16 sources and materializes only
114
+ `model.safetensors.index.json`-bound shards when upstream also ships a redundant consolidated
115
+ checkpoint; AXQuant's unindexed-Safetensors rejection remains strict.
116
+ - Development cards no longer advertise an AX Engine serve path when the package has no validated
117
+ native `model-manifest.json`; MLX-LM remains the documented standard text/backbone path.
118
+ - Qwen3 Embedding development cards link their real stable-name 4-bit/8-bit siblings instead of
119
+ a nonexistent 6-bit variant.
120
+ - Release-bound identity comparisons ignore absolute `local_path` while preserving it as
121
+ execution provenance; checkpoint/candidate byte digests still fail closed on content drift.
122
+ - Generation-smoke no longer requires the `mlx_lm` Python package; advisory KV / runtime
123
+ metadata is validated before install gates so Ubuntu non-MLX CI matches Mac developer paths.
124
+ - Gemma4 sharded source prep validates index shard paths and types before importing MLX.
125
+ - mypy on the Ubuntu lint job ignores missing optional `mlx` / `mlx_lm` / `transformers`
126
+ modules (they are only installed via `axquant[mlx]`).
127
+
128
+ ### Changed
129
+
130
+ - Existing `4bit`/`6bit` repository names remain development identifiers. A certified flagship
131
+ must use generated `MP-<measured-main-BPW>bpw[-MTP]` naming and cannot downgrade to the
132
+ historical Qwen 3.6 v4 audit/publisher path.
133
+ - CI and release workflows use current Node 24 GitHub Actions majors and grant permissions
134
+ per job, reducing deprecated-runtime warnings while keeping PyPI OIDC and build provenance
135
+ least-privilege.
136
+ - Documented historical Actions red-run root causes and added `scripts/ci-local.sh` to mirror
137
+ CI gates (including PATH-isolated non-MLX pytest) before push.
138
+ - Release `pypi` job is gated on repository variable `ENABLE_PYPI_PUBLISH=true` so tag
139
+ Releases succeed with GitHub assets when Trusted Publishing is not yet configured on
140
+ pypi.org (set the variable only after registering a publisher).
141
+
142
+ ### Notes
143
+
144
+ - Real PyPI upload still requires a Trusted Publisher on pypi.org plus
145
+ `ENABLE_PYPI_PUBLISH=true` (operator steps in docs/ci-root-causes.md).
146
+ - Local-only engineering/product notes stay out of the published tree: force-added
147
+ certification docs were removed from git (still ignored on developer machines).
148
+
149
+ ## [1.2.0] - 2026-08-04
150
+
151
+ ### Added
152
+
153
+ - `analyze --capture-points`: measured probing on plain dense backbones (MiniCPM5, Qwen3 dense,
154
+ Mistral, …) via `--capture-points output`; the default `("output", "hidden")` fails closed
155
+ with a hint on those layouts.
156
+ - `refine --lm-head-floor`, matching `plan`; the governed `8bit` path still requires measured
157
+ support.
158
+ - Structured `mtp_sidecar_bits` runtime contracts in copied (byte-preserved) MTP sidecar
159
+ metadata.
160
+ - New evaluation task categories: JSON, tool-use, multilingual, and long-context.
161
+
162
+ ### Changed
163
+
164
+ - Calibration evidence is checksum-bound end to end: AWQ/GPTQ analysis records the
165
+ activation-capture manifest digest, tokenized-cache manifest digest, cache key, and dataset
166
+ ID; the planner carries the bindings; conversion rejects a mismatched capture and packages
167
+ `activation_capture_manifest.json` with the checkpoint; publication preparation and release
168
+ audit independently revalidate it.
169
+ - Completed capture directories are immutable (`completion.json` present → no overwrite), and
170
+ every committed resume chunk is validated against checkpoint row accounting.
171
+ - `scripts/hf_to_mlx_bf16.py` requires `--revision <40-char SHA>`, converts into a staging
172
+ directory, atomically renames on success, and writes `axquant_source.json` with the immutable
173
+ source identity.
174
+ - Mixed-precision plans are labeled by target BPW instead of inheriting a flat storage-class
175
+ name.
176
+
177
+ ### Fixed
178
+
179
+ - Qwen3-Next adapter: fused `switch_mlp`/`switch_glu` 3-D weights now classify as `expert`.
180
+ **Pre-fix artifacts may have retained most expert weights at BF16 and must be regenerated.**
181
+ - Capture resume now fails closed on binding drift (model, cache, `--max-rows`, segments, token
182
+ budget) instead of silently mixing runs.
183
+ - AWQ/GPTQ convert-time refinement no longer crashes on bfloat16 module weights (the default
184
+ dtype of real checkpoints).
185
+ - Affine/DWQ/AWQ quantizers build the per-group grid from the float16-stored scale (rounded
186
+ up, never down), restoring the documented ≤ scale/2 per-element round-trip bound.
187
+ - `plan`/`refine` inject BF16 for policy-preserved tensors (norms, LM head, vision) when 16 is
188
+ omitted from `--bits`, matching manual planning, instead of failing per tensor; manual
189
+ tied-weight harmonization now refreshes scale/outlier strategies and stored BPW.
190
+ - Feasibility audits require MTP evidence only from MTP-declaring architectures, making the
191
+ Qwen3-Next direct-track N0 gate satisfiable with tool-produced reports.
192
+ - Measured probe/KV-probe runs no longer abort when the calibration token count leaves a
193
+ single-token trailing replay batch.
194
+ - The `kv-exec` runtime check now fails when executed per-layer KV bits differ from the plan
195
+ (previously reported but not enforced), and benchmark trial timeouts kill the whole
196
+ AX Engine process group instead of orphaning the generation.
197
+ - MTP benchmark aggregates pair numerators and denominators over counter-reporting trials
198
+ only, instead of inflating `effective_tokens_per_forward` when some trials lack counters.
199
+ - `prepare_development_model_card` sanitizes the manifest's calibration reference along with
200
+ the plan's (local-path leak that also broke the release-audit M1 equality invariant).
201
+ - Release audit records issues instead of crashing on wheels missing `axquant/__init__.py`,
202
+ corrupt measurement-set or calibration files, and non-scalar benchmark metadata; hardware
203
+ registry checks record all-failed raw benchmarks instead of raising.
204
+ - `--kv-default-bits` rejects sub-policy-floor values (2/3) at parse time instead of failing
205
+ late in planning.
206
+ - `scripts/hf_to_mlx_bf16.py` writes the lm_head-synthesized shard aside and swaps atomically;
207
+ saving onto the mmap-backed source silently corrupted every tensor in the shard.
208
+ - Ext4T scripts: union-sync verification compares content only (mtime-only differences no
209
+ longer deadlock syncs), empty-array expansions no longer crash stock macOS bash 3.2 under
210
+ `set -u`, shell-config marker blocks no longer corrupt an rc file lacking a trailing
211
+ newline, live log/publish directories are moved aside before migrate-and-delete, and
212
+ `--status`/argument handling exit correctly.
213
+ - Architecture-gate errors and inventory warnings name the adapter registry instead of
214
+ hardcoding Qwen 3.6 (the checks were already registry-wide).
215
+ - Ext4T planning treats `axquant/logs` packages as host-local: layout moves only — no
216
+ cross-host mirroring, duplicate deletion, or fingerprint-driven renames of mutable log
217
+ trees; index loading reports the exact file and line for corrupt or incomplete records.
218
+
219
+ See the [v1.1.x → v1.2.0 migration guide](docs/migration-v1.2.md) for action items.
220
+
221
+ ## [1.1.1] - 2026-08-03
222
+
223
+ ### Added
224
+
225
+ - Resumable, compressed, shardable activation capture: `capture_progress.json` +
226
+ `activations/.partial/` resume, deflate-compressed npz output, `--segment-batches` and
227
+ `--modules-per-shard` controls.
228
+ - Real-hardware end-to-end integration tests (`pytest -m integration` on Apple Silicon).
229
+ - CI workflow (lint on Ubuntu, full MLX suite on `macos-14`) and a signed release workflow
230
+ (SHA256SUMS + keyless Sigstore attestation).
231
+ - Migration guide, environment compatibility matrix, and known-issues list under `docs/`.
232
+
233
+ ### Changed
234
+
235
+ - GPTQ peak memory cut ~30% at `in_features = 8192` (6.7 GB → 4.7 GB).
236
+
237
+ ### Fixed
238
+
239
+ - BF16 activations are cast inside MLX before numpy export in capture.
240
+ - `cosine_distance` is clamped to non-negative against float rounding.
241
+
242
+ ## [1.1.0] - 2026-08-03
243
+
244
+ ### Added
245
+
246
+ - GPTQ Hessian error-compensated weight refinement, wired through the conversion predicate and
247
+ the `convert` CLI.
248
+ - End-to-end AWQ: `capture-activations` records checksum-bound per-module Linear input
249
+ activations; measured AWQ/GPTQ probing via `analyze --calibration-activations`; planner
250
+ selection with the `gptq-hessian` scale strategy; convert-time refinement via
251
+ `convert --calibration-activations`.
252
+ - Development model card generation for published checkpoints.
253
+
254
+ ### Changed
255
+
256
+ - Python API renames: `convert_model(awq_activations=...)` → `calibration_activations=`,
257
+ `PlanPredicate.awq_metadata` → `method_metadata`; `load_capture_activations` returns a
258
+ mapping-compatible `LoadedActivationCapture`.
259
+ - Measured-probe backend moved to `axquant-mlx-isolated-probe-v6`; saved probe resume state
260
+ from older versions is rejected.
261
+
262
+ ## [1.0.2] - 2026-08-03
263
+
264
+ ### Added
265
+
266
+ - Qwen3-Embedding and Qwen3-Next / Coder-Next conversion support.
267
+ - HF → MLX BF16 helper script and an expanded Hub catalog in the README.
268
+
269
+ ## [1.0.1] - 2026-08-02
270
+
271
+ ### Fixed
272
+
273
+ - Protection-floor and path-safety gaps found on re-audit; six high-severity and three
274
+ medium-severity release-safety bugs.
275
+
276
+ ## [1.0.0] - 2026-08-01
277
+
278
+ ### Added
279
+
280
+ - Initial public release: inspect → calibrate → analyze → plan → convert → validate → publish
281
+ pipeline with checksum-bound artifacts, evidence gating, fail-closed conversion, family
282
+ adapters (Qwen 3.6 primary track, Qwen 3.5, Gemma-4, MiniCPM5, Mistral/Devstral, Mistral3,
283
+ Nemotron 3 Nano), and AX Engine runtime manifests.
284
+
285
+ [1.3.0]: https://github.com/defai-digital/axquant/compare/v1.2.0...v1.3.0
286
+ [1.2.0]: https://github.com/defai-digital/axquant/compare/v1.1.1...v1.2.0
287
+ [1.1.1]: https://github.com/defai-digital/axquant/compare/v1.1.0...v1.1.1
288
+ [1.1.0]: https://github.com/defai-digital/axquant/compare/v1.0.2...v1.1.0
289
+ [1.0.2]: https://github.com/defai-digital/axquant/compare/v1.0.1...v1.0.2
290
+ [1.0.1]: https://github.com/defai-digital/axquant/compare/v1.0.0...v1.0.1
291
+ [1.0.0]: https://github.com/defai-digital/axquant/releases/tag/v1.0.0
@@ -0,0 +1,94 @@
1
+ # Contributing to AXQuant
2
+
3
+ Contributions are warmly welcome. AXQuant exists to help Mac users get more reliable, efficient
4
+ local inference and a better overall experience on Apple Silicon. Bug fixes, documentation,
5
+ tests, usability improvements, runtime compatibility work, architecture adapters, and
6
+ reproducible quantization research can all move that goal forward.
7
+
8
+ First-time contributors are welcome too. If you are unsure where a change belongs, open a
9
+ [GitHub issue](https://github.com/defai-digital/axquant/issues) and describe what you want to
10
+ improve.
11
+
12
+ ## Fork and submit a pull request
13
+
14
+ 1. Fork [AXQuant](https://github.com/defai-digital/axquant) on GitHub.
15
+ 2. Create a focused branch in your fork.
16
+ 3. Set up the development environment and make your change.
17
+ 4. Add or update tests and documentation where appropriate.
18
+ 5. Run the checks below.
19
+ 6. Push your branch and open a pull request against `defai-digital/axquant`.
20
+
21
+ Small, well-scoped fixes can go directly to a pull request. For a substantial design change or a
22
+ new model family, please open an issue first so contributors can agree on scope, runtime support,
23
+ and the evidence needed for promotion.
24
+
25
+ ## Development setup
26
+
27
+ ```bash
28
+ python3.13 -m venv .venv
29
+ source .venv/bin/activate
30
+ python -m pip install -e ".[dev]"
31
+ ```
32
+
33
+ On Apple Silicon, install the optional MLX execution dependencies when your change needs them:
34
+
35
+ ```bash
36
+ python -m pip install -e ".[dev,mlx]"
37
+ ```
38
+
39
+ Most tests use small synthetic Safetensors fixtures and do not require model downloads or real
40
+ weights.
41
+
42
+ ## Run the checks
43
+
44
+ The local CI mirror is the preferred full check:
45
+
46
+ ```bash
47
+ ./scripts/ci-local.sh
48
+ ```
49
+
50
+ You can also run the checks individually:
51
+
52
+ ```bash
53
+ .venv/bin/ruff check .
54
+ .venv/bin/ruff format --check .
55
+ .venv/bin/mypy src
56
+ .venv/bin/pytest -m "not integration"
57
+ ```
58
+
59
+ Real-hardware tests require Apple Silicon and the MLX dependencies:
60
+
61
+ ```bash
62
+ .venv/bin/pytest -m integration
63
+ ```
64
+
65
+ ## Pull request guidance
66
+
67
+ A helpful pull request:
68
+
69
+ - explains what changed, why it helps users, and any known limitations;
70
+ - stays focused enough to review and test;
71
+ - includes tests for changed behavior and documentation for user-facing changes;
72
+ - reports the commands and hardware used for validation;
73
+ - labels architecture priors, measured evidence, runtime smokes, and certification claims
74
+ accurately; and
75
+ - does not include credentials, private paths, downloaded model weights, or local-only evidence.
76
+
77
+ Maintainers may ask for additional evidence when a change affects conversion correctness,
78
+ checkpoint compatibility, quality claims, or release gates.
79
+
80
+ ## Clean-room and evidence boundary
81
+
82
+ AXQuant is independently implemented against public MLX, MLX-LM, MLX-Audio, and MLX-VLM
83
+ interfaces. Contributions must not import, vendor, translate, or copy mlx-optiq implementation
84
+ code, tests, documentation, calibration data, or generated metadata.
85
+
86
+ New model families begin at the `inspect-only` support tier. Promotion requires real-checkpoint
87
+ classification, conversion, and runtime evidence. Architecture-prior output must never be
88
+ presented as measured sensitivity, and a successful conversion or runtime smoke must not be
89
+ presented as quality certification.
90
+
91
+ ## License
92
+
93
+ By submitting a contribution, you agree that it may be distributed under the project's
94
+ [MIT License](LICENSE).
axquant-1.3.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 AutomatosX / DEFAI Digital
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.