4日で autostash が7件溜まり ALERT が鳴った件。全7件を HEAD と突合した結果、救出すべき内容はゼロでした(refs/stash-archive に固定済み・stash list は整理済み)。
本題は「なぜ溜まるのか」です。調べた結論は .gitignore が足りないのではなく、git が追跡しているファイルを無人タスクが書きっぱなしにしている ことでした。対処法は既にこの repo の中にあります。
Otakeさんにしか答えが無いものだけ。ここをお願いします。
repo 直下に平文の API キー一式が置かれています。どう処置しますか要判断RISK
不可逆・認証情報今回のトリアージ中に見つけた別件です(stash とは無関係)。
`C:\dev\Claude_WorkFolder\.env.bak_20260811_callrec`(68行)。中身は GEMINI / GROK / OPENAI / ANTHROPIC / NOTION / SPOTIFY / PLAUD などのキーが平文のまま入っています。
問題は .gitignore に引っかからないことです。`.env` にも `*.bak` にもマッチしないため、`git status` に常時 untracked で出続けます。`git add -A` を一度叩けば GitHub に上がります(現状はまだ commit されていません)。
通話録音パイプラインの作業中(8/11)に取られた退避コピーと思われます。正本の `.env` は健在で、age で暗号化して同期されています。
今回どこまで直しますか要判断
1時間・全て巻き戻し可下の「追認」で仕分けた13ファイルすべてに手を入れるか、頻度の高いものだけに絞るかの投資判断です。
作業量の目安:
・全件 … 書き手9スクリプトに1〜3行ずつ追加 + .gitignore 2行 + 移設3件。おおよそ1時間、全部が巻き戻し可能な変更です
・上位のみ … autostash 発生源の上位6件で、体感の9割は消えます
私の見立ては全件です。刻むと「残り7件がまだ溜まる」状態が続き、ALERT が鳴るたびに『これは既知の残りか、新しい事故か』の判別に毎回コストがかかります。鳴っている警報の意味を濁らせないほうが安いと考えます。
推奨 ① 全13件を一括で直す — ②は残りが鳴り続けて ALERT の意味が濁る。③は次に同じ調査をやり直す分が丸ごと無駄になる
無回答なら ①で進めます
私が決めました。違うものだけ触ってください(無操作=この通り進めます)。
根本原因は「.gitignore 不足」ではなく「追跡しているのに誰も commit しない」追認
見立ての土台無人の定期タスクが git 追跡下のファイルを書き換える → 作業ツリーが dirty → repo_sync の pull が autostash を作る → 誰もそのファイルを書き直さないので、退避されたまま戻らない、という連鎖です。
この対処は既にこの repo にあります。2026-08-01(pricing-uploader の16行が消えた事故)で `scripts/_git_sync.py` の `commit_ledger()` が作られ、7箇所に適用済みでした。
実測すると、今 dirty を作っている書き手8本は全部これを呼んでいません。恒久対策そのものは正しく、横展開が途中で止まっていただけです。
推奨 ① この見立てでいい — 「全部 .gitignore」は、下の A3 の9件が持つ復元不能な履歴・cross-PC 共有をまとめて壊す
無回答なら この見立てで進めます
仕分けは2択ではなく4択で行いました追認
分類の枠組み「追跡する/しない」の2択だと、どちらを選んでも壊れるファイルが出ます。この repo には既に4つ目までの前例が揃っていたので、それに合わせました。
A. 追跡継続+即 commit … 履歴や2機共有が要る台帳(前例: morning_build の commit_ledgers)
B. .gitignore … ローカル再生成で足りる派生物(前例: portal-internal の reviews.html)
C. 作業ツリーの外へ移設 … 消えると事故る「状態」ファイル(前例: 2026-07-22 に run_status.json を `%USERPROFILE%\.claude\health\` へ移設済み)
D. CI 再生成に寄せる … deploy 元だが決定論的に作れるもの(前例: otake_docs の index.html)
推奨 ① この4分類でいい — 2択に丸めると、C に当たる3件が「共有する意味は無いが消えると事故る」の谷に落ちる
無回答なら この4分類で進めます
【A:追跡を続ける】9件 — 書き手に commit_ledger() を1行足す追認
9ファイル / 書き手8本に各1行gitignore してはいけない側です。理由を1件ずつ確認しました。
■ 履歴が取り直せない(消えたら終わり)
・`scripts/otake_index/manifest_health_history.json` … URL ping の直近90日。過去日は二度と取れません。朝の morning_build は既に commit していますが、毎時走る `email_agent/run_cron.py` が同じファイルを書いて commit していない ← これが最大の穴
・`data/owner_pl/manifest.json` … 施設×月のPDF在庫台帳。前回分をベースにマージする設計なので、巻き戻ると過去の送付記録ごと消えます
・`data/health_check/summary.json` + `owner_report_coverage.json` … 週次の健診記録
■ 2機で共有していないと本番が壊れる
・`scripts/deploy/manifests/otake-docs.json` … これが一番危険。cf_pages_guard が「前回配ったファイル一覧」として持つ台帳で、2026-07-23 に本番ページが消えた事故の対策そのものです。古い版に巻き戻ると guard が誤判定します
■ GitHub Actions が読む(CI 側では作れない)
・`output/deploy/otake_docs/search_index.json`
・`scripts/pages_index/projects_cache.json`
・`scripts/otake_index/log_state.json`
■ 追跡すると既に決めてある
・`data/line_concierge/corpus/state.json` … `corpus/README.md` に「追跡する」と明記済み。決定を尊重します
推奨 ① この9件は追跡のままでいい — ignore にすると、上3件は履歴が永久に失われ、manifest は本番削除ガードが効かなくなる
無回答なら 9件は追跡のまま commit_ledger を足します
【C:作業ツリーの外へ移設】3件 — 2026-07-22 と同じ手当て追認
3ファイル / 移設のみ「2機で共有する意味は無いが、branch 切替で消えると誤動作する」ファイルです。gitignore だと git の巻き戻しからは守れますが、worktree を跨いだときに実体が分裂します。移設先は前例と同じ `%USERPROFILE%\.claude\health\<subsystem>\`。
・`data/memory_headroom_state.json`(82B)… BLADE の物理メモリ実測に基づく通知抑制フラグ。機ごとに値が違うので、git で共有すると2台が上書きし合います
・`scripts/dreaming/nightly_run_state.json`(307B)… BLADE 専用の夜間実行状態。DELL では走りません
・`scripts/cleaner_calendar/kv_refresh_state.json`(974B)… KV push 済みマーカー
2026-07-22 に run_status.json 系3本を同じ理由で移設したときの記録が `sync_requests/standing_run_status_heartbeats.json` に残っています(branch 切替で状態が消え、doctor が誤判定した事故)。同型なので同じ場所に寄せます。
推奨 ① ツリー外へ移設でいい — ②は「消える」ほうの事故(branch 切替・worktree 分裂)を防げない。7/22 はまさにそれで doctor が誤判定した
無回答なら %USERPROFILE%\.claude\health\ へ移設します
【B:.gitignore に入れる】2件 — 既存の前例と同カテゴリ追認
2ファイル / .gitignore に2行・`output/deploy/otake_portal_internal/ops/schedule/index.html` … ビルド生成物。同じディレクトリの `index.html` と `ops/facility/*/reviews.html` は既に理由付きで ignore 済みなので、完全に同じ枠です(デプロイは wrangler がフォルダごと上げるため、追跡外でも本番には載ります)
・`data/yhr_gateway/session_state.json` … 今回 untracked のまま出ていた新顔。同じ枠に入れます
追記する2行には、既存の .gitignore と同じ流儀で「なぜ ignore するか」の理由コメントを添えます。
推奨 ① ignore でいい — 追跡し続けると、毎回のビルドで40commit/60日の churn を生み続ける割に、履歴を読む価値がゼロ
無回答なら 理由コメント付きで .gitignore に足します
search_index.json は「CI 再生成」に寄せません追認
判断が割れた1件60日で109コミット・70KB と、churn が最も大きいファイルです。同じフォルダの `index.html` は既に「追跡せず CI で再生成」に寄せてあるので、当然そこに揃えたくなります。
が、寄せられません。 `build_search_index.py` の入力に `output/deploy//index.html` が含まれており、そのほとんどは .gitignore 対象です。CI ランナーには実体が無いので、寄せると検索インデックスが痩せたまま本番に載ります**(壊れず、静かに劣化する=一番たちが悪い形)。
よって A3 と同じ「追跡+即 commit」に置きます。churn は残りますが、autostash は止まります。
推奨 ① 追跡+即commit でいい — ②は検索が静かに劣化する。壊れて気づくならまだしも、気づけない形の劣化は避けたい
無回答なら 追跡のまま即commit にします
対策N(stash 見張り)のしきい値は触りません追認
変更なし「60分以上残っていたら置き去り」「2サイクル連続で1回だけ鳴らす」の設定はそのままにします。
今回 ALERT は正しく鳴っています。溜まっていたのは事実で、警報は仕事をしました。ここでしきい値を緩めると、次に本物の取りこぼしが起きたときに鳴らなくなります。直すのは発生源であって、警報ではありません。
上の対処が入れば、鳴る回数は自然にゼロへ近づきます。
推奨 ① 触らないでいい — 警報側を緩めるのは、2026-07-31 に実データを失った事故の再発防止をわざわざ弱める行為
無回答なら しきい値はそのままにします
実装・反映済みの事後報告。読むだけで大丈夫です。
溜まっていた7件は全件突合済み・救出ゼロ・SHA は固定済み済
報告のみ内訳は JSON_OLD 64件 / SAME 33件 / SUBSET 1件 / UNIQUE 12件。UNIQUE の12件も全て旧世代・ローテーション済みログ・旧ビルド生成物で、HEAD より新しい内容は1件もありませんでした。
`git stash clear` で一覧は整理済みですが、全SHA を `refs/stash-archive/` に固定してあるので、後から必要になっても取り出せます(対策N の設計どおり・容量ゼロ)。
推奨 ① 了解
回答テキスト(自動生成・差分だけ出ます)
下の枠内で Ctrl+A → Ctrl+C でコピー