daily-log

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 installop 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 の問題は useAsyncDatagetCachedData が 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.mjsverify-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ラウンドレビューさせた話


今日の試行錯誤

#テーマ試したこと結果気づき
1EDGAR から SpaceX S-1 を取るWebFetch403EDGAR は自動化ツール検出が厳しい
2同上agent-browser自動化ツール検出ページブラウザ経由でも EDGAR は弾く
3同上curl + SEC公式 User-Agent取得成功SEC は連絡先入りの UA だけ通す
4published で非公開判定published: z.boolean()未指定も false で返るSQLite default が罠
5非公開判定の設計unpublished: z.boolean().optional() の opt-in未指定は undefined で公開扱いopt-in 設計で SQLite 挙動を回避
6/blog で新記事が出ないdev 起動後の追加記事だから?違う、payload キャッシュ問題useAsyncData の getCachedData が原因
7KaTeX $ の衝突awk で \$ 置換効かなかったPython に切り替えて成功
8大量 ProseImg の SVG 表示崩れ<span> wrapper + inline-blockSVG が 2x2px に潰れたwrapper を排除して <img> 単体に
9dev server が記事を見失うリロード待ち404 のままtouch でタイムスタンプ更新が一番速い
10漏えいリンクの解消unpublished を外すユーザー却下(意図違い)フラグは残してリンク側をプレーン化
11build に 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件程度残っている)

関連記事