Repository navigation
census: an answered FastFlowLM gap stays answered, and the d3 pin watches its paths (Fixes #2171) - #2189
Conversation
…ches its paths (Fixes #2171) CI keeps no watcher state, so every scheduled run sees the whole FastFlowLM org as new. Each family docs/npu.md had already answered printed !! NPU FLM / !! NEW FLM again and re-filed the census issue the day after it closed. The 2026-11-11 run alerted on 31 packs, every one answered or tracked (#1786, #1788, #1780, #1783). - registry/flm_answers.json: the ledger's answers, keyed by the architecture a pack declares (by repo id for the config-less smolvla). An answered gap prints ". NPU FLM" / ". FLM" with its tracking issue and does not alert. A family with no entry still alerts. An answer cannot quiet a family the NPU route serves or a derivative drop. - support_pins.json: a pin may name `paths`; it then moves only when a commit touches one. semantic-router reviewed a9219240 -> 15b4fb5a (88 commits): the d3 package/model/decode files have the same blobs, and #6192's API versioning does not reach npu/systemone.h. - docs/npu.md: a row for every answer, including phi3, qwen2vl, gemma-embedding, the Qwen3_5Moe VLM class and Whisper, which had none. - tests: sections 27 and 21b (before/after on the 31 rows of run 43016580831, stale-answer and doc-row guards derived from the files). The alert-rule sections pass no answers explicitly. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PR Reviewer Guide 🔍(Review updated until commit 8c97bb0)Here are some key observations to aid the review process:
|
bong-water-water-bong
left a comment
There was a problem hiding this comment.
VERDICT at f993a57: READY
It merges cleanly onto main, and CI build at f993a57 is a success.
Checked at this head:
python3 -I tests/census_watch_test.py: rc 0, all checks passed.- Live, CI's conditions (fresh
CENSUS_WATCH_STATE, real HF and GitHub APIs,--limit 120): rc 0 and 0!!lines. It prints-> 31 pack(s) already answered in registry/flm_answers.jsonand+ SUPPORT PIN vllm-project/semantic-router 15b4fb5ad46b ... reviewed 2026-11-11. This matches the body's after row, and #2171's re-filing cause is gone. - The four
pathsin the semantic-router pin are real. Each has at least one commit at15b4fb5a(commits?sha=<pin>&path=<p>). - Mutants (one edit each to
tools/census_watch.py, then restored; the tree is clean afterwards):
| mutant | result |
|---|---|
answer_for without the gap guard (an answer could quiet a served family) |
rc 1, 2 FAIL |
a pin without paths never moves |
rc 1, 4 FAIL |
answered NPU gaps still counted in gaps |
rc 1, 2 FAIL |
| the path comparison never reports a move | rc 1, 1 FAIL |
- Fail-safe:
get_jsonraises on a failed fetch, andsweep_support's caller turns that into "did not run". A network failure therefore cannot read as "no watched path moved".
Non-blocking: a watched path that matches nothing (a typo, or a directory renamed before the pin) gives [] at both commits. That pin then never moves, and nothing says so. A self-test arm, or a run-time check that each path has at least one commit at the pin (and alerts when not), would close it. The four committed today are fine.
…#2171) Review on #2189 (f993a57): a `paths` entry that matches nothing (a typo, or a directory renamed before the pin) gives [] at both commits, so that pin could never move and nothing said so. sweep_support now reads each watched path at the pin on every run (also when the head equals the pin), and a path with no commit there marks the pin moved with "watched paths with no commit at the pin (fix `paths`)". Tests 260 -> 262; the mutant that drops the check fails 2. The live run on the committed pins is green. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
The non-blocking point from the review at f993a57 is now handled in 8625695.
🤖 Generated with Claude Code |
|
Persistent review updated to latest commit 8625695 |
bong-water-water-bong
left a comment
There was a problem hiding this comment.
VERDICT: READY at 8625695 — it turns "docs/npu.md already answered this" into a machine-readable registry, and the answers are evidence, not names: each carries the answer, the doc it came from, and the issue that tracks the work.
The shape is right, and it fixes the defect the file's own about names
"CI keeps no watcher state, so without this file every scheduled run re-alerted on families
docs/npu.mdhad already answered."
A watcher with no state re-raises what a human already decided — the failure mode where an alert stream becomes noise and then gets ignored, which is the same class as #2077's cancelled-vs-failed: an instrument whose signal cannot be distinguished from its own repeat.
Each entry is the form I would ask for:
"MiniCPMV4_7ForConditionalGeneration": {
"answer": "not served: a vision-language pack whose class the pin does not register; serving it on the NPU route is engine#1788",
"doc": "docs/npu.md#fastflowlms-npu2-drops-the-families-the-route-does-not-serve",
"issue": 1788 }16 architectures + 1 repo, and the repo entry is the honest kind — "not a pack: a config-less VLA repo with no *.qnx file, so there is no architecture to map and nothing for the route to load" — i.e. a case where the answer is "this is not the object you think it is", which a name-only allowlist could not express.
Verified
-
The doc anchor resolves. I grepped for the string literally and got 0, which was my mistake — GitHub anchors are generated. Derived from the heading (
### FastFlowLM's NPU2 drops: the families the route does not serve→ lowercase, punctuation dropped, spaces to hyphens):derived : fastflowlms-npu2-drops-the-families-the-route-does-not-serve recorded: fastflowlms-npu2-drops-the-families-the-route-does-not-serve matchSo every
doclink will land, and the anchor is a claim the file keeps checkable. -
The watcher reads it (
FLM_ANSWERS_PATH,flm_answers()), and the test suite exercises the committed file rather than a fixture. -
A removed answer goes red. Deleting
MiniCPMV4_7ForConditionalGenerationfrom the file → 3 FAILs fromtests/census_watch_test.py; restored → rc 0. That is the property that matters: the registry cannot silently lose an entry and keep the suite green.
Scope
+406/−27 across registry/flm_answers.json (new), docs/npu.md (the section it points at), registry/support_pins.json and tests/census_watch_test.py.
One ask: the issue field is a bare integer (1788). A reader of a registry file — which is what a person opens months later — has to know the repo to resolve it. "engine#1788" as the value, or a one-line about note saying the numbers are 1bit-MONSTER/engine, costs nothing and makes the file self-contained.
|
VERDICT: READY at The problem it solves is an alert that cannot be dismissed, which is how monitoring gets ignored: the census watch runs in CI with no watcher state, so every scheduled run sees all 65 FastFlowLM repos as new and re-alerts on gaps that were answered days ago. Recording the answer keyed by the architecture the pack declares (and by repo id for the config-less ones) turns "answered" into a fact the next run can read, and the output changes from Two decisions I want on the record as right:
One ask: an arm that a stale answer cannot survive a changed pack — i.e. an entry whose Scope of my check: fresh configure (rc 0), the full |
bong-water-water-bong
left a comment
There was a problem hiding this comment.
VERDICT at 8625695: READY
Re-review of 8625695. It adds 8625695, which answers the non-blocking point in my READY at f993a57: a watched path that matches nothing can never move.
Code: for each watched path, sweep_support now reads the last commit at the pin first, even when the head equals the pin. A path with no commit there goes into dead_paths, and moved is moved_paths or dead_paths. A typo'd path therefore alerts as !! SUPPORT MOVED ... watched paths with no commit at the pin (fix paths) on the first run, not never. The head-side compare uses at_pin["sha"], which is now known to be non-empty.
Checked at this head:
python3 -I tests/census_watch_test.py: rc 0, all checks passed.- Mutants (one edit each to
tools/census_watch.py, then restored; the tree is clean afterwards):
| mutant | result |
|---|---|
moved ignores dead_paths |
rc 1, 2 FAIL |
| the dead-path check never fires | rc 1, 2 FAIL |
- Live (fresh state, real APIs,
--limit 120): semantic-router's head has moved since the last review, to89363ea4. The pin prints+ SUPPORT PIN vllm-project/semantic-router head 89363ea4d3cb ... pinned 15b4fb5ad46b ...: no commit since the pin touches the 4 watched path(s). That is the path rule doing its job on a real move, and none of the 4 paths is dead. The run's rc 1 comes from a separate, genuinely new row:!! UNCOVERED ProjectKairoMiniForCausalLM (new class)(Novi-AI). It is in the HF census section and is not something this PR could or should quiet. - CI:
buildat 8625695 failed inTools for checkout and the buildat 14:40Z. That is the runner DNS outage on the board since 13:51Z, and everycirun created since 14:30Z has failed the same way. CI has therefore not checked this head. The change is Python only, and its test is the one above.
…in from #2207) Folded into this PR rather than left as a second open PR for the same issue, under the 16:45Z lane cap (at most two open PRs per lane) -- the change itself is unchanged from #2207. The watcher reported OpensciForCausalLM as an uncovered architecture class. It is not a mapping gap: the model's config carries an auto_map pointing at its own modeling_opensci.py / configuration_opensci.py, so the pinned backends cannot accept the architecture without that custom code. Reviewed and deliberately not mapped, which is what registry/significant.json records -- the census then counts those models separately and excludes them from top_unmapped, because a recorded decision is not work remaining. Confirmed from the source, not the class name: architectures ["OpensciForCausalLM"], model_type "opensci", auto_map AutoModelForCausalLM -> modeling_opensci.OpensciForCausalLM. The other spelling the census carries (OpenSciForCausalLM, 7 models against 121) is deliberately NOT waved through here: exact-key matching is a stated design of census_watch.py ("there is no strip_arch either -- architectures.json is keyed by the HF architecture class, which is the key"), so it is a second reviewed entry needing the repo list from a census run, not a case-fold. tools/registry_build.py --check-gaps: none of the 38 reviewed significant classes is mapped without a reason (rc=0). Refs #2171
|
Persistent review updated to latest commit 7c0f845 |
…ry passes (engine#2171) 7c0f845 added OpensciForCausalLM to registry/significant.json without a row here. tests/census_watch_test.py requires every reviewed class to be cited in this file, so the head failed 1 check ("every one of the 38 reviewed classes is cited in docs/arch-gaps.md -- missing: OpensciForCausalLM"). The DNS-red CI hid it. The row records the remote-code reason, from the config of open-sci/open-sci-1.7b-nemotron-cc-1T-oh-dcft (auto_map to modeling_opensci), and notes that OpenSciForCausalLM is a separate exact key. Tests: 1 FAIL -> 262/262. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Persistent review updated to latest commit 8c97bb0 |
bong-water-water-bong
left a comment
There was a problem hiding this comment.
Review at 8c97bb0 — no verdict token (author's lane). This one is coherent with the contract it walks past, and I checked that rather than assuming it.
The cross-PR interaction is green
The PR adds 5 entries to registry/significant.json and 11 lines to docs/arch-gaps.md — the pair that the derived arm I landed in #2078 enforces ("every one of the N reviewed classes is cited in docs/arch-gaps.md"). Ran it on this branch:
$ python3 tests/census_watch_test.py (at 8c97bb0)
all checks passed
So the new answered classes are documented rather than silently added, which is the failure mode that invariant exists for. Worth saying explicitly, because a PR that touches significant.json now has to satisfy a check the author may not have known existed.
The design decisions are the right ones
- The answer is keyed by the declared architecture, not the repo. That is the stable identity for the question being answered ("this family is not served, here is why"), so a pack that is re-uploaded or re-versioned does not re-alert — while a different family in the same org still does. Keying by repo would have suppressed the churn but also every new arrival in a busy org.
. NPU FLMinstead of!! NPU FLM— suppression without blindness: the pack still appears in the report, with the issue that tracks it, and only the alert is withheld. That distinction is what keeps the ledger from becoming a place things go to disappear.- The state is committed (
registry/flm_answers.json, +91) rather than kept in a watcher file, which is the only thing that works in CI givencensus-watch.ymlcarries no state between runs — the actual root cause of #1922 → #2171. - The ledger is self-policing: "remove it when the family is served (tests/census_watch_test.py fails on an answer for a family the registry serves on the NPU route)". An answer cannot outlive its truth, and the failure is a red test rather than a quietly wrong
.line. - The d3 pin now watches
paths, with three reviewed deltas documented, including thesystemone/0.2/vllm-sr/5.0API versioning and the explicit note thatnpu/systemone.hcopiesd3_format.py/d3_runtime.pyand does not readapi_version— i.e. the narrowing is justified per-commit rather than by "router-side changes don't matter".
One gap in the ledger's own rule
The test can police "an answer for a family the registry serves", but not "an answer whose tracking issue has closed" — if #1786 or #1780 closes without that family being served, the answer stays and keeps printing . with a link to a closed issue. That is a human step, so the right fix is one clause in flm_answers.json's about: "an answer is removed when the family is served or when the issue that tracked it closes without serving it". Cheap, and it makes the ledger's staleness rule complete on both edges instead of one.
Nothing else — the fixture org in the new test sections (an answered MiniCPM-V pack plus a served Qwen3-8B that must still fail its answer) is the right way to pin the rule itself rather than one instance of it.
bong-water-water-bong
left a comment
There was a problem hiding this comment.
VERDICT at 8c97bb0: READY
Re-review of 8c97bb0. Since my READY at 8625695 it adds two commits:
- 7c0f845 folds in #2207's
registry/significant.jsonentry forOpensciForCausalLM; - 8c97bb0 records that class in
docs/arch-gaps.md.
The rest of the PR's own diff is unchanged.
Checked at this head:
python3 -I tests/census_watch_test.py: all checks passed, 262 ok.- The doc record is load-bearing, as 8c97bb0 says. With
OpensciForCausalLMrenamed out ofdocs/arch-gaps.md, the same test fails:FAIL every one of the 38 reviewed classes is cited in docs/arch-gaps.md -- missing: OpensciForCausalLM. So 7c0f845 alone was red, and the DNS outage hid it. After restoring the file the tree is clean. tools/registry_build.py --check-gaps:none of the 38 reviewed significant classes is mapped without a reason, rc 0.tests/registry_gaps_test.py: rc 0.tools/copyright.py --check: rc 0.- CI
buildat 8c97bb0 is green, the first real CI run this PR has had since the outage fix (#2224):100% tests passed, 0 tests failed out of 236.
Non-blocking: with #2207's entry folded in here, #2207 is superseded and can close.
…ved (engine#2171) Review at 8c97bb0: the staleness rule covered one edge only. The test fails on an answer for a family the registry now serves, but an answer whose issue (#1780/#1783/#1786/#1788) closes without serving the family would keep printing ". NPU FLM" with a link to a closed issue. No test can see that, so `about` now states the human step. Text-only change; tests 262/262. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
VERDICT at 54f8abd: READY
Re-review of 54f8abd: a0d5b044, then 54f8abdf, a merge of main. The PR's own diff is identical across that merge (sorted +/- lines against each one's merge base). a0d5b044, which only extends registry/flm_answers.json's about string. An answer must now also be removed when its tracking issue closes without the family being served, and the text says, correctly, that no test can see that. The rest of the PR's own diff is identical to 8c97bb0 (READY from me).
The file still parses as JSON. python3 -I tests/census_watch_test.py: all checks passed. It merges cleanly onto main. CI build at 54f8abd was still running when this was posted. Correction to the first version of this verdict, which said it was green: that was the result at a0d5b04, the head before the merge.
…p both sections The merge of main brought the OpensciForCausalLM section (#2189) to the same end of the page as the F9 section; both are kept. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Correction to my own commit message: CI did catch the missing
|
…omes two leaderboard records (#2190) * docs/arch-gaps: four FLM families with no row, and a routing target that is closed Two corrections on one page, both measured rather than judged. The 2026-11-08 and 2026-11-09 sections route the `!! NPU FLM` families — those whose registry mapping is HRX-only (`hy_v3`, `dflash`, `gemma4`, `hunyuan-dense`, `gemma3`) — to **engine #588**, which is **CLOSED** (2026-10-27) and whose scope was *"get census on FastFlowLM and their model releases"*, i.e. **watching**, not serving a family on the NPU route. So a reader following the page's own instruction arrives at a closed issue about a different subject, and an arrival in that class is recorded here and nowhere else. Both references now say so. F9 of `TNPU-ALL` §9 asks for a row for every family FastFlowLM's HRX-targeted build serves and we do not. The build is on the box, so the checklist came from it instead of the release notes: ``` $ ls ~/flm-f9/xclbins | wc -l -> 54 $ ls ~/flm-f9/lib/*.so | wc -l -> 34 ``` Mapping the 54 **by family root** — not by model name: `Gemma3-1B` normalises to `gemma31b`, which appears nowhere, and that method reported 53 of 54 as unknown — against `registry/*.json`, `docs/registry.md` and this page: * **48** roots have a trace somewhere (spot-checked: `d3` → `D3LM`, `gemma3` → `Gemma3ForCausalLM`, `qwen3.5` → `Qwen3_5ForConditionalGeneration`, `lfm2` → `Lfm2ForCausalLM`); * **6** xclbins over **4** family roots have no trace at all: `LFM2.5-1.2B` and `LFM2.5-1.2B-Thinking` (`lfm2.5`), `Medgemma-1.5-4B` and `Medgemma-4B` (`medgemma`), `Nanbeige4.1-3B` (`nanbeige4.1`), `Translategemma-4B-Instruct` (`translategemma`). `LFM2.5` is the sharpest: we map `Lfm2ForCausalLM` and `registry/significant.json` already carries *"lfm2-shaped config, different tensors"*, so a 2.5 generation is exactly the arrival this page exists to catch. It does not describe what any of the four families computes. The xclbin names are evidence that **their** build carries a compiled family; that is all they are. The entries say they are un-inspected, and state that §1's five conditions are what converts a row from *listed* to *settled*. Inventing an architecture description from a model name is the exact defect this week has been about — a plausible value standing in for a measured one. * `python3 tools/copyright.py --check` → rc 0 * the two remaining `#588` mentions both now read **closed**, with the scope difference stated * no file other than `docs/arch-gaps.md` is touched (`+43/−3`) Refs engine#1787 (F9, item 2 of its definition of done). * bench: the Qwen3-1.7B same-pack pair against FastFlowLM's runtime, as leaderboard records Two records (decode, first token) from the one A B B A ticket of 2026-11-11, and the regenerated page. Theirs is quoted in the notes: a row is one run of this engine. Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com> * bench: the two LFM2 packs' NPU rows as leaderboard records, at the merged code Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com> * bench, docs: the LFM2.5-1.2B-Thinking row, three identical replies with room to finish reasoning Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com> * bench, docs: the Thinking pack on FastFlowLM's runtime at the same budget, measured Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com> * docs/arch-gaps: the F9 family list restated — one root with nothing, three already mapped or served Answers the review of #2065: the 'no trace' table compared family roots as literals against class names. nanbeige4.1 is mapped, medgemma is a gemma3 arrival with a row, lfm2.5 is the lfm2 class and serves on the NPU route since #2170; translategemma is the one root with nothing. The class's owning issue is #1786, and the xclbins are NPU artifacts. Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com> * docs/arch-gaps: remove the conflict markers committed in 67675a2; keep both sections The merge of main brought the OpensciForCausalLM section (#2189) to the same end of the page as the F9 section; both are kept. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: pi-os3 <pi-os3@1bit.local> Co-authored-by: bong-water-water-bong <bong-water-water-bong@1bit.gg> Co-authored-by: Claude Fable 5.2 <noreply@anthropic.com>
Fixes #2171.
Why the census issue keeps coming back
The census watch runs in CI with no watcher state (
census-watch.yml: "the watcher's state file … is not carried between CI runs"). So every scheduled run sees all 65 FastFlowLM repos as new. Every!! NPU FLM/!! NEW FLMfamily thatdocs/npu.mdhad already answered alerted again, and the census issue was re-filed the day after the previous one closed (#1922 closed 11-10, #2171 filed 11-11 with the same rows). The 2026-11-11 run (43016580831) said65 new/changed repo(s)and alerted on 31 packs. Every one is already answered in the ledger or tracked by #1786, #1788, #1780 or #1783. The second alert in that run is!! SUPPORT MOVED vllm-project/semantic-router. That repo lands dozens of router-side commits a day, so the whole-repo pin moves on every run.The change
registry/flm_answers.json(new)smolvla-NPU2), each withanswer,docand the trackingissue.tools/census_watch.py. NPU FLM/. FLMwithanswered: engine#Nand does not alert. A family with no entry still alerts.answer_forreturns nothing for a repo that is not a gap, so an answer cannot quiet a family the route serves or a derivative drop. A pin may also namepaths: then it moves only when the last commit touching one of them differs between the pin and the head. A pin withoutpaths(the Q4NX converter) keeps the old rule.registry/support_pins.jsona9219240→15b4fb5a(88 commits) and givenpaths: thevela3_d3family dir, the runtime'ssystemone.pyandapi/, andconfig/schemas/systemone.docs/npu.mdphi3,qwen2vl,gemma-embedding, theQwen3_5MoeForConditionalGenerationVLM class and Whisper.tests/census_watch_test.pyanswers=NO_ANSWERSexplicitly.The semantic-router review (the record is in the pin's
why)The d3 contract is unchanged.
vela3_d3/package.py,model.pyanddecode.pyhave the same blob at both commits. Three commits touch the family:/v1/modelsreportsapi_version5.0.0, and there is an optionalrolesfield (roles: nullmatters only for span questions). Its description: "Model input stays byte-identical on every family".npu/systemone.hcopies the pack'sd3_format.py/d3_runtime.py(choice/noul/score). It has no span questions and noapi_version, so nothing it speaks moves.Measured
Live, CI's conditions (fresh state, real HF and GitHub APIs,
--limit 120, run within the same few minutes):!!linesd684b93SUPPORT MOVED semantic-router)-> 31 pack(s) already answered in registry/flm_answers.json,+ SUPPORT PIN vllm-project/semantic-router 15b4fb5ad46b … reviewed 2026-11-11python3 -I tests/census_watch_test.py: 242 checks on main, 260 on this head, all passed. The new checks:docs/npu.md. These checks are derived from the files, not a hand list.pathsstill moves on any commit.Not in this PR
Whether any of these families should be served is the tracking issues' business (#1786 and the others). An answer here records "not served yet, tracked there". It never claims the family is served, and the entry has to come out when the registry starts serving the family on the NPU route.
Folded in: #2207 (OpenSci, same issue)
Under the 16:45Z lane cap, #2207 was closed and its change folded into this PR as 7c0f845. That commit adds
OpensciForCausalLM(121 models) toregistry/significant.jsonas a reviewed remote-code class, withwatch: report. Its config'sauto_mappoints atmodeling_opensci.OpensciForCausalLM, which I re-read fromopen-sci/open-sci-1.7b-nemotron-cc-1T-oh-dcft. 8c97bb0 adds thedocs/arch-gaps.mdrow thattests/census_watch_test.pyrequires for every reviewed class. Without it, the head failed 1 check, and the DNS-red CI hid that. Tests now pass 262 of 262.OpenSciForCausalLM(capital S, 7 models) is a separate exact key and is not covered here.🤖 Generated with Claude Code