From 7c2adf7115eb38f4445a910414e91c59eb35221d Mon Sep 17 00:00:00 2001 From: tzhouam Date: Wed, 19 Aug 2026 03:44:56 +0000 Subject: [PATCH] Retain v20cb evaluation records --- .../arms/copilot_v20cb_train/manifest.json | 34 +++++ .../arms/copilot_v20cb_train/pr4804.cost.json | 94 ++++++++++++ .../arms/copilot_v20cb_train/pr4804.md | 81 +++++++++++ .../copilot_v20cb_train/pr4804.trace.json.gz | Bin 0 -> 63929 bytes .../arms/copilot_v20cb_train/pr4817.cost.json | 94 ++++++++++++ .../arms/copilot_v20cb_train/pr4817.md | 47 ++++++ .../copilot_v20cb_train/pr4817.trace.json.gz | Bin 0 -> 19765 bytes .../arms/copilot_v20cb_train/pr4859.cost.json | 94 ++++++++++++ .../arms/copilot_v20cb_train/pr4859.md | 69 +++++++++ .../copilot_v20cb_train/pr4859.trace.json.gz | Bin 0 -> 27155 bytes .../arms/copilot_v20cb_train/pr4870.cost.json | 94 ++++++++++++ .../arms/copilot_v20cb_train/pr4870.md | 60 ++++++++ .../copilot_v20cb_train/pr4870.trace.json.gz | Bin 0 -> 23207 bytes .../arms/copilot_v20cb_train/pr4923.cost.json | 94 ++++++++++++ .../arms/copilot_v20cb_train/pr4923.md | 59 ++++++++ .../copilot_v20cb_train/pr4923.trace.json.gz | Bin 0 -> 28373 bytes .../arms/copilot_v20cb_train/pr4926.cost.json | 94 ++++++++++++ .../arms/copilot_v20cb_train/pr4926.md | 135 ++++++++++++++++++ .../copilot_v20cb_train/pr4926.trace.json.gz | Bin 0 -> 34546 bytes .../arms/copilot_v20cb_train/pr4950.cost.json | 94 ++++++++++++ .../arms/copilot_v20cb_train/pr4950.md | 48 +++++++ .../copilot_v20cb_train/pr4950.trace.json.gz | Bin 0 -> 9445 bytes .../arms/copilot_v20cb_train/pr4970.cost.json | 94 ++++++++++++ .../arms/copilot_v20cb_train/pr4970.md | 32 +++++ .../copilot_v20cb_train/pr4970.trace.json.gz | Bin 0 -> 8714 bytes .../arms/copilot_v20cb_train/pr4977.cost.json | 94 ++++++++++++ .../arms/copilot_v20cb_train/pr4977.md | 117 +++++++++++++++ .../copilot_v20cb_train/pr4977.trace.json.gz | Bin 0 -> 18788 bytes .../arms/copilot_v20cb_train/pr5009.cost.json | 94 ++++++++++++ .../arms/copilot_v20cb_train/pr5009.md | 57 ++++++++ .../copilot_v20cb_train/pr5009.trace.json.gz | Bin 0 -> 23900 bytes .../arms/copilot_v20cb_val/manifest.json | 34 +++++ .../arms/copilot_v20cb_val/pr4810.cost.json | 94 ++++++++++++ eval/dataset/arms/copilot_v20cb_val/pr4810.md | 64 +++++++++ .../copilot_v20cb_val/pr4810.trace.json.gz | Bin 0 -> 25474 bytes .../arms/copilot_v20cb_val/pr4816.cost.json | 94 ++++++++++++ eval/dataset/arms/copilot_v20cb_val/pr4816.md | 49 +++++++ .../copilot_v20cb_val/pr4816.trace.json.gz | Bin 0 -> 15754 bytes .../arms/copilot_v20cb_val/pr4825.cost.json | 94 ++++++++++++ eval/dataset/arms/copilot_v20cb_val/pr4825.md | 55 +++++++ .../copilot_v20cb_val/pr4825.trace.json.gz | Bin 0 -> 18373 bytes .../arms/copilot_v20cb_val/pr4837.cost.json | 94 ++++++++++++ eval/dataset/arms/copilot_v20cb_val/pr4837.md | 57 ++++++++ .../copilot_v20cb_val/pr4837.trace.json.gz | Bin 0 -> 17402 bytes .../arms/copilot_v20cb_val/pr4893.cost.json | 94 ++++++++++++ eval/dataset/arms/copilot_v20cb_val/pr4893.md | 88 ++++++++++++ .../copilot_v20cb_val/pr4893.trace.json.gz | Bin 0 -> 26178 bytes .../goal_v20cb_train_sonnet/JUDGE_REPORT.md | 51 +++++++ .../goal_v20cb_train_sonnet/pr4804.r1.json | 37 +++++ .../goal_v20cb_train_sonnet/pr4804.r2.json | 37 +++++ .../goal_v20cb_train_sonnet/pr4804.r3.json | 35 +++++ .../goal_v20cb_train_sonnet/pr4817.r1.json | 37 +++++ .../goal_v20cb_train_sonnet/pr4817.r2.json | 37 +++++ .../goal_v20cb_train_sonnet/pr4817.r3.json | 37 +++++ .../goal_v20cb_train_sonnet/pr4859.r1.json | 37 +++++ .../goal_v20cb_train_sonnet/pr4859.r2.json | 37 +++++ .../goal_v20cb_train_sonnet/pr4859.r3.json | 37 +++++ .../goal_v20cb_train_sonnet/pr4870.r1.json | 37 +++++ .../goal_v20cb_train_sonnet/pr4870.r2.json | 37 +++++ .../goal_v20cb_train_sonnet/pr4870.r3.json | 37 +++++ .../goal_v20cb_train_sonnet/pr4923.r1.json | 37 +++++ .../goal_v20cb_train_sonnet/pr4923.r2.json | 37 +++++ .../goal_v20cb_train_sonnet/pr4923.r3.json | 37 +++++ .../goal_v20cb_train_sonnet/pr4926.r1.json | 35 +++++ .../goal_v20cb_train_sonnet/pr4926.r2.json | 35 +++++ .../goal_v20cb_train_sonnet/pr4926.r3.json | 37 +++++ .../goal_v20cb_train_sonnet/pr4950.r1.json | 37 +++++ .../goal_v20cb_train_sonnet/pr4950.r2.json | 37 +++++ .../goal_v20cb_train_sonnet/pr4950.r3.json | 37 +++++ .../goal_v20cb_train_sonnet/pr4970.r1.json | 37 +++++ .../goal_v20cb_train_sonnet/pr4970.r2.json | 37 +++++ .../goal_v20cb_train_sonnet/pr4970.r3.json | 35 +++++ .../goal_v20cb_train_sonnet/pr4977.r1.json | 35 +++++ .../goal_v20cb_train_sonnet/pr4977.r2.json | 37 +++++ .../goal_v20cb_train_sonnet/pr4977.r3.json | 35 +++++ .../goal_v20cb_train_sonnet/pr5009.r1.json | 37 +++++ .../goal_v20cb_train_sonnet/pr5009.r2.json | 35 +++++ .../goal_v20cb_train_sonnet/pr5009.r3.json | 37 +++++ .../goal_v20cb_val_sonnet/JUDGE_REPORT.md | 36 +++++ .../goal_v20cb_val_sonnet/pr4810.r1.json | 37 +++++ .../goal_v20cb_val_sonnet/pr4810.r2.json | 37 +++++ .../goal_v20cb_val_sonnet/pr4810.r3.json | 37 +++++ .../goal_v20cb_val_sonnet/pr4816.r1.json | 37 +++++ .../goal_v20cb_val_sonnet/pr4816.r2.json | 37 +++++ .../goal_v20cb_val_sonnet/pr4816.r3.json | 37 +++++ .../goal_v20cb_val_sonnet/pr4825.r1.json | 37 +++++ .../goal_v20cb_val_sonnet/pr4825.r2.json | 37 +++++ .../goal_v20cb_val_sonnet/pr4825.r3.json | 37 +++++ .../goal_v20cb_val_sonnet/pr4837.r1.json | 37 +++++ .../goal_v20cb_val_sonnet/pr4837.r2.json | 37 +++++ .../goal_v20cb_val_sonnet/pr4837.r3.json | 37 +++++ .../goal_v20cb_val_sonnet/pr4893.r1.json | 35 +++++ .../goal_v20cb_val_sonnet/pr4893.r2.json | 37 +++++ .../goal_v20cb_val_sonnet/pr4893.r3.json | 35 +++++ 94 files changed, 4230 insertions(+) create mode 100644 eval/dataset/arms/copilot_v20cb_train/manifest.json create mode 100644 eval/dataset/arms/copilot_v20cb_train/pr4804.cost.json create mode 100644 eval/dataset/arms/copilot_v20cb_train/pr4804.md create mode 100644 eval/dataset/arms/copilot_v20cb_train/pr4804.trace.json.gz create mode 100644 eval/dataset/arms/copilot_v20cb_train/pr4817.cost.json create mode 100644 eval/dataset/arms/copilot_v20cb_train/pr4817.md create mode 100644 eval/dataset/arms/copilot_v20cb_train/pr4817.trace.json.gz create mode 100644 eval/dataset/arms/copilot_v20cb_train/pr4859.cost.json create mode 100644 eval/dataset/arms/copilot_v20cb_train/pr4859.md create mode 100644 eval/dataset/arms/copilot_v20cb_train/pr4859.trace.json.gz create mode 100644 eval/dataset/arms/copilot_v20cb_train/pr4870.cost.json create mode 100644 eval/dataset/arms/copilot_v20cb_train/pr4870.md create mode 100644 eval/dataset/arms/copilot_v20cb_train/pr4870.trace.json.gz create mode 100644 eval/dataset/arms/copilot_v20cb_train/pr4923.cost.json create mode 100644 eval/dataset/arms/copilot_v20cb_train/pr4923.md create mode 100644 eval/dataset/arms/copilot_v20cb_train/pr4923.trace.json.gz create mode 100644 eval/dataset/arms/copilot_v20cb_train/pr4926.cost.json create mode 100644 eval/dataset/arms/copilot_v20cb_train/pr4926.md create mode 100644 eval/dataset/arms/copilot_v20cb_train/pr4926.trace.json.gz create mode 100644 eval/dataset/arms/copilot_v20cb_train/pr4950.cost.json create mode 100644 eval/dataset/arms/copilot_v20cb_train/pr4950.md create mode 100644 eval/dataset/arms/copilot_v20cb_train/pr4950.trace.json.gz create mode 100644 eval/dataset/arms/copilot_v20cb_train/pr4970.cost.json create mode 100644 eval/dataset/arms/copilot_v20cb_train/pr4970.md create mode 100644 eval/dataset/arms/copilot_v20cb_train/pr4970.trace.json.gz create mode 100644 eval/dataset/arms/copilot_v20cb_train/pr4977.cost.json create mode 100644 eval/dataset/arms/copilot_v20cb_train/pr4977.md create mode 100644 eval/dataset/arms/copilot_v20cb_train/pr4977.trace.json.gz create mode 100644 eval/dataset/arms/copilot_v20cb_train/pr5009.cost.json create mode 100644 eval/dataset/arms/copilot_v20cb_train/pr5009.md create mode 100644 eval/dataset/arms/copilot_v20cb_train/pr5009.trace.json.gz create mode 100644 eval/dataset/arms/copilot_v20cb_val/manifest.json create mode 100644 eval/dataset/arms/copilot_v20cb_val/pr4810.cost.json create mode 100644 eval/dataset/arms/copilot_v20cb_val/pr4810.md create mode 100644 eval/dataset/arms/copilot_v20cb_val/pr4810.trace.json.gz create mode 100644 eval/dataset/arms/copilot_v20cb_val/pr4816.cost.json create mode 100644 eval/dataset/arms/copilot_v20cb_val/pr4816.md create mode 100644 eval/dataset/arms/copilot_v20cb_val/pr4816.trace.json.gz create mode 100644 eval/dataset/arms/copilot_v20cb_val/pr4825.cost.json create mode 100644 eval/dataset/arms/copilot_v20cb_val/pr4825.md create mode 100644 eval/dataset/arms/copilot_v20cb_val/pr4825.trace.json.gz create mode 100644 eval/dataset/arms/copilot_v20cb_val/pr4837.cost.json create mode 100644 eval/dataset/arms/copilot_v20cb_val/pr4837.md create mode 100644 eval/dataset/arms/copilot_v20cb_val/pr4837.trace.json.gz create mode 100644 eval/dataset/arms/copilot_v20cb_val/pr4893.cost.json create mode 100644 eval/dataset/arms/copilot_v20cb_val/pr4893.md create mode 100644 eval/dataset/arms/copilot_v20cb_val/pr4893.trace.json.gz create mode 100644 eval/dataset/judgments/goal_v20cb_train_sonnet/JUDGE_REPORT.md create mode 100644 eval/dataset/judgments/goal_v20cb_train_sonnet/pr4804.r1.json create mode 100644 eval/dataset/judgments/goal_v20cb_train_sonnet/pr4804.r2.json create mode 100644 eval/dataset/judgments/goal_v20cb_train_sonnet/pr4804.r3.json create mode 100644 eval/dataset/judgments/goal_v20cb_train_sonnet/pr4817.r1.json create mode 100644 eval/dataset/judgments/goal_v20cb_train_sonnet/pr4817.r2.json create mode 100644 eval/dataset/judgments/goal_v20cb_train_sonnet/pr4817.r3.json create mode 100644 eval/dataset/judgments/goal_v20cb_train_sonnet/pr4859.r1.json create mode 100644 eval/dataset/judgments/goal_v20cb_train_sonnet/pr4859.r2.json create mode 100644 eval/dataset/judgments/goal_v20cb_train_sonnet/pr4859.r3.json create mode 100644 eval/dataset/judgments/goal_v20cb_train_sonnet/pr4870.r1.json create mode 100644 eval/dataset/judgments/goal_v20cb_train_sonnet/pr4870.r2.json create mode 100644 eval/dataset/judgments/goal_v20cb_train_sonnet/pr4870.r3.json create mode 100644 eval/dataset/judgments/goal_v20cb_train_sonnet/pr4923.r1.json create mode 100644 eval/dataset/judgments/goal_v20cb_train_sonnet/pr4923.r2.json create mode 100644 eval/dataset/judgments/goal_v20cb_train_sonnet/pr4923.r3.json create mode 100644 eval/dataset/judgments/goal_v20cb_train_sonnet/pr4926.r1.json create mode 100644 eval/dataset/judgments/goal_v20cb_train_sonnet/pr4926.r2.json create mode 100644 eval/dataset/judgments/goal_v20cb_train_sonnet/pr4926.r3.json create mode 100644 eval/dataset/judgments/goal_v20cb_train_sonnet/pr4950.r1.json create mode 100644 eval/dataset/judgments/goal_v20cb_train_sonnet/pr4950.r2.json create mode 100644 eval/dataset/judgments/goal_v20cb_train_sonnet/pr4950.r3.json create mode 100644 eval/dataset/judgments/goal_v20cb_train_sonnet/pr4970.r1.json create mode 100644 eval/dataset/judgments/goal_v20cb_train_sonnet/pr4970.r2.json create mode 100644 eval/dataset/judgments/goal_v20cb_train_sonnet/pr4970.r3.json create mode 100644 eval/dataset/judgments/goal_v20cb_train_sonnet/pr4977.r1.json create mode 100644 eval/dataset/judgments/goal_v20cb_train_sonnet/pr4977.r2.json create mode 100644 eval/dataset/judgments/goal_v20cb_train_sonnet/pr4977.r3.json create mode 100644 eval/dataset/judgments/goal_v20cb_train_sonnet/pr5009.r1.json create mode 100644 eval/dataset/judgments/goal_v20cb_train_sonnet/pr5009.r2.json create mode 100644 eval/dataset/judgments/goal_v20cb_train_sonnet/pr5009.r3.json create mode 100644 eval/dataset/judgments/goal_v20cb_val_sonnet/JUDGE_REPORT.md create mode 100644 eval/dataset/judgments/goal_v20cb_val_sonnet/pr4810.r1.json create mode 100644 eval/dataset/judgments/goal_v20cb_val_sonnet/pr4810.r2.json create mode 100644 eval/dataset/judgments/goal_v20cb_val_sonnet/pr4810.r3.json create mode 100644 eval/dataset/judgments/goal_v20cb_val_sonnet/pr4816.r1.json create mode 100644 eval/dataset/judgments/goal_v20cb_val_sonnet/pr4816.r2.json create mode 100644 eval/dataset/judgments/goal_v20cb_val_sonnet/pr4816.r3.json create mode 100644 eval/dataset/judgments/goal_v20cb_val_sonnet/pr4825.r1.json create mode 100644 eval/dataset/judgments/goal_v20cb_val_sonnet/pr4825.r2.json create mode 100644 eval/dataset/judgments/goal_v20cb_val_sonnet/pr4825.r3.json create mode 100644 eval/dataset/judgments/goal_v20cb_val_sonnet/pr4837.r1.json create mode 100644 eval/dataset/judgments/goal_v20cb_val_sonnet/pr4837.r2.json create mode 100644 eval/dataset/judgments/goal_v20cb_val_sonnet/pr4837.r3.json create mode 100644 eval/dataset/judgments/goal_v20cb_val_sonnet/pr4893.r1.json create mode 100644 eval/dataset/judgments/goal_v20cb_val_sonnet/pr4893.r2.json create mode 100644 eval/dataset/judgments/goal_v20cb_val_sonnet/pr4893.r3.json diff --git a/eval/dataset/arms/copilot_v20cb_train/manifest.json b/eval/dataset/arms/copilot_v20cb_train/manifest.json new file mode 100644 index 000000000..cbf76cf65 --- /dev/null +++ b/eval/dataset/arms/copilot_v20cb_train/manifest.json @@ -0,0 +1,34 @@ +{ + "arm": "copilot_v20cb_train", + "engine": "infermatrix-copilot CLI (shipped pipeline, pr-review@6 adaptive-depth ensemble; issue-answer dry-run)", + "llm": "per .env (DeepSeek-routed)", + "dataset": "vllm_omni_dataset.yaml", + "splits": [ + "train" + ], + "kinds": [ + "pr_review" + ], + "n_items": 10, + "trace": { + "AGENT_TRACE": "(default)", + "AGENT_TRACE_IO": "(default)", + "AGENT_TRACE_IO_FULL": "(default)" + }, + "moa_when": "off", + "pr_context_mode": "no_discussion", + "resolved": { + "moa_when": "off", + "moa_eligible_full_depth_pr": false, + "llm_mixture_members": [ + "mimo-v2.5", + "qwen3.6-plus" + ], + "strict_backend": "cursor", + "strict_backend_model": "composer-2.5", + "review_lens_backends": {}, + "agent_model": "deepseek-v4-pro[1m]", + "review_planner_model": "deepseek-v4-flash", + "review_promotion_model": "deepseek-v4-flash" + } +} \ No newline at end of file diff --git a/eval/dataset/arms/copilot_v20cb_train/pr4804.cost.json b/eval/dataset/arms/copilot_v20cb_train/pr4804.cost.json new file mode 100644 index 000000000..083e6cd7f --- /dev/null +++ b/eval/dataset/arms/copilot_v20cb_train/pr4804.cost.json @@ -0,0 +1,94 @@ +{ + "wall_s": 1003.1, + "split": "train", + "rc": 0, + "run_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_train/runs/pr4804/run-20260817-194336-a281f3", + "recorded_at": "2026-08-17T20:00:17", + "attempts": [ + { + "invocation_id": "inv-c3405671", + "outcome": "run:run-20260817-194336-a281f3", + "rc": 0, + "pre_run": null + }, + { + "run_dir": "run-20260817-194336-a281f3", + "llm_calls": 0, + "input_tokens": 0, + "output_tokens": 0, + "usd": 0.0, + "source": "no-trace" + } + ], + "attempt_usd_total": 0.0, + "llm_calls": 0, + "input_tokens": 0, + "output_tokens": 0, + "usd": 0.0, + "source": "no-trace", + "metrics": { + "schema": 1, + "run": "run-20260817-194336-a281f3", + "task_kind": "pr_review", + "status": "done", + "quality": { + "q": null, + "weight_coverage": 0.0, + "partial": true, + "abstained": false, + "components": { + "recall_w": null, + "precision_v": null, + "useful": null, + "calib": null, + "decision": null + } + }, + "cost": { + "usd": 0.5684, + "minutes": 16.69, + "ci_minutes": 0, + "input_tokens": 1690401, + "output_tokens": 101793, + "tool_calls": 466, + "usd_ref": 1.0, + "min_ref": 10.0, + "cost_index": 1.7052, + "cost_partial": false, + "unpriced_calls": 0, + "source": "events", + "llm_calls": null, + "by_role": null, + "cache_read_tokens": null, + "cache_creation_tokens": null + }, + "timings": { + "steps": { + "fetch": 4.39, + "gate": 1.64, + "review": 995.42, + "report": 0.06 + }, + "time_to_first_result_s": 1001.5 + }, + "risk": { + "incidents": { + "catastrophic": 0, + "severe": 0, + "moderate": 0, + "minor": 0 + }, + "safety_multiplier": 1.0 + }, + "catq": null, + "tus": null, + "signals": { + "escalations": 0, + "pushes": 0, + "posted": 0, + "steps_completed": 4 + } + }, + "trace": "pr4804.trace.json.gz", + "trace_bytes": 63929 +} \ No newline at end of file diff --git a/eval/dataset/arms/copilot_v20cb_train/pr4804.md b/eval/dataset/arms/copilot_v20cb_train/pr4804.md new file mode 100644 index 000000000..b75cdc955 --- /dev/null +++ b/eval/dataset/arms/copilot_v20cb_train/pr4804.md @@ -0,0 +1,81 @@ +# Run report + +- checkout: PR-TIME TREE (head 5d3e53170aae) — the tree matches the diff exactly; repo-wide greps DO reflect PR-time state + +## review_text + +**Scan:** +| Category | Result | +|---|---| +| Tests / verification | 4 finding(s) below | +| Security | no finding reported | +| Docs / comments | 2 finding(s) below | +| Behavior / compatibility | 1 finding(s) below | +| Correctness | 5 finding(s) below | + +**Validated:** +- [resolved] Abort slot leak — GPU generation runner now calls on_requests_finished; residual: NPU generation runner still missing same hook (npu_generation_model_runner.py:48-57 vs gpu_generation_model_runner.py:81-82). +- [resolved] talker2codec_raw put_req_chunk — emitted_any reads transfer_manager.put_req_chunk incremented by omni_connector_model_runner_mixin.py:1001-1002 on send. +- [resolved] Abort slot-leak concern addressed on CUDA generation runner; residual unchecked on NPU generation runner +- [resolved] NPU twin — npu_ar_model_runner already calls `on_requests_finished`; gpu_generation change mirrors pattern; NPU CI red unlikely introduced here +- [claim-verified] patch.py:1244-1251 — only caller of compute_seed_tts_wer_metrics; stereo env vars handled upstream in _pcm_s16le_to_seed_tts_wer_bytes +- [claim-refuted] PR body 'Fix some bugs: TODO' — incomplete; no enumerated bug-fix list at head. + +`vllm_omni/model_executor/models/moss_tts/modeling_moss_tts_codec.py:~478` [major] — In `_decode_streaming_batch`, when all `codec_stream_slots` are busy and a streaming request's payload carries `finished=True` before `session.acquire()` succeeds, the code warns and calls `_finish_stream_request(..., None)`, which pops `_stream_pending_codes` without decoding (lines 477-484, 561). That request is omitted from `outputs`, so `audios[i]` stays `_empty_audio()` (lines 243, 360-362) while `forward()` still returns `OmniOutput`. With `codec_stream_slots: 8` and stage-1 `max_num_seqs: 8` in moss_tts_local.yaml, this is reachable under full concurrent load when slots are held across forwards. Prefer admission control, blocking wait, or a client-visible error over silent audio loss. (evidence: modeling_moss_tts_codec.py:477-484 `if finished: logger.warning(...); self._finish_stream_request(request_id, session, None); continue` — finish while starved drops codes and skips outputs; modeling_moss_tts_codec.py:243 `audios: list[torch.Tensor] = [empty] * num_req` and modeling_moss_tts_codec.py:360-362 only overwrite `audios[i]` from `_decode_streaming_batch` outputs; modeling_moss_tts_codec.py:561 `self._stream_pending_codes.pop(request_id, None)` clears buffered codes without decode; moss_tts_local.yaml:21 `codec_stream_slots: 8` and moss_tts_local.yaml:42 `max_num_seqs: 8`.) + +```suggestion +if finished: + raise RuntimeError( + f"MOSS codec stream request {request_id} finished before a codec " + f"stream slot became available; refusing to drop buffered codes." + ) +``` + +`vllm_omni/platforms/npu/worker/npu_generation_model_runner.py:~48` [major] — This PR wires `on_requests_finished` into `gpu_generation_model_runner._update_request_states` so `MossTTSCodecDecoder` releases codec stream slots on abort/disconnect; `npu_generation_model_runner._update_request_states` still only removes batch entries and never calls the hook, so MOSS codec stream slots and pending code buffers leak on NPU when requests finish outside the terminal streaming payload. Mirror the GPU hook before removing finished requests. (evidence: Added by this PR: gpu_generation_model_runner.py:81-82 `if scheduler_output.finished_req_ids and hasattr(self.model, "on_requests_finished"): self.model.on_requests_finished(scheduler_output.finished_req_ids)`. Unchanged NPU gap at npu_generation_model_runner.py:48-51 `def _update_request_states(self, scheduler_output: SchedulerOutput): # remove requests for req_id in scheduler_output.finished_req_ids: self.input_batch.remove_request(req_id)` — no `on_requests_finished` call. Sibling AR runners already invoke the hook: gpu_ar_model_runner.py:942-943 and npu_ar_model_runner.py:419-420. Consumer needing cleanup: modeling_moss_tts_codec.py:564-571 `def on_requests_finished(...) ... to avoid leaking stream slots and buffered codes.`) + +Proposed change (not a ready patch): def _update_request_states(self, scheduler_output: SchedulerOutput): + if scheduler_output.finished_req_ids and hasattr(self.model, "on_requests_finished"): + self.model.on_requests_finished(scheduler_output.finished_req_ids) + for req_id in scheduler_output.finished_req_ids: + +`vllm_omni/benchmarks/patch/patch.py:1250` [major] — In `async_request_openai_audio_speech`, the `except` around `_pcm_s16le_to_seed_tts_wer_bytes` stores raw `pcm_capture` (48 kHz stereo for Local-v1.5) but still leaves `success=True`. `compute_seed_tts_wer_metrics` then treats those bytes as 24 kHz mono (`_pcm_s16le_to_f32_16k` default), producing plausible-but-wrong WER. Mark the sample failed instead of storing mislabeled PCM. (evidence: patch.py:1249-1251 `except Exception as ex: logger.warning(...); output.tts_output_pcm_bytes = bytes(pcm_capture)` — fallback stores raw streamed PCM; patch.py:1260 `output.success = True` — success set regardless of normalization failure; patch.py:117-119 documents MOSS-TTS-Local-Transformer-v1.5 streams 48 kHz stereo PCM; seed_tts_eval.py:598 `wav_16k = _pcm_s16le_to_f32_16k(pcm)` — consumer assumes default 24000 Hz mono (seed_tts_eval.py:176 `pcm_sample_rate: int = 24000`).) + +Proposed change (not a ready patch): except Exception as ex: + logger.error("Seed-TTS WER PCM normalization failed: %s", ex) + output.tts_output_pcm_bytes = None + output.success = False + output.error = f"pcm_normalization_failed: {ex}" + +`vllm_omni/platforms/npu/worker/npu_generation_model_runner.py:~783` [major] — PR makes MossTTSCodecDecoder.forward require seq_token_counts; GPU gpu_generation_model_runner._dummy_run supplies it (line 799) but NPU npu_generation_model_runner._dummy_run (780–783) still omits it while passing padded input_ids, so Moss codec warmup/profile on NPU raises RuntimeError. (evidence: modeling_moss_tts_codec.py:260-265 `token_counts = self._normalize_seq_token_counts(kwargs.get("seq_token_counts"))` then `raise RuntimeError("MossTTS codec requires seq_token_counts; otherwise concatenated codec tokens cannot be split per request.")`; gpu_generation_model_runner.py:799 `model_kwargs["seq_token_counts"] = [int(num_tokens_padded)]`; unchanged NPU sibling at npu_generation_model_runner.py:780-783 only sets runtime_additional_information with no seq_token_counts assignment.) + +Proposed change (not a ready patch): if hasattr(self.model, "get_dummy_runtime_additional_information"): + runtime_addi = self.model.get_dummy_runtime_additional_information(num_reqs) + model_kwargs["runtime_additional_information"] = runtime_addi + model_kwargs["seq_token_counts"] = [int(num_tokens_padded)] + +`vllm_omni/model_executor/models/moss_tts/modeling_moss_tts_talker.py:1462` [major] — Local talker preprocess does `max_new_frames = info_dict.get('max_new_frames', [-1])[0]` without scalar normalization; a bare int raises TypeError on prefill. MossTTSDelayTalkerForGeneration (lines 471-477) still normalizes list/tuple/int — mirror that here. In-repo serving wraps the value as a one-element list, so this is latent for those paths but a regression from the prior Local preprocess block. (evidence: modeling_moss_tts_talker.py:1462 `max_new_frames = info_dict.get("max_new_frames", [-1])[0]` — subscripts without scalar guard; int input raises TypeError. modeling_moss_tts_talker.py:471-477 (unchanged Delay talker preprocess) `max_new_frames_req = info_dict.get("max_new_frames")` then list/tuple unwrap and `int(...)` with TypeError fallback. serving_speech.py:1993-1994 `params["max_new_frames"] = [request.max_new_tokens]` — in-repo online path passes a list, not bare int.) + +Proposed change (not a ready patch): max_new_frames_req = info_dict.get("max_new_frames") + if isinstance(max_new_frames_req, (list, tuple)) and max_new_frames_req: + max_new_frames = max_new_frames_req[0] + else: + max_new_frames = max_new_frames_req if max_new_frames_req is not None else -1 + +`vllm_omni/model_executor/stage_input_processors/moss_tts.py:225` [minor] — moss_tts_local (and moss_tts_realtime) route Stage 0 through new talker2codec_raw_async_chunk with initial_codec_chunk_frames, codec_streaming meta, and a finish sentinel (code_flat_numel=0), but no tests reference this processor—only tts_local_seed renames in test_omni_gpu_model_runner.py. Add CPU core_model tests for first-chunk threshold, steady chunks, and finish-sentinel behavior. (evidence: pipeline.py:94 `async_chunk_process_next_stage_input_func=(f"{_PROC}.talker2codec_raw_async_chunk")` under MOSS_TTS_LOCAL_PIPELINE; moss_tts.py:225 `def talker2codec_raw_async_chunk(`; moss_tts.py:271-272 `initial_chunk_frames = int(cfg.get("initial_codec_chunk_frames") or 0)`; moss_tts.py:300-301 `code_flat_numel=0,` / `codec_streaming=True,`; repo grep: zero matches for talker2codec_raw_async_chunk or talker2codec under tests/; test_omni_gpu_model_runner.py:278 `extra_args={"tts_local_seed": 42},`) + +`vllm_omni/entrypoints/openai/serving_speech.py:3715` [minor] — This PR removes the qwen3_tts-only gate and writes tts_local_seed into stage-0 extra_args whenever request.seed is set. gpu_model_runner._talker_mtp_forward consumes tts_local_seed for every talker_mtp model (qwen3_tts, fish_speech, moss_tts_local, qwen3_omni), so HTTP seed now drives talker-local sampling for backends beyond the MOSS-local path without an explicit per-backend contract. Scope the write to consumers (e.g. qwen3_tts, moss_tts_local) or document the cross-backend contract. (evidence: serving_speech.py:3707 `if request.seed is not None and sampling_params_list:` — no _tts_model_type guard; serving_speech.py:3715 `stage0_params.extra_args["tts_local_seed"] = request.seed` — unconditional write. Unchanged consumer in PR-time tree: gpu_model_runner.py:1826 `seed = extra_args.get("tts_local_seed")` inside _talker_mtp_forward, which runs only when the model exposes talker_mtp (grep: qwen3_tts, fish_speech, moss_tts_local, qwen3_omni).) + +```suggestion +if self._tts_model_type in ("qwen3_tts", "moss_tts_local"): + if stage0_params.extra_args is None: + stage0_params.extra_args = {} + stage0_params.extra_args["tts_local_seed"] = request.seed +``` + +**Additional observations (beyond the comment budget):** +- `general` [minor] Abort slot-leak cleanup is wired on the CUDA generation runner (`gpu_generation_model_runner._update_request_states`); the NPU generation runner still lacks the matching `on_requests_finished` hook. +- `vllm_omni/model_executor/models/moss_tts/modeling_moss_tts_codec.py:729` [minor] `_build_codec` always instantiates vendored v2 via `MossAudioTokenizerV2Config.from_pretrained` with no checkpoint-version gate; legacy is only reached on exception. Both config classes share `model_type='moss-audio-tokenizer'` and strip legacy `model_type` from JSON, so config load can succeed for either layout and mismatch surfaces only in strict `load_weights`. Consider gating on architecture-discriminating fields (sampling_rate/downsample_rate/number_channels or weight key patterns), not `model_type` alone. +- `vllm_omni/model_executor/models/moss_tts/modeling_moss_tts_talker.py:1505` [minor] MOSS Local per-frame generation now runs in `talker_mtp` and mutates per-request `req_infos`; `_talker_mtp_forward` only forwards `req_infos` when `talker_mtp_accepts_req_infos` is true (production Moss Local sets it). Existing `CaptureTalkerMTP` tests omit both the flag and a `req_infos` parameter, so this runner↔talker contract is untested. +- `tests/model_executor/models/moss_tts/test_per_request_codes.py:71` [minor] `test_per_request_codes.py` guards MOSS-TTS per-request codec routing but has no `pytestmark`; Buildkite runs `tests/model_executor` with `-m 'core_model and cpu'`, so these tests are deselected. Add `pytestmark = [pytest.mark.core_model, pytest.mark.cpu]` (see `test_talker_logits_processor.py`). + +**Verdict:** FOLLOW-UP REQUIRED (post-merge) diff --git a/eval/dataset/arms/copilot_v20cb_train/pr4804.trace.json.gz b/eval/dataset/arms/copilot_v20cb_train/pr4804.trace.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..877e7369be4556ea0ad560b437303f2476b25514 GIT binary patch literal 63929 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%0A9YM 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¨W>R3WT}Z1_Yas5$8d7l^hqB4UJZYE5Ew(dX%P!!s?DU*$%M zhTl-ZFSWU+6^{~v>*JB8tVGh ztDo9GU(Hj1{`I-YXFrZEV?-skpS~&rKO?cq|W@oUHMobq^8QrLO!x#p~JahPn03T@MiA6L! zIP{WB>I^XfuP`!eY0hwqcmfIO-sSSOv95rKP2yFI1$8g^d}hgXrGlX;k&%%dLEB9Z zfX|1|ixoTZuD@8dG1h&S?=0FF(ZBpiyGT(;R{KUlH-T$^r*#P6+TVx&guxZg4iG~M z0xYaqq^QF)S)wUT`{(cf@xRo~qQO1Jyieb7Ls!2s16J1GM<4fzAWC5V?@_-ON+6>1H|_lLDAzjs|;u zzy;-)y-WSC|i%c(tXM)RF7}(yZSm|ruiW>O3T3qF)*`$;-h(vvj>6r-BG|;9Yxle!w zAdT*s^&38X%I4`C)E-D1OzPXkM=X~YZLvM5sc%zw%mmj%ta(FTN%87+DyCnhB4+63 zN2ytd_H8$en{c_Jrlr#`h7aj9JOvYdUQ$Aa6e>uO#T%=9nTt4%GE9_xgM%6m$6L-; z2t=}y*O<)qn4gx>gT~Ie<#4UNVi|IMA*5OL-@xM>fxYwSD$TD@-8b;>b&8wCh9{r( zZg(wQ`pIW!{dX<#i1~0%KKnOw=RX;%k{I(U_{5AkT;+5@`l4^NS7&N;WSb6FIbWNa%JGUIXsY8mrih8(G=i&q(hF3>v zgOO(=Pp{(g2Ns`!gan4`Mc*>$idmYHao#7jTK}lm>g|>aP^iebK)4aF=Txp2c(*~M zKHyxK@^k zWauo3ej&I z#U*nT?MH8wcy~3(DyaR-RCf9tx(1w*V+$LF*2XU>NGKg{C@q}gy`7bc3crcCuoZ^E zG6?>I?&$I_0dQvDr4BqLEIr^8J$xjQOP7io+<%zRJxtPT0CCJJe11!QK=1>w{~y!E zf|B~7lQq5OLwd$rJH5SD@2KKA8_uPc`9~D?GyPB9?)h*I^jq4+=tE~bi?0^LhG5-{ z5t>-5)DnCi^?@6svTkYhNo`GPD9EfV#=&_|P;(SfICUXQ4Q}`h%vM-xMFBX%3Y)OIR1rrs#X?!^PDJ&7k}Iq!GS4Ec*Tyam zWUK6O#To2xS4+ndnONk2WgmQuvNSiQ92N^(#J89vn4Qcd9y(bq*G6&7msoX4YRcxx zHCpG!qHI{K_DrrVlZ+4#@bEL(X z{b)Q((eD~SWEC4lRh)4|;fHC;P(dh^;I7=&MV>~fbB3B#rsS1oVZmEysd=XVtZ36bn}P2xchS~ zNtI9~H67W`NJlxws550;IQA?3v?%dqMiP&Wjqn9vxv^|&A~7ymGtcI2LO`lORwo>* ztU*YqiI3wmq}&1~@H85Ve-vnlJqrCkRRRGCa`{K3N$D8i@G_eSmWn;O9Z_b0bdW*T zt_9JGFnDIb_Cnz!L(PT157AEeI56!G*okt-M@@YZU_#DOf zDnpe%`<-mlduNlo(yaf#Q<RsRIeOceB;+WdA+_XOb*Dgz}X_2m?xN+;W`oi-@>}kG1Y2f z@xowaMuYi?Nx{IDK2nM+ErMm>mw|OQ0&?e3!^12H(uv3>#qt_0kM6%{LyMz!Rq7SH zevFUf+4N!HKfIX}{x66y#nbe;+}dxq%mr2kEv=RU#@)M{imF}&5^cuU?ay=rcTR+# z?iiyYM0A$Z8!4hmv)_866GZ5>?geD`LnTtkEoiH3pb~c?b7S)y1Aa|TyVzp6v#38j z#`4Xnhg*FNf7vA)QE5RrL52sG#w!Y@Dv!SLD6^%(dpR6WFSIx)uAEYM8k4MBv=t%j z{)i|&=u(ZR&(jjAWXR&4{7R0kJ!1HKRsOv&Y~aos;i#yV*LJ}Nb%KsrJrNP-U=&nD zpZJ4TnxPm%=eBfs4CqlxB5O&dvVmum5jtB#U0@5P{uk4{kF@#ON`$hhSbKqme?jok z+Ix?|8A+anGos~DE&TF&tjI5O*S6#GkXDJDHH1=IQ9*J1T2$f)=`MpJQ&>)tBA1xq zUgBDyuO@Q^Ll@=nbm<)#oZIxvV|8ROUMVY}tqnK)2iXjaL;)_c1GBL65`Xj(k*L00 z7?2Gq(vEOn^64@LmMfVY3o#CV`U3{vt<+B9ctJe`u3&63}Ohtr8C zlM+DDPP|Md@o2~S8;jb%tGNA`Hy4z^)vHlLxQ{wlsE)$XB&Wp`6wLwOc}-Cz+M36C z_RC~3i*Fe*Dy+B27U2<_!6-71b%S<`e91aNZr{*ow2a9E2#^dX<@~!w4NrA4B8(&c zajRb4#^7P=XuP&PM-Y;+oNNm(LY%*~sq5hJPQ4r;{_j3>!3A~lWF<6PjnEymqSLdc zwCj2%X@pr8`fvRH_Hl~4rZ+!86;iE-Q0ep}LV)(ZS3?K9NrouxC178E2f}*=-Hz#7WP^m03Vmju zX^$_6g^^2Mg^f!e`d|dim!??r7-HSrK76w(8v4N%*3k|;Nr z=`6dkd~;rttxy{dqrGPd1)_>8$;A{RATFSL9F6p(PPiJ3Gn1}Aas@K%c{EbqIGCVi zH0ngph5rkjF=sK*mCtAoP39LUKhuul^9){v?om{D@Sw8~dH`Z-&uiA1pkt682bC;g z;jnG7EI>>dEtlizVA$CVy@>#9FELjw?L1u-`hz0kT*I`K$0~}ivlOGt;*Xp$Nhub% z61u4$cpNt$#N7;4h`b#@bDcV*n(KrtKiuvyb%B?0K9m{J8X-lX<(#1{tJKw_qOJa3 zOKh|n23L#Sz%j;DU6-b7dkn$Omo57NxbYEiilvxisqx8fg}6*xb$B?_&T9-FaBoXKt(GzV&PIwN%Z$-k7^SH(&TIVGtVpk} zrqK3hElnG`d`oI9pTA167e8Bsx2@W+_e#_C!4=p4*m+(!k#3)2KlXPHwG2r}2!=OF zdU2^dX~n03O3y4zMvl=;c-2aZZu_Leopo@;AsqU=1GH(lSZ06CJ6%-w!l`$R?>p?0 z;EaIU<9OMVeWuf1dCPv$vM*X1K15HW>weS-Wbkc9Yoz>`Sscg}<^x`zb5cvX=NyTS zGaf~jlk$9pIfMb9ZU6AYYwXIUO(C=FWKOoDO7Lo=l72 z3~2snI-PeucU%3tQS^=^!c_|7ywJ8gL*)skkN}D#PH|hD5iWI^p08I#jN9Q`6KgSU ztoY73T>q7q-M7;n_t^=Z zXF$Acl?PgY#>XUCaPom{nO+c!MfMoFex9^r4ODu{&JX-%ob8pLcIfGOhcQmQcyhtE zeY0&p_$G_eG(+`)SS=lMvrgzt!&n;@jJA?WmwPpx0ONqM=By z=2I0gKoNq*_8l@~pq_m>22zkaku+LcGt>pKEu}|T#TcjA)$M{r3qtb=$O zy%wX3c=@;;uY4Uz<)IQ`+xoyd`2XMOInRP&5j)zbAenMucPpY zrMx})ka!x>W@y0X3H!rA%w9gWmpwlLMCf`kLlj5>} z!<}Gx*2MpEVvH2jpj$ww0_Fq&T>zBn(|LwIX}SGVJvBTL-`~9D%5`w+Y9<(eXw8XJ6*$!r9j9 zmR!d(lhpfab+kjdV=bpqQGSIbT&|?0ng)DE0Tz-aFt+-TeLSlVPp zc7xTx_yBvJ8XwleY|Fe@r&s?ZmmaEPXKlvQEOZRU88{nu7+#wS5z}LJGOe9;^Y%(B z6D`iHk=69)?u~-4mtb~hzt!81whsF6-<>)@D~6+H=j(JfVNerlfa0b#dn|E?6r-Rr zHyd*QYI$o1?QmtMf(6S}eW&#*li8Q?Zz_lcovr@rjNkx^E*%^e_(d!)3H;imQ7jju z%-4Vjq*SgTELmH6JcfeL(b|g zxe;HY7kLulicKXa;~g+C7@bIQ3QndA&u)$SNY1uV6tCE=Pl(d)K_EblBOWJCw2;=}#x!^CX#0cJ?2yHeWI0gKP5@LvcRieM)oR-*2fjwnI@z zk)qZlFSp7T!;jL(Lw&OtaIHuA-6Rv82juiGsozC1$2j(EDLp~{B)>2-!Bd?!kE4!e z+IycZ+8?7WoV~q>B$-*4x`DITA6(Vws&IKk`E-&!#I%E1Ut47XApLok;LW&9!73E%6PzgtVy=2fcZo zZlY*BrNWqJSAanpI97`jWKydf{eR?``gntOQQBj}0b9kDov6P`XE8!=crsZ#?@=G` za01Bp@^PN98cROp@p(Tv+S}Xfo$qxzNq2I1&^zDVpBy~$L)PYfoad|!$Vv9P^r+!K z3WCKg$_gtwkA>M-^v8_#B0AlcVNF^jE6TEs7S4FKx(znHOmkTHEmkHU%4A$ZVW{Gy z&zx6ZL>X;>DGDbtVk6C%BRj+@GCc&uu$)p@%auYnf?P48?}}O=y~7vC3i1B5{dB06$ zWlYc#x1C%qaP8}5(kkx%qxScrRp9cbk+j-!iZl1y%+czFR>6vsbLL!5&Epdu#T`MdU6s28%WG?@mc8aMLd;~S5iHLPfKA= z>S<8|ii$-G{jl);5Cp~=0O`xnMs6>N=;U6M=e%(mCI*y#zIqqRAo~rMpnW_BVinIm zf&lkW-a!o`*@mO(Zg=M(**!l5w&Cbt?{Iw7?IoamP4gZK*vv@pS1OJH` z#__lHVuF7T;p;n}i37dLuy)ESS@6(YKN#tZ%7v?==u=TWqh5ecsMScXH~{vhdJ45P+3I6lP`}ywY)jQs^OB-RvKBrpg4T=m7yu$h zvvlFxM_TB&;@N$bNB?${%y)QVby1@c#)Z6DCTMNUmfwMhLyGaysEG&}4Ny)_C`|K*SE~g)AhNcJ5ep{>uA()d-p)CFl}l+4B~oOlNuDc| zX$X1D10-{RH;gHmq)1^Sp%LSBQ&CU3yhu-df}frK0ck9D`rV?g+T&N-e2Pe7{1L6R zSLexuV*bW}JCX?PRe+YJSX9vPVdbo2*W}-u=A_grM&sIJ*GYT2CO38velO7?)u8wV zN}-Cd)J|6thTq(-F5y2^0I}m5_jq+fagtZ(!<&IGL@rP`6RuYwA?Su*l&3s}Qy`v`RcZ`nim?owiUQUYC^;~OdrGem+&QtE zhcO*`nh8cV5Jv19)>CWzzS%RW)GZ;-f`sO<^%N^(0mh(&8uSJ#5@U)L%Ho>ntZ@_P zV*Nm5$G~@B)X?;n^A5MWRU_ho7sWcalMFG&c(x`Ul~hiXinJaCpVq=QN~tLX4gakn zEc>o!%c!lZT}+BeIDKi5su-JJ7Zye(LmvnHIx}$*!@a%M z&LKRr-93C}O7sJ4Di~3p_J{m4gzL$AHWPu&6vx~&*06}RiwGBKS2ffwvwnbxM@NTG#p)DURE0CM_QRmtl_{ zvtWY_bUxq&&m4+`dV>LK<=tfsteph7ZG)B#EUkz5vtZY^YAn}}umZaXwl4M-Y*Mvj zU(eD_)HwwTj{-4KZQ-uv6@P%A8*+^&Y*~B)e48)g`EcfnR(F0qiYltuVx})|>0o7R zO1O|bCDk986-<#Y7W56JJ(2#Fn0}KlF)LFV1Iplal=NpYhM5)vws}Csn6g5EIB{b@ zGWF@aIm<;Ui>H5j^9zXrZ;Aicm^_)Ri&%DTIP~l|M-(CQ{~t%FWt~jKhSA~+QjRnq z(?zqZky@xR9J5l{GU5J(Y)ySwAAmWYNoh&4*A+-HXl-C-vSS-2X&MF_hB5M z9+ML1E6pq_YhvQpX2xTygiz7Vcd**e>SVul6ND7P5n5TbKEY#E=hC4s3ik&%)55hw zW7Vop*eKL)qbJ#;OT6bowU z>lx0{kBRnUvw3GahAy&vC3#C0>kY`UGQ~t+e?2VnteXtLz|^T5!<1J3)AFG@-#LIx z#Eb!SV9tSDi^^hjcUKgd`J?o*74Aht#9Atc5gtN;l}mHY%DeEV&ncQPSqrx!U>9@p z7Q$`0rWg^cP!r3?E9}dmnJcBcNVu(XFDq}es2phn4-!4A3oAYXCFg@3C48DWjXdrs z*wM)Jd!GMIaP;~m76q2{15d71acI%ZQNHWH4!Lrd(Ltgvn3j-NXAJbh%o?j}e~Q21 z*iPM2u`o>2Dou)jeX~q~k~3!|szlgX=l$HgH)D$o5u{ocDi=KuP*&W^n;WiDDElc)b0$;Mo2U9T`iY#8EbYy8ue0}6&TLd0 zGem5^`_n7985y#cGxtbuAsrjzkv=ARCp>Z9Q1D9>FB9n_Eha;x)LB`lf3heyr&r7NW>;6X2UKH^5|77Lp{Xj~+i(~Nm0a9JeQV&Ul7|@* zoz&oRm!wX>(=^D{QZ!`jg-2XpWj&_>~o;*QR0<}0$NI=O-??(YFu241ofp96JT zAz!=7hlEDm=W2M~DfAkq#O_a=>d#VUuMXZ#ql=|jEXwxH2@%KUpu|jMP?6 zUn9D^<;?}~g)r42OqK&7qW%9fh}mP2E6sUP>4PvA>M8c+*U@YRJQmM5HmO@TJ)SvN z$P04I$D7uHdI2zHLz}>F%DEbeu|!_`SFdi9C+8&89vVQPX%EWEvkE*|^^il4IBfsf z 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 10`; diff is a one-line predicate tighten plus rename +- [claim-refuted] PR test-plan CI coverage: test_quack_fp8_gate.py lacks pytestmark; .buildkite/test-ready.yml:29 deselects unmarked tests under `-m 'core_model and cpu'` +- [validated] vllm_omni/patch.py:414 — sole `install_quack_fp8_patch()` caller respects `quack_enabled()` at import time; sm_120 fix prevents patch installation + +`tests/quantization/test_quack_fp8_gate.py:18` [major] — This PR adds tests/quantization/test_quack_fp8_gate.py to regression-guard the _is_quack_capable()/quack_enabled() gate change (get_device_capability()[0] >= 10 → == 10), but the module has no pytestmark. Buildkite L1/L2 'Simple · Other Test' runs pytest -sv -m 'core_model and cpu' --ignore=tests/diffusion --ignore=tests/model_executor (.buildkite/test-ready.yml:29), which collects tests/quantization/ but deselects unmarked modules — these gate tests never execute in merge CI and the sm_120 regression can re-land silently. Add pytestmark = [pytest.mark.core_model, pytest.mark.cpu] (as in tests/diffusion/quantization/test_mxfp8_config.py:22, minus diffusion). (evidence: tests/quantization/test_quack_fp8_gate.py:18 `import pytest` — tests/quantization/test_quack_fp8_gate.py:19 `import torch` — tests/quantization/test_quack_fp8_gate.py:21 `from vllm_omni.quantization import quack_fp8` (no pytestmark in module); unchanged by this diff, present in PR-time tree: .buildkite/test-ready.yml:29 `- "timeout 20m pytest -sv -m 'core_model and cpu' --ignore=tests/diffusion --ignore=tests/model_executor --cov=vllm_omni --cov-report=term-missing:skip-covered --cov-report=xml"`; unchanged by this diff, present in PR-time tree: tests/diffusion/quantization/test_mxfp8_config.py:22 `pytestmark = [pytest.mark.core_model, pytest.mark.diffusion, pytest.mark.cpu]`) + +```suggestion +import pytest +import torch + +pytestmark = [pytest.mark.core_model, pytest.mark.cpu] + +from vllm_omni.quantization import quack_fp8 +``` + +`docs/user_guide/quantization/fp8.md:~33` [minor] — The diff rewrites the quack auto-enable paragraph (~lines 47–55) to datacenter Blackwell only (`sm_100`/`sm_101`/`sm_103`, cc `10.x`), matching the `== 10` gate, but the section intro at line 33 still opens with "On Blackwell (SM 100+)", implying quack install/benefit applies to all Blackwell including sm_120/sm_121 where quack is no longer auto-enabled. Narrow the intro to datacenter Blackwell (cc 10.x) so it matches the default-off behavior documented below. (evidence: unchanged by this diff, present in the PR-time tree: docs/user_guide/quantization/fp8.md:33 `On Blackwell (SM 100+), vLLM runs FP8 linears through the FlashInfer kernel, which`; docs/user_guide/quantization/fp8.md:47-48 `It is enabled automatically once installed (no flag needed) and is **datacenter Blackwell only** (`sm_100` / `sm_101` / `sm_103`, compute capability `10.x`, e.g.`; docs/user_guide/quantization/fp8.md:51-52 `workstation/consumer Blackwell (`sm_120` / `sm_121`, compute capability `12.x`, e.g. RTX PRO 6000 / RTX 50-series) `tcgen05` is absent — so quack is **not** auto-enabled`) + +```suggestion +On datacenter Blackwell (SM 100/101/103, compute capability 10.x), vLLM runs FP8 linears through the FlashInfer kernel, which +``` + +`general` [minor] — sm_120/121 serving protected: `_is_quack_capable()` requires cc major==10 (quack_fp8.py:32), so `quack_enabled()` is False by default and `install_quack_fp8_patch()` no-ops (quack_fp8.py:102-103; patch.py:414) — per-GEMM quack→FlashInfer wrapper never installed. Residual: `warmup_quack_fp8()` gates only on `_load_quack()` (quack_fp8.py:136), not serving; fp8.md updated for sm_120/121. (evidence: unchanged by this diff, present in PR-time tree: vllm_omni/quantization/quack_fp8.py:32 `return torch.cuda.get_device_capability()[0] == 10`; vllm_omni/quantization/quack_fp8.py:102-103 `if not quack_enabled(): return`; vllm_omni/patch.py:414 `install_quack_fp8_patch()`; vllm_omni/quantization/quack_fp8.py:117-124 per-GEMM `quack_scaled_fp8_mm` try/except fallback to `original(...)` only when patch installed) + +`quack_fp8.py:32` [minor] — '>= 10 matched cc 12.x' regression — quack_fp8.py:32 `== 10` fixes it; residual: future cc 11.x parts with tcgen05 would also be gated off by the `== 10` check (no sm_110a mention in this PR). (evidence: unchanged-by-this-diff, present at PR base: vllm_omni/quantization/quack_fp8.py:21 `return torch.cuda.get_device_capability()[0] >= 10`; PR head: vllm_omni/quantization/quack_fp8.py:32 `return torch.cuda.get_device_capability()[0] == 10`; tests/quantization/test_quack_fp8_gate.py:13 `Regression guard for the ``>= 10`` gate that matched cc ``12.x`` too.`; tests/quantization/test_quack_fp8_gate.py:37 `((12, 0), False), # sm_120 workstation Blackwell — the regression`) + +`quack_fp8.py:32` [minor] — Multi-GPU heterogeneity: `_is_quack_capable()` still calls `torch.cuda.get_device_capability()` without `device_id` (pre-existing at base `quack_fp8.py:22`; PR-time head `quack_fp8.py:32`). This PR only tightens the major-version gate (`== 10` vs `>= 10`); homogeneous-GPU assumption is unchanged. (evidence: unchanged by this diff in probe shape, present in PR-time tree: vllm_omni/quantization/quack_fp8.py:32 `return torch.cuda.get_device_capability()[0] == 10`; pre-existing at base quack_fp8.py:22 `return torch.cuda.get_device_capability()[0] >= 10`) + +**Verdict:** FOLLOW-UP REQUIRED (post-merge) diff --git a/eval/dataset/arms/copilot_v20cb_train/pr4817.trace.json.gz b/eval/dataset/arms/copilot_v20cb_train/pr4817.trace.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..fea365dc736e18478b6450288b9910547650d983 GIT binary patch literal 19765 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 Id}3z$57%gyrvLx| literal 0 HcmV?d00001 diff --git a/eval/dataset/arms/copilot_v20cb_train/pr4859.cost.json b/eval/dataset/arms/copilot_v20cb_train/pr4859.cost.json new file mode 100644 index 000000000..1ac932ec7 --- /dev/null +++ b/eval/dataset/arms/copilot_v20cb_train/pr4859.cost.json @@ -0,0 +1,94 @@ +{ + "wall_s": 1027.8, + "split": "train", + "rc": 0, + "run_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_train/runs/pr4859/run-20260817-195957-8a6842", + "recorded_at": "2026-08-17T20:17:04", + "attempts": [ + { + "invocation_id": "inv-c1d79ba2", + "outcome": "run:run-20260817-195957-8a6842", + "rc": 0, + "pre_run": null + }, + { + "run_dir": "run-20260817-195957-8a6842", + "llm_calls": 0, + "input_tokens": 0, + "output_tokens": 0, + "usd": 0.0, + "source": "no-trace" + } + ], + "attempt_usd_total": 0.0, + "llm_calls": 0, + "input_tokens": 0, + "output_tokens": 0, + "usd": 0.0, + "source": "no-trace", + "metrics": { + "schema": 1, + "run": "run-20260817-195957-8a6842", + "task_kind": "pr_review", + "status": "done", + "quality": { + "q": null, + "weight_coverage": 0.0, + "partial": true, + "abstained": false, + "components": { + "recall_w": null, + "precision_v": null, + "useful": null, + "calib": null, + "decision": null + } + }, + "cost": { + "usd": 0.4271, + "minutes": 17.12, + "ci_minutes": 0, + "input_tokens": 1044022, + "output_tokens": 132044, + "tool_calls": 438, + "usd_ref": 1.0, + "min_ref": 10.0, + "cost_index": 1.6547, + "cost_partial": false, + "unpriced_calls": 0, + "source": "events", + "llm_calls": null, + "by_role": null, + "cache_read_tokens": null, + "cache_creation_tokens": null + }, + "timings": { + "steps": { + "fetch": 4.51, + "gate": 2.48, + "review": 1020.02, + "report": 0.06 + }, + "time_to_first_result_s": 1027.07 + }, + "risk": { + "incidents": { + "catastrophic": 0, + "severe": 0, + "moderate": 0, + "minor": 0 + }, + "safety_multiplier": 1.0 + }, + "catq": null, + "tus": null, + "signals": { + "escalations": 0, + "pushes": 0, + "posted": 0, + "steps_completed": 4 + } + }, + "trace": "pr4859.trace.json.gz", + "trace_bytes": 27155 +} \ No newline at end of file diff --git a/eval/dataset/arms/copilot_v20cb_train/pr4859.md b/eval/dataset/arms/copilot_v20cb_train/pr4859.md new file mode 100644 index 000000000..f4421fecf --- /dev/null +++ b/eval/dataset/arms/copilot_v20cb_train/pr4859.md @@ -0,0 +1,69 @@ +# Run report + +- checkout: PR-TIME TREE (head 6ff4ce59ed87) — the tree matches the diff exactly; repo-wide greps DO reflect PR-time state + +## review_text + +**Scan:** +| Category | Result | +|---|---| +| Tests / verification | 6 finding(s) below | +| Security | no finding reported | +| Docs / comments | no finding reported | +| Behavior / compatibility | 3 finding(s) below | +| Correctness | 3 finding(s) below | + +**Validated:** +- [resolved] flash dialect omission already expected in test line 99 `{'风格':'calm'}`; residual: dense `language` field no longer mapped—undocumented in test +- [claim-verified] PR Ming MoE deploy + 44100 sample rate: constants.py SAMPLE_RATE=44100, test plan env matches model +- [claim-verified] PR test plan exports VLLM_OMNI_BENCH_AUDIO_SAMPLE_RATE=44100 for Ming MoE benchmark run +- [claim-refuted] PR 1.83% WER with VLLM_OMNI_BENCH_AUDIO_SAMPLE_RATE=44100 at HEAD: patch stores 24k pcm, eval uses env 44100 +- [claim-refuted] PR 1.83% WER with VLLM_OMNI_BENCH_AUDIO_SAMPLE_RATE=44100 — calc ratio 16000/44100÷(16000/24000)=0.544 mis-decodes 24 kHz normalized PCM +- [validated] patch.py:1215-1218 stores 24 kHz mono in tts_output_pcm_bytes before seed_tts_eval consumes it + +### 1. patch.py already normalizes `tts_output_pcm_bytes` to 24 kHz mono via `_pcm_s16le_to_seed_tts_wer_bytes` before WER consumes it (118-133, 1215-1218). + +`vllm_omni/benchmarks/data_modules/seed_tts_eval.py:~616` [major] + +WER eval at seed_tts_eval.py:616 calls `_pcm_s16le_to_f32_16k(pcm)` without rate/channels, so it reads `VLLM_OMNI_BENCH_AUDIO_SAMPLE_RATE`/`CHANNELS` from `stream_pcm_format_from_env()` (188-193). With `VLLM_OMNI_BENCH_AUDIO_SAMPLE_RATE=44100`, eval mis-decodes normalized 24 kHz bytes as 44100 Hz (~0.544× duration), corrupting ASR and invalidating reported WER. Pass explicit `pcm_sample_rate=24000, channels=1` at the call site. + +> unchanged by this diff, present in PR-time tree: patch.py:118 `"""Normalize streamed raw PCM to the 24 kHz mono PCM used by Seed-TTS WER."""`; patch.py:127-131 `if int(sample_rate) != 24000 and pcm_f32.size:` / `resampler = AudioResampler(target_sr=24000)`; patch.py:1215-1218 `output.tts_output_pcm_bytes = _pcm_s16le_to_seed_tts_wer_bytes(bytes(pcm_capture), sample_rate=sample_rate, channels=channels)`; seed_tts_eval.py:616 `wav_16k = _pcm_s16le_to_f32_16k(pcm)`; seed_tts_eval.py:188-193 `if pcm_sample_rate is None or channels is None:` / `env_sample_rate, env_channels = stream_pcm_format_from_env()` + +```suggestion +wav_16k = _pcm_s16le_to_f32_16k(pcm, pcm_sample_rate=24000, channels=1) +``` + +### 2. Clients following those examples silently lose dialect control; `test_ming_shared_modules.py` only asserts non-Auto `language` is ignored, not that dialect […] + +`vllm_omni/entrypoints/openai/serving_speech.py:2627` [major] + +This diff removes `include_language` and the `request.language` → `instruction_dict['方言']` mapping from `_parse_ming_instruction_fields` / `_parse_ming_instruction`, but `examples/online_serving/text_to_speech/ming_tts/README.md:101` still documents `language` as Ming dialect control and `openai_speech_client.py:103-104` maps `--dialect` to `payload['language']`. + +> vllm_omni/entrypoints/openai/serving_speech.py:2627 `instruction_dict: dict[str, Any] = {}` — no subsequent `request.language` → `方言` assignment in `_parse_ming_instruction_fields`; vllm_omni/entrypoints/openai/serving_speech.py:2649-2652 `return self._parse_ming_instruction_fields(request, include_voice=True, plain_text_passthrough=True,)` — `include_language` removed; unchanged by this diff, present in PR-time tree: examples/online_serving/text_to_speech/ming_tts/openai_speech_client.py:103-104 `if args.dialect:` / `payload["language"] = args.dialect`; unchanged by this diff, present in PR-time tree: examples/online_serving/text_to_speech/ming_tts/README.md:101 `| \`language\` | Ming \`方言\` control |` + +```suggestion +if request.language not in (None, "", "Auto"): + instruction_dict["方言"] = request.language +``` + +### 3. audio_vae.py:351 `encode_latent` now samples `mean + std * torch.randn_like(mean)` (fixes mean-only vs VAE/HF); + +`general` [minor] + +> unchanged by this diff, present in PR-time tree: audio_vae.py:139 `self.fc3 = nn.Linear(config.hidden_size, latent_dim * 2)`; main baseline audio_vae.py:349-350 `mean = torch.chunk(h, 2, dim=1)[0]` / `latent = mean.transpose(1, 2)`; PR head audio_vae.py:349-351 `mean, scale = torch.chunk(h, 2, dim=1)` / `std = F.softplus(scale) + 1e-4` / `latent = (mean + std * torch.randn_like(mean)).transpose(1, 2)`; prompt_encoder.py:137 `latents, _ = encoder.encode_latent(waveform, waveform_length)` + +### 4. This diff switches `encode_latent` to stochastic reparameterization (audio_vae.py:348-350), but no unit test asserts this path—`test_ming_shared_modules.py` […] + +`vllm_omni/model_executor/models/common/ming/audio_vae.py:351` [minor] + +Consider a CPU test with seeded `torch.randn_like` mock proving mean/scale chunking and softplus std match HF semantics, runnable in merge CI's `tests/model_executor -m 'core_model and cpu'` lane. + +> audio_vae.py:348-350 `mean, scale = torch.chunk(h, 2, dim=1)` / `std = F.softplus(scale) + 1e-4` / `latent = (mean + std * torch.randn_like(mean)).transpose(1, 2)` — stochastic latent sampling introduced by this diff; unchanged by this diff, present in PR-time tree: tests/model_executor/models/ming_tts/test_ming_shared_modules.py:30-35 `def test_ming_tts_audio_vae_uses_common_config():` / `cfg = AudioVAEConfig(sample_rate=16000, patch_size=-1)` / `assert cfg.sample_rate == 16000` / `assert cfg.patch_size == -1` — config-only smoke, no encode_latent call; grep `encode_latent` under tests/ → no matches + +**Additional observations (beyond the comment budget):** +- `general` [minor] Residual organization: bench-only `VLLM_OMNI_BENCH_AUDIO_SAMPLE_RATE` / `VLLM_OMNI_BENCH_AUDIO_CHANNELS` now live in `vllm_omni/metrics/definitions.py` (lines 287-288) beside Prometheus/bench metric stems, after unifying callers on `stream_pcm_format_from_env()`. +- `general` [minor] Flash dialect omission is already asserted at test_ming_shared_modules.py:99 (`assert flash_fields == {"风格": "calm"}` with `language="粤语"`). Residual gap: this PR drops dense `language`→`方言` mapping in serving_speech.py but dense tests only cover `language=None`/`Auto`, so the behavior change is undocumented. +- `vllm_omni/model_executor/models/ming_tts/patch_emission.py:130` [minor] This diff changes Ming stop-head gating from min_stop_step+1 to min_stop_step+2 in _validate_ming_decode_window (patch_emission.py:130) and _resolve_ming_stop_decision (patch_emission.py:151). With default STOP_HEAD_MIN_STEPS=3 (constants.py:51), min_required_decode_steps becomes 5 instead of 4 for every Ming-TTS audio decode request on the ming_tts_llm.py path; tighter max_decode_steps configs now fail validation, and stop-head cannot fire until (step+1)>=5 (patch_emission.py:159)—one step later than before. +- `vllm_omni/metrics/definitions.py:317` [minor] Bench `VLLM_OMNI_BENCH_AUDIO_*` env parsing moved from patch-local `_audio_pcm_format` into `metrics/definitions.py::stream_pcm_format_from_env` (317–337), next to runtime `resolve_audio_sample_rate`. Only bench callers use it today, but placing bench capture knobs in a module server code already imports for runtime audio metrics weakens the prior patch-local boundary; a `benchmarks/audio_format.py` helper would keep bench env overrides out of the shared metrics surface. + +**Verdict:** FOLLOW-UP REQUIRED (post-merge) diff --git a/eval/dataset/arms/copilot_v20cb_train/pr4859.trace.json.gz b/eval/dataset/arms/copilot_v20cb_train/pr4859.trace.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..6005e70ccb3270f9ff1773ba3ae48dc6a9be56f3 GIT binary patch literal 27155 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 literal 0 HcmV?d00001 diff --git a/eval/dataset/arms/copilot_v20cb_train/pr4870.cost.json b/eval/dataset/arms/copilot_v20cb_train/pr4870.cost.json new file mode 100644 index 000000000..7fd56a342 --- /dev/null +++ b/eval/dataset/arms/copilot_v20cb_train/pr4870.cost.json @@ -0,0 +1,94 @@ +{ + "wall_s": 619.8, + "split": "train", + "rc": 0, + "run_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_train/runs/pr4870/run-20260817-194336-3b412c", + "recorded_at": "2026-08-17T19:53:54", + "attempts": [ + { + "invocation_id": "inv-45ac559d", + "outcome": "run:run-20260817-194336-3b412c", + "rc": 0, + "pre_run": null + }, + { + "run_dir": "run-20260817-194336-3b412c", + "llm_calls": 0, + "input_tokens": 0, + "output_tokens": 0, + "usd": 0.0, + "source": "no-trace" + } + ], + "attempt_usd_total": 0.0, + "llm_calls": 0, + "input_tokens": 0, + "output_tokens": 0, + "usd": 0.0, + "source": "no-trace", + "metrics": { + "schema": 1, + "run": "run-20260817-194336-3b412c", + "task_kind": "pr_review", + "status": "done", + "quality": { + "q": null, + "weight_coverage": 0.0, + "partial": true, + "abstained": false, + "components": { + "recall_w": null, + "precision_v": null, + "useful": null, + "calib": null, + "decision": null + } + }, + "cost": { + "usd": 0.196, + "minutes": 10.29, + "ci_minutes": 0, + "input_tokens": 473039, + "output_tokens": 62100, + "tool_calls": 317, + "usd_ref": 1.0, + "min_ref": 10.0, + "cost_index": 1.409, + "cost_partial": false, + "unpriced_calls": 0, + "source": "events", + "llm_calls": null, + "by_role": null, + "cache_read_tokens": null, + "cache_creation_tokens": null + }, + "timings": { + "steps": { + "fetch": 4.07, + "gate": 1.58, + "review": 611.8, + "report": 0.13 + }, + "time_to_first_result_s": 617.5 + }, + "risk": { + "incidents": { + "catastrophic": 0, + "severe": 0, + "moderate": 0, + "minor": 0 + }, + "safety_multiplier": 1.0 + }, + "catq": null, + "tus": null, + "signals": { + "escalations": 0, + "pushes": 0, + "posted": 0, + "steps_completed": 4 + } + }, + "trace": "pr4870.trace.json.gz", + "trace_bytes": 23207 +} \ No newline at end of file diff --git a/eval/dataset/arms/copilot_v20cb_train/pr4870.md b/eval/dataset/arms/copilot_v20cb_train/pr4870.md new file mode 100644 index 000000000..44087f28b --- /dev/null +++ b/eval/dataset/arms/copilot_v20cb_train/pr4870.md @@ -0,0 +1,60 @@ +# Run report + +- checkout: PR-TIME TREE (head 231b3ddb97c1) — the tree matches the diff exactly; repo-wide greps DO reflect PR-time state + +## review_text + +**Scan:** +| Category | Result | +|---|---| +| Tests / verification | 3 finding(s) below | +| Security | no finding reported | +| Docs / comments | no finding reported | +| Behavior / compatibility | 1 finding(s) below | +| Correctness | 1 finding(s) below | + +**Validated:** +- [resolved] Non-qwen3 async_chunk=False streaming scoping — test_prepare_speech_generation_no_async_chunk_stream_keeps_delta_for_non_qwen3 at :3473; residual: moss_tts/higgs/indextts2 async_chunk=False paths not individually tested +- [claim-verified] PR E2E H20 table — not re-run here; issue #4851 non-streaming concurrent `no_async_chunk` aligns with worker fix primary path +- [claim-verified] Issue #4851 non-streaming failures addressed by worker split; serving hunk is streaming-only adjunct +- [claim-verified] PR body scoping claim — grep shows `coerce_param_message_types` only changed in serving_speech; serving_chat/realtime_connection/omni_base callers untouched +- [claim-verified] Issue #4851 failing cases live in test_qwen3_tts_*_expansion.py (full_model marker), not merge-gate core_model e2e +- [validated] vllm_omni/worker/gpu_ar_model_runner.py:1734 — mm split length now `int(scheduler_output.total_num_scheduled_tokens)`; matches `to_payload_element` contract in vllm_omni/utils/mm_outputs.py:131 when batched mm dim-0 equals scheduled tokens + +`vllm_omni/platforms/npu/worker/npu_ar_model_runner.py:~905` [minor] — GPU now splits multimodal payloads with mm_seq_len = int(scheduler_output.total_num_scheduled_tokens) (gpu_ar_model_runner.py:1734). NPU still uses seq_len = hidden_states.shape[0] at sample_tokens (:905) and passes it to to_payload_element at :1144, so tail-only Qwen3-TTS batches on Ascend can mis-slice codes.audio. Port the GPU mm_seq_len pattern inside needs_pooler_payload when that path matters. (evidence: unchanged by this diff, present in PR-time tree: vllm_omni/platforms/npu/worker/npu_ar_model_runner.py:905 `seq_len = hidden_states.shape[0]`; vllm_omni/platforms/npu/worker/npu_ar_model_runner.py:1144 `seq_len=seq_len,`; changed in this PR: vllm_omni/worker/gpu_ar_model_runner.py:1734 `mm_seq_len = int(scheduler_output.total_num_scheduled_tokens)`; vllm_omni/worker/gpu_ar_model_runner.py:1790 `seq_len=mm_seq_len,`; vllm_omni/utils/mm_outputs.py:131 `if seq_len is not None and isinstance(element, torch.Tensor) and element.shape[0] == seq_len:`; vllm_omni/model_executor/models/qwen3_tts/qwen3_tts_talker.py:311 `self.requires_full_prefix_cached_hidden_states = False`) + +Proposed change (not a ready patch): mm_seq_len = int(scheduler_output.total_num_scheduled_tokens) + # ... later in pooler loop ... + mm_payload[mm_key] = to_payload_element( + element=mm_val, + idx=idx, + start=start, + end=end, + pass_lists_through=False, + seq_len=mm_seq_len, + ) + +`vllm_omni/entrypoints/openai/serving_speech.py:3507` [minor] — Qwen3 full-payload streaming is gated at serving_speech.py:3507 with getattr(self.model_config, "async_chunk", True), but OmniModelConfig.async_chunk defaults to False (model.py:121), the audio path in the same file uses getattr(..., False) at 3823, and workers default to False. If async_chunk is absent, the True fallback leaves DELTA coercion enabled instead of FINAL_ONLY. Align the fallback to False. (evidence: unchanged by this diff, present in PR-time tree: vllm_omni/config/model.py:121 `async_chunk: bool = False`; vllm_omni/entrypoints/openai/serving_speech.py:3507 `async_chunk = getattr(self.model_config, "async_chunk", True)`; vllm_omni/entrypoints/openai/serving_speech.py:3508 `qwen3_full_payload = self._tts_model_type == "qwen3_tts" and not bool(async_chunk)`; vllm_omni/entrypoints/openai/serving_speech.py:3823 `async_chunk = bool(getattr(self.engine_client.model_config, "async_chunk", False))`; vllm_omni/worker/gpu_ar_model_runner.py:293 `self._async_chunk = getattr(self.model_config, "async_chunk", False)`) + +```suggestion +async_chunk = getattr(self.model_config, "async_chunk", False) +``` + +`serving_speech.py:3508` [minor] — Broad `async_chunk=False` FINAL_ONLY gate narrowed to qwen3_tts only (serving_speech.py:3508); residual checked: other async_chunk=False TTS families still use DELTA via voxtral fixture. (evidence: [resolved] Broad `async_chunk=False` FINAL_ONLY gate narrowed to qwen3_tts only (serving_speech.py:3508); residual checked: other async_chunk=False TTS families still use DELTA via voxtral fixture.) + +`general` [minor] — Non-qwen3 async_chunk=False streaming scoping is covered only by voxtral at test_serving_speech.py:3473; moss_tts_nano, higgs_audio_v2, and indextts2 deploy with async_chunk=false but have no dedicated delta-coercion tests. (evidence: tests/entrypoints/openai_api/test_serving_speech.py:3473 `def test_prepare_speech_generation_no_async_chunk_stream_keeps_delta_for_non_qwen3(` — sole non-qwen3 proxy uses `voxtral_server`; unchanged by this diff, present in PR-time tree: serving_speech.py:3508 `qwen3_full_payload = self._tts_model_type == "qwen3_tts" and not bool(async_chunk)`; unchanged by this diff, present in PR-time tree: vllm_omni/deploy/moss_tts_nano.yaml:14 `async_chunk: false`, vllm_omni/deploy/higgs_audio_v2.yaml:14 `async_chunk: false`, vllm_omni/deploy/indextts2.yaml:1 `async_chunk: false` — no matching per-model tests in test_serving_speech.py) + +`tests/e2e/online_serving/test_qwen3_tts_customvoice.py:~49` [minor] — Merge-gate E2E (`test-ready.yml:333`) runs `test_qwen3_tts_customvoice.py`, which only parametrizes `async_chunk` (line 49). The `--no-async-chunk` path lives in `test_qwen3_tts_customvoice_expansion.py` (`full_model`, lines 52–57). This PR fixes no-async-chunk streaming via unit tests only; merge-gate will not catch a `no_async_chunk` serving regression — add a `pytest.param` with `--no-async-chunk` to the core_model file or wire expansion into an appropriate CI lane. (evidence: unchanged by this diff, present in PR-time tree: tests/e2e/online_serving/test_qwen3_tts_customvoice.py:49 `id="async_chunk",`; tests/e2e/online_serving/test_qwen3_tts_customvoice_expansion.py:55 `server_args=["--trust-remote-code", "--no-async-chunk"],` and :57 `id="no_async_chunk",`; .buildkite/test-ready.yml:333 `pytest -s -v tests/e2e/online_serving/test_qwen3_tts_customvoice.py -m 'core_model' --run-level 'core_model'`) + +```suggestion +pytest.param( + OmniServerParams( + model=MODEL, + stage_config_path=_STAGE_CONFIG, + server_args=["--trust-remote-code", "--no-async-chunk"], + ), + id="no_async_chunk", + ), +``` + +**Verdict:** COMMENT diff --git a/eval/dataset/arms/copilot_v20cb_train/pr4870.trace.json.gz b/eval/dataset/arms/copilot_v20cb_train/pr4870.trace.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..c4e8d6d2bd3486688ceae8b71c3a23c9b94ab42e GIT binary patch literal 23207 zcmV(=K-s?^iwFP!00002|Lwioa@$CjDEccHxnqm8MG_a@HJaTnm8;6p<;%#fo|v!{ zAP9gG+9bdNNXhCd@0h3kd}5#dwja*h`LOrwcHEDXU^?|ZWj223MqUtJ<8whc4MP7&xoRiDU;V_s{wqU*e;;b5 z+3xgdcNTse(s-8M>*$};Yxd$M_LG}viocniE&*k6W6zv94fTf~-n@E&?`(G_eQ)fV z?Y7r-+8uiPAO7Rb#h>22eSS`Nm=n|K4Sd6Qy6twmXW|{LpAtV#T7UTI-HQvn$LMuo zW5?!X(DB9ty-oMrL^D6TWujX~+imwv&m8yK?d}myHg@4B-Uv5}J>RpP1-%o{rJ?s5 zM(@2b7J)(}%~Lo@aWvAZ1pT zVQe?4$_e>q+t*Fs=on+YH!)!<-M;H|OxO@zALwJ<>05)b-|l+4Z*==(cdQRQ#~)1m zLA&j{dSODQVQx1eK<7Ac6Pi+fM%Kjg2Ls>qjK1FOcOB0MgqV0RN*iD^=(?uYx8U_S zY;Q8|jt#>%_5Q>){ee5^ck(mp_Iu`*Fq+5FHQ;mEoW_$*-R=Nqg&R%o%Fkw z@0xng&~?*w+-}dBm;ADb&33Qd_nm&bQ-o5_+H%`~Kb1_!_buNU0Ft*m zdav6yCb~a1dgj1z+r2*QncMAJx-l^QzVG_|$;9xxhChJ$S&pf<^?qSG0JP3_^O5Y= zcCLXvH<>ruUND)I%yKXpw{@%I7!yPHJfKF)xB70c-!*-G-0cFo_2KWaXZeQF?RMNY zpxn4SY3pXEKWKYaVIv2fEeY`Ar`Ptyi??qs-Zy7neoBBtzOKXW=pJwiZ_+V4gMqGh zJzysjbJFe^U0-jzo}~k;>H{C@=;O|~Yq|z3qCfBpfYYtsmUH^{<@4`fzj^om<@vjn zNqGZ=K&Pj-fdO{fz~#DwZo3N%(Hcy;x?_5dK87ExZVvzjv@y0i6WtqhdVLRYA4u?u zMBFqWww8(lka9B?Vkn4+6(;VDKSMEM(C@J?B$y(2y}-E+L6`w?;=@n0cOWb^+owT0P*5HK9&;ln4~X!eI13qxL?Rd zxcD6lv1635>Q@rK$0&Y3ZqnUPg<}N))TSVHwoVoMmQ1ip(%!gO|+I;FPV33&>gg1U1ESwM?g_&x%&Xi^g zL;IRLb%L4iY0h*S-A#jJ!PC8kCnkYQOW-Nb5d{}BC;kYtPyDIx;%_+bw-*{OLQ|ij zRe*W}m+?UjR0M#}U9h-`mJ2N#O><&jOW?I1&@iL%y@tR0aRVL&;SZP2U!H1! zPwq$fOH1dVxzTJ!3rjTLac?xo1Cg7(^*9j&B~7t7i4_eexes0b6J|AEF2r^;+$cl= zw!rmW&?Vf|^g+#w+@uA{jL-WsgW2OuXguu=-ofL+n_=n!K>V)+l_A6Eo?s7yz}#pz zPqb*hXawO&x@{-4SD;T#QNiMU0{prLQiF9}&zH6n+lcm48%QbiJ06ddu_Y z)99Wdzp`{(K_i#}TZJ`G0K9-6xa?bA3NHLVZv0SeEv_D)Ae0Qk3=$`DL6hKm2|JmN zmB62%WyczTWgIPTXkM>Aev5-7!Gclo`(W|Ia;(kyC8rElz=7a8Y)yP;0VB4wY*GM> zdu^HE*v?(^8gOYjhOaU17D@*|1kD*I(R2yp|8(&quKF^pftZ~|a0QW1dxs?ZZV|

