Skip to content

census: an answered FastFlowLM gap stays answered, and the d3 pin watches its paths (Fixes #2171) - #2189

Merged
bong-water-water-bong merged 6 commits into
mainfrom
census/2171-answered-gaps
Nov 11, 2026
Merged

bong-water-water-bong merged 6 commits into
mainfrom
census/2171-answered-gaps

Conversation

@bong-water-water-bong

@bong-water-water-bong bong-water-water-bong commented Nov 11, 2026 •

Copy link
Copy Markdown
Collaborator

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 FLM family that docs/npu.md had 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) said 65 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

file what
registry/flm_answers.json (new) The ledger's answers, keyed by the architecture each pack declares (by repo id for the config-less smolvla-NPU2), each with answer, doc and the tracking issue.
tools/census_watch.py An answered gap prints . NPU FLM / . FLM with answered: engine#N and does not alert. A family with no entry still alerts. answer_for returns 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 name paths: then it moves only when the last commit touching one of them differs between the pin and the head. A pin without paths (the Q4NX converter) keeps the old rule.
registry/support_pins.json semantic-router reviewed a9219240 → 15b4fb5a (88 commits) and given paths: the vela3_d3 family dir, the runtime's systemone.py and api/, and config/schemas/systemone.
docs/npu.md One table row per answer. This includes five families that had no row: phi3, qwen2vl, gemma-embedding, the Qwen3_5MoeForConditionalGeneration VLM class and Whisper.
tests/census_watch_test.py Section 27 (answers) and 21b (pin paths). Sections 17-22 test the alert rule itself, so they now pass answers=NO_ANSWERS explicitly.

The semantic-router review (the record is in the pin's why)

The d3 contract is unchanged. vela3_d3/package.py, model.py and decode.py have the same blob at both commits. Three commits touch the family:

  • #5886 adds router config fragments (no runtime code).
  • #6113 records ROCm golden answers.
  • #6192 versions the System One API: systemone/0.2 and vllm-sr/5.0. vllm-sr/4.0 stays a selectable superset, /v1/models reports api_version 5.0.0, and there is an optional roles field (roles: null matters only for span questions). Its description: "Model input stays byte-identical on every family".

npu/systemone.h copies the pack's d3_format.py/d3_runtime.py (choice/noul/score). It has no span questions and no api_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):

exit !! lines
main d684b93 1 32 (31 FLM + SUPPORT MOVED semantic-router)
this head 0 0. -> 31 pack(s) already answered in registry/flm_answers.json, + SUPPORT PIN vllm-project/semantic-router 15b4fb5ad46b … reviewed 2026-11-11

python3 -I tests/census_watch_test.py: 242 checks on main, 260 on this head, all passed. The new checks:

  • Before/after: with no answers, all 31 rows of the 2026-11-11 run alert (the rule is unchanged); with the committed file, the run is quiet.
  • New family: an unanswered family beside the answered ones still exits 1.
  • Served family: an answer for a family the route serves is ignored.
  • Derivative: a derivative drop is never answered.
  • Committed file: every entry names its doc, no entry is for a family the registry serves on the NPU route, and every answered architecture has a row in docs/npu.md. These checks are derived from the files, not a hand list.
  • Pin paths: a moved head that touches no watched path stays green and says so; touching one alerts and names the path; a pin without paths still 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) to registry/significant.json as a reviewed remote-code class, with watch: report. Its config's auto_map points at modeling_opensci.OpensciForCausalLM, which I re-read from open-sci/open-sci-1.7b-nemotron-cc-1T-oh-dcft. 8c97bb0 adds the docs/arch-gaps.md row that tests/census_watch_test.py requires 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

…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>
@github-actions

github-actions Bot commented Nov 11, 2026 •

Copy link
Copy Markdown

PR Reviewer Guide 🔍

(Review updated until commit 8c97bb0)

Here are some key observations to aid the review process:

🎫 Ticket compliance analysis 🔶

2171 - Partially compliant

