/Users/aiharataketo/ghq/github.com/vab-labo/meshi-teroCLAUDE.md より): 「コンビニ飯で健康になれる世界」を作る AI 食事命令アプリ。ユーザーの栄養管理を強制するCLAUDE.md に集約package-lock.json あり)meshi-tero/
├── app/ # expo-router のファイルベースルーティング
│ ├── _layout.tsx # SQLiteProvider 初期化 + DB マイグレーション
│ ├── onboarding.tsx
│ └── (tabs)/ # ホーム/履歴/設定の3タブ
├── components/ # React Native コンポーネント (FoodInput.tsx 等)
├── hooks/ # useMeals / useFoodSearch / useScanner 等
├── lib/ # 純粋ロジック層 <- ★ダッシュボード組込みで狙う層
│ ├── db.ts # SQLite CRUD (18KB)
│ ├── gemini.ts # Gemini API クライアント (25KB)
│ ├── nutrition.ts # BMR/TDEE 計算
│ ├── off.ts # Open Food Facts API
│ └── ocr-validation.ts # OCR バリデーション
├── data/ # 食品マスタ (シード)
│ ├── seed-foods.json # 35KB, 156品
│ ├── mext-foods.json # 572KB, 文科省食品成分表
│ ├── off-japan-foods.json # 5.5MB, Open Food Facts 日本版
│ └── cvs-foods.json # 253KB, コンビニ3社スクレイピング
├── scripts/ # 食品マスタ生成スクリプト (独立 package.json)
├── types/index.ts # 型定義
└── __tests__/ # Jest 168件
SQLite スキーマ(app/_layout.tsx:62-113):
CREATE TABLE foods (
id TEXT PRIMARY KEY,
name TEXT, brand TEXT,
calories REAL, protein REAL, fat REAL, carbs REAL,
source TEXT DEFAULT 'seed',
barcode TEXT
);
CREATE TABLE meals (
id INTEGER PRIMARY KEY AUTOINCREMENT,
date TEXT, -- "YYYY-MM-DD"
meal_type TEXT CHECK (meal_type IN ('breakfast','lunch','dinner','snack')),
food_id TEXT,
custom_name TEXT,
calories REAL, protein REAL, fat REAL, carbs REAL,
followed_command INTEGER DEFAULT 0, -- AI命令に従ったか
created_at TEXT DEFAULT (datetime('now'))
);
TypeScript 型(types/index.ts):
export type MealRecord = {
id: number;
date: string; // "YYYY-MM-DD"
mealType: 'breakfast' | 'lunch' | 'dinner' | 'snack';
foodId?: string;
customName?: string;
calories: number;
protein: number;
fat: number;
carbs: number;
followedCommand: boolean;
createdAt: string;
};
実データサンプル(data/seed-foods.json:1-30):
[
{
"id": "seven-salad-chicken-plain",
"name": "サラダチキン プレーン",
"brand": "セブンイレブン",
"calories": 114,
"protein": 24.1,
"fat": 1.2,
"carbs": 1.0,
"source": "seed"
}
]
| 層 | ファイル | 関数 | 流用可否 |
|---|---|---|---|
| DB | lib/db.ts |
addMeal, getMealsByDate, searchFoods, insertOffFood, insertOcrFood |
OK: expo-sqlite -> better-sqlite3(既に devDependency 存在)に差し替えで Node 側で動く |
| AI | lib/gemini.ts |
estimateNutrition, ocrNutritionLabel, identifyProductFromPhoto, generateCommand |
OK: 純関数、環境変数だけ差し替えで動作 |
| 計算 | lib/nutrition.ts |
calcBMR, calcTDEE, calcDailyTarget, calcRemaining |
OK: 純関数 |
| 食品API | lib/off.ts |
fetchOffProduct (Open Food Facts) |
OK: fetch 依存のみ |
| 食品マスタ | data/*.json |
(データ) | OK: 総計 6MB 程度、静的ロードで使える |
| HTTP層 | — | — | NG: 未実装(Express/Hono 無し。自作アダプタ必須) |
| CLI | — | — | NG: bin フィールド無し、CLI 非公開 |
meshitero.db)のみ。クラウド同期なし、バックアップ機能なしgemini-2.5-flash のマルチモーダル API を base64 で叩く。バリデーションは validateOcrResult() が「表示カロリーが PFC 計算値の 50〜200% 範囲」でチェックlib/ の純関数群を Node 環境から直接呼び出すのが最短ルート。具体的には:
expo-sqlite 依存を better-sqlite3(既に devDependencies に存在)に差し替えlib/db.ts をそのまま Node 側 CLI から importnode meshi-tero-cli.ts add --text "おにぎり" -> 内部で estimateNutrition() -> addMeal() -> meal/YYYY-MM-DD.md に追記types/index.ts の MealRecord をそのまま使う(追加型定義ゼロ)⚠️ 判断ポイント: meshi-tero は SQLite 前提の設計。ダッシュボードは Markdown ファイル前提(§3 参照)。SQLite を正本にするか、Markdown を正本にするかは健人に確認必須(§6-Q1)。
| アプリ | 料金 | 送信先 | Webhook POST | 自動化 | 推奨度 |
|---|---|---|---|---|---|
| Health Auto Export – JSON+CSV | 無料/買切 $2.99/Premium $6.99/年 | REST API, MQTT, iCloud Drive, Home Assistant | OK: 完全対応(任意 URL + ヘッダー指定可) | 秒〜月で自由設定(Premium 必須) | ★★★ |
| Health Assistant Link | $1.99/月 | Home Assistant 専用 | △ HA webhook のみ | Shortcuts 経由で1日3回 | ★★ |
| Health Exporter & Shortcuts | $0.99 買切 | Shortcuts チェーン経由で POST 可 | △ アプリ内 URL 設定は無し | Shortcuts オートメーション次第 | ★ |
| HealthFit | $6.99 買切 | Strava / TrainingPeaks 等25サービス | NG | 自動同期 | NG(目的外) |
| QS Access | 無料 | 手動 CSV エクスポート | NG | 無し | NG(メンテ停止気味) |
Health Auto Export が唯一「非エンジニアがアプリ設定画面だけで任意 URL に JSON を POST できる」製品。公式の REST API 設定ガイドも存在:
| リポジトリ | スター | 最終更新 | ライセンス | 内容 | 推奨度 |
|---|---|---|---|---|---|
| Lybron/health-auto-export | 217 | 2026-04-09 | 未記載 | Health Auto Export の API 仕様ドキュメント専用リポジトリ(アプリ本体ではない、JSON スキーマの公式仕様) | ★★★(仕様参照用) |
| gregt1993/Health_Bridge | 29 | 2026-04-10 | MIT | Home Assistant カスタム統合(Python)。iOS アプリ「Health Assistant Link」とセット | ★★(HA ある場合のみ) |
| MaximeHeckel/healthpulse | 22 | 2017 年コード | 未記載 | React Native 製 iOS アプリ。HealthKit -> 任意エンドポイント POST | ⚠️ 検証不十分(9年前のコード、現行 RN で動作困難) |
| WeaveHubHQ/healthsync-ha | 1 | 2026-04-05 | 未記載 | HA 統合の新興版 | ⚠️ 検証不十分(スター 1) |
結論: 可能。ただし Health Auto Export の下位互換。
推奨: ~/dashboard-data/(新規作成)
現状: /Users/aiharataketo/dashboard-data/ は未作成(Glob で確認済み)
代替案:
dashboard/ サブフォルダを作る -> iCloud 同期の恩恵あるが書き込み頻度高いと同期コンフリクト懸念健人は Markdown + grep で運用する文化なので、Markdown ファイル + 日付1ファイルの構成が整合する。
~/dashboard-data/
├── diary/
│ └── YYYY-MM-DD.md # 日記(自由テキスト)
├── meal/
│ └── YYYY-MM-DD.md # 食事(meshi-tero MealRecord を YAML frontmatter 化)
├── workout/
│ └── YYYY-MM-DD.md # 筋トレ(種目・重量・レップ)
├── health/
│ └── YYYY-MM-DD.json # Apple Health 生データ (Health Auto Export の POST を保存)
└── cache/
└── dashboard-summary.json # 集計済み中間データ(HTML 生成高速化用)
meal/2026-04-11.md---
date: 2026-04-11
total:
calories: 1820
protein: 95.2
fat: 58.3
carbs: 215.4
target_compliance: 0.78
---
## 朝 07:30
- **おにぎり(鮭)** セブンイレブン
- 180 kcal / P4.5 / F1.2 / C38.0
- source: seed
## 昼 12:15
- **サラダチキン プレーン** セブンイレブン
- 114 kcal / P24.1 / F1.2 / C1.0
- source: seed
- **ブランパン 2個入** ローソン
- 120 kcal / P10.6 / F4.4 / C11.4
## 夜 20:00
- **麻婆豆腐定食** (AI推定)
- 720 kcal / P28.0 / F32.0 / C75.0
- source: ai
workout/2026-04-11.md---
date: 2026-04-11
duration_min: 55
volume_total_kg: 8640
---
## 胸
- ベンチプレス: 60kg x 8 x 3
- インクラインダンベル: 22kg x 10 x 3
## 三頭
- ケーブルプレスダウン: 25kg x 12 x 3
diary/2026-04-11.md---
date: 2026-04-11
mood: 7
tags: [dashboard, 調査日]
---
今日はダッシュボード構築の Phase 0 調査を走らせた。
meshi-tero の lib/ 層が想像以上にきれいで、アダプタ薄くて済みそう。
health/2026-04-11.json{
"source": "health-auto-export",
"received_at": "2026-04-11T23:59:00+09:00",
"metrics": {
"steps": 8324,
"weight_kg": 72.3,
"resting_heart_rate": 58,
"hrv_ms": 45.2,
"sleep": {
"total_min": 412,
"rem_min": 88,
"deep_min": 52,
"light_min": 272
},
"active_energy_kcal": 485
}
}
+----------+ ntfy push / POST +--------------------+
| iPhone |----------------------->| 秘書 (Telegram Bot)|
| (Health | | or webhook 受信 |
| Auto | +---------+----------+
| Export) | |
+----------+ | 書込
v
+----------+ 自由会話 +--------------------+
| 健人 |----------------------->| Claude Code |
| (PC/iOS) | 「おにぎり食べた」 | (dashboard skill) |
+----------+ +---------+----------+
| Write
v
~/dashboard-data/
+- diary/*.md
+- meal/*.md
+- workout/*.md
+- health/*.json
|
convert-dashboard.sh (集計)
v
~/plan-viewer/dashboard.html
|
Tailscale Funnel (HTTPS)
v
+--------------------+
| スマホ PWA ホーム |
+--------------------+
dashboard.html)既存 ~/plan-viewer/index.html の Zenn 風ダークテーマ(背景 #0d223a)を踏襲。
+-----------------------------------------+
| ダッシュボード 2026-04-11 | <- ヘッダ
+-----------------------------------------+
| [icon] 今日の栄養 [編集] |
| 1820 / 2200 kcal ########.. 82% |
| P 95g F 58g C 215g |
+-----------------------------------------+
| [icon] 筋トレ [編集] |
| 55分 総重量 8.6t (胸/三頭) |
+-----------------------------------------+
| [icon] Apple Health [同期] |
| 歩数 8324 HRV 45ms |
| 睡眠 6h52m (REM 1h28m / Deep 52m) |
+-----------------------------------------+
| [icon] 今日の日記 [編集] |
| 今日はダッシュボード構築... |
+-----------------------------------------+
| [icon] 最近の記事 (plan-viewer 統合) |
| ・2026-04-11 転職PJ dispatch計画 |
| ・2026-04-11 ファクトチェック... |
| ・2026-04-10 ... |
| [全件表示] |
+-----------------------------------------+
index.html の <ul class="plan-list"> を埋め込みまたはリンク)[編集] ボタン: タップで「Claude Code に自由会話を送る」ための URL スキーマ(あるいは秘書 Telegram へのディープリンク)[全件表示] ボタン: 既存 index.html にジャンプ~/dashboard-data/convert-dashboard.sh(meshi-tero の convert 方式を参考)~/dashboard-data/meal/$(date +%F).md の frontmatter 読み取り -> 合計値算出~/dashboard-data/workout/$(date +%F).md 同様~/dashboard-data/health/$(date +%F).json 読み込み~/plan-viewer/ の HTML ファイル一覧から最新5件取得dashboard-template.html に埋め込んで ~/plan-viewer/dashboard.html を生成iPhone ホーム画面 (PWA アイコン)
v タップ
Tailscale Funnel URL (https://<machine>.<tailnet>.ts.net/dashboard.html)
v
dashboard.html (サマリー表示)
v 下スクロール
plan-viewer 記事リスト (最新5件) -> [全件表示] -> index.html
~/.claude/skills/tmux/:
tmux/
├── SKILL.md
├── scripts/tmux.py # 17KB, 主実装
└── references/tmux-gotchas.md
SKILL.md の frontmatter 抜粋:
name: tmux
description: |
tmux でヘッドレスセッションを管理する。...
Triggers: "tmux", "tmuxで", "tmuxでテスト", "tmuxで検証", ...
~/.claude/skills/work-log/: frontmatter + Bash コマンド実行手順のみのシンプル構成。
~/plan-viewer-plugin/skills/plan-viewer/ (plugin 実体):
plan-viewer-plugin/skills/plan-viewer/
├── SKILL.md # トリガー・発火条件・書き込み先
└── references/
├── page-template.md # HTML テンプレート
└── writing-guide.md # 文体ルール
パターン抽出:
frontmatter は name + description の2フィールド、トリガー語は description 内に自然言語で列挙references/ に詳細(テンプレート・ルール)を分離、SKILL.md からは「Read せよ」と明示~/.claude/skills/dashboard/
├── SKILL.md # トリガー・発火条件・分岐ルール
├── references/
│ ├── meal-template.md # meal/*.md のテンプレート
│ ├── workout-template.md # workout/*.md のテンプレート
│ ├── diary-template.md # diary/*.md のテンプレート
│ ├── intent-patterns.md # 意図検出の正規表現/キーワード集
│ └── convert-guide.md # convert-dashboard.sh の使い方
└── scripts/
├── add-meal.ts # 食事追加 (meshi-tero lib/ を import)
├── add-workout.sh # 筋トレ追加
├── add-diary.sh # 日記追加
└── convert-dashboard.sh # HTML 再生成
---
name: dashboard
description: |
健人の日次ダッシュボード(日記/食事/筋トレ/Apple Health)に自由会話で記録を追加する。
Triggers on:
- 食事: 「〇〇食べた」「朝ごはん」「昼食」「夕飯」「おやつ」「カロリー」
- 筋トレ: 「ベンチ」「スクワット」「デッド」「〇kg」「〇レップ」「〇セット」「筋トレ」
- 日記: 「今日は」「〇〇だった」「気分」「日記」
- Apple Health: 「歩数」「体重」「睡眠」
- 集計: 「ダッシュボード見せて」「今日のまとめ」「dashboard.html 再生成」
Do NOT use for:
- plan-viewer の記事作成 (-> plan-viewer skill)
- Obsidian への長文メモ (-> work-log skill)
---
入力例:
検出ロジック:
lib/gemini.ts:estimateNutrition() を呼んで栄養推定~/dashboard-data/meal/$(date +%F).md に追記convert-dashboard.sh で HTML 再生成出力(Claude が返すべき確認メッセージ):
食事を記録したわ:
- おにぎり(鮭)180kcal / P4.5 / F1.2 / C38.0
-> ~/dashboard-data/meal/2026-04-11.md
今日の累計: 1820 / 2200 kcal (82%)
入力例:
検出ロジック:
~/dashboard-data/workout/$(date +%F).md に追記convert-dashboard.sh で HTML 再生成出力:
筋トレ記録したわ:
- ベンチプレス: 60kg x 8 x 3 (volume 1440kg)
-> ~/dashboard-data/workout/2026-04-11.md
入力例:
検出ロジック:
~/dashboard-data/diary/$(date +%F).md に追記(既存ファイルがあれば末尾追記、frontmatter の mood は最新値で更新)出力:
日記に追記したわ:
- 今日は疲れた
-> ~/dashboard-data/diary/2026-04-11.md
入力例:
検出ロジック:
convert-dashboard.sh を実行可能。skill は ~/.claude/skills/ 直下に配置するため、main/desktop セッションの Claude Code からも同じトリガー語で起動する。
~/dashboard-data/ に書き込むため、どちらで記録しても dashboard.html に反映される⚠️ 秘書セッションは Telegram 送信ルール(太字記法の制約、MarkdownV2 ヘルパー必須)に従う必要がある。
方針: 小さく動かして即確認。各ステップで dashboard.html が1歩進化する設計。
~/dashboard-data/ 作成(diary/meal/workout/health の4サブディレクトリ)meal/2026-04-11.md を手書きで1件作成(§3.3 の形式)~/dashboard-data/convert-dashboard.sh 作成(bash + jq + yq で frontmatter パース)~/plan-viewer/dashboard-template.html 作成(§3.5 のレイアウト)~/plan-viewer/dashboard.html 生成 -> Tailscale Funnel 経由で iPhone から確認~/.claude/skills/dashboard/SKILL.md 作成(§4.3 の骨子)references/ に4テンプレート配置lib/db.ts + lib/gemini.ts を Node 環境から呼ぶ小さな CLI (meshi-tero-bridge.ts) を作るexpo-sqlite -> better-sqlite3 に差し替え(meshi-tero 本体は触らず、別ディレクトリにミニ CLI を置く)meshi-tero-bridge.ts を呼び出しEXPO_PUBLIC_GEMINI_API_KEY の扱い(§6-Q3)~/dashboard-data/health/$(date +%F).json に保存dashboard.html を PWA の start_url に設定するか検討(既存 manifest.json は / 指定)選択肢:
~/dashboard-data/meal/*.md)。meshi-tero の SQLite は使わず、lib/gemini.ts の栄養推定関数だけ流用 <- 調査員の推奨推奨度: 案A ★★★(grep 可能・git diff 可能・YAGNI 原則)、案B ★、案C NG
選択肢:
推奨度: 案A ★★★(非エンジニアの健人が設定画面だけで完結、年 $6.99 は十分安い)
meshi-tero は EXPO_PUBLIC_GEMINI_API_KEY を使ってる。ダッシュボード側でも同じキーを流用するか、別キーを切るか。
選択肢:
~/.env or .envrc に置いて両方から参照推奨度: 案A ★★(最短)
現状 ~/plan-viewer/ 全体が Tailscale Funnel で配信されてる想定だが、配信ルートに dashboard.html を追加するだけでいいか、別の手続きが必要か。
-> 既存の index.html と同じディレクトリに置けばそのまま配信される見込みだが、ポート番号・サーバー起動方法の確認必須(plan-viewer-plugin/scripts/server.py があるので、これを使う場合は要確認)。
同じ日に秘書セッションと PC セッションから同時に meal/2026-04-11.md に追記した場合、ファイルロックや競合処理はどうするか。
選択肢:
*.conflict.md に退避推奨度: 案B ★★★(健人1人の運用、同時書き込みの確率は低い)
「今日は疲れた」は diary だが、「今日はベンチ 60kg 調子良かった」は workout + diary のハイブリッド。パターン優先度をどう決めるか。
選択肢:
推奨度: 案A ★★★(確定的ルール、パフォーマンス良い)+ 曖昧な場合のみ案C にフォールバック
/Users/aiharataketo/ghq/github.com/vab-labo/meshi-tero/CLAUDE.md/Users/aiharataketo/ghq/github.com/vab-labo/meshi-tero/package.json/Users/aiharataketo/ghq/github.com/vab-labo/meshi-tero/app/_layout.tsx (line 62-113 SQL スキーマ)/Users/aiharataketo/ghq/github.com/vab-labo/meshi-tero/types/index.ts/Users/aiharataketo/ghq/github.com/vab-labo/meshi-tero/lib/db.ts/Users/aiharataketo/ghq/github.com/vab-labo/meshi-tero/lib/gemini.ts (line 626-726 OCR 実装)/Users/aiharataketo/ghq/github.com/vab-labo/meshi-tero/data/seed-foods.json/Users/aiharataketo/plan-viewer/index.html (66KB, 2026-04-11 更新)/Users/aiharataketo/plan-viewer/manifest.json (PWA, standalone)/Users/aiharataketo/ghq/github.com/ramenumaiwhy/plan-viewer-plugin/skills/plan-viewer/SKILL.md/Users/aiharataketo/.claude/skills/tmux/SKILL.md/Users/aiharataketo/.claude/skills/work-log/SKILL.md調査員からの一言: 案A は筋が良いわ。meshi-tero の lib/ がきれいに純関数で切れてるから、アダプタ薄くて済む。最大のリスクは Apple Health で、Health Auto Export の Premium を払えば解決するけど、それを待たずに Step 1〜3 は先行で進められる設計にしてある。健人が §6 の Q1/Q2 に即答できれば、翌日には dashboard.html の MVP が立ち上がるはずよ。
このセクションは §3 の実装方針を UX(User Experience = 使い心地)理論で検証し、「作った後に使われない」リスクを事前に潰すための分析。4つの古典的フレームワークを適用し、日記 / 食事記録 / 筋トレ記録 / plan-viewer ホーム画面 の4動線に対して 4 × 4 = 16 セルで網羅的に検討する。
出典: Clayton Christensen(ハーバードビジネススクール教授、『イノベーションのジレンマ』著者), 2003年頃から体系化。
要点: 人はプロダクトを機能 (tool) ではなく、片付けたい仕事 (progress) のために「雇う」。ダッシュボードを「データを見る場所」ではなく「健康的な生活に向けた前進を確認する手段」として定義する必要がある。
出典: BJ Fogg(スタンフォード大学行動デザイン研究所所長、『Tiny Habits』著者)。
要点: 行動は 動機 (Motivation) × 実行容易性 (Ability) × きっかけ (Trigger) の3要素の積。どれか1つが 0 なら行動は起きない。記録が続かないのは3つのどこかがゼロだから。
出典: Don Norman(認知科学者、『誰のためのデザイン? (The Design of Everyday Things)』著者、Apple 元 UX 責任者)。
要点: 使い手のミスや忘却を物理構造で物理的に不可能にする設計。代表例は「ガソリンスタンドのノズルを戻さないと車が動かない」設計。Constraint Design(制約設計)と Mapping(対応付け)の2原則で構成される。
出典: John Sweller(ニューサウスウェールズ大学教授)、1988年。
要点: 人間のワーキングメモリは 4 ± 1 個の情報チャンク (chunk = 意味のまとまり) しか保持できない。ダッシュボード起動 5 秒で見えるべき情報は 4 チャンク以下に絞る。それ以上は認知負荷超過で離脱する。
健人は日記を 「今日の自分の状態を未来の自分に引き継ぐため」 に雇う。tool = Markdown 追記機能、progress = 過去の自分と対話して行動パターンを発見すること。
| 要素 | スコア | 根拠 |
|---|---|---|
| Motivation | 2 / 5 | 日記は即座の報酬が薄い。書いた瞬間の達成感は低く、価値は数ヶ月後の見返しで初めて生まれる |
| Ability | 4 / 5 | 「今日は疲れた」の1文でも記録完了する skill 設計なら摩擦は極小 |
| Trigger | 1 / 5 | 健人に「今日日記書こう」という固定 trigger が現状無い。就寝前の習慣が未確立 |
ボトルネック: Trigger が 1。ここを 3 以上に上げないと日記動線は死ぬ。
diary/YYYY-MM-DD.md に追記ダッシュボードの日記カードに表示する情報を 3 チャンク以下 に絞る:
[編集] ボタンそれ以上の情報(月次サマリー、タグ集計等)は展開操作で初めて出す。
健人は食事記録を 「コンビニ飯中心の生活でも PFC バランスが崩れてないことを確認して、罪悪感を減らすため」 に雇う。tool = カロリー計算、progress = 「今日の夜に何を足せば良いか」の判断。
| 要素 | スコア | 根拠 |
|---|---|---|
| Motivation | 4 / 5 | 健康管理への関心は強い(meshi-tero を自作するほど)。即座の報酬として「累計 kcal が見える」がある |
| Ability | 3 / 5 | 「おにぎり食べた」の1行で記録できるのは強いが、AI 推定の待ち時間(Gemini API で数秒)が発生 |
| Trigger | 2 / 5 | 食事の時刻は毎日あるが、食後に記録する習慣が固定化されていない |
ボトルネック: Trigger が 2。Ability も 3 で、AI 待ち時間がボトルネック。
meal/*.md から健人の食事時刻の中央値を算出(朝 07:30 / 昼 12:15 / 夜 20:00 等)食事カードに表示する情報を 4 チャンク以下 に絞る:
generateCommand() を流用)[記録] ボタングラフ系の詳細(時間帯別推移、source 別内訳)は展開操作で初めて出す。
健人は筋トレ記録を 「前回の自分を超えたかを確認し、progressive overload (漸進性過負荷) のエビデンスを残すため」 に雇う。tool = 重量記録、progress = 「前回より伸びた」という自己肯定。
| 要素 | スコア | 根拠 |
|---|---|---|
| Motivation | 4 / 5 | 筋トレ自体の動機が強い健人にとって、記録は筋トレの一部と認識されやすい |
| Ability | 4 / 5 | 「ベンチ 60kg 8x3」の構文が簡潔。正規表現パースで meshi-tero の栄養 AI 呼出しが不要な分、即時完了 |
| Trigger | 3 / 5 | ジム入館が物理 trigger として機能する。ただしジムに行かない日は trigger 消失 |
ボトルネック: 全体的にスコア高いが、休養日に trigger が消えるのが唯一の弱点。
60kg (+2.5kg PR) のように PR = Personal Record の伸びを物理的に見せる)筋トレカードに表示する情報を 3 チャンク以下 に絞る:
過去履歴グラフやセット詳細は展開操作で初めて出す。
健人は plan-viewer ホームを 「過去に自分が考えたことを外部記憶として呼び出し、今の意思決定に再利用するため」 に雇う。tool = HTML 一覧、progress = 「あれ、前にこれ考えたな」→ 即座にアクセス。
| 要素 | スコア | 根拠 |
|---|---|---|
| Motivation | 5 / 5 | 既に 127 件の記事が蓄積されている実績が動機の強さを示す |
| Ability | 4 / 5 | HTML クリックで開くだけ、非常に軽い。検索機能の有無が次の改善点 |
| Trigger | 2 / 5 | 能動的に「前の記事を見る」という trigger が発生しにくい。受動的な呼出しが主 |
ボトルネック: Trigger が 2。能動的に見に行く機会が少ない。
plan-viewer 統合カードに表示する情報を 4 チャンク以下 に絞る:
[全件表示] ボタン(既存 index.html へジャンプ)タグ検索・全文検索は展開操作で初めて出す(§3.7 の動線図の Step 2 以降)。
| 日記 | 食事記録 | 筋トレ記録 | plan-viewer | |
|---|---|---|---|---|
| JTBD | 未来の自分への引継ぎ | コンビニ飯の罪悪感低減 | progressive overload の証跡 | 外部記憶の再利用 |
| B=MAT M | 2 (報酬遅延) | 4 (健康関心) | 4 (筋トレ動機) | 5 (蓄積実績) |
| B=MAT A | 4 (1行で完了) | 3 (AI 待ち) | 4 (構文簡潔) | 4 (クリックのみ) |
| B=MAT T | 1 (習慣未確立) | 2 (時刻 trigger 弱) | 3 (ジム入館) | 2 (能動 trigger 薄) |
| Forcing Function | 就寝時刻 ntfy + 秘書 1行質問 | 時刻 trigger + 未記録バナー | 位置情報 trigger + PR 差分表示 | ダッシュボード統合 + 過去の今日 |
| Cognitive Load | 3 chunk (mood 棒/最新1行/編集) | 4 chunk (kcal/PFC/推奨/記録) | 3 chunk (volume/部位/PR 差分) | 4 chunk (最新5件/過去今日/総数/全件) |
| 最重要ボトルネック | Trigger=1 | Trigger=2 + Ability=3 | 休養日の Trigger 消失 | Trigger=2 |
§7 の分析結果から、§3 の実装方針に対して以下 5 点の変更・追加を提案する。
§3.5 の HTML レイアウト案を以下の優先順位で並び替え(Cognitive Load × ボトルネック分析の結論):
理由: Cognitive Load Theory に基づき、5 秒で見える上位 3 枚は「Motivation が高く、即座の報酬がある」ものに限定する。日記は Motivation が低いため上位に置くと認知負荷の無駄遣いになる。
§3 のデータフロー図に ntfy トピック aihara-64d1132d60c2 を使った3種類の trigger を追加:
| trigger 名 | 発火条件 | 目的 | 対応動線 |
|---|---|---|---|
meal-timer |
過去 meal データから学習した食事時刻 + 30 分 | 食事記録の Trigger=2 → 4 へ改善 | 食事 |
workout-geo |
ジム位置情報離脱 + 30 分(iOS Shortcuts 経由) | 筋トレ記録の即時性担保 | 筋トレ |
diary-bedtime |
Apple Health の sleep schedule 開始時刻 | 日記の Trigger=1 → 3 へ改善 | 日記 |
全 trigger は 1日1回まで発火(嫌がらせ防止の Forcing Function 的制約)。ユーザーが dismiss した場合はその日は再送しない。
§3.5 のカード内 [編集] ボタンに対する制約設計:
[編集] ボタンと「削除」的な破壊操作ボタンは画面上で最低 44pt 離す(Apple Human Interface Guidelines のタップターゲット最小推奨が 44pt)§3.6 の convert-dashboard.sh に以下を追加:
~/plan-viewer/ の全 HTML ファイル名から日付を抽出対応する JTBD: plan-viewer の「外部記憶の再利用」を能動的な呼出しから受動的な再会に転換する。
§5 の Step 2 と Step 3 の間に Step 2.5「ボトルネック検証」 を追加:
理由: B=MAT で Trigger が最重要ボトルネックと判明したため、実装直後に定量検証できる仕組みを入れる。これを後回しにすると「作ったけど使われない」リスクが現実化する。
§7 の結論: 日記と plan-viewer は Trigger 不足で放置される構造、食事は AI 待ち時間が Ability を削る構造、筋トレは休養日 trigger 消失が唯一の弱点。ntfy の3種 trigger と「過去の今日」セクションが、4動線中 3 動線のボトルネックを同時に解決する打ち手になる。§3.5 のレイアウト並び替え(Motivation 高のカードを上段)と Step 2.5 のボトルネック検証を §5 に組み込めば、Phase 0 の MVP は「作られた後に使われる」ダッシュボードとして立ち上がるはずよ。