Repository navigation
Conversation
The qwen3 seat, which also serves qwen35moe files (Qwen3.6, MiniCPM-V 4.7), passed an empty engine block to /props, so a client such as toktape saw no placement: a 3060 tape of MiniCPM-V 4.7, with 6,105 experts on the host, recorded `placement.devices` as null. The V4.1, GLM, MiMo and Qwen3.8 seats already report it through bind::placement_of. Now a placed load reports the plan its open makes, from the same plan and levers: the card, then the host, each with its bytes by class. A whole-card load opens with no plan, so it reports no placement and its stderr says why. gate_qwen3_serve's slots arms check it: `placed_props_engine_placement_is_the_plans` (two devices, GPU<n> then CPU, each device's bytes its classes' sum, routed experts on the host exactly when the plan record's host_experts is not 0), and `props_engine_whole_load_names_no_placement` on the whole-card arm. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
Verdict: MUST_FIX: the new gate repeats an existing serializer contract.
Must fix
1. Keep the byte-sum contract in its existing test
gate_qwen3_serve.rs:1909 checks that each device's bytes equal its class sum. api.rs:3967 already pins that serializer contract, including empty devices. This is kind B: a proven duplicate with a mechanical deletion (AGENTS Conventions: one test per contract; R14).
Deleting this now avoids maintaining the same serializer rule in another card gate.
Replace the Some(rec) arm below. Remove the byte-sum promise from the two new gate comments. This deletes the summed closure and its assertion while keeping the seat's placement checks.
Some(rec) => {
let devices = placement["devices"].as_array().cloned().unwrap_or_default();
let host_experts = devices
.get(1)
.and_then(|d| d["classes"]["experts"].as_u64())
.unwrap_or(0);
println!("{}: props placement {placement}", arm.dir);
check(
ok,
&named("props_engine_placement_is_the_plans"),
devices.len() == 2
&& devices[0]["device"]
.as_str()
.and_then(|d| d.strip_prefix("GPU"))
.is_some_and(|n| n.parse::<u32>().is_ok())
&& devices[1]["device"] == "CPU"
&& devices[0]["bytes"].as_u64().is_some_and(|b| b > 0)
&& u64_of(Some(rec), "host_experts")
.is_some_and(|h| (h > 0) == (host_experts > 0)),
);
}Non-blocking
⚠ Supply FAIL-first evidence: qwen3.rs:1451. The body names the checks but includes no red or green run output. Run the owning gate with the old empty engine props, then with this change. Paste the named results, card/driver line, model path and both hashes so the regression check is verified before merge.
Checked
Duplicates: no new named functions, types or constants. The new summed closure repeats the existing serializer test's contract; production reuses placement_of.
Complexity: slots_flow_together adds placement-validation branches; qwen3::run adds a load-variant match. Complexity alone is not a finding.
Silent failure: the new unwrap_or_default, filter_map and unwrap_or(0) feed gate assertions. Missing devices fail the check; missing CPU experts represents an empty class set.
Tests: static mutation analysis confirms that empty engine props fail the placed assertion, and removing the whole-load reason or reporting placement there fails the whole assertion. Hardware gates were not run during validation.
Gates: no existing pins, thresholds or cases moved or disappeared.
Placement: both architecture arms pass the new props; both opens reconstruct the plan from the stored planner, total and levers. This is startup work.
Escape catalog: C1–C4 do not match the diff. No ledger lessons are in force.
Notes
The PR carries no complete GPU gate evidence.
Card check: needs-gpu. This pull request changes crates/gpu-gates/src/bin/gate_qwen3_serve.rs, crates/gpu-gates/src/bin/shared/serve_seats/qwen3.rs and carries no gate run on a card (CONTRIBUTING's evidence list); a maintainer adds gpu-verified after one.
🔨 Shingler, bloomery's review bot: approves a clean pull request and requests changes on a must-fix (how it works)
The seat gate repeated the serializer's per-device class sum. The placement check keeps the card, the host, the card's bytes and the host experts. The byte-sum promise leaves the two comments.
There was a problem hiding this comment.
Since the last review:
- Must-fix 1 fixed: gate_qwen3_serve.rs:1888 removes the duplicate byte-sum closure and assertion; both comments now describe the remaining checks.
Verdict: CLEAN: the duplicate assertion is removed, and the serializer test still covers its contract.
Checked
Duplicates: 0 new functions, types or constants in the incremental diff. The removed check remains owned by api.rs:3967; no dryer pairs were supplied.
Complexity: diagnostics list slots_flow_together and qwen3::run. These commits remove validation code and leave production unchanged.
Silent failure: 2 retained fallback sites followed. Missing devices fails the length assertion; an absent CPU experts class represents zero host expert bytes. No fallback was added.
Tests: static mutation analysis of api.rs:1900 shows that dropping the byte accumulation fails the serializer's expected totals. Restoring empty engine props fails the retained placed check; dropping the whole-load explanation fails its check. No hardware gate was run.
Gates: no pin or threshold moved. Only the duplicate byte-sum assertion was removed; its existing serializer test remains.
Escape catalog: C1–C4 do not match. No ledger lessons are in force.
Notes
dryer did not run, as reported by diagnostics.md.
Card check: needs-gpu. This pull request changes crates/gpu-gates/src/bin/gate_qwen3_serve.rs, crates/gpu-gates/src/bin/shared/serve_seats/qwen3.rs and carries no gate run on a card (CONTRIBUTING's evidence list); a maintainer adds gpu-verified after one.
🔨 Shingler, bloomery's review bot: approves a clean pull request and requests changes on a must-fix (how it works)
What
The qwen3 seat, which also serves qwen35moe files (Qwen3.6, MiniCPM-V 4.7), passed an empty engine block to /props, so
a client such as toktape saw no placement: a 3060 tape of MiniCPM-V 4.7, with 6,105 experts on the host, recorded
placement.devicesas null. The V4.1, GLM, MiMo and Qwen3.8 seats already report it through bind::placement_of.Now a placed load reports the plan its open makes, from the same plan and levers: the card, then the host, each with
its bytes by class. A whole-card load opens with no plan, so it reports no placement and its stderr says why.
gate_qwen3_serve's slots arms check it:
placed_props_engine_placement_is_the_plans(two devices, GPU then CPU,each device's bytes its classes' sum, routed experts on the host exactly when the plan record's host_experts is not
0), and
props_engine_whole_load_names_no_placementon the whole-card arm.Pre-review CLEAN at df2a360.
The bloomery AI assistant wrote this.