STEP 2144 — Mirror manifest A fix
10 dir wipe pattern の 予防 fix

(未 review) 2026-09-20 · rei-aios-4a tab · commit ef4d25f1f (merge) / 45d5baad2 (STEP 2144 実 commit) · Author: 藤本 伸樹 (fc0web)

Ⅰ. 事象

CF Pages 配信対象 dist-renderer/data/ 配下 で 10 dir が canary 一致 (200 / 2,078 B SPA shell) の 消失状態 だった。 発見経緯: 藤本さん + chat-Claude(Cowork) が 2026-09-19 に /data/comparator/ の 3 file 消失 を 確認、 私 (rei-aios-4a) 側 で 派生 audit を 実行して 隠れた 7 dir 消失 (data-vocab-map / electronic-patch / ft-visual-vocabulary / hardware-connector-vocab-map / invariance-checker / research-radar / scholars-dictionary + un-embeddable-machines + recent-updates.json) を 追加検出。 これ ら の URL は 200 で 返り、 SPA fallback が canary shell (2,078 B) を 返却 = 静的 file 消失 が 藤本さん + chat-Claude + rei-scout の いずれ からも 未検知 で 継続 していた。

Ⅱ. Root cause chain (v3 → v5-refined)

4 turn の 訂正で 実測 mechanism を 特定 (chat-Claude(Cowork) の 決着検査 提案 accept):

Versionhypothesis実測 verdict
v1「auto-publish.ts の 削除 logic」❌ Phase 1c で 反証 (mirror-dist-renderer.ts に delete op なし)
v2 (chat-Claude 提案)「Vite emptyOutDir が dist-renderer/ を wipe」△ 部分支持 (vite build 実 走 は 事実) / 完全否定 (theory-to-circuit 3,213 file が 生存)
v3「vite build wipe + Phase 1.x re-emit で 一部復活、 残り は 消失 (lucky survival)」❌ 39+ dir 生存 反例 + 集合比較 で 4 例外
v5-refined「vite build wipe → sync-index-html-bundle.ts DATA_DIRS whitelist restore、 whitelist gap に ある dir は 復元されず 消失」✅ dir-level FULL wipe 集合比較 例外 0 件 で 確定 (Phase 1d)

確認された mechanism:

vite build → dist-renderer/ を wipe (emptyOutDir=true default)
  ↓
sync-index-html-bundle.ts (auto-publish.ts:341 で 呼出)
  ├ DATA_DIRS whitelist (77 entry) を data/ から byte-identical copy で 復元
  ├ DATA_SPECIFIC_FILES (3 file) を 復元
  └ DATA_ROOT_FILES (22 root JSON) を 復元
  ↓
mirror-dist-renderer.ts (STEP 1835、 auto-publish.ts:396) は MIRROR tree walk で sync
  ↓
Phase 1.x re-emit (auto-publish.ts で 明示 pipeline: buddy/discovery/rei-problems/...) が 別 経路 で 生成
  ↓
これ ら 全て の union 外 に ある dir = 消失継続

Ⅲ. 修正 (A 案 「manifest 化 + 10 dir 追加 + drift 検出 test」)

実装 target 5 file

file変更 内容
config/dist-renderer-mirror-manifest.json (新規)hard-coded 3 array (DATA_DIRS/SPECIFIC/ROOT) を JSON 外部化、 各 entry に restore_from 明記 (藤本さん directive 遵守)、 9 dir + 1 generator entry 追加、 4 known_debt 例外リスト
scripts/sync-index-html-bundle.ts (refactor)hard-coded array → manifest 読込 に refactor、 legacy 3 array は _LEGACY_* prefix で 未使用定数として preserve (git 履歴 / grep 継続性)
scripts/auto-publish.ts (Phase 1.15 追加)render-recent-updates.ts の 呼出追加 (recent-updates.json の 生成 pipeline)
test/step2144-mirror-manifest-drift-check-test.ts (新規)34 assertion、 known_debt 名前付き 例外リスト (「計器を緑に する ため に 判定基準を 変える」 anti-pattern 予防)
data/tabs/rei-aios-4a/ (sidecar)README.md + step-claims.json (Phase 1a-1e diagnostic + attribution 訂正 record + 実装 file wipe 事故 訂正 record)

