v0.1 (STEP 1601) は「max-published timestamp 差分」で verdict を出していた。 Internal と oracle が同 arXiv endpoint を叩く以上、 delta は定義上 ≡ 0。 「fetcher が動いていれば 0、止まれば大」以外の状態を検出できず、後者は計器 1 (source_freshness) で既に検出できていた。 50 本中 49 本欠落しても最新 1 本一致で TRUEを返す broken sensor。
Oracle 契約に askIdList(feed, limit) method 追加、直近 N 本の ID list を取得。
Internal set と set difference で「fetcher が publisher の直近 N 全部知ってるか」を測る。
missing = (oracle top-N IDs) \ (internal ID set) missingRatio = missingCount / effectiveWindow verdict: missingRatio ≤ 0.00 → TRUE (exact match, healthy) missingRatio ≤ 0.10 → NEITHER (aging) missingRatio ≤ 0.50 → FALSE (lagging) missingRatio > 0.50 → ZERO (dead)
最初の実測で 9/9 feeds ZERO / 40 missing 各 feed が出た。 だが原因は fetcher retention (10) < oracle window (50) = 設計上の窓 mismatch であって fetcher lag ではないと判明。
fix: effectiveWindow = min(oracleReturned, fetcherRetention)。
fetcher が 10 保持なら oracle top 10 とのみ diff。 「fetcher が知るべき最新 N を全部知ってるか」を測る。
fixed-window mode も選択可 (fetcher retention 上限含む絶対 lag 計測)。
| Feed | Verdict | Missing | Covered |
|---|---|---|---|
math.NT | TRUE | 0/10 (0%) | 10/10 |
math.LO | TRUE | 0/10 (0%) | 10/10 |
math.DG | TRUE | 0/10 (0%) | 10/10 |
cs.LO | TRUE | 0/10 (0%) | 10/10 |
cs.AI | TRUE | 0/10 (0%) | 10/10 |
cs.LG | TRUE | 0/10 (0%) | 10/10 |
cs.CL | TRUE | 0/10 (0%) | 10/10 |
physics.gen-ph | TRUE | 0/10 (0%) | 10/10 |
quant-ph | TRUE | 0/10 (0%) | 10/10 |
9/9 TRUE with covered 10/10 = arxiv-recent fetcher は publisher の直近 10 を全部取得済。 v0.1 の「delta 0 → TRUE」と数値は同じだが、 意味が根本的に異なる: v0.1 は感度ゼロの偽陽性、v0.2 は10 個の ID 個別一致による有意な verdict。
9/9 ZERO / 40 missing (80%) each feed。 これは fetcher lag ではなく設計上の retention 10 < 50 差。 fetcher の retention window を広げれば覆せる (別 STEP 候補)。
scripts/comparator/ ├── lib/ │ ├── oracle.ts — v0.2: OracleWithIdList (askIdList method 追加) │ └── oracle-arxiv.ts — askIdList impl + extractArxivIds + normalizeArxivId ├── gauges/ │ ├── harvest_lag.ts — v0.1 保持 (deprecated, chat-Claude 感度指摘対象) │ └── harvest_lag_v02.ts — NEW: ID-set diff + fetcher/fixed-window mode └── run-harvest-lag-v02.ts — CLI runner (3.5s ToU 遵守) test/step1607-harvest-lag-v02-id-set-diff-test.ts — 38/38 PASS (13 section)
normalizeArxivId: http://arxiv.org/abs/2608.27418v1 → 2608.27418 (URL prefix + vN suffix strip)| 時点 | 分類 (c) 汎用コンパレータ素子 |
|---|---|
| STEP 1601 v0.1 | 1 本 (arXiv max-published、chat-Claude 指摘で broken sensor 確定) |
| STEP 1607 v0.2 | 1 本 (arXiv ID-set diff + fetcher-window、感度 復活) |
| 次 STEP 候補 | Zenodo/HF/OpenAlex adapter で OracleWithIdList dogfood 拡大 |
windowMode='fetcher-window': effectiveWindow = min(oracleReturned, fetcherRetention)。 「fetcher retention < oracle window」を lag と誤診しない (設計 vs bug)。windowMode='fixed-window': fetcher retention 上限含む絶対 publisher-side loss を測る場合に。