---
name: project-stash-22-close-arc-2026-08-15
description: stash 22 cleanup 完全 close (session B 分類 + drop + config + protocol + site postmortem 2 commit → session A 3 依頼 完遂 = rebase -X theirs + untracked md5-一致 delete + push + _to_delete rm + .git/refs/stash rm、 final 6-point verify all ✓)
metadata: 
  node_type: memory
  type: project
  originSessionId: a9cbca08-7e38-4614-8e10-5fb8dd19bef4
  modified: 2026-08-15T14:49:41.995Z
---

# stash 22 close arc — session B 分類完遂 → session A 3 依頼実行 (2026-08-15)

## 前提 (pending state = [[project-stash-22-analysis-and-pending-decisions-2026-08-15]])

- 22 本 分析完了 + 3 pending decision 藤本さん帰宅後 GO 待ち
- session A (私) = 「進んだものを 私からお伝え致します」 で 待機、 rei-aios 触らず

## Phase 1: session B 実行完遂 (分析 → close、 藤本さん転送で私が初認識)

### 分類 = 3 分類の 1 (実 WIP) が 該当ゼロ で 確定

| 分類 | 本数 | 内訳 |
|---|---|---|
| 完全 auto-gen (data/ dist-renderer/ snapshots/ のみ) | 17 | — |
| auto-gen + 生成物 4 file | 4 | #15 #17 #20 #21 |
| untracked のみ (全て data/) | 1 | #11 |
| **実 WIP (src/ 手書き code, test/, *.lean 等)** | **0** | — |

「auto-gen 以外」 に見えた 4 file も 全て generator が実在:
- `metadb.html` / `metadb-manifest.json` → `scripts/build-cfpages-metadb.ts`
- `src/renderer/rei-stats.json` → `scripts/generate-stats.ts` (commit 名 「Auto: rei-stats refresh」)
- `tools/onshoku-jiten/index.html` → STEP 1228 音色辞書 daily auto-curation

**22 本 6,700 file 全件 再生成可能** = 分類 1 に全落ち = 個別 apply 不要、 全 drop で 情報損失ゼロ。

### archive = patch でなく永続 ref

