• #執筆
  • #コンテンツ管理
  • #Nuxt Content
  • #外部リンク
  • #Micron
開発mdx-playground

Micron SOCAMM2 解説記事を仕上げるまでの編集プロセスと学び

この記事の位置づけ

2026-06-06 の朝、Micron が2日で約20%下げた件について解説記事を1本書いた(/micron-socamm2-capacity-cut)。完成した記事の中身そのものは別ファイルに残してあるので、ここでは 「どう書いて、どこで詰まって、どう直したか」 の編集プロセス側を残す。

書き終わってから振り返ると、踏んだ落とし穴の半分は技術的な仕様の理解不足、もう半分は「自分のサイトの非公開の作法」を勘違いしていたことから来ていた。次に似た記事を書くときに同じ穴に落ちないよう、時系列で記録する。

1. 元記事を一段階噛み砕いた

最初に渡したのは X のポスト本文だけだった。「Micron、2日で約20%安 | 市場が読み間違えたSOCAMM2の容量半減の理由 $MU」というタイトル相当の見出しと、SemiAnalysis のレポートに対する反応をまとめた本文。

ポスト原文のままでは、SOCAMM2 が何か知っている読者にしか刺さらない。Claude Code に対しては「一段階噛み砕いて、技術背景・需給ロジック・リスクまで丁寧に解説する形に書き直して」と指示した。

書き直しの結果として入った構造はこうなった:

  • 結論セクションを冒頭に出す(株価が動いた事実 → 売られた解釈 → その解釈は誤り、の3行で要点を伝える)
  • SOCAMM2 が何かを基礎から書く節を独立して立てる
  • 「容量半減」の中身を正確に分解する節(半減したのは1モジュールあたりで、モジュール数は増えている)
  • 需給ロジックを「供給逼迫下で出荷台数を増やすための設計判断」と言い切る節
  • 留保とリスクを最後に置く(弱気側の言い分も拾う)

つまり、原文の主張は変えず、前提知識ゼロの読者でも結論まで降りていける階段を間に挟んだ、という改稿だった。

2. 一番大きな学び:非公開化の方式を間違えた

ここが今日一番の学びだったので長めに書く。

最初、「非公開で保存して」と指示したら Claude Code は internal/2026-06-06/micron-socamm2-capacity-cut.md に置いた。content-management スキルにも「非公開ドキュメントは internal/ に置く」と書いてあるので、その通りに動いたわけだ。

ところが自分でブラウザを開いて確認すると、/blog/unpublished(dev 限定の非公開一覧ページ)に Micron 記事が出てこない。「非公開の一覧に入ってないんですけど。ちゃんと表示確認して」と差し戻した。

ここで Claude Code が腹落ちした説明を返してきた:

  • internal/ 配下は 完全な内部メモ。SQLite のインデックスにも入らないし、ビルド対象外。だから /blog/unpublished にも出ない
  • /blog/unpublishedcontent/ 配下にあって frontmatter に unpublished: true が付いている記事だけを拾う dev 限定ページ
  • 自分が欲しかったのは後者だった。internal/ は「本当に外に出さない開発メモ・指示書」のための場所で、「公開予定だがまだ非公開」のドラフトには使わない

つまり「非公開」という日本語に2つの意味があった:

用途置き場所frontmatter一覧表示
完全な内部メモ・指示書(一生公開しない)internal/{日付}/不要どこにも出ない
公開予定だがまだ未公開(ドラフト)content/{月}/{日付}/unpublished: true/blog/unpublished に出る

Claude Code には「content/ 配下に frontmatter 付きで作り直して、internal/ 側は削除して、dev サーバーで表示確認まで」と一気に投げた。最後に Chrome DevTools MCP で /blog/unpublished を開かせて、リスト上に Micron 記事が並んでいることを目視で確認した。

教訓: 「非公開で」と言うときは、internal/ 行きか unpublished: true 付きの content/ 行きかをセットで指定する。 スキルのドキュメントにも、この2方式の使い分け表を後で足したほうがいい。

3. Meritz Securities のオリジナルテーブルを画像から再現

途中で Meritz Securities Research Center のオリジナル表(SOCAMM2 容量別の出荷モジュール数推移)を画像で渡された。

