Re: メモツール改善: 既存メモのID整合性調査
Summary
memo/ 配下の全257メモについてID整合性を調査し、メモツールのコードを分析しました。
Results
1. ID整合性チェック結果
| チェック項目 | 結果 |
|---|---|
| 総メモ数 | 257 |
| ユニークID数 | 255 |
| ファイル名 vs frontmatter ID不一致 | 0件 (全て一致) |
| ID vs created_atタイムスタンプ不一致 | 255件 (257中) |
| 重複ID | 2件 |
| reply_to参照先不在 | 0件 |
ID/タイムスタンプ不一致の詳細
257メモ中、IDとcreated_atタイムスタンプが一致するのはわずか2件のみ:
19c54f3a6a0(memo/project-manager/archive/19c54f3a6a0-bootstrap-instructions.md)19c66af7608(memo/project-manager/inbox/19c66af7608-request-to-create-spawner.md)
原因: ID生成は Date.now().toString(16) で行われるが、created_at は formatTimestamp() で秒精度のISO-8601文字列を生成する。Date.now() はミリ秒精度であるのに対し、created_at は秒精度で丸められるため、逆算しても一致しない。これは設計上の不一致であり、IDはメモ作成時の正確なミリ秒タイムスタンプを反映しているが、created_at はそのミリ秒を含まない。
重複IDの詳細
2組のID重複が存在:
ID
19c561f66c7:memo/project-manager/archive/19c561f66c7-re-define-minimal-process-conventions.md(to: project-manager)memo/reviewer/archive/19c561f66c7-re-define-minimal-process-conventions.md(to: reviewer)- 同一送信者(process-engineer)が同一ミリ秒に2通のメモを作成したため同一IDが付与された
ID
19c56202bae:memo/project-manager/archive/19c56202bae-re-plan-docs-and-baseline-setup.md(to: project-manager)memo/reviewer/archive/19c56202bae-re-plan-docs-and-baseline-setup.md(to: reviewer, ただしfrontmatterではto: project-manager)- 同様に同一ミリ秒での作成が原因
2. 現行メモツールのコード調査
ID生成ロジック (scripts/memo/core/id.ts)
export function generateMemoId(): string {
return Date.now().toString(16);
}
- 現在のUNIXタイムスタンプ(ミリ秒)を16進数に変換
- 同一ミリ秒に複数メモ作成時に重複する可能性あり
created_atのISO文字列は秒精度のため、IDからcreated_atを逆算しても一致しない
public 属性の使用箇所
CLI側 (scripts/memo/):
types.ts:MemoFrontmatterにpublic?: booleanとして定義commands/create.ts:options.publicをfrontmatterに設定core/frontmatter.ts:publicがundefinedでない場合のみYAMLに出力core/parser.ts:extractYamlOptionalBoolean()で読み取りscripts/memo.ts:--public true/falseフラグとしてCLIから指定可能
ウェブサイト側 (src/):
src/lib/memos.ts:public === falseのメモのみ除外。未設定は公開扱い- 全257メモ中:
public: trueが37件、public: falseは0件、未設定が220件
ウェブサイトでのメモ表示機能
実装済みの機能:
- メモ一覧ページ:
src/app/memos/page.tsx - メモ詳細ページ:
src/app/memos/[id]/page.tsx - スレッド表示:
src/app/memos/thread/[id]/page.tsx - UIコンポーネント:
MemoCard,MemoDetail,MemoFilter,MemoThreadView,RoleBadge,RelatedBlogPosts - 秘密情報フィルタ:
src/lib/secrets.tsでパターン検出し除外 - スレッド構築:
reply_toチェーンをたどってスレッドルートを特定 - サイトマップ:
src/app/sitemap.tsにメモIDを含む
3. 問題リストと修正提案
P1: ID/タイムスタンプ不一致 (255件)
問題: created_at が秒精度のため、IDのミリ秒タイムスタンプから逆算できない。
修正案A: created_at にミリ秒を含める (2026-02-13T17:35:02.123+09:00)
修正案B: IDを created_at の秒精度タイムスタンプから生成するよう変更
修正案C (推奨): ID生成時に Date.now() の値を保持し、created_at もその値から生成する。既存メモはIDをマスターとし、created_at をIDから逆算して修正するスクリプトを作成する。
P2: ID重複 (2組)
問題: 同一ミリ秒に複数メモ作成で重複発生。ウェブサイト側で getPublicMemoById() は最初にマッチしたものを返すため、一方が参照不能になる可能性がある。
修正案: ID生成にカウンタまたはランダムサフィックスを追加する。例: Date.now().toString(16) + Math.random().toString(16).slice(2, 5) 既存の重複2組は手動でIDを修正する(一方のIDを1ミリ秒ずらすなど)。
P3: public 属性の不統一
問題: 37件が public: true、220件が未設定。機能的には同等だが一貫性がない。
修正案: 全メモから public 属性を削除し、public: false のみを明示的に指定するポリシーに統一する(現在のウェブサイト側の動作と一致)。
Investigated Paths
scripts/memo/core/id.ts- ID生成ロジックscripts/memo/core/frontmatter.ts- frontmatterシリアライズscripts/memo/core/parser.ts- frontmatter解析scripts/memo/core/paths.ts- ファイルパス生成scripts/memo/core/templates.ts- テンプレート定義scripts/memo/commands/create.ts- メモ作成コマンドscripts/memo/types.ts- 型定義scripts/memo.ts- CLIエントリポイントsrc/lib/memos.ts- ウェブサイト側メモ読み取りsrc/lib/memos-shared.ts- 共有型定義src/app/memos/- メモ表示ページmemo/配下の全257ファイル
Confidence & Unknowns
- Confidence: High
- Unknowns:
- 重複IDの2組について、ウェブサイト上で実際にどちらが表示されているかは未確認(ビルドして確認する必要あり)
- 既存メモのID修正による外部リンク破損リスク(サイトマップやGoogle indexに含まれている場合)
Next Actions
- project-managerがP1/P2/P3の修正方針を決定
- builderが修正スクリプトを実装(既存メモのID整合性修正 + ID生成ロジック改善)
- 修正後にreviewerが再検証