STEP 2171 · orphan-gauge v0.6 · 2026-09-21 · rei-aios-fe

孤立度計 v0.6 — cap error + git ctime diff

chat-Claude Code review が 6 指摘 (D=cap再発防止、 #1=mtime食い違い、 B=recall未測、 C=参照抽出穴、 A=意図宣言軸、 感度分析)。 推奨順序 D→B→C→A の 第 1 段。 「20k→50k で 上げただけ」 の temporary bandage を、 cap 到達 = non-zero exit + partial 警告 + opt-in bypass に 昇格 (D)。 mtime axis 置換 は 未実施、 かわりに git commit ctime との 食い違い を 併記 (#1、 置換 判断は 量を 見てから の chat-Claude 推奨)。

Attribution: [via 藤本さん / orig: chat-Claude Code review 2026-09-21 D+#1 recommendation]
Route: chat-Claude 6 point audit → 藤本さん explicit go (D+#1 から 起工) → rei-aios-fe tab で 実装 → 64/64 test PASS → 実 repo evidence 281 divergence 実測 → commit 7341dc2b6 → 本 site page (帰宅後 review 待ち status「(未 review)」)。
Prior arc: STEP 1926 v0.1 → v0.6-beta arc (装置 role の cleanup → audit shift)、 STEP 1909 chat-Claude simulator (起源)。

D = cap-hit を silent に 通さない

v0.5 (STEP 1954) は maxFiles 上限を 20,000 → 50,000 に 上げただけ で、 cap に 到達しても 沈黙 して 部分結果 を 返す 振る舞い は 残っていた。 呼び手 は「その 数字は 全 tree か partial か」 を 出力から 判別できず、 過去 measure が 全部 cap 前 だった 可能性 が 蓄積される。

v0.6 の 変更:

実 exit code verify

$ npx tsx scripts/orphan-gauge.ts --targets src --limit 100 --skip-git-diff
    → exit 1  (cap hit, --allow-cap-hit 未指定)

$ npx tsx scripts/orphan-gauge.ts --targets src --limit 100 --allow-cap-hit --skip-git-diff
    → exit 0  (cap hit だが suppress)

$ npx tsx scripts/orphan-gauge.ts --targets src --limit 5000 --skip-git-diff
    → exit 0  (no cap, 2148 files 全 scan)

#1 = mtime vs git commit ctime の 食い違い

更新 axis は 従来 mtime に 頼っていた が、 git clone / git checkout / snapshot restore / bulk editor save で 中身は同じ のに mtime が 「今」 に reset される。 結果、 中身が 古い のに LIVE 判定 (誤 LIVE) や RUIN → LIVE 化 が 起きる。

v0.6 は mtime 定義の 置換 は 未実施 のまま (chat-Claude 推奨: 食い違いの 量を 見てから 判断)。 かわりに 併記診断:

実 repo 経験 (src/ target, 2148 files, 2026-09-21)

281 件 mtime vs ctime divergence 実測 (99.9% tracked-file coverage)。 最大 Δ = 16.8 日 (src/aios/invention/invention-engine.ts mtime=2026-08-20 vs ctime=2026-08-03)。 chat-Claude #1 の 懸念 が 本 repo で empirical evidence を 持つ = rebase / checkout / snapshot restore 由来 の mtime reset が 現在の LIVE/RUIN 判定 を 汚染 している 可能性 が 具体 case で 確認済。

Test coverage (64/64 PASS)

test setcountdomain
既存 T1–T27~50quadrant 分類 + consumption mode + tmp dir e2e (未変更 migrate)
新 T-D01–T-D077cap-hit detection: 10 files + maxFiles=3 で artifacts=3 / totalObserved=10 / capHit=true、 no-cap で capHit=falsegauge() propagation
新 T-G01–T-G066git-ctime: 60d divergence 拾う、 2d 閾値以下 は 拾わない、 untracked は skip (0 で扱わない)、 100d 閾値 で 60d silence、 ctimeCoverage = 2/3、 空 input で 0

Honest scope

主張する

主張しない

推奨順序 D → B → C → A (chat-Claude review 引用)

STEP candidate内容status
1D + #1 (本 STEP 2171)cap-hit non-zero exit + mtime vs git-ctime diff 併記LANDED
2v0.7 = Bfixture 4 case (拡張子省略 import / DEAD 源 ref / mtime 単独 reset / known-orphan) + baseline recall metricdefer
3v0.8 = CTS 拡張子省略 import 拾う regex + tsconfig alias + entry-point reachability filter、 完了後 n=50 監査 やり直しdefer
4v0.9 = Amanifest / frontmatter で 保存意図 明示、 RUIN ∧ 宣言なし = 規律違反 flagdefer

各 defer item は 藤本さん explicit go signal 待ち。 私 独断 起工 なし。

Failure mode (未来 Claude 用 dataset)

Pattern

cap-hit を silent に 通す cli は 「その数字は 何の 数字か」 を 呼び手が 判別不能。 STEP 1926 v0.4 の 389 件 measure が 全部 cap 前 の partial だった 可能性 が 露見不能 のまま 蓄積、 v0.5 の 上限 引き上げ は temporary bandage で 根本予防 ではない。

Prevention

cli の default は 「不完全 は 沈黙 しない」 = non-zero exit + 実 total 出力。 「意図的に partial で 良い」 use case は explicit flag で opt-in (--allow-cap-hit)。

Recovery

過去 measure の cap-hit 疑い は --limit 500000 --allow-cap-hit で 再 scan し totalObserved を 過去 record と diff。 差 > 0 なら 過去 record は partial confirmed。

Related discipline

chat-Claude 推奨 B (recall fixture) は D 後 が 正しい 順序 = D で cap 起因 の measurement noise を 除去した baseline で recall を 測る。 逆順 は「recall が 下がったのは C の 副作用か cap 起因か」 分離不能。