2026年6月6日の開発日記
今日は記事執筆の日だった。Micronが2日で20%下げたきっかけのSemiAnalysis SOCAMM2レポートを噛み砕いて解説する記事を、非公開ドラフトとして1本仕上げた。執筆そのものは1本だが、その過程で「非公開」のディレクトリ取り違え、Dylan Patelの実ポスト引き、GFM autolinkerの二重リンク崩れと、踏み抜くべき落とし穴を順番に踏み、最後に外部リンクtarget="_blank"ルールをプロジェクト永続化まで持っていけた。
今日のタイムライン

今日やったこと
1. Micron SOCAMM2「容量半減」記事を非公開で立ち上げ
Xポストの素案を、技術背景・需給ロジック・リスクまで一段階噛み砕いた構造に書き直した。「Rubin1ラックのSOCAMM2容量が55TB→28TBに削減」というSemiAnalysisの数字を、Meritz Securitiesのチャネルチェック(モジュール出荷数ベースでは+10〜20%増)と並べてバランスさせる構成にしてある。記事本体はまだ非公開のままだが、内部チェック用には十分仕上がっている。
詳細: Micron SOCAMM2 解説記事を仕上げるまでの編集プロセスと学び
2. 「非公開」の意味を取り違えてやり直し
最初internal/2026-06-06/に置いて満足していたら「非公開一覧に入ってないんですけど」と指摘が入った。internal/は完全な内部メモで/blog/unpublished一覧には出ず、正しい非公開ドラフト置き場はcontent/配下にunpublished: trueフラグを付けた記事だった。Claude Codeにinternal/からcontent/への移送と削除をさせて、/blog/unpublished画面で表示確認するところまでやり直した。「非公開」という言葉に2つの実装があると分かった瞬間。
3. Dylan Patelの実ポストをx-searchで引き当てて引用に差し替え
「SemiAnalysisのDylan Patel自身がXで釘を刺している」という記述を、推測ではなく実ポストに差し替えるためx-searchを回した。「自社が書いたことを引用する人は、たいてい中身の大半を読み落とす」に近いツイートが3本見つかり、原文・日本語訳・URLを記事のSection 4に差し込んだ。記事の品質が一段上がる手応えがあった。
4. 外部リンクが同タブで開く→target="_blank"修正→二重リンク崩れに引っかかる
Xポストへのリンクを普通のマークダウンで書いたら同タブで開いてしまい、本文を読んでいた読者がXに飛んだまま戻れない構造になっていた。<a href="..." target="_blank" rel="noopener noreferrer">に書き換えたら直る、と思いきや、リンクテキストに生のURLを入れたせいで@nuxt/contentのGFM autolinkerがそのURLをさらに<a>で包み、<a><a>...</a></a>の入れ子で青いリンクが2回光る描画崩れが出た。リンクテキストを「→ 元ポスト」「Meritz Securities Research Center」のようなURLでないラベルに変えて解決。
詳細: @nuxt/contentで外部リンクを別タブで開く+GFM autolinkerの二重リンク回避ルールを永続化
5. 外部リンクルールを.claude/rules/に永続化
同じ二重リンク崩れを2度踏まないよう、ルール本体を.claude/rules/external-link-target-blank.mdとして書かせ、プロジェクトルートのCLAUDE.mdの「ルール所在マップ」から参照を張った。「外部リンクの定義」「NGパターン2種」「OKパターン」「内部リンクとの住み分け」「チェックポイント」まで一気に固定。次から同じことで悩まないインフラができた。
6. 直近のメモリ価格材料を並列ファクトチェックして記事末尾に追加
「Semianalysisが55TB→28TBに削減」「サムスンHBM4初出荷遅延」「3D DRAM長期投資テーマ」など複数の材料を、サブエージェントに並列でファクトチェックさせて記事末尾の「周辺材料の整理」セクションにまとめさせた。主要4項目すべて検証できたが微修正は必要、というレベルでまとまった。
7. 3つの論理単位でコミット分割
記事 / ルール / スクショの3つでコミットを切った。1コミット1論点で履歴を読みやすくする狙い。残りの未ステージファイル(memory-makers関連、6/5の記事など)は別作業なので触らず残した。
今日の試行錯誤
| # | テーマ | 試したこと | 結果 | 気づき |
|---|---|---|---|---|
| 1 | 非公開記事の置き場所 | internal/2026-06-06/に保存 | NG(/blog/unpublishedに出ない) | internal/は完全な内部メモ用。非公開ドラフトはcontent/+unpublished: true |
| 2 | 非公開記事の置き場所(修正後) | content/2026-06/2026-06-06/にunpublished: true付きで再作成 | OK(/blog/unpublished一覧に出る) | フラグの有無で「非公開ドラフト」と「内部メモ」が分かれる |
| 3 | Dylan Patelの引用 | 推測の引用文を書く | NG(事実根拠が弱い) | 推測で書かず、x-searchで実ポストを探す |
| 4 | Dylan Patelの引用(修正後) | x-searchで該当ポスト3本を取得 | OK(原文・日本語訳・URL付き) | 引用は実物に当たる |
| 5 | 外部リンク | 普通のマークダウン[label](url) | NG(同タブで開く) | マークダウンにはtarget属性を渡せない |
| 6 | 外部リンク(修正後・1回目) | <a href="url" target="_blank">url</a>(テキストにURL) | NG(二重リンクで青く2回光る) | GFM autolinkerが<a>内のURLをさらに<a>で包む |
| 7 | 外部リンク(修正後・2回目) | リンクテキストを「→ 元ポスト」などURLでないラベルに | OK(1リンクでtarget="_blank"が効く) | autolinkerが反応しないテキストにする |
| 8 | ルール永続化 | .claude/rules/external-link-target-blank.mdに書き、CLAUDE.mdから参照 | OK | 同じ落とし穴を2度踏まないインフラ化 |
| 9 | メモリ価格材料 | サブエージェント並列でファクトチェック | OK(4項目検証) | 並列ファクトチェックは記事品質を底上げする |
今日の学び
- 「非公開」という言葉には2つの実装がある:
internal/配下の完全な内部メモと、content/配下のunpublished: true付きドラフト。前者は一覧にも出ない、後者は/blog/unpublishedで見える。次から「非公開で」と言われたら、どちらかを最初に確認する - GFM autolinkerは
<a>の中身まで見にいく:<a>タグで囲んでも、中のURLをさらにリンク化してしまうケースがある。<a>の中身は「URLっぽい文字列」を避ける - 同じ落とし穴は記事内ルールではなくプロジェクトルールに昇格させる: 1記事だけのメモにすると、別記事を書く頃には忘れる。
.claude/rules/に書いてCLAUDE.mdから参照を張ると、次に同じ操作をするときClaude Codeが自動的に読みにいってくれる - 引用は実物に当たる: 「Dylan Patelが言っている」をx-searchで実ポストに紐付けると、記事の信頼度が一段上がる。x-searchはこういう「実物当てる」用途に強い
- 並列ファクトチェックは1人作業より速い: 4項目を並列で投げると待ち時間が短い