k&@h_WM34-st=P!SJ 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 Gh4~+W!ly3) literal 0 HcmV?d00001 diff --git a/eval/dataset/arms/copilot_v20cb_train/pr4923.cost.json b/eval/dataset/arms/copilot_v20cb_train/pr4923.cost.json new file mode 100644 index 000000000..446a779de --- /dev/null +++ b/eval/dataset/arms/copilot_v20cb_train/pr4923.cost.json @@ -0,0 +1,94 @@ +{ + "wall_s": 1064.8, + "split": "train", + "rc": 0, + "run_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_train/runs/pr4923/run-20260817-194335-f20184", + "recorded_at": "2026-08-17T20:01:19", + "attempts": [ + { + "invocation_id": "inv-953210a5", + "outcome": "run:run-20260817-194335-f20184", + "rc": 0, + "pre_run": null + }, + { + "run_dir": "run-20260817-194335-f20184", + "llm_calls": 0, + "input_tokens": 0, + "output_tokens": 0, + "usd": 0.0, + "source": "no-trace" + } + ], + "attempt_usd_total": 0.0, + "llm_calls": 0, + "input_tokens": 0, + "output_tokens": 0, + "usd": 0.0, + "source": "no-trace", + "metrics": { + "schema": 1, + "run": "run-20260817-194335-f20184", + "task_kind": "pr_review", + "status": "done", + "quality": { + "q": null, + "weight_coverage": 0.0, + "partial": true, + "abstained": false, + "components": { + "recall_w": null, + "precision_v": null, + "useful": null, + "calib": null, + "decision": null + } + }, + "cost": { + "usd": 0.333, + "minutes": 17.74, + "ci_minutes": 0, + "input_tokens": 777569, + "output_tokens": 111852, + "tool_calls": 442, + "usd_ref": 1.0, + "min_ref": 10.0, + "cost_index": 1.6232, + "cost_partial": false, + "unpriced_calls": 0, + "source": "events", + "llm_calls": null, + "by_role": null, + "cache_read_tokens": null, + "cache_creation_tokens": null + }, + "timings": { + "steps": { + "fetch": 4.04, + "gate": 1.77, + "review": 1058.3, + "report": 0.07 + }, + "time_to_first_result_s": 1064.15 + }, + "risk": { + "incidents": { + "catastrophic": 0, + "severe": 0, + "moderate": 0, + "minor": 0 + }, + "safety_multiplier": 1.0 + }, + "catq": null, + "tus": null, + "signals": { + "escalations": 0, + "pushes": 0, + "posted": 0, + "steps_completed": 4 + } + }, + "trace": "pr4923.trace.json.gz", + "trace_bytes": 28373 +} \ No newline at end of file diff --git a/eval/dataset/arms/copilot_v20cb_train/pr4923.md b/eval/dataset/arms/copilot_v20cb_train/pr4923.md new file mode 100644 index 000000000..d356531e5 --- /dev/null +++ b/eval/dataset/arms/copilot_v20cb_train/pr4923.md @@ -0,0 +1,59 @@ +# Run report + +- checkout: PR-TIME TREE (head 3b2d87c9c3bc) — the tree matches the diff exactly; repo-wide greps DO reflect PR-time state + +## review_text + +**Scan:** +| Category | Result | +|---|---| +| Tests / verification | 6 finding(s) below | +| Security | no finding reported | +| Docs / comments | 3 finding(s) below | +| Behavior / compatibility | no finding reported | +| Correctness | 3 finding(s) below | + +**Validated:** +- [resolved] async output + prefix caching mutual exclusion — enable_prefix_caching:false at qwen3_tts.yaml:46 allows async path per gpu_ar_model_runner.py:1540-1541; residual: re-enabling prefix cache silently drops async with no test +- [claim-verified] PR root-cause (nested graphs + missing outer wrap + per-row generator scalar fallback) matches live runner/model code +- [claim-verified] PR 39ms→9ms claim is 4.33x; arithmetic consistent, runtime unverified in this step +- [claim-refuted] PR implies e2e alone validates graph layout — online e2e is functional smoke only; no assertion on CUDAGraphWrapper capture or nested-graph avoidance +- [validated] qwen3_tts_code_predictor_vllm.py:39 use_cuda_graphs=current_omni_platform.is_npu() matches qwen3_omni_moe_code_predictor_mtp.py:21 — avoids nested inner graphs under outer talker_mtp FULL wrap +- [validated] gpu_ar_model_runner.py:1537-1561 async omni output requires async_scheduling, omni_prefix_cache is None, async_chunk, and eager_omni_postprocess_before_async_output + +`vllm_omni/model_executor/models/qwen3_tts/qwen3_tts_talker.py:346` [minor] — This diff gates talker_mtp_accepts_per_row_generators (qwen3_tts_talker.py:346–350) by re-reading cudagraph_mode.has_full_cudagraphs(), duplicating the runner’s wrap decision in _init_talker_mtp (gpu_model_runner.py:205–211). The in-file TODO(#4923) acknowledges runner ownership. Consolidate or add a single shared predicate so model and runner cannot drift and silently flip batched vs scalar MTP. (evidence: qwen3_tts_talker.py:346 `cudagraph_mode = getattr(vllm_config.compilation_config, "cudagraph_mode", None)`; qwen3_tts_talker.py:347-350 `talker_mtp_graph_wrapped = (self.talker_mtp_graph_safe and cudagraph_mode is not None and cudagraph_mode.has_full_cudagraphs())` / `self.talker_mtp_accepts_per_row_generators = not talker_mtp_graph_wrapped`; unchanged by this diff, present in PR-time tree: gpu_model_runner.py:209 `if cudagraph_mode.has_full_cudagraphs() and (has_separate_talker or talker_mtp_graph_safe):`; qwen3_tts_talker.py:337-339 `# TODO(#4923): the model should not read ``cudagraph_mode`` — it is an upstream (runner) concern, and the runner already re-derives the same wrap decision in ``_init_talker_mtp``.`) + +`vllm_omni/model_executor/models/qwen3_tts/qwen3_tts_talker.py:350` [minor] — This diff gates `talker_mtp_accepts_per_row_generators` off under `cudagraph_mode.has_full_cudagraphs()` (talker.py:350), and the model comments (334–335) state per-request `tts_local_seed` is not reproducible in that mode. Serving still injects `tts_local_seed` from `request.seed`/deploy default (serving_speech.py:3694, 3706), and `test_prepare_speech_generation_qwen3_default_seed_sets_tts_local_seed` only asserts it is set in `extra_args` (3365), not that residual codec sampling is seed-stable on the default GPU bundled deploy (`qwen3_tts.yaml` runs talker cudagraph by default). Consider documenting this limitation in serving/API guidance or warning when seeds are accepted but ignored under full cudagraphs. (evidence: unchanged by this diff, present in PR-time tree: qwen3_tts_talker.py:334-335 `# Consequence: under full cudagraphs, per-request ``tts_local_seed`` is` / `# not reproducible (matching Qwen3-Omni, which has no per-row seeding);`; qwen3_tts_talker.py:350 `self.talker_mtp_accepts_per_row_generators = not talker_mtp_graph_wrapped`; serving_speech.py:3694 `stage0_params.extra_args["tts_local_seed"] = request.seed`; serving_speech.py:3706 `stage0_params.extra_args.setdefault("tts_local_seed", int(default_seed))`; test_serving_speech.py:3365 `assert stage0_params.extra_args["tts_local_seed"] == 42`; qwen3_tts.yaml:11 `# * Stage 0 does not set enforce_eager — talker runs cudagraph by default.`) + +`vllm_omni/model_executor/models/qwen3_tts/qwen3_tts_talker.py:~346` [minor] — This diff gates talker_mtp_accepts_per_row_generators on cudagraph_mode.has_full_cudagraphs() at talker __init__ (qwen3_tts_talker.py:346–350), but no talker unit test exercises the True/False branches: existing talker tests use __new__ and skip __init__, and the only tests/ reference to the flag manually injects True on a runner mock (test_omni_gpu_model_runner.py:374). Add a lightweight init test mocking compilation_config.cudagraph_mode to assert FULL mode sets the flag False and eager/None leaves it True. (evidence: qwen3_tts_talker.py:346 `cudagraph_mode = getattr(vllm_config.compilation_config, "cudagraph_mode", None)`; qwen3_tts_talker.py:347-350 `talker_mtp_graph_wrapped = ( self.talker_mtp_graph_safe and cudagraph_mode is not None and cudagraph_mode.has_full_cudagraphs() )` / `self.talker_mtp_accepts_per_row_generators = not talker_mtp_graph_wrapped`; test_qwen3_tts_talker_preprocess.py:28-35 `Skips ``__init__`` and ``load_weights``` / `model = Qwen3TTSTalkerForConditionalGeneration.__new__(Qwen3TTSTalkerForConditionalGeneration)`; test_omni_gpu_model_runner.py:374 `talker_mtp_accepts_per_row_generators=True,` (manually injected on runner.model SimpleNamespace, not from talker __init__)) + +```suggestion +# in tests/model_executor/models/qwen3_tts/test_qwen3_tts_talker_cudagraph_flags.py +from types import SimpleNamespace + +def test_talker_disables_per_row_generators_under_full_cudagraphs(mocker): + mode = SimpleNamespace(has_full_cudagraphs=lambda: True) + vllm_config = SimpleNamespace(compilation_config=SimpleNamespace(cudagraph_mode=mode)) + # patch Qwen3Model/ParallelLMHead/etc. to no-ops, then: + talker = Qwen3TTSTalkerForConditionalGeneration(vllm_config=vllm_config) + assert talker.talker_mtp_graph_safe is True + assert talker.talker_mtp_accepts_per_row_generators is False +``` + +`general` [minor] — Async vs prefix-cache mutual exclusion: this PR sets enable_prefix_caching:false (qwen3_tts.yaml:46) and use_async_omni_output=True (qwen3_tts_talker.py:351), so omni_prefix_cache stays None and async output can activate. Residual: re-enabling enable_prefix_caching initializes omni_prefix_cache (gpu_model_runner.py:169) and silently disables async output via gpu_ar_model_runner.py:1540-1541 — no warning is emitted. (evidence: unchanged by this diff, present in PR-time tree: vllm_omni/worker/gpu_ar_model_runner.py:1540 `if self.omni_prefix_cache is not None:`; vllm_omni/worker/gpu_ar_model_runner.py:1541 `return False`; vllm_omni/worker/gpu_model_runner.py:169 `if self.cache_config.enable_prefix_caching:`; PR diff: vllm_omni/deploy/qwen3_tts.yaml:46 `enable_prefix_caching: false`; PR diff: vllm_omni/model_executor/models/qwen3_tts/qwen3_tts_talker.py:351 `self.use_async_omni_output = True`) + +`general` [minor] — Nested GPU code-predictor CUDA graphs vs talker_mtp FULL wrap — fixed by `use_cuda_graphs=current_omni_platform.is_npu()` (GPU False). Residual minor: `vllm_omni/deploy/qwen3_tts_high_concurrency.yaml:27` still sets `code_predictor_prefix_graphs: true`; gating at `qwen3_code_predictor.py:477` disables prefix graphs when `use_cuda_graphs` is False, so the yaml key is a no-op on GPU. (evidence: qwen3_tts_code_predictor_vllm.py:39 `use_cuda_graphs=current_omni_platform.is_npu(),` — PR diff disables GPU code-predictor graphs; unchanged by diff, present in PR-time tree: qwen3_code_predictor.py:477 `self._prefix_graphs_enabled = prefix_graphs_requested and wrapper_config.use_cuda_graphs and not is_npu` — prefix graphs require use_cuda_graphs; unchanged by diff: qwen3_tts_high_concurrency.yaml:27 `code_predictor_prefix_graphs: true` — yaml still requests prefix graphs) + +`docs/user_guide/examples/online_serving/text_to_speech.md:~334` [minor] — This diff raises bundled `qwen3_tts.yaml` stage-0/1 `max_num_seqs` from 10 to 64 for throughput, but `docs/user_guide/examples/online_serving/text_to_speech.md:334` and `docs/serving/speech_api.md:667` still document the old default of 10. Refresh both docs to state 64 is the new default and retain CustomVoice/VoiceDesign TTFA guidance (`max_num_seqs: 1`) from the yaml comment. (evidence: unchanged by this diff, present in PR-time tree: vllm_omni/deploy/qwen3_tts.yaml:38 `max_num_seqs: 64`; vllm_omni/deploy/qwen3_tts.yaml:70 `max_num_seqs: 64`; docs/user_guide/examples/online_serving/text_to_speech.md:334 `The bundled \`qwen3_tts.yaml\` ships stage 1 (Code2Wav) at \`max_num_seqs: 10\`, tuned for Base voice cloning:`; docs/serving/speech_api.md:667 `benchmark before reducing it below \`10\`.`) + +```suggestion +The bundled `qwen3_tts.yaml` ships stage 1 (Code2Wav) at `max_num_seqs: 64` for throughput; for CustomVoice/VoiceDesign TTFA, override to `max_num_seqs: 1`. +``` + +**Additional observations (beyond the comment budget):** +- `tests/model_executor/models/qwen3_tts/test_code_predictor_dtype.py:481` [minor] PR sets code-predictor `use_cuda_graphs=current_omni_platform.is_npu()` (False on GPU), but `test_tts_config` still instantiates `CodePredictorWrapperConfig` with `use_cuda_graphs=True` and asserts True—it never exercises the wrapper constructor, so the test passes while encoding the old TTS default. Rewrite it to construct `Qwen3TTSTalkerCodePredictorForConditionalGenerationVLLM` with mocked `is_npu()` False/True and assert `_wrapper_config.use_cuda_graphs` follows the split. +- `tests/worker/test_omni_gpu_model_runner.py:356` [minor] This PR's perf win is one batched `_talker_mtp_forward` per step when `talker_mtp` is graph-wrapped (`isinstance(..., get_graph_wrapper_cls())` at gpu_model_runner.py:1808) and `talker_mtp_accepts_per_row_generators=False` with no per-row seeds—the scalar fallback at :1851-1876 only fires when seeds are present. Extend `tests/worker/test_omni_gpu_model_runner.py` with a case using a fake graph wrapper and `accepts=False` without `tts_local_seed` to assert a single `batch_size==N` call; existing tests only cover scalar fallback with seeds (:317-354) and seeded batching when accepts=True (:356-393). +- `tests/e2e/offline_inference/test_qwen3_tts_customvoice.py:38` [minor] This PR changes the production full-cudagraph + async-output talker path, but merge-gate offline Qwen3-TTS tests (`test_qwen3_tts_customvoice.py` / `test_qwen3_tts_base.py`) build temp YAMLs with `enforce_eager: True` on both stages, so AMD offline `advanced_model` runs never exercise nested-graph fixes. Online E2E already uses prod `qwen3_tts.yaml` without `enforce_eager`; consider adding one offline or worker-level test that keeps cudagraphs enabled. +- `vllm_omni/deploy/qwen3_tts.yaml:98` [minor] NPU `platforms` adds `cudagraph_mode: PIECEWISE` for stages 0 and 1 (lines 98–102) without explaining why. With `talker_mtp_graph_safe=True` and `use_cuda_graphs=current_omni_platform.is_npu()`, default FULL would make `_init_talker_mtp` outer-wrap `talker_mtp` while the code predictor still captures inner NPU graphs—the nested-graph failure this PR addresses on GPU. Mirror qwen3_omni_moe.yaml:81–87: stage 0 blocks outer FULL talker_mtp wrap; stage 1 keeps Code2Wav inner decode graphs capture-safe. + +**Verdict:** COMMENT diff --git a/eval/dataset/arms/copilot_v20cb_train/pr4923.trace.json.gz b/eval/dataset/arms/copilot_v20cb_train/pr4923.trace.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..733a6abf94de00a441752fb52b51938c5a0ae389 GIT binary patch literal 28373 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 MRzN9N9thBX0I9X6OaK4? literal 0 HcmV?d00001 diff --git a/eval/dataset/arms/copilot_v20cb_train/pr4926.cost.json b/eval/dataset/arms/copilot_v20cb_train/pr4926.cost.json new file mode 100644 index 000000000..58edc5fb0 --- /dev/null +++ b/eval/dataset/arms/copilot_v20cb_train/pr4926.cost.json @@ -0,0 +1,94 @@ +{ + "wall_s": 1118.2, + "split": "train", + "rc": 0, + "run_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_train/runs/pr4926/run-20260817-195356-94d3bc", + "recorded_at": "2026-08-17T20:12:32", + "attempts": [ + { + "invocation_id": "inv-5dbb20c1", + "outcome": "run:run-20260817-195356-94d3bc", + "rc": 0, + "pre_run": null + }, + { + "run_dir": "run-20260817-195356-94d3bc", + "llm_calls": 0, + "input_tokens": 0, + "output_tokens": 0, + "usd": 0.0, + "source": "no-trace" + } + ], + "attempt_usd_total": 0.0, + "llm_calls": 0, + "input_tokens": 0, + "output_tokens": 0, + "usd": 0.0, + "source": "no-trace", + "metrics": { + "schema": 1, + "run": "run-20260817-195356-94d3bc", + "task_kind": "pr_review", + "status": "done", + "quality": { + "q": null, + "weight_coverage": 0.0, + "partial": true, + "abstained": false, + "components": { + "recall_w": null, + "precision_v": null, + "useful": null, + "calib": null, + "decision": null + } + }, + "cost": { + "usd": 0.3938, + "minutes": 18.61, + "ci_minutes": 0, + "input_tokens": 1007978, + "output_tokens": 110565, + "tool_calls": 384, + "usd_ref": 1.0, + "min_ref": 10.0, + "cost_index": 1.6665, + "cost_partial": false, + "unpriced_calls": 0, + "source": "events", + "llm_calls": null, + "by_role": null, + "cache_read_tokens": null, + "cache_creation_tokens": null + }, + "timings": { + "steps": { + "fetch": 7.17, + "gate": 2.03, + "review": 1107.01, + "report": 0.12 + }, + "time_to_first_result_s": 1116.32 + }, + "risk": { + "incidents": { + "catastrophic": 0, + "severe": 0, + "moderate": 0, + "minor": 0 + }, + "safety_multiplier": 1.0 + }, + "catq": null, + "tus": null, + "signals": { + "escalations": 0, + "pushes": 0, + "posted": 0, + "steps_completed": 4 + } + }, + "trace": "pr4926.trace.json.gz", + "trace_bytes": 34546 +} \ No newline at end of file diff --git a/eval/dataset/arms/copilot_v20cb_train/pr4926.md b/eval/dataset/arms/copilot_v20cb_train/pr4926.md new file mode 100644 index 000000000..daaa1fa87 --- /dev/null +++ b/eval/dataset/arms/copilot_v20cb_train/pr4926.md @@ -0,0 +1,135 @@ +# Run report + +- checkout: PR-TIME TREE (head 35aa741e1962) — the tree matches the diff exactly; repo-wide greps DO reflect PR-time state + +## review_text + +**Scan:** +| Category | Result | +|---|---| +| Tests / verification | 7 finding(s) below | +| Security | no finding reported | +| Docs / comments | 3 finding(s) below | +| Behavior / compatibility | no finding reported | +| Correctness | 2 finding(s) below | + +**Validated:** +- [resolved] Hopper pre-9 FA3_HUB→FLASH_ATTN_HUB — cuda/platform.py:140-148; residual: Blackwell sm_10x/sm_12x still passes gate +- [resolved] FA3 platform gate added (deeb67af) — test asserts pre-Hopper→FLASH_ATTN_HUB; residual: FA3 forward never CI-run on L4 (major<9 skip at test:92) +- [resolved] piecewise varlen fallback in _flash_wrapper (332da8f2) — no test drives full_attn_spans through FlashAttentionHubImpl +- [resolved] registry KeyError on non-CUDA explicit hub selection — NPU platform.py:110-118 now remaps hub names to FLASH_ATTN before DiffusionAttentionBackendEnum[backend_upper]; residual: no parametrized ROCm/NPU/XPU/MUSA platform tests (kept rocm:91) +- [claim-verified] PR unit-test claim: test_kernels_hub.py marked @pytest.mark.core_model @pytest.mark.cpu collects in .buildkite/test-ready.yml L1/L2. +- [claim-refuted] PR/docs 'perfect numerical consistency' — test compares Hub vs SDPA at 1e-2, no diffusers-hub parity + +### 1. Each diffusion Attention layer builds its own impl via layer.py:95 self.attention = self.attn_impl_cls(...), so a multi-layer DiT repeats Hub kernel resolution […] + +`vllm_omni/diffusion/attention/backends/flash_attn_hub.py:~96` [major] + +Both FlashAttentionHubImpl and FlashAttention3HubImpl call get_kernel() in __init__ (flash_attn_hub.py:96-103, 275-282). Local FLASH_ATTN binds flash_attn_func once at fa.py import. Cache the hub module per process and assign only function pointers per impl. + +> flash_attn_hub.py:96 `hub_module = get_kernel("kernels-community/flash-attn2", version=1)` — inside FlashAttentionHubImpl.__init__; unchanged by this diff, present in PR-time tree: layer.py:95 `self.attention = self.attn_impl_cls(` — one impl per Attention layer; unchanged by this diff, present in PR-time tree: fa.py:26 `flash_attn_func = None` with module-level import chain (lines 35-68) — local FLASH_ATTN loads once at import, not per-layer __init__ + +```suggestion +@functools.lru_cache(maxsize=1) +def _load_flash_attn2_hub_module(): + from kernels import get_kernel + for version in (1, 2, None): + try: + return get_kernel("kernels-community/flash-attn2", version=version) if version else get_kernel("kernels-community/flash-attn2") + except Exception: + continue + raise RuntimeError("Failed to load flash-attn2 kernel from HuggingFace Hub") + +# in __init__: +hub_module = _load_flash_attn2_hub_module() +``` + +### 2. `test_kernels_hub_execution` (`@hardware_test(res={'cuda': 'L4'})`, `@pytest.mark.core_model`) is not collected by PR CUDA diffusion CI […] + +`tests/diffusion/attention/test_kernels_hub.py:58` [major] + +tests/diffusion/*.py -m 'core_model and cuda'`, which excludes `tests/diffusion/attention/test_kernels_hub.py`. The CPU fallback test in the same file (`@pytest.mark.cpu`) is collected by line 13 (`tests/diffusion -m 'core_model and cpu'`). Add a CI job for `tests/diffusion/attention/` if the Hub kernel forward path should be gated in PR CI. + +> tests/diffusion/attention/test_kernels_hub.py:56-58 `@pytest.mark.core_model` / `@hardware_test(res={'cuda': 'L4'}, num_cards=1)` / `def test_kernels_hub_execution():`; unchanged by this diff, present in PR-time tree: .buildkite/test-ready.yml:145 `timeout 15m pytest -sv tests/diffusion/*.py -m 'core_model and cuda' --run-level "core_model"` (glob limits collection to top-level `tests/diffusion/*.py`, not `attention/`); .buildkite/test-ready.yml:13 `timeout 20m pytest -sv tests/diffusion tests/model_executor -m 'core_model and cpu'` (recursive `tests/diffusion` collects CPU-marked subdirectory tests); tests/helpers/mark.py:12 `test_platform_detail = pytest.mark.cuda` (hardware_test adds cuda mark, so execution test matches cuda filter but wrong path scope excludes the file). + +Proposed change (not a ready patch): # In .buildkite/test-ready.yml Diffusion group, add e.g.: +- label: "Diffusion · Attention Test" + commands: + - timeout 15m pytest -sv tests/diffusion/attention/ -m 'core_model and cuda and L4' --run-level "core_model" + +### 3. `FlashAttentionHubImpl.__init__` then calls `get_kernel` with no fallback to local FLASH_ATTN—the final default `get_kernel` at flash_attn_hub.py:103 is […] + +`vllm_omni/platforms/cuda/platform.py:~126` [major] + +CUDA platform selection only probes `importlib.import_module('kernels')` and falls back on ImportError (cuda/platform.py:125-138), but once `kernels` imports the Hub backend is selected. Docs promise graceful fallback to `FLASH_ATTN` when kernels is unavailable (attention_backends.md:231), so air-gapped or Hub-fetch failures with `kernels` installed can hard-fail at model construction instead of re-routing. + +> cuda/platform.py:125-128 `try: importlib.import_module("kernels")` / `except ImportError:` — fallback only when the package cannot be imported; flash_attn_hub.py:103 `hub_module = get_kernel("kernels-community/flash-attn2")` — final Hub load attempt is not wrapped in except; flash_attn_hub.py:109 `raise RuntimeError("Failed to load flash-attn2 kernel from HuggingFace Hub: no functions found")`; docs/user_guide/diffusion/attention_backends.md:231 `If the kernels library is not available in the environment, vLLM-Omni will log a warning and fall back gracefully to the corresponding local backend implementations (FLASH_ATTN).` + +Proposed change (not a ready patch): Wrap get_kernel in the shared loader with ImportError/RuntimeError handling that logs and returns None, and in platform selection (or impl init) re-resolve to FLASH_ATTN when loader returns None. + +### 4. Extend the flash-like backend check to include hub backends so masked LTX-2 runs with --diffusion-attention-backend FLASH_ATTN_HUB receive correctly shaped 2D […] + +`vllm_omni/diffusion/models/ltx2/ltx2_transformer.py:~397` [major] + +This PR adds FLASH_ATTN_HUB/FLASH_ATTN_3_HUB backends whose masked path asserts a 2D padding mask (flash_attn_hub.py:141), but LTX-2 still converts masks only when get_name().upper() == 'FLASH_ATTN' (ltx2_transformer.py:397). + +> unchanged by this diff, present in PR-time tree: ltx2_transformer.py:397-398 `if attn.attn.attn_backend.get_name().upper() == "FLASH_ATTN":` / `attention_mask = self._to_padding_mask(attention_mask)`; flash_attn_hub.py:141 `assert attention_mask.ndim == 2, "attention_mask must be 2D, (batch_size, seq_len)"` + +Proposed change (not a ready patch): flash_like = attn.attn.attn_backend.get_name().upper() in ( + "FLASH_ATTN", "FLASH_ATTN_HUB", "FLASH_ATTN_3_HUB" + ) + if flash_like: + attention_mask = self._to_padding_mask(attention_mask) + +### 5. Users who explicitly select a hub backend on the diffusers adapter path hit `case _` (line 247) and silently fall back to diffusers `native` SDPA. + +`vllm_omni/diffusion/models/diffusers_adapter/pipeline_diffusers_adapter.py:~247` [major] + +This PR registers `FLASH_ATTN_HUB` and `FLASH_ATTN_3_HUB` in the diffusion backend registry, but `DiffusersAdapterPipeline._set_attention_backend` still matches only `FLASH_ATTN|None`, `SAGE_ATTN`, `ASCEND`, and `TORCH_SDPA` (`pipeline_diffusers_adapter.py:216-246`). Add hub-specific cases that extend the existing `flash_hub`/`_flash_3_hub` attempt chains. + +> unchanged by this diff, present in PR-time tree: pipeline_diffusers_adapter.py:217 `case "FLASH_ATTN" | None:` — only explicit backend cases before catch-all are SAGE_ATTN, ASCEND, TORCH_SDPA; no FLASH_ATTN_HUB/FLASH_ATTN_3_HUB branch. pipeline_diffusers_adapter.py:247-249 `case _:` / `logger.warning(f"Invalid attention backend: {attention_backend_config}. Falling back to SDPA.")` / `attention_backend_attempts.append("native")` — hub enum values fall through here. pipeline_diffusers_adapter.py:230-235 `"_flash_3_hub", ... "flash_hub", "flash_varlen_hub"` — hub diffusers backends are attempted only under the FLASH_ATTN|None branch. + +Proposed change (not a ready patch): case "FLASH_ATTN_3_HUB": + attention_backend_attempts.extend(["_flash_3_hub", "_flash_3_varlen_hub", "_flash_3", "_flash_varlen_3"]) + case "FLASH_ATTN_HUB": + attention_backend_attempts.extend(["flash_hub", "flash_varlen_hub", "flash", "flash_varlen"]) + +### 6. This PR adds `test_kernels_hub_execution` with dense unmasked forwards only (`AttentionMetadata(attn_mask=None)`, test_kernels_hub.py:75), pins the execution […] + +`tests/diffusion/attention/test_kernels_hub.py:58` [minor] + +Consider adding masked/piecewise hub unit tests and a Hopper `hardware_test` row for `FLASH_ATTN_3_HUB` if FA3 hub execution is part of the stated parity goal. + +> tests/diffusion/attention/test_kernels_hub.py:57 `@hardware_test(res={"cuda": "L4"}, num_cards=1)` — execution test is scheduled on L4; tests/diffusion/attention/test_kernels_hub.py:75 `attn_metadata_sdpa = AttentionMetadata(attn_mask=None)` — only unmasked dense metadata is exercised; tests/diffusion/attention/test_kernels_hub.py:92-93 `if major < 9:` / `pytest.skip("FLASH_ATTN_3_HUB execution requires Hopper-class GPU (compute capability >= 9.0)")` — FA3 hub forward is skipped on L4; unchanged by this diff, present in PR-time tree: vllm_omni/diffusion/attention/backends/flash_attn_hub.py:189 `if full_attn_spans is not None:` and flash_attn_hub.py:205 `if attention_mask is not None and torch.any(~attention_mask):` — masked/piecewise hub paths exist but have no matching coverage in tests/diffusion/attention/test_kernels_hub.py + +### 7. Hub kernel loading uses a version fallback chain (version=1 → version=2 → unpinned default) in both FlashAttentionHubImpl (:96-103) and FlashAttention3HubImpl […] + +`vllm_omni/diffusion/attention/backends/flash_attn_hub.py:96` [minor] + +Different replicas can therefore resolve different Hub artifacts when earlier versions fail, undermining the documented train↔rollout consistency goal. Pin one Hub revision (constant or env var) and fail loudly instead of cascading. + +> flash_attn_hub.py:96 `hub_module = get_kernel("kernels-community/flash-attn2", version=1)`; flash_attn_hub.py:100 `hub_module = get_kernel("kernels-community/flash-attn2", version=2)`; flash_attn_hub.py:103 `hub_module = get_kernel("kernels-community/flash-attn2")`; flash_attn_hub.py:275 `hub_module = get_kernel("kernels-community/flash-attn3", version=1)`; flash_attn_hub.py:279 `hub_module = get_kernel("kernels-community/flash-attn3", version=2)`; flash_attn_hub.py:282 `hub_module = get_kernel("kernels-community/flash-attn3")`; attention_backends.md:217-218 `To achieve perfect numerical consistency between **training** ... and **serving/rollout** ... This eliminates numerical drift / sampling divergence caused by executing different local kernel versions during rollout.` + +```suggestion +HUB_KERNEL_VERSION = int(os.environ.get("VLLM_OMNI_HUB_KERNEL_VERSION", "1")) +hub_module = get_kernel("kernels-community/flash-attn2", version=HUB_KERNEL_VERSION) +``` + +### 8. At cuda/platform.py:156 this PR enables `FLASH_ATTN_3_HUB` whenever `compute_capability.major >= 9`, which includes Blackwell (major 10/11/12), while […] + +`vllm_omni/platforms/cuda/platform.py:~156` [minor] + +On the same path, `SAGE_ATTN_3` is gated at major >= 10 (cuda/platform.py:159). Restrict FA3 hub to Hopper (`major == 9`) or document and test Blackwell behavior explicitly. + +> vllm_omni/platforms/cuda/platform.py:156 `fa3_hub_supported = compute_capability is not None and compute_capability.major >= 9`; docs/user_guide/diffusion/attention_backends.md:24 `| \`FLASH_ATTN_3_HUB\` | FlashAttention 3 from HuggingFace \`kernels\` library. CUDA Hopper (sm_90+) only; falls back to \`FLASH_ATTN_HUB\` on older GPUs. |`; docs/user_guide/diffusion/attention_backends.md:231 `On CUDA GPUs below Hopper (compute capability < 9.0), \`FLASH_ATTN_3_HUB\` falls back to \`FLASH_ATTN_HUB\`.`; unchanged by this diff, present in PR-time tree: vllm_omni/platforms/cuda/platform.py:159 `sage_attn3_supported = compute_capability is not None and compute_capability.major >= 10` + +```suggestion +fa3_hub_supported = compute_capability is not None and compute_capability.major == 9 +``` + +**Additional observations (beyond the comment budget):** +- `docs/user_guide/diffusion/attention_backends.md:217` [minor] Docs claim 'perfect numerical consistency' between Diffusers Hub-kernel training and vLLM-Omni serving (attention_backends.md:217) and tell users `pip install kernels==0.14.1` (attention_backends.md:228), but the added test only checks Hub output within 1e-2 of local SDPA (test_kernels_hub.py:86-88), not Diffusers parity, and pyproject pins `kernels` under dev extras only (pyproject.toml:70). Tone down the claim or document actual parity evidence and the supported install path. +- `docs/user_guide/diffusion/attention_backends.md:231` [minor] When the `kernels` package is missing, `FLASH_ATTN_3_HUB` is remapped to local `FLASH_ATTN` (FA2), not a local FA3 backend (none is registered). Docs line 231 names `FLASH_ATTN` but 'corresponding local backend implementations' may still imply FA3 parity for FA3-hub users. Consider: 'If `kernels` is not installed, both `FLASH_ATTN_HUB` and `FLASH_ATTN_3_HUB` fall back to local `FLASH_ATTN` (FlashAttention 2).' Pre-Hopper `FLASH_ATTN_3_HUB` → `FLASH_ATTN_HUB` is already documented on the same line and implemented at cuda/platform.py:140-147. +- `flash_attn_hub.py:116` [minor] piecewise varlen fallback — flash_attn_hub.py:116-126 `_flash_wrapper` falls back to `_run_varlen_dense` when `attn_func` is None; `forward_cuda` piecewise path (189-203) binds `self.flash_attn_func` into that wrapper. Residual: no hub-backend test for `full_attn_spans`/piecewise. + +**Verdict:** FOLLOW-UP REQUIRED (post-merge) diff --git a/eval/dataset/arms/copilot_v20cb_train/pr4926.trace.json.gz b/eval/dataset/arms/copilot_v20cb_train/pr4926.trace.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..3363a165cc8cf07ac8856973473ba2bcabf1bfec GIT binary patch literal 34546 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 Z-MOJ3xk1x@cnkmk^#3;GlEz^;0|51)=sy4e literal 0 HcmV?d00001 diff --git a/eval/dataset/arms/copilot_v20cb_train/pr4950.cost.json b/eval/dataset/arms/copilot_v20cb_train/pr4950.cost.json new file mode 100644 index 000000000..22e0e1e0c --- /dev/null +++ b/eval/dataset/arms/copilot_v20cb_train/pr4950.cost.json @@ -0,0 +1,94 @@ +{ + "wall_s": 561.7, + "split": "train", + "rc": 0, + "run_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_train/runs/pr4950/run-20260817-200120-91c12b", + "recorded_at": "2026-08-17T20:10:41", + "attempts": [ + { + "invocation_id": "inv-38c7f121", + "outcome": "run:run-20260817-200120-91c12b", + "rc": 0, + "pre_run": null + }, + { + "run_dir": "run-20260817-200120-91c12b", + "llm_calls": 0, + "input_tokens": 0, + "output_tokens": 0, + "usd": 0.0, + "source": "no-trace" + } + ], + "attempt_usd_total": 0.0, + "llm_calls": 0, + "input_tokens": 0, + "output_tokens": 0, + "usd": 0.0, + "source": "no-trace", + "metrics": { + "schema": 1, + "run": "run-20260817-200120-91c12b", + "task_kind": "pr_review", + "status": "done", + "quality": { + "q": null, + "weight_coverage": 0.0, + "partial": true, + "abstained": false, + "components": { + "recall_w": null, + "precision_v": null, + "useful": null, + "calib": null, + "decision": null + } + }, + "cost": { + "usd": 0.0631, + "minutes": 9.35, + "ci_minutes": 0, + "input_tokens": 156054, + "output_tokens": 19028, + "tool_calls": 116, + "usd_ref": 1.0, + "min_ref": 10.0, + "cost_index": 1.3209, + "cost_partial": false, + "unpriced_calls": 0, + "source": "events", + "llm_calls": null, + "by_role": null, + "cache_read_tokens": null, + "cache_creation_tokens": null + }, + "timings": { + "steps": { + "fetch": 4.21, + "gate": 1.69, + "review": 555.03, + "report": 0.06 + }, + "time_to_first_result_s": 560.97 + }, + "risk": { + "incidents": { + "catastrophic": 0, + "severe": 0, + "moderate": 0, + "minor": 0 + }, + "safety_multiplier": 1.0 + }, + "catq": null, + "tus": null, + "signals": { + "escalations": 0, + "pushes": 0, + "posted": 0, + "steps_completed": 4 + } + }, + "trace": "pr4950.trace.json.gz", + "trace_bytes": 9445 +} \ No newline at end of file diff --git a/eval/dataset/arms/copilot_v20cb_train/pr4950.md b/eval/dataset/arms/copilot_v20cb_train/pr4950.md new file mode 100644 index 000000000..d089a42ba --- /dev/null +++ b/eval/dataset/arms/copilot_v20cb_train/pr4950.md @@ -0,0 +1,48 @@ +# Run report + +- checkout: PR-TIME TREE (head 48d4fd8a5e98) — the tree matches the diff exactly; repo-wide greps DO reflect PR-time state + +## review_text + +**Scan:** +| Category | Result | +|---|---| +| Tests / verification | no finding reported | +| Security | no finding reported | +| Docs / comments | 3 finding(s) below | +| Behavior / compatibility | no finding reported | +| Correctness | no finding reported | + +**Validated:** +- [resolved] Old recipe claimed text+audio in `choices[0]` — head now documents separate choices; residual: Summary still says "one shot" without mentioning two choices +- [claim-verified] PR silent-audio note — without `use_tts_template`, stage processor omits `tts_token_ids` (minicpmo_4_5_omni.py:104-118); talker skips synthesis (minicpmo_4_5_omni_tts.py:406-409) +- [validated] vllm_omni/entrypoints/openai/serving_chat.py:373,381 — chat template path reads `request.chat_template_kwargs` via `_effective_chat_template_kwargs`, not nested `extra_body` +- [validated] vllm_omni/model_executor/stage_input_processors/minicpmo_4_5_omni.py:91-108 — 4.5 TTS span uses token IDs 151703/151704; slice built only when `<|tts_bos|>` present +- [sweep] diff_stat: only `recipes/OpenBMB/MiniCPM-o-4_5.md` changed (+19/-8); no code/tests touched +- [sweep] CI gate `buildkite/vllm-omni-npu-ci` — diff is markdown-only; no NPU configs/yaml/code intersection at this head + +### 1. Users copying that pattern into raw HTTP (curl) will not pass use_tts_template and can get silent audio. + +`examples/online_serving/minicpmo/README.md:~58` [minor] + +This PR fixes the recipe curl example to use top-level chat_template_kwargs, but examples/online_serving/minicpmo/README.md still documents only extra_body.chat_template_kwargs without the curl-vs-SDK distinction. + +> unchanged by this diff, present in PR-time tree: examples/online_serving/minicpmo/README.md:58 `extra_body.chat_template_kwargs.use_tts_template=True`, which appends`; unchanged: vllm_omni/entrypoints/openai/serving_chat.py:437-440 `# [NOTE] When sending request via openai client Python library,` / `# `extra_body` is flattented and merged into the payload's root.` / `# When sending raw request with curl, no flattening happens.`; PR diff fixes recipe: recipes/OpenBMB/MiniCPM-o-4_5.md:116 `"chat_template_kwargs": {"use_tts_template": true}` at request root for curl. + +```suggestion +- **TTS trigger**: for the OpenAI Python SDK (as in `gradio_demo.py`), pass + `extra_body={"chat_template_kwargs": {"use_tts_template": True}}` — the + client merges `extra_body` into the request root. For **curl**, put + `"chat_template_kwargs": {"use_tts_template": true}` at the request root + (nested `extra_body.chat_template_kwargs` is ignored). +``` + +### 2. Gate report shows `buildkite/vllm-omni-npu-ci` red at head; this diff touches only `recipes/OpenBMB/MiniCPM-o-4_5.md` (docs-only, no NPU configs or code). + +`recipes/OpenBMB/MiniCPM-o-4_5.md:104` [nit] + +Please confirm the failure is pre-existing on main rather than introduced here. + +> diff_stat at head 48d4fd8a5e98: `recipes/OpenBMB/MiniCPM-o-4_5.md | 27 +++++++++++++++++++--------` (1 file changed, 19 insertions, 8 deletions); recipes/OpenBMB/MiniCPM-o-4_5.md:104 `**Text + speech in one response** (the headline 4.5 feature). The TTS`; grep NPU in changed file: (no matches) + +**Verdict:** COMMENT diff --git a/eval/dataset/arms/copilot_v20cb_train/pr4950.trace.json.gz b/eval/dataset/arms/copilot_v20cb_train/pr4950.trace.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..318c75388579140d4dc1bf1b851e8befb2dacf1c GIT binary patch literal 9445 zcmV)qNB4EZYr#!<%40X?GeN_*@AL*}0aOf!*BlL)UFy*}Zj zn7T8b(nx>!{^j$hIHlDa+kxjBmKF55)uYM(@Z-zVzn;B%azb|)V}lPIp$p!(ENfuk z9o^Tt$nx$VUY|WZ#e4KYUw16e7(2bdb2N+YnIe|rKiB*z$<_pD!-lCvC?Y?2bHRPb%nXL<#kQlz` z{FDQ6X~Zc9?9i0HV_TNq*LY9!?7na4ffyKLO<3GB17V547M5>nebX9fj@1u*zdsn8 zhS~S6o^3d|o+VJasq4D|bt6FB>w5v$jlhQo{XyUXFBy&iBni*3`x-oN=|DZ(8jt<4 zt&fAgIkvgua4qmGF4h1t^xkd&0W)WzpA$%{5Sh9?Hv56&85Uqb7yW?`2g1|?+wN)3 zz}7_Ik9}(}7&`#A?~MU}0E-S#^@M4yLS$+^XGg-NSuz23-UgE|xXvxzusqK+dSgEB zk9)w*f#!IYBY+$GV-LAgvjH3)^m=1`VDueb@9DO|d-^(-2Ih`r1MRd0oWK)0cYs|6 zJ=;e1Ff3mLea*9AUX2TG+CAX~qCXZoP|M>&2b%V@zy|UOZM=pe)7p`XPG7%pPoKVe zd3xTN1#66Ld5$A&$Fu+$2uDwMbi>yCU@#VAQ|LhuXuV#~^Z_hjvz~40j^hQI?g&Tk zd8;4+?+Dy;dzI*ZV?EKlu*#=D90WmWN4n8sFNW32Kw5?gf^!uP~JkIUjKzDpc zA9w?9nI<>Pz!@08UbZPf*xr)mh(b~qm4*f5F_X3d^*gDU+@FdWYG<9UXF?f2pEr|&&f9*t_m=(ZpZ^0mU~y6a_S!s~%mHd-FyMC{ zf$|I%OiqwLW@!S>CWDKJS)9A0Ad=XWFy#ecF-LInxervy)#*8iOt!%DNRc*bJ``kd z1Hl(WNgRjoMJ|aJ#^K4U=k0`9ogNJChp9mQ7P0g5GbY~iSsDqpUnD7Lic1l(kq;od zU<;6!h5POb7Ltz+j*+}`6qTHvefw8767NCATrUY0BhYZX02%_H9V4%!9)am|fl3!u z72Mn9^B_!c^aQkEK9UlmAeNxUNgD>5uu|KiO2G5rh|>^qog_;gc7o!IZaH!E2>9p{ zU48@}WC?~J&0ytzI!j#3?YT%Pc^;=7O)?J9xPh1@coxu`B3&dHJVWh&DLU*)3S4$6 z+E;LGx_AuIAYisO5)s6}idn zxm(e^4NJ!tNO!tz8{{QU7;3;SDq4UcnS*K$(9pgqEllv1-8Jw~*Uh%B z_lfn1sY-^5lPf9fcQF>*zv4NFYmQc9g{eR`Jf4e#b)Zo4h@M?w#%w`?1b7D!dDva! zgP~;(+7Ou#fHDF^`4mHjOM3DQxG98DN(RnXAppaiB}vg8Nli_cMvqZ_$;Ac|A>wX^Y9mJy|9uWP>TJj1Wysmc72`45)Jx%Rz3Z4X(-utM41T$8 z;e#U0y1;W2;fA2_3Ks+e6;c9`>^4CgI(i%823i#=9#l4%tSFh{9T=x)-{uS)>Val< z>BoA^@(5id)Ut)-?JKlmqksQc6gdE!fBfSJWhDo^eiG6R-RQLq-R=>9s9Z=dC>;f2 z$0Jwz0B*5J#Ynj(DU22@^;)IO7*2_@OyH8iR0P|UsXH~rs%{z@5EVcqbZi<90lT4m z$uMpguE&V?b}}9V%pm2+#{ftHkPhEmv~bxMt+yb8MK%{T6^q_0PA^4|6mDC3hqwUr z7(pu9J_lNYWAA~uBVe1HbpyA8sg^bpaawV^y!yDNFkm{+{D{a9{YQif#qK7cq#N3n zG(;gMs7jx81i-q;MdgGb55&)`;$)W0Lc|i?g&gXJ0V=4i{H<#iXg<`W1&_cz#b_c0 zo41HTpXXt||KWq~GO z0aplpxSi4nByp5l*FO3s!2vsB_b`~lo()7$Km)RsMNpuCZ#5xVyxBFAaG=#>p^PSi zoQr@_OB@%rrN%istIgi}D!1Sq9(e=xc~ zn6Pw8ztAWY+U#?1irKlCAW@4hpW&1LW3yj-FsUn4?IZ=% zLF6(`G6*muu;*;lz0|viR$xse8Qt8KA=*e8=b%uC)Et6xB48Jm|--_IPh(jgE@#`AxdZOU;gmJb1)%jE+L#; zNY?}6z#u_QUcv&if-oyIcv0eGm|sT?NhOXT@a#04OcnBZ7(sMNbrigUi6D6;2BqZk zD!cJqWT4^sxWG_0t)fscf)mnj_wn1Mp+#?9iXspP%~AU@Z<9^lj;7M1e=Jo@HbWl) z2FY&MSb!aj3B>y_r;HS64@9?$3&1=jQSO3CQ_5lHr<6#$?@y-m*}We`3$X2XZQS+W z^0xKk8y;W3yng-$U~YPxeiduUFxv%U5u<$A18yy*n05r-n38vi*J6Qr$GvPGNec)= z=ShsGf-3SR%d(%(fVB?xu2+VyMe2u#XW;k@4-YTmkL(0kWRid_{>V;6J_m32Bb;ux z+w>paaZYhrcQq^b5zUGU3RNlr#EI@d16`Jd#p1SmD1FnVj2k%%ADLO+xt||E+#P{0 zL3dW!Ou8EakUsFHv8@PKm_gY!S$qt{B|SOo5BB@ zBUXa?7ti6;XZiBZF-mxoll;BrBuRUVEC~GqbT>PB`TY6Q7v~qT>f^{{5%5C`%+=qQ zO((u=A;CJRnM>XXe&p$p5H%etzjCUMJ-8@*#1np2(y ziWeb|YJDS8Ayi}Py}s7NayqIJAIx}dBA5jr7~@@9N0TSiv`)vwwtzBERE_3nhFvvW zP-6{NKypM9`fb$=x{j?S^Ed^(iJ&@-lgxAMJ%I`PrY;XlAUYZrX8%6NJkCP)&3K?k z!g!@I28}i_2F@z!5ry7zO#w(82Bga~X{JuOm&=oI4nT6RmS;c}j^~j&zLvd03bmL* zLco?cUkP-iTpyS<11&7qLyaq8*_;&n=-pR9790YRB%Ow3XA9su$;!V$xKMJ{VU7hJ zI-o)|AB$q)&cKrjArKPT5>>nPQLPlZAvoZX1WM$91LDq-G+0+AT+_ikpH?i00afm* z2#s#B2sSF>P=iAv8anv!TQ3;?ThN9ohLLA*{%%dPXE&Y71Jz@$**i*0S8e&Dreum!~!PPm2nDOG$XhWv1D&iVG|v2n09*-7L0fAGQ7;Y z^OlR46b}<)U++7P2M$uFV|!*`IGPg-2B12$zGZ=BZnt-s@ghDtI@)R4KmCb;&te?g z>&*_K3L7Z(>`sz%^aG5G)C;W_5QkHGU0!k?lU zL;C`}0O}-%C>*RZ&;e;iwG_19s?>YXVdroOEI6!_96@jikX5M}fV2My84I{2lg+V}12#w0%_aSn;XD!^$rK zbZqxbU>KDMS*a71KFKzh_FyO}0HpAE4$FTCA&DP!<5)Ls^l+EpYa7SR1_u0h+oW9 zfe{Gi;8jx=NwFY0(1N@W>|a`kP*pW(&a$w96On^=(ZUDX%LkTd#|Hq$ZA4U;*16$A z**feZI$93-kP*}(uJ>vZ*gjRFwsgf%AXg*bj>2(A;Zddlu~^!-*pE;C2E*L&0O6wp zTAD*}X;|#t_dl~)5(DaUP_-{WRp$rb=N(b=$ULX;7kFM3OJ6M@ppDVhCQ?E83@Vl+ z%7-`!OlAUpGEs_g5~U@gzqvn_&k4&YOP)}*CTe-2g6#|wdu!!dV4Otd=P2}~G8L`{ z{(mD{k+&qG_OL*97h;d#5e}k^3B1k6c0w=vF)XHtomw?+JJ*ibBAK&dk%m5{EhnO& zY{W+05k}j`h2Rj!v?Lk=Nh!7ZcNAMtQ4ch@RPoe41ivx}Isye3h=jd9xJ6qW?@cT6o`~%Jj76X^lXM6%hN1NGOF^E zTT&6N%CaJN(HPh>1?y*1?3lp=^ca%yvhPgH!h*7-z&*u6E=VrDjk!1sDgjNCiO8sx zMw&L&;sr*6LO2=&bTWnSHAW+=M2R2vKzk$!j)|bKka|e+sA9-4uLY9(SK$1TYRb&ynD$~CJg0Z>{vAS`(yu-1=Bom|H8 z5RZ`dldkfkN0`Kci+&cSvL*HroWtbzzVuHIhM3t|%js++b11PwS(pXehH$_lY9sb0 z;+}{=AyT{CTbxa$Y%hS9{z54v2peUJhGq!k%S5He%S?qVFm2B>NmLMg`3(3_cA8QT zV=~V{1eI^L9Z2elT+;fORq~4LN=7NzZilGUi=9K?pP#>C6zg}`6D*&}c2(~07~O7Z4X zo{Hgm^Uu=SqW0q%^3r-iVYS`oPBTukD~>H>h*YX^)r?kF3f5WRSgk5o>sN}Dq2eTH zWt8EO>P0S8#9ULJ2*4@wAYluS{-&xI6xG~PTppGTfORTKIYJxz$X*d|F)|Qjv+LZr zFSFzaa9>r`g1;YRK;gL;2@b^0tAy~qp8iju)W>omr5J!4W5CUo*(A!;m+-HD{;xU~ zbWG+-R<2_dAZ2!e>4OYuqLd91_Xr>b3upYuFIR2jO1%aIJ6aZPDp8}B5-dI90ekiG z?EE$YNz^Nybq9Lczy9mL(F9A{&|1n;(>>-YZY2WEQ4L$;4ms)V^T<1uaz`DE+9lPx$?iyA+QHfVsPVSF^B4K zy5)KLz}G&HQ3bZeL4C^)27`gEIv~6Z?BbN|VGqHcG*B?Ut11EbK$(Ht=>g>@U>e8; zeL(L*)-rh9>-EJT&;z0Cecg88$nj0f@W#Df`HrZIDH?pR_NrsI6UJka%{XYs_igne zX!k0~-eD#%uhp)~ca$i@sRzha8)&iRjk$8lIV5xnV(W+@V-Atx(7Xob%1TZYvZo}mba}R-|+bQ<@NJ7 z0CUsh^oy@#)*1l`eP6B(5W)C$y8sCRWeXs#{w-B8%l1E%0Brw5K3dRIk-z84T^?q?RO&e7A`R^UJrz zAn;$^t4-@beSNPseG-JfexumU;D61HVxNTcFZgQHI-I|ySDOg-ukF>Qn}GVw^_S8@ zelu;o1nt-HYEvDQFWuFY^}1RoH!?;yl$;O4H}y zbpj!MnQ>>>P)3P3DpPpa@uAu^$)g~Si3gkmv&RF+FrU9lw_6%k+@_8hqol-;sV zxZW9DD>9I7zBLPZOeyi*>8SL^QrF0m@Ez&YQmK@Mkdo>F(Z`piQTo^y&^cYmW(tla z1#k5AJe-rRd+g@ z5;F1*AOlOSsLQ1YNcJD@5~}ps=wUrb6pL)sDG^NKDAfPd!F;cvn0j+%d$MZbrCioz z0+T2uyrrE1C*EEF+~=~Peyv0PK=uq``TMhU8kMEWhh?czDtJPPT=JweFOCAojsU>+ld2IQ21AE_qpy zUAG5Iebd*ZOE;JEpwJv1-Zl|TGogl)Ewj{W_7odPwu7U3k5pM$UgbCyYSeIlL)1aB z5;Z4)DH)GD?6fNUt9mXOf_DOa&8kp5A|_uBIU*~Dp8GxfdB~U{lB+tgbabT-sulcG zY6Q4LyBN9yQJNv6_=H+esBT@^vzomFFESGww&)(F1xP*mYz$R5FQ3f}uEnsXX|_RF zQ2C#i5De+v9dwNq`X$WLNJ!efS?xl7%f3N{a6>2S+iOhC>`JH6&aGl2Dsqo@>c1L& z9&-?f#WrK`nFvlQlB%yL#J42|4y3{^y{}^>W;I#FCK^)Vb%9K<`zOUlj(Xe7nEEtJ zT`lpaoI@JnKFxwkSMQ>DKTEUzn$rCa5wB`Z5IbMxw}&KDSubdc$4l{2IoEvW9PWM< z-W{(+t%z}qSpnczk>J?Ct3oDRnkog{6d3_|DXIc3Rck8`wkxSB^;|A!rSLnvdl~E_ zGY0Hv^Iu#2gLUc@QI|REW2QUUbR{yX^IHDz>$Ut^TDa`yZ;V}I>>6X&7`xxU zvBQ^?^e^0@1 zFH}Av?3YT_=&-LhM@XEqOWF*SZyXk+dOveoQ7XMAnYc?b@wUii^G%kf#ieO+X~A<7xU(nm&|YuMcH)`>uTMqtnz{{V-<}&i+2b zS=x?mbt~`ktCH0=-gIK)L#-I~fZvid5BzY(IQg1K! zQYTM-UiMvO0>p$;H>vRD?(=y*7t0MKw(iG{E*y1(`bkS}ch6_^Hqy1)2_F6)^C%az z$qjDN?({UZtqeX_NkOaHYsN*^EgzG+v&%0T{a{ea0f*NIcHimSnyqzoXP`T_LoJhm zD1alY)dZ~E8j1aBg|Awx%c1Sx%Mes9Lc>zF8*HYO|=;7vDf?>&knEp&2VH*E@aZ z(^pQrKM`>CmDB!Jzxwt|8;Iz4bkov%eT9gPuYSqUiJ~8TPOD*~{>d*ba=>TgUby7+bU>JCE4(mLRMj>>4R%mM-J9AJzfn6HwY z>(uJ?Ecn+aYJq=ABu4Ck(=!AICYLWo)f$jLwAAX{d@=Kq2sfGq9+W%&Xli4%Wg-oC zvR~Ve7KKipBWZ>cAel%Oj4|B;m{1UuJ(8x1Js|Lo3wQ)#XeIMAaQ-m&t0rF4^Ax$$ zQj!^Hd6Bh^4(Y5ERAfkByq7GH&hu%_1R&Fw`n?oJ+}gf&3vH1_d)}1$KSkhG0Bl*g zM-xb37a6|^rEjKP)Ia%5} zI03k=tREt2QJaD`?wj#czVd))fz$H>ZlW{b1G@5?{&e^b;>p^>@>ssn>q7J#P{xG5 z(2u*C;idt!Dd3Xf=n07|qDY$uJS`~wShMq$(QkXOSbTM=E!m8On%39mF>pxMMn(cp zqM%7jZAi?~Q5vK)5|WkNJeg;*ci!VZsE?q=*z4lZw{6QXEfNRJ27slnDP?))GE5>~ z?eJCZP(?(Nqt%!eObg~O0fWSFq~+1yq+Qlr+CdmO-6RwwC}pJ1mH^T&?SWe{^NC_+ zrkI&nlL*G+pp=B$v4UAp+&!kw&^0ue78o<#)a-#GsuVCn$@a~>)^xgK>9(;UxKe?y zo4Iwhu4|6otGLDu-kQdyKt^+rJ#uwy&V;BDKTY5+DfnPq-?NUes1ONG*!VPWezrBa5PH^*~|+k z^JHGtCBmG8t6aem#?%zI29^56ORYAG8?+|1Z@y?{>GqO_(zij;*KG~=h;7YdSwqG< zSLpIAZLik}jBOBQarzkh$--&@(v85n(Qh0U}Mxxb&nWU}7Xkvp@OthB;s zR1aI{Gg=@jc%amf{o%)#r++Oob6MKEK;5wu`-pyq9nm%Y0khH27nYY z?FWz9Nd%H8r2L3@g3UPZU^O%@NtoLA3Y?G9=_$XBM&=H$bf_U@)u?jng)aF}eQj4# zZrM1YICQneg5*QqSv49gZ>)7B)NZWl(i=@v?RM(CSsfQo)f#uO^SQcnWui)$R>W&f z{D^l;zXBJMCG$AI<|?_5xZL4fQSC7`H00I01=#IC?RBK!lDKTYYbkkfQ8`HLFPn{U zLLhK1+m-s)UtOmXbpR~eux_7kTTj-X`mIe+cAfs_elAq5U>hcN&q=+pvx4vqjIH%u z;nI|9y8UIJjSel_8Yq{jC^Fd@QlP;tl>4$>Ownm*v@C>4%h2@>Iyr)XU+EVz z<;P1)HAyo_D#%2u;uL&mKur+n{jtRdgRvMZ7m&*)i{(NLL+{B92aTCZHMS#Sc0|Bt zLy}ul6)Wr4`?lHXZLS~Ngbc&B@3(%T_Xh*rG<$(J*t&i|t7Y59;1^u~jqaqoq6Js5 z0Di1y=pAPr57Hs&nMVJfc<2p!mTvU|Q+QkP0O++$Yhe6>c(~2uaaZ*8Dk}ONa~m2A r6R@D)4-LLC)@|PdrjWgiYiJ unchanged by this diff, present in PR-time tree: tests/e2e/online_serving/test_qwen3_tts_customvoice.py:20-22 `_STAGE_CONFIG = modify_stage_config(get_deploy_config_path("qwen3_tts.yaml"),`; unchanged by this diff, present in PR-time tree: .buildkite/test-amd-ready.yaml:173 `- timeout 30m pytest -s -v tests/e2e/online_serving/test_qwen3_tts_customvoice.py -m "core_model" --run-level "core_model"`; unchanged by this diff, present in PR-time tree: .buildkite/test-npu-ready.yaml:21 `- pytest -s -v tests/e2e/online_serving/test_qwen3_tts_customvoice.py -m 'core_model' --run-level 'core_model'`; unchanged by this diff, present in PR-time tree: .buildkite/test-ready.yml:328 `- vllm_omni/deploy/qwen3_tts.yaml`; changed by this PR: vllm_omni/deploy/qwen3_tts.yaml stage-0 `default_sampling_params` has `min_tokens: 2` and `repetition_penalty: 1.05` with no `seed` key (diff removes `- seed: 42`). + +**Verdict:** COMMENT diff --git a/eval/dataset/arms/copilot_v20cb_train/pr4970.trace.json.gz b/eval/dataset/arms/copilot_v20cb_train/pr4970.trace.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..431bebc996d48f82a38c637f0ae72134f126600d GIT binary patch literal 8714 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 o-TFXsn0eY1$U)_^a2Fb=SC5RR910 literal 0 HcmV?d00001 diff --git a/eval/dataset/arms/copilot_v20cb_train/pr4977.cost.json b/eval/dataset/arms/copilot_v20cb_train/pr4977.cost.json new file mode 100644 index 000000000..3fe2d81bb --- /dev/null +++ b/eval/dataset/arms/copilot_v20cb_train/pr4977.cost.json @@ -0,0 +1,94 @@ +{ + "wall_s": 810.1, + "split": "train", + "rc": 0, + "run_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_train/runs/pr4977/run-20260817-195238-4a4b46", + "recorded_at": "2026-08-17T20:06:07", + "attempts": [ + { + "invocation_id": "inv-48d5500e", + "outcome": "run:run-20260817-195238-4a4b46", + "rc": 0, + "pre_run": null + }, + { + "run_dir": "run-20260817-195238-4a4b46", + "llm_calls": 0, + "input_tokens": 0, + "output_tokens": 0, + "usd": 0.0, + "source": "no-trace" + } + ], + "attempt_usd_total": 0.0, + "llm_calls": 0, + "input_tokens": 0, + "output_tokens": 0, + "usd": 0.0, + "source": "no-trace", + "metrics": { + "schema": 1, + "run": "run-20260817-195238-4a4b46", + "task_kind": "pr_review", + "status": "done", + "quality": { + "q": null, + "weight_coverage": 0.0, + "partial": true, + "abstained": false, + "components": { + "recall_w": null, + "precision_v": null, + "useful": null, + "calib": null, + "decision": null + } + }, + "cost": { + "usd": 0.2107, + "minutes": 13.47, + "ci_minutes": 0, + "input_tokens": 522175, + "output_tokens": 63414, + "tool_calls": 219, + "usd_ref": 1.0, + "min_ref": 10.0, + "cost_index": 1.4844, + "cost_partial": false, + "unpriced_calls": 0, + "source": "events", + "llm_calls": null, + "by_role": null, + "cache_read_tokens": null, + "cache_creation_tokens": null + }, + "timings": { + "steps": { + "fetch": 7.74, + "gate": 2.36, + "review": 797.97, + "report": 0.06 + }, + "time_to_first_result_s": 808.19 + }, + "risk": { + "incidents": { + "catastrophic": 0, + "severe": 0, + "moderate": 0, + "minor": 0 + }, + "safety_multiplier": 1.0 + }, + "catq": null, + "tus": null, + "signals": { + "escalations": 0, + "pushes": 0, + "posted": 0, + "steps_completed": 4 + } + }, + "trace": "pr4977.trace.json.gz", + "trace_bytes": 18788 +} \ No newline at end of file diff --git a/eval/dataset/arms/copilot_v20cb_train/pr4977.md b/eval/dataset/arms/copilot_v20cb_train/pr4977.md new file mode 100644 index 000000000..521d171dc --- /dev/null +++ b/eval/dataset/arms/copilot_v20cb_train/pr4977.md @@ -0,0 +1,117 @@ +# Run report + +- checkout: PR-TIME TREE (head 9947f41430aa) — the tree matches the diff exactly; repo-wide greps DO reflect PR-time state + +## review_text + +**Scan:** +| Category | Result | +|---|---| +| Tests / verification | 2 finding(s) below | +| Security | no finding reported | +| Docs / comments | 1 finding(s) below | +| Behavior / compatibility | 1 finding(s) below | +| Correctness | 2 finding(s) below | + +**Validated:** +- [resolved] PR-body `trust_remote_code=True` claim — removed at head `9947f414`; calls are `get_kernel(repo_id, version=version)` / `get_kernel(repo_id)` (`flash_attn_hub.py:34-35`); residual checked: `pyproject.toml:70` test pin `kernels<0.15.0` +- [resolved] `trust_remote_code` dropped at 9947f414 — matches `get_kernel(repo_id, version=version)` signature; pyproject pins `kernels<0.15.0` +- [claim-verified] Commit 528804e8 — documents hundreds of Hub requests per rollout worker and 429 rate limits motivating cache. +- [claim-verified] PR test `test_kernels_hub_platform_fallback` — cpu+core_model; runs via test-ready.yml tests/diffusion recursive job. +- [claim-refuted] PR test plan cites test_kernels_hub_platform_fallback but it only calls CudaOmniPlatform.get_diffusion_attn_backend_cls; never imports flash_attn_hub or _get_hub_module +- [validated] layer.py:95-103 — each `Attention` layer constructs `attn_impl_cls()` independently; per-layer hub load was the regression multiplier. + +### 1. This diff adds process-wide `_hub_modules` caching in `_get_hub_module()` (`flash_attn_hub.py:42-46`), used from both hub impl `__init__` paths (`:119` […] + +`tests/diffusion/attention/test_kernels_hub.py:~19` [minor] + +Add a CPU `@pytest.mark.core_model` test that clears `_hub_modules`, monkeypatches `kernels.get_kernel` with a counter returning a stub module with `flash_attn_func`, builds two `FlashAttentionHubImpl` instances, and asserts exactly one `get_kernel` call for `kernels-community/flash-attn2`. + +> flash_attn_hub.py:22 `_hub_modules: dict[str, object] = {}`; flash_attn_hub.py:42-46 `def _get_hub_module(repo_id: str):` / `with _hub_lock:` / `if repo_id not in _hub_modules:` / `_hub_modules[repo_id] = _load_hub_module(repo_id)` / `return _hub_modules[repo_id]`; flash_attn_hub.py:119 `hub_module = _get_hub_module("kernels-community/flash-attn2")`; flash_attn_hub.py:284 `hub_module = _get_hub_module("kernels-community/flash-attn3")`; tests/diffusion/attention/test_kernels_hub.py:19 `def test_kernels_hub_platform_fallback(monkeypatch: pytest.MonkeyPatch):`; tests/diffusion/attention/test_kernels_hub.py:41-46 `backend_path = CudaOmniPlatform.get_diffusion_attn_backend_cls("FLASH_ATTN_HUB", head_size=64)` / `assert backend_path == DiffusionAttentionBackendEnum.FLASH_ATTN.get_path()` — platform routing only, no `FlashAttentionHubImpl` construction or `get_kernel` call counting + +```suggestion +@pytest.mark.core_model +@pytest.mark.cpu +def test_hub_kernel_loaded_once(monkeypatch: pytest.MonkeyPatch): + import types + import vllm_omni.diffusion.attention.backends.flash_attn_hub as hub + from vllm_omni.diffusion.attention.backends.flash_attn_hub import FlashAttentionHubImpl + + hub._hub_modules.clear() + calls: list[tuple[str, int | None]] = [] + + def fake_get_kernel(repo_id: str, version: int | None = None): + calls.append((repo_id, version)) + return types.SimpleNamespace( + flash_attn_func=lambda q, k, v, **kw: q, + flash_attn_varlen_func=None, + ) + + kernels_mod = types.ModuleType("kernels") + kernels_mod.get_kernel = fake_get_kernel + monkeypatch.setitem(__import__("sys").modules, "kernels", kernels_mod) + + FlashAttentionHubImpl(num_heads=8, head_size=64, softmax_scale=0.125, causal=False) + FlashAttentionHubImpl(num_heads=8, head_size=64, softmax_scale=0.125, causal=False) + assert [c for c in calls if c[0] == "kernels-community/flash-attn2"] == [("kernels-community/flash-attn2", 1)] +``` + +### 2. If `get_kernel()` returns a module missing both symbols, that object is stored in `_hub_modules` even though `__init__` raises; + +`vllm_omni/diffusion/attention/backends/flash_attn_hub.py:45` [minor] + +Caching in `_get_hub_module` (flash_attn_hub.py:45) happens before `FlashAttentionHubImpl.__init__` validates `flash_attn_func`/`flash_attn_varlen_func` (lines 120-123). Pre-PR each layer called `get_kernel` independently. Validate required entrypoints inside `_load_hub_module` before caching, or defer the `_hub_modules` insert until after symbol validation. + +> flash_attn_hub.py:45 `_hub_modules[repo_id] = _load_hub_module(repo_id)` — unconditional cache insert inside `_get_hub_module`; flash_attn_hub.py:31-35 `for version in (1, 2, None): ... return get_kernel(repo_id, version=version)` / `return get_kernel(repo_id)` — returns first successful load with no symbol check; flash_attn_hub.py:119-123 `hub_module = _get_hub_module("kernels-community/flash-attn2")` then `if self.flash_attn_func is None and self.flash_attn_varlen_func is None: raise RuntimeError(...)` — validation runs after cache population; flash_attn_hub.py:44-46 `if repo_id not in _hub_modules:` skipped on later calls, so cached bad module is reused without retry + +```suggestion +def _load_hub_module(repo_id: str): + from kernels import get_kernel + + logger.info("Loading %s kernel from HuggingFace Hub...", repo_id) + last_error = None + for version in (1, 2, None): + try: + module = get_kernel(repo_id, version=version) if version is not None else get_kernel(repo_id) + if getattr(module, "flash_attn_func", None) is None and getattr(module, "flash_attn_varlen_func", None) is None: + raise RuntimeError(f"Hub kernel {repo_id!r} exposes no flash_attn functions") + return module + except Exception as exc: + logger.info("Failed to load %s version %s: %s", repo_id, version, exc) + last_error = exc + raise RuntimeError(f"Failed to load HuggingFace Hub kernel {repo_id!r}") from last_error +``` + +### 3. Not needed for trusted `kernels-community/flash-attn2|3` publishers. + +`general` [minor] + +[resolved] trust_remote_code — at 9947f414, `flash_attn_hub._load_hub_module` calls `get_kernel(repo_id, version=...)` / `get_kernel(repo_id)` with no `trust_remote_code`; consistent with kernels v0.13.x API (no such parameter). + +> flash_attn_hub.py:34 `return get_kernel(repo_id, version=version)`; flash_attn_hub.py:35 `return get_kernel(repo_id)` — no trust_remote_code kwarg at PR head. Unchanged external contract for 0.13.x (not in diff): Hugging Face kernels v0.13.0 docs list `get_kernel(repo_id, revision=None, version=None, backend=None, user_agent=None)` with no `trust_remote_code` parameter. + +### 4. The CPU lane (test-ready.yml:13) recursively collects `tests/diffusion` but only executes `test_kernels_hub_platform_fallback`, which mocks kernels away and […] + +`.buildkite/test-ready.yml:~145` [minor] + +This diff caches hub loads in `_get_hub_module()` (flash_attn_hub.py:42-46), but PR-ready CUDA CI skips `tests/diffusion/attention/`: test-ready.yml:145 runs only top-level `tests/diffusion/*.py` with `core_model and cuda`, so `test_kernels_hub_execution` (CUDA/L4 hub forward) never runs. Extend a PR-ready CUDA lane to `tests/diffusion/attention/` or add a CPU cache-dedup test to the recursive CPU job. + +> unchanged by this diff, present in PR-time tree: .buildkite/test-ready.yml:145 `- timeout 15m pytest -sv tests/diffusion/*.py -m 'core_model and cuda' --run-level "core_model"`; .buildkite/test-ready.yml:13 `- "timeout 20m pytest -sv tests/diffusion tests/model_executor -m 'core_model and cpu' ..."`; tests/diffusion/attention/test_kernels_hub.py:56-57 `@hardware_test(res={"cuda": "L4"}, num_cards=1)` / `def test_kernels_hub_execution():`; flash_attn_hub.py:42-46 `def _get_hub_module(repo_id: str):` / `with _hub_lock:` / `if repo_id not in _hub_modules:` / `_hub_modules[repo_id] = _load_hub_module(repo_id)`; grep of `.buildkite` for `diffusion/attention`: no matches. + +### 5. The shipped head no longer passes `trust_remote_code` to `get_kernel` (removed in 9947f414 because kernels 0.13.x rejects it), but the PR Purpose still claims […] + +`vllm_omni/diffusion/attention/backends/flash_attn_hub.py:26` [minor] + +Please update the PR body to match the final loading contract. + +> vllm_omni/diffusion/attention/backends/flash_attn_hub.py:33 `return get_kernel(repo_id, version=version)`; vllm_omni/diffusion/attention/backends/flash_attn_hub.py:34 `return get_kernel(repo_id)` — no trust_remote_code kwarg at PR head. Commit 9947f414 message: 'kernels 0.13.x get_kernel() does not accept trust_remote_code'. PR #4977 body (live): 'adding `trust_remote_code=True` for more reliable Hub access'. + +### 6. Unchanged `NPUOmniPlatform.get_diffusion_attn_backend_cls` (`npu/platform.py:110-116`) rewrites `FLASH_ATTN_HUB`/`FLASH_ATTN_3_HUB` to local `FLASH_ATTN` and […] + +`vllm_omni/platforms/npu/platform.py:~110` [nit] + +NPU CI is red at head, but this PR only changes `flash_attn_hub.py`. Please confirm whether the NPU CI failure predates this PR. + +> unchanged by this diff, present in PR-time tree: vllm_omni/platforms/npu/platform.py:110 `if backend_upper in ("FLASH_ATTN_HUB", "FLASH_ATTN_3_HUB"):`; vllm_omni/platforms/npu/platform.py:114 `backend_upper = "FLASH_ATTN"`; vllm_omni/platforms/npu/platform.py:116 `return backend.get_path()`; vllm_omni/diffusion/attention/backends/registry.py:59 `FLASH_ATTN = "vllm_omni.diffusion.attention.backends.flash_attn.FlashAttentionBackend"` vs :65-66 hub paths pointing to `flash_attn_hub` + +**Verdict:** COMMENT diff --git a/eval/dataset/arms/copilot_v20cb_train/pr4977.trace.json.gz b/eval/dataset/arms/copilot_v20cb_train/pr4977.trace.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..45c627ff5e23f110316665a9bdc3db7c8fc52841 GIT binary patch literal 18788 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 literal 0 HcmV?d00001 diff --git a/eval/dataset/arms/copilot_v20cb_val/manifest.json b/eval/dataset/arms/copilot_v20cb_val/manifest.json new file mode 100644 index 000000000..0c9a7b021 --- /dev/null +++ b/eval/dataset/arms/copilot_v20cb_val/manifest.json @@ -0,0 +1,34 @@ +{ + "arm": "copilot_v20cb_val", + "engine": "infermatrix-copilot CLI (shipped pipeline, pr-review@6 adaptive-depth ensemble; issue-answer dry-run)", + "llm": "per .env (DeepSeek-routed)", + "dataset": "vllm_omni_dataset.yaml", + "splits": [ + "val" + ], + "kinds": [ + "pr_review" + ], + "n_items": 5, + "trace": { + "AGENT_TRACE": "(default)", + "AGENT_TRACE_IO": "(default)", + "AGENT_TRACE_IO_FULL": "(default)" + }, + "moa_when": "off", + "pr_context_mode": "no_discussion", + "resolved": { + "moa_when": "off", + "moa_eligible_full_depth_pr": false, + "llm_mixture_members": [ + "mimo-v2.5", + "qwen3.6-plus" + ], + "strict_backend": "cursor", + "strict_backend_model": "composer-2.5", + "review_lens_backends": {}, + "agent_model": "deepseek-v4-pro[1m]", + "review_planner_model": "deepseek-v4-flash", + "review_promotion_model": "deepseek-v4-flash" + } +} \ No newline at end of file diff --git a/eval/dataset/arms/copilot_v20cb_val/pr4810.cost.json b/eval/dataset/arms/copilot_v20cb_val/pr4810.cost.json new file mode 100644 index 000000000..f4a7aa632 --- /dev/null +++ b/eval/dataset/arms/copilot_v20cb_val/pr4810.cost.json @@ -0,0 +1,94 @@ +{ + "wall_s": 1242.5, + "split": "val", + "rc": 0, + "run_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_val/runs/pr4810/run-20260818-112615-3b1202", + "recorded_at": "2026-08-18T11:46:55", + "attempts": [ + { + "invocation_id": "inv-15337e06", + "outcome": "run:run-20260818-112615-3b1202", + "rc": 0, + "pre_run": null + }, + { + "run_dir": "run-20260818-112615-3b1202", + "llm_calls": 0, + "input_tokens": 0, + "output_tokens": 0, + "usd": 0.0, + "source": "no-trace" + } + ], + "attempt_usd_total": 0.0, + "llm_calls": 0, + "input_tokens": 0, + "output_tokens": 0, + "usd": 0.0, + "source": "no-trace", + "metrics": { + "schema": 1, + "run": "run-20260818-112615-3b1202", + "task_kind": "pr_review", + "status": "done", + "quality": { + "q": null, + "weight_coverage": 0.0, + "partial": true, + "abstained": false, + "components": { + "recall_w": null, + "precision_v": null, + "useful": null, + "calib": null, + "decision": null + } + }, + "cost": { + "usd": 0.379, + "minutes": 20.67, + "ci_minutes": 0, + "input_tokens": 853208, + "output_tokens": 135160, + "tool_calls": 523, + "usd_ref": 1.0, + "min_ref": 10.0, + "cost_index": 1.6942, + "cost_partial": false, + "unpriced_calls": 0, + "source": "events", + "llm_calls": null, + "by_role": null, + "cache_read_tokens": null, + "cache_creation_tokens": null + }, + "timings": { + "steps": { + "fetch": 3.92, + "gate": 1.83, + "review": 1234.11, + "report": 0.06 + }, + "time_to_first_result_s": 1239.92 + }, + "risk": { + "incidents": { + "catastrophic": 0, + "severe": 0, + "moderate": 0, + "minor": 0 + }, + "safety_multiplier": 1.0 + }, + "catq": null, + "tus": null, + "signals": { + "escalations": 0, + "pushes": 0, + "posted": 0, + "steps_completed": 4 + } + }, + "trace": "pr4810.trace.json.gz", + "trace_bytes": 25474 +} \ No newline at end of file diff --git a/eval/dataset/arms/copilot_v20cb_val/pr4810.md b/eval/dataset/arms/copilot_v20cb_val/pr4810.md new file mode 100644 index 000000000..0948641a2 --- /dev/null +++ b/eval/dataset/arms/copilot_v20cb_val/pr4810.md @@ -0,0 +1,64 @@ +# Run report + +- checkout: PR-TIME TREE (head f9665cc223c8) — the tree matches the diff exactly; repo-wide greps DO reflect PR-time state + +## review_text + +**Scan:** +| Category | Result | +|---|---| +| Tests / verification | 6 finding(s) below | +| Security | no finding reported | +| Docs / comments | 1 finding(s) below | +| Behavior / compatibility | no finding reported | +| Correctness | 1 finding(s) below | + +**Validated:** +- [resolved] Author PR note to remove tests once validated — tests at head are present and should be kept as regression guard +- [resolved] mimo mapper vs `model.` rewrite ordering — concern checked; production `model.*` names remain correct after mapper-then-double +- [claim-verified] PR removes manual get_cache_scale from hunyuan_image3.py:225-227, mammoth_moda2/mimo_audio add mapper at :487/:1157, qwen2_old drops guarded branch +- [claim-verified] pyproject.toml markers define core_model/cpu; dependency get_cache_scale_mapper assumed from vLLM ≥0.23 per PR body (repo rebased past #4286) +- [claim-refuted] Issue #4809 class fix is incomplete: `vllm_omni/diffusion/models/hunyuan_image3/hunyuan_image3_transformer.py:2238` still calls `self.quant_config.get_cache_scale(name)` +- [claim-refuted] Static `_STALE_API_FILES` guard incomplete — author's own main-branch failure log included `hunyuan_image3_transformer.py` but final PR omits it while file still calls removed API. + +`vllm_omni/diffusion/models/hunyuan_image3/hunyuan_image3_transformer.py:~2238` [major] — This PR removes the stale `get_cache_scale` walrus branch from AR `hunyuan_image3.py` and documents mapper delegation to the outer `AutoWeightsLoader`, but the diffusion twin still calls the removed API inside `HunyuanImage3Model.load_weights`. That is the only remaining production `.get_cache_scale(` site at head; `HunyuanImage3Pipeline.load_weights` still enters it via `AutoWeightsLoader`, so quantized Hunyuan Image3 diffusion loads can still raise `AttributeError` on vLLM ≥0.23. Mirror the AR fix here or close it under tracked #4806. (evidence: unchanged by this diff, present in PR-time tree: vllm_omni/diffusion/models/hunyuan_image3/hunyuan_image3_transformer.py:2238 `if self.quant_config is not None and (scale_name := self.quant_config.get_cache_scale(name)):`; changed in this PR: vllm_omni/model_executor/models/hunyuan_image3/hunyuan_image3.py:225-226 `# KV-cache scales are renamed to .attn.{k,v,q}_scale by the` / `# quant_config mapper in the outer AutoWeightsLoader.`; unchanged pipeline entry: vllm_omni/diffusion/models/hunyuan_image3/pipeline_hunyuan_image3.py:458-462 `loader = AutoWeightsLoader(` / ` self,` / ` skip_prefixes=skip_prefixes,` / `)` / `return loader.load_weights(weights)`) + +```suggestion +# KV-cache scales are renamed to .attn.{k,v,q}_scale by the + # quant_config mapper in the outer AutoWeightsLoader. + is_found = False +``` + +`vllm_omni/model_executor/models/mammoth_moda2/mammoth_moda2.py:~486` [minor] — MammothModa2Qwen2ForCausalLM.load_weights prepends quant_config.get_cache_scale_mapper().apply(weights) (mammoth_moda2.py:486-489), consistent with the PR's direct-loader test classification. On the AR serving path, MammothModa2ForConditionalGeneration.load_weights calls self.ar.load_weights (mammoth_moda2.py:810-814); MammothModa2ARForConditionalGeneration does not override load_weights and sets self.language_model to MammothModa2Qwen2ForCausalLM (mammoth_moda2.py:572-577), so it inherits Qwen2_5_VLForConditionalGeneration's AutoWeightsLoader entry, which already applies get_cache_scale_mapper() before delegating to child load_weights. Hunyuan's inner loader only documents outer mapping (hunyuan_image3.py:225-226). Please confirm mapper idempotency on already-mapped scale names or align Mammoth with the Hunyuan comment-only pattern on the AR-delegated path. (evidence: mammoth_moda2.py:486 `if self.quant_config is not None:`; mammoth_moda2.py:487 `cache_scale_mapper = self.quant_config.get_cache_scale_mapper()`; mammoth_moda2.py:489 `weights = cache_scale_mapper.apply(weights)`; mammoth_moda2.py:572 `self.language_model = init_vllm_registered_model(`; mammoth_moda2.py:810 `def load_weights(self, weights):`; mammoth_moda2.py:814 `loaded = self.ar.load_weights(weights)`; hunyuan_image3.py:225 `# KV-cache scales are renamed to .attn.{k,v,q}_scale by the`; hunyuan_image3.py:226 `# quant_config mapper in the outer AutoWeightsLoader.`; unchanged by this diff, present in installed vllm dependency: qwen2_5_vl.py:2028 `loader = AutoWeightsLoader(self)`; utils.py:414 `mapper |= quant_config.get_cache_scale_mapper()`; utils.py:418 `weights = mapper.apply(weights)`; utils.py:331 `loaded_params = module_load_weights(weights)`) + +```suggestion +# KV-cache scales are renamed by quant_config.get_cache_scale_mapper() + # in the outer AutoWeightsLoader on MammothModa2ARForConditionalGeneration. +``` + +`tests/model_executor/models/test_kv_cache_scale_mapper.py:15` [minor] — `_STALE_API_FILES` (lines 15–20) only guards four `model_executor` loaders; `vllm_omni/diffusion/models/hunyuan_image3/hunyuan_image3_transformer.py:2238` still calls the removed `get_cache_scale` API and is not in the list. Add that path once fixed, or document with e.g. `TODO(#4806)` that diffusion is out of scope so the grep test is not read as full-repo coverage. (evidence: tests/model_executor/models/test_kv_cache_scale_mapper.py:15 `_STALE_API_FILES = [` — lists only hunyuan_image3.py, mammoth_moda2.py, mimo_audio_llm.py, qwen2_old.py under model_executor; unchanged by this diff, present in PR-time tree: vllm_omni/diffusion/models/hunyuan_image3/hunyuan_image3_transformer.py:2238 `if self.quant_config is not None and (scale_name := self.quant_config.get_cache_scale(name)):`) + +```suggestion +_STALE_API_FILES = [ + "vllm_omni/model_executor/models/hunyuan_image3/hunyuan_image3.py", + "vllm_omni/model_executor/models/mammoth_moda2/mammoth_moda2.py", + "vllm_omni/model_executor/models/mimo_audio/mimo_audio_llm.py", + "vllm_omni/model_executor/models/qwen2_5_omni/qwen2_old.py", + # TODO(#4806): add vllm_omni/diffusion/models/hunyuan_image3/hunyuan_image3_transformer.py +] +``` + +`general` [minor] — Mammoth/MiMo: old `get_cache_scale` branch removed and replaced with `get_cache_scale_mapper().apply(weights)`. Residual (Mammoth AR only): `MammothModa2ARForConditionalGeneration` subclasses `Qwen2_5_VLForConditionalGeneration` and inherits its `AutoWeightsLoader` path, so the inner mapper in `MammothModa2Qwen2ForCausalLM.load_weights` is redundant on that path and no-op on already-mapped names. (evidence: mammoth_moda2.py:540 `class MammothModa2ARForConditionalGeneration(Qwen2_5_VLForConditionalGeneration):`; mammoth_moda2.py:810-814 `loaded = self.ar.load_weights(weights)`; mammoth_moda2.py:486-489 `cache_scale_mapper = self.quant_config.get_cache_scale_mapper()` / `weights = cache_scale_mapper.apply(weights)`; mammoth_moda2.py:572-576 `self.language_model = init_vllm_registered_model(..., architectures=["MammothModa2Qwen2ForCausalLM"])`; hunyuan_image3.py:225-226 `# quant_config mapper in the outer AutoWeightsLoader.`; unchanged by this diff, present in upstream vLLM: Qwen2_5_VLForConditionalGeneration.load_weights uses `loader = AutoWeightsLoader(self)` and AutoWeightsLoader.load_weights merges `quant_config.get_cache_scale_mapper()` then `weights = mapper.apply(weights)` before `_load_module`.) + +`general` [minor] — When MammothModa2Qwen2ForCausalLM.load_weights is reached via MammothModa2ARForConditionalGeneration → Qwen2_5_VL AutoWeightsLoader, get_cache_scale_mapper runs twice (outer AutoWeightsLoader then inner load_weights). Harmless for standard .attn.{k,v,q}_scale names because upstream regexes skip already-mapped suffixes; tests only cover direct MammothModa2Qwen2ForCausalLM.load_weights. (evidence: mammoth_moda2.py:540 `class MammothModa2ARForConditionalGeneration(Qwen2_5_VLForConditionalGeneration):` — no load_weights override; inherits upstream AutoWeightsLoader path. mammoth_moda2.py:572-577 `self.language_model = init_vllm_registered_model(... architectures=["MammothModa2Qwen2ForCausalLM"],)` — child loader is MammothModa2Qwen2ForCausalLM.load_weights. mammoth_moda2.py:486-489 `cache_scale_mapper = self.quant_config.get_cache_scale_mapper()` / `weights = cache_scale_mapper.apply(weights)` — inner mapper apply. qwen2_5_vl.py:2021-2023 `loader = AutoWeightsLoader(self)` / `return loader.load_weights(weights, mapper=self.hf_to_vllm_mapper)` — outer AutoWeightsLoader entry. utils.py:411-415 `mapper |= quant_config.get_cache_scale_mapper()` / `weights = mapper.apply(weights)` — outer mapper apply before child delegation. test_kv_cache_scale_mapper.py:122-123 parametrizes `MammothModa2Qwen2ForCausalLM` in `test_direct_custom_loaders_apply_cache_scale_mapper`, not MammothModa2ARForConditionalGeneration.) + +`tests/model_executor/models/test_kv_cache_scale_mapper.py:~144` [minor] — MiMo's parametrized case in `test_direct_custom_loaders_apply_cache_scale_mapper` should feed a `model.`-prefixed cache-scale source name. Production weights are routed from `mimo_audio.py` only when `k.startswith("model.")`, and `mimo_audio_llm.load_weights` then prepends another `model.` before parameter lookup; the current unprefixed `_SOURCE_SCALE_NAME` skips that naming path. (evidence: unchanged by this diff, present in the PR-time tree: tests/model_executor/models/test_kv_cache_scale_mapper.py:22 `_SOURCE_SCALE_NAME = "layers.0.self_attn.k_proj.output_scale"`; tests/model_executor/models/test_kv_cache_scale_mapper.py:144 `loaded = load_weights(fake_model, [(_SOURCE_SCALE_NAME, torch.ones(()))])`; unchanged by this diff, present in the PR-time tree: vllm_omni/model_executor/models/mimo_audio/mimo_audio.py:708 `k.startswith("model.")`; vllm_omni/model_executor/models/mimo_audio/mimo_audio_llm.py:1157 `cache_scale_mapper = self.quant_config.get_cache_scale_mapper()`; vllm_omni/model_executor/models/mimo_audio/mimo_audio_llm.py:1162-1163 `if name.startswith("model."): name = "model." + name`) + +```suggestion +loaded = load_weights( + fake_model, + [("model." + _SOURCE_SCALE_NAME, torch.ones(()))], + ) +``` + +**Verdict:** FOLLOW-UP REQUIRED (post-merge) diff --git a/eval/dataset/arms/copilot_v20cb_val/pr4810.trace.json.gz b/eval/dataset/arms/copilot_v20cb_val/pr4810.trace.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..d6aca57e572e3c9d84fda7fd4cc26658d263773c GIT binary patch literal 25474 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 literal 0 HcmV?d00001 diff --git a/eval/dataset/arms/copilot_v20cb_val/pr4816.cost.json b/eval/dataset/arms/copilot_v20cb_val/pr4816.cost.json new file mode 100644 index 000000000..521ee183a --- /dev/null +++ b/eval/dataset/arms/copilot_v20cb_val/pr4816.cost.json @@ -0,0 +1,94 @@ +{ + "wall_s": 511.4, + "split": "val", + "rc": 0, + "run_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_val/runs/pr4816/run-20260818-112614-acb085", + "recorded_at": "2026-08-18T11:34:44", + "attempts": [ + { + "invocation_id": "inv-7ed02169", + "outcome": "run:run-20260818-112614-acb085", + "rc": 0, + "pre_run": null + }, + { + "run_dir": "run-20260818-112614-acb085", + "llm_calls": 0, + "input_tokens": 0, + "output_tokens": 0, + "usd": 0.0, + "source": "no-trace" + } + ], + "attempt_usd_total": 0.0, + "llm_calls": 0, + "input_tokens": 0, + "output_tokens": 0, + "usd": 0.0, + "source": "no-trace", + "metrics": { + "schema": 1, + "run": "run-20260818-112614-acb085", + "task_kind": "pr_review", + "status": "done", + "quality": { + "q": null, + "weight_coverage": 0.0, + "partial": true, + "abstained": false, + "components": { + "recall_w": null, + "precision_v": null, + "useful": null, + "calib": null, + "decision": null + } + }, + "cost": { + "usd": 0.1716, + "minutes": 8.49, + "ci_minutes": 0, + "input_tokens": 374847, + "output_tokens": 63988, + "tool_calls": 270, + "usd_ref": 1.0, + "min_ref": 10.0, + "cost_index": 1.354, + "cost_partial": false, + "unpriced_calls": 0, + "source": "events", + "llm_calls": null, + "by_role": null, + "cache_read_tokens": null, + "cache_creation_tokens": null + }, + "timings": { + "steps": { + "fetch": 3.39, + "gate": 1.52, + "review": 504.25, + "report": 0.06 + }, + "time_to_first_result_s": 509.25 + }, + "risk": { + "incidents": { + "catastrophic": 0, + "severe": 0, + "moderate": 0, + "minor": 0 + }, + "safety_multiplier": 1.0 + }, + "catq": null, + "tus": null, + "signals": { + "escalations": 0, + "pushes": 0, + "posted": 0, + "steps_completed": 4 + } + }, + "trace": "pr4816.trace.json.gz", + "trace_bytes": 15754 +} \ No newline at end of file diff --git a/eval/dataset/arms/copilot_v20cb_val/pr4816.md b/eval/dataset/arms/copilot_v20cb_val/pr4816.md new file mode 100644 index 000000000..583a1c281 --- /dev/null +++ b/eval/dataset/arms/copilot_v20cb_val/pr4816.md @@ -0,0 +1,49 @@ +# Run report + +- checkout: PR-TIME TREE (head e1dac23ac02c) — the tree matches the diff exactly; repo-wide greps DO reflect PR-time state + +## review_text + +**Scan:** +| Category | Result | +|---|---| +| Tests / verification | 2 finding(s) below | +| Security | no finding reported | +| Docs / comments | no finding reported | +| Behavior / compatibility | 1 finding(s) below | +| Correctness | no finding reported | + +**Validated:** +- [resolved] Stale-consumer concern: all 7 production sites + 3 test mock sites updated; checked tests/, examples/, docs/ — nothing left using old key. +- [resolved] Pure-diffusion speech error residual: `serving_tokenization=None` at api_server.py:754 while `openai_serving_speech.for_diffusion` exists — `base()` still returns None on caught ValueError; pre-existing, not introduced by rename. +- [resolved] Stale attribute name concern: fully addressed by rename; no in-repo survivors. +- [claim-verified] PR body: upstream `instrumentator.basic.tokenization()` reads `request.app.state.serving_tokenization` — confirmed at api_server.py:67 import of `base` and :376 `base(raw_request).create_error_response(...)`. +- [claim-verified] PR scope is only rename alignment; diff_stat shows 2 files, 9 insertions, 9 deletions +- [claim-verified] PR description misalignment with upstream vLLM #46022: rename matches upstream `instrumentator.basic.tokenization()` contract. + +`tests/entrypoints/openai_api/test_serving_speech.py:~2382` [minor] — This PR renames `openai_serving_tokenization` to `serving_tokenization` in `api_server.py` (init at 754/1017; `getattr` fallbacks at 1157/1248/1286/1329) and updates three handler-missing tests to set `raw_request.app.state.serving_tokenization`, but `upload_voice` `ValueError` errors go through `_create_speech_error_json_response` → `base(raw_request).create_error_response` (api_server.py:376, called from :1483). `test_api_server_upload_voice_value_error_returns_400` and sibling voice-error tests call `_patch_api_server_base`, which patches `api_server_module.base` (test_serving_speech.py:2352) and would still pass if init reverted the state attribute name. Add one sibling test that sets `raw_request.app.state.serving_tokenization` (no `base` mock) and asserts `upload_voice` `ValueError` returns HTTP 400 via the real `base()` → state chain. (evidence: test_serving_speech.py:2352 `mocker.patch.object(api_server_module, "base", return_value=fake_base)`; test_serving_speech.py:2382 `def test_api_server_upload_voice_value_error_returns_400(mocker: MockerFixture):` and :2383 `_patch_api_server_base(mocker)`; api_server.py:376 `err = base(raw_request).create_error_response(`; api_server.py:1483 `return _create_speech_error_json_response(raw_request, str(e))`; api_server.py:1017 `state.serving_tokenization = ServingTokenization(`; test_serving_speech.py:2533 `raw_request.app.state.serving_tokenization = fake_base` (also :2546, :2615 for the three updated handler-missing tests)) + +```suggestion +def test_api_server_upload_voice_value_error_uses_serving_tokenization_state(mocker: MockerFixture): + fake_tokenization = mocker.MagicMock() + fake_tokenization.create_error_response.side_effect = lambda message, **kw: ErrorResponse( + error=ErrorInfo(message=message, type=kw.get("err_type", "BadRequestError"), code=400) + ) + handler = mocker.MagicMock() + handler.upload_voice = mocker.AsyncMock(side_effect=ValueError("Could not decode audio file")) + raw_request = _make_api_server_request(handler) + raw_request.app.state.serving_tokenization = fake_tokenization + response = asyncio.run( + api_server_module.upload_voice( + raw_request, audio_sample=mocker.MagicMock(), speaker_embedding=None, + consent="c", name="probe", + ) + ) + _assert_openai_error_response(response, status_code=400, message="Could not decode audio file") +``` + +`vllm_omni/entrypoints/openai/api_server.py:~754` [nit] — Gate report shows `buildkite/vllm-omni-amd-ci`, `buildkite/vllm-omni-intel-ci`, and `buildkite/vllm-omni-npu-ci` failing at head, while this diff only touches `vllm_omni/entrypoints/openai/api_server.py` and `tests/entrypoints/openai_api/test_serving_speech.py` with no platform/kernel/config changes. Please confirm whether those CI failures are pre-existing on main and unrelated to this rename. (evidence: gate_report: 3 failing Buildkite checks; diff_stat: only tests/entrypoints/openai_api/test_serving_speech.py and vllm_omni/entrypoints/openai/api_server.py changed.) + +`vllm_omni/entrypoints/openai/api_server.py:~754` [nit] — Pure-diffusion init still sets `state.serving_tokenization = None` (api_server.py:754) while `OmniOpenAIServingSpeech.for_diffusion` remains registered (784). Voice routes that use `_create_speech_error_json_response` → `base(raw_request).create_error_response` (376-380) will raise when `serving_tokenization` is None—especially upload_voice/delete_voice exception handlers (1483-1490, 1542-1547). Pre-existing; not introduced by the rename; fine to defer a follow-up to guard that path or unify with the explicit `serving_tokenization` checks used in create_speech (1248-1252). (evidence: api_server.py:754 `state.serving_tokenization = None`; api_server.py:784 `state.openai_serving_speech = OmniOpenAIServingSpeech.for_diffusion(`; api_server.py:376-380 `err = base(raw_request).create_error_response(`; api_server.py:1483 `return _create_speech_error_json_response(raw_request, str(e))`; unchanged by this diff, upstream vllm `instrumentator/basic.py`: `def base(request: Request) -> ServingTokenization:` / `return request.app.state.serving_tokenization`) + +**Verdict:** COMMENT diff --git a/eval/dataset/arms/copilot_v20cb_val/pr4816.trace.json.gz b/eval/dataset/arms/copilot_v20cb_val/pr4816.trace.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..1ae62de7f74b3f2a926b4f18475c3e1b96ea2176 GIT binary patch literal 15754 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 literal 0 HcmV?d00001 diff --git a/eval/dataset/arms/copilot_v20cb_val/pr4837.cost.json b/eval/dataset/arms/copilot_v20cb_val/pr4837.cost.json new file mode 100644 index 000000000..5f26aa24e --- /dev/null +++ b/eval/dataset/arms/copilot_v20cb_val/pr4837.cost.json @@ -0,0 +1,94 @@ +{ + "wall_s": 411.3, + "split": "val", + "rc": 0, + "run_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_val/runs/pr4837/run-20260818-112613-1811ae", + "recorded_at": "2026-08-18T11:33:04", + "attempts": [ + { + "invocation_id": "inv-8f5cb48c", + "outcome": "run:run-20260818-112613-1811ae", + "rc": 0, + "pre_run": null + }, + { + "run_dir": "run-20260818-112613-1811ae", + "llm_calls": 0, + "input_tokens": 0, + "output_tokens": 0, + "usd": 0.0, + "source": "no-trace" + } + ], + "attempt_usd_total": 0.0, + "llm_calls": 0, + "input_tokens": 0, + "output_tokens": 0, + "usd": 0.0, + "source": "no-trace", + "metrics": { + "schema": 1, + "run": "run-20260818-112613-1811ae", + "task_kind": "pr_review", + "status": "done", + "quality": { + "q": null, + "weight_coverage": 0.0, + "partial": true, + "abstained": false, + "components": { + "recall_w": null, + "precision_v": null, + "useful": null, + "calib": null, + "decision": null + } + }, + "cost": { + "usd": 0.2377, + "minutes": 6.85, + "ci_minutes": 0, + "input_tokens": 551181, + "output_tokens": 80834, + "tool_calls": 356, + "usd_ref": 1.0, + "min_ref": 10.0, + "cost_index": 1.3401, + "cost_partial": false, + "unpriced_calls": 0, + "source": "events", + "llm_calls": null, + "by_role": null, + "cache_read_tokens": null, + "cache_creation_tokens": null + }, + "timings": { + "steps": { + "fetch": 3.96, + "gate": 1.61, + "review": 405.06, + "report": 0.08 + }, + "time_to_first_result_s": 410.68 + }, + "risk": { + "incidents": { + "catastrophic": 0, + "severe": 0, + "moderate": 0, + "minor": 0 + }, + "safety_multiplier": 1.0 + }, + "catq": null, + "tus": null, + "signals": { + "escalations": 0, + "pushes": 0, + "posted": 0, + "steps_completed": 4 + } + }, + "trace": "pr4837.trace.json.gz", + "trace_bytes": 17402 +} \ No newline at end of file diff --git a/eval/dataset/arms/copilot_v20cb_val/pr4837.md b/eval/dataset/arms/copilot_v20cb_val/pr4837.md new file mode 100644 index 000000000..ac3e10b28 --- /dev/null +++ b/eval/dataset/arms/copilot_v20cb_val/pr4837.md @@ -0,0 +1,57 @@ +# Run report + +- checkout: PR-TIME TREE (head 78cc4dcbb161) — the tree matches the diff exactly; repo-wide greps DO reflect PR-time state + +## review_text + +**Scan:** +| Category | Result | +|---|---| +| Tests / verification | 3 finding(s) below | +| Security | no finding reported | +| Docs / comments | no finding reported | +| Behavior / compatibility | no finding reported | +| Correctness | 2 finding(s) below | + +**Validated:** +- [resolved] Ming outputs[0] indexing — pre-PR pipeline_ming_imagegen.py used `output = outputs[0]` + hasattr chain; ZImagePipeline.forward returns `DiffusionOutput` directly (pipeline_z_image.py:720); PR correctly uses `outputs.output` and returns full `outputs` to keep `stage_durations` +- [resolved] Concern that unwrap only on update path was intentional — old `already_submitted and len==1` gated unwrap to `submit_update` only; residual checked: `async_chunk` prewarm for Ming uses `async_chunk: false` (ming_flash_omni_image.yaml:19) so initial-submit path is the live failure mode +- [claim-verified] PR body cites #4079 regression — commit c45ac74d introduced request-level batching and stage_pool list-prompt rejection; `already_submitted and len==1` unwrap predates this PR on main +- [claim-verified] Blast radius: other list-returning diffusion bridges (`hunyuan_image3.ar2diffusion` at hunyuan_image3.py:222) with single element also benefit; `glm_image.ar2diffusion` returns bare `dict` (glm_image.py:220) and is unaffected +- [claim-refuted] PR manual serve/curl plan — no CI job loads `vllm_omni/deploy/ming_flash_omni_image.yaml`; e2e uses `ci/ming_flash_omni_thinker_only.yaml` +- [validated] orchestrator.py:1290-1291 — removing `already_submitted` restores unwrap on initial submit; `thinker2imagegen` returns `[{"prompt": "", "extra": ...}]` (ming_flash_omni.py:435) and `submit_initial` raises on `list` (stage_pool.py:951-955) + +`vllm_omni/engine/orchestrator.py:1290` [minor] — This hunk drops the `already_submitted` guard so one-element bridge lists unwrap before the first `submit_initial` (orchestrator.py:1290–1291). Ming `thinker2imagegen` returns `[{"prompt": "", "extra": extra}]` (ming_flash_omni.py:435); `StagePool.submit_initial` rejects list prompts (stage_pool.py:951–955), which was the #4839 failure mode when unwrap only ran on updates. Existing `test_orchestrator_kv_sender_info.py` cases leave `custom_process_input_func=None` and never drive a singleton bridge list through this path—add an L2 regression that stubs the bridge to return a one-element list and asserts `diffusion_stage.calls[0]["prompt"]` is the inner dict. (evidence: orchestrator.py:1290 `if len(diffusion_prompt) == 1:`; orchestrator.py:1291 `diffusion_prompt = diffusion_prompt[0]`; orchestrator.py:1297–1298 `else: await next_pool.submit_initial(`; ming_flash_omni.py:435 `return [{"prompt": "", "extra": extra}]`; stage_pool.py:951–955 `if isinstance(request, list): raise ValueError(`; tests/engine/test_orchestrator_kv_sender_info.py:31 `custom_process_input_func = None`) + +```suggestion +def test_forward_to_diffusion_unwraps_singleton_bridge_list_on_initial_submit(): + orchestrator = object.__new__(Orchestrator) + bridge_output = [{"prompt": "", "extra": {"thinker_hidden_states": object()}}] + diffusion_stage = _DummyDiffusionStage(engine_input_source=[0]) + diffusion_stage.custom_process_input_func = lambda *_a, **_k: bridge_output + sender_pool = _build_sender_pool(0, {"host": "10.0.0.2", "zmq_port": 50151}) + diffusion_pool = StagePool(1, diffusion_stage) + orchestrator.num_stages = 2 + orchestrator.stage_pools = [sender_pool, diffusion_pool] + orchestrator._cfg_tracker = CfgCompanionTracker() + params = OmniDiffusionSamplingParams() + req_state = OrchestratorRequestState( + request_id="req-bridge", + prompt={"prompt": "draw a cat"}, + sampling_params_list=[SamplingParams(max_tokens=4), params], + final_stage_id=1, + ) + output = SimpleNamespace(request_id="req-bridge", finished=True) + asyncio.run(Orchestrator._forward_to_next_stage(orchestrator, "req-bridge", 0, output, req_state)) + assert len(diffusion_stage.calls) == 1 + assert diffusion_stage.calls[0]["prompt"] is bridge_output[0] + assert not isinstance(diffusion_stage.calls[0]["prompt"], list) +``` + +`ming_flash_omni_image.yaml:19` [minor] — Resolved concern that unwrap-on-update-only was intentional: old `already_submitted and len(diffusion_prompt) == 1` gated unwrap to submit_update; Ming deploy config sets `async_chunk: false` (vllm_omni/deploy/ming_flash_omni_image.yaml:19), so async_chunk prewarm never runs and the first diffusion handoff uses submit_initial — that is the live failure mode this PR fixes. (evidence: unchanged by this diff, present in PR-time tree: vllm_omni/deploy/ming_flash_omni_image.yaml:19 `async_chunk: false`; orchestrator.py:486-487 `if self.async_chunk and stage_id == 0 and final_stage_id > 0:` / `await self._prewarm_async_chunk_stages(request_id, prompt, req_state)`; orchestrator.py:1290-1298 `if len(diffusion_prompt) == 1:` / `diffusion_prompt = diffusion_prompt[0]` then `if already_submitted:` / `await next_pool.submit_update(...)` / `else:` / `await next_pool.submit_initial(...)`; PR diff removes `already_submitted and` from the unwrap guard at orchestrator.py ~1290) + +`vllm_omni/diffusion/models/ming_flash_omni/pipeline_ming_imagegen.py:475` [minor] — This hunk changes MingImagePipeline.forward to read `raw = outputs.output` (line 465), validate it is a torch.Tensor, and `return outputs` (line 475) instead of re-wrapping `DiffusionOutput(output=raw)` — preserving parent fields such as `stage_durations` from ZImagePipeline.forward (line 720). The diff adds no automated test for this return contract; only config-registry wiring cites MingImagePipeline (e.g. tests/test_config_factory.py). Add a mocked unit/L2 test that patches ZImagePipeline.forward to return a DiffusionOutput with `stage_durations` and asserts MingImagePipeline.forward returns that object unchanged. (evidence: unchanged by this diff, present in PR-time tree: vllm_omni/diffusion/models/z_image/pipeline_z_image.py:720 `return DiffusionOutput(output=image, stage_durations=stage_durations)`; vllm_omni/diffusion/models/ming_flash_omni/pipeline_ming_imagegen.py:465 `raw = outputs.output`; vllm_omni/diffusion/models/ming_flash_omni/pipeline_ming_imagegen.py:475 `return outputs`; tests/test_config_factory.py:1344 `assert s.model_arch == "MingImagePipeline"` (config wiring only, no forward() test)) + +`vllm_omni/engine/orchestrator.py:1290` [nit] — This diff only touches `vllm_omni/engine/orchestrator.py` (line 1290: unwrap single-element `diffusion_prompt`) and `pipeline_ming_imagegen.py` (return parent `DiffusionOutput` from `super().forward`). No AMD/NPU/platform files are in the diff — please confirm `buildkite/vllm-omni-amd-ci` / `buildkite/vllm-omni-npu-ci` failures at head are already failing on main. (evidence: merge-base diff_stat (head 78cc4dcbb161): only `vllm_omni/diffusion/models/ming_flash_omni/pipeline_ming_imagegen.py` (+3/-9) and `vllm_omni/engine/orchestrator.py` (+1/-1). vllm_omni/engine/orchestrator.py:1290 `if len(diffusion_prompt) == 1:`. vllm_omni/diffusion/models/ming_flash_omni/pipeline_ming_imagegen.py:475 `return outputs` (parent `DiffusionOutput`; unchanged by this diff vs prior `return DiffusionOutput(output=raw)`).) + +**Verdict:** COMMENT diff --git a/eval/dataset/arms/copilot_v20cb_val/pr4837.trace.json.gz b/eval/dataset/arms/copilot_v20cb_val/pr4837.trace.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..432d4f9334dafe00e8009ffc4c1f1a8ffe639711 GIT binary patch literal 17402 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 guard blocked tp2_sp2 remap — removed at parallel_state.py:882; residual: cfg=1 yields cfg-dp world_size=1 so dp_metadata correctly skipped via hunyuan_fused_moe.py:38-39 +- [claim-verified] Fixes #4885 layouts tp2_cfgp2 and tp2_sp2: perf JSONs at tests/dfx/perf/tests/test_hunyuan_image_tp2_cfgp2.json and test_hunyuan_image_tp2_sp2.json; PR reports remote 4-GPU smoke for both +- [claim-verified] PR '11 passed' matches two touched test files with 11 total test functions +- [claim-verified] PR 11 passed — not re-run here; tests are CPU mocks only +- [claim-verified] PR test plan cites 11 passed for target pytest files; not re-run in this read-only step + +`tests/diffusion/distributed/test_expert_parallel_layout.py:~100` [minor] — This PR removes the `cfg_parallel_size > 1` guard so vLLM `_PCP`/`_TP`/`_DP`/`_EP` coordinators are built via `init_vllm_model_parallel_group` whenever `use_moe_parallel_mapping` is true, including tp2_sp2 with `cfg_parallel_size=1`. `test_moe_ep_maps_diffusion_sp_cfg_dp_to_vllm_groups` (line 100) only initializes with `cfg_parallel_size=2` and `world_size=32`. Add a focused sibling test with `tensor_parallel_size=2`, `sequence_parallel_size=2`, `ulysses_degree=2`, `cfg_parallel_size=1`, `world_size=4` asserting `vllm_parallel_state._PCP is not parallel_state._SP`, vLLM coordinators have `device_communicator`, and `vllm_group_names == ["vllm_pcp", "vllm_tp", "vllm_dp", "vllm_ep"]`. (evidence: unchanged by this diff, present in PR-time tree: parallel_state.py:868 `if use_moe_parallel_mapping:`; parallel_state.py:869 `vllm_parallel_state._TP = init_vllm_model_parallel_group(`; parallel_state.py:882 `if use_moe_parallel_mapping:`; parallel_state.py:883 `vllm_parallel_state._DP = init_vllm_model_parallel_group(`; parallel_state.py has zero matches for `cfg_parallel_size > 1`; test_expert_parallel_layout.py:42 `world_size = 32`; test_expert_parallel_layout.py:106 `cfg_parallel_size=2,`; test_expert_parallel_layout.py has zero matches for `cfg_parallel_size=1`) + +```suggestion +@pytest.mark.cpu +@pytest.mark.core_model +def test_moe_ep_sp2_cfg1_builds_vllm_coordinators(monkeypatch): + """tp2_sp2 needs vLLM coordinators even when cfg_parallel_size==1.""" + # reuse _FakeGroup + fake_init_vllm_model_parallel_group from sibling test + parallel_state.initialize_model_parallel( + tensor_parallel_size=2, + sequence_parallel_size=2, + ulysses_degree=2, + ring_degree=1, + pipeline_parallel_size=1, + cfg_parallel_size=1, + data_parallel_size=1, + enable_expert_parallel=True, + backend="gloo", + ) + assert parallel_state.vllm_parallel_state._PCP is not parallel_state._SP + assert parallel_state.vllm_parallel_state._PCP.device_communicator is not None +``` + +`tests/diffusion/models/hunyuan_image3/test_hunyuan_fused_moe.py:~74` [minor] — The diff registers `_num_tokens_pre_hook` on the FusedMoE runner (hunyuan_fused_moe.py:85-93) to call `_set_forward_context_dp_metadata(hidden_states.shape[0])` before dispatch, but `test_sets_dp_metadata_from_vllm_dp_group` invokes `_set_forward_context_dp_metadata(1024)` directly at test_hunyuan_fused_moe.py:74. Consider adding a test that instantiates `HunyuanFusedMoEDefault` with a mocked `FusedMoE` runner and asserts the registered pre-hook triggers `all_gather_object` and populates `forward_context.dp_metadata`—the path vLLM 0.24 all2all dispatch actually hits. (evidence: test_hunyuan_fused_moe.py:74 `hunyuan_moe._set_forward_context_dp_metadata(1024)` — direct helper call, not via pre-hook; hunyuan_fused_moe.py:91 `_set_forward_context_dp_metadata(hidden_states.shape[0])` inside `_num_tokens_pre_hook`; hunyuan_fused_moe.py:93 `moe_runner.register_forward_pre_hook(_num_tokens_pre_hook, with_kwargs=True)` — production wiring; tests/ grep: no `register_forward_pre_hook` references outside source) + +```suggestion +def test_pre_hook_sets_dp_metadata_before_runner_forward(self, mocker): + import vllm_omni.diffusion.models.hunyuan_image3.hunyuan_fused_moe as hunyuan_moe + mock_runner = mocker.MagicMock() + mocker.patch("vllm.model_executor.layers.fused_moe.FusedMoE", return_value=mock_runner) + ... + impl = hunyuan_moe.HunyuanFusedMoEDefault(prefix="") + # invoke captured pre_hook with hidden_states shape [1024, H] + mock_all_gather.assert_called_once() +``` + +`vllm_omni/diffusion/distributed/parallel_state.py:526` [minor] — This diff adds `init_vllm_model_parallel_group`, which forwards `use_device_communicator=True` to `vllm_parallel_state.init_model_parallel_group` (parallel_state.py:520-526), but `test_expert_parallel_layout.py` monkeypatches the entire wrapper with `fake_init_vllm_model_parallel_group` (test_expert_parallel_layout.py:62-76, 92), so CI cannot catch regressions that drop that kwarg. Add a unit test patching `vllm_parallel_state.init_model_parallel_group` and asserting `use_device_communicator=True` is forwarded. (evidence: parallel_state.py:526 `use_device_communicator=True,` — wrapper forwards kwarg to upstream init; unchanged by this diff, present in PR-time tree: test_expert_parallel_layout.py:92 `monkeypatch.setattr(parallel_state, "init_vllm_model_parallel_group", fake_init_vllm_model_parallel_group)` — bypasses wrapper; test_expert_parallel_layout.py:72 `device_communicator=object(),` — fake injects communicator directly instead of relying on forwarding) + +```suggestion +def test_init_vllm_model_parallel_group_forwards_device_communicator(mocker): + mock_init = mocker.patch.object( + parallel_state.vllm_parallel_state, "init_model_parallel_group", return_value=mocker.MagicMock() + ) + parallel_state.init_vllm_model_parallel_group([[0, 1]], 0, "gloo", "tp") + mock_init.assert_called_once_with( + group_ranks=[[0, 1]], local_rank=0, backend="gloo", + group_name="tp", use_device_communicator=True, + ) +``` + +`parallel_state.py:859` [minor] — [resolved] MoE mapping no longer aliases vllm_parallel_state._PCP to diffusion _SP; parallel_state.py:859-864 builds PCP via init_vllm_model_parallel_group, and TP/DP/EP are likewise migrated under use_moe_parallel_mapping (869/885/904). (evidence: parallel_state.py:859 `vllm_parallel_state._PCP = init_vllm_model_parallel_group(` — dedicated vLLM coordinator instead of `_SP` aliasing; parallel_state.py:869 `vllm_parallel_state._TP = init_vllm_model_parallel_group(`; parallel_state.py:904 `vllm_parallel_state._EP = init_vllm_model_parallel_group(`; test_expert_parallel_layout.py:112 `assert parallel_state.vllm_parallel_state._PCP is not parallel_state._SP`) + +`general` [minor] — At merge-base, vLLM `_DP` was replaced with a cfg-dp vLLM coordinator only when `use_moe_parallel_mapping and cfg_parallel_size > 1`; head always builds it under MoE mapping. Needed for tp2_sp2 (cfg=1, SP=2, data_parallel_size=1): diffusion `_DP` stays world_size 1, but PCP/TP/EP still require vLLM coordinators with `device_communicator`/`reduce_scatter`. (evidence: PR head parallel_state.py:882 `if use_moe_parallel_mapping:` — no `cfg_parallel_size > 1` guard. PR head parallel_state.py:885 `vllm_parallel_state._DP = init_vllm_model_parallel_group(` with `group_name="dp"`. PR head parallel_state.py:810-816 diffusion DP init and alias: `_DP = init_model_parallel_group(group_ranks=rank_generator.get_ranks("dp"), ...)` then `vllm_parallel_state._DP = _DP`. PR head parallel_state.py:853-864 / 868-873 / 902-908 MoE mapping builds vLLM PCP/TP/EP via `init_vllm_model_parallel_group`. PR diff minus hunk (merge-base): `if use_moe_parallel_mapping and cfg_parallel_size > 1:` guarded vLLM `_DP` replacement. tests/dfx/perf/tests/test_hunyuan_image_tp2_sp2.json:10-12 `"tensor-parallel-size": 2`, `"ulysses-degree": 2`. vllm_omni/deploy/hunyuan_image3_dit.yaml:27 `cfg_parallel_size: 1`; data_parallel_size defaults to 1 at parallel_state.py:692.) + +`parallel_state.py:919` [minor] — destroy_model_parallel PCP/DP split cleanup — `if vllm_parallel_state._DP and vllm_parallel_state._DP is not _DP: destroy()` at parallel_state.py:919-921; PCP guard at 931-933; vLLM _TP/_EP destroy paths unchanged at 939-945 (evidence: parallel_state.py:919-921 `if vllm_parallel_state._DP and vllm_parallel_state._DP is not _DP:` / `vllm_parallel_state._DP.destroy()`; parallel_state.py:931-933 `if vllm_parallel_state._PCP and vllm_parallel_state._PCP is not _SP:` / `vllm_parallel_state._PCP.destroy()`; parallel_state.py:939-945 unchanged vLLM _TP/_EP: `if vllm_parallel_state._TP: vllm_parallel_state._TP.destroy()` and `if vllm_parallel_state._EP: vllm_parallel_state._EP.destroy()`) + +`vllm_omni/diffusion/distributed/parallel_state.py:515` [minor] — Gate report shows buildkite/vllm-omni-amd-ci and buildkite/vllm-omni-npu-ci red at PR head. Under use_moe_parallel_mapping, initialize_model_parallel now builds vLLM EP via init_vllm_model_parallel_group and exposes ranks through get_expert_parallel_group_ranks(), which NPU Hunyuan MC2 setup reads when enable_expert_parallel (platforms/npu/models/hunyuan_fused_moe.py:77-86). Can you confirm whether those lanes fail on main too or are introduced here? If NPU-specific, a cfg=1+SP EP layout smoke on NPU would close the loop. (evidence: parallel_state.py:515 `def init_vllm_model_parallel_group(`; parallel_state.py:904 `vllm_parallel_state._EP = init_vllm_model_parallel_group(`; parallel_state.py:306 `def get_expert_parallel_group_ranks() -> list[list[int]]:` and parallel_state.py:309 `return _EXPERT_PARALLEL_GROUP_RANKS`; unchanged by this diff, present in PR-time tree: vllm_omni/platforms/npu/models/hunyuan_fused_moe.py:77 `if vllm_config.parallel_config.enable_expert_parallel:` and hunyuan_fused_moe.py:85 `group_ranks=get_expert_parallel_group_ranks(),`) + +**Additional observations (beyond the comment budget):** +- `tests/dfx/perf/tests/test_hunyuan_image_tp2_sp2.json:3` [minor] Hunyuan TP2+SP2 and TP2+CfgP2 launch paths are covered by perf recipes (`tests/dfx/perf/tests/test_hunyuan_image_tp2_sp2.json`, `test_hunyuan_image_tp2_cfgp2.json`; both already set `skip-performance-assertion: true`) but neither is referenced in `.buildkite/test-nightly.yml`, unlike `test_qwen_image_vllm_omni.json`. Consider wiring a launch-only nightly job or stating these remain manual L4 runs. +- `.buildkite/test-amd-ready.yaml:19` [minor] Head shows red `buildkite/vllm-omni-amd-ci` and `buildkite/vllm-omni-npu-ci`. This PR changes `parallel_state.py` and Hunyuan MoE helpers with new/updated CPU tests under `tests/diffusion`, which are collected by the AMD gate at `.buildkite/test-amd-ready.yaml:19` (`pytest -sv tests/diffusion ... -m 'core_model and cpu'`). The NPU ready gate (`.buildkite/test-npu-ready.yaml:21`) only runs `test_qwen3_tts_customvoice.py`. Can you confirm whether the AMD failure is pre-existing on main or tied to this PR’s CPU diffusion tests? +- `tests/diffusion/distributed/test_expert_parallel_layout.py:124` [minor] The test fakes vLLM coordinators with reduce_scatter via fake_init_vllm_model_parallel_group while diffusion _SP uses fake_init_model_parallel_group without it. Lines 124-126 assert vLLM _PCP/_DP/_EP have reduce_scatter, but there is no complementary assert that diffusion _SP stays bare—add `assert not hasattr(parallel_state._SP, "reduce_scatter")` next to those checks to lock the separation described in parallel_state.py. +- `tests/diffusion/distributed/test_expert_parallel_layout.py:121` [minor] The fake wires `device_communicator` and `reduce_scatter` for every vLLM coordinator it creates (pcp/tp/dp/ep), and MoE production routes `_TP` through the same helper. Assertions at lines 121–126 cover `_PCP`, `_DP`, and `_EP` only—extend them to `vllm_parallel_state._TP` so a regression dropping `use_device_communicator` on the TP path is caught. + +**Verdict:** COMMENT diff --git a/eval/dataset/arms/copilot_v20cb_val/pr4893.trace.json.gz b/eval/dataset/arms/copilot_v20cb_val/pr4893.trace.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..5de3f14a4619cd5031557789d670e01ce006097b GIT binary patch literal 26178 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 literal 0 HcmV?d00001 diff --git a/eval/dataset/judgments/goal_v20cb_train_sonnet/JUDGE_REPORT.md b/eval/dataset/judgments/goal_v20cb_train_sonnet/JUDGE_REPORT.md new file mode 100644 index 000000000..f0fbe0f87 --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_train_sonnet/JUDGE_REPORT.md @@ -0,0 +1,51 @@ +# Judgment: copilot_v20cb_train vs claudecode_opus5 + +Judge: claude-sonnet-5 (blind, randomized order, 3 replicate(s) x 10 item(s) = 30 verdicts) + +## Wins + +- copilot_v20cb_train: 11 +- claudecode_opus5: 19 +- tie: 0 + +## Mean rubric scores + +| arm | actionability | gap_hit | precision | recall | +|---|---|---|---|---| +| claudecode_opus5 | 0.86 | 0.00 | 0.71 | 0.63 | +| copilot_v20cb_train | 0.75 | 0.00 | 0.76 | 0.63 | + +## Per-verdict detail + +| item.rep | winner | margin | rationale (head) | +|---|---|---|---| +| pr4804.r1 | claudecode_opus5 | clear | Both candidates miss linyueqian's cumulative/delta re-slice bug and the audio_tokenizer_v2.py:949 ceil/floor padding bug, but Y covers both of the two High-severity ground-truth findings substantively | +| pr4804.r2 | claudecode_opus5 | slight | Both candidates independently rediscover the two flagship ground-truth issues (slot lifecycle on abort/exhaustion, and v2-tokenizer-vs-legacy-checkpoint model_type collision) plus the WER PCM-fallback | +| pr4804.r3 | claudecode_opus5 | slight | X surfaces more of the ground truth's substantive open concerns, notably the reviewer-flagged [High] v2-tokenizer-misdetection bug (hsliuustc0106) as a top-billed major finding, plus the WER-fallback | +| pr4817.r1 | claudecode_opus5 | clear | Ground truth has no substantive concerns, so recall is vacuous for both. Both catch the key CI-blind-spot (missing pytestmark deselects the new test), but X verifies it with an actual local pytest run | +| pr4817.r2 | claudecode_opus5 | slight | Ground truth has no substantive reviewer concerns, so recall is trivially satisfied by both. Both independently catch the same critical finding (new test lacks pytestmark and is silently deselected by | +| pr4817.r3 | claudecode_opus5 | decisive | Ground truth carries no substantive concerns (bot spam, 'thanks', no inline comments), so recall is vacuous for both. Both candidates independently and correctly flag the real CI gap (new test file la | +| pr4859.r1 | copilot_v20cb_train | slight | X has broader nominal coverage and crisper remediation writing, but its 'High' finding on audio_vae.py:141 fabricates a forward-pass regression ('verified locally... max abs diff 0.083') that directly | +| pr4859.r2 | copilot_v20cb_train | slight | Both independently surface the same high-value bug the human reviewers missed (env-driven sample rate mis-decoding already-normalized 24kHz PCM in seed_tts_eval), and both hit the language/dialect-dro | +| pr4859.r3 | claudecode_opus5 | slight | Y covers more ground-truth concerns than X (audio_vae.py config-mutation risk and dropped env-var documentation are entirely absent from X but substantively addressed by Y), giving Y meaningfully high | +| pr4870.r1 | copilot_v20cb_train | slight | Both correctly recognize the diff already bakes in the qwen3_tts scoping fix and the seq_len removal, and both independently catch the async_chunk getattr default inconsistency (True vs False) that ec | +| pr4870.r2 | copilot_v20cb_train | clear | X explicitly cross-references the actual review thread's resolution status (confirming the Med gating-scope and Low fallback-robustness concerns were addressed) while surfacing a well-grounded new res | +| pr4870.r3 | copilot_v20cb_train | slight | Both candidates independently recall the ground-truth Low (async_chunk fallback robustness) concern and validate the already-resolved Med scoping fix, but neither surfaces amy-why-3459's model-placeme | +| pr4923.r1 | claudecode_opus5 | clear | Both candidates are technically detailed and well-evidenced, but Y engages more directly and more deeply with the PR's actual central controversy — the cudagraph_mode/talker_mtp_accepts_per_row_genera | +| pr4923.r2 | claudecode_opus5 | slight | Both reviews independently rediscover the two GT threads (model reading cudagraph_mode should live upstream; per-row seed breaks under full cudagraphs) plus the NPU compilation_config gap, and both ar | +| pr4923.r3 | claudecode_opus5 | clear | Both candidates ground findings in real code paths, but Y lands much closer to the actual reviewer thread: it independently reconstructs gcanlin's architectural objection to reading cudagraph_mode in | +| pr4926.r1 | copilot_v20cb_train | clear | Both cover the core live issues (Hub kernel version-pinning risk, FA3 Hopper/Blackwell gating nuance, per-layer kernel reload cost, thin test coverage), but Y grounds every claim in explicit file:line | +| pr4926.r2 | copilot_v20cb_train | slight | Both hit the two big confirmed bugs (missing SM90+ gate on FLASH_ATTN_3_HUB, and the varlen/func mismatch that piecewise_attn can crash on), and both flag the duplicated-code smell, the degenerate q=k | +| pr4926.r3 | claudecode_opus5 | clear | Both candidates go well beyond the ground truth's fairly light docs/test-marker complaints into real code-level bugs, and both independently converge on several genuine issues (uncached get_kernel() p | +| pr4950.r1 | claudecode_opus5 | clear | Ground truth has no substantive concerns (just LGTM approvals), so recall is trivially satisfied by both. X offers only two adjacent-file/process findings, one of which (README gap) is arguably underc | +| pr4950.r2 | claudecode_opus5 | slight | Ground truth is a rubber-stamp approval with zero concerns, so recall is trivially satisfied by both. X does deeper verification (traces the actual talker/serving_chat code path to dispute the PR's ow | +| pr4950.r3 | claudecode_opus5 | clear | Ground truth has no substantive concerns (just LGTM/approve), so recall is trivially satisfied by both. X goes much deeper, tracing the actual failure mode of missing use_tts_template through three fi | +| pr4970.r1 | copilot_v20cb_train | clear | Ground truth is thin (essentially 'LGTM' plus a request to split out the VoxCPM2 regression fix into a separate PR) for a trivial 2-line seed removal. X stays appropriately scoped, grounds every claim | +| pr4970.r2 | copilot_v20cb_train | clear | The only substantive ground-truth concern is Gaohan123's ask to split out the VoxCPM2 regression fix into a separate PR; X explicitly addresses this ('VoxCPM2 #4963 remainder explicitly out of scope — | +| pr4970.r3 | copilot_v20cb_train | slight | Ground truth is nearly empty (LGTM plus a tangential ask to split out a VoxCPM2 regression fix); Y explicitly validates that VoxCPM2/#4963 is out of scope and tracked separately, directly matching the | +| pr4977.r1 | claudecode_opus5 | slight | Both candidates independently surface the same underlying fact the ground truth's sole inline concern (trust_remote_code/kernels-version fragility) was already resolved by a later commit, and both fla | +| pr4977.r2 | claudecode_opus5 | slight | Both candidates correctly identify and resolve the single ground-truth concern (stale trust_remote_code claim, fixed at 9947f414) and add substantive, diff-grounded findings with file:line citations w | +| pr4977.r3 | copilot_v20cb_train | slight | Both candidates independently dug past the truncated diff and correctly identified/resolved the sole substantive ground-truth concern (trust_remote_code kwarg incompatible with pinned kernels<0.15.0), | +| pr5009.r1 | claudecode_opus5 | clear | Both candidates correctly identify the central ground-truth concern (the unconditional vllm_c default now applies globally to ~14 diffusion models validated only on Qwen-Image), but X backs it with re | +| pr5009.r2 | claudecode_opus5 | clear | The one concern still live at this diff's head is the unvalidated global default change affecting ~14 non-Qwen diffusion models — Y nails this with near-exact model list and even proposes the same fix | +| pr5009.r3 | claudecode_opus5 | clear | Y nails the ground truth's central, still-live concern almost verbatim: it names nearly the same affected-model list (flux, flux2, sd3, hunyuan_video_15, ltx2, omnigen2, wan2_2_s2v, ovis, longcat, ern | diff --git a/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4804.r1.json b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4804.r1.json new file mode 100644 index 000000000..23f029cef --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4804.r1.json @@ -0,0 +1,37 @@ +{ + "x": { + "recall": 0.32, + "precision": 0.78, + "actionability": 0.85, + "gap_hit": false + }, + "y": { + "recall": 0.52, + "precision": 0.8, + "actionability": 0.85, + "gap_hit": false + }, + "winner": "Y", + "margin": "clear", + "rationale": "Both candidates miss linyueqian's cumulative/delta re-slice bug and the audio_tokenizer_v2.py:949 ceil/floor padding bug, but Y covers both of the two High-severity ground-truth findings substantively (the stream-slot leak, explained with a deeper id-space mechanism, and the legacy-checkpoint-parses-as-v2 codec issue matching hsliuustc's report almost exactly), while X only surfaces the v2-codec issue as a buried 'minor' aside and frames the slot leak as mostly already resolved. Several findings converge independently between X and Y (max_new_frames TypeError at talker.py:1462, WER PCM fallback quality bug, NPU seq_token_counts gap), which is strong evidence both are grounded rather than fabricated, keeping precision comparable; X edges out slightly on directly diff-verifiable findings (the unconditional tts_local_seed write) and literal suggestion blocks. Both give concrete file/line findings with proposed fixes, but Y's broader and better-prioritized coverage of the real high-severity issues gives it the edge.", + "_cost_usd": 0.47207459999999996, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "copilot_v20cb_train", + "Y": "claudecode_opus5" + }, + "_roles": { + "arm": "copilot_v20cb_train", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_train", + "arm_a_sha256": "05687f47874bfd8f79375846b8e0f01fa55ed0ec4b1489dfd7465a539d9e8e91", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "18986f2736f812d8c896b12152ebcbf1d5319e9e1f79042f5fa16f1dd6272542", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 1 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4804.r2.json b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4804.r2.json new file mode 100644 index 000000000..0e36fbb42 --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4804.r2.json @@ -0,0 +1,37 @@ +{ + "x": { + "recall": 0.55, + "precision": 0.68, + "actionability": 0.85, + "gap_hit": false + }, + "y": { + "recall": 0.45, + "precision": 0.75, + "actionability": 0.85, + "gap_hit": false + }, + "winner": "X", + "margin": "slight", + "rationale": "Both candidates independently rediscover the two flagship ground-truth issues (slot lifecycle on abort/exhaustion, and v2-tokenizer-vs-legacy-checkpoint model_type collision) plus the WER PCM-fallback note, but X additionally flags the stale docstrings item from linyueqian's non-blocking notes, giving it slightly broader recall. Y compensates with a more rigorous verification methodology (explicit resolved/refuted claim-checking against the live tree), which likely yields a somewhat higher precision-to-claim ratio, but its narrower finding set and downgrading of the legacy-checkpoint issue to 'minor' (vs. ground truth's 'High') cost it recall. Both misses the two medium-severity confirmed bugs (cumulative/delta chunk_np re-slice, ceil-division length bug) and neither includes a labeled LATENT GAP CHECK section. Actionability is comparably strong on both sides with concrete file:line citations and suggested fixes.", + "_cost_usd": 0.3882611, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "claudecode_opus5", + "Y": "copilot_v20cb_train" + }, + "_roles": { + "arm": "copilot_v20cb_train", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_train", + "arm_a_sha256": "05687f47874bfd8f79375846b8e0f01fa55ed0ec4b1489dfd7465a539d9e8e91", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "18986f2736f812d8c896b12152ebcbf1d5319e9e1f79042f5fa16f1dd6272542", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 2 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4804.r3.json b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4804.r3.json new file mode 100644 index 000000000..8be27cac0 --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4804.r3.json @@ -0,0 +1,35 @@ +{ + "x": { + "recall": 0.5, + "precision": 0.68, + "actionability": 0.92 + }, + "y": { + "recall": 0.42, + "precision": 0.78, + "actionability": 0.87 + }, + "winner": "X", + "margin": "slight", + "rationale": "X surfaces more of the ground truth's substantive open concerns, notably the reviewer-flagged [High] v2-tokenizer-misdetection bug (hsliuustc0106) as a top-billed major finding, plus the WER-fallback bogus-data issue and partial docstring-staleness coverage, giving it stronger recall despite some speculative claims (e.g. Realtime yaml slot mismatch, legacy-codec streaming API) that aren't verifiable from the shown diff and cost it some precision. Y is tighter and more rigorously self-validated — it correctly identifies the abort slot-leak as already fixed on GPU and pinpoints a precise residual NPU gap, and catches a diff-verifiable finding (the qwen3_tts gate removal on tts_local_seed) — earning higher precision, but it buries the High-severity tokenizer bug as a minor 'additional observation' and misses several other line-level concerns, softening its recall. Both are highly actionable with concrete file/line evidence and proposed fixes.", + "_cost_usd": 0.380124, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "claudecode_opus5", + "Y": "copilot_v20cb_train" + }, + "_roles": { + "arm": "copilot_v20cb_train", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_train", + "arm_a_sha256": "05687f47874bfd8f79375846b8e0f01fa55ed0ec4b1489dfd7465a539d9e8e91", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "18986f2736f812d8c896b12152ebcbf1d5319e9e1f79042f5fa16f1dd6272542", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 3 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4817.r1.json b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4817.r1.json new file mode 100644 index 000000000..22e28157f --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4817.r1.json @@ -0,0 +1,37 @@ +{ + "x": { + "recall": 1.0, + "precision": 0.85, + "actionability": 0.95, + "gap_hit": false + }, + "y": { + "recall": 1.0, + "precision": 0.75, + "actionability": 0.7, + "gap_hit": false + }, + "winner": "X", + "margin": "clear", + "rationale": "Ground truth has no substantive concerns, so recall is vacuous for both. Both catch the key CI-blind-spot (missing pytestmark deselects the new test), but X verifies it with an actual local pytest run showing '18 deselected'/'18 passed' and backs every claim with concrete patches (warmup_quack_fp8 gate bypass, sticky-disable fix, warning_once dedup bug), giving it sharper actionability. Y's findings are grounded but more repetitive/formulaic, and pads with an out-of-scope pre-existing multi-GPU note duplicated across two entries, diluting precision and usefulness.", + "_cost_usd": 0.1799461, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "claudecode_opus5", + "Y": "copilot_v20cb_train" + }, + "_roles": { + "arm": "copilot_v20cb_train", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_train", + "arm_a_sha256": "5b735b7d69d020190d86617adfc062545c2c3b7cd1b9ca14a80d1c714e8448cf", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "de884ebeca54520b85a490b897397bd22bf362507bf9f7d4a833d74b390ae063", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 1 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4817.r2.json b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4817.r2.json new file mode 100644 index 000000000..76c9ca436 --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4817.r2.json @@ -0,0 +1,37 @@ +{ + "x": { + "recall": 1.0, + "precision": 0.8, + "actionability": 0.92, + "gap_hit": false + }, + "y": { + "recall": 1.0, + "precision": 0.85, + "actionability": 0.82, + "gap_hit": false + }, + "winner": "X", + "margin": "slight", + "rationale": "Ground truth has no substantive reviewer concerns, so recall is trivially satisfied by both. Both independently catch the same critical finding (new test lacks pytestmark and is silently deselected by the CI marker filter) with strong, verifiable evidence. X goes further and surfaces a genuinely important, well-argued blocking bug — warmup_quack_fp8() checks only _load_quack() and bypasses quack_enabled(), so it can still fire on gated-off sm_120 hardware — with a concrete fix, whereas Y only mentions this as a buried 'residual' note in a catch-all finding rather than flagging it clearly. Y is slightly more rigorous about citing exact evidence quotes and correctly separating pre-existing vs. PR-introduced issues, while X's CI-status claim (specific red Buildkite checks) is less grounded in the diff itself, so precision is roughly comparable with a slight edge to Y; X's clearer, code-backed fixes give it a slight actionability edge overall.", + "_cost_usd": 0.10631750000000002, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "claudecode_opus5", + "Y": "copilot_v20cb_train" + }, + "_roles": { + "arm": "copilot_v20cb_train", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_train", + "arm_a_sha256": "5b735b7d69d020190d86617adfc062545c2c3b7cd1b9ca14a80d1c714e8448cf", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "de884ebeca54520b85a490b897397bd22bf362507bf9f7d4a833d74b390ae063", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 2 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4817.r3.json b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4817.r3.json new file mode 100644 index 000000000..d4259cb9f --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4817.r3.json @@ -0,0 +1,37 @@ +{ + "x": { + "recall": 1.0, + "precision": 0.55, + "actionability": 0.6, + "gap_hit": false + }, + "y": { + "recall": 1.0, + "precision": 0.85, + "actionability": 0.9, + "gap_hit": false + }, + "winner": "Y", + "margin": "decisive", + "rationale": "Ground truth carries no substantive concerns (bot spam, 'thanks', no inline comments), so recall is vacuous for both. Both candidates independently and correctly flag the real CI gap (new test file lacks pytestmark, so it's deselected by the core_model/cpu marker filter), but Y verifies it with an actual pytest run and X buries it among several redundant/low-value 'findings' (restating the PR's own fix as a finding, pre-existing multi-GPU heterogeneity noted twice) that dilute precision and make the audit-log-style output ('[claim-verified]', 'general') harder to act on. Y additionally surfaces a genuine blocking bug X only gestures at vaguely (warmup_quack_fp8 bypassing the gate entirely), a real logging/dedup defect, and a design fix for the catastrophic per-call retry amplifier, each with concrete patches and calibrated confidence (explicitly flagging its own unverified claims like the (10,3) test case).", + "_cost_usd": 0.2870977, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "copilot_v20cb_train", + "Y": "claudecode_opus5" + }, + "_roles": { + "arm": "copilot_v20cb_train", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_train", + "arm_a_sha256": "5b735b7d69d020190d86617adfc062545c2c3b7cd1b9ca14a80d1c714e8448cf", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "de884ebeca54520b85a490b897397bd22bf362507bf9f7d4a833d74b390ae063", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 3 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4859.r1.json b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4859.r1.json new file mode 100644 index 000000000..94377cc48 --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4859.r1.json @@ -0,0 +1,37 @@ +{ + "x": { + "recall": 0.65, + "precision": 0.55, + "actionability": 0.85, + "gap_hit": false + }, + "y": { + "recall": 0.55, + "precision": 0.85, + "actionability": 0.75, + "gap_hit": false + }, + "winner": "Y", + "margin": "slight", + "rationale": "X has broader nominal coverage and crisper remediation writing, but its 'High' finding on audio_vae.py:141 fabricates a forward-pass regression ('verified locally... max abs diff 0.083') that directly contradicts ground truth: both amy-why-3459 and LHXuuu confirm the encoder's actual layer count is unchanged since it's constructed before the config mutation — a serious grounding failure for a top-billed finding. Y avoids that fabrication and its other findings (double sample-rate conversion, dialect/doc mismatch, env-var layering, patch_emission +2 semantics) are accurate and well-grounded, though it misses the audio_vae aggregator topic entirely and its suggested revert of the dialect removal is itself wrong per ground truth (LHXuuu confirms that removal was intentional). Neither includes a labeled LATENT GAP CHECK section.", + "_cost_usd": 0.5719895999999999, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "claudecode_opus5", + "Y": "copilot_v20cb_train" + }, + "_roles": { + "arm": "copilot_v20cb_train", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_train", + "arm_a_sha256": "5ecfd2073e66a06e84102081f728cde910646f5a782a5d0fa1678b5597b2f837", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "264e453d996b4a5c483bf206cefb21e513e90d0d6bda5e49948434353154f4a5", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 1 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4859.r2.json b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4859.r2.json new file mode 100644 index 000000000..3fd743c1d --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4859.r2.json @@ -0,0 +1,37 @@ +{ + "x": { + "recall": 0.8, + "precision": 0.6, + "actionability": 0.85, + "gap_hit": false + }, + "y": { + "recall": 0.65, + "precision": 0.85, + "actionability": 0.85, + "gap_hit": false + }, + "winner": "Y", + "margin": "slight", + "rationale": "Both independently surface the same high-value bug the human reviewers missed (env-driven sample rate mis-decoding already-normalized 24kHz PCM in seed_tts_eval), and both hit the language/dialect-drop and definitions.py-placement threads from the real review. X has broader topical recall (also flags the audio_vae config-mutation concern that matches amy-why-3459's GT comment), but backs that finding with a fabricated-looking 'verified locally' transformers execution trace claiming the encoder is truncated — directly contradicted by LHXuuu's actual PR clarification that the encoder is unaffected, which is a serious grounding failure for a 'High' severity claim. Y omits that topic entirely (lower recall) but is more disciplined throughout, tagging claims as verified/refuted against cited code and avoiding unverifiable execution claims, giving it cleaner precision. Actionability is comparable (both give file:line-specific fixes; Y adds literal suggestion diffs).", + "_cost_usd": 0.41808960000000006, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "claudecode_opus5", + "Y": "copilot_v20cb_train" + }, + "_roles": { + "arm": "copilot_v20cb_train", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_train", + "arm_a_sha256": "5ecfd2073e66a06e84102081f728cde910646f5a782a5d0fa1678b5597b2f837", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "264e453d996b4a5c483bf206cefb21e513e90d0d6bda5e49948434353154f4a5", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 2 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4859.r3.json b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4859.r3.json new file mode 100644 index 000000000..58f0fdea9 --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4859.r3.json @@ -0,0 +1,37 @@ +{ + "x": { + "recall": 0.45, + "precision": 0.82, + "actionability": 0.85, + "gap_hit": false + }, + "y": { + "recall": 0.75, + "precision": 0.65, + "actionability": 0.85, + "gap_hit": false + }, + "winner": "Y", + "margin": "slight", + "rationale": "Y covers more ground-truth concerns than X (audio_vae.py config-mutation risk and dropped env-var documentation are entirely absent from X but substantively addressed by Y), giving Y meaningfully higher recall. However Y's headline audio_vae finding fabricates a specific 'verified locally' test result claiming the encoder is truncated, which is directly contradicted by the actual PR maintainer's explanation (encoder layer count is unchanged, matches vendor source) — a real precision hit, compounded by likely-invented PR-history citations (#2906/#4341). X's smaller finding set is more consistently grounded in the diff with concrete suggestion blocks. Both are highly actionable with specific file/line citations and concrete fixes, so the tiebreak favors Y's superior coverage despite its fabrication flaw.", + "_cost_usd": 0.4782999, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "copilot_v20cb_train", + "Y": "claudecode_opus5" + }, + "_roles": { + "arm": "copilot_v20cb_train", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_train", + "arm_a_sha256": "5ecfd2073e66a06e84102081f728cde910646f5a782a5d0fa1678b5597b2f837", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "264e453d996b4a5c483bf206cefb21e513e90d0d6bda5e49948434353154f4a5", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 3 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4870.r1.json b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4870.r1.json new file mode 100644 index 000000000..6bd5ebf69 --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4870.r1.json @@ -0,0 +1,37 @@ +{ + "x": { + "recall": 0.35, + "precision": 0.75, + "actionability": 0.85, + "gap_hit": false + }, + "y": { + "recall": 0.55, + "precision": 0.82, + "actionability": 0.78, + "gap_hit": false + }, + "winner": "Y", + "margin": "slight", + "rationale": "Both correctly recognize the diff already bakes in the qwen3_tts scoping fix and the seq_len removal, and both independently catch the async_chunk getattr default inconsistency (True vs False) that echoes the ground-truth [Low] comment, plus the identical unfixed NPU bug. Y additionally reconstructs the spirit of the ground-truth [Med] blast-radius concern by naming the specific untested async_chunk=false models (moss_tts_nano, higgs_audio_v2, indextts2) still on DELTA coercion, and flags a real merge-gate E2E coverage gap with a concrete suggested patch — direct recall hits X doesn't match. X compensates with deeper, well-grounded original analysis (cudagraph padding root cause, list-vs-tensor consumer mismatch, WebSocket realtime path) that is highly actionable and precise but mostly orthogonal to what the human reviewers actually raised, so it helps precision/actionability more than recall. Neither candidate raises the multi-axis batch-splitting concern from the latent gap check.", + "_cost_usd": 0.2795591, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "claudecode_opus5", + "Y": "copilot_v20cb_train" + }, + "_roles": { + "arm": "copilot_v20cb_train", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_train", + "arm_a_sha256": "604e00e0e0d031df52599006d904f2f4716e04cd3044d847250b5b62c11f189e", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "03d7423c3a91e45838083e2025e3dea932f1d9448ba923b1d6ca1a0373899ea1", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 1 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4870.r2.json b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4870.r2.json new file mode 100644 index 000000000..5324279cd --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4870.r2.json @@ -0,0 +1,37 @@ +{ + "x": { + "recall": 0.6, + "precision": 0.85, + "actionability": 0.9, + "gap_hit": false + }, + "y": { + "recall": 0.4, + "precision": 0.7, + "actionability": 0.85, + "gap_hit": false + }, + "winner": "X", + "margin": "clear", + "rationale": "X explicitly cross-references the actual review thread's resolution status (confirming the Med gating-scope and Low fallback-robustness concerns were addressed) while surfacing a well-grounded new residual bug (getattr default True vs config default False) plus concrete, evidence-trailed test/CI coverage gaps with suggested patches. Y produces deeper but more speculative analysis (a padding root-cause hypothesis and an unverifiable 'AMD CI is red' claim not grounded in the diff) and never engages with the literal reviewer concerns, so it covers less of the actual ground truth despite comparable actionability. Neither candidate raises the multi-batch-axis splitting concern from the latent gap check.", + "_cost_usd": 0.4290276, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "copilot_v20cb_train", + "Y": "claudecode_opus5" + }, + "_roles": { + "arm": "copilot_v20cb_train", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_train", + "arm_a_sha256": "604e00e0e0d031df52599006d904f2f4716e04cd3044d847250b5b62c11f189e", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "03d7423c3a91e45838083e2025e3dea932f1d9448ba923b1d6ca1a0373899ea1", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 2 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4870.r3.json b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4870.r3.json new file mode 100644 index 000000000..f453302d1 --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4870.r3.json @@ -0,0 +1,37 @@ +{ + "x": { + "recall": 0.45, + "precision": 0.85, + "actionability": 0.85, + "gap_hit": false + }, + "y": { + "recall": 0.4, + "precision": 0.65, + "actionability": 0.8, + "gap_hit": false + }, + "winner": "X", + "margin": "slight", + "rationale": "Both candidates independently recall the ground-truth Low (async_chunk fallback robustness) concern and validate the already-resolved Med scoping fix, but neither surfaces amy-why-3459's model-placement question or the multi-axis latent gap. X is exceptionally disciplined, backing every claim with explicit diff-changed vs. unchanged-tree evidence citations, yielding high trust and concrete, ready-to-apply suggestions (NPU port gap, CI merge-gate coverage gap, default-value inconsistency). Y is deeper and more insightful (list-audio consumer disagreement, WebSocket realtime path) but mixes in speculative or unverifiable claims (a confident 'AMD CI is red' assertion and an unsourced '0.228-cosine mystery' reference) with no evidence trail, which drags down its precision relative to X's rigor.", + "_cost_usd": 0.39816860000000004, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "copilot_v20cb_train", + "Y": "claudecode_opus5" + }, + "_roles": { + "arm": "copilot_v20cb_train", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_train", + "arm_a_sha256": "604e00e0e0d031df52599006d904f2f4716e04cd3044d847250b5b62c11f189e", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "03d7423c3a91e45838083e2025e3dea932f1d9448ba923b1d6ca1a0373899ea1", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 3 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4923.r1.json b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4923.r1.json new file mode 100644 index 000000000..cfa796a1a --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4923.r1.json @@ -0,0 +1,37 @@ +{ + "x": { + "recall": 0.3, + "precision": 0.55, + "actionability": 0.75, + "gap_hit": false + }, + "y": { + "recall": 0.55, + "precision": 0.65, + "actionability": 0.85, + "gap_hit": false + }, + "winner": "Y", + "margin": "clear", + "rationale": "Both candidates are technically detailed and well-evidenced, but Y engages more directly and more deeply with the PR's actual central controversy — the cudagraph_mode/talker_mtp_accepts_per_row_generators design that GT reviewers (gcanlin, R2-Y) flagged, going further by showing the seed-reproducibility fix is silently broken even at batch size 1 (CUDAGraphWrapper replay behavior) and that talker_mtp_graph_safe=True is unsound on NPU — effectively root-causing the Wallbreazzz NPU crash thread rather than just noting the yaml patch exists. X covers adjacent ground (duplication of the runner's wrap decision, seed-limitation documentation, NPU yaml lacking rationale) but stays at a more surface/consolidation level and spends much of its budget on test-coverage and doc-staleness findings not present in GT. Both are concrete and actionable with file/line citations and suggested diffs, giving Y a moderate edge on recall/precision and a slight edge on actionability.", + "_cost_usd": 0.3359803, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "copilot_v20cb_train", + "Y": "claudecode_opus5" + }, + "_roles": { + "arm": "copilot_v20cb_train", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_train", + "arm_a_sha256": "eb58658a2a954e44f9ac3eb6b558b56bcc2e87a522facf8e32c7f106ac5c88c9", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "9da2d20c4c6f3ebd76201601229ebe30caa5b10534567d559eab79d6e55fdaba", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 1 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4923.r2.json b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4923.r2.json new file mode 100644 index 000000000..1821f1064 --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4923.r2.json @@ -0,0 +1,37 @@ +{ + "x": { + "recall": 0.6, + "precision": 0.75, + "actionability": 0.9, + "gap_hit": false + }, + "y": { + "recall": 0.55, + "precision": 0.85, + "actionability": 0.75, + "gap_hit": false + }, + "winner": "X", + "margin": "slight", + "rationale": "Both reviews independently rediscover the two GT threads (model reading cudagraph_mode should live upstream; per-row seed breaks under full cudagraphs) plus the NPU compilation_config gap, and both are well grounded with specific file:line citations. X edges ahead because its fix for the seed issue literally implements the follow-up refactor gcanlin asked for (move the gating into the runner, drop the model's cudagraph_mode read), and nearly every finding ships a concrete code diff, whereas Y is more conservative/precise but leans on 'consider documenting/adding a test' language more often. X's boldest claim (seed is discarded even at batch=1 due to CUDAGraphWrapper replay semantics) is plausible but unverified and slightly overreaches beyond what the human reviewer stated, which is the main drag on its precision relative to Y's more tightly evidenced claims. Y's unusual process scaffolding (Run report/Scan table/Validated bullets) adds bulk without adding findings, hurting its actionability density.", + "_cost_usd": 0.3445111, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "claudecode_opus5", + "Y": "copilot_v20cb_train" + }, + "_roles": { + "arm": "copilot_v20cb_train", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_train", + "arm_a_sha256": "eb58658a2a954e44f9ac3eb6b558b56bcc2e87a522facf8e32c7f106ac5c88c9", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "9da2d20c4c6f3ebd76201601229ebe30caa5b10534567d559eab79d6e55fdaba", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 2 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4923.r3.json b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4923.r3.json new file mode 100644 index 000000000..39f21a4bb --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4923.r3.json @@ -0,0 +1,37 @@ +{ + "x": { + "recall": 0.35, + "precision": 0.75, + "actionability": 0.75, + "gap_hit": false + }, + "y": { + "recall": 0.62, + "precision": 0.85, + "actionability": 0.85, + "gap_hit": false + }, + "winner": "Y", + "margin": "clear", + "rationale": "Both candidates ground findings in real code paths, but Y lands much closer to the actual reviewer thread: it independently reconstructs gcanlin's architectural objection to reading cudagraph_mode in modeling (comment 1, even proposing the exact runner-side fix that would let the TODO be deleted), precisely nails the seed-reproducibility regression gcanlin warned about (and sharpens it by showing CUDAGraphWrapper replay drops seeds at every batch size, not just >1), and connects talker_mtp_graph_safe=True being false on NPU to the real Wallbreazzz crash plus the failing NPU/AMD CI gates. X's findings (prefix-cache/async interaction, docs staleness, missing unit tests) are plausible but mostly tangential to what reviewers actually flagged, and it restates the same async/prefix-cache point twice, diluting precision. Y's comments also carry more concrete, root-cause-targeted code suggestions rather than generic 'add a test/doc' asks.", + "_cost_usd": 0.1927112, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "copilot_v20cb_train", + "Y": "claudecode_opus5" + }, + "_roles": { + "arm": "copilot_v20cb_train", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_train", + "arm_a_sha256": "eb58658a2a954e44f9ac3eb6b558b56bcc2e87a522facf8e32c7f106ac5c88c9", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "9da2d20c4c6f3ebd76201601229ebe30caa5b10534567d559eab79d6e55fdaba", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 3 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4926.r1.json b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4926.r1.json new file mode 100644 index 000000000..07973ffe8 --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4926.r1.json @@ -0,0 +1,35 @@ +{ + "x": { + "recall": 0.45, + "precision": 0.5, + "actionability": 0.75 + }, + "y": { + "recall": 0.55, + "precision": 0.7, + "actionability": 0.8 + }, + "winner": "Y", + "margin": "clear", + "rationale": "Both cover the core live issues (Hub kernel version-pinning risk, FA3 Hopper/Blackwell gating nuance, per-layer kernel reload cost, thin test coverage), but Y grounds every claim in explicit file:line quotes tagged 'unchanged by this diff, present in PR-time tree' and even cross-references the actual fix commits (332da8f2, deeb67af) that match the ground-truth reviewer thread almost exactly, plus independently surfaces the CI-collection/marker concern that mirrors wtomin's real inline comment. X reads as more polished but repeatedly presents suspiciously precise 'evidence' (exact Hub commit SHAs, measured warm/cold load timings, 'simulated' capability sweeps) that could not plausibly be produced from a static diff review, which is a real fabrication risk and drags down precision despite the underlying architectural points being reasonable. Neither review includes a LATENT GAP CHECK section.", + "_cost_usd": 0.3618831, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "claudecode_opus5", + "Y": "copilot_v20cb_train" + }, + "_roles": { + "arm": "copilot_v20cb_train", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_train", + "arm_a_sha256": "d1dbf8c3832158320545e603632c2cd18f949fddb250f2074402a1ca10ddb6df", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "0639263265995e00edcd06c6242ac0a6a3647a980509c282af885c86ce6930e0", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 1 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4926.r2.json b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4926.r2.json new file mode 100644 index 000000000..701b65157 --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4926.r2.json @@ -0,0 +1,35 @@ +{ + "x": { + "recall": 0.45, + "precision": 0.6, + "actionability": 0.85 + }, + "y": { + "recall": 0.55, + "precision": 0.7, + "actionability": 0.75 + }, + "winner": "Y", + "margin": "slight", + "rationale": "Both hit the two big confirmed bugs (missing SM90+ gate on FLASH_ATTN_3_HUB, and the varlen/func mismatch that piecewise_attn can crash on), and both flag the duplicated-code smell, the degenerate q=k=v test tensors, and the overstated 'perfect numerical consistency' doc claim. Y's coverage is broader and more precisely grounded — it directly ties findings to the exact GT-confirmed fixes (citing the real follow-up commits and quoting SamitHuang's actual fix logic), catches a real gap that the platform only guards ImportError of `kernels` but not failures inside `get_kernel()` itself (contradicting the docs' 'falls back gracefully' claim), and surfaces two plausible downstream-consumer misses (ltx2_transformer, diffusers_adapter) that X doesn't mention. X is more readable and its suggestions are cleanly actionable, but it pads several findings with fabricated-looking 'verified' evidence (invented timing benchmarks, HF Hub query output, live CI-lane status) that reads as hallucinated theater rather than diff-grounded analysis, which hurts trust in an otherwise solid set of findings. Neither includes a literal 'LATENT GAP CHECK' section.", + "_cost_usd": 0.25007019999999996, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "claudecode_opus5", + "Y": "copilot_v20cb_train" + }, + "_roles": { + "arm": "copilot_v20cb_train", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_train", + "arm_a_sha256": "d1dbf8c3832158320545e603632c2cd18f949fddb250f2074402a1ca10ddb6df", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "0639263265995e00edcd06c6242ac0a6a3647a980509c282af885c86ce6930e0", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 2 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4926.r3.json b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4926.r3.json new file mode 100644 index 000000000..28b68a55f --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4926.r3.json @@ -0,0 +1,37 @@ +{ + "x": { + "recall": 0.3, + "precision": 0.85, + "actionability": 0.75, + "gap_hit": false + }, + "y": { + "recall": 0.4, + "precision": 0.9, + "actionability": 0.9, + "gap_hit": false + }, + "winner": "Y", + "margin": "clear", + "rationale": "Both candidates go well beyond the ground truth's fairly light docs/test-marker complaints into real code-level bugs, and both independently converge on several genuine issues (uncached get_kernel() per attention layer, the unwrapped final get_kernel() call with no fallback, FA3-Hub's major>=9 gate wrongly admitting Blackwell) — this convergence lends credibility to both. Y more precisely recalls the ground-truth threads: it directly answers wtomin's 'what do version=1/2/default mean' question with concrete evidence (branch SHAs, actual warning text) rather than just proposing a pin, and it correctly identifies that RuixiangMa's flash_attn_func=None crash concern is only partially fixed (the piecewise path was patched but _forward_varlen_masked/_run_varlen_dense still call an unchecked varlen_func), whereas X marks that whole area '[resolved]' without noticing the masked-path gap still exists. Y's findings are also generally more verifiable/grounded (shows actual timing runs, simulated selector matrix, real repo version metadata) and read as a coherent, well-prioritized human review, while X's is comprehensive but its finding headlines are truncated/garbled ('[…]') and wrapped in denser, harder-to-parse scaffolding. X does add a few plausible unique findings (LTX-2 mask conversion, diffusers-adapter case fallthrough) that Y lacks, keeping the gap from being decisive.", + "_cost_usd": 0.4982763, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "copilot_v20cb_train", + "Y": "claudecode_opus5" + }, + "_roles": { + "arm": "copilot_v20cb_train", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_train", + "arm_a_sha256": "d1dbf8c3832158320545e603632c2cd18f949fddb250f2074402a1ca10ddb6df", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "0639263265995e00edcd06c6242ac0a6a3647a980509c282af885c86ce6930e0", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 3 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4950.r1.json b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4950.r1.json new file mode 100644 index 000000000..b2ce97eca --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4950.r1.json @@ -0,0 +1,37 @@ +{ + "x": { + "recall": 1.0, + "precision": 0.75, + "actionability": 0.6, + "gap_hit": false + }, + "y": { + "recall": 1.0, + "precision": 0.9, + "actionability": 0.9, + "gap_hit": false + }, + "winner": "Y", + "margin": "clear", + "rationale": "Ground truth has no substantive concerns (just LGTM approvals), so recall is trivially satisfied by both. X offers only two adjacent-file/process findings, one of which (README gap) is arguably undercut by the fact that file's example is SDK-based, not curl-based. Y digs much deeper into the diff's own new prose, catching a concrete inaccuracy ('silent audio' vs. the traced 500-error path) and an overbroad claim about extra_body that contradicts another recipe (GLM-Image), both with precise file:line evidence and exact suggested rewrites plus a verification command. Y's findings are more numerous, better grounded in the actual diff content, and more actionable, making it the stronger review despite being longer.", + "_cost_usd": 0.29245930000000003, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "copilot_v20cb_train", + "Y": "claudecode_opus5" + }, + "_roles": { + "arm": "copilot_v20cb_train", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_train", + "arm_a_sha256": "24b99e8934db6b4f15191280cd7fef3e1ddd05553cde67db583199bd019e915b", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "5a2e689fc33efd67adbf119f1e4cf034841928ad70fea2d99f142a727ca8ea18", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 1 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4950.r2.json b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4950.r2.json new file mode 100644 index 000000000..2bb9f62c2 --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4950.r2.json @@ -0,0 +1,37 @@ +{ + "x": { + "recall": 1.0, + "precision": 0.7, + "actionability": 0.9, + "gap_hit": false + }, + "y": { + "recall": 1.0, + "precision": 0.75, + "actionability": 0.8, + "gap_hit": false + }, + "winner": "X", + "margin": "slight", + "rationale": "Ground truth is a rubber-stamp approval with zero concerns, so recall is trivially satisfied by both. X does deeper verification (traces the actual talker/serving_chat code path to dispute the PR's own 'silent audio' wording with a specific, well-cited failure mode, and confirms the sibling README needs no fix by checking gradio_demo.py actually uses the SDK), yielding higher-value, well-grounded findings with concrete line refs and rewrites. Y is more conservative and equally well-cited but its main finding (README curl risk) is speculative and arguably contradicted by X's deeper check of the same file; both provide concrete, actionable suggestions and a reasonable CI-nit, but X's extra rigor edges it out despite the added length.", + "_cost_usd": 0.2610264, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "claudecode_opus5", + "Y": "copilot_v20cb_train" + }, + "_roles": { + "arm": "copilot_v20cb_train", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_train", + "arm_a_sha256": "24b99e8934db6b4f15191280cd7fef3e1ddd05553cde67db583199bd019e915b", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "5a2e689fc33efd67adbf119f1e4cf034841928ad70fea2d99f142a727ca8ea18", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 2 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4950.r3.json b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4950.r3.json new file mode 100644 index 000000000..5ac7065a9 --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4950.r3.json @@ -0,0 +1,37 @@ +{ + "x": { + "recall": 1.0, + "precision": 0.9, + "actionability": 0.95, + "gap_hit": false + }, + "y": { + "recall": 1.0, + "precision": 0.75, + "actionability": 0.8, + "gap_hit": false + }, + "winner": "X", + "margin": "clear", + "rationale": "Ground truth has no substantive concerns (just LGTM/approve), so recall is trivially satisfied by both. X goes much deeper, tracing the actual failure mode of missing use_tts_template through three files to show the PR's own new text ('returns silent audio') is likely wrong (it's actually a 500 via a pydantic validation bug), a finding Y misses entirely and even implicitly endorses by marking the silent-audio claim 'claim-verified.' X also scopes the overbroad extra_body claim against a contradicting recipe (GLM-Image), adds a calibrated 'checked, no change needed' section, and gives concrete rewordings/suggestions throughout. Y is competent and grounded (README inconsistency, CI-unrelated note) but shallower, with only two findings and one loosely-supported aside ('Summary still says one shot') not visible in the given diff.", + "_cost_usd": 0.1859645, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "claudecode_opus5", + "Y": "copilot_v20cb_train" + }, + "_roles": { + "arm": "copilot_v20cb_train", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_train", + "arm_a_sha256": "24b99e8934db6b4f15191280cd7fef3e1ddd05553cde67db583199bd019e915b", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "5a2e689fc33efd67adbf119f1e4cf034841928ad70fea2d99f142a727ca8ea18", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 3 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4970.r1.json b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4970.r1.json new file mode 100644 index 000000000..6143e0a03 --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4970.r1.json @@ -0,0 +1,37 @@ +{ + "x": { + "recall": 0.55, + "precision": 0.85, + "actionability": 0.5, + "gap_hit": false + }, + "y": { + "recall": 0.05, + "precision": 0.35, + "actionability": 0.75, + "gap_hit": false + }, + "winner": "X", + "margin": "clear", + "rationale": "Ground truth is thin (essentially 'LGTM' plus a request to split out the VoxCPM2 regression fix into a separate PR) for a trivial 2-line seed removal. X stays appropriately scoped, grounds every claim in quoted diff/file evidence, and directly confirms the one real reviewer concern (VoxCPM2 tracked separately, out of scope). Y produces a much longer, more actionable-looking review with concrete patches, but it hinges on an enormous number of unverifiable hyper-specific claims (exact line numbers across unrelated vLLM internals, a fabricated 3-PR seed history, doc line citations) for a PR the actual reviewers rubber-stamped, and never engages the VoxCPM2 scoping concern at all — a major groundedness and recall risk despite its polished format.", + "_cost_usd": 0.2397207, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "copilot_v20cb_train", + "Y": "claudecode_opus5" + }, + "_roles": { + "arm": "copilot_v20cb_train", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_train", + "arm_a_sha256": "39d8f83c76264f8f4b1d3eff4b8cc1b57c2258fa18392d4f278ded4fc414d472", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "410634f22ac0d9a55948ec0dfc9caa6557a8995e24766ff507dbe677d6dd37dc", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 1 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4970.r2.json b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4970.r2.json new file mode 100644 index 000000000..d02bf4cd2 --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4970.r2.json @@ -0,0 +1,37 @@ +{ + "x": { + "recall": 0.8, + "precision": 0.85, + "actionability": 0.65, + "gap_hit": false + }, + "y": { + "recall": 0.15, + "precision": 0.35, + "actionability": 0.85, + "gap_hit": false + }, + "winner": "X", + "margin": "clear", + "rationale": "The only substantive ground-truth concern is Gaohan123's ask to split out the VoxCPM2 regression fix into a separate PR; X explicitly addresses this ('VoxCPM2 #4963 remainder explicitly out of scope — PR description tracks separate bisect') while Y never mentions VoxCPM2 at all. X's other finding (CI gate question) is modest, well-scoped, and grounded with explicit file/line citations showing actual verification against the PR-time tree. Y is an impressively written but sprawling five-point review whose claims (exact internal line numbers across unrelated sampler files, specific docs content, precise throughput percentages, PR-history narratives) go far beyond what's verifiable from this trivial two-line diff and read as likely-fabricated or scope-creeping padding, which hurts precision much more than its high surface-level actionability (ready-to-paste code/test snippets) can offset.", + "_cost_usd": 0.11671860000000002, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "copilot_v20cb_train", + "Y": "claudecode_opus5" + }, + "_roles": { + "arm": "copilot_v20cb_train", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_train", + "arm_a_sha256": "39d8f83c76264f8f4b1d3eff4b8cc1b57c2258fa18392d4f278ded4fc414d472", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "410634f22ac0d9a55948ec0dfc9caa6557a8995e24766ff507dbe677d6dd37dc", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 2 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4970.r3.json b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4970.r3.json new file mode 100644 index 000000000..9d5163749 --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4970.r3.json @@ -0,0 +1,35 @@ +{ + "x": { + "recall": 0.0, + "precision": 0.5, + "actionability": 0.85 + }, + "y": { + "recall": 0.55, + "precision": 0.7, + "actionability": 0.5 + }, + "winner": "Y", + "margin": "slight", + "rationale": "Ground truth is nearly empty (LGTM plus a tangential ask to split out a VoxCPM2 regression fix); Y explicitly validates that VoxCPM2/#4963 is out of scope and tracked separately, directly matching the one real reviewer concern, while X never mentions VoxCPM2 at all. Y's claims are also more visibly grounded (explicit [validated] tags with quoted PR-time-tree evidence) versus X's much larger volume of highly specific but unverifiable technical claims (exact FlashInfer/aiter line ranges, docs line numbers, invented follow-up items) that read as scope creep for a 2-line YAML diff the actual reviewers rubber-stamped. X is far more actionable with concrete code/comment suggestions, but that doesn't offset its miss on the only real ground-truth signal and its riskier precision.", + "_cost_usd": 0.248401, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "claudecode_opus5", + "Y": "copilot_v20cb_train" + }, + "_roles": { + "arm": "copilot_v20cb_train", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_train", + "arm_a_sha256": "39d8f83c76264f8f4b1d3eff4b8cc1b57c2258fa18392d4f278ded4fc414d472", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "410634f22ac0d9a55948ec0dfc9caa6557a8995e24766ff507dbe677d6dd37dc", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 3 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4977.r1.json b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4977.r1.json new file mode 100644 index 000000000..f301880db --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4977.r1.json @@ -0,0 +1,35 @@ +{ + "x": { + "recall": 0.85, + "precision": 0.78, + "actionability": 0.85 + }, + "y": { + "recall": 0.85, + "precision": 0.85, + "actionability": 0.8 + }, + "winner": "Y", + "margin": "slight", + "rationale": "Both candidates independently surface the same underlying fact the ground truth's sole inline concern (trust_remote_code/kernels-version fragility) was already resolved by a later commit, and both flag the same secondary issues (stale PR body, uncovered test, possibly-unrelated red NPU CI check), so recall is essentially tied and full. X's strongest original catch is a genuine, diff-native correctness bug (a module missing required symbols gets cached before validation, so a bad load is 'sticky' and skips retries) and ships two ready-to-merge suggestion diffs, giving it a slight actionability edge. Y's findings are marginally more precise and cohesive: it demonstrates actual verification (stubbed kernels module, checked against installed kernels 0.16.0) and its dead-code/version-pin-mismatch finding directly deepens the exact 'kernels version compatibility' theme the human reviewer raised, whereas X's coverage of that theme mostly just reports it as already fixed. Neither has a LATENT GAP CHECK section.", + "_cost_usd": 0.2386651, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "copilot_v20cb_train", + "Y": "claudecode_opus5" + }, + "_roles": { + "arm": "copilot_v20cb_train", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_train", + "arm_a_sha256": "bafccb74b5b06fb396b4f22cbb89466da222e65825b9f072c4cea6162dc21fe3", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "589a8ff13cb3893b76dd0d5220ad632d82f46cc0edd9083528ebb2466be7c8a7", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 1 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4977.r2.json b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4977.r2.json new file mode 100644 index 000000000..29ce893f4 --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4977.r2.json @@ -0,0 +1,37 @@ +{ + "x": { + "recall": 0.9, + "precision": 0.88, + "actionability": 0.87, + "gap_hit": false + }, + "y": { + "recall": 0.9, + "precision": 0.82, + "actionability": 0.87, + "gap_hit": false + }, + "winner": "X", + "margin": "slight", + "rationale": "Both candidates correctly identify and resolve the single ground-truth concern (stale trust_remote_code claim, fixed at 9947f414) and add substantive, diff-grounded findings with file:line citations well beyond the ground truth's sparse output. Y catches one genuinely unique, valuable bug X misses (cache poisoning when a hub module lacks required symbols, with a ready-to-apply fix), but pads the review by repeating the trust_remote_code point four separate times across sections and has visibly truncated/garbled headers ('[…]'), diluting signal density. X is more concise per point, covers comparable ground (missing test coverage, sticky-failure caching, stale docs, CI gate) plus a distinctive kernels-version dead-code catch, without redundancy. Actionability is comparable — Y offers two full code suggestion blocks, X offers precise prose fixes — so the tiebreak favors X's tighter, less repetitive signal.", + "_cost_usd": 0.2401201, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "claudecode_opus5", + "Y": "copilot_v20cb_train" + }, + "_roles": { + "arm": "copilot_v20cb_train", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_train", + "arm_a_sha256": "bafccb74b5b06fb396b4f22cbb89466da222e65825b9f072c4cea6162dc21fe3", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "589a8ff13cb3893b76dd0d5220ad632d82f46cc0edd9083528ebb2466be7c8a7", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 2 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4977.r3.json b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4977.r3.json new file mode 100644 index 000000000..335c683d0 --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr4977.r3.json @@ -0,0 +1,35 @@ +{ + "x": { + "recall": 1.0, + "precision": 0.82, + "actionability": 0.9 + }, + "y": { + "recall": 1.0, + "precision": 0.72, + "actionability": 0.85 + }, + "winner": "X", + "margin": "slight", + "rationale": "Both candidates independently dug past the truncated diff and correctly identified/resolved the sole substantive ground-truth concern (trust_remote_code kwarg incompatible with pinned kernels<0.15.0), confirming it was fixed by a later commit — recall is equal and high. X's remaining findings (cache-before-validation bug, missing unit test, CI coverage gaps) are conservatively labeled with verification status and grounded in cited PR-tree state, while Y makes several bold but unverifiable claims presented as fact ('verified against the installed kernels 0.16.0' library internals, 'merged with this check failing' for NPU CI) that read as risky assertions rather than diff-grounded findings, pulling precision down. Both reviews are concrete and actionable with specific file:line citations and suggested fixes, giving X a slight overall edge.", + "_cost_usd": 0.13753030000000002, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "copilot_v20cb_train", + "Y": "claudecode_opus5" + }, + "_roles": { + "arm": "copilot_v20cb_train", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_train", + "arm_a_sha256": "bafccb74b5b06fb396b4f22cbb89466da222e65825b9f072c4cea6162dc21fe3", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "589a8ff13cb3893b76dd0d5220ad632d82f46cc0edd9083528ebb2466be7c8a7", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 3 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_train_sonnet/pr5009.r1.json b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr5009.r1.json new file mode 100644 index 000000000..71c2692a6 --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr5009.r1.json @@ -0,0 +1,37 @@ +{ + "x": { + "recall": 0.55, + "precision": 0.85, + "actionability": 0.9, + "gap_hit": false + }, + "y": { + "recall": 0.45, + "precision": 0.6, + "actionability": 0.65, + "gap_hit": false + }, + "winner": "X", + "margin": "clear", + "rationale": "Both candidates correctly identify the central ground-truth concern (the unconditional vllm_c default now applies globally to ~14 diffusion models validated only on Qwen-Image), but X backs it with real verification (ran the new tests, checked numerics/strides, traced the sole caller chain) and layers on genuinely new grounded findings (stale RoCm logic, missing Part-2 regression test, Part-1-becomes-a-no-op-for-Qwen nuance) with concrete suggested diffs. Y restates the same scope point roughly five times across 'Validated' bullets and separate 'general' findings, and several of its entries are purely confirmatory (Cosmos3 override still works) rather than actionable asks, diluting its practical value despite good citation discipline.", + "_cost_usd": 0.36509159999999996, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "claudecode_opus5", + "Y": "copilot_v20cb_train" + }, + "_roles": { + "arm": "copilot_v20cb_train", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_train", + "arm_a_sha256": "479440490faf69f773aade9ad0338400860989209a85201d20696bbef7795244", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "97e45909dc2469db55da15b6e8d6a525549029c219aefca76123ec8b801fd1bf", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 1 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_train_sonnet/pr5009.r2.json b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr5009.r2.json new file mode 100644 index 000000000..b8dec6e9c --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr5009.r2.json @@ -0,0 +1,35 @@ +{ + "x": { + "recall": 0.32, + "precision": 0.7, + "actionability": 0.6 + }, + "y": { + "recall": 0.68, + "precision": 0.78, + "actionability": 0.82 + }, + "winner": "Y", + "margin": "clear", + "rationale": "The one concern still live at this diff's head is the unvalidated global default change affecting ~14 non-Qwen diffusion models — Y nails this with near-exact model list and even proposes the same fix mechanism (_DIFFUSION_IR_OP_PRIORITY_FUNCS/registry) that hsliuustc0106 suggested, and separately reconstructs the exact 'future upstream re-sync silently regresses' risk that motivated the added test. X gestures at the same blast-radius theme but more weakly ('note in test plan') and pads its comment budget with three near-duplicate restatements of the same Part1/Part2 interaction plus two Cosmos3 confirmations, diluting distinct signal. Both are richly grounded with specific file:line evidence beyond the visible diff and give concrete, actionable remedies, but Y's findings are more diverse and better matched to what the human reviewers actually asked for.", + "_cost_usd": 0.4653736, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "copilot_v20cb_train", + "Y": "claudecode_opus5" + }, + "_roles": { + "arm": "copilot_v20cb_train", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_train", + "arm_a_sha256": "479440490faf69f773aade9ad0338400860989209a85201d20696bbef7795244", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "97e45909dc2469db55da15b6e8d6a525549029c219aefca76123ec8b801fd1bf", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 2 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_train_sonnet/pr5009.r3.json b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr5009.r3.json new file mode 100644 index 000000000..8b5daa92d --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_train_sonnet/pr5009.r3.json @@ -0,0 +1,37 @@ +{ + "x": { + "recall": 0.35, + "precision": 0.55, + "actionability": 0.5, + "gap_hit": false + }, + "y": { + "recall": 0.78, + "precision": 0.85, + "actionability": 0.85, + "gap_hit": false + }, + "winner": "Y", + "margin": "clear", + "rationale": "Y nails the ground truth's central, still-live concern almost verbatim: it names nearly the same affected-model list (flux, flux2, sd3, hunyuan_video_15, ltx2, omnigen2, wan2_2_s2v, ovis, longcat, ernie) that NumberWan later posted, and proposes the exact fix hsliuustc0106 asked for (scope via `_DIFFUSION_IR_OP_PRIORITY_FUNCS`/registry.py using Cosmos3 as precedent). It also independently surfaces that Part 2 removes all vLLM RMSNorm from the Qwen path, undercutting the PR's own P1 benchmark — a sharp, diff-grounded insight — and addresses the perf-comparison and regression-test asks with concrete, actionable follow-ups. X repeats essentially the same 'Qwen bypasses IR priority / other models untested' observation four times across 'Validated' bullets and 'general' findings without sharpening it into the scoping ask, and frames the blast radius as a 'fleet benefit' rather than the unvalidated risk ground truth flagged, diluting precision and actionability. Neither includes a LATENT GAP CHECK section.", + "_cost_usd": 0.33492220000000006, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "copilot_v20cb_train", + "Y": "claudecode_opus5" + }, + "_roles": { + "arm": "copilot_v20cb_train", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_train", + "arm_a_sha256": "479440490faf69f773aade9ad0338400860989209a85201d20696bbef7795244", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "97e45909dc2469db55da15b6e8d6a525549029c219aefca76123ec8b801fd1bf", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 3 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_val_sonnet/JUDGE_REPORT.md b/eval/dataset/judgments/goal_v20cb_val_sonnet/JUDGE_REPORT.md new file mode 100644 index 000000000..139dfcd62 --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_val_sonnet/JUDGE_REPORT.md @@ -0,0 +1,36 @@ +# Judgment: copilot_v20cb_val vs claudecode_opus5 + +Judge: claude-sonnet-5 (blind, randomized order, 3 replicate(s) x 5 item(s) = 15 verdicts) + +## Wins + +- copilot_v20cb_val: 9 +- claudecode_opus5: 6 +- tie: 0 + +## Mean rubric scores + +| arm | actionability | gap_hit | precision | recall | +|---|---|---|---|---| +| claudecode_opus5 | 0.82 | 0.23 | 0.67 | 0.67 | +| copilot_v20cb_val | 0.78 | 0.23 | 0.76 | 0.67 | + +## Per-verdict detail + +| item.rep | winner | margin | rationale (head) | +|---|---|---|---| +| pr4810.r1 | copilot_v20cb_val | slight | Both candidates independently rediscover the exact gap the human review missed — the diffusion-transformer hunyuan_image3_transformer.py:2238 still calling the removed get_cache_scale API — and both g | +| pr4810.r2 | claudecode_opus5 | clear | Both candidates independently surface the same latent gap (hunyuan_image3_transformer.py:2238 still calling the removed get_cache_scale API, later #4891), so gap_hit is true for both. Y additionally r | +| pr4810.r3 | claudecode_opus5 | clear | Both independently surface the exact latent gap (hunyuan_image3_transformer.py:2238 still calling the removed get_cache_scale API), with specific reachability chains through the pipeline/AutoWeightsLo | +| pr4816.r1 | claudecode_opus5 | slight | Ground truth has zero substantive concerns (a blank codex-limits notice and a plain 'lgtm' approval), so recall is trivially satisfied by both. Both candidates independently converge on the same real, | +| pr4816.r2 | copilot_v20cb_val | slight | Ground truth is empty (bot rate-limit notice plus a bare 'lgtm'), so recall is vacuous for both. Both candidates independently converge on the same real findings — the residual pure-diffusion serving_ | +| pr4816.r3 | copilot_v20cb_val | slight | Ground truth is an empty/mechanical PR (bot rate-limit notice + human 'lgtm'), so recall is vacuous for both. Both candidates independently surface the same real, diff-grounded core issue (tests mock | +| pr4825.r1 | copilot_v20cb_val | clear | The real GT thread centers on dsocek questioning whether the naming/mapping fix is comprehensive (suggesting driving it from packed_modules_mapping) and tthakkal responding by removing that companion | +| pr4825.r2 | copilot_v20cb_val | slight | Y's headline finding — the reverted to_out.0 WeightsMapper normalization at ac3a2ce5 — directly reconstructs the specific change tthakkal says he removed to 'keep this PR specific to sdxl support,' an | +| pr4825.r3 | copilot_v20cb_val | clear | The ground-truth thread's core substance is dsocek questioning a narrower naming-conflict workaround and tthakkal responding 'I will remove this change and keep this PR specific to sdxl support' — Y's | +| pr4837.r1 | copilot_v20cb_val | clear | Both candidates land the one real ground-truth concern (already_submitted removal is safe because both submit_initial and submit_update reject list prompts), with comparable actionability via concrete | +| pr4837.r2 | copilot_v20cb_val | decisive | Both candidates independently converge on the same core mechanism the ground-truth inline comment makes (submit_initial and submit_update both reject list prompts, so gating the unwrap on already_subm | +| pr4837.r3 | copilot_v20cb_val | clear | Both candidates correctly reconstruct the core ground-truth insight (already_submitted was gating unwrap even though both submit_initial and submit_update reject list prompts, so the distinction was m | +| pr4893.r1 | claudecode_opus5 | clear | The ground truth is thin (mostly off-topic PR chatter plus one inline ask to extend reduce_scatter test verification, which the diff already appears to satisfy); X engages that exact test region more | +| pr4893.r2 | claudecode_opus5 | clear | Ground truth is thin (essentially one concern: the new hasattr(reduce_scatter)/device_communicator assertions don't really verify the fix). Both X and Y independently converge on this exact gap (X's p | +| pr4893.r3 | claudecode_opus5 | clear | Ground truth is thin (one inline ask to verify reduce_scatter in the test), and X engages it most directly by showing those new hasattr assertions test the mock's own injected attributes rather than t | diff --git a/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4810.r1.json b/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4810.r1.json new file mode 100644 index 000000000..001adcc40 --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4810.r1.json @@ -0,0 +1,37 @@ +{ + "x": { + "recall": 0.45, + "precision": 0.75, + "actionability": 0.85, + "gap_hit": true + }, + "y": { + "recall": 0.55, + "precision": 0.8, + "actionability": 0.85, + "gap_hit": true + }, + "winner": "Y", + "margin": "slight", + "rationale": "Both candidates independently rediscover the exact gap the human review missed — the diffusion-transformer hunyuan_image3_transformer.py:2238 still calling the removed get_cache_scale API — and both give concrete, actionable fixes. Y edges ahead on recall by explicitly endorsing keeping the regression test (mirroring the ground truth's '+1 on keeping the regression test') and traces a deeper Mammoth AR inheritance path issue, while grounding every claim in quoted file:line evidence. X's review is also well-verified (ran tests locally, cites vLLM internals) but its unverifiable claim about specific CI gates being red is an ungrounded risk, and it misses the qwen2_old getattr-cleanup nuance and the explicit test-retention endorsement that Y captures.", + "_cost_usd": 0.2801225, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "claudecode_opus5", + "Y": "copilot_v20cb_val" + }, + "_roles": { + "arm": "copilot_v20cb_val", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_val", + "arm_a_sha256": "87e3c276c5df2682b6b29b2405606b24368d5ace131cf1c2c50e48e5a263f9e9", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "62ede4acd697d051f739a163828672d894ec4150b7b17c941bb4b33f4b81409e", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 1 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4810.r2.json b/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4810.r2.json new file mode 100644 index 000000000..01b1961d6 --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4810.r2.json @@ -0,0 +1,37 @@ +{ + "x": { + "recall": 0.35, + "precision": 0.7, + "actionability": 0.8, + "gap_hit": true + }, + "y": { + "recall": 0.55, + "precision": 0.85, + "actionability": 0.85, + "gap_hit": true + }, + "winner": "Y", + "margin": "clear", + "rationale": "Both candidates independently surface the same latent gap (hunyuan_image3_transformer.py:2238 still calling the removed get_cache_scale API, later #4891), so gap_hit is true for both. Y additionally reconstructs the reasoning a careful reviewer would need — it verifies default_weight_loader's scalar handling, maybe_remap_kv_scale_name's pass-through behavior, and AutoWeightsLoader's child-scanning — which closely mirrors and substantiates the ground-truth reviewer's 'correct migration' verdict, and its critique that the delegated-loader test never actually exercises AutoWeightsLoader (only the inner loader) directly echoes the human reviewer's concern that tests validate 'called' but not 'resolves against real registered params.' X's findings (double-mapper-apply speculation, stale test list, MiMo prefix) are grounded but narrower, more duplicative (two near-identical entries on the mammoth double-apply concern), and includes a specific tracking-issue number (#4806) that may be fabricated/incorrect against the real #4891. Both are reasonably actionable with concrete file/line suggestions, but Y's review is more comprehensive and better corroborates ground truth.", + "_cost_usd": 0.2485425, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "copilot_v20cb_val", + "Y": "claudecode_opus5" + }, + "_roles": { + "arm": "copilot_v20cb_val", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_val", + "arm_a_sha256": "87e3c276c5df2682b6b29b2405606b24368d5ace131cf1c2c50e48e5a263f9e9", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "62ede4acd697d051f739a163828672d894ec4150b7b17c941bb4b33f4b81409e", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 2 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4810.r3.json b/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4810.r3.json new file mode 100644 index 000000000..e27ce9d0f --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4810.r3.json @@ -0,0 +1,37 @@ +{ + "x": { + "recall": 0.4, + "precision": 0.75, + "actionability": 0.75, + "gap_hit": true + }, + "y": { + "recall": 0.6, + "precision": 0.8, + "actionability": 0.85, + "gap_hit": true + }, + "winner": "Y", + "margin": "clear", + "rationale": "Both independently surface the exact latent gap (hunyuan_image3_transformer.py:2238 still calling the removed get_cache_scale API), with specific reachability chains through the pipeline/AutoWeightsLoader, so gap_hit is true for both. But Y goes further on the one substantive concern the human reviewer actually raised — that the tests use fakes and don't prove real-checkpoint/mapper fidelity — hitting it from five angles (CI not wired up, hardcoded allowlist, misleading test name, hand-rolled mapper diverging from the real WeightsMapper API, unrealistic MiMo naming) plus verifying the safe-removal claims against actual vLLM source (default_weight_loader, maybe_remap_kv_scale_name) and reporting an actual local test run. X's review is comparably well-grounded on the gap finding but padded with two near-duplicate 'general' findings about the same AR double-mapper nit, and covers the test-realism theme with only one finding versus Y's five, giving it materially lower recall against the ground-truth review's core critique. Both are concrete and file/line-anchored, but Y's clearer verdict-first structure and explicit fix snippets edge out X's denser, more redundant format on actionability.", + "_cost_usd": 0.12163370000000001, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "copilot_v20cb_val", + "Y": "claudecode_opus5" + }, + "_roles": { + "arm": "copilot_v20cb_val", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_val", + "arm_a_sha256": "87e3c276c5df2682b6b29b2405606b24368d5ace131cf1c2c50e48e5a263f9e9", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "62ede4acd697d051f739a163828672d894ec4150b7b17c941bb4b33f4b81409e", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 3 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4816.r1.json b/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4816.r1.json new file mode 100644 index 000000000..4a4036951 --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4816.r1.json @@ -0,0 +1,37 @@ +{ + "x": { + "recall": 1.0, + "precision": 0.75, + "actionability": 0.9, + "gap_hit": false + }, + "y": { + "recall": 1.0, + "precision": 0.8, + "actionability": 0.85, + "gap_hit": false + }, + "winner": "X", + "margin": "slight", + "rationale": "Ground truth has zero substantive concerns (a blank codex-limits notice and a plain 'lgtm' approval), so recall is trivially satisfied by both. Both candidates independently converge on the same real, diff-grounded issues (untested `base()` coupling in the voice-error tests, the pure-diffusion `serving_tokenization=None` residual, and unverifiable CI gate failures), which is a strong precision signal, though X frames the pre-existing diffusion-mode gap as if the PR itself falls short rather than clearly labeling it pre-existing as Y does, and X's item 4 is openly speculative. X edges ahead on actionability by providing a concrete code fix for the helper function in addition to a test, whereas Y only proposes a test and duplicates its own finding between the Validated section and the nit list.", + "_cost_usd": 0.2584382, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "claudecode_opus5", + "Y": "copilot_v20cb_val" + }, + "_roles": { + "arm": "copilot_v20cb_val", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_val", + "arm_a_sha256": "ea9b83a5feab151e43dd0c58f0d51c50187342f0ac98d60187ec7e9653f753b2", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "b9fe4c00140a73cf5cc08ceded6d03eb8b8faea45f6c3b50e6f9753b9a1a1a01", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 1 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4816.r2.json b/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4816.r2.json new file mode 100644 index 000000000..3c280e180 --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4816.r2.json @@ -0,0 +1,37 @@ +{ + "x": { + "recall": 1.0, + "precision": 0.72, + "actionability": 0.9, + "gap_hit": false + }, + "y": { + "recall": 1.0, + "precision": 0.87, + "actionability": 0.85, + "gap_hit": false + }, + "winner": "Y", + "margin": "slight", + "rationale": "Ground truth is empty (bot rate-limit notice plus a bare 'lgtm'), so recall is vacuous for both. Both candidates independently converge on the same real findings — the residual pure-diffusion serving_tokenization=None path and the untested real-base() error path — which cross-validates those as genuine rather than fabricated. X is more actionable (ships a concrete helper-function fix and inline test code) but pads its review with many unverifiable external claims (upstream file/line citations, Docker pin details, a speculative sibling-rename sweep) and is internally inconsistent, labeling a residual issue 'blocking-ish' while still verdicting Approve. Y stays tighter to the diff, cites evidence lines for every claim, correctly identifies the diffusion-mode issue as pre-existing/nit rather than a regression, and its COMMENT verdict is better calibrated to what is otherwise a clean mechanical rename.", + "_cost_usd": 0.18368540000000003, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "claudecode_opus5", + "Y": "copilot_v20cb_val" + }, + "_roles": { + "arm": "copilot_v20cb_val", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_val", + "arm_a_sha256": "ea9b83a5feab151e43dd0c58f0d51c50187342f0ac98d60187ec7e9653f753b2", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "b9fe4c00140a73cf5cc08ceded6d03eb8b8faea45f6c3b50e6f9753b9a1a1a01", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 2 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4816.r3.json b/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4816.r3.json new file mode 100644 index 000000000..81d900405 --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4816.r3.json @@ -0,0 +1,37 @@ +{ + "x": { + "recall": 1.0, + "precision": 0.55, + "actionability": 0.75, + "gap_hit": false + }, + "y": { + "recall": 1.0, + "precision": 0.8, + "actionability": 0.75, + "gap_hit": false + }, + "winner": "Y", + "margin": "slight", + "rationale": "Ground truth is an empty/mechanical PR (bot rate-limit notice + human 'lgtm'), so recall is vacuous for both. Both candidates independently surface the same real, diff-grounded core issue (tests mock `base()` so they never exercise the real `serving_tokenization` state path) and the same pre-existing diffusion-mode None gap, with concrete file/line evidence and code suggestions. X goes further with speculative Dockerfile version-pin sleuthing and a 'follow-up' about sibling renames sourced from a locally-installed vLLM 0.26.0 that it admits doesn't match the pinned 0.24.0 — padding that isn't grounded in the diff and lowers precision, and its 'blocking-ish' framing overstates severity for a pre-existing, already-approved change. Y's findings stay tighter, correctly labels the diffusion issue as pre-existing/nit, and offers a ready-to-apply GitHub suggestion block, better matching the actual low-severity outcome.", + "_cost_usd": 0.1336847, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "claudecode_opus5", + "Y": "copilot_v20cb_val" + }, + "_roles": { + "arm": "copilot_v20cb_val", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_val", + "arm_a_sha256": "ea9b83a5feab151e43dd0c58f0d51c50187342f0ac98d60187ec7e9653f753b2", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "b9fe4c00140a73cf5cc08ceded6d03eb8b8faea45f6c3b50e6f9753b9a1a1a01", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 3 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4825.r1.json b/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4825.r1.json new file mode 100644 index 000000000..21732b221 --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4825.r1.json @@ -0,0 +1,37 @@ +{ + "x": { + "recall": 0.25, + "precision": 0.6, + "actionability": 0.85, + "gap_hit": false + }, + "y": { + "recall": 0.45, + "precision": 0.75, + "actionability": 0.75, + "gap_hit": false + }, + "winner": "Y", + "margin": "clear", + "rationale": "The real GT thread centers on dsocek questioning whether the naming/mapping fix is comprehensive (suggesting driving it from packed_modules_mapping) and tthakkal responding by removing that companion change to keep the PR SDXL-only. Y's top finding (the reverted to_out.0 WeightsMapper at manager.py:309, tied to commit ac3a2ce5) directly reconstructs this exact history and flags it as an open, unconfirmed gap — a strong recall/precision hit. X notices the same revert but confidently declares it 'correctly reverted, good call, don't reinstate,' which reads as a dismissal of the very concern the real reviewers left unresolved, and X also asserts '_lora_components has zero users in the entire repo,' which Y directly contradicts with a concrete counter-example (pipeline_sensenova_u1.py:543) — a clear factual error hurting X's precision. X is more conventionally formatted and has slightly crisper actionable suggestions across more findings, but several (FF-layer remap, text-encoder LoRA failure) are unverifiable speculative extensions beyond PR scope, while Y's sparser findings are each backed by explicit grep verification and quoted evidence. Neither includes a LATENT GAP CHECK section.", + "_cost_usd": 0.2944165, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "claudecode_opus5", + "Y": "copilot_v20cb_val" + }, + "_roles": { + "arm": "copilot_v20cb_val", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_val", + "arm_a_sha256": "01af7bfbb2b84fa2ced47b92b26a0bcf159b5908df7daca668c6df10a2a71703", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "9201be5ea408a41833fb8e6040e5eb97d26044159a083e4d1896451ac3585494", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 1 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4825.r2.json b/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4825.r2.json new file mode 100644 index 000000000..e8ed463fb --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4825.r2.json @@ -0,0 +1,37 @@ +{ + "x": { + "recall": 0.3, + "precision": 0.55, + "actionability": 0.8, + "gap_hit": false + }, + "y": { + "recall": 0.5, + "precision": 0.7, + "actionability": 0.7, + "gap_hit": false + }, + "winner": "Y", + "margin": "slight", + "rationale": "Y's headline finding — the reverted to_out.0 WeightsMapper normalization at ac3a2ce5 — directly reconstructs the specific change tthakkal says he removed to 'keep this PR specific to sdxl support,' and Y's _dit_modules/_lora_components suggestion echoes dsocek's ask to drive component detection from existing metadata rather than a hardcoded tuple; claims are hedged and evidence-quoted rather than asserted as fact. X's parallel _dit_modules point covers similar ground but the review asserts as fact that CI lanes are 'red' with no diff-grounded basis, and speculative findings (FF-layer renames, text-encoder hard-fail) extend well beyond verifiable PR scope, weakening precision despite strong code-level actionability.", + "_cost_usd": 0.1143382, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "claudecode_opus5", + "Y": "copilot_v20cb_val" + }, + "_roles": { + "arm": "copilot_v20cb_val", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_val", + "arm_a_sha256": "01af7bfbb2b84fa2ced47b92b26a0bcf159b5908df7daca668c6df10a2a71703", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "9201be5ea408a41833fb8e6040e5eb97d26044159a083e4d1896451ac3585494", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 2 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4825.r3.json b/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4825.r3.json new file mode 100644 index 000000000..d4e74ad0a --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4825.r3.json @@ -0,0 +1,37 @@ +{ + "x": { + "recall": 0.3, + "precision": 0.55, + "actionability": 0.8, + "gap_hit": false + }, + "y": { + "recall": 0.5, + "precision": 0.75, + "actionability": 0.7, + "gap_hit": false + }, + "winner": "Y", + "margin": "clear", + "rationale": "The ground-truth thread's core substance is dsocek questioning a narrower naming-conflict workaround and tthakkal responding 'I will remove this change and keep this PR specific to sdxl support' — Y's top finding independently reconstructs exactly this (citing commit ac3a2ce5, the reverted WeightsMapper for to_out.0, and the deleted test), a precise recall hit with hedged, well-evidenced framing. X notices the same revert but asserts it was 'correctly reverted — good call, don't reinstate it,' which mischaracterizes a scope decision as a settled technical non-issue and anchors several other deep, unverifiable extrapolations (FF-layer weight drop, text-encoder hard-fail, CI-red claims) that the actual approving reviewers never raised, softening X's precision despite strong actionable code suggestions. Both lack a LATENT GAP CHECK section.", + "_cost_usd": 0.1553932, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "claudecode_opus5", + "Y": "copilot_v20cb_val" + }, + "_roles": { + "arm": "copilot_v20cb_val", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_val", + "arm_a_sha256": "01af7bfbb2b84fa2ced47b92b26a0bcf159b5908df7daca668c6df10a2a71703", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "9201be5ea408a41833fb8e6040e5eb97d26044159a083e4d1896451ac3585494", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 3 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4837.r1.json b/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4837.r1.json new file mode 100644 index 000000000..403c98326 --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4837.r1.json @@ -0,0 +1,37 @@ +{ + "x": { + "recall": 0.85, + "precision": 0.55, + "actionability": 0.85, + "gap_hit": false + }, + "y": { + "recall": 0.85, + "precision": 0.78, + "actionability": 0.85, + "gap_hit": false + }, + "winner": "Y", + "margin": "clear", + "rationale": "Both candidates land the one real ground-truth concern (already_submitted removal is safe because both submit_initial and submit_update reject list prompts), with comparable actionability via concrete line refs and suggested fixes/tests. X's centerpiece 'blocker' — that super().forward() no longer binds because an unrelated prior PR (#1235) truncated ZImagePipeline's signature — is an elaborate, highly specific claim (fabricated-looking commit hashes, a simulated 'confirmed at runtime' REPL trace) that two human approvers and CI apparently didn't catch, and is internally inconsistent since X separately attributes the red CI checks to platform issues rather than this supposed universal TypeError; this drags precision down hard since it's the review's dominant claim. Y stays more conservative, sticking closer to diff-grounded evidence (StagePool rejection lines, async_chunk config, existing test files) and asking for tests rather than asserting an unverified catastrophic break, making it more trustworthy despite its awkward tool-output formatting.", + "_cost_usd": 0.24503450000000002, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "claudecode_opus5", + "Y": "copilot_v20cb_val" + }, + "_roles": { + "arm": "copilot_v20cb_val", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_val", + "arm_a_sha256": "9276bba9304e9e0b4b0f64f118bbce9907275a18450802e9e5f6a77e20d3cf8f", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "bc98460632105aef812a50d392afd9f1bea66b3f783e8a9cd888456ce013cba3", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 1 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4837.r2.json b/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4837.r2.json new file mode 100644 index 000000000..73523070b --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4837.r2.json @@ -0,0 +1,37 @@ +{ + "x": { + "recall": 0.9, + "precision": 0.8, + "actionability": 0.85, + "gap_hit": false + }, + "y": { + "recall": 0.85, + "precision": 0.3, + "actionability": 0.7, + "gap_hit": false + }, + "winner": "X", + "margin": "decisive", + "rationale": "Both candidates independently converge on the same core mechanism the ground-truth inline comment makes (submit_initial and submit_update both reject list prompts, so gating the unwrap on already_submitted was wrong), giving both solid recall. But Y builds its entire verdict around a 'blocker' claiming super().forward() no longer binds due to an invented upstream PR #1235 signature change, plus asserts CI is red without verification — a serious, unverified/likely-fabricated claim that flatly contradicts two real human approvals (LGTM) and tanks precision. X's findings stay grounded in the actual diff, hedge appropriately (e.g., asking to confirm rather than asserting CI failures), and its COMMENT verdict is far more consistent with the ground truth's LGTM outcome.", + "_cost_usd": 0.1799945, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "copilot_v20cb_val", + "Y": "claudecode_opus5" + }, + "_roles": { + "arm": "copilot_v20cb_val", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_val", + "arm_a_sha256": "9276bba9304e9e0b4b0f64f118bbce9907275a18450802e9e5f6a77e20d3cf8f", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "bc98460632105aef812a50d392afd9f1bea66b3f783e8a9cd888456ce013cba3", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 2 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4837.r3.json b/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4837.r3.json new file mode 100644 index 000000000..48591078d --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4837.r3.json @@ -0,0 +1,37 @@ +{ + "x": { + "recall": 0.85, + "precision": 0.55, + "actionability": 0.7, + "gap_hit": false + }, + "y": { + "recall": 0.75, + "precision": 0.88, + "actionability": 0.9, + "gap_hit": false + }, + "winner": "Y", + "margin": "clear", + "rationale": "Both candidates correctly reconstruct the core ground-truth insight (already_submitted was gating unwrap even though both submit_initial and submit_update reject list prompts, so the distinction was meaningless), with X stating it slightly more precisely. But X's review is built roughly half around an elaborate 'blocker' claim that super().forward() no longer binds due to an unrelated upstream signature refactor, complete with fabricated-sounding runtime verification and commit archaeology not derivable from the diff — a claim contradicted by the two real LGTM approvals and by the diff itself only adding a type annotation to a preexisting call. That drags X's precision and the trustworthiness of its 'Request changes' verdict down substantially. Y stays tightly grounded in the actual diff and directly adjacent files (stage_pool.py, ming_flash_omni.py, deploy yaml), backs claims with concrete evidence and a ready-to-use regression test, and lands on a COMMENT verdict consistent with the real outcome, making it the safer and more useful review despite slightly lower recall on the exact phrasing of the ground-truth rationale.", + "_cost_usd": 0.1409927, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "claudecode_opus5", + "Y": "copilot_v20cb_val" + }, + "_roles": { + "arm": "copilot_v20cb_val", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_val", + "arm_a_sha256": "9276bba9304e9e0b4b0f64f118bbce9907275a18450802e9e5f6a77e20d3cf8f", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "bc98460632105aef812a50d392afd9f1bea66b3f783e8a9cd888456ce013cba3", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 3 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4893.r1.json b/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4893.r1.json new file mode 100644 index 000000000..01b03ce75 --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4893.r1.json @@ -0,0 +1,35 @@ +{ + "x": { + "recall": 0.55, + "precision": 0.7, + "actionability": 0.6 + }, + "y": { + "recall": 0.3, + "precision": 0.85, + "actionability": 0.85 + }, + "winner": "Y", + "margin": "clear", + "rationale": "The ground truth is thin (mostly off-topic PR chatter plus one inline ask to extend reduce_scatter test verification, which the diff already appears to satisfy); X engages that exact test region more directly by proposing extending device_communicator/reduce_scatter assertions to _TP, giving it a slight recall edge there. But Y surfaces several substantive, well-grounded correctness bugs the diff actually introduces — the DP-metadata hook gated on world_size rather than on the MoE mapping being active, a plausible collective hang under CFG parallelism with an honest caveat about pre-existing brokenness, and a stale data_parallel_rank — each traced through real vLLM internals with concrete fixes, whereas X's findings are largely mechanical 'add more tests' suggestions dressed in heavy evidence-citation formatting without comparable depth. Y's higher precision and actionability outweigh its lower literal alignment with the sparse ground truth.", + "_cost_usd": 0.37095019999999995, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "copilot_v20cb_val", + "Y": "claudecode_opus5" + }, + "_roles": { + "arm": "copilot_v20cb_val", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_val", + "arm_a_sha256": "75c16566b4cc8cc6dd9a68bac5a8708d6e6071a3ff6003ec3a9d9c6aab6fe778", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "0d4ddd4027e23f1f32216e748289588ea9a0e74ee8e599fa34b9d50f503d2f0d", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 1 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4893.r2.json b/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4893.r2.json new file mode 100644 index 000000000..c857ce044 --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4893.r2.json @@ -0,0 +1,37 @@ +{ + "x": { + "recall": 0.65, + "precision": 0.6, + "actionability": 0.85, + "gap_hit": false + }, + "y": { + "recall": 0.9, + "precision": 0.85, + "actionability": 0.8, + "gap_hit": false + }, + "winner": "Y", + "margin": "clear", + "rationale": "Ground truth is thin (essentially one concern: the new hasattr(reduce_scatter)/device_communicator assertions don't really verify the fix). Both X and Y independently converge on this exact gap (X's parallel_state.py:526 item and additional observations; Y's #6 'assertions test the mock, not the code'), but Y's version pinpoints the same lines (121-126) the human flagged and explains precisely why the fake defeats the assertion. Y also surfaces a genuine diff-grounded logic bug X missed entirely: the DP-metadata gating in hunyuan_fused_moe.py checks world_size but not whether the MoE mapping is active, which X's own review waved through as 'correctly skipped' — an incorrect validation that hurts X's precision. Y's remaining findings (CFG-rank hang risk, unset data_parallel_rank, dead branch) are deeper and more consequential than X's mostly test-coverage/confirmatory padding. X's ready-to-paste ```suggestion``` blocks give it a slight actionability edge, but Y wins clearly on recall and precision.", + "_cost_usd": 0.3715012, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "copilot_v20cb_val", + "Y": "claudecode_opus5" + }, + "_roles": { + "arm": "copilot_v20cb_val", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_val", + "arm_a_sha256": "75c16566b4cc8cc6dd9a68bac5a8708d6e6071a3ff6003ec3a9d9c6aab6fe778", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "0d4ddd4027e23f1f32216e748289588ea9a0e74ee8e599fa34b9d50f503d2f0d", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 2 + } +} \ No newline at end of file diff --git a/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4893.r3.json b/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4893.r3.json new file mode 100644 index 000000000..95902332c --- /dev/null +++ b/eval/dataset/judgments/goal_v20cb_val_sonnet/pr4893.r3.json @@ -0,0 +1,35 @@ +{ + "x": { + "recall": 0.8, + "precision": 0.8, + "actionability": 0.9 + }, + "y": { + "recall": 0.6, + "precision": 0.65, + "actionability": 0.65 + }, + "winner": "X", + "margin": "clear", + "rationale": "Ground truth is thin (one inline ask to verify reduce_scatter in the test), and X engages it most directly by showing those new hasattr assertions test the mock's own injected attributes rather than the real fix — a sharper version of the reviewer's concern. X also surfaces substantive, diff-grounded correctness risks (DP-metadata gating not tied to the MoE mapping, a plausible CFG-parallel hang, missing data_parallel_rank, dead branch/dtype nit) with concrete, minimal fixes. Y's findings are mostly test-coverage suggestions rather than bugs, are partly redundant across its 'Validated'/'general' sections, and its suggested test snippets are incomplete (undefined mocks), making it less actionable and lower-value overall.", + "_cost_usd": 0.3384952, + "_judge_resolved_model": "claude-sonnet-5", + "_blinding": { + "X": "claudecode_opus5", + "Y": "copilot_v20cb_val" + }, + "_roles": { + "arm": "copilot_v20cb_val", + "baseline": "claudecode_opus5" + }, + "_arm_meta": { + "arm_a_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/arms/copilot_v20cb_val", + "arm_a_sha256": "75c16566b4cc8cc6dd9a68bac5a8708d6e6071a3ff6003ec3a9d9c6aab6fe778", + "arm_b_dir": "/data/zhoutaichang/copilot/InferMatrixCopilot/eval/dataset/baselines/claudecode_opus5", + "arm_b_sha256": "0d4ddd4027e23f1f32216e748289588ea9a0e74ee8e599fa34b9d50f503d2f0d", + "judge_backend": "claude", + "judge_model": "claude-sonnet-5", + "judge_resolved_model": "claude-sonnet-5", + "judge_rep": 3 + } +} \ No newline at end of file