**patch 却下理由**: 1 本 12 MB (#5, 460 file) × 22 ≒ **200 MB を repo に恒久搭載** + untracked (stash の 3rd parent) の再現性が落ちる。

**採用**: 全 22 本を `refs/attic/stash-2026-08-15/00〜21` に `update-ref` = 追加 0 byte + 完全忠実 + gc 対象外。 復元は `git stash store -m "..." refs/attic/stash-2026-08-15/<N>`。 一覧は `.claude/attic/stashes-2026-08-15/MANIFEST.md`。

### 構造的原因 = Track 4 の 19 unmerged と同一 欠陥

**決め手**: stash を作る script が 0 本 (`scripts/` `.github/` `.claude/` 全走査 hit ゼロ) = 22 本 全て session が手打ち。

**5-step 因果連鎖**:
1. tracked 34,516 file のうち `data/` 24,000 + `dist-renderer/` 4,988 = **84% が機械生成物**
2. cron が常時 350〜460 file を書き換え → worktree が clean になる瞬間 なし
3. push 前に必ず `cannot rebase: You have unstaged changes` で停止
4. **`rebase.autoStash` 未設定** → 毎回手で `git stash`
5. pop 時に cron 新出力と conflict → 放置
6. 2 ヶ月 × 2〜3 日おき = 22 本

**Track 4 19 unmerged = step [5] そのもの** (MERGE_HEAD 不在 = merge 中断ではなく pop 残骸)。 stash 累積と unmerged 放置は **同一 1 つの欠陥の 2 症状**。

**Fix**: `git config rebase.autoStash true` + `pull.rebase true` の 2 行で 連鎖 [4] を切断。

### session B の 2 commit (未 push で pause)

- `ec15cb32f` docs: stash 22 本の構造原因調査 + 並行 session protocol + site postmortem
- `7acb84d79` docs(attic): stash 22 本の退避一覧 MANIFEST

**成果物**:
- `docs/PARALLEL_SESSION_AND_STASH_PROTOCOL.md` — 運用規約
- `public/postmortem-stash-22.html` + `dist-renderer/` mirror — site 掲載用 postmortem
- `.claude/attic/stashes-2026-08-15/MANIFEST.md` — 22 本一覧 + 復元手順

### 追加発見: mount 越し git の 制約 catalog (protocol §3)

| 操作 | 可否 |
|---|---|
| `git update-ref` / `git config` / `git stash drop <n>` | ✅ |
| `git reset` | 成功するが `HEAD.lock` + `main.lock` 残留 |
| `git stash clear` | ✗ (`refs/stash` unlink 必要) |
| `git commit` | 43s timeout (index 34,516 entry refresh) → `write-tree` + `commit-tree` + `update-ref` で代替 |

残留 `.lock` は 次回以降の git を 全て `cannot lock ref` で失敗させる → 書き込み後 必ず `find .git -name '*.lock'` で掃除必要。

### session B からの 3 依頼 (mount 越しで 実行不可)

1. **push** — device VM network 遮断 (`git ls-remote` が proxy から 403)
2. **`rm -rf _to_delete/`** — 6 file、 git の `.lock` を unlink 不可で mv 退避した先
3. **`rm .git/refs/stash`** — 41 byte 残骸、 `git stash list` 空で機能上無害だが完全 clean 目的

## Phase 2: session A (私) 実行 — GO 承認後

### Pre-verify で 訂正発見

- session B report = 「ahead 2 (`ec15cb32f` + `7acb84d79`)」
- 実測 = **ahead 3** = 上記 2 + `ad570ed33 Auto: site rebuild + stats refresh (SEED 1675 / STEP 1336 / Papers 176)`
- 原因: session B report 後に local cron が 追加 Auto commit を打った

### push 初回 rejected

remote に GHA cron 2 commit が 先着:
- `bdcdc55ba` 🧠 Rei自律進化サイクル
- `ac3d9d945` 🌱 Rei学習サイクル: 2026-08-15 14:36 JST

### Conflict risk assess

**交差 file = 2 個**:
- `data/daily-banner.json` (local `ad570ed33`: 84 行 diff, remote `bdcdc55ba`: 18 行 diff)
- `dist-renderer/data/daily-banner.json` (mirror)

**方針**: `-X theirs` = remote (GHA cron atomically newer 14:36 JST cycle) 優先。 session B の docs 2 commit は daily-banner.json を触らないため 完全温存。

### rebase 初回 fail = untracked blocker

```
error: The following untracked working tree files would be overwritten by checkout:
	data/buddy/daily-2026-08-15.json
	dist-renderer/data/buddy/daily-2026-08-15.json
```

**md5 比較 実測**:
```
local:  9529fce938051374e554ac8bea407754
remote: 9529fce938051374e554ac8bea407754
→ IDENTICAL (bit-for-bit)
```

= local cron が 生成した内容と remote cron が track した内容 が 完全一致 (両 cron が 同一 source から 独立生成 して 決定論的に 同結果)。 安全 delete → rebase 再試行。

### rebase 成功 + 3 新 hash

```
ec15cb32f → 23ba17580  docs: stash 22 構造原因
7acb84d79 → 749edb311  docs(attic): MANIFEST
ad570ed33 → cefbbfcf6  Auto: site rebuild
```

autoStash 発火 (`3e87a8fcf` created + applied) = **設定の初 稼働 evidence**。 session B 設定 `rebase.autoStash=true` が 初 fire で 正常動作 verify。

### push 成功

```
bdcdc55ba..cefbbfcf6  main -> main
```

### Step 2 + 3

- `rm -rf _to_delete/` = 6 個の 0-byte `.lock` 退避 file 全削除
- `rm .git/refs/stash` = 41 byte 残骸削除

### Final 6-point verify all ✓

| item | state |
|---|---|
| ahead / behind vs origin | `0 / 0` |
| git stash list | 0 本 |
| refs/attic/stash-2026-08-15/ | **22 本 全生存** (drop なし = ref 退避 policy 遵守) |
| rebase.autoStash | `true` |
| pull.rebase | `true` |
| `_to_delete/` | 無 |
| `.git/refs/stash` | 無 |
| `.git/**/*.lock` | 0 個 |

## 学び (retrospective)

### 1. 「送信された」 vs 「commit されている」 は 別事象

session B が commit 済 (11:47-11:57、 `ec15cb32f` + `7acb84d79`) だが 私 (session A) の memory には 未 record。 藤本さん転送で 私が **初認識** = 「file 自体は既に配置済だが 完成報告としての受信は 今 が 初回」 の gap 明示。 [[feedback-success-signal-decoupled-from-operational-state-2026-08-14]] の **13 例目 = commit signal green だが cross-session state propagation gap** (11-12 例に続く並行 session 系 subtype、 但し 損失なし = catalog として retain)。

### 2. 「pre-flight verify で 訂正発見」 pattern

session B report = ahead 2 → 実測 = ahead 3 (local cron Auto commit 追加)。 pre-flight `git log origin/main..HEAD` 一発で判明。 [[feedback-one-reproduction-over-ten-unverified]] 「1 件でも説明できない差があれば計器は未検証」 継承、 実行前 verify で 静かに訂正。

### 3. untracked md5-一致 delete = 安全 fast path

両 cron が 同一 source から 独立生成 して bit-for-bit 一致 = 決定論的 generator の性質 evidence。 rebase blocker 解消の **安全な fast path**、 差異あれば backup、 一致なら delete。 汎用 rebase-conflict resolution pattern として retain (次回 同 pattern 遭遇時に 直接適用可能)。

### 4. `-X theirs` = cron collision の 一般解

data/ dist-renderer/ の cron collision は **local + remote どちらも atomically 正しい**、 「後勝ち」 policy で問題なし。 `-X theirs` (remote 優先) は cron cycle の atomic 一貫性を保つ。 逆に docs/ src/ の 手書き conflict は `-X` 使わず 手動 resolve (semantic 判断必要)。 file 種別で 戦略 切替 = 84% cron 生成 repo の 実践 pattern。

### 5. autoStash + pull.rebase = 初 fire で 正常動作

session B が set した 2 config が **本 arc で 初稼働** し 正常 fire。 5-step 因果連鎖の [4] 切断 evidence。 22 本 stash 累積 + Track 4 19 unmerged と 同型の 未来 incident を 予防する 構造的 fix が **operationally verified**。

## 関連

- [[project-stash-22-analysis-and-pending-decisions-2026-08-15]] (前段 = pending state、 本 file で close 相当)
- [[project-rei-aios-track3-4-close-2026-08-15]] (同一欠陥の Track 4 症状、 併合治癒 = stash 22 + unmerged 19 = 6-step 連鎖の 別出口)
- [[feedback-success-signal-decoupled-from-operational-state-2026-08-14]] (13 例目 = cross-session state propagation gap 追加)
- [[feedback-one-reproduction-over-ten-unverified]] (pre-flight verify で ahead 2→3 訂正 = 順序原則 継承)
- [[feedback-independent-verification-cross-agent-collaboration-2026-08-15]] (session B ↔ session A cross-agent 分担 実例)
- `docs/PARALLEL_SESSION_AND_STASH_PROTOCOL.md` (運用規約、 rebased hash `23ba17580` で origin 反映)
- `public/postmortem-stash-22.html` (site 掲載、 CF Pages deploy 発火中)
