mtplx 2.12.2__tar.gz → 2.12.3__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 (1089) hide show
  1. {mtplx-2.12.2 → mtplx-2.12.3}/CHANGELOG.md +47 -0
  2. {mtplx-2.12.2 → mtplx-2.12.3}/PKG-INFO +1 -1
  3. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/attention_split.py +18 -0
  4. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/backends/gemma4_assistant.py +32 -12
  5. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/cache_bank/codec.py +24 -8
  6. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/cache_bank/cold_tier.py +119 -2
  7. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/cli.py +13 -1
  8. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/commands/forge.py +4 -1
  9. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/commands/public.py +33 -1
  10. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/constrained.py +93 -9
  11. mtplx-2.12.3/mtplx/dashboard/_static/assets/index-BtBFF4M2.css +1 -0
  12. mtplx-2.12.3/mtplx/dashboard/_static/assets/index-D8G5hadf.js +286 -0
  13. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/dashboard/_static/index.html +2 -2
  14. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/deepseek_mtp_patch.py +8 -1
  15. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/diagnostics.py +38 -0
  16. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/engine_session.py +217 -11
  17. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/errors.py +17 -0
  18. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/generation.py +260 -24
  19. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/models/qwen4_exp.py +15 -1
  20. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/one_copy.py +9 -2
  21. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/opencode.py +1 -0
  22. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/server/dashboard_state.py +5 -1
  23. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/server/flight_recorder.py +22 -2
  24. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/server/openai.py +822 -67
  25. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/server/request_policy.py +3 -0
  26. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/server/request_spans.py +13 -0
  27. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/server/responses.py +59 -8
  28. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/session_bank.py +189 -4
  29. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/thermal_sidecar.py +18 -0
  30. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/version.py +2 -2
  31. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx.egg-info/PKG-INFO +1 -1
  32. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx.egg-info/SOURCES.txt +38 -2
  33. {mtplx-2.12.2 → mtplx-2.12.3}/pyproject.toml +1 -1
  34. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/release_macos_v1.sh +29 -16
  35. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/sparkle_rehearsal_kit.sh +4 -2
  36. mtplx-2.12.3/tests/test_ar_prompt_state_commit.py +340 -0
  37. mtplx-2.12.3/tests/test_attention_split_gemma4.py +59 -0
  38. mtplx-2.12.3/tests/test_auto_mode_classifier.py +183 -0
  39. mtplx-2.12.3/tests/test_bank_history_policy_operator_override.py +115 -0
  40. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_cache_bank.py +71 -2
  41. mtplx-2.12.3/tests/test_claude_code_session_header.py +154 -0
  42. mtplx-2.12.3/tests/test_claude_code_side_requests.py +152 -0
  43. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_cold_tier_disk_usage_scan.py +1 -1
  44. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_cold_tier_incremental_encode.py +90 -11
  45. mtplx-2.12.3/tests/test_cold_tier_manifest_overview.py +101 -0
  46. mtplx-2.12.3/tests/test_cold_tier_restore_point_floor.py +159 -0
  47. mtplx-2.12.3/tests/test_cycle_policy_session_resume.py +78 -0
  48. mtplx-2.12.3/tests/test_deepseek_mtp_logits.py +97 -0
  49. mtplx-2.12.3/tests/test_flash_next_no_load_mtp_lane.py +108 -0
  50. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_flight_recorder.py +45 -0
  51. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_forge_cli.py +14 -0
  52. mtplx-2.12.3/tests/test_gemma4_near_lane_releases.py +162 -0
  53. mtplx-2.12.3/tests/test_generation_final_prompt_checkpoints.py +145 -0
  54. mtplx-2.12.3/tests/test_keep_orphan_tool_markup_opt_out.py +90 -0
  55. mtplx-2.12.3/tests/test_llguidance_availability.py +180 -0
  56. mtplx-2.12.3/tests/test_mtp_batch_model_family.py +98 -0
  57. mtplx-2.12.3/tests/test_near_lane_releases_refused.py +285 -0
  58. mtplx-2.12.3/tests/test_near_lane_spilled_exact_prefix.py +312 -0
  59. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_one_copy_conversation.py +20 -0
  60. mtplx-2.12.3/tests/test_one_copy_snapshot_history.py +354 -0
  61. mtplx-2.12.3/tests/test_one_copy_stale_pooled_frontier.py +227 -0
  62. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_opencode.py +3 -1
  63. mtplx-2.12.3/tests/test_opencode_side_requests.py +215 -0
  64. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_postcommit_cross_session_yield.py +36 -0
  65. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_prefill_reread.py +40 -0
  66. mtplx-2.12.3/tests/test_prefix_decode_meta_skip.py +157 -0
  67. mtplx-2.12.3/tests/test_qsa_pooled_index_identity.py +82 -0
  68. mtplx-2.12.3/tests/test_qsa_ssd_prefix_restore.py +347 -0
  69. mtplx-2.12.3/tests/test_qsa_ssd_restore_generation.py +118 -0
  70. mtplx-2.12.3/tests/test_qsa_state_restore_frontier.py +34 -0
  71. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_ram_miss_reason.py +51 -4
  72. mtplx-2.12.3/tests/test_resource_count_shed.py +203 -0
  73. mtplx-2.12.3/tests/test_responses_codex_turns.py +177 -0
  74. mtplx-2.12.3/tests/test_responses_summary_delivery.py +60 -0
  75. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_server_openai.py +737 -0
  76. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_server_responses.py +35 -0
  77. mtplx-2.12.3/tests/test_session_identity_inside_turn_624.py +103 -0
  78. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_session_identity_turn_boundary.py +7 -3
  79. mtplx-2.12.3/tests/test_ssd_restore_cache_layout.py +135 -0
  80. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_stream_error_receipt.py +38 -0
  81. mtplx-2.12.3/tests/test_suite_hermetic_environment.py +38 -0
  82. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_thermal_sidecar.py +76 -0
  83. mtplx-2.12.3/tests/test_tool_example_parameters.py +113 -0
  84. mtplx-2.12.3/tests/test_trusted_network_no_auth.py +92 -0
  85. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_ttft_spans.py +30 -0
  86. mtplx-2.12.3/tests/test_unclosed_reasoning_with_tools.py +286 -0
  87. mtplx-2.12.3/tests/test_web_chat_images.py +67 -0
  88. mtplx-2.12.2/mtplx/dashboard/_static/assets/index-BTDFdIWu.css +0 -1
  89. mtplx-2.12.2/mtplx/dashboard/_static/assets/index-DIdoATFR.js +0 -273
  90. {mtplx-2.12.2 → mtplx-2.12.3}/CITATION.cff +0 -0
  91. {mtplx-2.12.2 → mtplx-2.12.3}/LICENSE +0 -0
  92. {mtplx-2.12.2 → mtplx-2.12.3}/MANIFEST.in +0 -0
  93. {mtplx-2.12.2 → mtplx-2.12.3}/NOTICE +0 -0
  94. {mtplx-2.12.2 → mtplx-2.12.3}/README.md +0 -0
  95. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/__init__.py +0 -0
  96. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/a3b_compiled_target_prefix.py +0 -0
  97. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/a3b_mtp_batch.py +0 -0
  98. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/a3b_whole_moe.py +0 -0
  99. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/adaptive.py +0 -0
  100. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/adaptive_dtemp.py +0 -0
  101. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/app_settings.py +0 -0
  102. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/aria2_downloader.py +0 -0
  103. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/arrays_cache_patch.py +0 -0
  104. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/artifacts.py +0 -0
  105. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/attention_context.py +0 -0
  106. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/attention_math.py +0 -0
  107. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/backends/__init__.py +0 -0
  108. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/backends/deepseek_mtp.py +0 -0
  109. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/backends/descriptors.py +0 -0
  110. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/backends/family_settings.py +0 -0
  111. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/backends/glm_mtp.py +0 -0
  112. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/backends/hy_v3_mtp.py +0 -0
  113. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/backends/mimo_mtp.py +0 -0
  114. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/backends/nemotron_h_mtp.py +0 -0
  115. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/backends/qwen3_next.py +0 -0
  116. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/backends/registry.py +0 -0
  117. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/backends/step3p5_mtp.py +0 -0
  118. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/batched_decode.py +0 -0
  119. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/batching/__init__.py +0 -0
  120. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/batching/admission.py +0 -0
  121. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/batching/buckets.py +0 -0
  122. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/batching/scheduler.py +0 -0
  123. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/batching/state.py +0 -0
  124. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/__init__.py +0 -0
  125. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/code_eval.py +0 -0
  126. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/programming_prompts.py +0 -0
  127. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/prompts/aime_2026.jsonl +0 -0
  128. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/prompts/calibration_coding.jsonl +0 -0
  129. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/prompts/default.jsonl +0 -0
  130. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/prompts/flappy.jsonl +0 -0
  131. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/prompts/long_code.jsonl +0 -0
  132. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/prompts/long_code_uncapped.jsonl +0 -0
  133. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/prompts/python_modules_long.jsonl +0 -0
  134. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/__init__.py +0 -0
  135. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/aime.py +0 -0
  136. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/batch_equivalence.py +0 -0
  137. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/capture_commit_equivalence.py +0 -0
  138. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/competitor_baselines.py +0 -0
  139. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/contract_probe.py +0 -0
  140. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/harness.py +0 -0
  141. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/mtp1_gate.py +0 -0
  142. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/mtp1_sampler_smoke.py +0 -0
  143. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/mtp_adaptive.py +0 -0
  144. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/mtp_chain_probe.py +0 -0
  145. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/mtp_depth_grid.py +0 -0
  146. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/mtp_depth_sweep.py +0 -0
  147. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/mtp_tree_probe.py +0 -0
  148. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/multi_qmv_probe.py +0 -0
  149. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/preflight.py +0 -0
  150. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/runtime_smoke.py +0 -0
  151. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/session_bank.py +0 -0
  152. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/truth.py +0 -0
  153. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/verify_profile.py +0 -0
  154. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/verify_qmm_probe.py +0 -0
  155. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/verify_ratio.py +0 -0
  156. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/schema.py +0 -0
  157. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/validators/__init__.py +0 -0
  158. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/validators/aime.py +0 -0
  159. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/validators/basic.py +0 -0
  160. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/block_attention.py +0 -0
  161. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/cache_bank/__init__.py +0 -0
  162. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/cache_bank/disk_budget.py +0 -0
  163. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/cache_bank/reconcile.py +0 -0
  164. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/cache_state.py +0 -0
  165. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/chat_encode_cache.py +0 -0
  166. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/chat_encoding.py +0 -0
  167. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/checkpoint_anchors.py +0 -0
  168. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/commands/__init__.py +0 -0
  169. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/commands/forge_mixed_convert.py +0 -0
  170. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/commands/forge_qwen4_audit.py +0 -0
  171. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/commands/forge_qwen4_exp.py +0 -0
  172. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/commands/trace.py +0 -0
  173. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/commands/trace_analysis.py +0 -0
  174. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/commands/trace_clients.py +0 -0
  175. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/commands/trace_metrics.py +0 -0
  176. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/commands/trace_record.py +0 -0
  177. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/commands/trace_report.py +0 -0
  178. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/compile_state.py +0 -0
  179. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/compiled_forward.py +0 -0
  180. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/compressed_tensors.py +0 -0
  181. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/config.py +0 -0
  182. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/constants.py +0 -0
  183. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/context_copy.py +0 -0
  184. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/correctors/__init__.py +0 -0
  185. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/correctors/diagonal_affine.py +0 -0
  186. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/correctors/low_rank.py +0 -0
  187. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/daemon_client.py +0 -0
  188. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/dashboard/__init__.py +0 -0
  189. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/data/qwen38_code_ranked_64k.npy +0 -0
  190. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/deepseek_v4_adaptive_width.py +0 -0
  191. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/deepseek_v4_attention_island.py +0 -0
  192. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/deepseek_v4_attn_proj_wide_m3.py +0 -0
  193. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/default_models.py +0 -0
  194. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/demotions.py +0 -0
  195. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/dense_mrope.py +0 -0
  196. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/draft_lm_head.py +0 -0
  197. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/draft_sampling.py +0 -0
  198. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/env.py +0 -0
  199. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/expert_layout.py +0 -0
  200. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/fan_mode.py +0 -0
  201. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/fast_sampling.py +0 -0
  202. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/float32_operand.py +0 -0
  203. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/forkev_telemetry.py +0 -0
  204. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/frspec_draft.py +0 -0
  205. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/gdn_capture.py +0 -0
  206. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/gemma4_pair.py +0 -0
  207. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/glm_mtp_patch.py +0 -0
  208. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/graphbank.py +0 -0
  209. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/hardware.py +0 -0
  210. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/hf_loader.py +0 -0
  211. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/hy_v3_mtp_patch.py +0 -0
  212. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/jsonc.py +0 -0
  213. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernel_selfcheck.py +0 -0
  214. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/__init__.py +0 -0
  215. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/a3b_whole_moe.py +0 -0
  216. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/copy_leaf.py +0 -0
  217. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/fused_norm.py +0 -0
  218. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/gdn_blocked_prefill.py +0 -0
  219. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/gdn_conv_norm.py +0 -0
  220. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/gdn_gated_norm.py +0 -0
  221. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/gdn_out_fused.py +0 -0
  222. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/gdn_prefill_prework.py +0 -0
  223. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/gdn_step_fused.py +0 -0
  224. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/gdn_tape_headquarter.py +0 -0
  225. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/hadamard_rotate.py +0 -0
  226. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/hc_prefill.py +0 -0
  227. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/hc_verify_read.py +0 -0
  228. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/hyper_connection.py +0 -0
  229. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/hyper_connection_v3.py +0 -0
  230. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/laguna_decode.py +0 -0
  231. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/laguna_dense_mlp.py +0 -0
  232. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/laguna_gated_oproj.py +0 -0
  233. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/laguna_moe_combine.py +0 -0
  234. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/laguna_moe_gather_gemm.py +0 -0
  235. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/laguna_moe_merged.py +0 -0
  236. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/laguna_moe_shared.py +0 -0
  237. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/laguna_moe_swiglu.py +0 -0
  238. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/laguna_prefill_moe_combine.py +0 -0
  239. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/laguna_prefill_qk_rope.py +0 -0
  240. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/laguna_prefill_router.py +0 -0
  241. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/laguna_qk_rope_sliding.py +0 -0
  242. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/laguna_qk_yarn_full.py +0 -0
  243. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/laguna_qkvg_fused.py +0 -0
  244. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/laguna_residual_router.py +0 -0
  245. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/laguna_route_csort.py +0 -0
  246. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/laguna_router_topk.py +0 -0
  247. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/laguna_sdpa_2pass.py +0 -0
  248. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/laguna_sdpa_pair.py +0 -0
  249. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/laguna_steel_attn.py +0 -0
  250. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/lm_head_topk.py +0 -0
  251. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/logits_topk.py +0 -0
  252. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/moe_glu_decode.py +0 -0
  253. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/moe_sorted_gather_nax.py +0 -0
  254. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/native_gdn_tail.py +0 -0
  255. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/qmv4_matmul.py +0 -0
  256. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/qsa_dense_band_sdpa.py +0 -0
  257. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/qsa_flash_skip.py +0 -0
  258. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/qsa_indexer_compile.py +0 -0
  259. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/qsa_indexer_prefill.py +0 -0
  260. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/qsa_indexer_prepare.py +0 -0
  261. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/qsa_indexer_select.py +0 -0
  262. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/qsa_pooled_row.py +0 -0
  263. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/qsa_prefill_direct.py +0 -0
  264. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/qsa_prefill_flash.py +0 -0
  265. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/qsa_prefill_probe.py +0 -0
  266. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/qsa_verify_select.py +0 -0
  267. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/qwen4_m4_rope.py +0 -0
  268. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/qwen4_m4_route.py +0 -0
  269. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/qwen4_m4_routed_down.py +0 -0
  270. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/qwen4_m4_routed_glu.py +0 -0
  271. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/qwen4_m4_stage3.py +0 -0
  272. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/qwen4_moe_prefill_combine.py +0 -0
  273. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/qwen4_qsa_m4_fused_kv_gather.py +0 -0
  274. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/sdpa_2pass.py +0 -0
  275. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/sdpa_2pass_paged.py +0 -0
  276. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/sdpa_2pass_paged_q8.py +0 -0
  277. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/sdpa_gqa_packed.py +0 -0
  278. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/sdpa_gqa_packed_quant.py +0 -0
  279. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/sdpa_nax_flash.py +0 -0
  280. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/sdpa_nax_flash_dsplit.py +0 -0
  281. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/sdpa_nax_tile.py +0 -0
  282. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/ternary_qmv.py +0 -0
  283. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/verify_mlp_fused.py +0 -0
  284. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/vqmm_crossrow.py +0 -0
  285. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kpi/__init__.py +0 -0
  286. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kpi/reference_vllm.py +0 -0
  287. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kpi/runtime_kpis.py +0 -0
  288. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kv_quant.py +0 -0
  289. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/laguna_alt_step.py +0 -0
  290. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/laguna_compiled_step.py +0 -0
  291. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/lane_explain.py +0 -0
  292. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/launch_lane.py +0 -0
  293. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/lfm2_fast.py +0 -0
  294. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/loop_guard.py +0 -0
  295. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/memory_plan.py +0 -0
  296. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/metadata_scrub.py +0 -0
  297. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/mimo_mtp_patch.py +0 -0
  298. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/mlx_process_env.py +0 -0
  299. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/model_catalog.py +0 -0
  300. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/model_scheduler.py +0 -0
  301. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/model_updates.py +0 -0
  302. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/models/__init__.py +0 -0
  303. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/models/deepseek_v4.py +0 -0
  304. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/models/laguna.py +0 -0
  305. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/models/laguna_config.py +0 -0
  306. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/models/laguna_fused.py +0 -0
  307. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/models/prism_hadamard_qwen35.py +0 -0
  308. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/moe_packed_projections.py +0 -0
  309. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/moe_sorted_gather.py +0 -0
  310. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/mtp_activation_stats.py +0 -0
  311. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/mtp_adapters.py +0 -0
  312. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/mtp_batch_numerics.py +0 -0
  313. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/mtp_history_cache_only.py +0 -0
  314. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/mtp_patch.py +0 -0
  315. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/native_mlp.py +0 -0
  316. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/nax_detect.py +0 -0
  317. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/nax_verify.py +0 -0
  318. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/nemotron_h_mtp_patch.py +0 -0
  319. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/ngram_row_layout.py +0 -0
  320. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/optimization_profiles.py +0 -0
  321. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/os_memory.py +0 -0
  322. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/packed_concats.py +0 -0
  323. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/pi.py +0 -0
  324. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/ple_prefill_lookahead.py +0 -0
  325. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/ple_row_gather.py +0 -0
  326. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/prefill_bench.py +0 -0
  327. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/prefill_plan.py +0 -0
  328. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/prefill_rungs.py +0 -0
  329. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/profiles.py +0 -0
  330. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/progress_heartbeat.py +0 -0
  331. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/proj_fusion.py +0 -0
  332. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/proj_quant.py +0 -0
  333. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/proposal_reranker.py +0 -0
  334. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/qsa_mtp_precompute.py +0 -0
  335. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/qsa_restore_staging.py +0 -0
  336. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/qwen3_5_mtp_patch.py +0 -0
  337. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/qwen4_block_verify.py +0 -0
  338. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/qwen4_claim_contract.py +0 -0
  339. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/qwen4_draft_device_chain.py +0 -0
  340. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/qwen4_draft_k20_prescatter.py +0 -0
  341. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/qwen4_fixed_verify.py +0 -0
  342. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/qwen4_m4_stage3.py +0 -0
  343. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/qwen4_prefill_profile.py +0 -0
  344. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/qwen4_verify_glue.py +0 -0
  345. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/qwen_row_owned_router.py +0 -0
  346. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/ragged_attention.py +0 -0
  347. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/ragged_kv_cache.py +0 -0
  348. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/reasoning_codecs.py +0 -0
  349. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/reasoning_effort.py +0 -0
  350. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/request_capture.py +0 -0
  351. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/retrieval.py +0 -0
  352. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/roofline_profile.py +0 -0
  353. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/rope_origin.py +0 -0
  354. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/route_tape.py +0 -0
  355. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/runtime.py +0 -0
  356. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/runtime_options.py +0 -0
  357. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/sampling.py +0 -0
  358. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/server/__init__.py +0 -0
  359. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/server/hyper.py +0 -0
  360. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/server/mtp_batch.py +0 -0
  361. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/server/omlx_bridge/__init__.py +0 -0
  362. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/server/omlx_bridge/adapter.py +0 -0
  363. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/server/omlx_bridge/thinking.py +0 -0
  364. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/server/omlx_bridge/tool_calling.py +0 -0
  365. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/server/prefill_safety.py +0 -0
  366. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/server/response_envelope.py +0 -0
  367. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/server/retry_prompt.py +0 -0
  368. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/server/served_window.py +0 -0
  369. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/server/stream_rate.py +0 -0
  370. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/server/stream_recovery.py +0 -0
  371. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/server_urls.py +0 -0
  372. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/speculative.py +0 -0
  373. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/step3p5_mtp_patch.py +0 -0
  374. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/swival.py +0 -0
  375. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/system_memory.py +0 -0
  376. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/templates/qwen36_froggeric_v19/chat_template.jinja +0 -0
  377. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/templates/qwen36_froggeric_v21_3/chat_template.jinja +0 -0
  378. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/thermal.py +0 -0
  379. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/thermal_pressure.py +0 -0
  380. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/thinking_guard.py +0 -0
  381. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/trace_parity.py +0 -0
  382. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/turboquant.py +0 -0
  383. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/ui/__init__.py +0 -0
  384. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/ui/banner.py +0 -0
  385. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/ui/chat_printer.py +0 -0
  386. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/ui/download_progress.py +0 -0
  387. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/ui/onboarding.py +0 -0
  388. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/ui/panels.py +0 -0
  389. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/ui/progress.py +0 -0
  390. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/vendored_arrays_cache.py +0 -0
  391. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/vendored_hy_v3.py +0 -0
  392. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/verify_crossrow.py +0 -0
  393. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/verify_kernels.py +0 -0
  394. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/verify_qmv.py +0 -0
  395. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/vision/__init__.py +0 -0
  396. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/vision/mrope.py +0 -0
  397. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/vision/processing.py +0 -0
  398. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/vision/qwen3_vl_tower.py +0 -0
  399. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/vision/splice.py +0 -0
  400. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/vision_graft.py +0 -0
  401. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx.egg-info/dependency_links.txt +0 -0
  402. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx.egg-info/entry_points.txt +0 -0
  403. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx.egg-info/requires.txt +0 -0
  404. {mtplx-2.12.2 → mtplx-2.12.3}/mtplx.egg-info/top_level.txt +0 -0
  405. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/agent_session_gate.py +0 -0
  406. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/agent_user_path_qa.py +0 -0
  407. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/aime_serve_gate.py +0 -0
  408. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/aime_shape_memory_bench.py +0 -0
  409. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/analyze_head_sweeps.py +0 -0
  410. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/audit_agent_prompt_fidelity.py +0 -0
  411. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/audit_catalog_sizes.py +0 -0
  412. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/bonsai_memory_table.py +0 -0
  413. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/build_bonsai_mtplx_pack.py +0 -0
  414. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/build_flash_next_quality_pack.py +0 -0
  415. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/build_flash_next_quality_pack.sh +0 -0
  416. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/bundle_native_runtime_wheel.py +0 -0
  417. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/check_ai_attribution.py +0 -0
  418. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/check_prompt_scoring.py +0 -0
  419. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/code_eval_gate.py +0 -0
  420. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/collect_mtp_activation_stats.py +0 -0
  421. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/collect_mtp_hidden_calib.py +0 -0
  422. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/combine_mtp_adapters.py +0 -0
  423. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/compiled_verify_exactness.py +0 -0
  424. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/convert_qwen4_exp_fp8.py +0 -0
  425. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/convert_step37_to_mtplx_step3p5.py +0 -0
  426. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/decodecliff_probe_20260830.py +0 -0
  427. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/decodecliff_pulse_cell_20260830.py +0 -0
  428. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/deepseek_v4_adaptive_width_arms.sh +0 -0
  429. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/deepseek_v4_adaptive_width_guarded.py +0 -0
  430. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/deepseek_v4_attention_island_arms.sh +0 -0
  431. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/deepseek_v4_attention_island_guarded.py +0 -0
  432. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/deepseek_v4_attn_proj_wide_m3_arms.sh +0 -0
  433. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/deepseek_v4_attn_proj_wide_m3_guarded.py +0 -0
  434. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/deepseek_v4_build_mtp_model.py +0 -0
  435. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/deepseek_v4_decode_verify.py +0 -0
  436. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/deepseek_v4_dispatch_census.py +0 -0
  437. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/deepseek_v4_guard_window.py +0 -0
  438. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/deepseek_v4_logits_gate.py +0 -0
  439. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/deepseek_v4_moe_tail_arms.sh +0 -0
  440. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/deepseek_v4_moe_tail_gate.py +0 -0
  441. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/deepseek_v4_moe_tail_guarded_bracket.py +0 -0
  442. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/deepseek_v4_mtp_bind_check.py +0 -0
  443. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/deepseek_v4_mtpk_bench.py +0 -0
  444. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/deepseek_v4_op_census.py +0 -0
  445. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/deepseek_v4_smoke_generate.py +0 -0
  446. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/deepseek_v4_sparse_gate_probe.py +0 -0
  447. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/deepseek_v4_validate_moe_tail_k3_bracket.py +0 -0
  448. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/dense_mrope_parity_ours.py +0 -0
  449. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/dense_mrope_reference_check.py +0 -0
  450. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/dense_vision_compiled_parity.py +0 -0
  451. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/eval_mtp_corrector.py +0 -0
  452. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/filter_mtp_adapter.py +0 -0
  453. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/fp16_turbo_exactness_20260707.py +0 -0
  454. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/fresh_venv_smoke.sh +0 -0
  455. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/gauntlet_scoreboard.py +0 -0
  456. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/gen_models_manifest.py +0 -0
  457. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/graft_vision_tower.py +0 -0
  458. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/hygiene_scan.sh +0 -0
  459. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/install_macos.sh +0 -0
  460. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/install_preview_global.sh +0 -0
  461. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/kvcache_exactness_audit_20260703.py +0 -0
  462. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/kvcache_soak_20260703.py +0 -0
  463. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/kvcache_warm_probe_20260703.py +0 -0
  464. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/make_fp16_precision_sibling.py +0 -0
  465. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/measure_request_capture.py +0 -0
  466. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/midform_gate.py +0 -0
  467. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/model_release_policy.py +0 -0
  468. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/mtp_cost_probe.py +0 -0
  469. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/oc_tap.py +0 -0
  470. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/oc_tap_diff.py +0 -0
  471. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/opencode_concurrency_qa.py +0 -0
  472. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/phase0h_paged_verifier_exactness.py +0 -0
  473. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/pillar_gate_qa.py +0 -0
  474. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/probe_mlx_pr3026_qsdpa.py +0 -0
  475. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/probe_mx_compile_buckets.py +0 -0
  476. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/probe_paged_gqa_sdpa_routes.py +0 -0
  477. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/qsa_indexer_prefill_numeric_check.py +0 -0
  478. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/qsa_prefill_battery2_20260830.py +0 -0
  479. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/qsa_prefill_battery_20260830.py +0 -0
  480. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/qsa_prefill_flash_numeric_check.py +0 -0
  481. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/quality_fp16_parent_logitdiff_20260707.py +0 -0
  482. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/qwen35b_mtp_batch_evalplus_guarded.py +0 -0
  483. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/qwen35b_mtp_batch_numerics_attribution.py +0 -0
  484. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/qwen35b_mtp_batch_numerics_guarded.py +0 -0
  485. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/qwen4_quality_component_parity.py +0 -0
  486. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/qwen4_vision_compiled_parity.py +0 -0
  487. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/qwen4exp_mtp_tiny_smoke.py +0 -0
  488. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/qwen4exp_numeric_check.py +0 -0
  489. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/r1_chisquare_verifier_correctness.py +0 -0
  490. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/render_release_notes.py +0 -0
  491. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/replay_chat_request.py +0 -0
  492. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/restamp_head_quant_packs.py +0 -0
  493. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/run_context_degradation_diagnostics.py +0 -0
  494. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/run_harness_check.py +0 -0
  495. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/select_runtime_wheel.py +0 -0
  496. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/serve_openai_mtplx.py +0 -0
  497. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/session_cache_followup_qa.py +0 -0
  498. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/session_forensics.py +0 -0
  499. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/step_acceptance.py +0 -0
  500. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/step_smoke.py +0 -0
  501. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/stream_qa_gate.sh +0 -0
  502. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/train_mtp_adapter_c4.py +0 -0
  503. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/upload_head_quant_packs.py +0 -0
  504. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/validate_step_mtp_injector.py +0 -0
  505. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/walltime-lab/run_project.py +0 -0
  506. {mtplx-2.12.2 → mtplx-2.12.3}/scripts/write_launch_lane_matrix.py +0 -0
  507. {mtplx-2.12.2 → mtplx-2.12.3}/setup.cfg +0 -0
  508. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_a3b_compiled_target_prefix.py +0 -0
  509. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_a3b_mtp_batch.py +0 -0
  510. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_a3b_mtp_batch_driver.py +0 -0
  511. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_a3b_whole_moe.py +0 -0
  512. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_adaptive.py +0 -0
  513. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_adaptive_dtemp.py +0 -0
  514. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_admission_keeps_the_conversation.py +0 -0
  515. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_agent_prompt_fidelity.py +0 -0
  516. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_agent_rewrites_off_retries.py +0 -0
  517. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_aime_serve_gate.py +0 -0
  518. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_allow_swap_427.py +0 -0
  519. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_answer_memory_stop.py +0 -0
  520. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_answer_room_request.py +0 -0
  521. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_api_benchmark_contracts.py +0 -0
  522. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_app_cli_env_parity.py +0 -0
  523. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_ar_batch_cache_family_guard_420.py +0 -0
  524. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_ar_batch_penalties.py +0 -0
  525. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_ar_batch_ragged_ssm_mask.py +0 -0
  526. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_aria2_downloader.py +0 -0
  527. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_arrays_cache_patch.py +0 -0
  528. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_artifacts.py +0 -0
  529. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_async_decode.py +0 -0
  530. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_attention_gate_exactness.py +0 -0
  531. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_attention_split.py +0 -0
  532. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_background_warmup.py +0 -0
  533. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_bank_history_policy.py +0 -0
  534. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_batch_pump_heartbeat.py +0 -0
  535. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_batched_decode.py +0 -0
  536. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_batched_greedy_argmax_tiebreak.py +0 -0
  537. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_batching_foundation.py +0 -0
  538. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_bench_depth_sweep_flags.py +0 -0
  539. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_blank_retry_greedy.py +0 -0
  540. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_block_verify_exact_law.py +0 -0
  541. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_bonsai_memory_table.py +0 -0
  542. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_bonsai_pack_metadata.py +0 -0
  543. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_bracket_tool_rescue.py +0 -0
  544. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_build_bonsai_mtplx_pack.py +0 -0
  545. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_bundle_native_runtime_wheel.py +0 -0
  546. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_cache_state.py +0 -0
  547. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_canon_gate_hardening.py +0 -0
  548. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_canon_policy_smalls.py +0 -0
  549. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_canon_postcommit_extension.py +0 -0
  550. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_canonicalize_multimodal.py +0 -0
  551. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_ccopy_bank_route.py +0 -0
  552. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_chat_encode_cache.py +0 -0
  553. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_chat_segment_memo.py +0 -0
  554. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_chat_turn_segments.py +0 -0
  555. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_checkpoint_anchors.py +0 -0
  556. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_checkpoint_pre_image.py +0 -0
  557. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_cli_greedy_draft_coupling.py +0 -0
  558. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_cli_parity_tools.py +0 -0
  559. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_client_controls_default.py +0 -0
  560. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_code_eval.py +0 -0
  561. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_code_eval_gate.py +0 -0
  562. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_cold_encode_bounded_units.py +0 -0
  563. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_cold_prefix_ram_shadow.py +0 -0
  564. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_cold_tier_backlog_admission.py +0 -0
  565. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_cold_tier_defaults.py +0 -0
  566. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_cold_tier_disk_budget.py +0 -0
  567. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_cold_tier_eviction_yield.py +0 -0
  568. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_cold_tier_foreground_yield.py +0 -0
  569. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_cold_tier_min_useful_matched.py +0 -0
  570. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_cold_tier_reconcile.py +0 -0
  571. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_cold_tier_recurrent_boundary_gate.py +0 -0
  572. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_cold_tier_stats_cache.py +0 -0
  573. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_cold_tier_transactional_replace.py +0 -0
  574. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_cold_tier_write_budget.py +0 -0
  575. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_committed_reasoning_canonicalization.py +0 -0
  576. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_committed_token_splice.py +0 -0
  577. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_compile_state.py +0 -0
  578. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_compiled_ar_wiring.py +0 -0
  579. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_compiled_forward.py +0 -0
  580. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_compiled_verify_evaluated_weights.py +0 -0
  581. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_compiled_verify_tf32_off.py +0 -0
  582. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_compressed_tensors.py +0 -0
  583. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_config.py +0 -0
  584. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_config_profile_precedence.py +0 -0
  585. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_constrained.py +0 -0
  586. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_context_copy_joined_tokens.py +0 -0
  587. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_context_copy_ramp.py +0 -0
  588. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_context_copy_stats.py +0 -0
  589. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_context_degradation_profiles.py +0 -0
  590. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_convert_qwen4_exp_fp8_scales.py +0 -0
  591. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_copy_block_accept.py +0 -0
  592. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_correctors.py +0 -0
  593. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_cost_depth_policy.py +0 -0
  594. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_daemon_client.py +0 -0
  595. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_dashboard_endpoints.py +0 -0
  596. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_death_signature_macos27.py +0 -0
  597. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_decode_growth_guards.py +0 -0
  598. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_decoded_state_lifetime.py +0 -0
  599. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_deepseek_v4_adaptive_width_bracket.py +0 -0
  600. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_deepseek_v4_adaptive_width_policy.py +0 -0
  601. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_deepseek_v4_attention_island.py +0 -0
  602. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_deepseek_v4_attention_island_bracket.py +0 -0
  603. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_deepseek_v4_attn_proj_wide_m3.py +0 -0
  604. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_deepseek_v4_attn_proj_wide_m3_bracket.py +0 -0
  605. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_deepseek_v4_decode.py +0 -0
  606. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_deepseek_v4_dtypes.py +0 -0
  607. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_deepseek_v4_indexer.py +0 -0
  608. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_deepseek_v4_kernel_paths.py +0 -0
  609. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_deepseek_v4_loader.py +0 -0
  610. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_deepseek_v4_moe_tail.py +0 -0
  611. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_deepseek_v4_moe_tail_bracket.py +0 -0
  612. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_deepseek_v4_mtp.py +0 -0
  613. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_deepseek_v4_new_math.py +0 -0
  614. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_deepseek_v4_o_lora.py +0 -0
  615. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_deepseek_v4_parity.py +0 -0
  616. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_deepseek_v4_sinkhorn_kernel.py +0 -0
  617. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_deepseek_v4_spec.py +0 -0
  618. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_deepseek_v4_swiglu_clamp.py +0 -0
  619. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_default_models.py +0 -0
  620. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_demotions.py +0 -0
  621. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_demotions_generation_sites.py +0 -0
  622. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_demotions_graphbank_sites.py +0 -0
  623. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_demotions_qsa_prefill_sites.py +0 -0
  624. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_dense_decode_max_context.py +0 -0
  625. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_dense_mrope.py +0 -0
  626. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_dense_mrope_compiled_route.py +0 -0
  627. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_dense_mrope_generation.py +0 -0
  628. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_dense_vision_compiled_parity_script.py +0 -0
  629. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_descriptor_family_collisions.py +0 -0
  630. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_descriptors_mimo_tune.py +0 -0
  631. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_descriptors_qwen4_exp_tune.py +0 -0
  632. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_device_draft_core.py +0 -0
  633. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_diagnostics.py +0 -0
  634. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_doctor_failed_start.py +0 -0
  635. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_download_progress.py +0 -0
  636. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_draft_confidence_trace.py +0 -0
  637. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_draft_launch_provenance.py +0 -0
  638. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_draft_lm_head.py +0 -0
  639. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_draft_lm_head_chunked_requantization.py +0 -0
  640. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_draft_telemetry_truth.py +0 -0
  641. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_draft_temp_policy.py +0 -0
  642. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_encode_seam_unification.py +0 -0
  643. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_endpoint_probe_hygiene.py +0 -0
  644. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_engine_session_concurrency.py +0 -0
  645. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_engine_session_env.py +0 -0
  646. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_env_flag_parsing.py +0 -0
  647. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_exact_verify_route.py +0 -0
  648. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_exactness_320_319.py +0 -0
  649. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_expected_value_greedy.py +0 -0
  650. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_family_settings.py +0 -0
  651. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_fast_sampling.py +0 -0
  652. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_final_committed_frontier_byte_skip.py +0 -0
  653. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_final_tool_preamble_stream_parity.py +0 -0
  654. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_finish_stop_origin.py +0 -0
  655. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_finished_answers_are_never_regenerated.py +0 -0
  656. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_first_token_logprobs_api.py +0 -0
  657. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_first_token_logprobs_gemma4.py +0 -0
  658. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_fixed_m4_dispatch_guard.py +0 -0
  659. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_flash_next_quality_m5_ultra.py +0 -0
  660. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_float32_operand.py +0 -0
  661. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_forge_discover_filter.py +0 -0
  662. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_forge_family_serve_depths.py +0 -0
  663. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_forge_mixed_convert.py +0 -0
  664. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_forge_mtp_key_forms.py +0 -0
  665. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_forge_mtp_norm_convention.py +0 -0
  666. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_forge_quality_build_script.py +0 -0
  667. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_forge_qwen4_exp_lane.py +0 -0
  668. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_forge_qwen4_exp_roundtrip.py +0 -0
  669. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_forge_verify_depths.py +0 -0
  670. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_forkev_telemetry.py +0 -0
  671. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_fused_add_rmsnorm_exactness.py +0 -0
  672. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_gdn_blocked_prefill.py +0 -0
  673. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_gdn_boundary_retention.py +0 -0
  674. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_gdn_capture_rows.py +0 -0
  675. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_gdn_conv_norm_fused.py +0 -0
  676. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_gdn_conv_norm_rows.py +0 -0
  677. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_gdn_gated_norm.py +0 -0
  678. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_gdn_out_fused.py +0 -0
  679. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_gdn_postconv_fusion.py +0 -0
  680. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_gdn_postconv_impl_gate.py +0 -0
  681. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_gdn_prefill_prework.py +0 -0
  682. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_gdn_step_fused.py +0 -0
  683. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_gdn_tape_headquarter.py +0 -0
  684. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_gemma4_chunked_prefill.py +0 -0
  685. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_gemma4_prompt_scoring.py +0 -0
  686. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_gemma4_rotating_cache_trim.py +0 -0
  687. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_gemma4_scoring_cache.py +0 -0
  688. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_gemma4_scoring_policy.py +0 -0
  689. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_gemma4_session_cache.py +0 -0
  690. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_gemma4_tokenizer_probe.py +0 -0
  691. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_generation_rate_fields.py +0 -0
  692. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_generation_store_on_prefill.py +0 -0
  693. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_generation_sustained.py +0 -0
  694. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_graphbank_compiled_verify.py +0 -0
  695. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_graphbank_program_retirement.py +0 -0
  696. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_graphbank_trace_lifetime.py +0 -0
  697. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_greedy_confidence_runner_telemetry.py +0 -0
  698. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_greedy_draft_coupling.py +0 -0
  699. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_greedy_trio_ports.py +0 -0
  700. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_hc_prefill.py +0 -0
  701. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_hc_verify_read.py +0 -0
  702. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_health_qwen4_install_reports.py +0 -0
  703. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_hermes_native_contract.py +0 -0
  704. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_hf_loader.py +0 -0
  705. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_hidden_tool_guard_opt_in.py +0 -0
  706. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_host_memory_allowance.py +0 -0
  707. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_hy_v3_mtp_backend.py +0 -0
  708. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_hy_v3_mtp_graft.py +0 -0
  709. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_hygiene_scan.py +0 -0
  710. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_hyper_scheduler.py +0 -0
  711. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_hyper_v3.py +0 -0
  712. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_idle_persistence_pump.py +0 -0
  713. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_idle_postcommit_subagent.py +0 -0
  714. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_idle_session_release.py +0 -0
  715. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_install_macos_script.py +0 -0
  716. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_issue_404_macos27_mpp_compat.py +0 -0
  717. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_jsonc.py +0 -0
  718. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_kernel_selfcheck.py +0 -0
  719. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_kernel_selfcheck_bonsai.py +0 -0
  720. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_kernel_selfcheck_qwen4_prefill.py +0 -0
  721. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_kv_attention_trace_526.py +0 -0
  722. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_kv_quant_memory.py +0 -0
  723. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_kv_quant_meta_state_rewind_526.py +0 -0
  724. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_kv_quant_q4_kernel_route.py +0 -0
  725. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_laguna_alt_step.py +0 -0
  726. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_laguna_compiled_step.py +0 -0
  727. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_laguna_fused.py +0 -0
  728. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_laguna_model.py +0 -0
  729. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_laguna_steel_attn.py +0 -0
  730. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_launch_lane.py +0 -0
  731. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_lazy_snapshot_cow.py +0 -0
  732. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_lease_keeps_draft_history.py +0 -0
  733. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_lease_survives_aborted_prefill.py +0 -0
  734. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_lfm2_descriptor_resolution.py +0 -0
  735. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_lfm2_fast.py +0 -0
  736. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_loop_guard.py +0 -0
  737. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_max_idle_watchdog.py +0 -0
  738. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_max_lifecycle.py +0 -0
  739. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_memguard_admission.py +0 -0
  740. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_memguard_backend_contract.py +0 -0
  741. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_memguard_degraded.py +0 -0
  742. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_memguard_dense_qsa.py +0 -0
  743. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_memguard_lease_growth.py +0 -0
  744. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_memguard_limit_allowances.py +0 -0
  745. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_memguard_moe_rows.py +0 -0
  746. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_memguard_ownership.py +0 -0
  747. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_memguard_pressure_trim.py +0 -0
  748. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_memguard_queued_persistence.py +0 -0
  749. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_memguard_release_protection.py +0 -0
  750. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_memguard_snapshot_width.py +0 -0
  751. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_memory_limit_g5.py +0 -0
  752. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_memory_plan.py +0 -0
  753. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_memory_plan_bonsai.py +0 -0
  754. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_memory_pressure_guard.py +0 -0
  755. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_metadata_scrub.py +0 -0
  756. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_metal_memory_caps.py +0 -0
  757. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_midform_gate.py +0 -0
  758. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_mimo_catalog.py +0 -0
  759. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_mlx_process_env.py +0 -0
  760. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_model_catalog.py +0 -0
  761. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_model_scheduler.py +0 -0
  762. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_model_scheduler_persistence.py +0 -0
  763. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_model_updates.py +0 -0
  764. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_moe_force_unsorted.py +0 -0
  765. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_moe_glu_decode.py +0 -0
  766. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_moe_glu_verify.py +0 -0
  767. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_moe_packed_projections.py +0 -0
  768. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_moe_sorted_gather.py +0 -0
  769. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_moe_sorted_gather_nax.py +0 -0
  770. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_mtp_activation_stats.py +0 -0
  771. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_mtp_adapters.py +0 -0
  772. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_mtp_alias_load_path.py +0 -0
  773. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_mtp_batch_numerics.py +0 -0
  774. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_mtp_batch_serving.py +0 -0
  775. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_mtp_depth_n.py +0 -0
  776. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_mtp_depth_sweep.py +0 -0
  777. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_mtp_final_state_covers_committed_tokens.py +0 -0
  778. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_mtp_fused_experts.py +0 -0
  779. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_mtp_history_cache_only.py +0 -0
  780. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_mtp_history_settled.py +0 -0
  781. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_mtp_norm_convention.py +0 -0
  782. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_mtp_patch.py +0 -0
  783. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_mtp_payload_guards.py +0 -0
  784. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_mtp_weightless_degrade.py +0 -0
  785. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_nax_attention_hardware.py +0 -0
  786. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_nax_detect.py +0 -0
  787. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_nax_verify.py +0 -0
  788. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_ngram_prewarm_option.py +0 -0
  789. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_ngram_prewarm_reservation.py +0 -0
  790. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_ngram_row_hotness.py +0 -0
  791. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_ngram_row_layout.py +0 -0
  792. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_ngram_table_memory.py +0 -0
  793. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_no_mlx_imports.py +0 -0
  794. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_non_finite_logits_and_lazy_sampler_law.py +0 -0
  795. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_omlx_bridge.py +0 -0
  796. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_omlx_bridge_late_system_messages.py +0 -0
  797. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_onboarding.py +0 -0
  798. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_one_copy_admission.py +0 -0
  799. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_one_copy_cancelled_answer.py +0 -0
  800. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_one_copy_postcommit.py +0 -0
  801. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_one_copy_reserve_resize.py +0 -0
  802. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_one_copy_restarted_draft_history.py +0 -0
  803. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_one_shot_family_contract.py +0 -0
  804. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_openai_bridge.py +0 -0
  805. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_optimization_profiles.py +0 -0
  806. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_orphan_stream_guard_first_line.py +0 -0
  807. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_orphan_tool_markup.py +0 -0
  808. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_owner_idle_pool.py +0 -0
  809. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_pack_contract_states.py +0 -0
  810. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_paged_tailmask_elide.py +0 -0
  811. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_parallel_tool_prompt_policy.py +0 -0
  812. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_passive_probe_telemetry.py +0 -0
  813. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_penalties.py +0 -0
  814. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_penalty_request_wiring.py +0 -0
  815. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_persistent_replay.py +0 -0
  816. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_phase0h_paged_verifier_exactness.py +0 -0
  817. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_phys_footprint_guard.py +0 -0
  818. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_policy_fingerprint_stability.py +0 -0
  819. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_postcommit_arrival_wait.py +0 -0
  820. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_postcommit_prefix_reuse.py +0 -0
  821. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_postcommit_resolve_for_request.py +0 -0
  822. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_postcommit_tools_plumbing.py +0 -0
  823. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_postcommit_wait.py +0 -0
  824. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_postcommit_wait_integration.py +0 -0
  825. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_postcommit_wait_progress.py +0 -0
  826. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_pre_first_token_telemetry.py +0 -0
  827. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_prefill_admission_shed.py +0 -0
  828. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_prefill_bench.py +0 -0
  829. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_prefill_chunk_defaults.py +0 -0
  830. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_prefill_geometric_tail.py +0 -0
  831. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_prefill_inforward_boundary_capture.py +0 -0
  832. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_prefill_tps_regression.py +0 -0
  833. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_pressure_abort_393.py +0 -0
  834. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_prism_bonsai_kernels.py +0 -0
  835. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_prism_hadamard_qwen35.py +0 -0
  836. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_profile_default_resolution.py +0 -0
  837. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_profiles.py +0 -0
  838. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_proj_fusion.py +0 -0
  839. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_proj_quant.py +0 -0
  840. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_promoted_paged_capacity_526.py +0 -0
  841. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_prompt_encoding.py +0 -0
  842. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_prompt_publication_is_request_local.py +0 -0
  843. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_prompt_scoring_admission.py +0 -0
  844. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_prompt_scoring_parent.py +0 -0
  845. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_prompt_scoring_probe.py +0 -0
  846. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_prompt_scoring_topk.py +0 -0
  847. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_public_cli.py +0 -0
  848. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_pull_tls_trust.py +0 -0
  849. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_px3_planner_seats.py +0 -0
  850. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qmv4_matmul.py +0 -0
  851. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_dense_band_sdpa.py +0 -0
  852. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_fixed_bank_score_scale.py +0 -0
  853. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_flash_skip.py +0 -0
  854. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_gate_safety.py +0 -0
  855. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_gather.py +0 -0
  856. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_gather_rows.py +0 -0
  857. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_index_block_writes_evaluated.py +0 -0
  858. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_indexer_compile.py +0 -0
  859. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_indexer_fused_integration.py +0 -0
  860. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_indexer_prefill_mpp_runtime.py +0 -0
  861. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_indexer_prefill_runtime_blocks.py +0 -0
  862. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_indexer_prefill_simd_topk.py +0 -0
  863. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_indexer_prefill_static.py +0 -0
  864. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_indexer_prepare_metal.py +0 -0
  865. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_indexer_select_metal.py +0 -0
  866. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_memory_plan_393.py +0 -0
  867. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_mtp_precompute.py +0 -0
  868. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_mtp_precompute_wiring.py +0 -0
  869. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_pooled_row.py +0 -0
  870. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_portable_producer_gate.py +0 -0
  871. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_prefill_direct.py +0 -0
  872. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_prefill_direct_greedy.py +0 -0
  873. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_prefill_direct_numeric.py +0 -0
  874. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_prefill_direct_routing.py +0 -0
  875. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_prefill_direct_static.py +0 -0
  876. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_prefill_flash_contract.py +0 -0
  877. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_prefill_flash_direct_parity.py +0 -0
  878. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_prefill_flash_static.py +0 -0
  879. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_prefill_gather_tier.py +0 -0
  880. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_prefill_runtime_gates_static.py +0 -0
  881. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_prefill_wiring.py +0 -0
  882. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_restore_staging.py +0 -0
  883. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_selector_prefix_contract.py +0 -0
  884. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_tiled_scores.py +0 -0
  885. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_verify_select.py +0 -0
  886. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_quant_partials_fp16_526.py +0 -0
  887. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen35b_mtp_batch_evalplus_guarded.py +0 -0
  888. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen35b_mtp_batch_numerics_attribution.py +0 -0
  889. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen35b_mtp_batch_numerics_guarded.py +0 -0
  890. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen38_family.py +0 -0
  891. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen3_5_mtp_backend.py +0 -0
  892. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen3_5_mtp_object_level.py +0 -0
  893. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen3_5_mtp_sidecar_norms.py +0 -0
  894. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_block_verify.py +0 -0
  895. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_bucket_publication.py +0 -0
  896. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_capacity_consumers.py +0 -0
  897. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_claim_contract.py +0 -0
  898. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_compiled_mtp_prepare.py +0 -0
  899. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_draft_chain_pipeline.py +0 -0
  900. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_draft_device_chain.py +0 -0
  901. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_draft_k20_prescatter.py +0 -0
  902. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_exp_capture_commit.py +0 -0
  903. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_exp_compile.py +0 -0
  904. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_exp_gdn_inproj_fusion.py +0 -0
  905. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_exp_inforward_boundary_capture.py +0 -0
  906. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_exp_qsa_cache.py +0 -0
  907. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_exp_qsa_qkv_fusion.py +0 -0
  908. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_exp_rope.py +0 -0
  909. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_fixed_bank_bf16_parity.py +0 -0
  910. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_fixed_bank_capacity.py +0 -0
  911. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_fixed_host_tokens_static.py +0 -0
  912. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_fixed_m4_capacity_bucket.py +0 -0
  913. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_fixed_m4_copy_windows.py +0 -0
  914. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_fixed_m4_float32_admission.py +0 -0
  915. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_fixed_m4_gate_cache.py +0 -0
  916. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_fixed_m4_growth_layerwise.py +0 -0
  917. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_fixed_m4_verify_exactness.py +0 -0
  918. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_fixed_m4_vision_admission.py +0 -0
  919. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_frspec_native.py +0 -0
  920. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_growth_recovery.py +0 -0
  921. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_hc_prefill_compile.py +0 -0
  922. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_hc_prefill_read_switch.py +0 -0
  923. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_m4_routed_glu.py +0 -0
  924. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_m4_stage3.py +0 -0
  925. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_m4_stage3_residual_tail.py +0 -0
  926. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_moe_prefill_combine.py +0 -0
  927. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_moe_sorted_rows.py +0 -0
  928. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_mtp_history_cache_only.py +0 -0
  929. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_opdiet.py +0 -0
  930. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_ple_first_gather_early.py +0 -0
  931. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_ple_gate_exactness.py +0 -0
  932. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_ple_lookahead_restored_suffix.py +0 -0
  933. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_ple_prefill_lookahead.py +0 -0
  934. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_ple_serving_verdicts.py +0 -0
  935. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_prefill_dq_gemm.py +0 -0
  936. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_prefill_midloop_eval.py +0 -0
  937. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_prefill_profile_hc.py +0 -0
  938. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_qsa_m4_fused_kv_gather.py +0 -0
  939. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_route_kernel.py +0 -0
  940. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_rows_gather_scale.py +0 -0
  941. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_verify_gate_sites.py +0 -0
  942. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_verify_glue.py +0 -0
  943. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_verify_sdpa_head_chunk.py +0 -0
  944. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_vision_compiled_parity_cpu.py +0 -0
  945. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_vision_compiled_parity_script.py +0 -0
  946. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_vision_compiled_route_e2e.py +0 -0
  947. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_vision_mrope.py +0 -0
  948. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_wide_prefill_chunk.py +0 -0
  949. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_yarn_amplitude.py +0 -0
  950. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen_row_owned_router.py +0 -0
  951. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_ragged_kv_cache.py +0 -0
  952. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_reasoning_stream_split.py +0 -0
  953. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_recovery_metrics_attribution.py +0 -0
  954. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_release_2114_catalog.py +0 -0
  955. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_release_2114_manifest.py +0 -0
  956. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_release_notes_template.py +0 -0
  957. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_release_pins.py +0 -0
  958. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_release_qa_fixwave.py +0 -0
  959. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_repetition_stop_legitimate_code.py +0 -0
  960. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_repetition_stop_long_cycle.py +0 -0
  961. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_request_capture.py +0 -0
  962. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_request_log_privacy.py +0 -0
  963. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_request_observability_golden.py +0 -0
  964. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_response_envelope_parity.py +0 -0
  965. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_retrieval.py +0 -0
  966. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_retry_prompt_reuses_served_ids.py +0 -0
  967. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_route_tape.py +0 -0
  968. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_runtime_ar_final_state.py +0 -0
  969. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_runtime_deepseek_v4_o_lora.py +0 -0
  970. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_runtime_env_flags_refresh.py +0 -0
  971. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_runtime_env_latebind.py +0 -0
  972. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_runtime_kpis.py +0 -0
  973. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_runtime_model_alias.py +0 -0
  974. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_runtime_obs_graphbank.py +0 -0
  975. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_runtime_obs_kernel_bails.py +0 -0
  976. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_runtime_obs_profiles.py +0 -0
  977. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_runtime_obs_stream_holdback.py +0 -0
  978. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_runtime_scheduler_histogram.py +0 -0
  979. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_runtime_session_sizing.py +0 -0
  980. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_sampling.py +0 -0
  981. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_scoped_reasoning_history.py +0 -0
  982. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_sdpa_gqa_packed.py +0 -0
  983. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_sdpa_gqa_packed_quant.py +0 -0
  984. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_sdpa_nax_flash.py +0 -0
  985. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_sdpa_nax_tile.py +0 -0
  986. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_select_runtime_wheel.py +0 -0
  987. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_serve_generation_mode_default.py +0 -0
  988. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_serve_network_share.py +0 -0
  989. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_served_window.py +0 -0
  990. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_server_obs_caps_and_health.py +0 -0
  991. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_server_obs_postcommit_health.py +0 -0
  992. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_server_obs_reasoning_rows.py +0 -0
  993. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_server_obs_stream_termination.py +0 -0
  994. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_server_origin_policy.py +0 -0
  995. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_session_bank.py +0 -0
  996. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_session_bank_boundary_shed.py +0 -0
  997. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_session_bank_chain_shed.py +0 -0
  998. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_session_bank_env_caps.py +0 -0
  999. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_session_bank_gc.py +0 -0
  1000. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_session_bank_lease_accounting.py +0 -0
  1001. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_session_bank_protected_terminal.py +0 -0
  1002. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_session_bank_recurrent_partial_restore.py +0 -0
  1003. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_session_bank_restore_aliasing.py +0 -0
  1004. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_session_bank_snapshot_settle.py +0 -0
  1005. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_small_mac_prefill.py +0 -0
  1006. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_smart_fan_stall_probe.py +0 -0
  1007. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_smart_fan_wedged_request.py +0 -0
  1008. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_snapshot_free_rejection_repair.py +0 -0
  1009. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_source_wrapper.py +0 -0
  1010. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_split_partials_fp16_526.py +0 -0
  1011. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_ssd_boundary_repersist.py +0 -0
  1012. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_ssd_spill.py +0 -0
  1013. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_stable_prefix_boundary.py +0 -0
  1014. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_start_reuses_chosen_model.py +0 -0
  1015. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_stats_footer_scope.py +0 -0
  1016. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_step3p5_mtp_patch.py +0 -0
  1017. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_stop_resend_session_continuity.py +0 -0
  1018. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_stream_guard_env.py +0 -0
  1019. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_stream_phase_rate.py +0 -0
  1020. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_stream_recovery_paths.py +0 -0
  1021. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_stream_release_pacer.py +0 -0
  1022. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_stream_response_tail.py +0 -0
  1023. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_stream_splitter_contract.py +0 -0
  1024. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_stream_stall_watchdog.py +0 -0
  1025. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_stream_transcript_golden.py +0 -0
  1026. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_stream_visible_cadence.py +0 -0
  1027. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_sustained_long_context_qa.py +0 -0
  1028. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_system_memory_guard.py +0 -0
  1029. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_tail_ar_warm_restore_identity.py +0 -0
  1030. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_tail_config_sampler_presence.py +0 -0
  1031. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_tail_gemma4_stream_holdback.py +0 -0
  1032. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_tail_profile_truth.py +0 -0
  1033. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_tensoroffset_kv_inplace.py +0 -0
  1034. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_thermal.py +0 -0
  1035. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_thermal_pressure.py +0 -0
  1036. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_thinking_guard.py +0 -0
  1037. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_thinking_splitter_marker_quotes.py +0 -0
  1038. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_tiny_max_tokens_warning_436.py +0 -0
  1039. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_tokenizer_pretokenizer_repair.py +0 -0
  1040. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_tool_aware_stream_translator.py +0 -0
  1041. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_tool_call_hidden_guard_and_key_repair.py +0 -0
  1042. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_tool_choice_prompt_modes.py +0 -0
  1043. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_tool_fed_retry_parsed_call.py +0 -0
  1044. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_tool_nested_args_streaming.py +0 -0
  1045. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_trace_diagnostics.py +0 -0
  1046. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_trace_incidents.py +0 -0
  1047. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_trace_parity.py +0 -0
  1048. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_tune_qwen4_exp_verify_strategy.py +0 -0
  1049. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_tune_record_wizard_parity.py +0 -0
  1050. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_turboquant.py +0 -0
  1051. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_turboquant_fallback.py +0 -0
  1052. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_ui_progress.py +0 -0
  1053. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_validators.py +0 -0
  1054. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_verify_crossrow.py +0 -0
  1055. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_verify_kernels_rehearsal.py +0 -0
  1056. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_vision_control_literals.py +0 -0
  1057. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_vision_keyed_partial_restore.py +0 -0
  1058. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_vision_keyed_restore_rules.py +0 -0
  1059. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_vision_restore_span_guard.py +0 -0
  1060. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_vision_session_cache.py +0 -0
  1061. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_vision_session_frontier_gate.py +0 -0
  1062. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_vision_session_restore.py +0 -0
  1063. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_vision_tower.py +0 -0
  1064. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_vision_trunk_forward_positions.py +0 -0
  1065. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_vllm_reference.py +0 -0
  1066. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_wide_prefill_chunk_after_reclaim.py +0 -0
  1067. {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_working_set.py +0 -0
  1068. {mtplx-2.12.2 → mtplx-2.12.3}/vllm_metal/__init__.py +0 -0
  1069. {mtplx-2.12.2 → mtplx-2.12.3}/vllm_metal/metal/README.md +0 -0
  1070. {mtplx-2.12.2 → mtplx-2.12.3}/vllm_metal/metal/__init__.py +0 -0
  1071. {mtplx-2.12.2 → mtplx-2.12.3}/vllm_metal/metal/build.py +0 -0
  1072. {mtplx-2.12.2 → mtplx-2.12.3}/vllm_metal/metal/constants.py +0 -0
  1073. {mtplx-2.12.2 → mtplx-2.12.3}/vllm_metal/metal/kernels_v1/copy_blocks.metal +0 -0
  1074. {mtplx-2.12.2 → mtplx-2.12.3}/vllm_metal/metal/kernels_v1/float8.metal +0 -0
  1075. {mtplx-2.12.2 → mtplx-2.12.3}/vllm_metal/metal/kernels_v1/gather_kv_cache.metal +0 -0
  1076. {mtplx-2.12.2 → mtplx-2.12.3}/vllm_metal/metal/kernels_v1/kv_scale_update.metal +0 -0
  1077. {mtplx-2.12.2 → mtplx-2.12.3}/vllm_metal/metal/kernels_v1/pagedattention.metal +0 -0
  1078. {mtplx-2.12.2 → mtplx-2.12.3}/vllm_metal/metal/kernels_v1/reshape_and_cache.metal +0 -0
  1079. {mtplx-2.12.2 → mtplx-2.12.3}/vllm_metal/metal/kernels_v1/utils.metal +0 -0
  1080. {mtplx-2.12.2 → mtplx-2.12.3}/vllm_metal/metal/kernels_v2/copy_blocks.metal +0 -0
  1081. {mtplx-2.12.2 → mtplx-2.12.3}/vllm_metal/metal/kernels_v2/float8.metal +0 -0
  1082. {mtplx-2.12.2 → mtplx-2.12.3}/vllm_metal/metal/kernels_v2/gather_kv_cache.metal +0 -0
  1083. {mtplx-2.12.2 → mtplx-2.12.3}/vllm_metal/metal/kernels_v2/gdn_linear_attention.metal +0 -0
  1084. {mtplx-2.12.2 → mtplx-2.12.3}/vllm_metal/metal/kernels_v2/kv_scale_update.metal +0 -0
  1085. {mtplx-2.12.2 → mtplx-2.12.3}/vllm_metal/metal/kernels_v2/pagedattention.metal +0 -0
  1086. {mtplx-2.12.2 → mtplx-2.12.3}/vllm_metal/metal/kernels_v2/reshape_and_cache.metal +0 -0
  1087. {mtplx-2.12.2 → mtplx-2.12.3}/vllm_metal/metal/kernels_v2/turboquant.metal +0 -0
  1088. {mtplx-2.12.2 → mtplx-2.12.3}/vllm_metal/metal/kernels_v2/utils.metal +0 -0
  1089. {mtplx-2.12.2 → mtplx-2.12.3}/vllm_metal/metal/paged_ops.cpp +0 -0
@@ -4,6 +4,53 @@ All notable user-facing changes to MTPLX. The format is based on
4
4
  [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versions follow
5
5
  [Semantic Versioning](https://semver.org/).
6
6
 
7
+ ## [2.12.3] - 2026-11-06
8
+
9
+ ### Fixed
10
+
11
+ - **Flash-Next follow-up turns reuse the conversation again** (#591, #616, #649). 2.12.2 saved a Flash-Next conversation without the draft head's history whenever it kept no live copy of it (OpenCode's tool turns, API clients that send no session id, a turn saved after it ended). The next turn could not resume from it and read the whole prompt again, reported as `new_session`. With OpenCode 1.19.5 on Flash-Next Bare Speed (M5 Max, October 30), 2.12.2 served 0 of 19 follow-up requests from the cache, with the first token in 3.0 to 9.9 s, and 2.12.3 served 30 of 30 and 98.4% of all prompt tokens, with a median first token of 0.18 s. With OpenCode 2.2.5 on Flash-Next Optimized Speed (November 4), 97.2% of prompt tokens came from the cache instead of none. Pi 1.4.0 was not affected (97.8% and 96.7%). A restore that finds an entry without the history now reports `no_snapshot_coverage`.
12
+ - **A new conversation about the same document resumes inside the earlier prompt** (#649, #637 by @jvmenen). The turn's final save keeps the restore points recorded while its prompt was read.
13
+ - **Plain Flash-Next chat with the SSD cache off resumes at the previous turn** (#291, reported by @nol166). Without the SSD cache, the point at the end of a plain chat prompt was saved only when tools were declared, so a client that sends answers back without their reasoning resumed every follow-up at the first turn's prompt. Flash-Next now saves it for plain chat too, without copying the conversation. Other models keep the old rule.
14
+ - **A retry or regenerate resumes from the saved prompt** (#661 by @a3rosol). The saved answer keeps the prompt's last logits (about 1 MB). A retry of a 16,000-token prompt read it again in 23.5 s on an M1 Ultra in the report.
15
+ - **Long sessions without a session id keep their cache** (#624). A difference inside an answer MTPLX generated no longer loses the session once the conversation grows (35,440 of 163,242 tokens restored and 95.6 s to the first token, in the report).
16
+ - **`MTPLX_MTP_HISTORY_POLICY=cycle` keeps the prompt cache** (#400, #422). Each turn was saved under a different label from the one the next turn looked for (166 s to the first token at 76,000 tokens on an M2 Ultra, from #422).
17
+ - **Plain decoding resumes each conversation from the previous turn.** With `--generation-mode ar`, `--no-mtp`, `--stock-ar` or `--no-load-mtp`, each prompt is saved before the answer, as with speculative decoding, instead of only after turns that added 1,024 tokens.
18
+ - **Flash-Next no longer fails with an HTTP 500 after a compaction** (#592, #605): `QSA pooled hold N rows; resizing to M would cut them`, on turns that resumed from the start of a longer saved conversation, and on their instant retries. The attention index's block count is taken from the restored conversation (#650 by @goodbadwolf), and a resize keeps only the blocks the conversation covers (adapted from #657 by @transcendence-x). A replay of #605 now resizes 122,880 bytes and runs on the compiled verifier.
19
+ - **A Flash-Next turn restored from the SSD cache no longer selects attention blocks from another conversation** (#635). In a replay, 25 of 64 new tokens got a different attention output on 2.12.2. A restored turn now decodes the same tokens and final logits as a cold start. Flash-Next conversations saved to the SSD cache by 2.11.2 to 2.12.2 are no longer used, because they may hold another conversation's blocks, so each reads its prompt once after updating, and the cache's normal eviction reclaims the old entries.
20
+ - **SSD restores run on the request's own cache layout** (#608 by @jvmenen, #668 by @CocoaBeans). On an M5 Pro with 64 GB and Qwen 3.8 27B Optimized Speed, a 62,000-token exact restore went from 50.1 to 303.2 tok/s prompt, 15.0 to 23.7 tok/s decode and 124.7 to 23.4 s to the first token (@CocoaBeans's measurement).
21
+ - **A conversation moved to the SSD cache restores its own state** (#609 by @jvmenen) instead of only a system prompt it shares with a conversation still in memory (143 to 146 s at 50,000 tokens in the report, or a 507). Candidates it does not use are released before its prompt is read.
22
+ - **Partial SSD restores work on paged and tail-owned caches** (#655, fixed in #656 by @Phydra11). They failed with `TypeError: int() ... NoneType`.
23
+ - **Flash-Next loads without its draft head again** with `--generation-mode ar --no-load-mtp` and with `--stock-ar` (#400).
24
+ - **A server at Metal's 499,000-buffer limit keeps serving** (#640). The guard releases idle conversations' saved state, and the 507 says the limit is a buffer count and when a restart is needed.
25
+ - **Claude Code.** Sessions follow Claude Code's session header and each subagent gets its own session (#606 by @jvmenen). Side requests no longer replace the conversation's cached turn, and `X-Claude-Code-Request-Class` is read when sent. `/effort low`, `medium` and `max` apply, while the default `high` keeps the server's default (#634 by @goodbadwolf). The auto-mode safety check runs without thinking (#670 by @phaedrus1992, for #669).
26
+ - **Codex.** `reasoning_summary_delivery` is accepted (#658), a preamble with its tool call is one assistant turn (#603), and the Responses stream sends a status event every 5 seconds while a long prompt is read, so Codex's idle timer no longer ends the turn before the first token (#680 by @SuperMarioYL).
27
+ - **OpenCode 2.x.** Title requests are answered without the model, so they no longer get your turn refused with "already in flight" or replace its cache. The 32,000-token default OpenCode 2.x sends is dropped, as the plugin did before; `--max-response-tokens` still applies. The app installs the same OpenCode plugin package as `mtplx`, with OpenCode 2.x's entry.
28
+ - **Clients can keep tool-call markup on requests without tools** (#674, #675 by @energypantry): `MTPLX_KEEP_ORPHAN_TOOL_MARKUP=on` for the whole server, or the `x-mtplx-keep-tool-markup: on` header or the `"keep_orphan_tool_markup": true` field per request.
29
+ - **OpenCode**: the tool-call example shows parameter syntax when any tool has parameters (#584).
30
+ - **An answer that ends inside an unclosed reasoning block is returned when tools are declared** (#583, #588 by @jvmenen).
31
+ - **The request log says what really happened to a request** (#652, #631, #600, #617 by @jvmenen): cancelled, nothing to reuse and why, refused with its reason, and how long it waited for other work.
32
+ - **Paste or drop images into the web chat** (#601).
33
+ - **`--scheduler-mode mtp_batch` says it serves the Qwen 3.6 35B-A3B packs only**, and which flags to drop.
34
+ - **DeepSeek MTP packs skip the output head when only the last row or no logits are needed** (#636 by @sypsyp97).
35
+ - **The opt-in incremental SSD encode no longer mistakes a block with flipped signs for the old one** (#596 by @jvmenen).
36
+ - **Structured output names why llguidance cannot load**, in the refusal and in `mtplx doctor` (#643).
37
+ - **Smart fan mode no longer leaves a watchdog process per ramp** (#602).
38
+ - **`mtplx forge build` works with a relative `--out`** (#627, diagnosed by @Starefossen).
39
+ - **Gemma 4 loaded without its draft model runs** (#632 by @jvmenen).
40
+ - **`lock_wait_time_s` includes the serial queue wait** (#576 by @jvmenen).
41
+ - **Tests ignore the shell's `MTPLX_` settings and never open the real session cache** (#644 by @jvmenen).
42
+
43
+ ### Added
44
+
45
+ - **`--trust-network`**: with `--no-auth`, serves without an API key on a non-localhost bind (#491). Either flag alone keeps the old behavior.
46
+ - **The dashboard's Cache tab shows what RAM and the SSD hold** (#622), the decode chart plots live samples over five minutes and shows the value under the cursor (#598, #626), and the verify waterfall is easier to read (#590), by @jvmenen.
47
+ - **The Live tab says when macOS slows the GPU because of heat**, in all 13 languages.
48
+
49
+ ### Changed
50
+
51
+ - **The app opens the Settings popover, the launch overlay and the model picker in one 0.2 s step**, asks the engine for a dashboard snapshot every 500 ms instead of every 100 ms during requests (once a second when its window is hidden), and draws the gauge on the GPU: 0.22 of a CPU core instead of 1.22 during a Flash-Next answer on an M5 Max.
52
+ - **Dependencies.** certifi 2026.10.18 in the lockfile (#672), and newer GitHub Actions in the release workflows (#612, #613, #664, #665), by @dependabot.
53
+
7
54
  ## [2.12.2] - 2026-10-03
8
55
 
9
56
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mtplx
3
- Version: 2.12.2
3
+ Version: 2.12.3
4
4
  Summary: Native MTP speculative decoding for Qwen3-Next on Apple Silicon.
5
5
  Author-email: Youssof Altoukhi <business@youssofal.com>
6
6
  License-Expression: Apache-2.0
@@ -2,6 +2,7 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ import inspect
5
6
  import os
6
7
  from typing import Any
7
8
 
@@ -806,6 +807,21 @@ def _install_split_attention_hook(attn: Any) -> bool:
806
807
  return True
807
808
 
808
809
 
810
+ def _takes_shared_kv(attn: Any) -> bool:
811
+ """True for attention that threads KV through ``shared_kv``/``offset``.
812
+
813
+ Gemma 4's ``Attention.__call__`` takes those keywords and returns
814
+ ``(out, (keys, values), offset)``; the generic hook's signature and return
815
+ value do not match. The Gemma 4 pair path runs its own attention and never
816
+ installs the hook, so a plain Gemma 4 load must be left alone as well.
817
+ """
818
+
819
+ try:
820
+ return "shared_kv" in inspect.signature(type(attn).__call__).parameters
821
+ except (TypeError, ValueError):
822
+ return False
823
+
824
+
809
825
  def _full_attention_layers(model: Any):
810
826
  text_model = getattr(model, "language_model", model)
811
827
  inner = getattr(text_model, "model", text_model)
@@ -821,6 +837,8 @@ def _full_attention_layers(model: Any):
821
837
  # semantics.
822
838
  if getattr(attn, "_mtplx_generic_sdpa_rewrites_unsupported", False):
823
839
  continue
840
+ if _takes_shared_kv(attn):
841
+ continue
824
842
  yield attn
825
843
 
826
844
 
@@ -3171,16 +3171,24 @@ def _restore_or_prefill_gemma4_prompt(
3171
3171
  if callable(candidates) and callable(restore_prefix):
3172
3172
  from mtplx.session_bank import _restore_identity_compatible
3173
3173
 
3174
- for entry, matched in candidates(
3175
- prompt_ids,
3176
- model_path=str(runtime.model_path),
3177
- mtp_enabled=bool(runtime.mtp_enabled),
3178
- hidden_variant="gemma4_pre_norm",
3179
- template_hash=session_template_hash,
3180
- mtp_history_policy=GEMMA4_SESSION_STATE_POLICY,
3181
- draft_head_identity=session_draft_head_identity,
3182
- policy_fingerprint=session_policy_fingerprint,
3183
- ):
3174
+ # Taken off the list as each one is tried, so a refused candidate
3175
+ # (the SSD tier decodes its row before this lane sees it) is not
3176
+ # held through a later candidate's tail forward or the cold
3177
+ # prefill below; the untried rest go before that forward too.
3178
+ pending = list(
3179
+ candidates(
3180
+ prompt_ids,
3181
+ model_path=str(runtime.model_path),
3182
+ mtp_enabled=bool(runtime.mtp_enabled),
3183
+ hidden_variant="gemma4_pre_norm",
3184
+ template_hash=session_template_hash,
3185
+ mtp_history_policy=GEMMA4_SESSION_STATE_POLICY,
3186
+ draft_head_identity=session_draft_head_identity,
3187
+ policy_fingerprint=session_policy_fingerprint,
3188
+ )
3189
+ )
3190
+ while pending:
3191
+ entry, matched = pending.pop(0)
3184
3192
  matched = int(matched)
3185
3193
  if (
3186
3194
  matched < 2
@@ -3227,9 +3235,20 @@ def _restore_or_prefill_gemma4_prompt(
3227
3235
  prefix_restore = cache = _history = boundary_hidden = None
3228
3236
  continue
3229
3237
  seed = restore_point - 1
3238
+ pending.clear()
3239
+ # A candidate the SSD tier decoded is this request's own copy,
3240
+ # already cloned into ``cache``; a RAM entry stays with the
3241
+ # bank, which keeps its hits.
3242
+ banked = (
3243
+ None
3244
+ if getattr(entry, "cache_source", "ram") == "ssd"
3245
+ else entry
3246
+ )
3247
+ entry = None
3230
3248
  output, _suffix_elapsed = forward(list(prompt_ids[seed:]), cache)
3231
- entry.hits += 1
3232
- entry.last_access_s = time.time()
3249
+ if banked is not None:
3250
+ banked.hits += 1
3251
+ banked.last_access_s = time.time()
3233
3252
  return Gemma4PromptState(
3234
3253
  cache=cache,
3235
3254
  logits=output.logits[:, -1, :],
@@ -3243,6 +3262,7 @@ def _restore_or_prefill_gemma4_prompt(
3243
3262
  cache_miss_reason=None,
3244
3263
  restore_mode=f"block_prefix_{storage_mode}",
3245
3264
  )
3265
+ entry = None
3246
3266
  return cold_prefill(getattr(session_bank, "last_miss_reason", None))
3247
3267
 
3248
3268
  suffix = list(prompt_ids[restored.entry.prefix_len :])
@@ -103,6 +103,15 @@ INCREMENTAL_WHOLE_TENSOR_MIN_BYTES = 1024 * 1024
103
103
  _UINT_VIEW_BY_ITEMSIZE: dict[int, Any] = {1: mx.uint8, 2: mx.uint16, 4: mx.uint32}
104
104
 
105
105
 
106
+ def _mix32(bits: Any) -> Any:
107
+ """Per-element uint32 mixer (lowbias32 variant; uint32 ops wrap in MLX)."""
108
+ h = bits ^ (bits >> mx.array(16, dtype=mx.uint32))
109
+ h = h * mx.array(0x7FEB352D, dtype=mx.uint32)
110
+ h = h ^ (h >> mx.array(15, dtype=mx.uint32))
111
+ h = h * mx.array(0x846CA68B, dtype=mx.uint32)
112
+ return h ^ (h >> mx.array(16, dtype=mx.uint32))
113
+
114
+
106
115
  def content_fingerprints(value: Any, *, rows: int | None = None) -> list[int] | None:
107
116
  """64-bit content fingerprints of a tensor, computed on the GPU.
108
117
 
@@ -111,9 +120,11 @@ def content_fingerprints(value: Any, *, rows: int | None = None) -> list[int] |
111
120
  without it, one fingerprint for the whole tensor. The fingerprint reads
112
121
  the raw bits (an unsigned view, so -0.0/+0.0 and NaN payloads differ)
113
122
  and folds them into two position-weighted sums modulo 2**32: one linear,
114
- one over the squared bits. Integer arithmetic makes it exact and
115
- order-independent; a single changed element always changes the linear
116
- sum (odd weights). Returns None for dtypes without a same-size unsigned
123
+ one over the bits after a non-linear 32-bit mixer. Integer arithmetic
124
+ makes it exact and order-independent; a single changed element always
125
+ changes the linear sum (odd weights). The mixer replaces an earlier
126
+ squared-bits term that was blind to sign flips (b*b == (-b)*(-b) for the
127
+ top bit), so an even number of float32 sign flips collided. Returns None for dtypes without a same-size unsigned
117
128
  view (e.g. 8-byte types), which then take the normal copy path.
118
129
  """
119
130
  view_dtype = _UINT_VIEW_BY_ITEMSIZE.get(int(value.dtype.size))
@@ -142,7 +153,7 @@ def content_fingerprints(value: Any, *, rows: int | None = None) -> list[int] |
142
153
  weight_b = (index * mx.array(0x85EBCA6B, dtype=mx.uint32)
143
154
  + mx.array(0xC2B2AE35, dtype=mx.uint32)) | mx.array(1, dtype=mx.uint32)
144
155
  sum_a = mx.sum(bits * weight_a, axis=1)
145
- sum_b = mx.sum((bits * bits) * weight_b, axis=1)
156
+ sum_b = mx.sum(_mix32(bits) * weight_b, axis=1)
146
157
  mx.eval(sum_a, sum_b)
147
158
  return [
148
159
  ((int(a) & 0xFFFFFFFF) << 32) | (int(b) & 0xFFFFFFFF)
@@ -812,17 +823,22 @@ def _spec_items(spec: Any) -> list[Any]:
812
823
 
813
824
 
814
825
  def _none_tree_like(spec: Any) -> Any:
815
- """Return a shape-compatible tree whose leaves are ``None``.
826
+ """Return a positional tree of ``None``: one ``None`` per top-level item.
816
827
 
817
828
  CacheSnapshot's outer state/meta tuples are positional. Keeping that
818
- shape lets ``restore_cache`` skip every original full-prefix meta state.
829
+ shape lets ``restore_cache`` skip every original full-prefix meta state,
830
+ but it only skips an item that *is* ``None``. The items must therefore
831
+ not be recursed into: a layer whose meta state is a tuple (the paged KV
832
+ cache's ``(block_size, num_blocks, offset)``) would otherwise become
833
+ ``(None, None, None)``, not be skipped, and crash ``int(value[2])`` in
834
+ its ``meta_state`` setter (TypeError on every partial-prefix SSD restore).
819
835
  """
820
836
 
821
837
  kind = spec.get("kind") if isinstance(spec, dict) else None
822
838
  if kind == "tuple":
823
- return tuple(_none_tree_like(item) for item in spec.get("items") or [])
839
+ return tuple(None for _ in spec.get("items") or [])
824
840
  if kind == "list":
825
- return [_none_tree_like(item) for item in spec.get("items") or []]
841
+ return [None for _ in spec.get("items") or []]
826
842
  return None
827
843
 
828
844
 
@@ -374,6 +374,7 @@ class SessionBankColdTier:
374
374
  # the pre-shadow call shape.
375
375
  SUPPORTS_RESIDENT_DUPLICATE_SHADOW = True
376
376
  SUPPORTS_MIN_USEFUL_MATCHED_TOKENS = True
377
+ SUPPORTS_MIN_RESTORE_POINT = True
377
378
 
378
379
  def __init__(
379
380
  self,
@@ -1118,6 +1119,66 @@ class SessionBankColdTier:
1118
1119
  self._set_last_miss("ssd_prefix_miss")
1119
1120
  return None
1120
1121
 
1122
+ def exact_prefix_len(
1123
+ self,
1124
+ token_ids: list[int] | tuple[int, ...],
1125
+ *,
1126
+ model_path: str,
1127
+ mtp_enabled: bool,
1128
+ hidden_variant: str | None = None,
1129
+ template_hash: str | None = None,
1130
+ mtp_history_policy: str | None = None,
1131
+ draft_head_identity: str | None = None,
1132
+ policy_fingerprint: str | None = None,
1133
+ ) -> int:
1134
+ """Length of the longest stored entry that is a whole prefix of
1135
+ ``token_ids``, read from the manifest alone (no tensor is read).
1136
+
1137
+ The rows are the ones ``lookup`` would try, under the row gates
1138
+ ``_restore_row`` applies before it reads a tensor, and without the
1139
+ rows ``SessionBank._restore_cold`` refuses once read: a request that
1140
+ names a hidden variant needs the entry's final logits and hidden
1141
+ (``ssd_missing_mtp_generation_state``), which a row carries exactly
1142
+ when the bank stamped ``mtp_full`` on it. A probe, not a lookup: no
1143
+ counter and no miss reason change.
1144
+ """
1145
+ if self.mode in {"off", "write-only"}:
1146
+ return 0
1147
+ tokens = tuple(int(token) for token in token_ids)
1148
+ if not tokens:
1149
+ return 0
1150
+ try:
1151
+ rows = self._candidate_rows(
1152
+ tokens,
1153
+ model_path=model_path,
1154
+ mtp_enabled=mtp_enabled,
1155
+ hidden_variant=hidden_variant,
1156
+ template_hash=template_hash,
1157
+ mtp_history_policy=mtp_history_policy,
1158
+ draft_head_identity=draft_head_identity,
1159
+ policy_fingerprint=policy_fingerprint,
1160
+ )
1161
+ for row in rows:
1162
+ if int(row["format_version"]) != COLD_TIER_FORMAT_VERSION:
1163
+ continue
1164
+ epoch = row["mtp_snapshot_epoch"]
1165
+ if epoch is not None and int(epoch) != int(row["snapshot_epoch"]):
1166
+ continue
1167
+ if hidden_variant is not None and not _row_carries_generation_state(row):
1168
+ continue
1169
+ prefix = tuple(
1170
+ int(token) for token in json.loads(str(row["token_ids_json"]))
1171
+ )
1172
+ if prefix and tokens[: len(prefix)] == prefix:
1173
+ return len(prefix)
1174
+ except Exception as exc:
1175
+ logger.warning(
1176
+ "SessionBank SSD exact-prefix probe failed: %s: %s",
1177
+ type(exc).__name__,
1178
+ exc,
1179
+ )
1180
+ return 0
1181
+
1121
1182
  def lookup_prefix_boundary(
1122
1183
  self,
1123
1184
  token_ids: list[int] | tuple[int, ...],
@@ -1136,7 +1197,14 @@ class SessionBankColdTier:
1136
1197
  allow_block_prefix: bool = True,
1137
1198
  resident_duplicates: dict[str, dict[str, Any]] | None = None,
1138
1199
  min_useful_matched_tokens: int = 0,
1200
+ min_restore_point: int = 0,
1139
1201
  ) -> ColdPrefixRestoreRecord | None:
1202
+ # min_restore_point: the lowest point the caller can restore at. A
1203
+ # hybrid row restores at its newest recurrent boundary at or below
1204
+ # the match, which the row's payload.json gives before any tensor is
1205
+ # read; a row whose boundary lies below this point is refused
1206
+ # undecoded and the next one is tried (see _restore_row).
1207
+ #
1140
1208
  # resident_duplicates: token_hash -> {prefix_len, has_mtp_history}
1141
1209
  # for RAM entries the caller has ALREADY proven identity-compatible
1142
1210
  # with this request, snapshot-capable (never live-ref-only), and
@@ -1262,6 +1330,7 @@ class SessionBankColdTier:
1262
1330
  require_exact_prefix=False,
1263
1331
  include_gdn_boundaries=True,
1264
1332
  prefix_restore_tokens=int(candidate_matched),
1333
+ min_restore_point=int(min_restore_point),
1265
1334
  )
1266
1335
  if record is not None:
1267
1336
  return ColdPrefixRestoreRecord(
@@ -1297,7 +1366,7 @@ class SessionBankColdTier:
1297
1366
  row_has_mtp = "mtp_full" in row_caps or row["mtp_snapshot_epoch"] is not None
1298
1367
  return (not row_has_mtp) or bool(dup.get("has_mtp_history"))
1299
1368
 
1300
- def _manifest_stats_row(self) -> tuple[int, int, int, int, int]:
1369
+ def _manifest_stats_row(self) -> tuple[Any, ...]:
1301
1370
  """The stats() aggregate, opening the manifest only when it changed.
1302
1371
 
1303
1372
  Before 2.8.2 every stats() call — i.e. every /health and dashboard
@@ -1327,7 +1396,11 @@ class SessionBankColdTier:
1327
1396
  "COALESCE(SUM(CASE WHEN physical_nbytes > 0 "
1328
1397
  "THEN physical_nbytes ELSE nbytes END), 0), "
1329
1398
  "COALESCE(SUM(deduped_nbytes), 0), "
1330
- "COALESCE(MAX(max(nbytes, logical_nbytes)), 0) FROM entries"
1399
+ "COALESCE(MAX(max(nbytes, logical_nbytes)), 0), "
1400
+ "COUNT(DISTINCT session_id), "
1401
+ "COALESCE(SUM(CASE WHEN session_id IS NULL THEN 1 ELSE 0 END), 0), "
1402
+ "MIN(created_at_s), MAX(created_at_s), "
1403
+ "COALESCE(SUM(CASE WHEN hits = 0 THEN 1 ELSE 0 END), 0) FROM entries"
1331
1404
  ).fetchone()
1332
1405
  row = (
1333
1406
  int(fetched[0]),
@@ -1335,6 +1408,11 @@ class SessionBankColdTier:
1335
1408
  int(fetched[2]),
1336
1409
  int(fetched[3]),
1337
1410
  int(fetched[4]),
1411
+ int(fetched[5]),
1412
+ int(fetched[6]),
1413
+ None if fetched[7] is None else float(fetched[7]),
1414
+ None if fetched[8] is None else float(fetched[8]),
1415
+ int(fetched[9]),
1338
1416
  )
1339
1417
  with self._manifest_stats_lock:
1340
1418
  self._manifest_stats_cache = {
@@ -1373,6 +1451,15 @@ class SessionBankColdTier:
1373
1451
  stats["deduped_bytes"] = int(row[3])
1374
1452
  logical = max(1, int(row[1]))
1375
1453
  stats["dedupe_ratio"] = max(0.0, float(row[3]) / float(logical))
1454
+ # What the store holds, for the dashboard's cache overview: how
1455
+ # many conversations the snapshots belong to (rows written
1456
+ # without a session id are counted apart), how old the oldest
1457
+ # and newest snapshot are, and how many were never restored.
1458
+ stats["sessions"] = int(row[5])
1459
+ stats["entries_without_session"] = int(row[6])
1460
+ stats["oldest_created_at_s"] = row[7]
1461
+ stats["newest_created_at_s"] = row[8]
1462
+ stats["never_restored_entries"] = int(row[9])
1376
1463
  usage = self._managed_disk_usage()
1377
1464
  managed_file_bytes = int(usage.get("managed_file_bytes", 0))
1378
1465
  managed_disk_bytes = int(usage.get("managed_disk_bytes", 0))
@@ -2662,6 +2749,7 @@ class SessionBankColdTier:
2662
2749
  require_exact_prefix: bool = True,
2663
2750
  include_gdn_boundaries: bool = False,
2664
2751
  prefix_restore_tokens: int | None = None,
2752
+ min_restore_point: int = 0,
2665
2753
  ) -> ColdRestoreRecord | None:
2666
2754
  metadata = dict(row)
2667
2755
  token_ids = tuple(int(token) for token in json.loads(str(metadata["token_ids_json"])))
@@ -2723,6 +2811,18 @@ class SessionBankColdTier:
2723
2811
  self._inc("prefix_restores_without_boundary")
2724
2812
  self._set_last_miss("ssd_prefix_no_recurrent_boundary")
2725
2813
  return None
2814
+ if (
2815
+ has_recurrent
2816
+ and boundary_prefix is not None
2817
+ and boundary_prefix < int(min_restore_point)
2818
+ ):
2819
+ # The restore would land below the lowest point the caller
2820
+ # can use (the near lane's floor: its exact prefix in RAM or
2821
+ # on SSD). The lane refused such a candidate only after this
2822
+ # decode, as boundary_not_better.
2823
+ self._inc("prefix_restores_below_caller_floor")
2824
+ self._set_last_miss("ssd_prefix_boundary_below_floor")
2825
+ return None
2726
2826
  # Cache types whose metadata couples rolling state to their
2727
2827
  # tensors must use the exact decoder plus trim; so does a hybrid
2728
2828
  # entry without a boundary when boundary-true restores are off.
@@ -3338,3 +3438,20 @@ def _policy_compatible(entry_policy: str | None, lookup_policy: str | None) -> b
3338
3438
  if entry_policy is None or lookup_policy is None:
3339
3439
  return False
3340
3440
  return entry_policy in _COMMITTED_CACHE_POLICIES and lookup_policy in _COMMITTED_CACHE_POLICIES
3441
+
3442
+
3443
+ def _row_carries_generation_state(row: sqlite3.Row) -> bool:
3444
+ """Whether a manifest row holds its entry's final logits and hidden.
3445
+
3446
+ The bank stamps ``mtp_full`` on a row exactly when the entry it writes
3447
+ has both (``SessionBank._cold_enqueue_job``, ``run_live_ref_spill``); a
3448
+ lease returned at a boundary has no logits for its last position and is
3449
+ written without it. Unreadable capabilities count as carrying them, as
3450
+ ``_shadowed_by_resident_duplicate`` assumes a maximal row.
3451
+ """
3452
+
3453
+ try:
3454
+ capabilities = {str(item) for item in json.loads(str(row["capabilities_json"] or "[]"))}
3455
+ except Exception:
3456
+ return True
3457
+ return "mtp_full" in capabilities
@@ -3660,7 +3660,19 @@ def build_parser() -> argparse.ArgumentParser:
3660
3660
  serve_p.add_argument(
3661
3661
  "--no-auth",
3662
3662
  action="store_true",
3663
- help="Disable API-key auth for localhost binds (non-localhost still requires a key)",
3663
+ help=(
3664
+ "Disable API-key auth. A non-localhost bind also needs "
3665
+ "--trust-network"
3666
+ ),
3667
+ )
3668
+ serve_p.add_argument(
3669
+ "--trust-network",
3670
+ action="store_true",
3671
+ help=(
3672
+ "With --no-auth, serve without an API key on a non-localhost bind "
3673
+ "(--host 0.0.0.0). Anyone who can reach the port can use the "
3674
+ "model: only on a network you trust"
3675
+ ),
3664
3676
  )
3665
3677
  serve_p.add_argument("--depth", type=int, default=3)
3666
3678
  _add_mtp_toggle_args(serve_p)
@@ -169,7 +169,10 @@ def _load_json(path: Path) -> dict[str, Any]:
169
169
  def _run_dir(out: str | Path, run_id: str) -> Path:
170
170
  if not str(run_id).strip():
171
171
  raise ForgeError("--run-id is required", code=2)
172
- root = Path(out).expanduser()
172
+ # Absolute, because the steps hand paths inside the run to subprocesses
173
+ # that run with cwd=run: a relative --out made the contract probe write
174
+ # its result under run/run/ and calibration report agreement 0.0 (#627).
175
+ root = Path(out).expanduser().resolve()
173
176
  run = root / str(run_id)
174
177
  run.mkdir(parents=True, exist_ok=True)
175
178
  return run
@@ -2760,6 +2760,24 @@ def _render_doctor_report(args: Any, report: dict[str, Any]) -> int:
2760
2760
  f"{'available' if thermal.get('available') else 'not configured'}"
2761
2761
  f" ({selected.get('kind') or 'none'})"
2762
2762
  )
2763
+ structured = next(
2764
+ (
2765
+ check
2766
+ for check in (report.get("diagnostics") or {}).get("checks") or ()
2767
+ if check.get("id") == "python.dep.llguidance"
2768
+ ),
2769
+ None,
2770
+ )
2771
+ if structured is not None:
2772
+ if structured.get("status") == "pass":
2773
+ observed = structured.get("observed") or {}
2774
+ print(
2775
+ "structured output: ready "
2776
+ f"(llguidance {observed.get('installed_version')})"
2777
+ )
2778
+ else:
2779
+ print(f"structured output: {structured.get('fix')}")
2780
+ print(f" fix: {structured.get('command')}")
2763
2781
  fence = report.get("compiled_verify") or {}
2764
2782
  if fence:
2765
2783
  print(
@@ -9605,10 +9623,18 @@ def cmd_serve_public(args: Any) -> int:
9605
9623
  _print_serve_start_line(f"error: {exc}")
9606
9624
  return 2
9607
9625
  api_key = getattr(args, "api_key", None)
9608
- if not _is_localhost_bind(getattr(args, "host", None)) and not api_key:
9626
+ keyless_network = bool(getattr(args, "no_auth", False)) and bool(
9627
+ getattr(args, "trust_network", False)
9628
+ )
9629
+ if (
9630
+ not _is_localhost_bind(getattr(args, "host", None))
9631
+ and not api_key
9632
+ and not keyless_network
9633
+ ):
9609
9634
  payload = {
9610
9635
  "error": "--api-key or --api-key-file is required when --host is not localhost",
9611
9636
  "host": getattr(args, "host", None),
9637
+ "trusted_network_opt_out": "mtplx serve --no-auth --trust-network",
9612
9638
  }
9613
9639
  if getattr(args, "json", False):
9614
9640
  _print(payload)
@@ -9622,6 +9648,10 @@ def cmd_serve_public(args: Any) -> int:
9622
9648
  print(
9623
9649
  f"try: mtplx {server_command} --host 0.0.0.0 --api-key-file ~/.mtplx/api-key"
9624
9650
  )
9651
+ print(
9652
+ "on a network you trust: mtplx serve --host 0.0.0.0 --no-auth "
9653
+ "--trust-network (anyone who can reach the port can use the model)"
9654
+ )
9625
9655
  return 2
9626
9656
  cli_flags = getattr(args, "_cli_flags", set()) or set()
9627
9657
  _apply_model_id_as_model_default(
@@ -10064,6 +10094,8 @@ def cmd_serve_public(args: Any) -> int:
10064
10094
  # spelling died at this parser with an argparse error.
10065
10095
  if bool(getattr(args, "no_auth", False)):
10066
10096
  cmd.append("--no-auth")
10097
+ if bool(getattr(args, "trust_network", False)):
10098
+ cmd.append("--trust-network")
10067
10099
  # The chat model is already an absolute path by this point, but retrieval
10068
10100
  # references are resolved inside the server, which has no cache directory
10069
10101
  # of its own — so a model pulled into a custom --cache-dir would not be