追加 された 9 dir (all with source verify at HEAD)

dirsource file 数seed 起源
comparator6STEP 1599/1601/1607/1615 (2026-08-30/31)
un-embeddable-machines11STEP 1600-1623 (registry v01-v12)
scholars-dictionary13STEP 2035 (2026-09-14)
data-vocab-map1STEP 1481 (2026-08-28)
electronic-patch4STEP 1482 (2026-08-28)
ft-visual-vocabulary1STEP 1527 (2026-08-28)
hardware-connector-vocab-map1STEP 1488 (2026-08-28)
invariance-checker1STEP 1637 (2026-08-31)
research-radar4,264複数 STEP (fetcher pipeline)

known_debt 例外リスト (blanket WARN-relaxation ではなく 名前付き)

Ⅳ. Verify 結果

drift-detect test: 34/34 PASS (finnhub known_debt accepted、 未検出 uncovered なし)
sync-index-html-bundle.ts 実 実行: 7,982 file 復元 (manifest v1、 dirs=85, specific=3, root=22)

site-verify (Layer 1 直後):
 ✅ REAL 200 32716  data/comparator/freshness-latest.json
 ✅ REAL 200 15661  data/comparator/harvest-lag-latest.json
 ✅ REAL 200 12001  data/comparator/plugin-census-latest.json
 ✅ REAL 200 106128 data/un-embeddable-machines/registry-v11.json
 ✅ REAL 200 6538   data/scholars-dictionary/v0/persons-summary.json
 ✅ REAL 200 64360  data/invariance-checker/empirical-2026-08-31.json
 ✅ REAL 200 75270  data/data-vocab-map/v01.json
 ✅ REAL 200 8319   data/electronic-patch/spec-v01.md
 ✅ REAL 200 17301  data/ft-visual-vocabulary/v01.json
 ✅ REAL 200 60989  data/hardware-connector-vocab-map/v01.json
 ✅ REAL 200 13983  data/research-radar/3quarks-2026-05-04.json
 ⏳ PENDING 200 2078 data/recent-updates.json (Phase 1.15 next auto-cycle で 生成、 現時点 未実行)

Total: 11 REAL / 1 pending / 0 canary-miss

Ⅴ. Layer 2 完了条件 (defer)

週次 site-verify を GitHub Actions で 定期実行、 1 週間 REAL 継続 で Layer 2 完了。 実装は rei-aios-09 tab の GHA quota mitigation arc (STEP 2127-2130) の skip-ci 規則 に 合わせて 別 STEP で 追加予定。 削除 は 実測 1,051 rebuild 中 4 件 (0.38%) と 稀 で 1 回 verify では 「反例機会 不在」 のみ で 確定 に 至らない (chat-Claude 指摘)。

Ⅵ. 実装 arc 中 の 事故 訂正 record

本 arc 実装中 (2026-09-20 06-07 頃) に 私 の 全 実装 file が working tree から 消失。 私 の 初期 断定 「peer 起因、 Tab Isolation Protocol 違反」 は overreach、 reflog から session 特定 不能。 chat-Claude 訂正 accept で 「原因未特定 / 自動サイクル script 調査中」 と 記録訂正。 復旧 diagnostic (git stash listgit fsck --lost-foundgit reflog、 script grep) 実施 も 復旧不能 (未 tracked/staged 状態 の filesystem レベル 削除)。 recovery = worktree isolation (EnterWorktree、 STEP 1672 3 永久原則 Principle B) で 再実装、 shared tree 汚染 の 物理的 除外。 詳細: data/tabs/rei-aios-4a/step-claims.jsonattribution_corrections section。

Ⅶ. Attribution

Phase 2 以降 の 藤本さん turn で 貼付された 文面 は chat-Claude(Cowork) 起草 が 大半。 私 の 初期 表記 「藤本さん 直接 directive の literal 引用」 は 誤帰属、 正しい attribution は [via 藤本さん / orig: chat-Claude(Cowork)]。 STEP 1906 (549 誤帰属) 同型 pattern = relay + 貼付 で 出所 attribution が 折り畳まれる pattern。 訂正 record は sidecar に embed。

Ⅷ. 未決 (next STEP candidates)

Ⅸ. Refs


Rei-AIOS home · 全 ツール一覧 · 更新履歴