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.
- {mtplx-2.12.2 → mtplx-2.12.3}/CHANGELOG.md +47 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/PKG-INFO +1 -1
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/attention_split.py +18 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/backends/gemma4_assistant.py +32 -12
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/cache_bank/codec.py +24 -8
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/cache_bank/cold_tier.py +119 -2
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/cli.py +13 -1
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/commands/forge.py +4 -1
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/commands/public.py +33 -1
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/constrained.py +93 -9
- mtplx-2.12.3/mtplx/dashboard/_static/assets/index-BtBFF4M2.css +1 -0
- mtplx-2.12.3/mtplx/dashboard/_static/assets/index-D8G5hadf.js +286 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/dashboard/_static/index.html +2 -2
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/deepseek_mtp_patch.py +8 -1
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/diagnostics.py +38 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/engine_session.py +217 -11
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/errors.py +17 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/generation.py +260 -24
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/models/qwen4_exp.py +15 -1
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/one_copy.py +9 -2
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/opencode.py +1 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/server/dashboard_state.py +5 -1
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/server/flight_recorder.py +22 -2
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/server/openai.py +822 -67
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/server/request_policy.py +3 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/server/request_spans.py +13 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/server/responses.py +59 -8
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/session_bank.py +189 -4
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/thermal_sidecar.py +18 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/version.py +2 -2
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx.egg-info/PKG-INFO +1 -1
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx.egg-info/SOURCES.txt +38 -2
- {mtplx-2.12.2 → mtplx-2.12.3}/pyproject.toml +1 -1
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/release_macos_v1.sh +29 -16
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/sparkle_rehearsal_kit.sh +4 -2
- mtplx-2.12.3/tests/test_ar_prompt_state_commit.py +340 -0
- mtplx-2.12.3/tests/test_attention_split_gemma4.py +59 -0
- mtplx-2.12.3/tests/test_auto_mode_classifier.py +183 -0
- mtplx-2.12.3/tests/test_bank_history_policy_operator_override.py +115 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_cache_bank.py +71 -2
- mtplx-2.12.3/tests/test_claude_code_session_header.py +154 -0
- mtplx-2.12.3/tests/test_claude_code_side_requests.py +152 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_cold_tier_disk_usage_scan.py +1 -1
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_cold_tier_incremental_encode.py +90 -11
- mtplx-2.12.3/tests/test_cold_tier_manifest_overview.py +101 -0
- mtplx-2.12.3/tests/test_cold_tier_restore_point_floor.py +159 -0
- mtplx-2.12.3/tests/test_cycle_policy_session_resume.py +78 -0
- mtplx-2.12.3/tests/test_deepseek_mtp_logits.py +97 -0
- mtplx-2.12.3/tests/test_flash_next_no_load_mtp_lane.py +108 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_flight_recorder.py +45 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_forge_cli.py +14 -0
- mtplx-2.12.3/tests/test_gemma4_near_lane_releases.py +162 -0
- mtplx-2.12.3/tests/test_generation_final_prompt_checkpoints.py +145 -0
- mtplx-2.12.3/tests/test_keep_orphan_tool_markup_opt_out.py +90 -0
- mtplx-2.12.3/tests/test_llguidance_availability.py +180 -0
- mtplx-2.12.3/tests/test_mtp_batch_model_family.py +98 -0
- mtplx-2.12.3/tests/test_near_lane_releases_refused.py +285 -0
- mtplx-2.12.3/tests/test_near_lane_spilled_exact_prefix.py +312 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_one_copy_conversation.py +20 -0
- mtplx-2.12.3/tests/test_one_copy_snapshot_history.py +354 -0
- mtplx-2.12.3/tests/test_one_copy_stale_pooled_frontier.py +227 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_opencode.py +3 -1
- mtplx-2.12.3/tests/test_opencode_side_requests.py +215 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_postcommit_cross_session_yield.py +36 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_prefill_reread.py +40 -0
- mtplx-2.12.3/tests/test_prefix_decode_meta_skip.py +157 -0
- mtplx-2.12.3/tests/test_qsa_pooled_index_identity.py +82 -0
- mtplx-2.12.3/tests/test_qsa_ssd_prefix_restore.py +347 -0
- mtplx-2.12.3/tests/test_qsa_ssd_restore_generation.py +118 -0
- mtplx-2.12.3/tests/test_qsa_state_restore_frontier.py +34 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_ram_miss_reason.py +51 -4
- mtplx-2.12.3/tests/test_resource_count_shed.py +203 -0
- mtplx-2.12.3/tests/test_responses_codex_turns.py +177 -0
- mtplx-2.12.3/tests/test_responses_summary_delivery.py +60 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_server_openai.py +737 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_server_responses.py +35 -0
- mtplx-2.12.3/tests/test_session_identity_inside_turn_624.py +103 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_session_identity_turn_boundary.py +7 -3
- mtplx-2.12.3/tests/test_ssd_restore_cache_layout.py +135 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_stream_error_receipt.py +38 -0
- mtplx-2.12.3/tests/test_suite_hermetic_environment.py +38 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_thermal_sidecar.py +76 -0
- mtplx-2.12.3/tests/test_tool_example_parameters.py +113 -0
- mtplx-2.12.3/tests/test_trusted_network_no_auth.py +92 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_ttft_spans.py +30 -0
- mtplx-2.12.3/tests/test_unclosed_reasoning_with_tools.py +286 -0
- mtplx-2.12.3/tests/test_web_chat_images.py +67 -0
- mtplx-2.12.2/mtplx/dashboard/_static/assets/index-BTDFdIWu.css +0 -1
- mtplx-2.12.2/mtplx/dashboard/_static/assets/index-DIdoATFR.js +0 -273
- {mtplx-2.12.2 → mtplx-2.12.3}/CITATION.cff +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/LICENSE +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/MANIFEST.in +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/NOTICE +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/README.md +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/__init__.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/a3b_compiled_target_prefix.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/a3b_mtp_batch.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/a3b_whole_moe.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/adaptive.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/adaptive_dtemp.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/app_settings.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/aria2_downloader.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/arrays_cache_patch.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/artifacts.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/attention_context.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/attention_math.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/backends/__init__.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/backends/deepseek_mtp.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/backends/descriptors.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/backends/family_settings.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/backends/glm_mtp.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/backends/hy_v3_mtp.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/backends/mimo_mtp.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/backends/nemotron_h_mtp.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/backends/qwen3_next.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/backends/registry.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/backends/step3p5_mtp.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/batched_decode.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/batching/__init__.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/batching/admission.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/batching/buckets.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/batching/scheduler.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/batching/state.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/__init__.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/code_eval.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/programming_prompts.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/prompts/aime_2026.jsonl +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/prompts/calibration_coding.jsonl +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/prompts/default.jsonl +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/prompts/flappy.jsonl +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/prompts/long_code.jsonl +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/prompts/long_code_uncapped.jsonl +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/prompts/python_modules_long.jsonl +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/__init__.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/aime.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/batch_equivalence.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/capture_commit_equivalence.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/competitor_baselines.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/contract_probe.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/harness.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/mtp1_gate.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/mtp1_sampler_smoke.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/mtp_adaptive.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/mtp_chain_probe.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/mtp_depth_grid.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/mtp_depth_sweep.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/mtp_tree_probe.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/multi_qmv_probe.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/preflight.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/runtime_smoke.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/session_bank.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/truth.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/verify_profile.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/verify_qmm_probe.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/runners/verify_ratio.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/schema.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/validators/__init__.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/validators/aime.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/benchmarks/validators/basic.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/block_attention.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/cache_bank/__init__.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/cache_bank/disk_budget.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/cache_bank/reconcile.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/cache_state.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/chat_encode_cache.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/chat_encoding.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/checkpoint_anchors.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/commands/__init__.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/commands/forge_mixed_convert.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/commands/forge_qwen4_audit.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/commands/forge_qwen4_exp.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/commands/trace.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/commands/trace_analysis.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/commands/trace_clients.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/commands/trace_metrics.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/commands/trace_record.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/commands/trace_report.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/compile_state.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/compiled_forward.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/compressed_tensors.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/config.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/constants.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/context_copy.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/correctors/__init__.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/correctors/diagonal_affine.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/correctors/low_rank.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/daemon_client.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/dashboard/__init__.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/data/qwen38_code_ranked_64k.npy +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/deepseek_v4_adaptive_width.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/deepseek_v4_attention_island.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/deepseek_v4_attn_proj_wide_m3.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/default_models.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/demotions.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/dense_mrope.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/draft_lm_head.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/draft_sampling.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/env.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/expert_layout.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/fan_mode.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/fast_sampling.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/float32_operand.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/forkev_telemetry.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/frspec_draft.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/gdn_capture.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/gemma4_pair.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/glm_mtp_patch.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/graphbank.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/hardware.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/hf_loader.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/hy_v3_mtp_patch.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/jsonc.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernel_selfcheck.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/__init__.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/a3b_whole_moe.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/copy_leaf.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/fused_norm.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/gdn_blocked_prefill.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/gdn_conv_norm.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/gdn_gated_norm.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/gdn_out_fused.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/gdn_prefill_prework.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/gdn_step_fused.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/gdn_tape_headquarter.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/hadamard_rotate.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/hc_prefill.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/hc_verify_read.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/hyper_connection.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/hyper_connection_v3.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/laguna_decode.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/laguna_dense_mlp.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/laguna_gated_oproj.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/laguna_moe_combine.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/laguna_moe_gather_gemm.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/laguna_moe_merged.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/laguna_moe_shared.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/laguna_moe_swiglu.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/laguna_prefill_moe_combine.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/laguna_prefill_qk_rope.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/laguna_prefill_router.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/laguna_qk_rope_sliding.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/laguna_qk_yarn_full.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/laguna_qkvg_fused.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/laguna_residual_router.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/laguna_route_csort.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/laguna_router_topk.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/laguna_sdpa_2pass.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/laguna_sdpa_pair.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/laguna_steel_attn.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/lm_head_topk.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/logits_topk.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/moe_glu_decode.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/moe_sorted_gather_nax.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/native_gdn_tail.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/qmv4_matmul.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/qsa_dense_band_sdpa.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/qsa_flash_skip.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/qsa_indexer_compile.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/qsa_indexer_prefill.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/qsa_indexer_prepare.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/qsa_indexer_select.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/qsa_pooled_row.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/qsa_prefill_direct.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/qsa_prefill_flash.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/qsa_prefill_probe.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/qsa_verify_select.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/qwen4_m4_rope.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/qwen4_m4_route.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/qwen4_m4_routed_down.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/qwen4_m4_routed_glu.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/qwen4_m4_stage3.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/qwen4_moe_prefill_combine.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/qwen4_qsa_m4_fused_kv_gather.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/sdpa_2pass.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/sdpa_2pass_paged.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/sdpa_2pass_paged_q8.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/sdpa_gqa_packed.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/sdpa_gqa_packed_quant.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/sdpa_nax_flash.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/sdpa_nax_flash_dsplit.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/sdpa_nax_tile.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/ternary_qmv.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/verify_mlp_fused.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kernels/vqmm_crossrow.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kpi/__init__.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kpi/reference_vllm.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kpi/runtime_kpis.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/kv_quant.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/laguna_alt_step.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/laguna_compiled_step.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/lane_explain.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/launch_lane.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/lfm2_fast.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/loop_guard.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/memory_plan.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/metadata_scrub.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/mimo_mtp_patch.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/mlx_process_env.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/model_catalog.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/model_scheduler.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/model_updates.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/models/__init__.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/models/deepseek_v4.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/models/laguna.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/models/laguna_config.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/models/laguna_fused.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/models/prism_hadamard_qwen35.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/moe_packed_projections.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/moe_sorted_gather.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/mtp_activation_stats.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/mtp_adapters.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/mtp_batch_numerics.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/mtp_history_cache_only.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/mtp_patch.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/native_mlp.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/nax_detect.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/nax_verify.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/nemotron_h_mtp_patch.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/ngram_row_layout.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/optimization_profiles.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/os_memory.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/packed_concats.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/pi.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/ple_prefill_lookahead.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/ple_row_gather.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/prefill_bench.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/prefill_plan.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/prefill_rungs.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/profiles.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/progress_heartbeat.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/proj_fusion.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/proj_quant.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/proposal_reranker.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/qsa_mtp_precompute.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/qsa_restore_staging.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/qwen3_5_mtp_patch.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/qwen4_block_verify.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/qwen4_claim_contract.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/qwen4_draft_device_chain.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/qwen4_draft_k20_prescatter.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/qwen4_fixed_verify.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/qwen4_m4_stage3.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/qwen4_prefill_profile.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/qwen4_verify_glue.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/qwen_row_owned_router.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/ragged_attention.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/ragged_kv_cache.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/reasoning_codecs.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/reasoning_effort.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/request_capture.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/retrieval.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/roofline_profile.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/rope_origin.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/route_tape.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/runtime.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/runtime_options.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/sampling.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/server/__init__.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/server/hyper.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/server/mtp_batch.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/server/omlx_bridge/__init__.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/server/omlx_bridge/adapter.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/server/omlx_bridge/thinking.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/server/omlx_bridge/tool_calling.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/server/prefill_safety.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/server/response_envelope.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/server/retry_prompt.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/server/served_window.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/server/stream_rate.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/server/stream_recovery.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/server_urls.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/speculative.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/step3p5_mtp_patch.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/swival.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/system_memory.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/templates/qwen36_froggeric_v19/chat_template.jinja +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/templates/qwen36_froggeric_v21_3/chat_template.jinja +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/thermal.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/thermal_pressure.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/thinking_guard.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/trace_parity.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/turboquant.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/ui/__init__.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/ui/banner.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/ui/chat_printer.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/ui/download_progress.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/ui/onboarding.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/ui/panels.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/ui/progress.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/vendored_arrays_cache.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/vendored_hy_v3.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/verify_crossrow.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/verify_kernels.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/verify_qmv.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/vision/__init__.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/vision/mrope.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/vision/processing.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/vision/qwen3_vl_tower.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/vision/splice.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx/vision_graft.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx.egg-info/dependency_links.txt +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx.egg-info/entry_points.txt +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx.egg-info/requires.txt +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/mtplx.egg-info/top_level.txt +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/agent_session_gate.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/agent_user_path_qa.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/aime_serve_gate.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/aime_shape_memory_bench.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/analyze_head_sweeps.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/audit_agent_prompt_fidelity.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/audit_catalog_sizes.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/bonsai_memory_table.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/build_bonsai_mtplx_pack.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/build_flash_next_quality_pack.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/build_flash_next_quality_pack.sh +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/bundle_native_runtime_wheel.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/check_ai_attribution.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/check_prompt_scoring.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/code_eval_gate.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/collect_mtp_activation_stats.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/collect_mtp_hidden_calib.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/combine_mtp_adapters.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/compiled_verify_exactness.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/convert_qwen4_exp_fp8.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/convert_step37_to_mtplx_step3p5.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/decodecliff_probe_20260830.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/decodecliff_pulse_cell_20260830.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/deepseek_v4_adaptive_width_arms.sh +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/deepseek_v4_adaptive_width_guarded.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/deepseek_v4_attention_island_arms.sh +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/deepseek_v4_attention_island_guarded.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/deepseek_v4_attn_proj_wide_m3_arms.sh +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/deepseek_v4_attn_proj_wide_m3_guarded.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/deepseek_v4_build_mtp_model.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/deepseek_v4_decode_verify.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/deepseek_v4_dispatch_census.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/deepseek_v4_guard_window.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/deepseek_v4_logits_gate.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/deepseek_v4_moe_tail_arms.sh +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/deepseek_v4_moe_tail_gate.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/deepseek_v4_moe_tail_guarded_bracket.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/deepseek_v4_mtp_bind_check.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/deepseek_v4_mtpk_bench.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/deepseek_v4_op_census.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/deepseek_v4_smoke_generate.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/deepseek_v4_sparse_gate_probe.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/deepseek_v4_validate_moe_tail_k3_bracket.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/dense_mrope_parity_ours.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/dense_mrope_reference_check.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/dense_vision_compiled_parity.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/eval_mtp_corrector.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/filter_mtp_adapter.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/fp16_turbo_exactness_20260707.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/fresh_venv_smoke.sh +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/gauntlet_scoreboard.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/gen_models_manifest.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/graft_vision_tower.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/hygiene_scan.sh +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/install_macos.sh +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/install_preview_global.sh +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/kvcache_exactness_audit_20260703.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/kvcache_soak_20260703.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/kvcache_warm_probe_20260703.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/make_fp16_precision_sibling.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/measure_request_capture.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/midform_gate.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/model_release_policy.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/mtp_cost_probe.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/oc_tap.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/oc_tap_diff.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/opencode_concurrency_qa.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/phase0h_paged_verifier_exactness.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/pillar_gate_qa.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/probe_mlx_pr3026_qsdpa.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/probe_mx_compile_buckets.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/probe_paged_gqa_sdpa_routes.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/qsa_indexer_prefill_numeric_check.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/qsa_prefill_battery2_20260830.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/qsa_prefill_battery_20260830.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/qsa_prefill_flash_numeric_check.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/quality_fp16_parent_logitdiff_20260707.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/qwen35b_mtp_batch_evalplus_guarded.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/qwen35b_mtp_batch_numerics_attribution.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/qwen35b_mtp_batch_numerics_guarded.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/qwen4_quality_component_parity.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/qwen4_vision_compiled_parity.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/qwen4exp_mtp_tiny_smoke.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/qwen4exp_numeric_check.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/r1_chisquare_verifier_correctness.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/render_release_notes.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/replay_chat_request.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/restamp_head_quant_packs.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/run_context_degradation_diagnostics.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/run_harness_check.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/select_runtime_wheel.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/serve_openai_mtplx.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/session_cache_followup_qa.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/session_forensics.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/step_acceptance.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/step_smoke.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/stream_qa_gate.sh +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/train_mtp_adapter_c4.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/upload_head_quant_packs.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/validate_step_mtp_injector.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/walltime-lab/run_project.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/scripts/write_launch_lane_matrix.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/setup.cfg +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_a3b_compiled_target_prefix.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_a3b_mtp_batch.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_a3b_mtp_batch_driver.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_a3b_whole_moe.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_adaptive.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_adaptive_dtemp.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_admission_keeps_the_conversation.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_agent_prompt_fidelity.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_agent_rewrites_off_retries.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_aime_serve_gate.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_allow_swap_427.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_answer_memory_stop.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_answer_room_request.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_api_benchmark_contracts.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_app_cli_env_parity.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_ar_batch_cache_family_guard_420.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_ar_batch_penalties.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_ar_batch_ragged_ssm_mask.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_aria2_downloader.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_arrays_cache_patch.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_artifacts.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_async_decode.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_attention_gate_exactness.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_attention_split.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_background_warmup.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_bank_history_policy.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_batch_pump_heartbeat.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_batched_decode.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_batched_greedy_argmax_tiebreak.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_batching_foundation.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_bench_depth_sweep_flags.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_blank_retry_greedy.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_block_verify_exact_law.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_bonsai_memory_table.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_bonsai_pack_metadata.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_bracket_tool_rescue.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_build_bonsai_mtplx_pack.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_bundle_native_runtime_wheel.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_cache_state.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_canon_gate_hardening.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_canon_policy_smalls.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_canon_postcommit_extension.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_canonicalize_multimodal.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_ccopy_bank_route.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_chat_encode_cache.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_chat_segment_memo.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_chat_turn_segments.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_checkpoint_anchors.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_checkpoint_pre_image.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_cli_greedy_draft_coupling.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_cli_parity_tools.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_client_controls_default.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_code_eval.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_code_eval_gate.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_cold_encode_bounded_units.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_cold_prefix_ram_shadow.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_cold_tier_backlog_admission.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_cold_tier_defaults.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_cold_tier_disk_budget.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_cold_tier_eviction_yield.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_cold_tier_foreground_yield.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_cold_tier_min_useful_matched.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_cold_tier_reconcile.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_cold_tier_recurrent_boundary_gate.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_cold_tier_stats_cache.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_cold_tier_transactional_replace.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_cold_tier_write_budget.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_committed_reasoning_canonicalization.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_committed_token_splice.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_compile_state.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_compiled_ar_wiring.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_compiled_forward.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_compiled_verify_evaluated_weights.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_compiled_verify_tf32_off.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_compressed_tensors.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_config.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_config_profile_precedence.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_constrained.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_context_copy_joined_tokens.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_context_copy_ramp.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_context_copy_stats.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_context_degradation_profiles.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_convert_qwen4_exp_fp8_scales.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_copy_block_accept.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_correctors.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_cost_depth_policy.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_daemon_client.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_dashboard_endpoints.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_death_signature_macos27.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_decode_growth_guards.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_decoded_state_lifetime.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_deepseek_v4_adaptive_width_bracket.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_deepseek_v4_adaptive_width_policy.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_deepseek_v4_attention_island.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_deepseek_v4_attention_island_bracket.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_deepseek_v4_attn_proj_wide_m3.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_deepseek_v4_attn_proj_wide_m3_bracket.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_deepseek_v4_decode.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_deepseek_v4_dtypes.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_deepseek_v4_indexer.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_deepseek_v4_kernel_paths.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_deepseek_v4_loader.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_deepseek_v4_moe_tail.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_deepseek_v4_moe_tail_bracket.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_deepseek_v4_mtp.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_deepseek_v4_new_math.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_deepseek_v4_o_lora.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_deepseek_v4_parity.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_deepseek_v4_sinkhorn_kernel.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_deepseek_v4_spec.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_deepseek_v4_swiglu_clamp.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_default_models.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_demotions.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_demotions_generation_sites.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_demotions_graphbank_sites.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_demotions_qsa_prefill_sites.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_dense_decode_max_context.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_dense_mrope.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_dense_mrope_compiled_route.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_dense_mrope_generation.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_dense_vision_compiled_parity_script.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_descriptor_family_collisions.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_descriptors_mimo_tune.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_descriptors_qwen4_exp_tune.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_device_draft_core.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_diagnostics.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_doctor_failed_start.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_download_progress.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_draft_confidence_trace.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_draft_launch_provenance.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_draft_lm_head.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_draft_lm_head_chunked_requantization.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_draft_telemetry_truth.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_draft_temp_policy.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_encode_seam_unification.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_endpoint_probe_hygiene.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_engine_session_concurrency.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_engine_session_env.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_env_flag_parsing.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_exact_verify_route.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_exactness_320_319.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_expected_value_greedy.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_family_settings.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_fast_sampling.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_final_committed_frontier_byte_skip.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_final_tool_preamble_stream_parity.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_finish_stop_origin.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_finished_answers_are_never_regenerated.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_first_token_logprobs_api.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_first_token_logprobs_gemma4.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_fixed_m4_dispatch_guard.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_flash_next_quality_m5_ultra.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_float32_operand.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_forge_discover_filter.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_forge_family_serve_depths.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_forge_mixed_convert.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_forge_mtp_key_forms.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_forge_mtp_norm_convention.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_forge_quality_build_script.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_forge_qwen4_exp_lane.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_forge_qwen4_exp_roundtrip.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_forge_verify_depths.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_forkev_telemetry.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_fused_add_rmsnorm_exactness.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_gdn_blocked_prefill.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_gdn_boundary_retention.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_gdn_capture_rows.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_gdn_conv_norm_fused.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_gdn_conv_norm_rows.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_gdn_gated_norm.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_gdn_out_fused.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_gdn_postconv_fusion.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_gdn_postconv_impl_gate.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_gdn_prefill_prework.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_gdn_step_fused.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_gdn_tape_headquarter.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_gemma4_chunked_prefill.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_gemma4_prompt_scoring.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_gemma4_rotating_cache_trim.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_gemma4_scoring_cache.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_gemma4_scoring_policy.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_gemma4_session_cache.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_gemma4_tokenizer_probe.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_generation_rate_fields.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_generation_store_on_prefill.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_generation_sustained.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_graphbank_compiled_verify.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_graphbank_program_retirement.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_graphbank_trace_lifetime.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_greedy_confidence_runner_telemetry.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_greedy_draft_coupling.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_greedy_trio_ports.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_hc_prefill.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_hc_verify_read.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_health_qwen4_install_reports.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_hermes_native_contract.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_hf_loader.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_hidden_tool_guard_opt_in.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_host_memory_allowance.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_hy_v3_mtp_backend.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_hy_v3_mtp_graft.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_hygiene_scan.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_hyper_scheduler.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_hyper_v3.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_idle_persistence_pump.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_idle_postcommit_subagent.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_idle_session_release.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_install_macos_script.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_issue_404_macos27_mpp_compat.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_jsonc.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_kernel_selfcheck.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_kernel_selfcheck_bonsai.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_kernel_selfcheck_qwen4_prefill.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_kv_attention_trace_526.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_kv_quant_memory.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_kv_quant_meta_state_rewind_526.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_kv_quant_q4_kernel_route.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_laguna_alt_step.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_laguna_compiled_step.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_laguna_fused.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_laguna_model.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_laguna_steel_attn.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_launch_lane.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_lazy_snapshot_cow.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_lease_keeps_draft_history.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_lease_survives_aborted_prefill.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_lfm2_descriptor_resolution.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_lfm2_fast.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_loop_guard.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_max_idle_watchdog.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_max_lifecycle.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_memguard_admission.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_memguard_backend_contract.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_memguard_degraded.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_memguard_dense_qsa.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_memguard_lease_growth.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_memguard_limit_allowances.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_memguard_moe_rows.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_memguard_ownership.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_memguard_pressure_trim.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_memguard_queued_persistence.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_memguard_release_protection.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_memguard_snapshot_width.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_memory_limit_g5.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_memory_plan.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_memory_plan_bonsai.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_memory_pressure_guard.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_metadata_scrub.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_metal_memory_caps.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_midform_gate.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_mimo_catalog.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_mlx_process_env.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_model_catalog.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_model_scheduler.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_model_scheduler_persistence.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_model_updates.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_moe_force_unsorted.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_moe_glu_decode.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_moe_glu_verify.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_moe_packed_projections.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_moe_sorted_gather.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_moe_sorted_gather_nax.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_mtp_activation_stats.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_mtp_adapters.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_mtp_alias_load_path.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_mtp_batch_numerics.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_mtp_batch_serving.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_mtp_depth_n.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_mtp_depth_sweep.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_mtp_final_state_covers_committed_tokens.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_mtp_fused_experts.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_mtp_history_cache_only.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_mtp_history_settled.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_mtp_norm_convention.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_mtp_patch.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_mtp_payload_guards.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_mtp_weightless_degrade.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_nax_attention_hardware.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_nax_detect.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_nax_verify.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_ngram_prewarm_option.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_ngram_prewarm_reservation.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_ngram_row_hotness.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_ngram_row_layout.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_ngram_table_memory.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_no_mlx_imports.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_non_finite_logits_and_lazy_sampler_law.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_omlx_bridge.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_omlx_bridge_late_system_messages.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_onboarding.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_one_copy_admission.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_one_copy_cancelled_answer.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_one_copy_postcommit.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_one_copy_reserve_resize.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_one_copy_restarted_draft_history.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_one_shot_family_contract.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_openai_bridge.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_optimization_profiles.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_orphan_stream_guard_first_line.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_orphan_tool_markup.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_owner_idle_pool.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_pack_contract_states.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_paged_tailmask_elide.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_parallel_tool_prompt_policy.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_passive_probe_telemetry.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_penalties.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_penalty_request_wiring.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_persistent_replay.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_phase0h_paged_verifier_exactness.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_phys_footprint_guard.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_policy_fingerprint_stability.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_postcommit_arrival_wait.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_postcommit_prefix_reuse.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_postcommit_resolve_for_request.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_postcommit_tools_plumbing.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_postcommit_wait.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_postcommit_wait_integration.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_postcommit_wait_progress.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_pre_first_token_telemetry.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_prefill_admission_shed.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_prefill_bench.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_prefill_chunk_defaults.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_prefill_geometric_tail.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_prefill_inforward_boundary_capture.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_prefill_tps_regression.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_pressure_abort_393.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_prism_bonsai_kernels.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_prism_hadamard_qwen35.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_profile_default_resolution.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_profiles.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_proj_fusion.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_proj_quant.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_promoted_paged_capacity_526.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_prompt_encoding.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_prompt_publication_is_request_local.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_prompt_scoring_admission.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_prompt_scoring_parent.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_prompt_scoring_probe.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_prompt_scoring_topk.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_public_cli.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_pull_tls_trust.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_px3_planner_seats.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qmv4_matmul.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_dense_band_sdpa.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_fixed_bank_score_scale.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_flash_skip.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_gate_safety.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_gather.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_gather_rows.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_index_block_writes_evaluated.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_indexer_compile.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_indexer_fused_integration.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_indexer_prefill_mpp_runtime.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_indexer_prefill_runtime_blocks.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_indexer_prefill_simd_topk.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_indexer_prefill_static.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_indexer_prepare_metal.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_indexer_select_metal.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_memory_plan_393.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_mtp_precompute.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_mtp_precompute_wiring.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_pooled_row.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_portable_producer_gate.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_prefill_direct.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_prefill_direct_greedy.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_prefill_direct_numeric.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_prefill_direct_routing.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_prefill_direct_static.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_prefill_flash_contract.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_prefill_flash_direct_parity.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_prefill_flash_static.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_prefill_gather_tier.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_prefill_runtime_gates_static.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_prefill_wiring.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_restore_staging.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_selector_prefix_contract.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_tiled_scores.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qsa_verify_select.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_quant_partials_fp16_526.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen35b_mtp_batch_evalplus_guarded.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen35b_mtp_batch_numerics_attribution.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen35b_mtp_batch_numerics_guarded.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen38_family.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen3_5_mtp_backend.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen3_5_mtp_object_level.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen3_5_mtp_sidecar_norms.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_block_verify.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_bucket_publication.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_capacity_consumers.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_claim_contract.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_compiled_mtp_prepare.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_draft_chain_pipeline.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_draft_device_chain.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_draft_k20_prescatter.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_exp_capture_commit.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_exp_compile.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_exp_gdn_inproj_fusion.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_exp_inforward_boundary_capture.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_exp_qsa_cache.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_exp_qsa_qkv_fusion.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_exp_rope.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_fixed_bank_bf16_parity.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_fixed_bank_capacity.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_fixed_host_tokens_static.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_fixed_m4_capacity_bucket.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_fixed_m4_copy_windows.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_fixed_m4_float32_admission.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_fixed_m4_gate_cache.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_fixed_m4_growth_layerwise.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_fixed_m4_verify_exactness.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_fixed_m4_vision_admission.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_frspec_native.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_growth_recovery.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_hc_prefill_compile.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_hc_prefill_read_switch.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_m4_routed_glu.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_m4_stage3.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_m4_stage3_residual_tail.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_moe_prefill_combine.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_moe_sorted_rows.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_mtp_history_cache_only.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_opdiet.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_ple_first_gather_early.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_ple_gate_exactness.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_ple_lookahead_restored_suffix.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_ple_prefill_lookahead.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_ple_serving_verdicts.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_prefill_dq_gemm.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_prefill_midloop_eval.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_prefill_profile_hc.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_qsa_m4_fused_kv_gather.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_route_kernel.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_rows_gather_scale.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_verify_gate_sites.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_verify_glue.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_verify_sdpa_head_chunk.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_vision_compiled_parity_cpu.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_vision_compiled_parity_script.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_vision_compiled_route_e2e.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_vision_mrope.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_wide_prefill_chunk.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen4_yarn_amplitude.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_qwen_row_owned_router.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_ragged_kv_cache.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_reasoning_stream_split.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_recovery_metrics_attribution.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_release_2114_catalog.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_release_2114_manifest.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_release_notes_template.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_release_pins.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_release_qa_fixwave.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_repetition_stop_legitimate_code.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_repetition_stop_long_cycle.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_request_capture.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_request_log_privacy.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_request_observability_golden.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_response_envelope_parity.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_retrieval.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_retry_prompt_reuses_served_ids.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_route_tape.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_runtime_ar_final_state.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_runtime_deepseek_v4_o_lora.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_runtime_env_flags_refresh.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_runtime_env_latebind.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_runtime_kpis.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_runtime_model_alias.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_runtime_obs_graphbank.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_runtime_obs_kernel_bails.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_runtime_obs_profiles.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_runtime_obs_stream_holdback.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_runtime_scheduler_histogram.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_runtime_session_sizing.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_sampling.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_scoped_reasoning_history.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_sdpa_gqa_packed.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_sdpa_gqa_packed_quant.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_sdpa_nax_flash.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_sdpa_nax_tile.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_select_runtime_wheel.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_serve_generation_mode_default.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_serve_network_share.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_served_window.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_server_obs_caps_and_health.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_server_obs_postcommit_health.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_server_obs_reasoning_rows.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_server_obs_stream_termination.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_server_origin_policy.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_session_bank.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_session_bank_boundary_shed.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_session_bank_chain_shed.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_session_bank_env_caps.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_session_bank_gc.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_session_bank_lease_accounting.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_session_bank_protected_terminal.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_session_bank_recurrent_partial_restore.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_session_bank_restore_aliasing.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_session_bank_snapshot_settle.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_small_mac_prefill.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_smart_fan_stall_probe.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_smart_fan_wedged_request.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_snapshot_free_rejection_repair.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_source_wrapper.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_split_partials_fp16_526.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_ssd_boundary_repersist.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_ssd_spill.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_stable_prefix_boundary.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_start_reuses_chosen_model.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_stats_footer_scope.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_step3p5_mtp_patch.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_stop_resend_session_continuity.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_stream_guard_env.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_stream_phase_rate.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_stream_recovery_paths.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_stream_release_pacer.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_stream_response_tail.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_stream_splitter_contract.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_stream_stall_watchdog.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_stream_transcript_golden.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_stream_visible_cadence.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_sustained_long_context_qa.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_system_memory_guard.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_tail_ar_warm_restore_identity.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_tail_config_sampler_presence.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_tail_gemma4_stream_holdback.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_tail_profile_truth.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_tensoroffset_kv_inplace.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_thermal.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_thermal_pressure.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_thinking_guard.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_thinking_splitter_marker_quotes.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_tiny_max_tokens_warning_436.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_tokenizer_pretokenizer_repair.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_tool_aware_stream_translator.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_tool_call_hidden_guard_and_key_repair.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_tool_choice_prompt_modes.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_tool_fed_retry_parsed_call.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_tool_nested_args_streaming.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_trace_diagnostics.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_trace_incidents.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_trace_parity.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_tune_qwen4_exp_verify_strategy.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_tune_record_wizard_parity.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_turboquant.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_turboquant_fallback.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_ui_progress.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_validators.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_verify_crossrow.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_verify_kernels_rehearsal.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_vision_control_literals.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_vision_keyed_partial_restore.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_vision_keyed_restore_rules.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_vision_restore_span_guard.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_vision_session_cache.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_vision_session_frontier_gate.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_vision_session_restore.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_vision_tower.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_vision_trunk_forward_positions.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_vllm_reference.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_wide_prefill_chunk_after_reclaim.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/tests/test_working_set.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/vllm_metal/__init__.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/vllm_metal/metal/README.md +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/vllm_metal/metal/__init__.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/vllm_metal/metal/build.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/vllm_metal/metal/constants.py +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/vllm_metal/metal/kernels_v1/copy_blocks.metal +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/vllm_metal/metal/kernels_v1/float8.metal +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/vllm_metal/metal/kernels_v1/gather_kv_cache.metal +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/vllm_metal/metal/kernels_v1/kv_scale_update.metal +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/vllm_metal/metal/kernels_v1/pagedattention.metal +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/vllm_metal/metal/kernels_v1/reshape_and_cache.metal +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/vllm_metal/metal/kernels_v1/utils.metal +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/vllm_metal/metal/kernels_v2/copy_blocks.metal +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/vllm_metal/metal/kernels_v2/float8.metal +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/vllm_metal/metal/kernels_v2/gather_kv_cache.metal +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/vllm_metal/metal/kernels_v2/gdn_linear_attention.metal +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/vllm_metal/metal/kernels_v2/kv_scale_update.metal +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/vllm_metal/metal/kernels_v2/pagedattention.metal +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/vllm_metal/metal/kernels_v2/reshape_and_cache.metal +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/vllm_metal/metal/kernels_v2/turboquant.metal +0 -0
- {mtplx-2.12.2 → mtplx-2.12.3}/vllm_metal/metal/kernels_v2/utils.metal +0 -0
- {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
|
|
@@ -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
|
-
|
|
3175
|
-
|
|
3176
|
-
|
|
3177
|
-
|
|
3178
|
-
|
|
3179
|
-
|
|
3180
|
-
|
|
3181
|
-
|
|
3182
|
-
|
|
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
|
-
|
|
3232
|
-
|
|
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
|
|
115
|
-
order-independent; a single changed element always
|
|
116
|
-
sum (odd weights).
|
|
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
|
|
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
|
|
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(
|
|
839
|
+
return tuple(None for _ in spec.get("items") or [])
|
|
824
840
|
if kind == "list":
|
|
825
|
-
return [
|
|
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[
|
|
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)
|
|
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=
|
|
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
|
-
|
|
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
|
-
|
|
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
|