2026年5月22日の開発日記
朝は前日の /make-diary を回しながら Bloom Energy の四半期ガイダンス事情を脇道で調べ、昼前から 1Password Environments MCP の整理、午後はずっと NVIDIA Q1 FY27 決算書き起こし と SpaceX S-1(145万字HTML)の章別読解、さらに 非公開フラグ機構の構築(Phase -1)と テスト失敗の復旧計画書 → Codex 4ラウンドレビューまで一気通貫で進めた1日。サイト基盤と長文記事を同時に動かしたので、watcher が記事を見失う場面や、内部リンクが SSG ビルドで漏えい検出されてビルドが落ちる事故も挟まった。
今日のタイムライン

今日やったこと
1. 1Password Environments MCP の整理記事
2026-05-20 公開の 1Password ブログ記事を起点に、CLI 版 op run と MCP 版の関係を「誰が叩くインターフェースか」軸で整理した。CLI は開発者本人 / op run 経由でアプリプロセスに値を注入、MCP は AI エージェントが叩く層で、値そのものは AI のコンテキストに出ない。MCP でできることは基本 CLI / API でも全部できる(部分集合)、という誤解解消セクションも追加。
実機検証もして、winget install で op CLI を入れて、ダミーAPIキーを op に登録 → GUI で同アイテムが見えること → op run --env-file=.env.template でプロセス起動時にだけ値が注入されることを確認した。マイナンバーカードが手元になかったので e-Tax の自動ログインまでは届かず、明日に持ち越し。
主な成果:
- 公開記事をコミット(
f8a6ee0a) internal/2026-05-22/に明日続きを試すための引き継ぎノートを置いた
詳細: 1Password Environments MCP — Codex / Claude Code に「秘密を見せずに環境変数を任せる」レイヤー
2. NVIDIA Q1 FY27 決算書き起こしと、サイト表示問題の整備
Motley Fool の "Nvidia (NVDA) Q1 2027 Earnings Transcript" を agent-browser で全文取らせて、過去Q3記事と同じスタイルで日本語訳した。820億ドル / YoY +85%、Hyperscale/ACIE/Edge の新セグメント、Vera CPU 20B、自社株買い 80B 枠。
記事ができてから「/blog 一覧で新記事が出ない問題」「Breadcrumb で Home がリンクにならない問題」「画像クリックで拡大モーダル化」「セグメント別 SVG チャート4枚」を順に潰した。/blog の問題は useAsyncData の getCachedData が payload を再利用していて、SQLite が更新されていても古い payload が固定される、という構造的なやつ。dev 時のみ payload キャッシュを無効化して 1064件 → 1073件に復活した。
主な成果:
- NVIDIA 記事は後で非公開化(Motley Fool 出典なので公開維持はリスク)
ProseImg.vue新規でサイト全画像に拡大モーダル- セグメント別売上の積み上げ棒 / 分離棒 / QoQ / YoY の SVG 4枚を記事に同梱
- Breadcrumb ロジックを
app/utils/に切り出して Vitest 14件追加
詳細: NVIDIA Q1 FY27 書き起こしを作りながら、/blog の SPA キャッシュ・Breadcrumb・画像モーダル・SVG チャートをまとめて整備した日
3. 非公開フラグ(unpublished: true)の opt-in 設計と漏えい遮断機構
NVIDIA 記事を即非公開にしたかったが、published: z.boolean() だと Nuxt Content の SQLite default で未指定の記事も published=false になって区別がつかない問題に当たった。unpublished: true の opt-in 設計に切り替え、未指定 = 公開・明示 unpublished:true のみ非公開、と意味を逆転させた。
Codex から「unpublished:true でも本文がダダ漏れの構造」と致命的指摘3件をもらって、Phase -1.1〜-1.4 として漏えい遮断機構(_raw / 3ページのフィルタ / generate-redirects / generate-sitemap / dist HTML 検証 / payload)を整備。CLAUDE.md に「pnpm generate は最終確認の1回だけ」運用ルールも追記した。Phase 1 で Tier 1 の16件を一括非公開化して 1件 → 19件 に拡大。
主な成果:
app/utils/find-leaked-unpublished-links.tsを純粋関数として切り出しscripts/verify-unpublished-links-in-source.mjsとverify-unpublished-excluded.mjsの2段検証tests/unpublished-link-leakage.test.tsで実 content を流す Vitest 追加/blog/unpublished専用ページを dev 限定で表示
詳細: Nuxt Content サイトに非公開フラグを導入し、HTML・サイトマップ・payload からの漏えいを遮断するまで
4. SpaceX S-1(145万字 HTML)の章別読解と公開記事化
2026-05-20 に SEC EDGAR へ提出された SpaceX Form S-1 を、curl + SEC公式の User-Agent で取り出して、BeautifulSoup で XBRL タグを剥がしてプレーンテキスト化(145万字 / 28,107行)。Prospectus Summary から Risk → MD&A → Business → Management → Underwriting → Financial Statements → Subsequent Events まで全章読解。
Anthropic への月 1.25B コンピュート契約、10B Cursor termination、Class A/B デュアル議決権で Musk 支配 85.1%、Performance 株 $7.5T マイルストン、PwC 無限定適正意見、22項目のリスク。xAI(2026-02-02取得)と X(旧Twitter、xAI 経由で2025-03-28取込)を取り込んだ「3社統合体」としての連結再表示が一番の発見。
記事化したあとで KaTeX が $18.7B をペアでインライン数式として解釈してフォントが崩れていることに気づいて、Python で $ を $(HTMLエンティティ)に一括置換。テーブルも米国式(右が古い)から日本式(左が古い → 右が新しい)に並び替え。dev server の watcher が記事を見失う場面が1日に何度もあって、その都度 touch で復活させた。
主な成果:
- 公開記事
spacex-s1-summary.mdを作成(ティッカー SPCX) - KaTeX
$衝突修正の置換パターンを確立
詳細: SpaceX S-1(145万字HTML)を EDGAR から取り出して章単位で読み解いて公開記事化するまでの作業ログ
5. テスト失敗復旧計画と Codex 4 ラウンドレビュー
measure-deploy.ps1 でビルド時間を測定中に、postgenerate ステージで verify-unpublished-excluded.mjs が exit 1。公開済み日記から非公開記事への Markdown リンクが9件残っていて、dist HTML に <a href> として漏えいしていた。
最初は「unpublished を外せば楽」と提案したが、ユーザーから「それは意図と違う、公開記事になっちゃう」と止められた。フラグはそのまま、日記側のリンクを [テキスト](/path) → テキスト(未公開) に12箇所一括 Edit。さらに pnpm test:run を build の前置きに組み込もうとしたが、別件で22件のテスト失敗が残っていて build まで届かないため revert。代わりに memo/2026-05-23/test-failures-recovery-plan.md に復旧計画を整理。Codex に4ラウンドレビューさせて致命的指摘(独立検算ベース化 / git worktree 利用 / cwd 明記等)を全て潰した。
主な成果:
- 内部リンク12箇所をプレーンテキスト化
- 検証スクリプトを
app/utils/に純粋関数化して Vitest 化 - 計画書を Codex 4ラウンドレビューで最終形まで持っていって、明日の積み残しとして Google タスクに登録
詳細: ビルドが postgenerate で落ち、テスト失敗復旧計画を Codex に4ラウンドレビューさせた話
今日の試行錯誤
| # | テーマ | 試したこと | 結果 | 気づき |
|---|---|---|---|---|
| 1 | EDGAR から SpaceX S-1 を取る | WebFetch | 403 | EDGAR は自動化ツール検出が厳しい |
| 2 | 同上 | agent-browser | 自動化ツール検出ページ | ブラウザ経由でも EDGAR は弾く |
| 3 | 同上 | curl + SEC公式 User-Agent | 取得成功 | SEC は連絡先入りの UA だけ通す |
| 4 | published で非公開判定 | published: z.boolean() | 未指定も false で返る | SQLite default が罠 |
| 5 | 非公開判定の設計 | unpublished: z.boolean().optional() の opt-in | 未指定は undefined で公開扱い | opt-in 設計で SQLite 挙動を回避 |
| 6 | /blog で新記事が出ない | dev 起動後の追加記事だから? | 違う、payload キャッシュ問題 | useAsyncData の getCachedData が原因 |
| 7 | KaTeX $ の衝突 | awk で \$ 置換 | 効かなかった | Python に切り替えて成功 |
| 8 | 大量 ProseImg の SVG 表示崩れ | <span> wrapper + inline-block | SVG が 2x2px に潰れた | wrapper を排除して <img> 単体に |
| 9 | dev server が記事を見失う | リロード待ち | 404 のまま | touch でタイムスタンプ更新が一番速い |
| 10 | 漏えいリンクの解消 | unpublished を外す | ユーザー却下(意図違い) | フラグは残してリンク側をプレーン化 |
| 11 | build に test:run を前置き | measure-deploy.ps1 改修 | 別件22件失敗で進めず | 計画書化して先送り、改修は revert |
| 12 | テスト復旧計画 | Codex レビュー1ラウンド目 | 致命3件 | 独立検算ベース化、パス修正、worktree |
| 13 | 同上 | 4ラウンド回す | 致命指摘ゼロまで持っていけた | Codex はラウンドを重ねれば品質が上がる |
今日の学び
- 非公開フラグは「opt-in」で設計する: SQLite default の落とし穴を避けるため、未指定 = 公開・明示
unpublished:trueのみ非公開にする逆転設計が効いた - 「unpublished:true」だけでは漏えいは止まらない: HTML 生成を止めるだけでなく、payload /
_raw/ sitemap / redirects / dist HTML href /_nuxt/バンドルまで多層的に遮断する必要がある - pnpm generate は1日に何度も走らせない: 10分かかるので、dev環境+ユニットテストで先に検証して、
pnpm generateは最終確認の1回だけにする運用を CLAUDE.md に明文化 - 画面の違和感を拾うのは人間: KaTeX フォント崩れ、SVG 2x2px、payload に新記事が乗っていない、すべて画面を見て初めて気づいた。AI 任せでもスクショ確認のプロセスは必須
- Codex レビューは4ラウンドで効く: 1ラウンド目で致命3件、2ラウンド目で1件、と段階的に詰めていけば最終形に届く
- watcher は touch で復活する: dev server が記事を見失ったときの最速復活手段
明日やること
- テスト失敗復旧計画(memo/2026-05-23/test-failures-recovery-plan.md)の実行
- 1Password CLI で e-Tax 自動ログインを試す(マイナンバーカード使用)
- Phase 2 の Tier 2 / 3 候補に
unpublished:trueを順次付与(30件程度残っている)
関連記事
- 1Password Environments MCP — Codex / Claude Code に「秘密を見せずに環境変数を任せる」レイヤーが来た
- SpaceX S-1 全章まとめ — SpaceX + xAI + X(旧Twitter) の3社統合体としてNasdaq上場(ティッカー SPCX)
- Nuxt Content サイトに非公開フラグを導入し、HTML・サイトマップ・payload からの漏えいを遮断するまで
- NVIDIA Q1 FY27 書き起こしを作りながら、/blog の SPA キャッシュ・Breadcrumb・画像モーダル・SVG チャートをまとめて整備した日
- SpaceX S-1(145万字HTML)を EDGAR から取り出して章単位で読み解いて公開記事化するまでの作業ログ
- ビルドが postgenerate で落ち、テスト失敗復旧計画を Codex に4ラウンドレビューさせた話