[{"data":1,"prerenderedAt":790},["ShallowReactive",2],{"content-/2026-07-31-diary":3,"all-pages-for-dir":773,"related-/2026-07-31-diary":774,"og-image-/2026-07-31-diary":789},{"id":4,"title":5,"body":6,"category":754,"concepts":755,"description":756,"extension":757,"meta":758,"navigation":678,"ogImage":755,"path":759,"project_name":760,"published":761,"publishedAt":762,"seo":763,"stem":764,"tags":765,"todo":755,"unpublished":761,"updatedAt":755,"__hash__":772},"pages/2026-07/2026-07-31/diary-2026-07-31.md","2026年7月31日の開発日記 - 消えたファイルの原因を物証で特定した日",{"type":7,"value":8,"toc":736},"minimark",[9,14,18,21,25,32,45,48,51,54,59,70,76,93,104,106,110,113,117,134,142,144,148,151,154,158,189,197,199,203,206,210,224,232,234,238,259,266,270,282,290,292,296,327,329,332,637,639,642,662,664,667,693,695,698],[10,11,13],"h1",{"id":12},"_2026年7月31日の開発日記","2026年7月31日の開発日記",[15,16,17],"p",{},"スタート検索にスキャナの取り込みアプリの名前を打ち込んでも、候補に出てこない。\nこの違和感から、2日前のファイル消失事故を洗い直すことになった。\n原因を指したのは、消えたディレクトリの外に落ちていた出力ファイルだった。",[15,19,20],{},"残りの時間は、ランチェスター戦略のスキル化と実機テスト、決算コメントの検算、蔵書データベースの運用、デプロイまわりの整理に使った。",[22,23,24],"h2",{"id":24},"今日のタイムライン",[15,26,27],{},[28,29],"img",{"alt":30,"src":31},"タイムライン","/2026-07/2026-07-31/timeline-2026-07-31.png",[33,34,35,39,42],"ul",{},[36,37,38],"li",{},"ログ管理（mdx-playground）: 22時間50分、18セッション、6,565メッセージ",[36,40,41],{},"ナレッジ管理（book-knowledge-base）: 4時間58分、2セッション、1,351メッセージ",[36,43,44],{},"稼働はおおむね 06:35 から 15:28 まで",[15,46,47],{},"セッションを並行して走らせているため、合計は実時間を超える。",[49,50],"hr",{},[22,52,53],{"id":53},"今日やったこと",[55,56,58],"h3",{"id":57},"_1-消えたファイルの原因を物証で特定した","1. 消えたファイルの原因を物証で特定した",[15,60,61,62,66,67,69],{},"2日前に ",[63,64,65],"code",{},"~/.claude"," が消えた事故の被害範囲が、こちらの把握よりずっと広かったと分かった。\nProgramData 配下のショートカット、スキャナのドキュメントプロファイル、スキャンPDFの保存先フォルダまで消えていた。\nごみ箱、イベントログ、シャドウコピーを順に当たったが、どれも空振りに終わった。\n決め手は、",[63,68,65],{}," の外にある一時ディレクトリに残っていたバックグラウンドコマンドの出力ファイルだった。\ncp932 でデコードし、8.3短縮名を実名に解決すると、再帰削除が2回走った痕跡が読めた。",[15,71,72],{},[73,74,75],"strong",{},"主な成果:",[33,77,78,81,84,87,90],{},[36,79,80],{},"証拠一式を外部SSDへ保全した",[36,82,83],{},"再発防止を4層で入れた（再帰削除の無条件ブロック、条件判定するフック、削除ログの記録、auto mode の分類器設定）",[36,85,86],{},"設計判断として、フック本体を消える側のディレクトリに置かないことを決めた",[36,88,89],{},"体感速度への影響を実測した（測定設計の失敗も含む）",[36,91,92],{},"削除コマンドの全文と実行に至った動機は、不明のまま残した。筋の通った仮説を2つ立てたが、裏が取れずに取り下げた",[15,94,95,98,99],{},[73,96,97],{},"詳細:"," ",[100,101,103],"a",{"href":102},"/recursive-delete-incident-postmortem","消えたファイルの原因を2日後に物証で特定した記録",[49,105],{},[55,107,109],{"id":108},"_2-ランチェスター戦略を2段スキルにして自分の事業で実機テストした","2. ランチェスター戦略を2段スキルにして自分の事業で実機テストした",[15,111,112],{},"蔵書データベースに入れた戦略理論の1冊を読み込ませ、スキルの形を検討した。\n最初に出てきたレポートは整っていたのに、読んでも明日やることが出てこない。\n現状診断と戦略策定の2工程に絞り、さらに更新頻度の違いから「自社プロファイル作成」と「競合局面診断」を別スキルに分けた。\nプロファイルのほうは複数の局面で使い回す。\n自分のコンテンツ事業を題材に実機テストして、出てきた不具合をスキル側へ書き戻した。",[15,114,115],{},[73,116,75],{},[33,118,119,122,125,128,131],{},[36,120,121],{},"「戦場を1つ選べ」に対して、全局面を分岐させる形で診断させた。テスト結果を受けて、複数局面を同時に走らせる形を既定に昇格した",[36,123,124],{},"外部AIのDeep Researchを競合調査に組み込んだ。プロンプトが空のまま走る事故が起きたので、スキルに注意書きを追記した",[36,126,127],{},"検討結果はHTMLにしてブラウザに表示し、判断事項はHTMLの選択フォームで回答した",[36,129,130],{},"成果物から「結局どう進めばいいのか」が読み取れず、結論セクションを冒頭に足させた",[36,132,133],{},"スライドに出てきた「止まっている先行者」が自分の講座だったので、競合リストから自社を除外する一行をスキルに加えた",[15,135,136,98,138],{},[73,137,97],{},[100,139,141],{"href":140},"/lanchester-two-stage-skill-design","ランチェスター戦略の競合診断をClaude Codeの2段スキルにして自分の事業で実機テストした",[49,143],{},[55,145,147],{"id":146},"_3-決算コメントの3年未満で回収を原文で検算した","3. 決算コメントの「3年未満で回収」を原文で検算した",[15,149,150],{},"回ってきた5点の要約を、原文と決算リリース、10-K に当たって突き合わせた。\n「3年未満で回収」の主語はサーバーとネットワーク機器に限られる。\n5点目については、そもそもそういう言い方をしていなかった。\n過去記事から「1ドルの支出で4年間で5ドルの収入」を拾おうとしたが取れず、全文検索させたところ今回が初出だった。",[15,152,153],{},"午後は3社比較に移った。\nEDGARから一次情報を取得し、予測の起点を2025年通年に作り直した。",[15,155,156],{},[73,157,75],{},[33,159,160,163,166,177],{},[36,161,162],{},"27%で噛み合う検算をSVG図解にした。半導体メーカー側トップの発言と整合するという指摘も記事に足した",[36,164,165],{},"ラベル配置を「順位 → 衝突検出 → 下へ逃がす」方式に変更した",[36,167,168,169,172,173,176],{},"純粋関数 ",[63,170,171],{},"cloudFcfProjection.ts"," と ",[63,174,175],{},"chartAxis.ts"," を切り出し、テスト26件を追加した（全体19,376件）",[36,178,179,180,184,185],{},"公開記事2本にまとまった: ",[100,181,183],{"href":182},"/amazon-q2-2026-capex-payback-factcheck","Amazonの「設備投資は3年未満で回収」を原文で確認した"," / ",[100,186,188],{"href":187},"/cloud-capex-fcf-breakeven-2026","クラウド3社の設備投資とフリーキャッシュフロー",[15,190,191,98,193],{},[73,192,97],{},[100,194,196],{"href":195},"/cloud-capex-chart-and-pure-functions","決算コメントの「3年未満で回収」を原文で検算し、クラウド設備投資チャートと純粋関数に落とすまで",[49,198],{},[55,200,202],{"id":201},"_4-蔵書データベースの運用整備と認証情報の正本移行","4. 蔵書データベースの運用整備と認証情報の正本移行",[15,204,205],{},"朝いちばんは取り込みだった。\n電子書籍リーダーで開いていた2冊を、撮影からOCR、DB投入、再構造化、画面確認まで通した。\nそのあと「別のPCでクローンすれば本棚が開くのか」を調べ直したら、認証情報ファイル1つで足止めされると分かった。\n正本を1Passwordに置き、ローカルは書き出した派生物として扱う方針に決めた。\n実行のたびに注入する形も検討したが、参照箇所が93と243あって現実的ではなかった。",[15,207,208],{},[73,209,75],{},[33,211,212,215,218,221],{},[36,213,214],{},"裁断スキャンPDF3冊の重複判定とOCR、再構造化を回し、飛ばしていた図表クリーンアップ工程を見つけた",[36,216,217],{},"5GB超あったリポジトリの内訳を調べ、変換時の残骸を掃除して .gitignore に追加した",[36,219,220],{},"353バイトと4,826バイトのファイルを取り違えて誤診した。調べ直したら、片方は誰からも読まれていない残骸だった",[36,222,223],{},"別の1冊をDBから取り出してスキル化の準備をした。テストは翌日に持ち越してタスク登録した",[15,225,226,98,228],{},[73,227,97],{},[100,229,231],{"href":230},"/book-db-ops-and-secret-source-of-truth","蔵書データベースの運用整備と、認証情報の正本を1Passwordに置く判断",[49,233],{},[55,235,237],{"id":236},"_5-dev-を止めずにデプロイできるようにした","5. dev を止めずにデプロイできるようにした",[15,239,240,241,172,244,247,248,251,252,172,255,258],{},"前日に入れたポート3000のガードで所要時間の計測スクリプトが止まった。\n原因は ",[63,242,243],{},"pnpm dev",[63,245,246],{},"pnpm generate"," が ",[63,249,250],{},".nuxt"," と Content の SQLite を共有していたことだった。\n禁止するのをやめ、generate 側だけ ",[63,253,254],{},".nuxt-build",[63,256,257],{},".data/content-build"," に逃がして競合そのものを消した。",[15,260,261,262,265],{},"dev を動かしたままの generate 検証は途中で二度止まった。\n",[63,263,264],{},"0xC0000142"," の正体は、dev 3つと chrome-devtools MCP 4つで 9.7GB を食っていたメモリ枯渇だった。\n掃除して完走させると、7/30 に落ちた検証2本が両方パスした。",[15,267,268],{},[73,269,75],{},[33,271,272,279],{},[36,273,274,275,278],{},"走りっぱなしのプロセスを自分では検知できない問題から、ステータスライン表示と ",[63,276,277],{},"/procs"," を作った",[36,280,281],{},"Claude Code 2.1.210 の更新で効かなくなっていた権限設定の行を削除した",[15,283,284,98,286],{},[73,285,97],{},[100,287,289],{"href":288},"/deploy-while-dev-running","dev サーバーを止めずにデプロイできるよう、Nuxt のビルド出力先と Content DB を分けた",[49,291],{},[55,293,295],{"id":294},"_6-その日書いた他の記事","6. その日書いた他の記事",[33,297,298,306,313,320],{},[36,299,300,301,305],{},"ランチェスター戦略の要点をまとめた解説を、非公開から公開に切り替えた: ",[100,302,304],{"href":303},"/lanchester-strategy-essence","ランチェスター戦略のエッセンスレポート","。あわせて事例図6枚を「Before/After を左右、打ち手を下段」の2段構成に変更した",[36,307,308,309],{},"知人とのやりとりをきっかけに、なぜ個別株の現物を中長期で持つのかを書いた: ",[100,310,312],{"href":311},"/why-individual-stocks-cash-longterm","個別株を現物で中長期に持つ理由",[36,314,315,316],{},"キャッシュレス決済手数料を、クレカ分とコード決済分で分ける消費税の扱いを解説した: ",[100,317,319],{"href":318},"/cashless-payment-fee-consumption-tax","キャッシュレス決済手数料の消費税区分と仕訳",[36,321,322,323],{},"職務経歴書の書き方の図を、使い回しの効くポンチ絵として作り直した: ",[100,324,326],{"href":325},"/resume-square-arrow-triangle-model","職務経歴書は3つの図形で語る",[49,328],{},[22,330,331],{"id":331},"今日の試行錯誤",[333,334,335,357],"table",{},[336,337,338],"thead",{},[339,340,341,345,348,351,354],"tr",{},[342,343,344],"th",{},"#",[342,346,347],{},"テーマ",[342,349,350],{},"試したこと",[342,352,353],{},"結果",[342,355,356],{},"気づき",[358,359,360,378,397,413,430,446,461,478,494,510,525,542,557,575,590,606,621],"tbody",{},[339,361,362,366,369,372,375],{},[363,364,365],"td",{},"1",[363,367,368],{},"消えたファイルの追跡",[363,370,371],{},"ごみ箱、イベントログ、シャドウコピー、復元ポイントを順に確認",[363,373,374],{},"失敗",[363,376,377],{},"Windows は既定でファイル削除を監査しない",[339,379,380,383,386,391,394],{},[363,381,382],{},"2",[363,384,385],{},"同上",[363,387,388,390],{},[63,389,65],{}," の外の一時ディレクトリに残ったコマンド出力を探した",[363,392,393],{},"成功",[363,395,396],{},"爆心地の外に落ちた副産物が唯一の物証になった",[339,398,399,402,405,408,410],{},[363,400,401],{},"3",[363,403,404],{},"物証の解読",[363,406,407],{},"出力をそのまま読もうとした",[363,409,374],{},[363,411,412],{},"cp932 デコードと8.3短縮名の解決が要る",[339,414,415,418,421,424,427],{},[363,416,417],{},"4",[363,419,420],{},"事故の動機の特定",[363,422,423],{},"筋の通った仮説を2つ立てた",[363,425,426],{},"取り下げ",[363,428,429],{},"裏が取れないものは推測で埋めない",[339,431,432,435,438,441,443],{},[363,433,434],{},"5",[363,436,437],{},"ランチェスターのスキル化",[363,439,440],{},"書籍の内容をそのままレポートにさせた",[363,442,374],{},[363,444,445],{},"整ってはいるが明日やることが出てこない",[339,447,448,451,453,456,458],{},[363,449,450],{},"6",[363,452,385],{},[363,454,455],{},"現状診断と戦略策定の2工程に絞り、2段スキルに分けた",[363,457,393],{},[363,459,460],{},"更新頻度が違うものは別スキルにすると使い回せる",[339,462,463,466,469,472,475],{},[363,464,465],{},"7",[363,467,468],{},"競合調査の外注",[363,470,471],{},"外部AIのDeep Researchに投げた",[363,473,474],{},"事故",[363,476,477],{},"プロンプトが空のまま走った。スキルに注意書きを追記",[339,479,480,483,486,489,491],{},[363,481,482],{},"8",[363,484,485],{},"診断結果の受け取り方",[363,487,488],{},"成果物をそのまま読んだ",[363,490,374],{},[363,492,493],{},"「結局どう進めばいいのか」が読み取れず、結論を冒頭に足させた",[339,495,496,499,502,505,507],{},[363,497,498],{},"9",[363,500,501],{},"決算コメントの検算",[363,503,504],{},"過去記事から数字を拾おうとした",[363,506,374],{},[363,508,509],{},"その表現は今回が初出だった",[339,511,512,515,517,520,522],{},[363,513,514],{},"10",[363,516,385],{},[363,518,519],{},"原文と決算リリース、10-K に当たり直した",[363,521,393],{},[363,523,524],{},"要約の主語が限定されていることに気づけた",[339,526,527,530,533,536,539],{},[363,528,529],{},"11",[363,531,532],{},"デプロイのガード",[363,534,535],{},"dev を止めてからデプロイする運用にしようとした",[363,537,538],{},"却下",[363,540,541],{},"止めずに済む方法があるなら禁止で解決しない",[339,543,544,547,549,552,554],{},[363,545,546],{},"12",[363,548,385],{},[363,550,551],{},"generate のビルド出力先と Content DB を分けた",[363,553,393],{},[363,555,556],{},"競合そのものを消せば禁止が要らなくなる",[339,558,559,562,565,568,570],{},[363,560,561],{},"13",[363,563,564],{},"generate が途中で止まる",[363,566,567],{},"再実行した",[363,569,374],{},[363,571,572,574],{},[63,573,264],{}," はメモリ枯渇のサイン",[339,576,577,580,582,585,587],{},[363,578,579],{},"14",[363,581,385],{},[363,583,584],{},"走っていた dev 3つと MCP 4つを掃除した",[363,586,393],{},[363,588,589],{},"自分では検知できないので一覧と掃除の口を作った",[339,591,592,595,598,601,603],{},[363,593,594],{},"15",[363,596,597],{},"認証情報の置き場",[363,599,600],{},"実行のたびに1Passwordから注入する形を検討",[363,602,538],{},[363,604,605],{},"参照箇所が93あって現実的でない",[339,607,608,611,613,616,618],{},[363,609,610],{},"16",[363,612,385],{},[363,614,615],{},"正本を1Passwordに置き、ローカルは書き出した派生物とした",[363,617,393],{},[363,619,620],{},"コードを1行も変えずに正本を移せる",[339,622,623,626,629,632,634],{},[363,624,625],{},"17",[363,627,628],{},"ファイルの取り違え",[363,630,631],{},"サイズだけ見て同じものだと判断した",[363,633,374],{},[363,635,636],{},"353バイトと4,826バイトは別物。片方は誰も読んでいない残骸だった",[49,638],{},[22,640,641],{"id":641},"今日の学び",[33,643,644,647,650,653,656,659],{},[36,645,646],{},"消えたものを全部特定できないのには、構造的な理由がある。失敗した削除しか記録に残らない",[36,648,649],{},"安全機構は、それ自身が消される側に置いてはいけない",[36,651,652],{},"裏が取れない仮説は、筋が通っていても取り下げる",[36,654,655],{},"スキルは「読める成果物」ではなく、「明日やることが出てくる成果物」を出させる形にする",[36,657,658],{},"禁止で解決する前に、競合そのものを消せないか考える",[36,660,661],{},"正本をどこに置くかを決めれば、コードを変えずに運用を変えられる",[49,663],{},[22,665,666],{"id":666},"明日やること",[33,668,671,681,687],{"className":669},[670],"contains-task-list",[36,672,675,680],{"className":673},[674],"task-list-item",[676,677],"input",{"disabled":678,"type":679},true,"checkbox"," 対人コミュニケーションの1冊から作ったスキルのテストを書く（タスク登録済み）",[36,682,684,686],{"className":683},[674],[676,685],{"disabled":678,"type":679}," 韓国の7月分輸出統計を取り込む（本日の実行時点では未公表）",[36,688,690,692],{"className":689},[674],[676,691],{"disabled":678,"type":679}," 決算データ取得元の再ログイン後に、7/31 発表分の四半期データを反映する",[49,694],{},[22,696,697],{"id":697},"関連記事",[33,699,700,704,708,712,716,720,724,728,732],{},[36,701,702],{},[100,703,103],{"href":102},[36,705,706],{},[100,707,141],{"href":140},[36,709,710],{},[100,711,196],{"href":195},[36,713,714],{},[100,715,231],{"href":230},[36,717,718],{},[100,719,289],{"href":288},[36,721,722],{},[100,723,304],{"href":303},[36,725,726],{},[100,727,312],{"href":311},[36,729,730],{},[100,731,319],{"href":318},[36,733,734],{},[100,735,326],{"href":325},{"title":737,"searchDepth":738,"depth":738,"links":739},"",2,[740,741,750,751,752,753],{"id":24,"depth":738,"text":24},{"id":53,"depth":738,"text":53,"children":742},[743,745,746,747,748,749],{"id":57,"depth":744,"text":58},3,{"id":108,"depth":744,"text":109},{"id":146,"depth":744,"text":147},{"id":201,"depth":744,"text":202},{"id":236,"depth":744,"text":237},{"id":294,"depth":744,"text":295},{"id":331,"depth":738,"text":331},{"id":641,"depth":738,"text":641},{"id":666,"depth":738,"text":666},{"id":697,"depth":738,"text":697},"diary",null,"2日前に消えたファイルの原因を、一時ディレクトリに残っていた出力から特定した。ほかにランチェスター戦略の2段スキル化と実機テスト、決算コメントの原文検算とチャート化、蔵書データベースの運用整備、dev を止めずにデプロイできる構成への変更。","md",{},"/2026-07-31-diary","daily-log",false,"2026-07-31T00:00:00.000Z",{"title":5,"description":756},"2026-07/2026-07-31/diary-2026-07-31",[766,767,768,769,770,771],"日記","Claude Code","インシデント調査","スキル設計","決算","Nuxt","d8nIchXcT1GfAPyYMmHjpGhnp8rV0t8FrIiZfDI-dgU",[],[775,779,783,787,788],{"title":776,"path":777,"publishedAt":778},"決算ビートスキャンに「発表日ゲート」を新設した話 — 0件こそ正しい結果","/earnings-beat-scan-announce-date-gate","2026-05-25T00:00:00.000Z",{"title":780,"path":781,"publishedAt":782},"2026年5月24日の開発日記 - 朝の自動化パイプラインだけを回した日（空白日フォールバックと決算二段観測）","/2026-05-24-diary","2026-05-24T00:00:00.000Z",{"title":784,"path":785,"publishedAt":786},"2026年4月28日の開発日記 - feature-slidesスキル新設、書籍OCR1181ページ、Amazon書棚UIまで1日で組み上げた","/2026-04-28-diary","2026-04-28T00:00:00.000Z",{"title":196,"path":195,"publishedAt":762},{"title":289,"path":288,"publishedAt":762},"https://log.eurekapu.com/og/blog/2026-07-31-diary.png?v=2026-07-31T00%3A00%3A00.000Z&title=2026%E5%B9%B47%E6%9C%8831%E6%97%A5%E3%81%AE%E9%96%8B%E7%99%BA%E6%97%A5%E8%A8%98%20-%20%E6%B6%88%E3%81%88%E3%81%9F%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E5%8E%9F%E5%9B%A0%E3%82%92%E7%89%A9%E8%A8%BC%E3%81%A7%E7%89%B9%E5%AE%9A%E3%81%97%E3%81%9F%E6%97%A5&author=Kei%20Komatsu&sig=c2cfcb771c983c9c",1785552664348]