---
name: feedback-dist-renderer-mass-delete-prevention-protocol
description: dist-renderer/ への commit 時 mandatory pre-check 永続原則 (10 軸目) — vite build 単独 + git add dist-renderer/ 全選択は generated children を削除する。 STEP 1055 既知教訓を 2026-06-19 STEP 1228b で再度違反した self-incident 5 件目から抽出。 2026-06-25 commit 6ab644011 で tools/* root fix 完了 (public/tools/ relocation)、 oukc/* は適用継続。
metadata: 
  node_type: memory
  type: feedback
  originSessionId: c5b0ac29-996a-419f-89f7-b38a5da3a52c
  modified: 2026-08-03T02:56:20.100Z
---

# dist-renderer/ への commit 時 mandatory pre-check protocol

## ★ 2026-06-25 update — tools/* root fix 完了 + oukc/* 適用継続

| 適用範囲 | Before fix (2026-05-11〜06-25 AM) | After fix (commit 6ab644011) |
|---|---|---|
| `dist-renderer/tools/*` (4 dir: andrica / auto-prover / infinite-dot-theory / q33) | ⚠ 10 軸目 protocol 必須 | ✅ **root fix 完了** — public/tools/ が source of truth、 vite publicDir → outDir copy で自動保護、 .gitignore で dist-renderer/tools/ ignore |
| `dist-renderer/oukc/*` (5 dir) | ⚠ 10 軸目 protocol 必須 | ⚠ **継続適用** — scripts/build-oukc-static-pages.ts が生成、 public/ 化未実施 |
| `dist-renderer/data/*` | ⚠ ただし auto-publish.ts が re-emit cover 済 | ⚠ 同左 (変化なし) |
| 将来追加の static tools | — | ★ `public/tools/<新 tool>/` 配置で自動保護対象 |

★ 次回 oukc/* も同 pattern で root fix する場合は public/oukc/* relocate + scripts/build-oukc-static-pages.ts を撤廃 OR public/ への直接生成に切替。

## 永続原則 (10 軸目, oukc/* に限定継続適用)

`vite build` 単独実行後に `git add dist-renderer/oukc/` するのは **禁止**。 公開 site の oukc/ 子ページ群が静かに削除される (tools/* は 2026-06-25 root fix で対象外)。

## Why

`vite build` は dist-renderer/ を **vite の output dir として扱い**、 vite 管理外 file (= `scripts/build-oukc-static-pages.ts` 等が別途生成した HTML) を stale 認定して削除する。 削除自体は build process の正常動作だが、 そのまま `git add dist-renderer/` で取り込むと「公開 site の page が消える commit」 になる。

dev:build chain は順序設計があり、 vite build の後に build-oukc-static-pages.ts + sync-index-html-bundle.ts + 多数の generate-*.ts script が走って削除分を regenerate する。 chain 全体を実行しないと dist-renderer/ は不完全。

## How to apply

dist-renderer/ への変更を含む commit を作る前に **3 段 mandatory check**:

1. **vite build 単独禁止 → 必ず dev:build chain (or 最低 build-oukc-static-pages.ts 追加)**
   ```bash
   # ❌ NG (vite build のみ)
   npx vite build && git add dist-renderer/
   
   # ✅ OK (full chain or 必要 generator も追加)
   npm run dev:build
   # もしくは部分でも:
   npx vite build && npx tsx scripts/build-oukc-static-pages.ts && npx tsx scripts/sync-index-html-bundle.ts
   ```

2. **git add dist-renderer/ 前に必ず `git status --short dist-renderer/` で 「D」 line を目視検閲**
   ```bash
   git status --short dist-renderer/ | grep -E '^[ ]?D' | head -20
   ```
   1 行でも `D dist-renderer/oukc/...` or `D dist-renderer/tools/...` が出たら **pause** → 該当 page を regenerate してから git add。

3. **commit message draft 段で `delete mode` が出たら必ず pause + 確認**
   git commit の出力に `delete mode 100644 dist-renderer/...` が含まれていたら、 commit は成立してしまっているので **直後の push 前に確認**:
   - 意図した削除か? (例: tool 廃止)
   - 意図しない削除なら **即 generator 再 run + 追加 commit で復活** (push 順位は問題なし、 CF Pages auto-deploy が最新 commit を反映)

## 違反事故記録

### 2026-06-19 STEP 1228b 大量 delete 事故 (self-incident 5 件目)

commit `f756ae750` で `vite build` のみ実行 → `git add dist-renderer/` で以下 8 page が delete として commit + push:

```
dist-renderer/oukc/methodology/index.html
dist-renderer/oukc/observatory/index.html
dist-renderer/oukc/papers/index.html
dist-renderer/oukc/policy/index.html
dist-renderer/oukc/reproducibility/index.html
dist-renderer/tools/andrica/index.html
dist-renderer/tools/auto-prover/index.html
dist-renderer/tools/q33/index.html
```

公開 site が 1-2 分間 404 状態。 直後に commit `c3cc8973b` で `build-oukc-static-pages.ts` を run + git add + push で復活確認 (oukc/papers → HTTP 200 / tools/auto-prover → HTTP 200)。

### Pattern 一致確認

これは **CLAUDE.md STEP 1055 既知教訓** ([2026-05-11 incident] 「直前 commit `9f215a89` で oukc/ + tools/ + sitemap/robots **大量 delete** 事故発生 → 即 commit `59327fb2` で復活」) と **完全同一 pattern**。 既に永続原則化されていたが、 本 session で再度違反 = protocol が私 (Claude) の actionable check として inscribed されていなかった。 本 file で actionable check (3 段 grep + status 検閲 + delete mode 検閲) として再 inscribe。

### 2026-08-03 大量 delete 事故 (self-incident 6 件目) — **git stash pop 由来 (新 trigger pattern)**

commit `03670456d` (math-engine-radar v0.1) で **336 files unintended 混入 + 16 files 削除** 事故発生。 削除内訳:
- 12 dist-renderer/oukc/*/index.html (charter / code-of-conduct / contributing / education / index / lean-progress / lens / methodology / observatory / papers / policy / reproducibility)
- 4 data files (learning-log-2026-05-03, 05-04, open-problems 2026-05-02, 05-03 sessions)