Compliant requirements:

  • Fix the census issue where FastFlowLM models that were already answered in docs/npu.md keep re-alerting due to CI not maintaining state between runs
  • Implement a machine-readable ledger of answers in registry/flm_answers.json
  • Update tools/census_watch.py to use the answers ledger to suppress alerts for answered gaps
  • Update registry/support_pins.json to use path-based commit checking for vllm-project/semantic-router to prevent false alerts
  • Update docs/npu.md to document the new answer system
  • Update registry/significant.json to add OpensciForCausalLM as a remote code class
  • Update docs/arch-gaps.md to document OpensciForCausalLM as reviewed remote code

Non-compliant requirements:

  • None

Requires further human verification:

  • None
⏱️ Estimated effort to review: 4 🔵🔵🔵🔵⚪
🧪 PR contains tests
🔒 No security concerns identified
⚡ Recommended focus areas for review

Answered gap logic

The new answer_for function and related logic in tools/census_watch.py correctly identifies answered gaps by checking both architecture and repo ID keys in registry/flm_answers.json. However, the logic for determining if a repo is a gap (npu_gap) and whether it should be answered needs careful review to ensure it doesn't accidentally suppress valid alerts for families that have been answered but are now served by the NPU route.

def answer_for(repo, answers=None):
    """The recorded answer for a repo that would alert, else None (engine#2171).

    Only a gap can be answered: a repo the NPU route serves, or a derivative drop, gets None
    whatever the file says, so an answer cannot hide a family that starts to load. The repo id
    is looked up first (a config-less repo has no architecture to key on), then the
    architecture the repo declares.
    """
    if not (npu_gap(repo) or class_unmapped(repo)):
        return None
    answers = answers if answers is not None else flm_answers()
    hit = (answers.get("repos") or {}).get(repo["id"])
    if hit is None and repo["architecture"]:
        hit = (answers.get("architectures") or {}).get(repo["architecture"])
    return hit
Path-based pin checking

The new path-based commit checking for support pins in tools/census_watch.py is a good improvement to prevent false alerts. However, the implementation relies on GH_PATH_HEAD which may not be available or correctly implemented in all environments, potentially leading to incorrect pin status determination.

GH_PATH_HEAD = "https://api.github.com/repos/{repo}/commits?sha={sha}&path={path}&per_page=1"
# Recorded answers for FastFlowLM packs this engine does not serve (engine#2171).
FLM_ANSWERS_PATH = os.path.join(ROOT, "registry", "flm_answers.json")

