chat-Claude 論文レビューで指摘された 「単一ベンチマークを hill-climb すると 未見の 別ベンチマークで −11.9% まで落ちる」 病理 (付録 D.1) の 構造的予防装置。 複数計器の 幾何平均を 目的関数にすると、 1 本でも ゼロなら 全体 ゼロ が 効くため、 弱い dimension を 他の 強い dimension で mask できない。
各 gauge score si ∈ [0, 1] は 「その gauge が 健康と 判定した 割合」。
実装は log-space (mean of log + exp) で 数値安定性を 確保、 si = 0 は log(0) 回避で short-circuit 返却。
| gauge | 入力 file | normalizer | 実測 score (2026-09-01) |
|---|---|---|---|
freshness | data/comparator/freshness-latest.json | cronSummary.fresh / cronSummary.total | 17 / 50 = 0.340 |
harvest_lag | data/comparator/harvest-lag-v02-latest.json | summary.fresh / summary.totalFeeds | 1 / 9 = 0.111 |
feed_cadence | data/comparator/feed-cadence-latest.json | ok+measured / total | 9 / 9 = 1.000 |
実測 aggregate: geoMean = (0.340 × 0.111 × 1.000)1/3 = 0.3355 → FALSE
ユーザーが 挙げた 3 つ目 dedup_collision は 現物が 未実装のため、 v0.1 は 実在する feed_cadence を 3 本目に 採用。 v0.2 で dedup_collision gauge 実装時に 加算可能 (N を 3 → 4 に 拡張、 anti-silent-pass 不変条件は 崩れない)。
| geoMean | D-FUMT₈ | 意味 |
|---|---|---|
| = 0 | ZERO | all-or-zero 発火 (1 本でも ゼロ) |
| (0, 0.5) | FALSE | aggregate 不健康 |
| [0.5, 0.75) | NEITHER | 中間帯、 判断保留 |
| [0.75, 1.0] | TRUE | aggregate 健康 |
| missing input / schema mismatch / zero-denominator | ABSTAIN | silent-skip 禁止 (下記 不変条件) |
| # | 条件 | ふるまい | 理由 |
|---|---|---|---|
| 1 | gauge input file が 欠落 | ABSTAIN、 生存 gauge で 計算しない | N を 減らすと geoMean が 上がる = 「dimension を 削れば 好スコア」 病理 (paper 付録 D.1) |
| 2 | denominator = 0 (総 source 0 件) | per-gauge NaN → aggregate ABSTAIN | 0/0 を silent 1.0 or 0.0 に 潰さない |
| 3 | score が [0, 1] 外 | throw (validation) | silent-clip 禁止、 caller 側の bug を surface |
| 4 | weight 調整 | v0.1 = 全 1 固定 | weight tuning は 事後合理化経路になり得る。 v0.2 defer + 実装時は 別 STEP で 監視素子 3 と 二重 verify |
| 5 | flowing (freshness) や notJudged (harvest_lag) | exclude ではなく not-fresh として denominator に 残す | 「skip を pass に 畳む」 病理 (STEP 1637 harvest_lag + STEP 1650 sougou run_all_tests) の 予防 |
$ npx tsx scripts/gate/run-geo-mean.ts geo-mean: 0.3355 → FALSE | freshness=0.340 | harvest_lag=0.111 | feed_cadence=1.000 written: data/gate/geo-mean-latest.json
解釈: feed_cadence は 満点 (1.000) だが、 harvest_lag が 1/9 で 弱い ため、 幾何平均が 0.34 に 落ちる。 算術平均なら (0.340 + 0.111 + 1.000) / 3 = 0.484 で もう少し 高く 見えるが、 幾何平均は 「弱い dimension を mask させない」 特性で 単一 gauge の 病理を 全体に 反映する。
$ npm run test:step1654 STEP 1654 tests: 72 passed, 0 failed
7 section, 72 assertion — core (geometricMean 数学) + mapToD8 (境界) + 3 normalizer (real shape + zero-denom + schema mismatch) + gate runner (missing / schema mismatch / zero-denom / <2 measured / all-or-zero / healthy / middle band + 実 production file 読込) + determinism。
| file | 役割 |
|---|---|
src/aios/gate/geometric-mean-gate.ts | library core (pure, no fs) |
scripts/gate/run-geo-mean.ts | CLI runner (fs 読込 + data/gate/ 出力) |
test/step1654-geo-mean-gate-test.ts | 7 section, 72 assertion |
data/gate/geo-mean-latest.json | 実測 output |
| # | 素子 | 状態 |
|---|---|---|
| 1 | ヒルクライム機械 (探索器) | 未着手 (提案器なし、 (c) route = 手動候補 + 評価器自動化 も 未) |
| 2 | 幾何平均ゲート素子 | 本 STEP で v0.1 実装完了 |
| 3 | チート後方監視素子 | 未着手 (ledger の 上に kind:"submission-hash" バインディングで 実装可能) |
| 4 | 凍結ミニ論文素子 | STEP 1359 で 実装済 (rei-preregister v0.1、 external anchor は v0.2 defer) |
feed_cadence を 採用 (ユーザー言及の dedup_collision は 現物未実装、 v0.2 で 拡張候補)。