# AIログ [[2026-01-03]] # 作業ログ 2026-01-03 ## 📋 概要(先頭数行で状況を把握) - ✅ Astroデプロイ失敗の原因調査・修正完了 - ✅ 5つのビルドエラーを特定・修正 - ✅ ローカルビルド成功確認 - ✅ 修正をコミット・プッシュ完了 - ✅ ドキュメント整理(ファイルリネーム、冒頭説明追加) - ✅ 用語集30個作成(計33個) - ✅ 用語集作成ガイド作成 ## セッション詳細 ### デプロイ失敗の調査 ユーザーから「Astroのデプロイ失敗したという通知が来た」との報告を受け、調査開始。 ローカル環境で `npm run build` を実行し、以下5つのエラーを特定: #### 1. YAMLフロントマターパースエラー **エラー**: ``` フロントマターでプロジェクト管理.md:2:20 incomplete explicit mapping pair; a key node is missed ``` **原因**: `description: project: musicなどメタデータによる分類` のように、値の中にコロンが含まれていてYAMLパーサーがキーと誤認識 **修正**: description値を引用符で囲んだ ```yaml description: "project: musicなどメタデータによる分類" ``` **ファイル**: `web/src/content/atomic-notes/フロントマターでプロジェクト管理.md` #### 2. ファイル名の `#` 文字によるRollupエラー **エラー**: ``` Rollup failed to resolve import "#reviewタグで後の振り返りを容易にする.md" ``` **原因**: ファイル名に含まれる `#` 文字がRollupのインポート解決を妨害 **修正**: ファイルをリネーム - Before: `#reviewタグで後の振り返りを容易にする.md` - After: `reviewタグで後の振り返りを容易にする.md` #### 3. Zodスキーマバリデーションエラー **エラー**: ``` Invalid content entry frontmatter project: Required title: Required ``` **原因**: atomic-notesのスキーマが `project` や `title` を必須フィールドとしていたが、多くのファイルには存在しない **修正**: スキーマフィールドをoptionalに変更 **ファイル**: `web/src/content/config.ts:62-74` ```typescript const atomicNotes = defineCollection({ type: 'content', schema: z.object({ project: z.string().optional(), title: z.string().optional(), prefix: z.string().optional().nullable(), topic: z.union([z.string(), z.array(z.string())]).transform(val => typeof val === 'string' ? [val] : val).optional(), tags: z.array(z.string()).optional(), description: z.string().optional(), related: z.array(z.string()).optional(), created: z.string().or(z.date()).optional(), }), }); ``` #### 4. ソート時のundefinedエラー **エラー**: ``` Cannot read properties of undefined (reading 'localeCompare') src/pages/index.astro:422:25 (line 106 in source) ``` **原因**: atomic-notesの一部でtitleフィールドがundefined **修正**: フォールバックロジックを追加 **ファイル**: `web/src/pages/index.astro:100-109` ```typescript const sortedAtomicNotes = atomicNotes.sort((a, b) => { if (a.data.prefix && b.data.prefix) { return a.data.prefix.localeCompare(b.data.prefix); } if (a.data.prefix) return -1; if (b.data.prefix) return 1; const titleA = a.data.title || a.slug || ''; const titleB = b.data.title || b.slug || ''; return titleA.localeCompare(titleB); }); ``` #### 5. data属性のtoLowerCaseエラー **エラー**: ``` Cannot read properties of undefined (reading 'toLowerCase') ``` **原因**: data-title属性でundefinedのtitleに対して `toLowerCase()` を呼び出し **修正**: フォールバックロジックを追加(3箇所) **ファイル**: `web/src/pages/index.astro:1329, 1389, 1515` ```typescript data-title={(video.data.title || '').toLowerCase()} data-title={(article.data.title || '').toLowerCase()} data-title={(note.data.title || note.slug || '').toLowerCase()} ``` ### ビルド成功確認 全エラー修正後、ローカルビルドを実行: ```bash npm run build ``` **結果**: 成功(警告のみ - Shiki言語ハイライトのdataview/srt/base/HTML対応なし) ``` 09:45:31 [build] 1 page(s) built in 11.36s 09:45:31 [build] Complete! ``` ### コミット・プッシュ 修正内容をコミット・プッシュ: **コミットメッセージ**: ``` Fix Astro build errors for deployment - Fix YAML frontmatter error in フロントマターでプロジェクト管理.md (add quotes to description) - Rename #reviewタグ... file to remove # character (Rollup compatibility) - Make atomic-notes schema fields optional (project, title, etc.) - Add fallback logic for undefined title in sorting - Add fallback logic for undefined title in toLowerCase operations ``` **変更ファイル**: 21ファイル - YAMLフロントマター修正: 1ファイル - ファイルリネーム: 1ファイル - スキーマ修正: config.ts - ソート・data属性修正: index.astro - 追加: obv10関連のアトミックノート 17ファイル(同期済み) **コミットハッシュ**: a8174b8 **プッシュ**: 完了 GitHub Actionsでのデプロイが自動実行される。 ## 学んだこと ### YAMLフロントマターでのコロン使用 - フロントマターの値にコロン(`:`)が含まれる場合、必ず引用符で囲む必要がある - `description: "key: value"` のように記述 ### ファイル名に使える文字の制限 - `#` 文字はRollupのインポート解決で問題を起こす - Obsidian内では問題なくても、ビルドツールとの互換性を考慮する必要がある ### Content Collectionスキーマの設計 - 既存データの実態に合わせて柔軟にスキーマを設計する - 全フィールドを必須にせず、optional指定を活用 - フロントエンド側でundefinedを適切にハンドリング ### デプロイ前のローカルビルド確認の重要性 - デプロイ失敗を早期発見するため、プッシュ前に必ずローカルビルドを実行すべき - CI/CDでのエラーはフィードバックループが長い --- ### ドキュメント整理 #### ワークフロー名の変更 **背景**: ユーザーから「NEW_ARTICLE_WORKFLOW.md は名前が分かりにくい」との指摘 **変更内容**: - `NEW_ARTICLE_WORKFLOW.md` → `SUBSTACK_INTEGRATION_WORKFLOW.md` - タイトル: 「新しい記事(ニュースレター)処理ワークフロー」→「Substack記事統合ワークフロー」 - 説明文も明確化(「Obsidianで書き終えた」→「Substackで公開した」) **参照更新**: - `_ai/README.md` - プロジェクト構成図 #### ATOMIC_NOTES.md の整理とリネーム **背景**: ユーザーから「内容に関しても、人間もAIも最初の数行で内容が理解できるように工夫して」との要望 **追加した冒頭説明**: - **このファイルについて**: 対象、目的、内容を明記 - **クイックリファレンス**: 重要情報(保存場所、必須項目、prefix、重複チェック)を一目で把握 **リネーム**: - `ATOMIC_NOTES.md` → `ATOMIC_NOTES_GUIDE.md`(運用ガイドとして明確化) **参照更新**: - `_ai/README.md` - `_ai/AI.md` - `_ai/SITE_PLAN.md` --- ### 用語集の作成 #### 用語集とは何か ユーザーとの対話で「用語」の定義を明確化: **用語の定義**: - 固有名詞・専門用語として「名前がついているもの」 - 一般的な「哲学・考え方」は用語ではない - 重要な視点: **「AIが一般知識で解説できない用語に意味がある」** **含めるべきもの**: 1. 完全オリジナルの概念(RINK、ゴリュゴTD、30点執筆術など) 2. 一般的だが独自解釈・哲学がある(デイリーノート、アトミックシンキングなど) 3. 固有名詞(ツール・プラグイン・手法名) 4. 「〜術」「〜法」「〜システム」として名前がついているもの 5. 記事タイトル・ノートタイトルで頻出する概念 **含めないもの**: - 一般的な概念(独自解釈なし) - 哲学・考え方(固有名詞ではない) - 自明な機能名・一般的な動詞 #### 調査プロセス **atomic-notesから**: ```bash # トピック集計(Obsidian: 580回、workflow: 214回など) grep -rh "^ - " ../web/src/content/atomic-notes/ | sed 's/^ - //' | sort | uniq -c | sort -rn # 「術」がつくファイル名を探す ls ../web/src/content/atomic-notes/ | grep "術" # 固有名詞・大文字始まりを探す grep -rh "^ - " ../web/src/content/atomic-notes/ | sed 's/^ - //' | grep -E "^[A-Z]" | sort -u ``` **articlesから**: ```bash # 記事タイトルから「術」「戦略」「技術」を探す find ../web/src/content/articles -name "*.md" | xargs basename -a | grep -E "術|戦略|技術|システム" ``` **発見した用語候補**: - 完全オリジナル: RINK、ゴリュゴTD、30点執筆術、100日ルール、アトミック仕事術、ロギング仕事術、アトミックリーディングなど - 書いて考える技術シリーズ: 削る技術、囲む技術、分ける技術 - Obsidian機能: 分解・配置・俯瞰、緊急ではない重要なこと - プラグイン: Bases、Dataview、Advanced URI、Canvas、Graph Analysis、Note Refactorなど - 外部ツール: Logseq、Anki、Cursor、Gemini CLI - 手法・概念: Zettelkasten、Johnny Decimal、Evergreenノート、Spaced Repetition、GTD、PKMなど #### 作成した用語集 **既存**: 3個 - デイリーノート - アトミックシンキング - トピックノート **新規作成**: 30個 **Tier 0(完全オリジナル)**: 7個 1. ゴリュゴTD 2. 30点執筆術 3. 100日ルール 4. アトミック仕事術 5. ロギング仕事術 6. アトミックリーディング 7. PARAメソッド(追加) **書いて考える技術シリーズ + 哲学**: 6個 8. 削る技術 9. 囲む技術 10. 分ける技術 11. 書いて考える技術 12. 分解・配置・俯瞰 13. 緊急ではない重要なこと **Tier 1(コア用語)**: 9個 14. RINK ✅ 事前作成済み 15. Zettelkasten 16. Johnny Decimal 17. Bases 18. Evergreenノート 19. Spaced Repetition 20. Advanced URI 21. Dataview 22. インクリメンタルライティング 23. Canvas **Tier 3(Obsidianプラグイン・機能)**: 4個 24. Graph Analysis 25. Note Refactor 26. Workspace 27. Callout **Tier 4(外部ツール)**: 4個 28. Logseq 29. Anki 30. Cursor 31. Gemini CLI **Tier 5(概念・手法)**: 5個 32. MOC 33. GTD 34. PKM 35. アウトライナー 36. バックリンク 37. FSRS **合計**: 33個の用語集(既存3 + 新規30) **保存場所**: `web/src/content/topic/` #### 用語集作成ガイドの作成 **ファイル**: `_ai/TOPIC_CREATION_GUIDE.md` **内容**: - 用語集の定義と目的 - 含めるべきもの・含めないもの - 判断基準(「AIが解説できない用語に意味がある」) - 作成プロセス(調査→分類→優先順位→作成) - 調査で使えるコマンド集 - フォーマット・テンプレート - 注意点 - 今回の実績と学んだこと **今後の活用**: - 次回以降、同じプロセスを再現可能 - 用語集の品質を一定に保つ - 新規用語追加時のガイドライン --- ## 学んだこと ### YAMLフロントマターでのコロン使用 - フロントマターの値にコロン(`:`)が含まれる場合、必ず引用符で囲む必要がある - `description: "key: value"` のように記述 ### ファイル名に使える文字の制限 - `#` 文字はRollupのインポート解決で問題を起こす - Obsidian内では問題なくても、ビルドツールとの互換性を考慮する必要がある ### Content Collectionスキーマの設計 - 既存データの実態に合わせて柔軟にスキーマを設計する - 全フィールドを必須にせず、optional指定を活用 - フロントエンド側でundefinedを適切にハンドリング ### デプロイ前のローカルビルド確認の重要性 - デプロイ失敗を早期発見するため、プッシュ前に必ずローカルビルドを実行すべき - CI/CDでのエラーはフィードバックループが長い ### 用語集作成の原則 - **「用語」= 固有名詞として名前がついているもの** - 哲学・考え方は重要だが「用語」ではない - **「AIが一般知識で解説できない用語に意味がある」** - ゴリュゴ独自の概念・解釈に最大の価値 - 記事タイトル・ノートタイトルで頻出するものは用語候補 - まずは数を作って、後で削る方が効率的 - ドキュメントの冒頭には「このファイルについて」を追加し、人間もAIも最初の数行で内容を把握できるようにする --- ## 次のステップ - GitHub Actionsのデプロイ成功を確認 - 今後は新規atomic-notes追加時にスキーマエラーが出ないことを確認 - 用語集を後で精査・削減(33個→適切な数に) - 用語集ページのUI実装検討