STEP 1798 — plugin_census v0.1 · 「世界のオープンソースプラグイン総数」を数えない計器

初回 land 時実測 2026-09-06 · comparator 計器 4 本目(source_freshness → harvest_lag → dedup_collision → plugin_census)· chat 起草時番号 STEP 1783 → land 時 STEP 1798 (旧番号は commit cec836b90 SsmQuantErrorBounded 修復 で 使用済 collision)

この計器は、依頼された数字を出しません

当初の要望は「世界のオープンソースプラグインの総数を日次更新」でした。その数は存在しません。 同じ日・同じ npm で「MCP サーバの数」を訊くと、キーワードの選び方だけで 2,716 / 8,208 / 70,51025.96 倍ぶれます。

総数を日次で出すと、その日々の変動が測るのは世界の変化ではなくこちらの probe 一覧の編集履歴になります。 これはコネクタ在庫で 3 分母(session 露出 / wired / tool call 換算)を混同し STEP 1463→1464 の訂正を要した誤りと同じ構造です。 したがって本計器は総数を出さず、代わりに「問いの立て方で答えが何倍ぶれるか」を読みとして返します。

初回実測(land 時 2026-09-06)

クラス別の読み

定義クラスprobe計測成功minmaxspreadverdict
mcp-server 3 3 2,716 70,510 25.96x TRUE
editor-extension 2 2 121 17,444 144.17x TRUE
cms-plugin 1 1 67,532 67,532 N/A
control 1 1 N/A

editor-extension144.17x は、片方が誤っているのではありません。 Open VSX が 17,444、npm の keywords:vscode-extension が 121 なのは、エディタ拡張が npm に住んでいないからです。 npm の数字は「拡張の数」ではなく「npm の性質」を測っています。両方を同じ表に載せてあるのは、それを見えるようにするためです。

probe 別

probe idレジストリ問い合わせクラス件数verdict
npm:keywords:mcp npm keywords:mcp mcp-server 70,510 TRUE
npm:keywords:mcp-server npm keywords:mcp-server mcp-server 8,208 TRUE
npm:keywords:modelcontextprotocol npm keywords:modelcontextprotocol mcp-server 2,716 TRUE
openvsx:all open-vsx.org (empty search, all published extensions) editor-extension 17,444 TRUE
npm:keywords:vscode-extension npm keywords:vscode-extension editor-extension 121 TRUE
wordpress:plugins api.wordpress.org action=query_plugins (unfiltered) cms-plugin 67,532 TRUE
cratesio:all (control) crates.io summary control 328,952 TRUE
control 行について。 crates.io はプラグインの母集団ではありません。 「レジストリが 1 つ、定義が 1 つ、選ぶべきクエリが存在しない」場合に数がどう見えるかの対照として置いてあり、どのクラスの比較にも入りません。

設計 — 何を構造的に禁じたか

常設項目
Q1(計器か被測定か): plugin_census は計器です。被測定は外部レジストリ群。ただし probe 一覧は計器側の設定であり、これを編集するとクラスの読みが動きます。編集は commit log に残り、probe 一覧を変えた日に spread が動いたら「ニュース」ではなく「編集」と読むこと(honestScope に明記)。
Q2(要件から導出か、読みを良くしたいからか): 本計器の閾値らしきものは「クラスに 2 probe 以上で spread を出す」の 1 点のみで、これは要件由来です(2 点なければ比が定義できない)。読みを良くするための調整値はありません。

実装

scripts/comparator/lib/registry-probe.ts    probe 定義 + fetch(判断を持たない)
scripts/comparator/gauges/plugin_census.ts  gauge 本体(純関数・外部アクセスなし)
scripts/comparator/run-plugin-census.ts     runner
test/step1798-plugin-census-test.ts         46 assertion PASS

実行:

npm run comparator:plugin-census
# = npx tsx scripts/comparator/run-plugin-census.ts

出力:data/comparator/plugin-census-latest.json(schemaVersion 1)
公開 URL:/data/comparator/plugin-census-latest.json_headers/data/comparator/* → no-cache 規則が既に適用されます)

honestScope(JSON にも同文が入っています)

合計を求めた場合に JSON が返すもの
"aggregate": { "verdict": "N/A", "reason": "No total is computed. Probes measure different populations under different definitions; several overlap (a package can be tagged mcp and mcp-server) and several are disjoint by accident of where a plugin ecosystem publishes. A sum would be a number about this probe list, not about the world, and its daily movement would track edits to this file." }
このフィールドは、総数を探しに来た読み手が「何も無い」と判断して probes から自前で合計を作ってしまうのを防ぐために置いてあります。空欄ではなく、理由つきの拒否を返します。

次段

rei-aios / comparator · STEP 1798 · plugin_census v0.1 · chat 起草番号 1783 → land 番号 1798