公開 site の /oukc/ 全 12 page が 404 状態 (数分〜数十分間、 recovery commit `e26231e87` で復活)。

**Root cause (新 trigger pattern)**: **vite build ではない**。 以下の順序で発生:
1. 直前 commit d63d6a901 (circuit-radar) push 拒否 (remote 5 auto commits 先行)
2. `git stash push --include-untracked` で working tree の cron auto files を退避
3. `git pull --rebase -X theirs origin main` で rebase 完了
4. `git push` 成功
5. `git stash pop` で退避を復元 → **5 UU conflict 発生 (data/daily-banner.json 等)**
6. UU files のみ `git checkout HEAD -- <file>` で HEAD 版採用で resolve
7. `git stash drop` で cleanup
8. **★★★ ここで staging area は clean と思い込んだ が、 実際は 330+ files が staging に残っていた**
9. 次 commit で `git add data/research-radar/collatz-watch.json docs/RECENT_UPDATES.md` の後、 `git commit -F ...` を **`git status --short` verify なしで実行**
10. 結果: staging に残っていた 330+ files が 2 intended files と一緒に commit

**Root cause の本質**: `git stash pop` で conflict がなかった files は **working tree + index (staging area) の両方に stash 内容が適用** される。 UU conflict のみ手動 resolve したが、 auto-applied な非 conflict files (数百件) は staging に残ったまま。 これに気付かず `git commit` 実行 → 全部混入。

### 新 trigger 対応 protocol (2026-08-03 追加、 11 軸目)

★ **git stash pop 直後の commit は必ず `git status --short` で staging area 全体 verify**:

```bash
# ❌ NG (stash pop 直後の思い込み commit)
git stash pop
# ... UU resolve ...
git stash drop
git add specific-file.md
git commit -F msg.txt   # ← staging に stash 由来 330 files 残存

# ✅ OK (stash pop 後は必ず staging area 全 verify)
git stash pop
# ... UU resolve ...
git stash drop
git status --short     # ← 期待は clean (working tree に空 or 意図した変更のみ)
                       # ← 予想外の A/M/D が並んでいたら pause
git reset HEAD .       # ← 必要なら staging area 全 clear
git add specific-file.md
git status --short     # ← 再確認、 staged 数が意図と一致するか
git commit -F msg.txt
```

**Reflexive check**: `git commit` 実行前に必ず「これから何 file が commit に入るのか」 を明示的に count で確認する。 「2 file だけ add したから 2 file だけのはず」 は **stash pop / merge / rebase 後には成立しない**。

### 大量 delete 事故 3 件累積の教訓

