Repository navigation
npu_serve_smoke: A4 separates "budget went to reasoning" from "the model said nothing" (engine#2111) - #2176
Conversation
|
VERDICT: READY at Why that distinction is the whole changeMy So the three-way outcome is right: One thing to confirm, because the tool's self-test is what makes it stay right
Without those, the distinction lives only in the shell path that needs a device, which is the one place it cannot be tested cheaply. And the gate's own recordThe brief now carries this refinement and the tool implements it, which closes the loop the release's demo row depends on: the 10:54Z |
…del said nothing" (engine#2111)
DEMO-SMOKE.md wrote this refinement as a condition - *"once engine#2111's reasoning_tokens is in the build"* - and the
field is now on main (completion_tokens_details.reasoning_tokens, absent where nothing was split). Before this, the
content arm reported FAIL for both of these:
empty content, finish_reason length, reasoning_tokens 8 the budget went into a block we strip -> SKIP
empty content, finish_reason stop the model really said nothing -> FAIL
Two different faults, one verdict, and the one that is not the model's was being charged to the model.
The four cases now stay four answers, and each has an arm that can fail:
* empty + length + reasoning_tokens > 0 -> SKIP, with the count in the reason
* empty + length + reasoning_tokens == -1 -> FAIL, naming that -1 means "not counted", which is not zero
* empty + stop -> FAIL (the model said nothing)
* degenerate content -> FAIL (that is the model, not the budget)
Verified by breaking one arm on purpose (it fails, and only it), and by re-judging the 10:54Z artefacts - still PASS,
so the refinement does not turn a healthy run into a failure. --self-test: 16 judging cases, 4 engine#2111 content arms,
3 stand-in runs, rc 0.
2faa1ac to
42ab7ca
Compare
bong-water-water-bong
left a comment
There was a problem hiding this comment.
VERDICT at 42ab7ca: READY
"A4 separates 'budget went to reasoning' from [an empty answer]" is the distinction a demo gate has to make, because the two are identical in the only field a naive check looks at: an empty content with finish_reason=length means the token budget was spent inside the thinking block, not that the server returned nothing. On a thinking-only pack with enable_thinking on, that is the expected shape — and a gate that calls it a failure will red the demo for working correctly.
out.append(("content", False, "no replies")) returning early also keeps "there was nothing to judge" distinct from "the judge looked and found an empty answer", which is the same discipline #2168 added one level up.
Together with #2151 (the template order) and #2131 (reasoning-token accounting), the thinking path now has three independent instruments — order, count, and this one — which is what the release row needs before anyone quotes an answer.
PR Reviewer Guide 🔍Here are some key observations to aid the review process:
|
DEMO-SMOKE.mdwrote this as a condition, not a wish: "Refinement (2026-11-11, once engine#2111'sreasoning_tokensis in the build): an emptycontentwithfinish_reason: "length"andreasoning_tokens > 0is a SKIP with reason …-1means the route could not count it … and must not be read as zero."The field is on main (
completion_tokens_details.reasoning_tokens, additive, absent where nothing was split — verified on6df03865:think_split_test12 arms rc 0,npu_answer_parser_test59 arms rc 0). So the condition is met and the gate can implement it.What changed
The content arm treated these identically:
Two different faults, one verdict — and the one that is not the model's was charged to the model. That is the same conflation
#2039fixed between a skip and a failure, one layer down.The four cases now stay four answers, and each can fail
Verified three ways
RESULT: PASS;--self-test→ 16 judging cases, 4 engine#2111 content arms, 3 stand-in runs, rc 0."No replies"keeps its own arm ahead of the refinement, because an empty list is nothing readable and is never a pass.Scope:
tools/npu_serve_smoke.pyonly. No device, no ticket. This is the gate learning to read a field the engine now emits — the other half of#2111, and the reason the demo smoke can say "the budget went to thinking" instead of "the demo failed".