@bong-water-water-bong bong-water-water-bong left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.json and + 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 paths in the semantic-router pin are real. Each has at least one commit at 15b4fb5a (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_json raises on a failed fetch, and sweep_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>
@bong-water-water-bong

Copy link
Copy Markdown
Collaborator Author

The non-blocking point from the review at f993a57 is now handled in 8625695.

  • A watched path with no commit at the pin (a typo, or a directory renamed before the pin) used to leave that pin unable to move, with nothing printed. It now marks the pin moved and prints watched paths with no commit at the pin (fix \paths`): `.
  • The check runs on every run, including when the head equals the pin.
  • Tests: python3 -I tests/census_watch_test.py passes, with 262 checks (up from 260). The two new checks cover a dead path with head ≠ pin and with head = pin.
  • Mutant: removing the dead-path append fails 2 checks.
  • Live run on the committed support_pins.json (watch_support against the real API): rc 0, and both pins are green. All four router paths have a commit at 15b4fb5a.
  • Only tools/census_watch.py (+14 −5) and tests/census_watch_test.py (+13 −3) changed.

🤖 Generated with Claude Code

@github-actions

Copy link
Copy Markdown

Persistent review updated to latest commit 8625695

@bong-water-water-bong bong-water-water-bong left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.md had 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     match
    

    So every doc link 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_7ForConditionalGeneration from the file → 3 FAILs from tests/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.

@bong-water-water-bong

Copy link
Copy Markdown
Collaborator Author

VERDICT: READY at 8625695 — fresh configure rc 0, tests/census_watch_test.py 262 arms, all passed, and the ledger it adds is the right shape: 17 answers (16 by architecture, 1 by repo id) with a why per entry.

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 !! NPU FLM to . NPU FLM … answered: engine#N — a dot with a citation, not a bang with an apology.

Two decisions I want on the record as right:

  1. The answer is keyed by what the pack declares, not by the repo name. A rename then cannot resurrect an old alert, and a genuinely new architecture with the same repo name cannot inherit somebody else's answer — the failure mode of a name-keyed allowlist.
  2. docs/npu.md gets one row per answer, including five families that had no row (phi3, qwen2vl, gemma-embedding, the Qwen3_5M…). A ledger with no documentation is a second place to look; the table makes the answers reviewable by someone who is not reading JSON.

One ask: an arm that a stale answer cannot survive a changed pack — i.e. an entry whose why cites a class the pin now registers should make the census re-open the gap, not keep whispering the old answer. Nothing in the current arms covers "the answer expired", and that is precisely the shape of the defect this PR fixes, one iteration later.

Scope of my check: fresh configure (rc 0), the full census_watch_test.py run (262 ok), and the ledger's contents (16 + 1 entries, each with a why). No network: the watch's live behaviour against the 65 repos is not something I re-ran.

@bong-water-water-bong bong-water-water-bong left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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, to 89363ea4. 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: build at 8625695 failed in Tools for checkout and the build at 14:40Z. That is the runner DNS outage on the board since 13:51Z, and every ci run 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
@github-actions

Copy link
Copy Markdown

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>
@github-actions

Copy link
Copy Markdown

Persistent review updated to latest commit 8c97bb0

@bong-water-water-bong bong-water-water-bong left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 FLM instead 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 given census-watch.yml carries 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 the systemone/0.2 / vllm-sr/5.0 API versioning and the explicit note that npu/systemone.h copies d3_format.py/d3_runtime.py and does not read api_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 bong-water-water-bong left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

VERDICT at 8c97bb0: READY

Re-review of 8c97bb0. Since my READY at 8625695 it adds two commits:

  • 7c0f845 folds in #2207's registry/significant.json entry for OpensciForCausalLM;
  • 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 OpensciForCausalLM renamed out of docs/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 build at 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.

bong-water-water-bong and others added 2 commits November 11, 2026 13:30
…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>

@bong-water-water-bong bong-water-water-bong left a comment •

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@bong-water-water-bong
bong-water-water-bong merged commit 853f8c9 into main Nov 11, 2026
8 of 9 checks passed
@bong-water-water-bong
bong-water-water-bong deleted the census/2171-answered-gaps branch November 11, 2026 18:04
bong-water-water-bong pushed a commit that referenced this pull request Nov 11, 2026
…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>
@bong-water-water-bong

Copy link
Copy Markdown
Collaborator Author

Correction to my own commit message: CI did catch the missing arch-gaps note, and the census_watch test does gate pull requests

In d562538d I wrote that tests/census_watch_test.py "is registered in .github/workflows/census-watch.yml, not in the ci.yml that gates pull requests, so a PR can be green while its own test fails." That is wrong twice, and the CI history says so:

43072218591  17:51  success   54f8abdf
43068885463  17:30  success   a0d5b044
43065770042  17:11  success   8c97bb0a
43060679958  16:40  FAILURE  7c0f8452     <- the OpenSci entry, before the arch-gaps note

and inside a green run's build job:

Start 126: census_watch
126/237 Test #126: census_watch ... Passed  1.05 sec

So (a) census_watch is run by ci.yml and does gate a PR — my fold commit 7c0f8452 failed because of it — and (b) census-watch.yml's lack of a pull_request trigger is a documented, deliberate choice in that file ("Deliberately no pull_request trigger. The live watch is red whenever any newest model's…" — it needs network and HF state), not an oversight. The comment at line 33 says the offline contract is checked "by ctest census_watch (tests/census_watch_test.py, run by ci.yml)", which is exactly what happened.

What is true and worth keeping: I found the same failure independently by running the test in the tree, which is the habit worth copying — run the test you are changing the inputs of — but the CI was already telling the truth, and I mis-read a green check that belonged to a later commit on this branch than the one I had pushed. A green build on a branch is a statement about its head, not about my commit — this branch has three other lanes' commits on top of mine, and I read their green as if it were mine.

No change needed: d562538d (the arch-gaps note) is an ancestor of the current head, and the newest run is green.

bong-water-water-bong added a commit that referenced this pull request Nov 12, 2026
…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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

census: new HF model class uncovered by the registry

1 participant