| # | 日付 | trigger | 削除範囲 |
|---|------|---------|---------|
| 5-old | 2026-05-11 (STEP 1055) | vite build のみ + `git add dist-renderer/` | oukc/ + tools/ + sitemap/robots |
| 5-new | 2026-06-19 (STEP 1228b) | vite build のみ + `git add dist-renderer/` | 8 page (oukc/tools mix) |
| 6 | 2026-08-03 (本 incident) | **git stash pop + status verify skip** | 12 oukc/*/index.html + 4 data files |

★ trigger diversification: 「vite build」 systematic root cause は既 (2026-06-25) tools/* 側 fix 済 (public/tools/ relocation)。 oukc/* は継続適用中。 **本 incident は vite build 経由でない = git workflow 層の新 trigger pattern** = protocol の適用範囲を「vite build 系」 だけでなく「任意の commit 前」 に拡張必要。

**永続原則の一般化 (2026-08-03 update)**:

> ★★ **commit 前 `git status --short` verify を default 行動化する** — vite build 経由か否か、 stash pop 経由か否か、 rebase 経由か否か、 に関わらず、 「今から commit する staged files が本当に意図した set か」 を毎回明示的 verify する。

これは Antipattern の 第 4 形態: 「**staging area の思い込み**」 (git add の side effect を assumed clean と信じすぎる)。 Antipattern 第 1-3 (vite build output 信じすぎ / chat-Claude 信じすぎ / 信じなさすぎ) と同 family。

### 2026-06-25 PM session で tools/* root fix 実施 (commit 6ab644011)

本 session で藤本さん「mass-delete を直すには?」 質問 → Rei 原因調査 → `vite.config.ts` の `outDir: 'dist-renderer'` + `emptyOutDir` 未明示 (default true) が root cause と特定。 `scripts/auto-publish.ts` line 339 で `npx vite build` を呼んだ後 line 344+ で約 50 generator を re-run するが、 `dist-renderer/tools/*` は generator なし static deploy だったため re-emit されず、 working tree から削除される pattern が確定。

★ 3 option 比較 (本 file 末尾 protocol 検討表) → **Option 2 (public/tools/ relocation) 採用**:
- commit `6ab644011`: `git mv dist-renderer/tools public/tools` で 4 dir rename (100% match preservation)
- commit `66f044d68`: .gitignore で `dist-renderer/tools/` ignore (build artifact 化明示)
- vite build 実 verify: 3.93s 完了 + `dist-renderer/tools/` 4 dir 自動 regenerate + §7 callout 1172 行完全保持

Rationale (Option 1 emptyOutDir:false 不採用): 古い vite asset (assets/*.js hash 古版) が累積する trade-off が継続 maintenance burden になる。 Option 2 は vite の `publicDir = 'public'` (default) 規約に乗る = 副作用なし + 標準 pattern + 既存 4 tools 同時保護 + 将来 tools 追加 (占い辞書 / Voynich notation 等) も同 pattern で自動保護。

将来 oukc/* も同 root fix する場合: scripts/build-oukc-static-pages.ts を public/oukc/* 直接生成に切替 OR public/oukc/* relocate + scripts 撤廃 (5 page 移動 + nav link 確認必要、 工数は tools/* root fix より大)。

## Reflexive scope

本 protocol を自分自身に reflexive 適用するのは **常時**:
- 「dev:build 重そうだから vite build だけ」 という近道判断を pause
- 「commit message draft 内 delete mode line」 を斜め読みせず必ず読む
- push 後 site reach verify する習慣 (本 incident は curl polling で deploy 後 oukc/papers が一瞬 404 になっていたことを検出した = post-push verify は重要)

## 関連永続原則 + self-incident series

- [[feedback-paper-publish-verification-discipline]] — 9 軸目 (paper publish 前 publish-log 必ず read)
- [[reference-rei-aios-capacity-baseline-2026-06-19]] — capacity 推測 self-incident series。 本 incident で 5 件目に到達 (capacity 2 + onshoku reach 推測 + code-future-lens 反映 推測 + 大量 delete)
- [[feedback-chat-claude-hallucination-warning]] — Antipattern 「過度の reject 警戒」 = 信じすぎ警戒 + 信じなさすぎ警戒の両極端、 本 protocol は 「**vite build の output を信じすぎる**」 (= chain 後段の generator output が自然に保たれると無検閲で信じた) の Antipattern 第三形態
- CLAUDE.md SITE_COVERAGE_MAP protocol — 「実装 ≠ 反映」 事故防止 entry point、 本 protocol は git layer での補強
- STEP 1055 (2026-05-11) — 同 pattern の初発生 + 修正、 本 protocol で形式化が遅れた lesson
