diff --git a/Makefile b/Makefile index 3d156e6e7..fc4bc7a88 100644 --- a/Makefile +++ b/Makefile @@ -164,7 +164,7 @@ help: ## Show this help message @grep -E '^[a-zA-Z0-9_.-]+:.*?## .*$$' $(MAKEFILE_LIST) | grep -E '(clean|fmt|install)' | grep -v '^bench' | awk 'BEGIN {FS = ":.*?## "}; {printf " $(CYAN)%-20s$(RESET) %s\n", $$1, $$2}' @echo "" @echo "$(BOLD)Maintenance Targets:$(RESET)" - @grep -E '^[a-zA-Z0-9_.-]+:.*?## .*$$' $(MAKEFILE_LIST) | grep -E '^(update|tree|outdated|verify-versions|verify-kernel-dtype-keys|verify-env-var-docs|verify-binary-assets|verify-windows-paths|bump-version):' | awk 'BEGIN {FS = ":.*?## "}; {printf " $(CYAN)%-20s$(RESET) %s\n", $$1, $$2}' + @grep -E '^[a-zA-Z0-9_.-]+:.*?## .*$$' $(MAKEFILE_LIST) | grep -E '^(update|tree|outdated|verify-versions|verify-kernel-dtype-keys|verify-env-var-docs|verify-binary-assets|verify-windows-paths|reports-index|verify-reports-index|bump-version):' | awk 'BEGIN {FS = ":.*?## "}; {printf " $(CYAN)%-20s$(RESET) %s\n", $$1, $$2}' @echo "" @echo "$(BOLD)Variables:$(RESET)" @echo " $(CYAN)MODEL$(RESET) Path to model directory (default: ./models/default)" @@ -971,6 +971,20 @@ verify-windows-paths: ## Assert no tracked path is a Windows device name such as @python3 scripts/ci/check_windows_reserved_paths.py @bash scripts/ci/check_windows_reserved_paths_test.sh +# TECHNICAL_REPORTS/README.md is generated from the report files (issue #1708). +# Run `reports-index` after adding or renaming a report. The staleness check +# also runs in `verify-python-tooling` (and so in CI's python-tooling job) +# through tests/test_gen_reports_index.py, which holds its negative coverage. +.PHONY: reports-index +reports-index: ## Regenerate the TECHNICAL_REPORTS/README.md index (issue #1708) + @python3 scripts/ci/gen_reports_index.py + +.PHONY: verify-reports-index +verify-reports-index: ## Assert the TECHNICAL_REPORTS/README.md index is current (issue #1708) + @echo "$(CYAN)[verify] technical reports index...$(RESET)" + @python3 scripts/ci/gen_reports_index.py --check + @python3 -m unittest tests/test_gen_reports_index.py + # Offline structural half of the llama-server b10621 compatibility gate # (issue #1443, epic #1431): validates the checked-in manifest under # compat/llama-server/b10621/ without network or the b10621 archive. The diff --git a/TECHNICAL_REPORTS/README.md b/TECHNICAL_REPORTS/README.md new file mode 100644 index 000000000..dc2e18b5f --- /dev/null +++ b/TECHNICAL_REPORTS/README.md @@ -0,0 +1,508 @@ +# Technical reports + +This directory holds one technical report per merged change, each in English +(`.en.md`) and Korean (`.ko.md`). A report records what the change did, how it +was validated and what it left open. The number is the one in the file name, +which is the PR the report covers in nearly every case. + +This index is generated by `scripts/ci/gen_reports_index.py` from the file +names and each report's title and date lines. Do not edit it by hand: after +adding or renaming a report, run `make reports-index`. CI fails when this file +is stale. + +## Index + +490 reports. + +| # | Title | Date | English | Korean | +|---|-------|------|---------|--------| +| [#2683](https://github.com/lablup/mlxcel/pull/2683) | Cluster Authentication Settings Fixture | 2026-10-27 | [en](2683-cluster-auth-settings-fixture-20261027.en.md) | [ko](2683-cluster-auth-settings-fixture-20261027.ko.md) | +| [#2682](https://github.com/lablup/mlxcel/pull/2682) | quantized vision parameters | 2026-10-27 | [en](2682-quantized-vision-parameters-20261027.en.md) | [ko](2682-quantized-vision-parameters-20261027.ko.md) | +| [#2681](https://github.com/lablup/mlxcel/pull/2681) | Wave Zero Contract Fixes | 2026-10-27 | [en](2681-wave-zero-contract-fixes-20261027.en.md) | [ko](2681-wave-zero-contract-fixes-20261027.ko.md) | +| [#2680](https://github.com/lablup/mlxcel/pull/2680) | Push Stage Assignments to --pp-peer Processes | 2026-10-27 | [en](2680-zero-config-stage-push-assignment-20261027.en.md) | [ko](2680-zero-config-stage-push-assignment-20261027.ko.md) | +| [#2679](https://github.com/lablup/mlxcel/pull/2679) | Expert-batched NVFP4 sorted-gather prefill on ROCm, validated on Nemotron-H | 2026-10-27 | [en](2679-rocm-nvfp4-expert-batched-prefill-20261027.en.md) | [ko](2679-rocm-nvfp4-expert-batched-prefill-20261027.ko.md) | +| [#2678](https://github.com/lablup/mlxcel/pull/2678) | Mamba2 native batched decode | 2026-10-27 | [en](2678-mamba2-native-batched-decode-20261027.en.md) | [ko](2678-mamba2-native-batched-decode-20261027.ko.md) | +| [#2677](https://github.com/lablup/mlxcel/pull/2677) | binary parity fixture declarations | 2026-10-27 | [en](2677-binary-parity-fixture-declarations-20261027.en.md) | [ko](2677-binary-parity-fixture-declarations-20261027.ko.md) | +| [#2674](https://github.com/lablup/mlxcel/pull/2674) | Cap pre-auth handshake slots, type handshake rejections, authenticate disaggregated roles | 2026-10-27 | [en](2674-handshake-hardening-disaggregated-role-auth-20261027.en.md) | [ko](2674-handshake-hardening-disaggregated-role-auth-20261027.ko.md) | +| [#2673](https://github.com/lablup/mlxcel/pull/2673) | Native decode for model-owned attention families | 2026-10-27 | [en](2673-model-owned-attention-batching-20261027.en.md) | [ko](2673-model-owned-attention-batching-20261027.ko.md) | +| [#2672](https://github.com/lablup/mlxcel/pull/2672) | model-owned cache batching | 2026-10-27 | [en](2672-model-owned-cache-batching-20261027.en.md) | [ko](2672-model-owned-cache-batching-20261027.ko.md) | +| [#2671](https://github.com/lablup/mlxcel/pull/2671) | Keep remote pipeline stages on the dense kernel path | 2026-10-27 | [en](2671-remote-pipeline-dense-kernel-parity-20261027.en.md) | [ko](2671-remote-pipeline-dense-kernel-parity-20261027.ko.md) | +| [#2670](https://github.com/lablup/mlxcel/pull/2670) | GPT-OSS native batched decode | 2026-10-27 | [en](2670-gpt-oss-native-batched-decode-20261027.en.md) | [ko](2670-gpt-oss-native-batched-decode-20261027.ko.md) | +| [#2669](https://github.com/lablup/mlxcel/pull/2669) | Cover the donated LayerNorm cotangent, the gemv fallback and empty norms on ROCm | 2026-10-27 | [en](2669-rocm-overlay-test-gaps-20261027.en.md) | [ko](2669-rocm-overlay-test-gaps-20261027.ko.md) | +| [#2668](https://github.com/lablup/mlxcel/pull/2668) | Read the CORS origin variables after parsing so they no longer trip clap's conflict check | 2026-10-27 | [en](2668-cors-origin-env-conflict-20261027.en.md) | [ko](2668-cors-origin-env-conflict-20261027.ko.md) | +| [#2667](https://github.com/lablup/mlxcel/pull/2667) | Port Prism Bonsai ternary 2-bit FLUX.2 | 2026-10-27 | [en](2667-port-prism-bonsai-ternary-flux2-20261027.en.md) | [ko](2667-port-prism-bonsai-ternary-flux2-20261027.ko.md) | +| [#2662](https://github.com/lablup/mlxcel/pull/2662) | Port Z-Image text-to-image and img2img | 2026-10-27 | [en](2662-port-z-image-image-generation-20261027.en.md) | [ko](2662-port-z-image-image-generation-20261027.ko.md) | +| [#2661](https://github.com/lablup/mlxcel/pull/2661) | Skip host-shadow flushes after CPU reads and count shadow memory | 2026-10-27 | [en](2661-rocm-host-shadow-reads-20261027.en.md) | [ko](2661-rocm-host-shadow-reads-20261027.ko.md) | +| [#2660](https://github.com/lablup/mlxcel/pull/2660) | Port FLUX.2 Klein text-to-image and editing | 2026-10-27 | [en](2660-port-flux2-klein-image-generation-20261027.en.md) | [ko](2660-port-flux2-klein-image-generation-20261027.ko.md) | +| [#2659](https://github.com/lablup/mlxcel/pull/2659) | Dequantize the PaddleOCR-VL vision position table | 2026-10-27 | [en](2659-paddleocr-vl-quantized-pos-embed-20261027.en.md) | [ko](2659-paddleocr-vl-quantized-pos-embed-20261027.ko.md) | +| [#2652](https://github.com/lablup/mlxcel/pull/2652) | Add a Windows build CI job and run the runtime-dir host tests | 2026-10-27 | [en](2652-windows-build-ci-host-tests-20261027.en.md) | [ko](2652-windows-build-ci-host-tests-20261027.ko.md) | +| [#2651](https://github.com/lablup/mlxcel/pull/2651) | Run Windows CUDA builds from a relocatable runtime bundle | 2026-10-27 | [en](2651-windows-cuda-runtime-bundle-20261027.en.md) | [ko](2651-windows-cuda-runtime-bundle-20261027.ko.md) | +| [#2650](https://github.com/lablup/mlxcel/pull/2650) | Authenticate cluster transports and correlate stage replies | 2026-10-27 | [en](2650-authenticate-cluster-transports-correlate-replies-20261027.en.md) | [ko](2650-authenticate-cluster-transports-correlate-replies-20261027.ko.md) | +| [#2649](https://github.com/lablup/mlxcel/pull/2649) | Stop disclosing internal DNS in media URL errors | 2026-10-27 | [en](2649-media-url-disclosure-redirect-dns-20261027.en.md) | [ko](2649-media-url-disclosure-redirect-dns-20261027.ko.md) | +| [#2648](https://github.com/lablup/mlxcel/pull/2648) | Prefer Windows ROCm bundle headers over HIP_PATH and add GPU targets | 2026-10-27 | [en](2648-bundle-headers-gpu-targets-20261027.en.md) | [ko](2648-bundle-headers-gpu-targets-20261027.ko.md) | +| [#2647](https://github.com/lablup/mlxcel/pull/2647) | Bind PaddleOCR, ERNIE and Hunyuan VL MRoPE per sequence | 2026-10-27 | [en](2647-bind-paddleocr-ernie-hunyuan-mrope-20261027.en.md) | [ko](2647-bind-paddleocr-ernie-hunyuan-mrope-20261027.ko.md) | +| [#2646](https://github.com/lablup/mlxcel/pull/2646) | Adopt native window SDPA for Metal prefill | 2026-10-27 | [en](2646-native-window-sdpa-metal-prefill-20261027.en.md) | [ko](2646-native-window-sdpa-metal-prefill-20261027.ko.md) | +| [#2645](https://github.com/lablup/mlxcel/pull/2645) | Skip self-hosted CI jobs for pull requests from forks | 2026-10-27 | [en](2645-self-hosted-fork-pr-guards-20261027.en.md) | [ko](2645-self-hosted-fork-pr-guards-20261027.ko.md) | +| [#2636](https://github.com/lablup/mlxcel/pull/2636) | Guard empty and 64-bit sizes in ROCm norm VJP, gemv and GatherQMM | 2026-10-26 | [en](2636-rocm-empty-64bit-size-guards-20261026.en.md) | [ko](2636-rocm-empty-64bit-size-guards-20261026.ko.md) | +| [#2635](https://github.com/lablup/mlxcel/pull/2635) | Write the layer_norm VJP bias gradient on ROCm | 2026-10-26 | [en](2635-rocm-layer-norm-bias-grad-20261026.en.md) | [ko](2635-rocm-layer-norm-bias-grad-20261026.ko.md) | +| [#2631](https://github.com/lablup/mlxcel/pull/2631) | Key the bf16 addmm and vision oracles on what each backend computes | 2026-10-26 | [en](2631-metal-addmm-oracle-keys-20261026.en.md) | [ko](2631-metal-addmm-oracle-keys-20261026.ko.md) | +| [#2630](https://github.com/lablup/mlxcel/pull/2630) | Clear VLM fallback state when admission aborts | 2026-10-26 | [en](2630-clear-vlm-fallback-admission-abort-20261026.en.md) | [ko](2630-clear-vlm-fallback-admission-abort-20261026.ko.md) | +| [#2629](https://github.com/lablup/mlxcel/pull/2629) | Native NVFP4 qmm and gather_qmm kernels on ROCm | 2026-10-26 | [en](2629-rocm-native-nvfp4-kernels-20261026.en.md) | [ko](2629-rocm-native-nvfp4-kernels-20261026.ko.md) | +| [#2628](https://github.com/lablup/mlxcel/pull/2628) | Native batched decode for Gemma 3n | 2026-10-27 | [en](2628-gemma3n-native-batched-decode-20261027.en.md) | [ko](2628-gemma3n-native-batched-decode-20261027.ko.md) | +| [#2627](https://github.com/lablup/mlxcel/pull/2627) | Split per-row softmax and norm grids past the HIP limit | 2026-10-26 | [en](2627-rocm-row-grid-split-20261026.en.md) | [ko](2627-rocm-row-grid-split-20261026.ko.md) | +| [#2624](https://github.com/lablup/mlxcel/pull/2624) | Widen ROCm gather QMV output offsets to 64 bits | 2026-10-26 | [en](2624-gather-qmv-int64-offsets-20261026.en.md) | [ko](2624-gather-qmv-int64-offsets-20261026.ko.md) | +| [#2623](https://github.com/lablup/mlxcel/pull/2623) | Match MLX in eager ROCm complex64 and bool casts | 2026-10-26 | [en](2623-rocm-complex-bool-cast-20261026.en.md) | [ko](2623-rocm-complex-bool-cast-20261026.ko.md) | +| [#2622](https://github.com/lablup/mlxcel/pull/2622) | Forbid clap env bindings on overrides_with flag pairs | 2026-10-26 | [en](2622-clap-env-override-guard-20261026.en.md) | [ko](2622-clap-env-override-guard-20261026.ko.md) | +| [#2614](https://github.com/lablup/mlxcel/pull/2614) | Advance MLX while preserving backend overlays | 2026-10-26 | [en](2614-mlx-pin-overlay-upgrade-20261026.en.md) | [ko](2614-mlx-pin-overlay-upgrade-20261026.ko.md) | +| [#2613](https://github.com/lablup/mlxcel/pull/2613) | Clear the nine gfx1151 test failures in verify-rocm | 2026-10-26 | [en](2613-rocm-gfx1151-test-failures-20261026.en.md) | [ko](2613-rocm-gfx1151-test-failures-20261026.ko.md) | +| [#2612](https://github.com/lablup/mlxcel/pull/2612) | Read LLAMA_ARG_* toggle pair variables after parsing | 2026-10-26 | [en](2612-llama-arg-toggle-pair-env-20261026.en.md) | [ko](2612-llama-arg-toggle-pair-env-20261026.ko.md) | +| [#2611](https://github.com/lablup/mlxcel/pull/2611) | Native batched decode for Gemma 4 | 2026-10-26 | [en](2611-gemma4-native-batched-decode-20261026.en.md) | [ko](2611-gemma4-native-batched-decode-20261026.ko.md) | +| [#2610](https://github.com/lablup/mlxcel/pull/2610) | Sequence-keyed state for Baichuan-M1, Mllama and Qwen3-VL DeepStack | 2026-10-26 | [en](2610-sequence-keyed-model-state-20261026.en.md) | [ko](2610-sequence-keyed-model-state-20261026.ko.md) | +| [#2607](https://github.com/lablup/mlxcel/pull/2607) | Load the Windows ROCm runtime from a relocatable directory | 2026-10-26 | [en](2607-relocatable-windows-rocm-runtime-20261026.en.md) | [ko](2607-relocatable-windows-rocm-runtime-20261026.ko.md) | +| [#2604](https://github.com/lablup/mlxcel/pull/2604) | Run Windows ROCm builds without the SDK on PATH or ROCM_PATH | 2026-10-26 | [en](2604-windows-rocm-runtime-without-sdk-20261026.en.md) | [ko](2604-windows-rocm-runtime-without-sdk-20261026.ko.md) | +| [#2603](https://github.com/lablup/mlxcel/pull/2603) | Build and run mlxcel natively on Windows with ROCm | 2026-10-26 | [en](2603-native-windows-rocm-build-20261026.en.md) | [ko](2603-native-windows-rocm-build-20261026.ko.md) | +| [#2599](https://github.com/lablup/mlxcel/pull/2599) | Build and run mlxcel natively on Windows with CUDA | 2026-10-25 | [en](2599-native-windows-cuda-build-20261025.en.md) | [ko](2599-native-windows-cuda-build-20261025.ko.md) | +| [#2598](https://github.com/lablup/mlxcel/pull/2598) | VLM wrapper batched decode | 2026-10-25 | [en](2598-vlm-wrapper-batched-decode-20261025.en.md) | [ko](2598-vlm-wrapper-batched-decode-20261025.ko.md) | +| [#2596](https://github.com/lablup/mlxcel/pull/2596) | VLM family batched decode | 2026-10-25 | [en](2596-vlm-family-batched-decode-20261025.en.md) | [ko](2596-vlm-family-batched-decode-20261025.ko.md) | +| [#2595](https://github.com/lablup/mlxcel/pull/2595) | Long-tail dense batched decode | 2026-10-25 | [en](2595-long-tail-dense-decode-20261025.en.md) | [ko](2595-long-tail-dense-decode-20261025.ko.md) | +| [#2594](https://github.com/lablup/mlxcel/pull/2594) | Additional MoE batched decode | 2026-10-25 | [en](2594-additional-moe-batched-decode-20261025.en.md) | [ko](2594-additional-moe-batched-decode-20261025.ko.md) | +| [#2593](https://github.com/lablup/mlxcel/pull/2593) | Qwen VL batched text decode | 2026-10-25 | [en](2593-qwen-vl-batched-decode-20261025.en.md) | [ko](2593-qwen-vl-batched-decode-20261025.ko.md) | +| [#2592](https://github.com/lablup/mlxcel/pull/2592) | Native TP batched decode | 2026-10-25 | [en](2592-native-tp-batched-decode-20261025.en.md) | [ko](2592-native-tp-batched-decode-20261025.ko.md) | +| [#2591](https://github.com/lablup/mlxcel/pull/2591) | MLA batched decode | 2026-10-25 | [en](2591-mla-batched-decode-20261025.en.md) | [ko](2591-mla-batched-decode-20261025.ko.md) | +| [#2590](https://github.com/lablup/mlxcel/pull/2590) | Dense-family batched decode | 2026-10-25 | [en](2590-dense-batched-decode-20261025.en.md) | [ko](2590-dense-batched-decode-20261025.ko.md) | +| [#2589](https://github.com/lablup/mlxcel/pull/2589) | Mixtral-style MoE batched decode | 2026-10-25 | [en](2589-moe-batched-decode-20261025.en.md) | [ko](2589-moe-batched-decode-20261025.ko.md) | +| [#2588](https://github.com/lablup/mlxcel/pull/2588) | Batched decode foundations | 2026-10-25 | [en](2588-batched-decode-foundations-20261025.en.md) | [ko](2588-batched-decode-foundations-20261025.ko.md) | +| [#2581](https://github.com/lablup/mlxcel/pull/2581) | Native RF-DETR detection and instance masks | 2026-10-24 | [en](2581-rfdetr-detection-segmentation-20261024.en.md) | [ko](2581-rfdetr-detection-segmentation-20261024.ko.md) | +| [#2580](https://github.com/lablup/mlxcel/pull/2580) | Add SAM 3D Body mesh prediction | 2026-10-24 | [en](2580-sam3d-body-20261024.en.md) | [ko](2580-sam3d-body-20261024.ko.md) | +| [#2579](https://github.com/lablup/mlxcel/pull/2579) | DRAFT - Technical Report: PR #2579 - Native PP-DocLayoutV3 detection and ordered Falcon-OCR handoff | 2026-10-24 | [en](2579-pp-doclayout-v3-20261024.en.md) | [ko](2579-pp-doclayout-v3-20261024.ko.md) | +| [#2578](https://github.com/lablup/mlxcel/pull/2578) | Add SAM 3D Objects reconstruction | 2026-10-23 | [en](2578-sam3d-objects-reconstruction-20261023.en.md) | [ko](2578-sam3d-objects-reconstruction-20261023.ko.md) | +| [#2577](https://github.com/lablup/mlxcel/pull/2577) | Add MoGe3 dense geometry prediction | 2026-10-23 | [en](2577-moge3-dense-geometry-20261023.en.md) | [ko](2577-moge3-dense-geometry-20261023.ko.md) | +| [#2576](https://github.com/lablup/mlxcel/pull/2576) | Add Video Depth Anything Dense Prediction | 2026-10-23 | [en](2576-video-depth-anything-20261023.en.md) | [ko](2576-video-depth-anything-20261023.ko.md) | +| [#2575](https://github.com/lablup/mlxcel/pull/2575) | Add SAM 3.1 multiplex tracking | 2026-10-23 | [en](2575-sam3-1-multiplex-tracking-20261023.en.md) | [ko](2575-sam3-1-multiplex-tracking-20261023.ko.md) | +| [#2553](https://github.com/lablup/mlxcel/pull/2553) | Judge Activity decode overhead by an interval, not 5 pairs | 2026-10-23 | [en](2553-activity-gate-interval-verdict-20261023.en.md) | [ko](2553-activity-gate-interval-verdict-20261023.ko.md) | +| [#2552](https://github.com/lablup/mlxcel/pull/2552) | Add an explicit GELU selector and use tanh where the checkpoint declares it | 2026-10-23 | [en](2552-gelu-selector-tanh-vision-20261023.en.md) | [ko](2552-gelu-selector-tanh-vision-20261023.ko.md) | +| [#2551](https://github.com/lablup/mlxcel/pull/2551) | Add SAM 3 promptable segmentation and tracking | 2026-10-23 | [en](2551-sam-3-segmentation-tracking-20261023.en.md) | [ko](2551-sam-3-segmentation-tracking-20261023.ko.md) | +| [#2550](https://github.com/lablup/mlxcel/pull/2550) | Port Sapiens2 pose and dense prediction | 2026-10-23 | [en](2550-sapiens2-dense-prediction-20261023.en.md) | [ko](2550-sapiens2-dense-prediction-20261023.ko.md) | +| [#2549](https://github.com/lablup/mlxcel/pull/2549) | Add Shared DINOv2 Feature Encoder | 2026-10-23 | [en](2549-dinov2-backbone-20261023.en.md) | [ko](2549-dinov2-backbone-20261023.ko.md) | +| [#2545](https://github.com/lablup/mlxcel/pull/2545) | Add dense prediction output foundation | 2026-10-23 | [en](2545-dense-prediction-output-foundation-20261023.en.md) | [ko](2545-dense-prediction-output-foundation-20261023.ko.md) | +| [#2542](https://github.com/lablup/mlxcel/pull/2542) | Reset shared model caches when the CLI opens a sequence | 2026-10-22 | [en](2542-reset-shared-caches-on-open-20261022.en.md) | [ko](2542-reset-shared-caches-on-open-20261022.ko.md) | +| [#2538](https://github.com/lablup/mlxcel/pull/2538) | Cache custom CUDA kernels on disk to drop a per-process compile | 2026-10-22 | [en](2538-cuda-custom-kernel-disk-cache-20261022.en.md) | [ko](2538-cuda-custom-kernel-disk-cache-20261022.ko.md) | +| [#2537](https://github.com/lablup/mlxcel/pull/2537) | Make the qmm determinism gate fail when it cannot run | 2026-10-22 | [en](2537-qmm-determinism-gate-20261022.en.md) | [ko](2537-qmm-determinism-gate-20261022.ko.md) | +| [#2535](https://github.com/lablup/mlxcel/pull/2535) | refuse model-owned families in the classic speculative walk | 2026-10-22 | [en](2535-classic-spec-refuse-model-owned-20261022.en.md) | [ko](2535-classic-spec-refuse-model-owned-20261022.ko.md) | +| [#2533](https://github.com/lablup/mlxcel/pull/2533) | Rename aux.rs and guard against Windows device names | 2026-10-22 | [en](2533-rename-aux-windows-reserved-guard-20261022.en.md) | [ko](2533-rename-aux-windows-reserved-guard-20261022.ko.md) | +| [#2532](https://github.com/lablup/mlxcel/pull/2532) | drop unreachable guards in validate_pipeline_parallel_args | 2026-10-22 | [en](2532-pp-validator-dead-guards-20261022.en.md) | [ko](2532-pp-validator-dead-guards-20261022.ko.md) | +| [#2530](https://github.com/lablup/mlxcel/pull/2530) | Drop the Metal compiled.cpp overlay that zeroed fused imag() | 2026-10-22 | [en](2530-metal-compiled-imag-overlay-20261022.en.md) | [ko](2530-metal-compiled-imag-overlay-20261022.ko.md) | +| [#2522](https://github.com/lablup/mlxcel/pull/2522) | Automatic Responses compaction (phase B) | 2026-10-21 | [en](pr-2522-responses-auto-compaction.en.md) | [ko](pr-2522-responses-auto-compaction.ko.md) | +| [#2521](https://github.com/lablup/mlxcel/pull/2521) | expose GLiNER2.5 CLI options, fix token-classification leftovers | 2026-10-21 | [en](2521-token-classification-leftovers-20261021.en.md) | [ko](2521-token-classification-leftovers-20261021.ko.md) | +| [#2520](https://github.com/lablup/mlxcel/pull/2520) | Responses conversation compaction, phase A | 2026-10-21 | [en](2520-responses-compaction-phase-a-20261021.en.md) | [ko](2520-responses-compaction-phase-a-20261021.ko.md) | +| [#2518](https://github.com/lablup/mlxcel/pull/2518) | One shared image fetch/decode helper for the media routes | 2026-10-21 | [en](2518-shared-image-fetch-20261021.en.md) | [ko](2518-shared-image-fetch-20261021.ko.md) | +| [#2517](https://github.com/lablup/mlxcel/pull/2517) | fix intermittent mllama exact-zero assert and webui router race | 2026-10-21 | [en](2517-flaky-tests-20261021.en.md) | [ko](2517-flaky-tests-20261021.ko.md) | +| [#2516](https://github.com/lablup/mlxcel/pull/2516) | repair the three contract breakages left by PR #2505 | 2026-10-21 | [en](2516-contract-breakage-repair-20261021.en.md) | [ko](2516-contract-breakage-repair-20261021.ko.md) | +| [#2513](https://github.com/lablup/mlxcel/pull/2513) | Gemma 3n emitter moved to the shared-layer query offset | 2026-10-21 | [en](2513-gemma3n-xla-query-offset-20261021.en.md) | [ko](2513-gemma3n-xla-query-offset-20261021.ko.md) | +| [#2512](https://github.com/lablup/mlxcel/pull/2512) | Unit tests for the store_budget helpers | 2026-10-21 | [en](2512-store-budget-tests-20261021.en.md) | [ko](2512-store-budget-tests-20261021.ko.md) | +| [#2507](https://github.com/lablup/mlxcel/pull/2507) | PhiMoE norm epsilon key and SAM antialiased bicubic a | 2026-10-21 | [en](2507-phimoe-sam-numeric-parity-20261021.en.md) | [ko](2507-phimoe-sam-numeric-parity-20261021.ko.md) | +| [#2504](https://github.com/lablup/mlxcel/pull/2504) | Stream tool-call arguments incrementally on Chat and Responses | 2026-10-21 | [en](2504-incremental-tool-call-args-20261021.en.md) | [ko](2504-incremental-tool-call-args-20261021.ko.md) | +| [#2500](https://github.com/lablup/mlxcel/pull/2500) | Close the remaining streamed vs non-streamed parity gaps | 2026-10-20 | [en](2500-stream-parity-gaps-20261020.en.md) | [ko](2500-stream-parity-gaps-20261020.ko.md) | +| [#2496](https://github.com/lablup/mlxcel/pull/2496) | Hide Llama 3.x python_tag calls from streams, add Responses reasoning | 2026-10-20 | [en](2496-python-tag-stream-responses-reasoning-20261020.en.md) | [ko](2496-python-tag-stream-responses-reasoning-20261020.ko.md) | +| [#2493](https://github.com/lablup/mlxcel/pull/2493) | Qwen3-Next multi-token cache-forward fix | 2026-10-20 | [en](2493-qwen3-next-cache-forward-20261020.en.md) | [ko](2493-qwen3-next-cache-forward-20261020.ko.md) | +| [#2487](https://github.com/lablup/mlxcel/pull/2487) | Repair qwen3_coder, Mistral and pythonic tool-call parser gaps | 2026-10-20 | [en](2487-tool-call-parser-gaps-20261020.en.md) | [ko](2487-tool-call-parser-gaps-20261020.ko.md) | +| [#2477](https://github.com/lablup/mlxcel/pull/2477) | CUDA sorted gather_mm batch stride and captured-graph barriers | 2026-10-20 | [en](2477-cuda-gather-mm-graph-barrier-20261020.en.md) | [ko](2477-cuda-gather-mm-graph-barrier-20261020.ko.md) | +| [#2475](https://github.com/lablup/mlxcel/pull/2475) | Implementation review of Qwen3.8-Flash-Next (qwen4_exp) support | 2026-10-20 | [en](pr-2475-qwen4-exp-implementation-review.en.md) | [ko](pr-2475-qwen4-exp-implementation-review.ko.md) | +| [#2474](https://github.com/lablup/mlxcel/pull/2474) | Stage weights through pinned memory and load eagerly | 2026-10-20 | [en](2474-pinned-staging-eager-weight-load-20261020.en.md) | [ko](2474-pinned-staging-eager-weight-load-20261020.ko.md) | +| [#2472](https://github.com/lablup/mlxcel/pull/2472) | Correct the sink attention Used by comment | 2026-10-20 | [en](2472-sink-attention-used-by-20261020.en.md) | [ko](2472-sink-attention-used-by-20261020.ko.md) | +| [#2471](https://github.com/lablup/mlxcel/pull/2471) | Refresh the HashMap-order section's citations to the current tree | 2026-10-20 | [en](2471-hashmap-order-citations-20261020.en.md) | [ko](2471-hashmap-order-citations-20261020.ko.md) | +| [#2469](https://github.com/lablup/mlxcel/pull/2469) | List every declared Cargo feature in the installation feature table | 2026-10-20 | [en](2469-install-feature-table-20261020.en.md) | [ko](2469-install-feature-table-20261020.ko.md) | +| [#2461](https://github.com/lablup/mlxcel/pull/2461) | GLiNER2.5 span extraction on a DeBERTa-v2 encoder | 2026-10-20 | [en](2461-gliner2-5-span-extraction-20261020.en.md) | [ko](2461-gliner2-5-span-extraction-20261020.ko.md) | +| [#2460](https://github.com/lablup/mlxcel/pull/2460) | OpenAI Privacy Filter (openai_privacy_filter) PII tagger | 2026-10-19 | [en](2460-openai-privacy-filter-20261019.en.md) | [ko](2460-openai-privacy-filter-20261019.ko.md) | +| [#2459](https://github.com/lablup/mlxcel/pull/2459) | LFM2-VL resampling, Qwen3-VL Conv3d layout guard and quantized pos_embed | 2026-10-19 | [en](2459-vision-resample-layout-20261019.en.md) | [ko](2459-vision-resample-layout-20261019.ko.md) | +| [#2458](https://github.com/lablup/mlxcel/pull/2458) | Align streamed tool-call and marker cleanup with non-streamed output | 2026-10-19 | [en](2458-stream-filter-parity-20261019.en.md) | [ko](2458-stream-filter-parity-20261019.ko.md) | +| [#2457](https://github.com/lablup/mlxcel/pull/2457) | Upstream numeric fixes for Gemma 3n, PhiMoE, Gemma 4 audio and Phi-3-small | 2026-10-19 | [en](2457-upstream-numeric-fixes-20261019.en.md) | [ko](2457-upstream-numeric-fixes-20261019.ko.md) | +| [#2456](https://github.com/lablup/mlxcel/pull/2456) | Token classification and span extraction (mlxcel tag, mlxcel extract) | 2026-10-19 | [en](2456-token-classification-20261019.en.md) | [ko](2456-token-classification-20261019.ko.md) | +| [#2455](https://github.com/lablup/mlxcel/pull/2455) | Accept the declared OptiQ vision sidecar outside the loader | 2026-10-19 | [en](2455-optiq-sidecar-shard-checks-20261019.en.md) | [ko](2455-optiq-sidecar-shard-checks-20261019.ko.md) | +| [#2454](https://github.com/lablup/mlxcel/pull/2454) | Reference l2norm eps for GDN / KDA q/k via normalize_qk | 2026-10-19 | [en](2454-gdn-qk-l2norm-eps-20261019.en.md) | [ko](2454-gdn-qk-l2norm-eps-20261019.ko.md) | +| [#2449](https://github.com/lablup/mlxcel/pull/2449) | Close NVFP4 global-scale load gaps in QKV, VLM and DeepSeek | 2026-10-19 | [en](2449-nvfp4-global-scale-gaps-20261019.en.md) | [ko](2449-nvfp4-global-scale-gaps-20261019.ko.md) | +| [#2448](https://github.com/lablup/mlxcel/pull/2448) | Lift transformers 5 rope_parameters for every family | 2026-10-19 | [en](2448-rope-parameters-lift-20261019.en.md) | [ko](2448-rope-parameters-lift-20261019.ko.md) | +| [#2447](https://github.com/lablup/mlxcel/pull/2447) | Route queued DFlash heads to the speculative burst | 2026-10-18 | [en](2447-dflash-burst-routing-20261018.en.md) | [ko](2447-dflash-burst-routing-20261018.ko.md) | +| [#2446](https://github.com/lablup/mlxcel/pull/2446) | Close loader and LoRA follow-ups from #2438 and #2439 | 2026-10-19 | [en](2446-loader-lora-followups-20261019.en.md) | [ko](2446-loader-lora-followups-20261019.ko.md) | +| [#2441](https://github.com/lablup/mlxcel/pull/2441) | Load mlx-lm NVFP4 per-expert global_scale natively | 2026-10-17 | [en](2441-nvfp4-moe-global-scale-20261017.en.md) | [ko](2441-nvfp4-moe-global-scale-20261017.ko.md) | +| [#2440](https://github.com/lablup/mlxcel/pull/2440) | Clamp ragged batched DFlash accepts to one count | 2026-10-17 | [en](2440-dflash-batched-uniform-accept-20261017.en.md) | [ko](2440-dflash-batched-uniform-accept-20261017.ko.md) | +| [#2439](https://github.com/lablup/mlxcel/pull/2439) | Accept upstream config shapes, aliases and key layouts | 2026-10-17 | [en](2439-upstream-config-shapes-20261017.en.md) | [ko](2439-upstream-config-shapes-20261017.ko.md) | +| [#2438](https://github.com/lablup/mlxcel/pull/2438) | Pin runtime LoRA term widths on quantized linear bases | 2026-10-17 | [en](2438-lora-linear-term-widths-20261017.en.md) | [ko](2438-lora-linear-term-widths-20261017.ko.md) | +| [#2436](https://github.com/lablup/mlxcel/pull/2436) | Report the expanded media prompt length on the xla-iree loop | 2026-10-17 | [en](2436-xla-expanded-prompt-length-20261017.en.md) | [ko](2436-xla-expanded-prompt-length-20261017.ko.md) | +| [#2435](https://github.com/lablup/mlxcel/pull/2435) | Use the attention dtype for mixed bf16/fp16 paths | 2026-10-17 | [en](2435-mixed-dtype-attention-follow-ups-20261017.en.md) | [ko](2435-mixed-dtype-attention-follow-ups-20261017.ko.md) | +| [#2434](https://github.com/lablup/mlxcel/pull/2434) | Support mlx-lm LoRAEmbedding adapters on embed_tokens | 2026-10-17 | [en](2434-lora-embedding-20261017.en.md) | [ko](2434-lora-embedding-20261017.ko.md) | +| [#2433](https://github.com/lablup/mlxcel/pull/2433) | Show Settings > Server values as display text | 2026-10-17 | [en](2433-settings-server-value-labels-20261017.en.md) | [ko](2433-settings-server-value-labels-20261017.ko.md) | +| [#2418](https://github.com/lablup/mlxcel/pull/2418) | Bound iquestloop chunked prefill by measured bf16 noise | 2026-10-16 | [en](2418-iquest-chunked-prefill-bound-20261016.en.md) | [ko](2418-iquest-chunked-prefill-bound-20261016.ko.md) | +| [#2417](https://github.com/lablup/mlxcel/pull/2417) | Cast SDPA masks to the attention dtype, not q's | 2026-10-16 | [en](2417-sdpa-mask-attention-dtype-20261016.en.md) | [ko](2417-sdpa-mask-attention-dtype-20261016.ko.md) | +| [#2416](https://github.com/lablup/mlxcel/pull/2416) | Refuse an embed_tokens LoRA pair on a tied checkpoint | 2026-10-16 | [en](2416-tied-embed-lora-20261016.en.md) | [ko](2416-tied-embed-lora-20261016.ko.md) | +| [#2415](https://github.com/lablup/mlxcel/pull/2415) | Align count routes and message_start with usage | 2026-10-16 | [en](2415-anthropic-count-alignment-20261016.en.md) | [ko](2415-anthropic-count-alignment-20261016.ko.md) | +| [#2344](https://github.com/lablup/mlxcel/pull/2344) | Localize Server settings sub-row labels | 2026-10-16 | [en](2344-localize-server-settings-labels-20261016.en.md) | [ko](2344-localize-server-settings-labels-20261016.ko.md) | +| [#2331](https://github.com/lablup/mlxcel/pull/2331) | Stop printing internal state as WebUI user copy | 2026-10-16 | [en](2331-webui-user-copy-20261016.en.md) | [ko](2331-webui-user-copy-20261016.ko.md) | +| [#2328](https://github.com/lablup/mlxcel/pull/2328) | Validate the quantization scheme in the Qwen 3.5 MTP drafter loader | 2026-10-16 | [en](2328-mtp-drafter-quant-validate-20261016.en.md) | [ko](2328-mtp-drafter-quant-validate-20261016.ko.md) | +| [#2327](https://github.com/lablup/mlxcel/pull/2327) | Render video content items in the CLI for templates without image support | 2026-10-16 | [en](2327-cli-video-content-items-20261016.en.md) | [ko](2327-cli-video-content-items-20261016.ko.md) | +| [#2326](https://github.com/lablup/mlxcel/pull/2326) | Fail the LoRA load on unclaimed runtime terms and tied output heads | 2026-10-16 | [en](2326-lora-unclaimed-terms-tied-head-20261016.en.md) | [ko](2326-lora-unclaimed-terms-tied-head-20261016.ko.md) | +| [#2325](https://github.com/lablup/mlxcel/pull/2325) | Stop casting comparison inputs to bool in Metal compiled kernels | 2026-10-16 | [en](2325-metal-compiled-bool-cast-20261016.en.md) | [ko](2325-metal-compiled-bool-cast-20261016.ko.md) | +| [#2324](https://github.com/lablup/mlxcel/pull/2324) | Ship the WebUI release docs and list --webui in --help | 2026-10-16 | [en](2324-webui-docs-help-20261016.en.md) | [ko](2324-webui-docs-help-20261016.ko.md) | +| [#2323](https://github.com/lablup/mlxcel/pull/2323) | Hold the device guard in the Inkling exact-parity tests | 2026-10-16 | [en](2323-inkling-parity-device-guard-20261016.en.md) | [ko](2323-inkling-parity-device-guard-20261016.ko.md) | +| [#2319](https://github.com/lablup/mlxcel/pull/2319) | Encode non-special added tokens on the SentencePiece path | 2026-10-16 | [en](2319-sp-nonspecial-added-tokens-20261016.en.md) | [ko](2319-sp-nonspecial-added-tokens-20261016.ko.md) | +| [#2318](https://github.com/lablup/mlxcel/pull/2318) | Exercise the steel kernel in the delegated envelope tests and classify #1712 failures | 2026-10-16 | [en](2318-delegated-steel-envelope-diagnostics-20261016.en.md) | [ko](2318-delegated-steel-envelope-diagnostics-20261016.ko.md) | +| [#2317](https://github.com/lablup/mlxcel/pull/2317) | fix(rocm): update Fence::wait and Fence::update signatures for MLX 243bdf09 | 2026-10-15 | [en](2317-rocm-fence-pin-243bdf09-20261015.en.md) | [ko](2317-rocm-fence-pin-243bdf09-20261015.ko.md) | +| [#2316](https://github.com/lablup/mlxcel/pull/2316) | Support EmbeddingGemma 2 (embedding_gemma2) multimodal embedder | 2026-10-15 | [en](2316-embedding-gemma2-embedder-20261015.en.md) | [ko](2316-embedding-gemma2-embedder-20261015.ko.md) | +| [#2315](https://github.com/lablup/mlxcel/pull/2315) | Gemma 4 12B long-context MTP parity | 2026-10-15 | [en](2315-gemma4-12b-mtp-parity-20261015.en.md) | [ko](2315-gemma4-12b-mtp-parity-20261015.ko.md) | +| [#2313](https://github.com/lablup/mlxcel/pull/2313) | Update rustls for four advisories | 2026-10-15 | [en](2313-rustls-security-update-20261015.en.md) | [ko](2313-rustls-security-update-20261015.ko.md) | +| [#2310](https://github.com/lablup/mlxcel/pull/2310) | Attribute the MoE Decode Gap at the M = 1 Expert Gather | 2026-10-14 | [en](2310-moe-decode-attribution-20261014.en.md) | [ko](2310-moe-decode-attribution-20261014.ko.md) | +| [#2307](https://github.com/lablup/mlxcel/pull/2307) | Qualify OpenXLA/IREE Engine on ROCm/HIP | 2026-10-14 | [en](2307-xla-iree-rocm-qualification-20261014.en.md) | [ko](2307-xla-iree-rocm-qualification-20261014.ko.md) | +| [#2305](https://github.com/lablup/mlxcel/pull/2305) | Organize MLX-Side Layer under `src/lib/mlxcelverse` | 2026-10-14 | [en](2305-mlxcelverse-layout-20261014.en.md) | [ko](2305-mlxcelverse-layout-20261014.ko.md) | +| [#2304](https://github.com/lablup/mlxcel/pull/2304) | Advance MLX Pin and Reconcile Backend Ownership | 2026-10-14 | [en](2304-advance-mlx-pin-ownership-20261014.en.md) | [ko](2304-advance-mlx-pin-ownership-20261014.ko.md) | +| [#2301](https://github.com/lablup/mlxcel/pull/2301) | Correct the AFMoE no-ID chunked prefill contract | 2026-10-14 | [en](2301-afmoe-chunked-prefill-20261014.en.md) | [ko](2301-afmoe-chunked-prefill-20261014.ko.md) | +| [#2300](https://github.com/lablup/mlxcel/pull/2300) | Correct the RecurrentGemma no-ID prefill contract | 2026-10-14 | [en](2300-recurrent-gemma-chunked-prefill-20261014.en.md) | [ko](2300-recurrent-gemma-chunked-prefill-20261014.ko.md) | +| [#2299](https://github.com/lablup/mlxcel/pull/2299) | Correct the Bailing MoE Linear no-ID prefill contract | 2026-10-14 | [en](2299-bailing-moe-linear-chunked-prefill-20261014.en.md) | [ko](2299-bailing-moe-linear-chunked-prefill-20261014.ko.md) | +| [#2298](https://github.com/lablup/mlxcel/pull/2298) | Bump MLX Pin and Declare Overlay Bases | 2026-10-14 | [en](2298-bump-mlx-pin-overlay-bases-20261014.en.md) | [ko](2298-bump-mlx-pin-overlay-bases-20261014.ko.md) | +| [#2297](https://github.com/lablup/mlxcel/pull/2297) | Correct the RWKV7 no-ID chunked prefill contract | 2026-10-14 | [en](2297-rwkv7-chunked-prefill-20261014.en.md) | [ko](2297-rwkv7-chunked-prefill-20261014.ko.md) | +| [#2296](https://github.com/lablup/mlxcel/pull/2296) | Restore finite Kimi Linear MLA prefill | 2026-10-14 | [en](2296-kimi-linear-mla-prefill-20261014.en.md) | [ko](2296-kimi-linear-mla-prefill-20261014.ko.md) | +| [#2295](https://github.com/lablup/mlxcel/pull/2295) | Qwen3-Next chunked-prefill opt-out | 2026-10-14 | [en](2295-qwen3-next-chunked-prefill-20261014.en.md) | [ko](2295-qwen3-next-chunked-prefill-20261014.ko.md) | +| [#2294](https://github.com/lablup/mlxcel/pull/2294) | Admit Nemotron-H requests against a checked memory budget | 2026-10-14 | [en](2294-nemotron-h-request-memory-admission-20261014.en.md) | [ko](2294-nemotron-h-request-memory-admission-20261014.ko.md) | +| [#2293](https://github.com/lablup/mlxcel/pull/2293) | Kimi Linear chunked-prefill opt-out | 2026-10-13 | [en](2293-kimi-linear-chunked-prefill-20261013.en.md) | [ko](2293-kimi-linear-chunked-prefill-20261013.ko.md) | +| [#2290](https://github.com/lablup/mlxcel/pull/2290) | Bound Nemotron-H SSD prefill memory | 2026-10-13 | [en](2290-nemotron-h-prefill-memory-20261013.en.md) | [ko](2290-nemotron-h-prefill-memory-20261013.ko.md) | +| [#2284](https://github.com/lablup/mlxcel/pull/2284) | Propagate MLX array readback failures without aborting | 2026-10-13 | [en](2284-fallible-array-read-20261013.en.md) | [ko](2284-fallible-array-read-20261013.ko.md) | +| [#2282](https://github.com/lablup/mlxcel/pull/2282) | Native-Video Temporary File Hardening | 2026-10-13 | [en](2282-native-video-temp-hardening-20261013.en.md) | [ko](2282-native-video-temp-hardening-20261013.ko.md) | +| [#2279](https://github.com/lablup/mlxcel/pull/2279) | maintained YAML parser | 2026-10-12 | [en](2279-maintained-yaml-parser-20261012.en.md) | [ko](2279-maintained-yaml-parser-20261012.ko.md) | +| [#2277](https://github.com/lablup/mlxcel/pull/2277) | Atomic and exclusive `split-mtp` output | 2026-10-12 | [en](2277-atomic-split-mtp-output-20261012.en.md) | [ko](2277-atomic-split-mtp-output-20261012.ko.md) | +| [#2276](https://github.com/lablup/mlxcel/pull/2276) | Portable A/B Output Directories | 2026-10-12 | [en](2276-portable-ab-output-dirs-20261012.en.md) | [ko](2276-portable-ab-output-dirs-20261012.ko.md) | +| [#2274](https://github.com/lablup/mlxcel/pull/2274) | Server prompt-lookup break-even governor | 2026-10-12 | [en](2274-server-prompt-lookup-break-even-20261012.en.md) | [ko](2274-server-prompt-lookup-break-even-20261012.ko.md) | +| [#2272](https://github.com/lablup/mlxcel/pull/2272) | Bound DRY and sparse penalty step costs | 2026-10-11 | [en](2272-bound-dry-sparse-penalties-20261011.en.md) | [ko](2272-bound-dry-sparse-penalties-20261011.ko.md) | +| [#2271](https://github.com/lablup/mlxcel/pull/2271) | B=1 terminal decode lookahead | 2026-10-11 | [en](2271-b1-decode-terminal-lookahead-20261011.en.md) | [ko](2271-b1-decode-terminal-lookahead-20261011.ko.md) | +| [#2270](https://github.com/lablup/mlxcel/pull/2270) | Post-epic paged and SSM cleanup | 2026-10-11 | [en](2270-post-epic-paged-ssm-cleanup-20261011.en.md) | [ko](2270-post-epic-paged-ssm-cleanup-20261011.ko.md) | +| [#2269](https://github.com/lablup/mlxcel/pull/2269) | Contain Decode Readback Failures and Preserve Sampler State | 2026-10-11 | [en](2269-decode-readback-sampler-recovery-20261011.en.md) | [ko](2269-decode-readback-sampler-recovery-20261011.ko.md) | +| [#2268](https://github.com/lablup/mlxcel/pull/2268) | Adaptive Server Prefill Chunks | 2026-10-11 | [en](2268-adaptive-prefill-chunks-20261011.en.md) | [ko](2268-adaptive-prefill-chunks-20261011.ko.md) | +| [#2262](https://github.com/lablup/mlxcel/pull/2262) | Prompt lookup on the server without slowing plain decode | 2026-10-11 | [en](2262-server-prompt-lookup-scheduler-20261011.en.md) | [ko](2262-server-prompt-lookup-scheduler-20261011.ko.md) | +| [#2256](https://github.com/lablup/mlxcel/pull/2256) | Pipeline penalty and DRY requests in the engine's B=1 client | 2026-10-10 | [en](2256-pipeline-penalty-dry-requests-20261010.en.md) | [ko](2256-pipeline-penalty-dry-requests-20261010.ko.md) | +| [#2253](https://github.com/lablup/mlxcel/pull/2253) | Run a ROCm Decode Batch's Rows as One Quantized Product | 2026-10-09 | [en](2253-rocm-batched-decode-row-fold-20261009.en.md) | [ko](2253-rocm-batched-decode-row-fold-20261009.ko.md) | +| [#2237](https://github.com/lablup/mlxcel/pull/2237) | Strided Copies Past 2^32 Elements on ROCm | 2026-10-08 | [en](2237-rocm-strided-copy-grid-20261008.en.md) | [ko](2237-rocm-strided-copy-grid-20261008.ko.md) | +| [#2236](https://github.com/lablup/mlxcel/pull/2236) | Skip the Dequant LRU for GEMMs Routed Above the WMMA Ceiling | 2026-10-08 | [en](2236-rocm-dequant-lru-skip-above-wmma-ceiling-20261008.en.md) | [ko](2236-rocm-dequant-lru-skip-above-wmma-ceiling-20261008.ko.md) | +| [#2235](https://github.com/lablup/mlxcel/pull/2235) | An mxfp4 Arm for the Warp-Shared gather_qmv Kernel | 2026-10-08 | [en](2235-rocm-mxfp4-warp-shared-gather-qmv-20261008.en.md) | [ko](2235-rocm-mxfp4-warp-shared-gather-qmv-20261008.ko.md) | +| [#2225](https://github.com/lablup/mlxcel/pull/2225) | `mlxcel generate` on the engine, CxxGenerator retired | 2026-10-08 | [en](2225-generate-on-engine-retire-cxxgenerator-20261008.en.md) | [ko](2225-generate-on-engine-retire-cxxgenerator-20261008.ko.md) | +| [#2224](https://github.com/lablup/mlxcel/pull/2224) | `mlxcel run` and chat as in-process server clients | 2026-10-08 | [en](2224-cli-in-process-server-client-20261008.en.md) | [ko](2224-cli-in-process-server-client-20261008.ko.md) | +| [#2220](https://github.com/lablup/mlxcel/pull/2220) | Give Every Scalar-Pool Slot Its Own Cache Line | 2026-10-07 | [en](2220-rocm-scalar-pool-cache-line-20261007.en.md) | [ko](2220-rocm-scalar-pool-cache-line-20261007.ko.md) | +| [#2218](https://github.com/lablup/mlxcel/pull/2218) | Recalibrating the Joint Top-k + Top-p Rejection Vocab Cap on ROCm | 2026-10-08 | [en](2218-rocm-joint-rejection-cap-20261008.en.md) | [ko](2218-rocm-joint-rejection-cap-20261008.ko.md) | +| [#2217](https://github.com/lablup/mlxcel/pull/2217) | Batch-native engine step API with BatchScheduler on top | 2026-10-08 | [en](2217-engine-step-api-scheduler-20261008.en.md) | [ko](2217-engine-step-api-scheduler-20261008.ko.md) | +| [#2214](https://github.com/lablup/mlxcel/pull/2214) | Lock the Device Map in rocm::device() | 2026-10-07 | [en](2214-rocm-device-map-lock-20261007.en.md) | [ko](2214-rocm-device-map-lock-20261007.ko.md) | +| [#2210](https://github.com/lablup/mlxcel/pull/2210) | KV attention dispatch inside the cache | 2026-10-07 | [en](2210-kv-attention-dispatch-in-cache-20261007.en.md) | [ko](2210-kv-attention-dispatch-in-cache-20261007.ko.md) | +| [#2209](https://github.com/lablup/mlxcel/pull/2209) | SSM BF16 timestep regression | 2026-10-12 | [en](2209-ssm-bf16-timestep-regression-20261012.en.md) | [ko](2209-ssm-bf16-timestep-regression-20261012.ko.md) | +| [#2208](https://github.com/lablup/mlxcel/pull/2208) | Make hipBLASLt GEMM State Safe Across Threads and Streams | 2026-10-07 | [en](2208-rocm-hipblaslt-thread-safety-20261007.en.md) | [ko](2208-rocm-hipblaslt-thread-safety-20261007.ko.md) | +| [#2207](https://github.com/lablup/mlxcel/pull/2207) | Qwen 3.5 DFlash verify byte-identical to decode on CUDA | 2026-10-07 | [en](2207-qwen35-dflash-cuda-verify-rope-20261007.en.md) | [ko](2207-qwen35-dflash-cuda-verify-rope-20261007.ko.md) | +| [#2205](https://github.com/lablup/mlxcel/pull/2205) | One prefill plan and one trim hook for the CLI and the server | 2026-10-07 | [en](2205-one-prefill-plan-trim-hook-20261007.en.md) | [ko](2205-one-prefill-plan-trim-hook-20261007.ko.md) | +| [#2204](https://github.com/lablup/mlxcel/pull/2204) | One per-row sampling step and token-bias composition | 2026-10-07 | [en](2204-one-row-sampler-token-bias-20261007.en.md) | [ko](2204-one-row-sampler-token-bias-20261007.ko.md) | +| [#2203](https://github.com/lablup/mlxcel/pull/2203) | Gemma 4 batched MTP verify decode-exact on the row-wise geometries | 2026-10-07 | [en](2203-gemma4-batched-mtp-verify-20261007.en.md) | [ko](2203-gemma4-batched-mtp-verify-20261007.ko.md) | +| [#2202](https://github.com/lablup/mlxcel/pull/2202) | Initialize the ROCm Device's rocBLAS Handle Once, Under a Lock | 2026-10-07 | [en](2202-rocm-rocblas-handle-lock-20261007.en.md) | [ko](2202-rocm-rocblas-handle-lock-20261007.ko.md) | +| [#2201](https://github.com/lablup/mlxcel/pull/2201) | One post-sample finish step for every CLI and server decode site | 2026-10-07 | [en](2201-shared-post-sample-finish-step-20261007.en.md) | [ko](2201-shared-post-sample-finish-step-20261007.ko.md) | +| [#2196](https://github.com/lablup/mlxcel/pull/2196) | Lock the ROCm JIT Module Cache and the HIP Event Pool | 2026-10-07 | [en](2196-rocm-jit-cache-event-pool-20261007.en.md) | [ko](2196-rocm-jit-cache-event-pool-20261007.ko.md) | +| [#2195](https://github.com/lablup/mlxcel/pull/2195) | Reserve the In-Flight Budget in the ROCm Pre-Load Memory Estimate | 2026-10-07 | [en](2195-rocm-inflight-memory-estimate-20261007.en.md) | [ko](2195-rocm-inflight-memory-estimate-20261007.ko.md) | +| [#2194](https://github.com/lablup/mlxcel/pull/2194) | ADR 0007, CLI/server parity harness and B=1 decode baseline | 2026-10-07 | [en](2194-unified-engine-adr-parity-baseline-20261007.en.md) | [ko](2194-unified-engine-adr-parity-baseline-20261007.ko.md) | +| [#2193](https://github.com/lablup/mlxcel/pull/2193) | Range-Check ROCm GEMM Env Integers and Fix a Stale Graph Comment | 2026-10-07 | [en](2193-rocm-gemm-env-int-range-20261007.en.md) | [ko](2193-rocm-gemm-env-int-range-20261007.ko.md) | +| [#2189](https://github.com/lablup/mlxcel/pull/2189) | Enable Fused Add-RMSNorm and RoPE-Append by Default on ROCm | 2026-10-07 | [en](2189-rocm-fused-norm-rope-defaults-20261007.en.md) | [ko](2189-rocm-fused-norm-rope-defaults-20261007.ko.md) | +| [#2188](https://github.com/lablup/mlxcel/pull/2188) | Scope the Lang-Bias Counter Arming to the Test Thread | 2026-10-07 | [en](2188-scope-lang-bias-counter-arming-20261007.en.md) | [ko](2188-scope-lang-bias-counter-arming-20261007.ko.md) | +| [#2186](https://github.com/lablup/mlxcel/pull/2186) | Use 64-Bit Pool Offsets in the Fused Paged-Attention Kernels | 2026-10-07 | [en](2186-paged-attention-64bit-pool-offsets-20261007.en.md) | [ko](2186-paged-attention-64bit-pool-offsets-20261007.ko.md) | +| [#2185](https://github.com/lablup/mlxcel/pull/2185) | Gemma 4 MTP verify byte-identical to decode on CUDA | 2026-10-07 | [en](2185-gemma4-mtp-cuda-verify-20261007.en.md) | [ko](2185-gemma4-mtp-cuda-verify-20261007.ko.md) | +| [#2182](https://github.com/lablup/mlxcel/pull/2182) | Gemma 3 decode lookahead via a ring-aware teardown rewind | 2026-10-07 | [en](2182-gemma3-lookahead-ring-rewind-20261007.en.md) | [ko](2182-gemma3-lookahead-ring-rewind-20261007.ko.md) | +| [#2181](https://github.com/lablup/mlxcel/pull/2181) | Key ROCm Custom-Kernel JIT Modules by Their Generated Source | 2026-10-07 | [en](2181-key-rocm-jit-by-source-20261007.en.md) | [ko](2181-key-rocm-jit-by-source-20261007.ko.md) | +| [#2179](https://github.com/lablup/mlxcel/pull/2179) | Refuse Wave32-Only Kernel Ports on Wave64 Devices | 2026-10-07 | [en](2179-refuse-wave32-ports-on-wave64-20261007.en.md) | [ko](2179-refuse-wave32-ports-on-wave64-20261007.ko.md) | +| [#2165](https://github.com/lablup/mlxcel/pull/2165) | Typed Chat Text | 2026-10-13 | [en](2165-typed-chat-text-20261013.en.md) | [ko](2165-typed-chat-text-20261013.ko.md) | +| [#2164](https://github.com/lablup/mlxcel/pull/2164) | Batch Sorted mxfp4 gather_qmm Prefill by Expert | 2026-10-07 | [en](2164-mxfp4-expert-batched-gather-qmm-20261007.en.md) | [ko](2164-mxfp4-expert-batched-gather-qmm-20261007.ko.md) | +| [#2163](https://github.com/lablup/mlxcel/pull/2163) | Youtu-VL patch grid matches AutoProcessor | 2026-10-06 | [en](2163-youtu-vl-autoprocessor-grid-20261006.en.md) | [ko](2163-youtu-vl-autoprocessor-grid-20261006.ko.md) | +| [#2162](https://github.com/lablup/mlxcel/pull/2162) | Add MLXCEL_SDPA_DETERMINISTIC for reproducible decode | 2026-10-06 | [en](2162-sdpa-deterministic-decode-switch-20261006.en.md) | [ko](2162-sdpa-deterministic-decode-switch-20261006.ko.md) | +| [#2161](https://github.com/lablup/mlxcel/pull/2161) | Serialize rocm_gpu_guard.sh Runs with a Host-Wide Lock | 2026-10-06 | [en](2161-rocm-gpu-guard-host-lock-20261006.en.md) | [ko](2161-rocm-gpu-guard-host-lock-20261006.ko.md) | +| [#2140](https://github.com/lablup/mlxcel/pull/2140) | Sequence-aware pad trim for model-owned families | 2026-10-06 | [en](2140-model-owned-pad-trim-20261006.en.md) | [ko](2140-model-owned-pad-trim-20261006.ko.md) | +| [#2139](https://github.com/lablup/mlxcel/pull/2139) | Completion snapshots are keyed by the tokens their state holds | 2026-10-06 | [en](2139-completion-snapshot-token-len-20261006.en.md) | [ko](2139-completion-snapshot-token-len-20261006.ko.md) | +| [#2138](https://github.com/lablup/mlxcel/pull/2138) | Size Metal `gather_qmm_rhs` by the broadcast x rows | 2026-10-15 | [en](2138-metal-gather-qmm-rhs-rows-20261015.en.md) | [ko](2138-metal-gather-qmm-rhs-rows-20261015.ko.md) | +| [#2137](https://github.com/lablup/mlxcel/pull/2137) | perf(moe): share gather indices across SwitchGLU projections | 2026-10-06 | [en](2137-switchglu-shared-gather-indices-20261006.en.md) | [ko](2137-switchglu-shared-gather-indices-20261006.ko.md) | +| [#2136](https://github.com/lablup/mlxcel/pull/2136) | A whole-prompt cache hit no longer duplicates the last prompt token | 2026-10-06 | [en](2136-whole-prompt-hit-reuse-cap-20261006.en.md) | [ko](2136-whole-prompt-hit-reuse-cap-20261006.ko.md) | +| [#2133](https://github.com/lablup/mlxcel/pull/2133) | fix(youtu_vl): expand the template image placeholder per merged feature | 2026-10-06 | [en](2133-youtu-vl-image-pad-expansion-20261006.en.md) | [ko](2133-youtu-vl-image-pad-expansion-20261006.ko.md) | +| [#2132](https://github.com/lablup/mlxcel/pull/2132) | Guard the TF32 test pin and record its decode impact (Issue #1065) | 2026-10-06 | [en](2132-tf32-test-pin-sentinel-20261006.en.md) | [ko](2132-tf32-test-pin-sentinel-20261006.ko.md) | +| [#2129](https://github.com/lablup/mlxcel/pull/2129) | Model-aware snapshot sizing for attention-cache families (Issue #1761) | 2026-10-06 | [en](2129-snapshot-sizing-attention-cache-20261006.en.md) | [ko](2129-snapshot-sizing-attention-cache-20261006.ko.md) | +| [#2127](https://github.com/lablup/mlxcel/pull/2127) | Answer 500 for out-of-vocabulary ids in POST /detokenize | 2026-10-06 | [en](2127-detokenize-oov-500-20261006.en.md) | [ko](2127-detokenize-oov-500-20261006.ko.md) | +| [#2123](https://github.com/lablup/mlxcel/pull/2123) | Route primed-think reasoning on streaming /v1/responses and /v1/messages | 2026-10-06 | [en](2123-primed-think-streaming-20261006.en.md) | [ko](2123-primed-think-streaming-20261006.ko.md) | +| [#2122](https://github.com/lablup/mlxcel/pull/2122) | Accept untyped items and output_text parts in /v1/responses input | 2026-10-06 | [en](2122-responses-input-shapes-20261006.en.md) | [ko](2122-responses-input-shapes-20261006.ko.md) | +| [#2121](https://github.com/lablup/mlxcel/pull/2121) | Extend reasoning re-injection to /v1/responses, /v1/messages and the warm-up | 2026-10-06 | [en](2121-reasoning-echo-endpoints-warmup-20261006.en.md) | [ko](2121-reasoning-echo-endpoints-warmup-20261006.ko.md) | +| [#2119](https://github.com/lablup/mlxcel/pull/2119) | Reap leaked Activity gate servers and wait for a quiet host | 2026-10-06 | [en](2119-activity-gate-reap-quiet-host-20261006.en.md) | [ko](2119-activity-gate-reap-quiet-host-20261006.ko.md) | +| [#2117](https://github.com/lablup/mlxcel/pull/2117) | Sample each penalized step against the token just read | 2026-10-06 | [en](2117-penalty-history-token-order-20261006.en.md) | [ko](2117-penalty-history-token-order-20261006.ko.md) | +| [#2116](https://github.com/lablup/mlxcel/pull/2116) | Re-inject generated reasoning into content-only history | 2026-10-05 | [en](2116-reasoning-echo-content-only-20261005.en.md) | [ko](2116-reasoning-echo-content-only-20261005.ko.md) | +| [#2115](https://github.com/lablup/mlxcel/pull/2115) | Keep the VoiceChat TTS backbone stream f32 on CUDA | 2026-10-05 | [en](2115-voicechat-tts-f32-stream-20261005.en.md) | [ko](2115-voicechat-tts-f32-stream-20261005.ko.md) | +| [#2112](https://github.com/lablup/mlxcel/pull/2112) | Fix and Enable the Expert-Batched gather_qmm Prefill Kernel | 2026-10-05 | [en](2112-rocm-expert-batched-gather-qmm-20261005.en.md) | [ko](2112-rocm-expert-batched-gather-qmm-20261005.ko.md) | +| [#2111](https://github.com/lablup/mlxcel/pull/2111) | WebUI Activity gate waits for the host GPU lock; CPU-only link job | 2026-10-05 | [en](2111-webui-gate-gpu-lock-cpu-link-20261005.en.md) | [ko](2111-webui-gate-gpu-lock-cpu-link-20261005.ko.md) | +| [#2108](https://github.com/lablup/mlxcel/pull/2108) | CPU-only Linux build fails to link kv_inplace_write | 2026-10-05 | [en](2108-cpu-only-link-kv-inplace-write-20261005.en.md) | [ko](2108-cpu-only-link-kv-inplace-write-20261005.ko.md) | +| [#2107](https://github.com/lablup/mlxcel/pull/2107) | Port fused_add_rms_norm and fused_rope_qk_append to HIP | 2026-10-05 | [en](2107-rocm-fused-norm-rope-hip-port-20261005.en.md) | [ko](2107-rocm-fused-norm-rope-hip-port-20261005.ko.md) | +| [#2103](https://github.com/lablup/mlxcel/pull/2103) | Port paged attention (v1, v2 partial, merge) to HIP | 2026-10-05 | [en](2103-rocm-paged-attention-hip-port-20261005.en.md) | [ko](2103-rocm-paged-attention-hip-port-20261005.ko.md) | +| [#2101](https://github.com/lablup/mlxcel/pull/2101) | HIP ports of the four Metal-only kernels | 2026-10-05 | [en](2101-rocm-metal-only-kernel-ports-20261005.en.md) | [ko](2101-rocm-metal-only-kernel-ports-20261005.ko.md) | +| [#2100](https://github.com/lablup/mlxcel/pull/2100) | Port the Gumbel-max and rejection samplers to HIP | 2026-10-05 | [en](2100-rocm-samplers-hip-port-20261005.en.md) | [ko](2100-rocm-samplers-hip-port-20261005.ko.md) | +| [#2099](https://github.com/lablup/mlxcel/pull/2099) | Port ssm_update_kernel to HIP and read the port table | 2026-10-04 | [en](2099-rocm-ssm-update-hip-port-20261004.en.md) | [ko](2099-rocm-ssm-update-hip-port-20261004.ko.md) | +| [#2098](https://github.com/lablup/mlxcel/pull/2098) | HIP ports of the fused MoE decode kernels | 2026-10-05 | [en](2098-rocm-fused-moe-hip-port-20261005.en.md) | [ko](2098-rocm-fused-moe-hip-port-20261005.ko.md) | +| [#2097](https://github.com/lablup/mlxcel/pull/2097) | Pool-backed `KVCache::trim` rewinds the block table | 2026-10-06 | [en](2097-pool-backed-kv-trim-20261006.en.md) | [ko](2097-pool-backed-kv-trim-20261006.ko.md) | +| [#2094](https://github.com/lablup/mlxcel/pull/2094) | Forward echoed reasoning under `reasoning_content` too | 2026-10-02 | [en](2094-jamba-reasoning-content-echo-20261002.en.md) | [ko](2094-jamba-reasoning-content-echo-20261002.ko.md) | +| [#2093](https://github.com/lablup/mlxcel/pull/2093) | Cast bf16 tables explicitly where the CUDA overlay demotes | 2026-10-02 | [en](2093-cuda-bf16-promotion-tests-20261002.en.md) | [ko](2093-cuda-bf16-promotion-tests-20261002.ko.md) | +| [#2092](https://github.com/lablup/mlxcel/pull/2092) | Gate CUDA prompt-lookup drafting on shadow probes | 2026-10-02 | [en](2092-prompt-lookup-cuda-shadow-gating-20261002.en.md) | [ko](2092-prompt-lookup-cuda-shadow-gating-20261002.ko.md) | +| [#2088](https://github.com/lablup/mlxcel/pull/2088) | residual paged-budget gaps after #2077 | 2026-10-02 | [en](2088-paged-budget-gaps-20261002.en.md) | [ko](2088-paged-budget-gaps-20261002.ko.md) | +| [#2086](https://github.com/lablup/mlxcel/pull/2086) | Profile gfx1151 decode per kernel and rank the #1814 ports | 2026-09-30 | [en](2086-rocm-decode-profile-port-order-20260930.en.md) | [ko](2086-rocm-decode-profile-port-order-20260930.ko.md) | +| [#2085](https://github.com/lablup/mlxcel/pull/2085) | Route large bf16 qmm to hipBLASLt and gate dense prefill on ROCm | 2026-09-30 | [en](2085-rocm-bf16-qmm-route-hipblaslt-20260930.en.md) | [ko](2085-rocm-bf16-qmm-route-hipblaslt-20260930.ko.md) | +| [#2084](https://github.com/lablup/mlxcel/pull/2084) | Bound in-flight batch memory and enforce the cache limit on ROCm | 2026-09-30 | [en](2084-rocm-inflight-bound-cache-limit-20260930.en.md) | [ko](2084-rocm-inflight-bound-cache-limit-20260930.ko.md) | +| [#2083](https://github.com/lablup/mlxcel/pull/2083) | Complete the #1809 matrix rows with Metal M5 traces | 2026-09-30 | [en](2083-complete-matrix-metal-m5-traces-20260930.en.md) | [ko](2083-complete-matrix-metal-m5-traces-20260930.ko.md) | +| [#2082](https://github.com/lablup/mlxcel/pull/2082) | Fuse the Jamba Mamba scan on CUDA, bit-exact to the graph | 2026-09-30 | [en](2082-jamba-cuda-mamba1-scan-20260930.en.md) | [ko](2082-jamba-cuda-mamba1-scan-20260930.ko.md) | +| [#2080](https://github.com/lablup/mlxcel/pull/2080) | Repair gate failures left by #2034 and #2037 | 2026-09-30 | [en](2080-repair-main-gate-failures-20260930.en.md) | [ko](2080-repair-main-gate-failures-20260930.ko.md) | +| [#2079](https://github.com/lablup/mlxcel/pull/2079) | Run CPU-stream BLAS single-threaded over fine-grained memory | 2026-09-30 | [en](2079-rocm-cpu-blas-single-threaded-20260930.en.md) | [ko](2079-rocm-cpu-blas-single-threaded-20260930.ko.md) | +| [#2078](https://github.com/lablup/mlxcel/pull/2078) | mlxcelverse ROCm sync, drift checks and fork PR packages | 2026-09-30 | [en](2078-mlxcelverse-sync-drift-fork-packages-20260930.en.md) | [ko](2078-mlxcelverse-sync-drift-fork-packages-20260930.ko.md) | +| [#2076](https://github.com/lablup/mlxcel/pull/2076) | Rebuild ROCm HIP objects when an included header changes | 2026-09-30 | [en](2076-rocm-hip-header-dependencies-20260930.en.md) | [ko](2076-rocm-hip-header-dependencies-20260930.ko.md) | +| [#2073](https://github.com/lablup/mlxcel/pull/2073) | Validate MLX_ROCM_FFT_CACHE_SIZE on ROCm | 2026-09-30 | [en](2073-rocm-fft-cache-size-validation-20260930.en.md) | [ko](2073-rocm-fft-cache-size-validation-20260930.ko.md) | +| [#2071](https://github.com/lablup/mlxcel/pull/2071) | mxfp8 End to End on ROCm, Including FP8 Block Checkpoints | 2026-09-30 | [en](2071-rocm-mxfp8-end-to-end-20260930.en.md) | [ko](2071-rocm-mxfp8-end-to-end-20260930.ko.md) | +| [#2070](https://github.com/lablup/mlxcel/pull/2070) | Stop ROCm SliceUpdate from donating a still-referenced source | 2026-09-30 | [en](2070-rocm-slice-update-source-donation-20260930.en.md) | [ko](2070-rocm-slice-update-source-donation-20260930.ko.md) | +| [#2059](https://github.com/lablup/mlxcel/pull/2059) | ROCm Correctness Matrix Rows, Paged-Attention Port Predicates, and a Strided-Scan Grid Fix | 2026-09-30 | [en](2059-rocm-correctness-rows-paged-skips-scan-grid-20260930.en.md) | [ko](2059-rocm-correctness-rows-paged-skips-scan-grid-20260930.ko.md) | +| [#2058](https://github.com/lablup/mlxcel/pull/2058) | llmjp_vl conv-layout parity test raced the default device | 2026-09-30 | [en](2058-llmjp-vl-parity-device-race-20260930.en.md) | [ko](2058-llmjp-vl-parity-device-race-20260930.ko.md) | +| [#2057](https://github.com/lablup/mlxcel/pull/2057) | Committed mxfp4 Regression Tests and a Native-Route Load Log on ROCm | 2026-09-30 | [en](2057-rocm-mxfp4-regression-tests-native-route-20260930.en.md) | [ko](2057-rocm-mxfp4-regression-tests-native-route-20260930.ko.md) | +| [#2056](https://github.com/lablup/mlxcel/pull/2056) | ROCm Support in the Benchmark Harness and a gfx1151 Baseline | 2026-09-30 | [en](2056-rocm-bench-harness-gfx1151-baseline-20260930.en.md) | [ko](2056-rocm-bench-harness-gfx1151-baseline-20260930.ko.md) | +| [#2055](https://github.com/lablup/mlxcel/pull/2055) | Make the Kernel Dtype-Key Checker's Scope Fail-Closed | 2026-09-30 | [en](2055-kernel-dtype-key-scope-fail-closed-20260930.en.md) | [ko](2055-kernel-dtype-key-scope-fail-closed-20260930.ko.md) | +| [#2054](https://github.com/lablup/mlxcel/pull/2054) | VoiceChat streaming under the 80 ms frame budget | 2026-09-30 | [en](2054-voicechat-frame-budget-20260930.en.md) | [ko](2054-voicechat-frame-budget-20260930.ko.md) | +| [#2053](https://github.com/lablup/mlxcel/pull/2053) | Make the ROCm `slice_update_op_kernel` Grid-Stride | 2026-09-30 | [en](2053-rocm-slice-update-grid-stride-20260930.en.md) | [ko](2053-rocm-slice-update-grid-stride-20260930.ko.md) | +| [#2049](https://github.com/lablup/mlxcel/pull/2049) | Set ROCm Blocking-Sync Before the First HIP Queue, Restore the FFT Plan Cache to 128 | 2026-09-30 | [en](2049-rocm-blocking-sync-first-queue-20260930.en.md) | [ko](2049-rocm-blocking-sync-first-queue-20260930.ko.md) | +| [#2048](https://github.com/lablup/mlxcel/pull/2048) | VoiceChat mic check, front-end quantization, attention dedup | 2026-09-30 | [en](2048-voicechat-followups-20260930.en.md) | [ko](2048-voicechat-followups-20260930.ko.md) | +| [#2047](https://github.com/lablup/mlxcel/pull/2047) | Enforce CORS origin policy on /v1/realtime upgrade | 2026-09-29 | [en](2047-realtime-websocket-origin-policy-20260929.en.md) | [ko](2047-realtime-websocket-origin-policy-20260929.ko.md) | +| [#2046](https://github.com/lablup/mlxcel/pull/2046) | Remove the ROCm get_launch_args Helper That Capped the Grid Silently | 2026-09-30 | [en](2046-rocm-remove-get-launch-args-20260930.en.md) | [ko](2046-rocm-remove-get-launch-args-20260930.ko.md) | +| [#2041](https://github.com/lablup/mlxcel/pull/2041) | /v1/realtime WebSocket for Nemotron VoiceChat | 2026-09-29 | [en](2041-voicechat-realtime-websocket-20260929.en.md) | [ko](2041-voicechat-realtime-websocket-20260929.ko.md) | +| [#2039](https://github.com/lablup/mlxcel/pull/2039) | Nemotron VoiceChat Cache-Aware Online Session | 2026-09-29 | [en](2039-voicechat-online-session-20260929.en.md) | [ko](2039-voicechat-online-session-20260929.ko.md) | +| [#2038](https://github.com/lablup/mlxcel/pull/2038) | nanochat Text Model | 2026-09-29 | [en](2038-nanochat-weightless-norm-model-20260929.en.md) | [ko](2038-nanochat-weightless-norm-model-20260929.ko.md) | +| [#2037](https://github.com/lablup/mlxcel/pull/2037) | Nemotron VoiceChat Offline Duplex Inference | 2026-09-29 | [en](2037-nemotron-voicechat-offline-duplex-20260929.en.md) | [ko](2037-nemotron-voicechat-offline-duplex-20260929.ko.md) | +| [#2035](https://github.com/lablup/mlxcel/pull/2035) | Run Affine 1-bit Checkpoints with Fused Metal Kernels | 2026-09-29 | [en](2035-affine-one-bit-kernels-20260929.en.md) | [ko](2035-affine-one-bit-kernels-20260929.ko.md) | +| [#2034](https://github.com/lablup/mlxcel/pull/2034) | Port Nemotron-Parse on the seq2seq worker | 2026-09-29 | [en](2034-nemotron-parse-port-20260929.en.md) | [ko](2034-nemotron-parse-port-20260929.ko.md) | +| [#2033](https://github.com/lablup/mlxcel/pull/2033) | Surface ROCm GPU Failures Through Event::error | 2026-09-29 | [en](2033-rocm-gpu-failures-event-error-20260929.en.md) | [ko](2033-rocm-gpu-failures-event-error-20260929.ko.md) | +| [#2030](https://github.com/lablup/mlxcel/pull/2030) | Backend Quantization Capability Table and NVFP4 Load Policy | 2026-09-29 | [en](2030-backend-quant-capability-table-20260929.en.md) | [ko](2030-backend-quant-capability-table-20260929.ko.md) | +| [#2029](https://github.com/lablup/mlxcel/pull/2029) | Finish the Kernel Port Standardization | 2026-09-29 | [en](2029-finish-kernel-port-standardization-20260929.en.md) | [ko](2029-finish-kernel-port-standardization-20260929.ko.md) | +| [#2028](https://github.com/lablup/mlxcel/pull/2028) | Correct Stale Doc-Comment Examples Across mlxcel and mlxcel-server | 2026-09-29 | [en](2028-doc-comment-examples-fix-20260929.en.md) | [ko](2028-doc-comment-examples-fix-20260929.ko.md) | +| [#2027](https://github.com/lablup/mlxcel/pull/2027) | mlxcel-server download Accepts --help, -h and --usage | 2026-09-29 | [en](2027-server-download-help-flags-20260929.en.md) | [ko](2027-server-download-help-flags-20260929.ko.md) | +| [#2026](https://github.com/lablup/mlxcel/pull/2026) | choose custom-kernel ports through one helper | 2026-09-29 | [en](2026-kernel-port-dispatch-standard-20260929.en.md) | [ko](2026-kernel-port-dispatch-standard-20260929.ko.md) | +| [#2023](https://github.com/lablup/mlxcel/pull/2023) | Unify mlxcel --help subcommand summaries | 2026-09-29 | [en](2023-unify-cli-help-summaries-20260929.en.md) | [ko](2023-unify-cli-help-summaries-20260929.ko.md) | +| [#2022](https://github.com/lablup/mlxcel/pull/2022) | Fix dead docs/model_tests.md and docs/testing.md pointers | 2026-09-28 | [en](2022-fix-dead-docs-pointers-20260928.en.md) | [ko](2022-fix-dead-docs-pointers-20260928.ko.md) | +| [#2021](https://github.com/lablup/mlxcel/pull/2021) | Correct CONTRIBUTING's PR-time CI Gate List Against ci.yml | 2026-09-28 | [en](2021-fix-contributing-ci-gates-20260928.en.md) | [ko](2021-fix-contributing-ci-gates-20260928.ko.md) | +| [#2020](https://github.com/lablup/mlxcel/pull/2020) | Audio routes answer 500 for server-side failures | 2026-09-28 | [en](2020-audio-routes-500-for-server-500-20260928.en.md) | [ko](2020-audio-routes-500-for-server-500-20260928.ko.md) | +| [#2019](https://github.com/lablup/mlxcel/pull/2019) | Reject Whitespace-Only Prompts in Embed | 2026-09-28 | [en](2019-embed-reject-whitespace-prompts-20260928.en.md) | [ko](2019-embed-reject-whitespace-prompts-20260928.ko.md) | +| [#2018](https://github.com/lablup/mlxcel/pull/2018) | guard the four remaining custom-kernel launchers on ROCm | 2026-09-28 | [en](2018-rocm-kernel-launcher-guards-20260928.en.md) | [ko](2018-rocm-kernel-launcher-guards-20260928.ko.md) | +| [#2017](https://github.com/lablup/mlxcel/pull/2017) | (Cover the `_common.py` URL normalization helpers) | 2026-09-28 | [en](2017-common-url-helper-tests-20260928.en.md) | [ko](2017-common-url-helper-tests-20260928.ko.md) | +| [#2016](https://github.com/lablup/mlxcel/pull/2016) | Error Instead of Panic When --prompt Fails to Tokenize | 2026-09-28 | [en](2016-speculative-bench-encode-prompt-result-20260928.en.md) | [ko](2016-speculative-bench-encode-prompt-result-20260928.ko.md) | +| [#2015](https://github.com/lablup/mlxcel/pull/2015) | Add ErrorResponse::internal_server_error | 2026-09-28 | [en](2015-error-response-internal-server-error-20260928.en.md) | [ko](2015-error-response-internal-server-error-20260928.ko.md) | +| [#2014](https://github.com/lablup/mlxcel/pull/2014) | Add a recipes/README Explaining the Registry Snapshot Lifecycle | 2026-09-28 | [en](2014-recipes-readme-registry-snapshot-20260928.en.md) | [ko](2014-recipes-readme-registry-snapshot-20260928.ko.md) | +| [#2013](https://github.com/lablup/mlxcel/pull/2013) | refactor(server): hoist INITIAL_HASH_CAPACITY_LIMIT into store_budget | 2026-09-28 | [en](2013-hoist-initial-hash-capacity-limit-20260928.en.md) | [ko](2013-hoist-initial-hash-capacity-limit-20260928.ko.md) | +| [#2012](https://github.com/lablup/mlxcel/pull/2012) | Honor MLXCEL_BIN and MODEL Overrides in measure_sparse_v_skip_rate.sh | 2026-09-28 | [en](2012-sparse-v-skip-env-overrides-20260928.en.md) | [ko](2012-sparse-v-skip-env-overrides-20260928.ko.md) | +| [#2011](https://github.com/lablup/mlxcel/pull/2011) | harden deploy_webpage.sh with set -euo pipefail | 2026-09-28 | [en](2011-deploy-webpage-strict-mode-20260928.en.md) | [ko](2011-deploy-webpage-strict-mode-20260928.ko.md) | +| [#1990](https://github.com/lablup/mlxcel/pull/1990) | Align Metal runtime controls with the built backend | 2026-09-27 | [en](1990-metal-runtime-controls-20260927.en.md) | [ko](1990-metal-runtime-controls-20260927.ko.md) | +| [#1987](https://github.com/lablup/mlxcel/pull/1987) | Restore Gemma 4 31B MTP exactness | 2026-09-26 | [en](1987-gemma4-31b-mtp-exactness-20260926.en.md) | [ko](1987-gemma4-31b-mtp-exactness-20260926.ko.md) | +| [#1982](https://github.com/lablup/mlxcel/pull/1982) | paged block reclaim during decode | 2026-09-30 | [en](1982-decode-block-reclaim-20260930.en.md) | [ko](1982-decode-block-reclaim-20260930.ko.md) | +| [#1980](https://github.com/lablup/mlxcel/pull/1980) | Gemma 3 KV estimator defaults | 2026-09-26 | [en](1980-gemma3-kv-defaults-20260926.en.md) | [ko](1980-gemma3-kv-defaults-20260926.ko.md) | +| [#1979](https://github.com/lablup/mlxcel/pull/1979) | Nemotron-H Nano Omni per-sequence state | 2026-09-26 | [en](1979-nemotron-omni-sequence-state-20260926.en.md) | [ko](1979-nemotron-omni-sequence-state-20260926.ko.md) | +| [#1977](https://github.com/lablup/mlxcel/pull/1977) | Models screen split, overflow hook and format cache | 2026-09-26 | [en](1977-models-split-overflow-cache-20260926.en.md) | [ko](1977-models-split-overflow-cache-20260926.ko.md) | +| [#1975](https://github.com/lablup/mlxcel/pull/1975) | residual LOW items in the Models and Activity pages | 2026-09-25 | [en](1975-webui-residual-low-items-20260925.en.md) | [ko](1975-webui-residual-low-items-20260925.ko.md) | +| [#1896](https://github.com/lablup/mlxcel/pull/1896) | Patch rustls handshake boundaries | 2026-09-15 | [en](1896-rustls-handshake-security-20260915.en.md) | [ko](1896-rustls-handshake-security-20260915.ko.md) | +| [#1894](https://github.com/lablup/mlxcel/pull/1894) | bounded local streaming chat | 2026-09-14 | [en](1894-streaming-local-chat-20260914.en.md) | [ko](1894-streaming-local-chat-20260914.ko.md) | +| [#1893](https://github.com/lablup/mlxcel/pull/1893) | Runtime observation and Activity | 2026-09-14 | [en](1893-runtime-activity-20260914.en.md) | [ko](1893-runtime-activity-20260914.ko.md) | +| [#1892](https://github.com/lablup/mlxcel/pull/1892) | Scoped WebUI settings | 2026-09-15 | [en](1892-scoped-webui-settings-20260915.en.md) | [ko](1892-scoped-webui-settings-20260915.ko.md) | +| [#1891](https://github.com/lablup/mlxcel/pull/1891) | Model library WebUI | 2026-09-14 | [en](1891-webui-model-library-20260914.en.md) | [ko](1891-webui-model-library-20260914.ko.md) | +| [#1888](https://github.com/lablup/mlxcel/pull/1888) | refactor(moe): migrate qwen3_moe onto the shared SwitchGLU | 2026-09-14 | [en](1888-qwen3-moe-shared-switchglu-20260914.en.md) | [ko](1888-qwen3-moe-shared-switchglu-20260914.ko.md) | +| [#1878](https://github.com/lablup/mlxcel/pull/1878) | Reliable FFT numeric and plan-cache probes | 2026-10-15 | [en](1878-fft-numeric-probe-20261015.en.md) | [ko](1878-fft-numeric-probe-20261015.ko.md) | +| [#1872](https://github.com/lablup/mlxcel/pull/1872) | Safe WebUI model library operations | 2026-09-13 | [en](1872-safe-webui-library-20260913.en.md) | [ko](1872-safe-webui-library-20260913.ko.md) | +| [#1871](https://github.com/lablup/mlxcel/pull/1871) | feat: enable model-free WebUI startup | 2026-09-13 | [en](1871-model-free-webui-startup-20260913.en.md) | [ko](1871-model-free-webui-startup-20260913.ko.md) | +| [#1868](https://github.com/lablup/mlxcel/pull/1868) | Model catalog projection | 2026-09-12 | [en](1868-model-catalog-projection-20260912.en.md) | [ko](1868-model-catalog-projection-20260912.ko.md) | +| [#1865](https://github.com/lablup/mlxcel/pull/1865) | WebUI Security Policy and Router Harness | 2026-09-12 | [en](1865-webui-security-policy-20260912.en.md) | [ko](1865-webui-security-policy-20260912.ko.md) | +| [#1864](https://github.com/lablup/mlxcel/pull/1864) | Shared WebUI client and state authority | 2026-09-12 | [en](1864-shared-webui-client-20260912.en.md) | [ko](1864-shared-webui-client-20260912.ko.md) | +| [#1863](https://github.com/lablup/mlxcel/pull/1863) | WebUI design system and provider integration report | 2026-09-13 | [en](1863-webui-design-system-20260913.en.md) | [ko](1863-webui-design-system-20260913.ko.md) | +| [#1860](https://github.com/lablup/mlxcel/pull/1860) | / Issue #1839 - Router lifecycle coordinator and worker-exit gating | 2026-09-12 | [en](1860-router-lifecycle-coordinator-20260912.en.md) | [ko](1860-router-lifecycle-coordinator-20260912.ko.md) | +| [#1857](https://github.com/lablup/mlxcel/pull/1857) | Reproducible WebUI bundle | 2026-09-12 | [en](1857-reproducible-webui-bundle-20260912.en.md) | [ko](1857-reproducible-webui-bundle-20260912.ko.md) | +| [#1854](https://github.com/lablup/mlxcel/pull/1854) | Localize Qwen3-VL vision parity | 2026-09-12 | [en](1854-qwen3-vl-vision-parity-20260912.en.md) | [ko](1854-qwen3-vl-vision-parity-20260912.ko.md) | +| [#1851](https://github.com/lablup/mlxcel/pull/1851) | WebUI contract gate | 2026-09-12 | [en](1851-webui-contract-gate-20260912.en.md) | [ko](1851-webui-contract-gate-20260912.ko.md) | +| [#1833](https://github.com/lablup/mlxcel/pull/1833) | test: qualify paged scheduler parity | 2026-09-12 | [en](1833-qualify-paged-scheduler-parity-20260912.en.md) | [ko](1833-qualify-paged-scheduler-parity-20260912.ko.md) | +| [#1828](https://github.com/lablup/mlxcel/pull/1828) | fix: share auto parallel context budget | 2026-09-12 | [en](1828-auto-parallel-unified-context-20260912.en.md) | [ko](1828-auto-parallel-unified-context-20260912.ko.md) | +| [#1821](https://github.com/lablup/mlxcel/pull/1821) | fix: track live slot occupancy during prefill | 2026-09-12 | [en](1821-live-slot-prefill-occupancy-20260912.en.md) | [ko](1821-live-slot-prefill-occupancy-20260912.ko.md) | +| [#1820](https://github.com/lablup/mlxcel/pull/1820) | Bucketing the cuDNN SDPA plan-cache key, and why it should not ship | 2026-09-17 | [en](1820-sdpa-plan-cache-bucket-20260917.en.md) | [ko](1820-sdpa-plan-cache-bucket-20260917.ko.md) | +| [#1799](https://github.com/lablup/mlxcel/pull/1799) | Where the Laguna DFlash verify round's fixed cost goes on GB10, and the fix | 2026-09-11 | [en](1799-laguna-dflash-verify-cost-cuda-20260911.en.md) | [ko](1799-laguna-dflash-verify-cost-cuda-20260911.ko.md) | +| [#1798](https://github.com/lablup/mlxcel/pull/1798) | Raising MLX's CUDA graph budgets on GB10: measured per family, shipped for one | 2026-09-12 | [en](1798-cuda-graph-budget-gb10-20260912.en.md) | [ko](1798-cuda-graph-budget-gb10-20260912.ko.md) | +| [#1796](https://github.com/lablup/mlxcel/pull/1796) | Update copyright attribution | 2026-09-11 | [en](1796-update-copyright-attribution-20260911.en.md) | [ko](1796-update-copyright-attribution-20260911.ko.md) | +| [#1782](https://github.com/lablup/mlxcel/pull/1782) | Where the fixed cost of a multi-row speculative verify goes on GB10, and the two fixes | 2026-09-11 | [en](1782-dflash-verify-fixed-cost-cuda-20260911.en.md) | [ko](1782-dflash-verify-fixed-cost-cuda-20260911.ko.md) | +| [#1781](https://github.com/lablup/mlxcel/pull/1781) | Exempt `main` from the two job-level `cancel-in-progress` flags | 2026-09-11 | [en](1781-ci-main-exempt-job-cancel-20260911.en.md) | [ko](1781-ci-main-exempt-job-cancel-20260911.ko.md) | +| [#1779](https://github.com/lablup/mlxcel/pull/1779) | test(laguna): add a checkpoint-code reference trace and forward tests | 2026-09-11 | [en](1779-laguna-modeling-file-reference-20260911.en.md) | [ko](1779-laguna-modeling-file-reference-20260911.ko.md) | +| [#1778](https://github.com/lablup/mlxcel/pull/1778) | fix(split-mtp): fix refusal text, --force shards, --q-bits validation | 2026-09-11 | [en](1778-split-mtp-output-guards-20260911.en.md) | [ko](1778-split-mtp-output-guards-20260911.ko.md) | +| [#1777](https://github.com/lablup/mlxcel/pull/1777) | fix(video): align the CLI and server video-frames fallback | 2026-09-11 | [en](1777-video-fallback-cli-server-parity-20260911.en.md) | [ko](1777-video-fallback-cli-server-parity-20260911.ko.md) | +| [#1776](https://github.com/lablup/mlxcel/pull/1776) | fix(models): size sliding masks from visible_len, not seq_len | 2026-09-11 | [en](1776-rotating-live-len-visible-20260911.en.md) | [ko](1776-rotating-live-len-visible-20260911.ko.md) | +| [#1775](https://github.com/lablup/mlxcel/pull/1775) | chore(core): fix create_causal_mask roster count and add a drift guard | 2026-09-11 | [en](1775-causal-mask-roster-guard-20260911.en.md) | [ko](1775-causal-mask-roster-guard-20260911.ko.md) | +| [#1774](https://github.com/lablup/mlxcel/pull/1774) | chore(ci): add a concurrency group so superseded runs stop stacking | 2026-09-11 | [en](1774-ci-concurrency-group-20260911.en.md) | [ko](1774-ci-concurrency-group-20260911.ko.md) | +| [#1772](https://github.com/lablup/mlxcel/pull/1772) | fix(mlx): bump MLX pin to 81ba1c6a so mxfp8 block scales round up | 2026-09-11 | [en](1772-mlx-pin-mxfp8-round-up-20260911.en.md) | [ko](1772-mlx-pin-mxfp8-round-up-20260911.ko.md) | +| [#1770](https://github.com/lablup/mlxcel/pull/1770) | test: fix settings-schema roster and drafter-refusal drift | 2026-09-11 | [en](1770-settings-roster-drafter-refusal-drift-20260911.en.md) | [ko](1770-settings-roster-drafter-refusal-drift-20260911.ko.md) | +| [#1768](https://github.com/lablup/mlxcel/pull/1768) | feat(vision): add the Kimi K3 MoonViT3D tower and navit image path | 2026-09-11 | [en](1768-kimi-k3-moonvit3d-navit-vision-20260911.en.md) | [ko](1768-kimi-k3-moonvit3d-navit-vision-20260911.ko.md) | +| [#1762](https://github.com/lablup/mlxcel/pull/1762) | feat(speculative): Muse Glimmer DFlash assistant drafter on the round loop | 2026-09-10 | [en](1762-muse-glimmer-dflash-assistant-drafter-20260910.en.md) | [ko](1762-muse-glimmer-dflash-assistant-drafter-20260910.ko.md) | +| [#1759](https://github.com/lablup/mlxcel/pull/1759) | feat(server): send sampled video frames as ordered images | 2026-09-10 | [en](1759-video-frames-fallback-20260910.en.md) | [ko](1759-video-frames-fallback-20260910.ko.md) | +| [#1757](https://github.com/lablup/mlxcel/pull/1757) | feat(models): add the IQuest-Coder Loop two-pass decoder (iquestloopcoder) | 2026-09-10 | [en](1757-iquestloopcoder-two-pass-loop-20260910.en.md) | [ko](1757-iquestloopcoder-two-pass-loop-20260910.ko.md) | +| [#1753](https://github.com/lablup/mlxcel/pull/1753) | feat(speculative): GLM-4.7-Flash (glm4_moe_lite) MTP drafter | 2026-09-10 | [en](1753-glm4-moe-lite-mtp-drafter-20260910.en.md) | [ko](1753-glm4-moe-lite-mtp-drafter-20260910.ko.md) | +| [#1752](https://github.com/lablup/mlxcel/pull/1752) | feat(core): share KV snapshot serialization across attention cache families | 2026-09-10 | [en](1752-shared-kv-snapshot-attention-families-20260910.en.md) | [ko](1752-shared-kv-snapshot-attention-families-20260910.ko.md) | +| [#1751](https://github.com/lablup/mlxcel/pull/1751) | feat(speculative): LFM2 / LFM2.5 DSpark drafter on the DFlash loop | 2026-09-10 | [en](1751-lfm2-dspark-drafter-20260910.en.md) | [ko](1751-lfm2-dspark-drafter-20260910.ko.md) | +| [#1744](https://github.com/lablup/mlxcel/pull/1744) | feat(got): port GOT-OCR 2.0 (SAM ViT-B + Qwen2-0.5B) | 2026-09-10 | [en](1744-got-ocr2-sam-vitb-qwen2-20260910.en.md) | [ko](1744-got-ocr2-sam-vitb-qwen2-20260910.ko.md) | +| [#1743](https://github.com/lablup/mlxcel/pull/1743) | feat(tokenizer): Kimi K3 tiktoken family and native XTML renderer | 2026-09-10 | [en](1743-kimi-k3-tiktoken-xtml-renderer-20260910.en.md) | [ko](1743-kimi-k3-tiktoken-xtml-renderer-20260910.ko.md) | +| [#1742](https://github.com/lablup/mlxcel/pull/1742) | feat(qwen3_5): load vendor fine-grained FP8 checkpoints | 2026-09-10 | [en](1742-qwen35-fp8-block-requantize-20260910.en.md) | [ko](1742-qwen35-fp8-block-requantize-20260910.ko.md) | +| [#1741](https://github.com/lablup/mlxcel/pull/1741) | feat(models): add the Kimi K3 text backbone | 2026-09-10 | [en](1741-kimi-k3-text-backbone-20260910.en.md) | [ko](1741-kimi-k3-text-backbone-20260910.ko.md) | +| [#1740](https://github.com/lablup/mlxcel/pull/1740) | feat(gemma4_unified): accept video and audio in the same prompt | 2026-09-10 | [en](1740-gemma4-unified-video-with-audio-20260910.en.md) | [ko](1740-gemma4-unified-video-with-audio-20260910.ko.md) | +| [#1739](https://github.com/lablup/mlxcel/pull/1739) | feat(models): add the Laguna family with compressed-tensors NVFP4 experts | 2026-09-10 | [en](1739-laguna-compressed-tensors-nvfp4-experts-20260910.en.md) | [ko](1739-laguna-compressed-tensors-nvfp4-experts-20260910.ko.md) | +| [#1737](https://github.com/lablup/mlxcel/pull/1737) | feat(llmjpvl): port LLM-jp-4 VL and Jagle-VL | 2026-09-10 | [en](1737-llmjpvl-siglip2-pixel-shuffle-llama-qwen3-20260910.en.md) | [ko](1737-llmjpvl-siglip2-pixel-shuffle-llama-qwen3-20260910.ko.md) | +| [#1736](https://github.com/lablup/mlxcel/pull/1736) | fix(internlm2): add family rope_scaling tests and NTK rescale log | 2026-09-10 | [en](1736-internlm2-rope-tests-rescale-log-20260910.en.md) | [ko](1736-internlm2-rope-tests-rescale-log-20260910.ko.md) | +| [#1735](https://github.com/lablup/mlxcel/pull/1735) | feat(vlm): add the Cohere Compass (North-Micro-Vision) VLM | 2026-09-10 | [en](1735-cohere-compass-vlm-20260910.en.md) | [ko](1735-cohere-compass-vlm-20260910.ko.md) | +| [#1683](https://github.com/lablup/mlxcel/pull/1683) | Granite Vision descriptive prompts drew a refusal | 2026-10-06 | [en](1683-granite-vision-config-added-tokens-20261006.en.md) | [ko](1683-granite-vision-config-added-tokens-20261006.ko.md) | +| [#1623](https://github.com/lablup/mlxcel/pull/1623) | perf(qwen3_moe): batch the decode forward instead of per-row forwards | 2026-09-04 | [en](1623-qwen3-moe-batched-decode-20260904.en.md) | [ko](1623-qwen3-moe-batched-decode-20260904.ko.md) | +| [#1621](https://github.com/lablup/mlxcel/pull/1621) | feat(bench): dispatch speculative_bench MTP past Gemma 4 Unified | 2026-09-04 | [en](1621-speculative-bench-mtp-dispatch-20260904.en.md) | [ko](1621-speculative-bench-mtp-dispatch-20260904.ko.md) | +| [#1620](https://github.com/lablup/mlxcel/pull/1620) | fix(server): resolve absolute file:// URLs under --media-path | 2026-09-04 | [en](1620-media-path-absolute-file-url-20260904.en.md) | [ko](1620-media-path-absolute-file-url-20260904.ko.md) | +| [#1619](https://github.com/lablup/mlxcel/pull/1619) | fix(youtu_vl): emit patches in merge-block-major order | 2026-09-04 | [en](1619-youtu-vl-merge-block-major-patches-20260904.en.md) | [ko](1619-youtu-vl-merge-block-major-patches-20260904.ko.md) | +| [#1608](https://github.com/lablup/mlxcel/pull/1608) | fix: include RT-DETRv2 in arch JSON registry | 2026-09-03 | [en](1608-rtdetr-detection-registry-20260903.en.md) | [ko](1608-rtdetr-detection-registry-20260903.ko.md) | +| [#1606](https://github.com/lablup/mlxcel/pull/1606) | feat: add arch JSON recipes registry | 2026-09-03 | [en](1606-arch-json-recipes-registry-20260903.en.md) | [ko](1606-arch-json-recipes-registry-20260903.ko.md) | +| [#1605](https://github.com/lablup/mlxcel/pull/1605) | feat: add JSON inspect output | 2026-09-03 | [en](1605-json-inspect-output-20260903.en.md) | [ko](1605-json-inspect-output-20260903.ko.md) | +| [#1603](https://github.com/lablup/mlxcel/pull/1603) | fix: build the Youtu-VL window inverse as `argsort`, not the permutation itself | 2026-09-03 | [en](1603-youtu-vl-window-inverse-20260903.en.md) | [ko](1603-youtu-vl-window-inverse-20260903.ko.md) | +| [#1601](https://github.com/lablup/mlxcel/pull/1601) | fix(qwen2_5_vl): f32 tower norm and a correct window inverse | 2026-09-03 | [en](1601-qwen2-5-vl-f16-norm-overflow-20260903.en.md) | [ko](1601-qwen2-5-vl-f16-norm-overflow-20260903.ko.md) | +| [#1598](https://github.com/lablup/mlxcel/pull/1598) | fix(server): define tools only when the request sends them | 2026-09-03 | [en](1598-tools-undefined-template-context-20260903.en.md) | [ko](1598-tools-undefined-template-context-20260903.ko.md) | +| [#1595](https://github.com/lablup/mlxcel/pull/1595) | fix(core): separate GPU backend availability from the default device | 2026-09-02 | [en](1595-gpu-backend-availability-device-guard-20260902.en.md) | [ko](1595-gpu-backend-availability-device-guard-20260902.ko.md) | +| [#1594](https://github.com/lablup/mlxcel/pull/1594) | feat(models): add the IQuest-Coder (iquestcoder) route | 2026-09-02 | [en](1594-iquest-coder-spm-prefix-20260902.en.md) | [ko](1594-iquest-coder-spm-prefix-20260902.ko.md) | +| [#1593](https://github.com/lablup/mlxcel/pull/1593) | feat(models): route text-only Youtu-LLM to its MLA decoder | 2026-09-02 | [en](1593-youtu-llm-text-route-20260902.en.md) | [ko](1593-youtu-llm-text-route-20260902.ko.md) | +| [#1588](https://github.com/lablup/mlxcel/pull/1588) | feat(server): report per-request speculative acceptance | 2026-09-02 | [en](1588-speculative-acceptance-timings-20260902.en.md) | [ko](1588-speculative-acceptance-timings-20260902.ko.md) | +| [#1582](https://github.com/lablup/mlxcel/pull/1582) | fix(qwen2_5_vl): normalize the raw HF patch-embed layout at load | 2026-09-02 | [en](1582-qwen2-5-vl-patch-embed-layout-20260902.en.md) | [ko](1582-qwen2-5-vl-patch-embed-layout-20260902.ko.md) | +| [#1580](https://github.com/lablup/mlxcel/pull/1580) | fix(phi3): select the LongRoPE table by whole-prompt position | 2026-09-02 | [en](1580-longrope-table-whole-prompt-selection-20260902.en.md) | [ko](1580-longrope-table-whole-prompt-selection-20260902.ko.md) | +| [#1578](https://github.com/lablup/mlxcel/pull/1578) | perf(server): pack structured-output masks as u32 bitmasks | 2026-09-02 | [en](1578-packed-structured-output-mask-20260902.en.md) | [ko](1578-packed-structured-output-mask-20260902.ko.md) | +| [#1576](https://github.com/lablup/mlxcel/pull/1576) | fix(lora): refuse adapters that do not map onto the model | 2026-09-02 | [en](1576-lora-adapter-tensor-validation-20260902.en.md) | [ko](1576-lora-adapter-tensor-validation-20260902.ko.md) | +| [#1575](https://github.com/lablup/mlxcel/pull/1575) | fix(server): type XML tool-call arguments by the request schema | 2026-09-02 | [en](1575-xml-tool-call-schema-coercion-20260902.en.md) | [ko](1575-xml-tool-call-schema-coercion-20260902.ko.md) | +| [#1574](https://github.com/lablup/mlxcel/pull/1574) | fix(mamba): apply Falcon-Mamba B/C/dt RMS norm once, no per-call ones | 2026-09-02 | [en](1574-mamba-bcdt-rms-norm-once-20260902.en.md) | [ko](1574-mamba-bcdt-rms-norm-once-20260902.ko.md) | +| [#1573](https://github.com/lablup/mlxcel/pull/1573) | chore(execution): parse memory sizes with one shared grammar | 2026-09-02 | [en](1573-one-memory-size-grammar-20260902.en.md) | [ko](1573-one-memory-size-grammar-20260902.ko.md) | +| [#1572](https://github.com/lablup/mlxcel/pull/1572) | Run Python client CI across a 3.9-3.13 version matrix | 2026-09-02 | [en](1572-python-ci-version-matrix-20260902.en.md) | [ko](1572-python-ci-version-matrix-20260902.ko.md) | +| [#1571](https://github.com/lablup/mlxcel/pull/1571) | docs: correct stale "not a server knob" claim in turbo-kv-cache.md | 2026-09-02 | [en](1571-fix-stale-server-knob-claim-20260902.en.md) | [ko](1571-fix-stale-server-knob-claim-20260902.ko.md) | +| [#1570](https://github.com/lablup/mlxcel/pull/1570) | chore(build): guard webpage-build against missing MkDocs sources | 2026-09-02 | [en](1570-guard-webpage-build-mkdocs-sources-20260902.en.md) | [ko](1570-guard-webpage-build-mkdocs-sources-20260902.ko.md) | +| [#1568](https://github.com/lablup/mlxcel/pull/1568) | Quote Python extras installs under zsh | 2026-09-01 | [en](1568-quote-python-extras-zsh-20260901.en.md) | [ko](1568-quote-python-extras-zsh-20260901.ko.md) | +| [#1565](https://github.com/lablup/mlxcel/pull/1565) | what the Volta fixed first-token cost is actually made of | 2026-09-01 | [en](1565-volta-ttft-fixed-cost-20260901.en.md) | [ko](1565-volta-ttft-fixed-cost-20260901.ko.md) | +| [#1562](https://github.com/lablup/mlxcel/pull/1562) | tagging the pre-Ampere grouped GEMM arm Sm70 instead of Sm75 | 2026-09-01 | [en](1562-grouped-gemm-arch-tag-sm70-20260901.en.md) | [ko](1562-grouped-gemm-arch-tag-sm70-20260901.ko.md) | +| [#1559](https://github.com/lablup/mlxcel/pull/1559) | sizing the qmm_naive CTA tile from the shared-memory budget | 2026-08-31 | [en](1559-qmm-naive-cta-tile-shared-memory-budget-20260831.en.md) | [ko](1559-qmm-naive-cta-tile-shared-memory-budget-20260831.ko.md) | +| [#1557](https://github.com/lablup/mlxcel/pull/1557) | float accumulators for qmv below Ampere | 2026-08-31 | [en](1557-qmv-float-accumulators-20260831.en.md) | [ko](1557-qmv-float-accumulators-20260831.ko.md) | +| [#1556](https://github.com/lablup/mlxcel/pull/1556) | Volta sm_70 baseline record and CI gate | 2026-08-31 | [en](1556-volta-sm70-baseline-record-20260831.en.md) | [ko](1556-volta-sm70-baseline-record-20260831.ko.md) | +| [#1555](https://github.com/lablup/mlxcel/pull/1555) | Flatten Inkling audio chunk concatenation | 2026-08-31 | [en](1555-flatten-inkling-audio-concat-20260831.en.md) | [ko](1555-flatten-inkling-audio-concat-20260831.ko.md) | +| [#1551](https://github.com/lablup/mlxcel/pull/1551) | CUDA compute capability probe | 2026-08-31 | [en](1551-cuda-compute-capability-probe-20260831.en.md) | [ko](1551-cuda-compute-capability-probe-20260831.ko.md) | +| [#1548](https://github.com/lablup/mlxcel/pull/1548) | Inkling dMel audio input | 2026-08-31 | [en](1548-inkling-dmel-audio-20260831.en.md) | [ko](1548-inkling-dmel-audio-20260831.ko.md) | +| [#1547](https://github.com/lablup/mlxcel/pull/1547) | Derive the thinking_mode sentinel from the chat template | 2026-08-31 | [en](1547-thinking-mode-sentinel-derivation-20260831.en.md) | [ko](1547-thinking-mode-sentinel-derivation-20260831.ko.md) | +| [#1546](https://github.com/lablup/mlxcel/pull/1546) | Inkling adjacent-frame video support | 2026-08-31 | [en](1546-inkling-adjacent-frame-video-20260831.en.md) | [ko](1546-inkling-adjacent-frame-video-20260831.ko.md) | +| [#1540](https://github.com/lablup/mlxcel/pull/1540) | Inkling native MTP | 2026-08-31 | [en](1540-inkling-native-mtp-20260831.en.md) | [ko](1540-inkling-native-mtp-20260831.ko.md) | +| [#1535](https://github.com/lablup/mlxcel/pull/1535) | Inkling HMLP image support | 2026-08-31 | [en](1535-inkling-hmlp-image-support-20260831.en.md) | [ko](1535-inkling-hmlp-image-support-20260831.ko.md) | +| [#1532](https://github.com/lablup/mlxcel/pull/1532) | Inkling text backbone | 2026-08-31 | [en](1532-inkling-text-backbone-20260831.en.md) | [ko](1532-inkling-text-backbone-20260831.ko.md) | +| [#1521](https://github.com/lablup/mlxcel/pull/1521) | Scheduler Module Split | 2026-08-30 | [en](1521-scheduler-module-split-20260830.en.md) | [ko](1521-scheduler-module-split-20260830.ko.md) | +| [#1519](https://github.com/lablup/mlxcel/pull/1519) | Store Byte Bounds | 2026-08-30 | [en](1519-store-byte-bounds-20260830.en.md) | [ko](1519-store-byte-bounds-20260830.ko.md) | +| [#1518](https://github.com/lablup/mlxcel/pull/1518) | Chat Template Compile Cache | 2026-08-30 | [en](1518-chat-template-cache-20260830.en.md) | [ko](1518-chat-template-cache-20260830.ko.md) | +| [#1517](https://github.com/lablup/mlxcel/pull/1517) | shared-audio-fft | 2026-08-30 | [en](1517-shared-audio-fft-20260830.en.md) | [ko](1517-shared-audio-fft-20260830.ko.md) | +| [#1515](https://github.com/lablup/mlxcel/pull/1515) | JSON body image budget | 2026-08-30 | [en](1515-json-body-image-budget-20260830.en.md) | [ko](1515-json-body-image-budget-20260830.ko.md) | +| [#1514](https://github.com/lablup/mlxcel/pull/1514) | KV Binary Byte Units | 2026-08-30 | [en](1514-kv-binary-byte-units-20260830.en.md) | [ko](1514-kv-binary-byte-units-20260830.ko.md) | +| [#1513](https://github.com/lablup/mlxcel/pull/1513) | recurrent-state-lifecycle | 2026-08-30 | [en](1513-recurrent-state-lifecycle-20260830.en.md) | [ko](1513-recurrent-state-lifecycle-20260830.ko.md) | +| [#1512](https://github.com/lablup/mlxcel/pull/1512) | Deterministic TP Crossover Assertions | 2026-08-30 | [en](1512-deterministic-tp-crossover-20260830.en.md) | [ko](1512-deterministic-tp-crossover-20260830.ko.md) | +| [#1511](https://github.com/lablup/mlxcel/pull/1511) | Template rejection surfaces | 2026-08-30 | [en](1511-template-rejection-surfaces-20260830.en.md) | [ko](1511-template-rejection-surfaces-20260830.ko.md) | +| [#1510](https://github.com/lablup/mlxcel/pull/1510) | qwen-vl-video-input | 2026-08-30 | [en](1510-qwen-vl-video-input-20260830.en.md) | [ko](1510-qwen-vl-video-input-20260830.ko.md) | +| [#1509](https://github.com/lablup/mlxcel/pull/1509) | Model-aware snapshot cache capacity | 2026-08-30 | [en](1509-model-aware-snapshot-capacity-20260830.en.md) | [ko](1509-model-aware-snapshot-capacity-20260830.ko.md) | +| [#1507](https://github.com/lablup/mlxcel/pull/1507) | Gate boundary snapshots by model capability | 2026-08-30 | [en](1507-snapshot-capability-gate-20260830.en.md) | [ko](1507-snapshot-capability-gate-20260830.ko.md) | +| [#1497](https://github.com/lablup/mlxcel/pull/1497) | Multi-adapter LoRA to the fused-weights boundary | 2026-08-28 | [en](1497-multi-adapter-lora-20260828.en.md) | [ko](1497-multi-adapter-lora-20260828.ko.md) | +| [#1495](https://github.com/lablup/mlxcel/pull/1495) | Router mode and the models-dir migration | 2026-08-28 | [en](1495-router-mode-models-dir-20260828.en.md) | [ko](1495-router-mode-models-dir-20260828.ko.md) | +| [#1492](https://github.com/lablup/mlxcel/pull/1492) | Props, slots, metrics, health, and slot persistence | 2026-08-28 | [en](1492-observability-slots-persistence-20260828.en.md) | [ko](1492-observability-slots-persistence-20260828.ko.md) | +| [#1489](https://github.com/lablup/mlxcel/pull/1489) | Control-vector explicit rejection | 2026-08-28 | [en](1489-control-vector-rejection-20260828.en.md) | [ko](1489-control-vector-rejection-20260828.ko.md) | +| [#1488](https://github.com/lablup/mlxcel/pull/1488) | b10621 speculative flag mapping | 2026-08-28 | [en](1488-speculative-flag-mapping-20260828.en.md) | [ko](1488-speculative-flag-mapping-20260828.ko.md) | +| [#1487](https://github.com/lablup/mlxcel/pull/1487) | b10621 sampling semantics and windows | 2026-08-28 | [en](1487-b10621-sampling-semantics-20260828.en.md) | [ko](1487-b10621-sampling-semantics-20260828.ko.md) | +| [#1482](https://github.com/lablup/mlxcel/pull/1482) | Locally typical sampling (typical_p) | 2026-08-28 | [en](1482-locally-typical-sampling-20260828.en.md) | [ko](1482-locally-typical-sampling-20260828.ko.md) | +| [#1479](https://github.com/lablup/mlxcel/pull/1479) | Top-n-sigma logit filtering with a row-filter hook | 2026-08-28 | [en](1479-top-n-sigma-row-filter-20260828.en.md) | [ko](1479-top-n-sigma-row-filter-20260828.ko.md) | +| [#1472](https://github.com/lablup/mlxcel/pull/1472) | b10621 context retention, YaRN overrides, and the batching classifications | 2026-08-30 | [en](1472-context-batching-yarn-20260830.en.md) | [ko](1472-context-batching-yarn-20260830.ko.md) | +| [#1455](https://github.com/lablup/mlxcel/pull/1455) | DeepSeek-V4 as a net-new architecture | 2026-08-26 | [en](1455-deepseek-v4-net-new-architecture-20260826.en.md) | [ko](1455-deepseek-v4-net-new-architecture-20260826.ko.md) | +| [#1429](https://github.com/lablup/mlxcel/pull/1429) | Refresh embedding and reranking CLI guidance | 2026-08-26 | [en](1429-refresh-embedding-reranking-cli-guidance-20260826.en.md) | [ko](1429-refresh-embedding-reranking-cli-guidance-20260826.ko.md) | +| [#1417](https://github.com/lablup/mlxcel/pull/1417) | `/v1/rerank` with sequence-classifier, Qwen3 generative and Qwen3-VL multimodal rerankers | 2026-08-26 | [en](1417-v1-rerank-three-reranker-kinds-20260826.en.md) | [ko](1417-v1-rerank-three-reranker-kinds-20260826.ko.md) | +| [#1416](https://github.com/lablup/mlxcel/pull/1416) | Qwen3-VL-Embedding and Llama-Nemotron-VL-Embed | 2026-08-26 | [en](1416-multimodal-embedders-qwen3vl-nemotronvl-20260826.en.md) | [ko](1416-multimodal-embedders-qwen3vl-nemotronvl-20260826.ko.md) | +| [#1415](https://github.com/lablup/mlxcel/pull/1415) | Bidirectional Llama, Nemotron-3-Embed and LFM2.5-Embedding | 2026-08-26 | [en](1415-bidirectional-llama-nemotron-lfm2-embeddings-20260826.en.md) | [ko](1415-bidirectional-llama-nemotron-lfm2-embeddings-20260826.ko.md) | +| [#1414](https://github.com/lablup/mlxcel/pull/1414) | ColIdefics3 and ColQwen2.5 late-interaction embedders | 2026-08-26 | [en](1414-colidefics3-colqwen25-late-interaction-20260826.en.md) | [ko](1414-colidefics3-colqwen25-late-interaction-20260826.ko.md) | +| [#1413](https://github.com/lablup/mlxcel/pull/1413) | EmbeddingGemma and Qwen3-Embedding forward passes | 2026-08-26 | [en](1413-embeddinggemma-qwen3-embedding-forward-20260826.en.md) | [ko](1413-embeddinggemma-qwen3-embedding-forward-20260826.ko.md) | +| [#1412](https://github.com/lablup/mlxcel/pull/1412) | ModernBERT Encoder for /v1/embeddings | 2026-08-26 | [en](1412-modernbert-encoder-embeddings-20260826.en.md) | [ko](1412-modernbert-encoder-embeddings-20260826.ko.md) | +| [#1411](https://github.com/lablup/mlxcel/pull/1411) | BERT and XLM-RoBERTa Encoders | 2026-08-26 | [en](1411-bert-xlm-roberta-encoders-20260826.en.md) | [ko](1411-bert-xlm-roberta-encoders-20260826.ko.md) | +| [#1410](https://github.com/lablup/mlxcel/pull/1410) | SigLIP text tower on /v1/embeddings | 2026-08-26 | [en](1410-siglip-text-tower-embeddings-20260826.en.md) | [ko](1410-siglip-text-tower-embeddings-20260826.ko.md) | +| [#1408](https://github.com/lablup/mlxcel/pull/1408) | Embeddings Foundation: Pooling, Masks, Embedding Kind and /v1/embeddings | 2026-08-25 | [en](1408-embeddings-foundation-20260825.en.md) | [ko](1408-embeddings-foundation-20260825.ko.md) | +| [#1407](https://github.com/lablup/mlxcel/pull/1407) | Disable ThinLTO in test-fast | 2026-08-25 | [en](1407-disable-test-thinlto-20260825.en.md) | [ko](1407-disable-test-thinlto-20260825.ko.md) | +| [#1405](https://github.com/lablup/mlxcel/pull/1405) | LFM2-VL Image Splitting | 2026-08-25 | [en](1405-lfm2-vl-image-splitting-20260825.en.md) | [ko](1405-lfm2-vl-image-splitting-20260825.ko.md) | +| [#1404](https://github.com/lablup/mlxcel/pull/1404) | Parse Python Repr Tool-Call Values | 2026-08-25 | [en](1404-pythonic-tool-call-values-20260825.en.md) | [ko](1404-pythonic-tool-call-values-20260825.ko.md) | +| [#1403](https://github.com/lablup/mlxcel/pull/1403) | Preserve Gemma4 Vision Masks with Audio | 2026-08-25 | [en](1403-gemma4-unified-audio-vision-mask-20260825.en.md) | [ko](1403-gemma4-unified-audio-vision-mask-20260825.ko.md) | +| [#1402](https://github.com/lablup/mlxcel/pull/1402) | Align SmolVLM Split-Image Framing | 2026-08-25 | [en](1402-smolvlm-split-image-framing-20260825.en.md) | [ko](1402-smolvlm-split-image-framing-20260825.ko.md) | +| [#1401](https://github.com/lablup/mlxcel/pull/1401) | Audit shapeless MLX compile sites | 2026-08-25 | [en](1401-shapeless-compile-audit-20260825.en.md) | [ko](1401-shapeless-compile-audit-20260825.ko.md) | +| [#1400](https://github.com/lablup/mlxcel/pull/1400) | Apply KV Modes to Model-Owned Caches | 2026-08-25 | [en](1400-model-owned-kv-cache-modes-20260825.en.md) | [ko](1400-model-owned-kv-cache-modes-20260825.ko.md) | +| [#1398](https://github.com/lablup/mlxcel/pull/1398) | Apply Qwen3 RoPE Scaling End to End | 2026-08-24 | [en](1398-qwen3-rope-scaling-20260824.en.md) | [ko](1398-qwen3-rope-scaling-20260824.ko.md) | +| [#1397](https://github.com/lablup/mlxcel/pull/1397) | Derive Cross-Repository Reference Boundaries Live | 2026-08-24 | [en](1397-cross-repo-ref-boundaries-20260824.en.md) | [ko](1397-cross-repo-ref-boundaries-20260824.ko.md) | +| [#1396](https://github.com/lablup/mlxcel/pull/1396) | Raise the Development Test Thread Stack | 2026-08-24 | [en](1396-dev-test-stack-20260824.en.md) | [ko](1396-dev-test-stack-20260824.ko.md) | +| [#1395](https://github.com/lablup/mlxcel/pull/1395) | stop symmetric Turbo4 reading past its sign vectors on MLA latent caches | 2026-08-24 | [en](1395-mla-latent-turbo4-20260824.en.md) | [ko](1395-mla-latent-turbo4-20260824.ko.md) | +| [#1394](https://github.com/lablup/mlxcel/pull/1394) | Return None for Missing Template Map Keys | 2026-08-24 | [en](1394-dict-get-jinja-none-20260824.en.md) | [ko](1394-dict-get-jinja-none-20260824.ko.md) | +| [#1391](https://github.com/lablup/mlxcel/pull/1391) | filter on the untempered distribution and scale by temperature last | 2026-08-23 | [en](1391-untempered-filter-chain-20260823.en.md) | [ko](1391-untempered-filter-chain-20260823.ko.md) | +| [#1390](https://github.com/lablup/mlxcel/pull/1390) | stop the prompt cache donating and adopting KV-less shadow paged entries | 2026-08-23 | [en](1390-model-owned-prompt-cache-gate-20260823.en.md) | [ko](1390-model-owned-prompt-cache-gate-20260823.ko.md) | +| [#1389](https://github.com/lablup/mlxcel/pull/1389) | stop doubling RoPE positions under dynamic NTK scaling | 2026-08-23 | [en](1389-internlm-dynamic-ntk-rope-20260823.en.md) | [ko](1389-internlm-dynamic-ntk-rope-20260823.ko.md) | +| [#1386](https://github.com/lablup/mlxcel/pull/1386) | apply the linear rope_scaling factor on Gemma 3 global-attention layers | 2026-08-23 | [en](1386-gemma3-global-rope-scaling-20260823.en.md) | [ko](1386-gemma3-global-rope-scaling-20260823.ko.md) | +| [#1385](https://github.com/lablup/mlxcel/pull/1385) | apply llama3 rope_scaling on the shared Llama path | 2026-08-23 | [en](1385-llama3-rope-scaling-shared-path-20260823.en.md) | [ko](1385-llama3-rope-scaling-shared-path-20260823.ko.md) | +| [#1382](https://github.com/lablup/mlxcel/pull/1382) | make the chat-template `tojson` filter match Python `json.dumps` | 2026-08-23 | [en](1382-tojson-matches-python-json-dumps-20260823.en.md) | [ko](1382-tojson-matches-python-json-dumps-20260823.ko.md) | +| [#1381](https://github.com/lablup/mlxcel/pull/1381) | clear the OpenXLA warning backlog and deny all warnings in CI | 2026-08-22 | [en](1381-openxla-warning-backlog-20260822.en.md) | [ko](1381-openxla-warning-backlog-20260822.ko.md) | +| [#1373](https://github.com/lablup/mlxcel/pull/1373) | Hyperparameter-Free p-less Sampling | 2026-09-29 | [en](1373-p-less-sampling-20260929.en.md) | [ko](1373-p-less-sampling-20260929.ko.md) | +| [#1367](https://github.com/lablup/mlxcel/pull/1367) | Route vision-stripped VLM checkpoints to a text-only path | 2026-09-29 | [en](1367-text-only-vlm-checkpoints-20260929.en.md) | [ko](1367-text-only-vlm-checkpoints-20260929.ko.md) | +| [#1365](https://github.com/lablup/mlxcel/pull/1365) | Port Mage-VL 4B for image input | 2026-09-29 | [en](1365-mage-vl-port-20260929.en.md) | [ko](1365-mage-vl-port-20260929.ko.md) | +| [#1351](https://github.com/lablup/mlxcel/pull/1351) | feat(speculative): add the Laguna DFlash drafter | 2026-09-11 | [en](1351-laguna-dflash-drafter-20260911.en.md) | [ko](1351-laguna-dflash-drafter-20260911.ko.md) | +| [#1305](https://github.com/lablup/mlxcel/pull/1305) | link an OpenXLA binary in CI so link-only regressions cannot reach main | 2026-08-22 | [en](1305-openxla-link-gate-20260822.en.md) | [ko](1305-openxla-link-gate-20260822.ko.md) | +| [#1302](https://github.com/lablup/mlxcel/pull/1302) | Capacity buckets for the OpenXLA engine | 2026-08-22 | [en](1302-xla-capacity-buckets-20260822.en.md) | [ko](1302-xla-capacity-buckets-20260822.ko.md) | +| [#1301](https://github.com/lablup/mlxcel/pull/1301) | A total order for preemption victim selection | 2026-08-22 | [en](1301-eviction-victim-total-order-20260822.en.md) | [ko](1301-eviction-victim-total-order-20260822.ko.md) | +| [#1299](https://github.com/lablup/mlxcel/pull/1299) | A total order for the four LRU eviction victim selections | 2026-08-22 | [en](1299-lru-eviction-total-order-20260822.en.md) | [ko](1299-lru-eviction-total-order-20260822.ko.md) | +| [#1290](https://github.com/lablup/mlxcel/pull/1290) | Recording the HashMap iteration order class, and declining to gate it | 2026-08-22 | [en](1290-hashmap-order-guideline-20260822.en.md) | [ko](1290-hashmap-order-guideline-20260822.ko.md) | +| [#1288](https://github.com/lablup/mlxcel/pull/1288) | A total order for eviction candidate sorts | 2026-08-22 | [en](1288-eviction-sort-total-order-20260822.en.md) | [ko](1288-eviction-sort-total-order-20260822.ko.md) | +| [#1284](https://github.com/lablup/mlxcel/pull/1284) | A defined order for the distributed registry's node accessors | 2026-08-22 | [en](1284-registry-node-order-20260822.en.md) | [ko](1284-registry-node-order-20260822.ko.md) | +| [#1282](https://github.com/lablup/mlxcel/pull/1282) | Compile the OpenXLA feature combinations in CI | 2026-08-22 | [en](1282-xla-compile-ci-gate-20260822.en.md) | [ko](1282-xla-compile-ci-gate-20260822.ko.md) | +| [#1281](https://github.com/lablup/mlxcel/pull/1281) | An order-independent checkpoint layout verdict for RT-DETRv2 | 2026-08-22 | [en](1281-needs-sanitize-order-20260822.en.md) | [ko](1281-needs-sanitize-order-20260822.ko.md) | +| [#1280](https://github.com/lablup/mlxcel/pull/1280) | Image context floors for LLaVA and Qwen2-VL | 2026-08-22 | [en](1280-vision-family-context-floors-20260822.en.md) | [ko](1280-vision-family-context-floors-20260822.ko.md) | +| [#1278](https://github.com/lablup/mlxcel/pull/1278) | Pricing the qmv_wide narrow pin's collateral | 2026-08-22 | [en](1278-qmv-wide-pin-tax-measurement-20260822.en.md) | [ko](1278-qmv-wide-pin-tax-measurement-20260822.ko.md) | +| [#1275](https://github.com/lablup/mlxcel/pull/1275) | Link libc after the IREE archives | 2026-08-21 | [en](1275-iree-link-libc-ordering-20260821.en.md) | [ko](1275-iree-link-libc-ordering-20260821.ko.md) | +| [#1273](https://github.com/lablup/mlxcel/pull/1273) | Handle PromptCacheWarmup in the OpenXLA worker | 2026-08-21 | [en](1273-xla-worker-prompt-cache-warmup-20260821.en.md) | [ko](1273-xla-worker-prompt-cache-warmup-20260821.ko.md) | +| [#1269](https://github.com/lablup/mlxcel/pull/1269) | Deterministic language priority from a YAML bias block | 2026-08-22 | [en](1269-lang-bias-yaml-order-20260822.en.md) | [ko](1269-lang-bias-yaml-order-20260822.ko.md) | +| [#1268](https://github.com/lablup/mlxcel/pull/1268) | A supported read interface for the settled MTP verdict | 2026-08-21 | [en](1268-mtp-policy-endpoint-20260821.en.md) | [ko](1268-mtp-policy-endpoint-20260821.ko.md) | +| [#1266](https://github.com/lablup/mlxcel/pull/1266) | Deterministic seeding for synthetic model fixtures | 2026-08-21 | [en](1266-klear-parity-fixture-seeding-20260821.en.md) | [ko](1266-klear-parity-fixture-seeding-20260821.ko.md) | +| [#1254](https://github.com/lablup/mlxcel/pull/1254) | B=1 MTP gate on GPU generation | 2026-08-20 | [en](1254-mtp-b1-gate-gpu-generation-20260820.en.md) | [ko](1254-mtp-b1-gate-gpu-generation-20260820.ko.md) | +| [#1182](https://github.com/lablup/mlxcel/pull/1182) | feat(inference): support the qwen3_5_mtp drafter for Qwen 3.5 MTP speculative decoding | 2026-08-16 | [en](1182-qwen35-mtp-drafter-20260816.en.md) | [ko](1182-qwen35-mtp-drafter-20260816.ko.md) | +| [#1181](https://github.com/lablup/mlxcel/pull/1181) | docs: surface file-size and module-split thresholds in code-guidelines | 2026-08-16 | [en](1181-file-size-thresholds-docs-20260816.en.md) | [ko](1181-file-size-thresholds-docs-20260816.ko.md) | +| [#1180](https://github.com/lablup/mlxcel/pull/1180) | fix(test): gate the loading-side pinned Muse Glimmer guard on MLXCEL_REQUIRE_PINNED_CHECKPOINTS | 2026-08-16 | [en](1180-pinned-gate-shared-helper-20260816.en.md) | [ko](1180-pinned-gate-shared-helper-20260816.ko.md) | +| [#1175](https://github.com/lablup/mlxcel/pull/1175) | fix(server): fail requests a template refuses, map reasoning_effort | 2026-08-16 | [en](1175-template-rejection-400-20260816.en.md) | [ko](1175-template-rejection-400-20260816.ko.md) | +| [#1174](https://github.com/lablup/mlxcel/pull/1174) | feat(models): qualify Qwen3.8-27B on the qwen3_5 path | 2026-08-16 | [en](1174-qwen38-qualification-20260816.en.md) | [ko](1174-qwen38-qualification-20260816.ko.md) | +| [#1173](https://github.com/lablup/mlxcel/pull/1173) | fix(test): skip partial Muse Glimmer checkpoints instead of panicking | 2026-08-16 | [en](1173-pinned-checkpoint-skip-guard-20260816.en.md) | [ko](1173-pinned-checkpoint-skip-guard-20260816.ko.md) | +| [#1171](https://github.com/lablup/mlxcel/pull/1171) | docs: correct apc_consistent_prefix_len doc claim that matched_len is preserved | 2026-08-16 | [en](1171-apc-prefix-len-doc-20260816.en.md) | [ko](1171-apc-prefix-len-doc-20260816.ko.md) | +| [#1170](https://github.com/lablup/mlxcel/pull/1170) | fix(cli): reject a DFlash drafter before the offline standalone load | 2026-08-16 | [en](1170-dflash-drafter-cli-load-20260816.en.md) | [ko](1170-dflash-drafter-cli-load-20260816.ko.md) | +| [#1169](https://github.com/lablup/mlxcel/pull/1169) | test: acquire the env lock in backend seam tests for xla-backend builds | 2026-08-16 | [en](1169-backend-seam-env-lock-20260816.en.md) | [ko](1169-backend-seam-env-lock-20260816.ko.md) | +| [#1158](https://github.com/lablup/mlxcel/pull/1158) | test: derive prompt_cache_e2e slack from the paged block size | 2026-08-15 | [en](1158-prompt-cache-e2e-block-slack-20260815.en.md) | [ko](1158-prompt-cache-e2e-block-slack-20260815.ko.md) | +| [#1157](https://github.com/lablup/mlxcel/pull/1157) | test: skip pinned muse_glimmer checkpoint tests and fix MLXCEL_BACKEND race | 2026-08-15 | [en](1157-muse-glimmer-test-hygiene-20260815.en.md) | [ko](1157-muse-glimmer-test-hygiene-20260815.ko.md) | +| [#1154](https://github.com/lablup/mlxcel/pull/1154) | feat(server): warm the next turn's history prefix in the background | 2026-08-14 | [en](1154-background-warmup-snapshot-20260814.en.md) | [ko](1154-background-warmup-snapshot-20260814.ko.md) | +| [#1152](https://github.com/lablup/mlxcel/pull/1152) | feat(models): restore Gemma 4 snapshots at the longest common prefix | 2026-08-14 | [en](1152-gemma4-partial-snapshot-restore-20260814.en.md) | [ko](1152-gemma4-partial-snapshot-restore-20260814.ko.md) | +| [#1151](https://github.com/lablup/mlxcel/pull/1151) | feat(server): supersede session snapshot chains and expose the budget | 2026-08-14 | [en](1151-snapshot-supersede-configurable-budget-20260814.en.md) | [ko](1151-snapshot-supersede-configurable-budget-20260814.ko.md) | +| [#1150](https://github.com/lablup/mlxcel/pull/1150) | feat(server): donate a history-boundary snapshot during prefill | 2026-08-14 | [en](1150-history-boundary-snapshot-donation-20260814.en.md) | [ko](1150-history-boundary-snapshot-donation-20260814.ko.md) | +| [#1149](https://github.com/lablup/mlxcel/pull/1149) | feat(server): classify snapshot-divergence rejects in prompt-cache stats | 2026-08-14 | [en](1149-snapshot-divergence-reject-classification-20260814.en.md) | [ko](1149-snapshot-divergence-reject-classification-20260814.ko.md) | +| [#1136](https://github.com/lablup/mlxcel/pull/1136) | refactor(server): attach the SSE keepalive through one constructor | 2026-08-14 | [en](1136-shared-sse-response-constructor-20260814.en.md) | [ko](1136-shared-sse-response-constructor-20260814.ko.md) | +| [#1134](https://github.com/lablup/mlxcel/pull/1134) | fix(cli): name all three accepted forms in the "not a model" error | 2026-08-14 | [en](1134-not-a-model-error-forms-20260814.en.md) | [ko](1134-not-a-model-error-forms-20260814.ko.md) | +| [#1133](https://github.com/lablup/mlxcel/pull/1133) | refactor(server): consolidate the SSE keepalive interval and its guard | 2026-08-14 | [en](1133-sse-keepalive-constant-consolidation-20260814.en.md) | [ko](1133-sse-keepalive-constant-consolidation-20260814.ko.md) | +| [#1132](https://github.com/lablup/mlxcel/pull/1132) | feat(cli): add --revision to the -m/--model resolver | 2026-08-14 | [en](1132-model-revision-flag-20260814.en.md) | [ko](1132-model-revision-flag-20260814.ko.md) | +| [#1130](https://github.com/lablup/mlxcel/pull/1130) | fix(core): stop the paged budget test underflowing past the v2 reserve | 2026-08-14 | [en](1130-paged-budget-reserve-underflow-20260814.en.md) | [ko](1130-paged-budget-reserve-underflow-20260814.ko.md) | +| [#1129](https://github.com/lablup/mlxcel/pull/1129) | fix(cli): name the real --tp-size flag in the 2D-parallelism error | 2026-08-14 | [en](1129-tp-size-flag-name-in-2d-error-20260814.en.md) | [ko](1129-tp-size-flag-name-in-2d-error-20260814.ko.md) | +| [#1128](https://github.com/lablup/mlxcel/pull/1128) | fix(server): wire --dry-sequence-breaker through to the sampler | 2026-08-14 | [en](1128-wire-dry-sequence-breakers-20260814.en.md) | [ko](1128-wire-dry-sequence-breakers-20260814.ko.md) | +| [#1125](https://github.com/lablup/mlxcel/pull/1125) | fix(cli): make the drifted server flag spellings work on both binaries | 2026-08-14 | [en](1125-server-flag-spelling-parity-20260814.en.md) | [ko](1125-server-flag-spelling-parity-20260814.ko.md) | +| [#1124](https://github.com/lablup/mlxcel/pull/1124) | fix(server): thread dry_sequence_breakers through the greedy branch | 2026-08-14 | [en](1124-greedy-dry-sequence-breakers-20260814.en.md) | [ko](1124-greedy-dry-sequence-breakers-20260814.ko.md) | +| [#1122](https://github.com/lablup/mlxcel/pull/1122) | chore(docs): guard the docs-* targets and document the manual split | 2026-08-14 | [en](1122-docs-target-guard-20260814.en.md) | [ko](1122-docs-target-guard-20260814.ko.md) | +| [#1121](https://github.com/lablup/mlxcel/pull/1121) | docs(core): annotate the three tracked shared functions in utils.rs | 2026-08-14 | [en](1121-utils-used-by-annotations-20260814.en.md) | [ko](1121-utils-used-by-annotations-20260814.ko.md) | +| [#1120](https://github.com/lablup/mlxcel/pull/1120) | docs: fix stale cross-references left behind by earlier renames | 2026-08-14 | [en](1120-stale-cross-reference-fixes-20260814.en.md) | [ko](1120-stale-cross-reference-fixes-20260814.ko.md) | +| [#1119](https://github.com/lablup/mlxcel/pull/1119) | docs: add the six paged-decode v2 variables and correct the NATIVE row | 2026-08-14 | [en](1119-paged-decode-v2-env-vars-20260814.en.md) | [ko](1119-paged-decode-v2-env-vars-20260814.ko.md) | +| [#1118](https://github.com/lablup/mlxcel/pull/1118) | docs: explain CLI DRY runs without sequence breakers | 2026-08-14 | [en](1118-cli-dry-sequence-breakers-20260814.en.md) | [ko](1118-cli-dry-sequence-breakers-20260814.ko.md) | +| [#1116](https://github.com/lablup/mlxcel/pull/1116) | feat(models): support Muse Glimmer MLX 4-bit | 2026-08-12 | [en](1116-muse-glimmer-mlx-4bit-20260812.en.md) | [ko](1116-muse-glimmer-mlx-4bit-20260812.ko.md) | +| [#1101](https://github.com/lablup/mlxcel/pull/1101) | feat(models): add Meta Muse Glimmer VLM support | 2026-08-12 | [en](1101-muse-glimmer-vlm-support-20260812.en.md) | [ko](1101-muse-glimmer-vlm-support-20260812.ko.md) | +| [#1099](https://github.com/lablup/mlxcel/pull/1099) | fix(models): correct Molmo v1 image decoding seams | 2026-08-11 | [en](1099-molmo-v1-image-decoding-seams-20260811.en.md) | [ko](1099-molmo-v1-image-decoding-seams-20260811.ko.md) | +| [#1098](https://github.com/lablup/mlxcel/pull/1098) | Close single-stream worker gaps | 2026-08-10 | [en](1098-close-single-stream-worker-gaps-20260810.en.md) | [ko](1098-close-single-stream-worker-gaps-20260810.ko.md) | +| [#1097](https://github.com/lablup/mlxcel/pull/1097) | Document Florence-2 large-ft upstream tracker | 2026-08-10 | [en](1097-florence2-large-ft-upstream-tracker-20260810.en.md) | [ko](1097-florence2-large-ft-upstream-tracker-20260810.ko.md) | +| [#1096](https://github.com/lablup/mlxcel/pull/1096) | Deterministic Autotune Profiling Tests | 2026-08-10 | [en](1096-deterministic-autotune-profiling-20260810.en.md) | [ko](1096-deterministic-autotune-profiling-20260810.ko.md) | +| [#1095](https://github.com/lablup/mlxcel/pull/1095) | Remove Stale Debian Packaging | 2026-08-10 | [en](1095-remove-stale-debian-packaging-20260810.en.md) | [ko](1095-remove-stale-debian-packaging-20260810.ko.md) | +| [#1094](https://github.com/lablup/mlxcel/pull/1094) | Trim Gemma 4 Server Thought Marker | 2026-08-10 | [en](1094-trim-gemma4-server-thought-marker-20260810.en.md) | [ko](1094-trim-gemma4-server-thought-marker-20260810.ko.md) | +| [#1083](https://github.com/lablup/mlxcel/pull/1083) | feat(server): serve Florence-2 through a seq2seq worker loop | 2026-08-08 | [en](1083-florence2-seq2seq-server-20260808.en.md) | [ko](1083-florence2-seq2seq-server-20260808.ko.md) | +| [#1082](https://github.com/lablup/mlxcel/pull/1082) | feat(models): support quantized Florence-2 checkpoints (4-bit / 8-bit / 6-bit / 3-bit) | 2026-08-08 | [en](1082-quantized-florence2-checkpoints-20260808.en.md) | [ko](1082-quantized-florence2-checkpoints-20260808.ko.md) | +| [#1076](https://github.com/lablup/mlxcel/pull/1076) | feat(models): add Jina VLM (jvlm) vision-language support | 2026-08-07 | [en](1076-jina-vlm-20260807.en.md) | [ko](1076-jina-vlm-20260807.ko.md) | +| [#1075](https://github.com/lablup/mlxcel/pull/1075) | feat(models): add Falcon-OCR (falcon_ocr) early-fusion VLM support | 2026-08-07 | [en](1075-falcon-ocr-early-fusion-20260807.en.md) | [ko](1075-falcon-ocr-early-fusion-20260807.ko.md) | +| [#1070](https://github.com/lablup/mlxcel/pull/1070) | feat(models): add LocateAnything (locateanything) VLM support | 2026-08-07 | [en](1070-locateanything-vlm-20260807.en.md) | [ko](1070-locateanything-vlm-20260807.ko.md) | +| [#1062](https://github.com/lablup/mlxcel/pull/1062) | perf(models): make chunked GLA prefill the bailing_moe_linear default | 2026-08-07 | [en](1062-chunked-gla-prefill-default-20260807.en.md) | [ko](1062-chunked-gla-prefill-default-20260807.ko.md) | +| [#1061](https://github.com/lablup/mlxcel/pull/1061) | docs(moe): record that fused decode-MoE byte-identity is checkpoint-dependent | 2026-08-07 | [en](1061-fused-moe-parity-checkpoint-dependent-20260807.en.md) | [ko](1061-fused-moe-parity-checkpoint-dependent-20260807.ko.md) | +| [#1059](https://github.com/lablup/mlxcel/pull/1059) | fix(kernels): key every CUDA JIT launch on its input dtypes | 2026-08-07 | [en](1059-cuda-jit-dtype-key-sweep-20260807.en.md) | [ko](1059-cuda-jit-dtype-key-sweep-20260807.ko.md) | +| [#1058](https://github.com/lablup/mlxcel/pull/1058) | fix(paged): key the paged decode v2 JIT cache on input dtypes | 2026-08-07 | [en](1058-paged-v2-dtype-kernel-key-20260807.en.md) | [ko](1058-paged-v2-dtype-kernel-key-20260807.ko.md) | +| [#916](https://github.com/lablup/mlxcel/pull/916) | Molmo2 indexed attention pooling on OpenXLA | 2026-08-21 | [en](916-molmo2-indexed-attention-pooling-20260821.en.md) | [ko](916-molmo2-indexed-attention-pooling-20260821.ko.md) | diff --git a/docs/README.md b/docs/README.md index 0f1d881d6..9805b1b06 100644 --- a/docs/README.md +++ b/docs/README.md @@ -51,6 +51,10 @@ Current GitHub-facing docs: `adr/` holds numbered Architecture Decision Records, one significant decision per file, immutable once Accepted. See `adr/README.md` for the index. +## Technical reports + +`../TECHNICAL_REPORTS/` holds one technical report per merged change, in English and Korean, recording what the change did, how it was validated and what it left open. See `../TECHNICAL_REPORTS/README.md` for the index by PR number; it is generated by `make reports-index`. + ## The MkDocs manual The manual published at is not built from diff --git a/scripts/ci/gen_reports_index.py b/scripts/ci/gen_reports_index.py new file mode 100755 index 000000000..64d747f3b --- /dev/null +++ b/scripts/ci/gen_reports_index.py @@ -0,0 +1,209 @@ +#!/usr/bin/env python3 +# Copyright 2025-2026 Lablup Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Generate, or check, the index of ``TECHNICAL_REPORTS/``. + +Rationale +--------- +``TECHNICAL_REPORTS/`` holds one English and one Korean report per merged PR, +hundreds of them, and before issue #1708 it had no index and no inbound link, +so nobody could find a report or map a PR number to one. A hand-kept index +would drift on the next report, so the index is generated from the files and +CI fails when the committed copy differs from what this script would write. + +What the index holds +-------------------- +One row per report, keyed by its stem (the file name without ``.en.md`` or +``.ko.md``), newest number first: + +- the number: the leading digits of the stem (``1058-...`` or ``pr-2475-...``), + which is the PR the report covers in all but a handful of cases; +- the title: the report's first ``# `` heading, with the boilerplate + ``Technical Report:`` and ``PR #N -`` prefixes removed (English file first); +- the date: the ``YYYYMMDD`` suffix of the stem, else a ``Date`` or ``Updated`` + line in the report's header, else blank; +- links to the English and Korean files. A missing language shows as ``-``. + +Usage +----- + scripts/ci/gen_reports_index.py # rewrite TECHNICAL_REPORTS/README.md + scripts/ci/gen_reports_index.py --check # exit 1 if it is stale + +Regenerate after adding or renaming a report (``make reports-index``). +""" +from __future__ import annotations + +import argparse +import pathlib +import re +import sys + +ROOT = pathlib.Path(__file__).resolve().parents[2] +REPORTS_DIR = ROOT / "TECHNICAL_REPORTS" +INDEX_NAME = "README.md" +LANGS = ("en", "ko") +REPO_URL = "https://github.com/lablup/mlxcel" + +_REPORT_RE = re.compile(r"^(?P.+)\.(?Pen|ko)\.md$") +_NUMBER_RE = re.compile(r"^(?:pr-)?(?P\d+)-") +_STEM_DATE_RE = re.compile(r"-(?P20\d\d)(?P[01]\d)(?P[0-3]\d)$") +_HEADER_DATE_RE = re.compile( + r"^\*\*(?:Date|Updated)(?::\*\*|\*\*:)\s*(?P\d{4}-\d{2}-\d{2})" +) +_TITLE_PREFIX_RE = re.compile(r"^Technical [Rr]eport\s*:\s*") +_TITLE_REF_RE = re.compile( + r"^(?:(?:PR|Issue)\s+#\d+|PR\s+\(issue\s+#\d+\))\s*(?:[-:,–—]\s*)?" +) +_TITLE_SUFFIX_RE = re.compile( + r"\s*(?:\((?:PR |issue )?#\d+\)|[-:–—]\s*PR\s+#\d+)$" +) +HEADER_LINES = 20 + +PREAMBLE = """\ +# Technical reports + +This directory holds one technical report per merged change, each in English +(`.en.md`) and Korean (`.ko.md`). A report records what the change did, how it +was validated and what it left open. The number is the one in the file name, +which is the PR the report covers in nearly every case. + +This index is generated by `scripts/ci/gen_reports_index.py` from the file +names and each report's title and date lines. Do not edit it by hand: after +adding or renaming a report, run `make reports-index`. CI fails when this file +is stale. +""" + + +class Report: + def __init__(self, stem: str) -> None: + self.stem = stem + self.files: dict[str, str] = {} + self.title = "" + self.date = "" + + @property + def number(self) -> int | None: + match = _NUMBER_RE.match(self.stem) + return int(match.group("num")) if match else None + + +def clean_title(heading: str) -> str: + title = heading.strip() + title = _TITLE_PREFIX_RE.sub("", title) + title = _TITLE_REF_RE.sub("", title) + title = _TITLE_SUFFIX_RE.sub("", title) + # Keep the table a table: a raw pipe would split the cell. + title = title.replace("|", "\\|") + return title.replace("—", "-").strip() + + +def read_header(path: pathlib.Path) -> tuple[str, str]: + """Return (first H1 heading, header date) from the top of a report.""" + heading = "" + date = "" + with path.open(encoding="utf-8") as handle: + for index, line in enumerate(handle): + if index >= HEADER_LINES and heading: + break + if not heading and line.startswith("# "): + heading = line[2:].strip() + elif not date and index < HEADER_LINES: + match = _HEADER_DATE_RE.match(line.strip()) + if match: + date = match.group("date") + return heading, date + + +def collect(reports_dir: pathlib.Path) -> list[Report]: + reports: dict[str, Report] = {} + for path in sorted(reports_dir.iterdir()): + match = _REPORT_RE.match(path.name) + if not path.is_file() or not match: + continue + report = reports.setdefault(match.group("stem"), Report(match.group("stem"))) + report.files[match.group("lang")] = path.name + + for report in reports.values(): + stem_date = _STEM_DATE_RE.search(report.stem) + if stem_date: + report.date = "{y}-{m}-{d}".format(**stem_date.groupdict()) + for lang in LANGS: + if lang not in report.files: + continue + heading, date = read_header(reports_dir / report.files[lang]) + if not report.title and heading: + report.title = clean_title(heading) + if not report.date and date: + report.date = date + if not report.title: + report.title = report.stem + + return sorted( + reports.values(), + key=lambda r: (-(r.number if r.number is not None else -1), r.stem), + ) + + +def render(reports: list[Report]) -> str: + lines = [PREAMBLE, "## Index", ""] + lines.append(f"{len(reports)} reports.") + lines.append("") + lines.append("| # | Title | Date | English | Korean |") + lines.append("|---|-------|------|---------|--------|") + for report in reports: + number = ( + f"[#{report.number}]({REPO_URL}/pull/{report.number})" + if report.number is not None + else "-" + ) + links = [ + f"[{lang}]({report.files[lang]})" if lang in report.files else "-" + for lang in LANGS + ] + lines.append( + f"| {number} | {report.title} | {report.date or '-'} | {links[0]} | {links[1]} |" + ) + return "\n".join(lines) + "\n" + + +def main(argv: list[str] | None = None, reports_dir: pathlib.Path = REPORTS_DIR) -> int: + parser = argparse.ArgumentParser(description=__doc__.splitlines()[0]) + parser.add_argument( + "--check", + action="store_true", + help="exit 1 if the committed index differs from the generated one", + ) + args = parser.parse_args(argv) + + index_path = reports_dir / INDEX_NAME + expected = render(collect(reports_dir)) + if args.check: + current = index_path.read_text(encoding="utf-8") if index_path.exists() else "" + if current != expected: + print( + f"{index_path.relative_to(reports_dir.parent)} is stale; " + "run `make reports-index` and commit the result.", + file=sys.stderr, + ) + return 1 + print(f"{index_path.name} is up to date.") + return 0 + + index_path.write_text(expected, encoding="utf-8") + print(f"wrote {index_path}") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tests/test_gen_reports_index.py b/tests/test_gen_reports_index.py new file mode 100644 index 000000000..f0f928369 --- /dev/null +++ b/tests/test_gen_reports_index.py @@ -0,0 +1,152 @@ +# Copyright 2025-2026 Lablup Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for scripts/ci/gen_reports_index.py (issue #1708). + +The synthetic cases build a reports directory, generate the index, then make +the change a real report PR would make without regenerating, and assert +``--check`` rejects it. One case checks this repository's committed index, +which must be current and must link every report file on disk. + +Run with: + python3 -m unittest tests/test_gen_reports_index.py +""" + +import contextlib +import importlib.util +import io +import pathlib +import re +import tempfile +import unittest + +ROOT = pathlib.Path(__file__).resolve().parents[1] +SCRIPT = ROOT / "scripts" / "ci" / "gen_reports_index.py" + +_spec = importlib.util.spec_from_file_location("gen_reports_index", SCRIPT) +gen = importlib.util.module_from_spec(_spec) +_spec.loader.exec_module(gen) + + +def _run(reports_dir, *argv): + with contextlib.redirect_stdout(io.StringIO()), contextlib.redirect_stderr( + io.StringIO() + ): + return gen.main(list(argv), reports_dir=reports_dir) + + +class SyntheticReportsTest(unittest.TestCase): + def setUp(self): + self._tmp = tempfile.TemporaryDirectory() + self.dir = pathlib.Path(self._tmp.name) / "TECHNICAL_REPORTS" + self.dir.mkdir() + self.write("1058-paged-key-20260807.en.md", "# Technical Report: PR #1058 - Key the cache\n") + self.write("1058-paged-key-20260807.ko.md", "# 기술 보고서: PR #1058\n") + self.write( + "pr-2522-compaction.en.md", + "# PR #2522: Automatic compaction\n\n**Date**: 2026-10-21\n", + ) + self.write("pr-2522-compaction.ko.md", "# PR #2522: 자동 압축\n") + + def tearDown(self): + self._tmp.cleanup() + + def write(self, name, text): + (self.dir / name).write_text(text, encoding="utf-8") + + def rows(self): + text = (self.dir / gen.INDEX_NAME).read_text(encoding="utf-8") + return [line for line in text.splitlines() if line.startswith("| [")] + + def test_generated_index_passes_check(self): + self.assertEqual(_run(self.dir), 0) + self.assertEqual(_run(self.dir, "--check"), 0) + + def test_rows_are_newest_first_with_cleaned_titles_and_dates(self): + _run(self.dir) + rows = self.rows() + self.assertEqual(len(rows), 2) + self.assertIn("[#2522]", rows[0]) + self.assertIn("| Automatic compaction | 2026-10-21 |", rows[0]) + self.assertIn("| Key the cache | 2026-08-07 |", rows[1]) + self.assertIn("[ko](1058-paged-key-20260807.ko.md)", rows[1]) + + def test_missing_index_fails_check(self): + self.assertEqual(_run(self.dir, "--check"), 1) + + def test_new_report_without_regeneration_fails_check(self): + _run(self.dir) + self.write("2700-new-thing-20261030.en.md", "# PR #2700: New thing\n") + self.write("2700-new-thing-20261030.ko.md", "# PR #2700: 새 것\n") + self.assertEqual(_run(self.dir, "--check"), 1) + + def test_retitled_report_without_regeneration_fails_check(self): + _run(self.dir) + self.write("pr-2522-compaction.en.md", "# PR #2522: Renamed\n") + self.assertEqual(_run(self.dir, "--check"), 1) + + def test_hand_edited_index_fails_check(self): + _run(self.dir) + index = self.dir / gen.INDEX_NAME + index.write_text(index.read_text(encoding="utf-8") + "extra\n", encoding="utf-8") + self.assertEqual(_run(self.dir, "--check"), 1) + + def test_unpaired_report_is_listed_with_a_dash(self): + self.write("2701-english-only-20261030.en.md", "# PR #2701: English only\n") + _run(self.dir) + row = next(r for r in self.rows() if "[#2701]" in r) + self.assertTrue(row.endswith("| [en](2701-english-only-20261030.en.md) | - |")) + + def test_pipe_in_title_is_escaped(self): + self.write("2702-pipe-20261030.en.md", "# PR #2702: a | b\n") + _run(self.dir) + row = next(r for r in self.rows() if "[#2702]" in r) + self.assertIn("a \\| b", row) + + +class TitleCleanupTest(unittest.TestCase): + def test_known_heading_shapes(self): + cases = { + "Technical Report: PR #1058 - fix(paged): key": "fix(paged): key", + "Technical Report: PR #2682 — quantized vision": "quantized vision", + "Technical Report: PR (issue #1982), paged block reclaim": "paged block reclaim", + "Technical Report: Issue #1373 - p-less Sampling": "p-less Sampling", + "Technical Report: Port Mage-VL 4B (#1365)": "Port Mage-VL 4B", + "Model library WebUI — PR #1891": "Model library WebUI", + "PR #2516: repair breakages left by PR #2505": "repair breakages left by PR #2505", + } + for heading, expected in cases.items(): + with self.subTest(heading=heading): + self.assertEqual(gen.clean_title(heading), expected) + + +class RepositoryIndexTest(unittest.TestCase): + def test_committed_index_is_current(self): + self.assertEqual( + _run(gen.REPORTS_DIR, "--check"), + 0, + "TECHNICAL_REPORTS/README.md is stale; run `make reports-index` and commit it", + ) + + def test_every_report_file_is_linked(self): + text = (gen.REPORTS_DIR / gen.INDEX_NAME).read_text(encoding="utf-8") + linked = set(re.findall(r"\]\(([^)/]+\.(?:en|ko)\.md)\)", text)) + on_disk = { + p.name for p in gen.REPORTS_DIR.iterdir() if re.search(r"\.(en|ko)\.md$", p.name) + } + self.assertEqual(linked, on_disk) + + +if __name__ == "__main__": + unittest.main()