画像認識でテーブルを読み取らせて、Markdown テーブルとして本文に差し込ませた。Total Volume 行と Source 注記を含めて再現させたのと、出典表記を表のすぐ下に置かせたのがポイント。

| Module Capacity | Old Forecast | New Forecast | Change |
|-----------------|--------------|--------------|--------|
| 192GB           | 100          | 50           | -50%   |
| 96GB            | 20           | 100          | +400%  |
| 64GB            | 60           | 90           | +50%   |
| **Total Volume**| **xxx**      | **xxx**      | **+10〜20%** |

> Source: Meritz Securities Research Center

表が入ったことで、本文の「総量はむしろ増えている」という主張に証拠を1つ添えられた。形容詞で「需給は強い」と書いてもただの感想だが、表があると「1モジュールあたり容量は半減したが、出荷モジュール数がそれ以上に積み上がる」という事実が読者の脳内で見える。

4. Dylan Patel の X ポストを実物に差し替えた

第4節は当初「Dylan Patel(SemiAnalysis)自身が、自社レポートの弱気解釈にXで釘を刺している」という形で書いていたが、引用が推測ベースだった。

ユーザーから「X サーチでちょっとリンク探してください」と指示が入った。x-search スキルを呼んで、Dylan Patel の @dylan522p アカウントから該当発言を検索した。

3本ヒットした。要点はだいたいこうだった:

  • 「自社が書いたことを引用する人は、たいてい中身の大半を読み落とす」
  • 「容量を削るのは需要が弱いからではなく、ラックあたりの稼働密度を上げるため」
  • 「初期はホットスワップで小さく出して、後から積み増す」

これらを推測の文章ではなく、実ポストの原文(英文) + 日本語訳 + URL に差し替えた。URL は <a href="..." target="_blank" rel="noopener noreferrer">→ 元ポスト(@dylan522p, 2026-06-04)</a> の形で貼った(理由は次節)。

ファクトに置き換えたら、第4節は「筆者の推測」から「Patel 本人の発言を集めた節」に格上げされた。引用元を出した時点で議論の格が一段上がった感覚があった。

5. 外部リンクを target="_blank" 化したら描画が崩れた

ここで2段階の罠を踏んだ。

段階1: 普通のマークダウンリンクで書いたら同タブで開いた

最初、X リンクをこう書いていた:

