# 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実装検討