[元ポスト](https://x.com/dylan522p/status/1234567890)

これで描画はされたが、ブラウザで実際にクリックすると同じタブで X に飛んでしまう。本文を読んでいた読者を X に持っていかれて読書フローが切れる。「リンクの画面遷移をブロックでしたっけ、ブランクでしたっけ、タブ開くやつにしてください。新規タブ。」と指示した。

段階2: target="_blank" に変えたらリンクが二重に入れ子になった

target="_blank" を付けたいので、HTML アンカーで書き直させた:

<a href="https://x.com/dylan522p/status/1234567890" target="_blank" rel="noopener noreferrer">https://x.com/dylan522p/status/1234567890</a>

ところがブラウザで見ると、リンクの色が二重についていて、テキストが入れ子になっている。画面上のテキストが妙に重なって、クリック領域も2つの <a> が重なってぐにゃっとしている。

原因は @nuxt/content の GFM autolinker だった。アンカー要素の中に URL 文字列がそのまま入っていると、Markdown 処理段階で「URL らしい文字列」を見つけて自動でリンク化する。結果として:

<a href="https://x.com/..." target="_blank">
  <a href="https://x.com/...">https://x.com/...</a>
</a>

という入れ子の <a> ができていた。

段階3: リンクテキストを URL から「ラベル」に変える

直し方は単純だった。<a> の中身を URL 文字列ではなく、URL でないラベルに変える:

<a href="https://x.com/dylan522p/status/1234567890" target="_blank" rel="noopener noreferrer">→ 元ポスト(@dylan522p, 2026-06-04)</a>

これで autolinker は反応せず、1個の <a> だけが描画された。ブラウザで再確認したら3本とも target="_blank" 付きの単一リンクで出ていた。

ルールを永続化した

同じ事を後から繰り返さないために、.claude/rules/external-link-target-blank.md を作って外部リンクの書き方をルール化した。プロジェクトの CLAUDE.md からも参照を張った。NG / OK の例を3パターンずつ書いてあるので、次回からはこのファイルを見れば済む。

6. 周辺材料を並列でファクトチェック

最後にユーザーから「直近のメモリ価格の材料一覧」がまとめて投げられた。SemiAnalysis の SOCAMM 容量変更、Micron CEO 発言、SK hynix のコメント、Raymond James アナリストの動き、CEO の 10b5-1 売却、MU のハイベータ性、など複数項目。

「並列でファクトチェックして」と指示したら、Claude Code がサブエージェントを並列で走らせて、X / 公開資料から原文を取ってきた。並列にしたのは独立に検証できる項目が複数あったから。1件ずつ直列で調べると時間がかかるが、独立しているなら同時に投げて待つだけでいい。

並列ファクトチェック後、本文末尾に「周辺材料の整理(ファクトチェック済み)」セクションを追加した。SemiAnalysis のラックあたり SOCAMM DRAM が約55TB→約28TBに削減された件など、検証できた数字だけを残した。

試行錯誤テーブル

#テーマ試したこと結果気づき
1元記事の噛み砕きXポスト本文をそのまま提示 → Claude Code に「技術背景から書き直して」と指示結論先出し → 基礎 → 分解 → リスク、の構造に再編できた改稿は「階段を挟む」イメージ。主張は変えない
2非公開化internal/2026-06-06/ に保存/blog/unpublished 一覧に出てこなかったinternal/ は完全な内部メモ用。ドラフトは content/ + unpublished: true
3テーブル追加Meritz の表を画像認識で Markdown 化Total Volume 行と Source 注記まで再現できた表があると主張に画が宿る
4引用差し替え推測ベース → x-search で実ポストを3本特定 → 原文+日本語訳+URLSection 4 が「推測の節」から「Patel 本人の発言を集めた節」に格上げファクトを当てたら議論の格が一段上がる
5外部リンク (1)[元ポスト](URL) で記述同タブで開いて本文ページが上書きされた外部は別タブが原則
6外部リンク (2)<a target="_blank">URL</a> でアンカー化リンクが二重に入れ子になって描画が崩れたGFM autolinker が URL 文字列に反応する
7外部リンク (3)アンカー内のテキストを「→ 元ポスト」に差し替え1個の <a>target="_blank" 付き、崩れなしリンクテキストに URL を使わない
8並列ファクトチェック「並列で」と一言指示サブエージェントが独立に検証して原文を集めてきた独立項目は並列が効く
9コミット分割記事 / ルール / スクショの3単位で分けてコミット後から git log で意図が読める履歴になった論理単位で切ると git blame で追いやすい

7. 3つの論理単位でコミット分割

最後に、未コミットの変更を3単位に分けてコミットした:

  1. 記事本体apps/web/content/2026-06/2026-06-06/micron-socamm2-capacity-cut.md(374行追加)
  2. 外部リンクルール.claude/rules/external-link-target-blank.md 新規追加 + CLAUDE.md から参照
  3. スクリーンショット — Micron 記事の表示確認スクショ

memory-makers 関連や 6/5 の他記事は今回のセッションと無関係なので未ステージのまま残した。1コミットに全部混ぜると、後から git log で「何のためにこの変更が入ったか」が読めなくなる。

今日の学び

  • 「非公開」には2方式あるinternal/ 行き(完全な内部メモ)と、content/ + unpublished: true(公開予定のドラフト)。「非公開で」と指示するときはどっちかを明示する
  • 外部リンクは <a target="_blank" rel="noopener noreferrer"> で固定。リンクテキストには URL を使わない。.claude/rules/external-link-target-blank.md にルール化した
  • GFM autolinker は URL 文字列を勝手にリンク化する。HTML アンカー内に URL を入れると二重リンクで描画が崩れる
  • 引用は推測ではなく原文を当てる。x-search で1分かけて拾うだけで、節の格が一段上がる
  • 独立に検証できる項目は並列ファクトチェックが効く。「並列で」と一言入れるとサブエージェントが分担してくれる
  • コミットは論理単位で切る。記事・ルール・スクショを混ぜない

形容詞で「丁寧に解説した」と書くと自己満足で終わるが、動詞で書くと「結論を冒頭に出した」「基礎節を独立させた」「表を画像から再現した」「Patel の3本のポストを当てた」「<a target="_blank"> を1個に直した」と検証可能な事実が並ぶ。今回はそれを目視で確認して回せた回だった。