記録・進捗
この文書について(標準プロジェクト記録の構成)
| 目的 | いつ・何をしたかを追跡し、マイルストーン判定の根拠とする |
|---|---|
| 想定読者 | PM、引き継ぎ先、監査・レビュー担当 |
| いつ読むか | 進捗確認、完了レビュー、意思決定の経緯を調べるとき |
| 標準の章 | 本資料 |
|---|---|
| スケジュール・WBS | §1 WBS・ガント |
| 変更・実施ログ | §2 開発ログ |
| フェーズ完了レビュー | §3 ① Android 完了レビュー |
§1 WBS・ガントチャート
1. スケジュール概要
| 項目 | 日付 | 備考 |
|---|---|---|
| プロジェクト開始 | 2026-06-05 | — |
| ① Android 向け検証 完了(MS-3) | 2026-06-11(達成) | 当初目標 6/19 より前倒し。完了レビュー |
| 本番導入準備(WBS 1.6) | 2026-06-12 | 山梨大連携・運用基盤・導入計画 |
| ② iPhone 向け検証 開始 | Apple Developer Program 加入次第 | 目標: 2026-06-20(①完了直後) |
| ② iPhone 向け検証 完了 | 2026-07-03 | ②は 2 週間(14 日間)で実施 |
| 本番導入・運用(WBS 3)開始 | 2026-06-13 | MS-3 後。WBS 2 と並行可能 |
| 本番ゴーライブ(MS-6) | 2026-07-15(目標) | 受入テスト合格・カットオーバー完了 |
| 運用体制確立(MS-7) | 2026-07-31(目標) | 監視・月次 runbook・バックアップ試験完了 |
2. マイルストーン
| ID | マイルストーン | 目標日 | 完了基準 |
|---|---|---|---|
| MS-0 | キックオフ・設計資料整備完了 | 2026-06-05 | 検証計画・設計 HTML 資料が揃っている |
| MS-1 | FB 受信経路 検証完了 | 2026-06-14(目標) | Tunnel 経由で POST が DB / Storage に保存される — 2026-06-07 達成(test-feedback.ps1) |
| MS-2 | Android ビルドパイプライン 検証完了 | 2026-06-15 | GHA で APK artifact が取得できる — 2026-06-10 達成(手動ビルド + Pixel 7a install) |
| MS-3 | ① Android 向け検証 完了 | 2026-06-11 | Webhook 連携・端末配布・runbook 完了 — 達成(完了レビュー) |
| MS-4 | Apple Developer Program 加入・② 着手 | 2026-06-19 〜 2026-06-20 | 加入完了次第 ② を開始(TestFlight 利用の前提) |
| MS-5 | ② iPhone 向け検証 完了 | 2026-07-03 | TestFlight 配布・更新確認・runbook 完了(②は 2 週間) |
| MS-6 | 本番ゴーライブ | 2026-07-15 | 本番環境で FB 受信・月次パイプライン 1 サイクル・受入合格(運用計画 3.4) |
| MS-7 | 運用体制確立 | 2026-07-31 | 監視稼働・月次 runbook 確定・バックアップリストア試験・引き継ぎ完了(3.9) |
3. WBS(作業分解構造)
| WBS | 作業名 | 成果物 | 担当 | 開始 | 終了 | 依存 | 状態 |
|---|---|---|---|---|---|---|---|
| 0 | プロジェクト準備 | — | — | 06/05 | 06/05 | — | 完了 |
| 0.1 | 検証計画・設計資料作成(HTML) | docs/*.html | 開発 | 06/03 | 06/05 | — | 完了 |
| 0.2 | WBS・ガントチャート作成 | records.html#wbs | 開発 | 06/05 | 06/05 | 0.1 | 完了 |
| 0.3 | リポジトリ初期構成・ルール整備 | .cursor/rules, README | 開発 | 06/03 | 06/05 | 0.1 | 完了 |
| 1 | ① Android 向け検証 | — | — | 06/06 | 06/11 | 0 | 完了(MS-3) |
| 1.1 | サーバー環境構築 | runbook / 開発ログ | 開発 | 06/06 | 06/07 | 0 | 完了 |
| 1.1.1 | PoC Tunnel 再利用・cloudflared 移行 | api.dammy-otoko.com(Pi → Windows PC) |
開発 | 06/07 | 06/07 | 1.1.3 | 完了 |
| 1.1.2 | FastAPI + DB + Storage(Docker) | server/ 構成・docker-compose | 開発 | 06/06 | 06/07 | 0.3 | 完了 |
| 1.1.3 | FB 受信 API 実装・疎通確認(curl) | POST /api/v1/feedback 動作確認 | 開発 | 06/07 | 06/07 | 1.1.2 | 完了 |
| 1.2 | スタブ Android アプリ | app/ |
開発 | 06/10 | 06/14 | 1.1.3 | 完了 |
| 1.2.1 | Flutter プロジェクト作成(スタブ) | app/ 最小構成 | 開発 | 06/10 | 06/11 | 1.1.3 | 完了 |
| 1.2.2 | 画像選択・ダミー推論・FB 送信実装 | F-01〜F-03 実装 | 開発 | 06/12 | 06/13 | 1.2.1 | 完了 |
| 1.2.3 | Tunnel 経由 FB 受信 端末検証 | Pixel 7a から HTTP 201・Storage 保存 | 開発 | 06/08 | 06/08 | 1.2.2 | 完了 |
| 1.3 | AI Worker スタブ | — | 開発 | 06/11 | 06/16 | 1.1.3 | 完了(2026-06-10) |
| 1.3.1 | 学習スタブ(モデルコピー・版本管理) | models/ 出力 | 開発 | 06/11 | 06/12 | 1.1.3 | 完了(2026-06-09) |
| 1.3.2 | 手動トリガー・完了通知 | run_training_stub() | 開発 | 06/13 | 06/13 | 1.3.1 | 完了(2026-06-10) |
| 1.3.3 | repository_dispatch 送信実装 | trigger_github_dispatch() | 開発 | 06/14 | 06/16 | 1.3.2 | 完了(2026-06-10) |
| 1.4 | GitHub Actions(Android ビルド) | — | 開発 | 06/12 | 06/16 | 1.2.1 | 完了(2026-06-10) |
| 1.4.1 | android-build.yml(workflow_dispatch) | 手動ビルド成功 | 開発 | 06/12 | 06/13 | 1.2.1 | 完了(2026-06-10) |
| 1.4.2 | TFLite 同梱・APK artifact 出力 | MS-2 達成 | 開発 | 06/14 | 06/15 | 1.4.1 | 完了(2026-06-10) |
| 1.4.3 | repository_dispatch トリガー連携 | 1.3.3 → GHA 自動起動 | 開発 | 06/16 | 06/17 | 1.3.3, 1.4.2 | 完了(2026-06-10) |
| 1.5 | 端末配布・運用確立 | — | 開発 | 06/16 | 06/19 | 1.4.2 | 完了(2026-06-11) |
| 1.5.1 | APK 取得・adb install 手順確立 | 配布 runbook | 開発 | 06/16 | 06/16 | 1.4.2 | E2E 確認済み(2026-06-10) |
| 1.5.2 | 月次更新フロー通し検証(手動トリガー) | エンドツーエンド確認 | 開発 | 06/17 | 06/18 | 1.4.3, 1.5.1 | E2E 確認済み(2026-06-11。v2 表示・FB 201) |
| 1.5.3 | ① 完了レビュー・チェックリスト確認 | MS-3 達成 | 開発 | 06/19 | 06/19 | 1.5.2 | 完了(2026-06-11) |
| 1.6 | 本番導入準備(MS-3 後) | — | — | 06/12 | 06/12 | 1.5.3 | 完了 |
| 1.6.1 | 山梨大 GHA 連携モジュール | integrations/・連携ガイド |
開発 | 06/12 | 06/12 | 1.3.3 | 完了 |
| 1.6.2 | 運用基盤(APK ロールバック・通知・DB DDL) | archive-apk.ps1 等・DB スキーマ |
開発 | 06/12 | 06/12 | 1.5.1 | 完了 |
| 1.6.3 | 本番導入計画書 | plans.html#introduction | 開発 | 06/12 | 06/12 | 1.6.1 | 完了 |
| 2 | ② iPhone 向け検証(2 週間) | — | — | 06/19 | 07/03 | 1.5.3, MS-4 | 未着手 |
| 2.1 | Apple Developer Program 加入 | 加入完了・TestFlight 利用可能 | 開発 | 06/19 | 06/20 | 1.5.3 | 未着手 |
| 2.2 | macOS ランナー・iOS ビルド基盤 | ios-build.yml(ドラフト) | 開発 | 06/20 | 06/22 | 2.1 | 未着手 |
| 2.3 | 署名・証明書管理(Fastlane Match 等) | Secrets 構成・手順 | 開発 | 06/23 | 06/24 | 2.2 | 未着手 |
| 2.4 | CoreML 同梱ビルド | CoreML 同梱 IPA | 開発 | 06/25 | 06/26 | 2.3 | 未着手 |
| 2.5 | TestFlight 配布 | Fastlane upload 手順 | 開発 | 06/27 | 06/29 | 2.4 | 未着手 |
| 2.6 | 実機 / Simulator 更新確認 | 配布・更新確認記録 | 開発 | 06/30 | 07/01 | 2.5 | 未着手 |
| 2.7 | ② 完了レビュー・runbook 更新 | MS-5 達成 | 開発 | 07/02 | 07/03 | 2.6 | 未着手 |
| 3 | 本番導入・運用 | — | — | 06/13 | 07/31 | 1.6.3 | 未着手 |
| 3.1 | 本番移行・環境設計 | 運用・監視計画 v0.1 | 開発 | 06/13 | 06/20 | 1.6.3 | 未着手 |
| 3.1.1 | Cloudflare / ドメイン本番アカウント移管 | 移管チェックリスト | 役場 + 開発 | 06/13 | 06/17 | 3.1 | 未着手 |
| 3.1.2 | 本番シークレット・.env 管理方針 |
シークレット一覧・保管場所 | 開発 | 06/14 | 06/18 | 3.1 | 未着手 |
| 3.1.3 | DB 拡張テーブル適用 | 001_schema.sql 適用記録 |
開発 | 06/17 | 06/20 | 3.1.2 | 未着手 |
| 3.1.4 | セキュリティ設計・API 対策 | セキュリティ設計・SEC-01〜04 実装 | 開発 | 06/18 | 06/25 | 3.1.2 | 完了(2026-06-14。SEC-01〜04 実装・検証) |
| 3.1.5 | セキュリティ実測確認(学習) | DB・Storage・ログ・curl 実証(K-28) | 開発 | 06/13 | 06/16 | 1.5.3 | 完了(2026-06-13。K-28 実測記録) |
| 3.2 | 山梨大 Worker 本番接続・結合試験 | 結合試験記録・dispatch 成功 | 山梨大 + 開発 | 06/17 | 06/27 | 1.6.1, 3.1.3 | 未着手 |
| 3.3 | 本番導入 runbook(カットオーバー) | runbook-phase3-cutover.html(予定) | 開発 | 06/24 | 07/01 | 3.1, 3.2 | 未着手 |
| 3.4 | 受入テスト・ゴーライブ判定 | MS-6 達成 | 開発 + 役場 | 07/08 | 07/15 | 3.3, 3.1.4 | 未着手 |
| 3.5 | 監視・アラート設計・実装 | MON-01〜07・通知設定 | 開発 | 06/20 | 07/05 | 3.1 | 未着手 |
| 3.6 | 月次運用 runbook | runbook-phase3-monthly.html(予定) | 開発 | 07/06 | 07/12 | 3.5, 3.2 | 未着手 |
| 3.7 | バックアップ・リストア・DR | バックアップ手順・リストア試験記録 | 役場 + 開発 | 07/08 | 07/17 | 3.1.3 | 未着手 |
| 3.8 | インシデント対応・ロールバック統合 | 障害分類表・エスカレーション | 開発 | 07/10 | 07/20 | 3.6, 3.7 | 未着手 |
| 3.9 | 運用引き継ぎ・レビュー | MS-7 達成 | 全関係者 | 07/22 | 07/31 | 3.4, 3.6, 3.8 | 未着手 |
4. ガントチャート
gantt
title インフラ検証プロジェクト ガントチャート(06/05 開始)
dateFormat YYYY-MM-DD
axisFormat %m/%d
todayMarker stroke-width:3px,stroke:#2563eb
section 0.準備
設計資料整備(HTML) :done, t01, 2026-06-03, 3d
WBS・ガント作成 :done, t02, 2026-06-05, 1d
リポジトリ初期構成 :done, t03, 2026-06-03, 3d
section 1.Android検証(MS-3達成 6/11)
FastAPI+DB+Storage :done, t12, 2026-06-06, 2d
FB受信API・curl疎通 :done, t13, 2026-06-07, 1d
PoC Tunnel移行(cloudflared) :done, t11, 2026-06-07, 1d
Flutterスタブ作成 :done, t14, 2026-06-08, 2d
FB送信実装・端末検証 :done, t14b, 2026-06-08, 1d
MS-1 FB受信経路 :milestone, ms1, 2026-06-07, 0d
AI Workerスタブ :done, t15, 2026-06-09, 2d
GHA Androidビルド :done, t16, 2026-06-10, 1d
Webhook連携(dispatch) :done, t17, 2026-06-10, 1d
APK配布・adb手順 :done, t18, 2026-06-10, 1d
E2E通し検証(v2) :done, t19, 2026-06-11, 1d
①完了レビュー(MS-3) :done, t19b, 2026-06-11, 1d
①完了(MS-3) :milestone, ms3, 2026-06-11, 0d
section 1.6本番導入準備
山梨大GHA連携モジュール :done, t61, 2026-06-12, 1d
運用基盤・DBスキーマ :done, t62, 2026-06-12, 1d
本番導入計画 :done, t63, 2026-06-12, 1d
section 2.iPhone検証(2週間)
Developer Program加入 :t21, 2026-06-19, 2d
macOSランナー・iOS基盤 :t22, 2026-06-20, 3d
署名・証明書管理 :t23, 2026-06-23, 2d
CoreML同梱ビルド :t24, 2026-06-25, 2d
TestFlight配布 :t25, 2026-06-27, 3d
実機/Simulator確認 :t26, 2026-06-30, 2d
②完了レビュー(MS-5) :t27, 2026-07-02, 2d
section 3.本番導入・運用
本番移行・環境設計 :t31, 2026-06-13, 8d
セキュリティ実測(学習) :done, t315, 2026-06-13, 1d
Cloudflare本番移管 :t311, 2026-06-13, 5d
DB拡張適用 :t313, 2026-06-17, 4d
セキュリティ設計・API対策 :done, t314, 2026-06-14, 1d
山梨大Worker結合試験 :t32, 2026-06-17, 11d
監視・アラート実装 :t35, 2026-06-20, 16d
本番導入runbook :t33, 2026-06-24, 8d
受入テスト・ゴーライブ :t34, 2026-07-08, 8d
本番稼働(MS-6) :milestone, ms6, 2026-07-15, 0d
月次運用runbook :t36, 2026-07-06, 7d
バックアップ・DR :t37, 2026-07-08, 10d
インシデント統合手順 :t38, 2026-07-10, 11d
運用引き継ぎ(MS-7) :t39, 2026-07-22, 10d
運用体制確立(MS-7) :milestone, ms7, 2026-07-31, 0d
5. WBS と検証計画の対応
| 検証計画 ID | WBS | 作業名 |
|---|---|---|
| Step 0 | 0.1, 0.2 | 計画・設計資料 |
| Step 1 / 1-1 | 1.1, 1.2.3 | FB 受信(Tunnel 経由) |
| Step 2 / 1-4 | 1.4.1, 1.4.2 | GHA Android ビルド |
| Step 3 / 1-2, 1-3 | 1.3, 1.4.3 | 再学習トリガー・Webhook 連携 |
| Step 4 / 1-5, 1-6 | 1.5 | APK 配布・運用手順 |
| — | 1.6 | 本番導入準備(山梨大連携・運用・導入計画) |
| ② 2-1 | 2.2 | macOS ランナー |
| ② 2-2 | 2.3 | 署名・証明書 |
| ② 2-3 | 2.4 | CoreML 同梱 |
| ② 2-4 | 2.5 | TestFlight |
| ② 2-5 | 2.6 | 実機 / Simulator |
| — | 3.1〜3.4 | 本番移行・Worker 結合・ゴーライブ(導入計画 Step 1〜2) |
| — | 3.5〜3.9 | 監視・月次運用・DR・インシデント(運用・監視計画) |
6. 前提・制約
- 開始日: 2026-06-05
- ① 完了(MS-3): 2026-06-11 達成(当初目標 2026-06-19 より前倒し)
- 本番導入準備(WBS 1.6): 2026-06-12 完了
- ② 開始: Apple Developer Program 加入次第(目標 2026-06-20)。加入が遅れた場合、② 全体がその分スライドする
- ② 期間: 2 週間(2026-06-20 〜 2026-07-03 を目標)
- WBS 3: 2026-06-13 開始。WBS 2 と並行可能。MS-6(7/15)・MS-7(7/31)は目標日
- 工数は 1 人想定の稼働日(1 日 = 実働 6〜8 時間)である
- 1.3(AI Worker)と 1.4(GHA)は 1.2 と並行して進める
- アプリ本体はスタブ。工数に本番アプリ開発は含まない
§2 開発ログ
本ページは、設計方針の変更・協議の経緯・実装の進捗を時系列で記録する開発ログです。 検証計画や WBS の「計画」と本ログの「実績」が乖離した場合は、本ログと関連資料を同期します。 設計理解・エラー解決のナレッジは Phase1 ナレッジ に集約しています。
1. 現在地サマリー(2026-06-11 更新)
| 区分 | 状態 | 備考 |
|---|---|---|
| WBS 1.1 サーバー環境構築 | 完了 | 1.1.1〜1.1.3 すべて完了(コミット e4defb5) |
| MS-1(Tunnel 経由 FB 受信) | 達成 | https://api.dammy-otoko.com 経由で HTTP 201・Storage 保存を確認 |
| WBS 1.2.1 Flutter プロジェクト | 完了 | flutter create で app/ 作成(コミット f383eae) |
| WBS 1.2.2 F-01〜F-03 実装 | 完了 | 画像選択・ダミー推論・FB 送信 |
| WBS 1.2.3 端末検証 | 完了 | Pixel 7a から Tunnel 経由 FB 送信成功(HTTP 201)。Storage に eb29ce87-....png 等を確認 |
| MS-1(クライアント経路) | 再確認済み | スマホ → Cloudflare → Windows PC API → DB / Storage。PC スクリプト経路に加え実機経路も達成 |
| WBS 1.3 AI Worker スタブ | 実装済み | worker/・models/・android-build.yml(dispatch 検証用)。手順: Phase1 Worker 手順 |
| WBS 1.4 GHA Android ビルド | E2E 確認済み | 手動ビルド(workflow_dispatch)→ artifact → Pixel 7a install。手順: GHA 操作手順(UI) |
| MS-2(GHA APK artifact・実機配布) | 達成 | 2026-06-10。Android Build #1(7m 18s)→ app-release-apk-v1 → adb install → 同梱モデル v1 表示・Tunnel 経由 FB 成功 |
| WBS 1.4.3 repository_dispatch 連携 | 確認済み | 2026-06-10。run-training-stub.ps1 → HTTP 204 → Android Build #2(Repository dispatch)起動 |
| WBS 1.5.2 月次通し検証 | 完了 | 2026-06-10〜11。dispatch → Build #2 → v2 APK → Pixel 7a:同梱モデル: v2・Tunnel FB 成功(HTTP 201) |
| WBS 1.5.3 ① 完了レビュー | 完了 | records.html#review — 検証計画 §5 全項目 OK |
| MS-3(① Android 向け検証 完了) | 達成 | 2026-06-11。Webhook 連携・端末配布・runbook 整備を確認 |
| 次のマイルストーン | WBS 2.1 | ② iPhone 向け検証。前提: Apple Developer Program 加入判断(完了レビュー §8) |
2. 方針変更・決定事項一覧
| 日付 | 変更内容 | 理由 | 影響資料 |
|---|---|---|---|
| 2026-06-07 | Cloudflare Tunnel を新規構築せず PoC の poc-api-tunnel を再利用 |
PoC(スマート農業)で Named Tunnel・DNS 移管・固定ドメインが確立済みかつ稼働中のため | runbook、WBS |
| 2026-06-07 | サーバーホストを Raspberry Pi からWindows 11 PCへ変更 | 開発環境をプライベート PC に移行。FB API を同一 PC で運用 | runbook、基本設計 |
| 2026-06-07 | WBS 1.1 の実施順序を変更(ローカル API 疎通 → Tunnel 移行) | Tunnel 基盤は既存のため、先に API の正しさを localhost で確認 | runbook、index |
| 2026-06-07 | 公開 URL を api.dammy-otoko.com に統一 |
PoC で有効なドメインをそのまま利用(api.example.com は不採用) |
runbook |
| 2026-06-07 | cloudflared はDocker コンテナで運用(Windows ネイティブは不採用) | PoC と同様の compose 運用に揃え、TUNNEL_TOKEN のみで接続 |
server/docker-compose.yml、K-03 |
| 2026-06-07 | クライアントはFlutter スタブ(app/)で F-01〜F-03 を実装 |
インフラ検証に集中。診断精度・本番 UI は対象外 | design.html#functions、app/lib/ |
| 2026-06-07 | test-feedback.ps1 の JSON 送信を一時ファイル経由に変更 |
Windows curl.exe -F のインライン JSON エスケープ問題 |
scripts/test-feedback.ps1 |
3. 時系列ログ
プロジェクト準備完了(WBS 0)
検証計画・設計 HTML 資料、WBS・ガントチャート、リポジトリルールを整備。MS-0 達成。
サーバー実装着手・runbook v1.0 作成
server/(FastAPI + PostgreSQL + docker-compose)、
scripts/test-feedback.ps1、
runbook.html#server v1.0 を作成。
当初は Tunnel 新規構築(horse-feedback)を想定。
プライベート PC へ開発環境移行
リポジトリをプライベート PC(Windows 11)へ移行し初回コミット(2c6f420)。
開発の主戦場を自宅 Windows PC とする。
協議: PoC Cloudflare Tunnel の再利用可否
論点: WBS 1.1.1 の Tunnel 構築を一から行うか、
過去 PoC(C:\Dev\PoC_スマート農業環境構築)の資産を活用するか。
- PoC 記録および疎通確認により、
https://api.dammy-otoko.com/pingが応答(Tunnel 稼働中)と確認 - Named Tunnel
poc-api-tunnel、Public Hostnameapi.dammy-otoko.com → http://api:8000が docker-compose と整合 - DNS 移管(Squarespace → Cloudflare)は PoC で完了済み
決定: Tunnel・DNS・Hostname は再利用。作業範囲は「cloudflared の接続先を Pi から Windows PC へ移す」のみ。
参照: Manus 作業記録、 PoC ナレッジ資料(Phase 1-4)
runbook v1.1・開発ログ初版・WBS 更新
PoC Tunnel 再利用を反映し runbook v1.1、 本 開発ログ、WBS を更新。 実施順序: Docker 起動 → ローカル API 疎通 → cloudflared 移行。
Docker Desktop インストール・初回起動
Docker Desktop 4.76.0 をインストール(Per-user)。
初回の Docker Hub サインインはスキップ(ローカル compose のみ利用)。
インストール先: %LOCALAPPDATA%\Programs\DockerDesktop\
WBS 1.1.2 / 1.1.3 ローカル疎通完了
docker compose up -d --build db api成功GET /api/v1/health→{"status":"ok"}POST /api/v1/feedback→ HTTP 201、画像はdata/storage/に保存
課題: test-feedback.ps1 の JSON 送信失敗(Windows)
事象: curl.exe -F "inference_result={...}" で
inference_result must be valid JSON。
原因: インライン JSON のエスケープ破損、または UTF-8 BOM。
対応: scripts/inference.json を
[System.IO.File]::WriteAllText で生成し
-F "inference_result=<...json" で送信。
課題: TUNNEL_TOKEN に Tunnel ID(UUID)を設定
事象: cloudflared が Provided Tunnel token is not valid. で
Restarting (255)。Tunnel 経由は Cloudflare error 1033。
原因: Tunnel ID(UUID)を設定していた。正しくは Zero Trust の Connector トークン(eyJ...)。
対応: ダッシュボードから正しいトークンを server/.env に設定。
詳細: Phase1 ナレッジ K-03
WBS 1.1.1 完了・MS-1 達成(cloudflared: Pi → Windows)
cloudflared の Windows への置き換えを完了。コミット e4defb5。
- Raspberry Pi(
~/poc-api)でsudo docker compose stop cloudflared - 本 PC で
docker compose --profile tunnel up -d cloudflared→Up(precheck 成功、QUIC) curl.exe https://api.dammy-otoko.com/api/v1/health→{"status":"ok"}test-feedback.ps1 -BaseUrl "https://api.dammy-otoko.com"→ HTTP 201
補足: 移行後は /ping(PoC エンドポイント)は 404 となる。
馬体診断 API では /api/v1/health を疎通確認に使用する。
課題: Git push に -m を付けて失敗
事象: git push -m "..." で unknown switch 'm'。
対応: git commit -m "..." → git push の順。
詳細: Phase1 ナレッジ K-14
移行後の再確認(エージェント検証)
ユーザー報告の移行完了後、稼働状態を再確認。
server-api-1/server-db-1/server-cloudflared-1すべて Up- localhost・Tunnel 経由とも
/api/v1/healthがok - Tunnel 経由
POST /api/v1/feedback→ HTTP 201(ID 発行・Storage 保存)
WBS 1.2.1 / 1.2.2 Flutter スタブ実装
MS-1 完了後、クライアント側スタブの実装に着手。コミット f383eae。
| 機能 ID | 実装 | ファイル |
|---|---|---|
| F-01 | ギャラリー画像選択 | image_picker、main.dart |
| F-02 | ダミー推論 | services/dummy_inference.dart |
| F-03 | FB 送信(multipart) | services/feedback_client.dart |
依存: http、image_picker。デフォルト API URL: https://api.dammy-otoko.com(config.dart、UI で変更可)。
flutter analyze— 問題なしflutter test— 成功- Android
INTERNET権限をAndroidManifest.xmlに追加
残: WBS 1.2.3 — 実機検証。 Windows では symlink 警告のため開発者モードの有効化が必要な場合あり。
cd app
flutter run
WBS 1.2.3 実機検証着手(Pixel 7a)
端末: Pixel 7a(3C261JEHN19182、Android 16 / API 36)。
USB デバッグ初回は is not authorized → 端末の許可ダイアログ承認で解消。
flutter run -d 3C261JEHN19182— ビルド・インストール成功(約 161s)- NDK 26 vs 27 警告あり(ビルドは通過。後日
ndkVersion = "27.0.12077973"追記可) - API Base URL
https://api.dammy-otoko.com— 確認 OK - ギャラリー画像選択・ダミー推論表示(F-01 / F-02)— 確認 OK
課題: 実機 FB 送信 — HTTP 530 / error code 1033(Docker Desktop 未起動)
事象: 「フィードバックを送信」→
送信失敗: Exception: HTTP 530: error code: 1033。
原因: PC 上の Docker Desktop が停止しており、cloudflared が Tunnel に接続していない。 MS-1 達成後に PC を再起動/Docker を終了したため再発(K-06 と同型)。
切り分け: PC から curl.exe https://api.dammy-otoko.com/api/v1/health も同じ 1033。
スマホ側の問題ではない。flutter run を止める必要もない(Docker 操作は別ターミナルで可)。
対応: Docker Desktop を起動 →
docker compose --profile tunnel up -d → health 確認。
課題: 実機 FB 送信 — HTTP 400「image must be an image file」
事象: Docker 復旧後、Tunnel 経由で API には到達。
送信時 HTTP 400: {"detail":"image must be an image file"}。
原因: サーバーは multipart の image フィールドの
Content-Type が image/* であることを要求(feedback.py)。
Flutter の MultipartFile.fromPath は Android キャッシュパス(拡張子なし)で MIME 推定に失敗し、
PC の test-feedback.ps1(type=image/jpeg 明示)との差分。
対応: image_picker の XFile.mimeType を
feedback_client.dart の multipart に渡す。詳細: K-17。
WBS 1.2.3 完了 — 実機から Tunnel 経由 FB 送信成功
Pixel 7a(flutter run)から FB 送信に成功。WBS 1.2 スタブ Android アプリの端末検証を完了とした。
- API URL:
https://api.dammy-otoko.com - 画面:
送信成功 (HTTP 201)、ID:2cf573f7-1b4b-47a1-a5ce-e1af31915800 - Storage:
data/storage/eb29ce87-af85-4159-8a5d-abdc4f5dfd76.png等に保存を確認 - 経路: スマホ → Cloudflare Tunnel → Windows PC(FastAPI + PostgreSQL + Storage)
次: WBS 1.3 AI Worker スタブ(学習スタブ → repository_dispatch)
WBS 1.3 実装 — AI Worker スタブ
WBS 1.3.1〜1.3.3 のコード実装を完了。実学習は行わずベース stub.tflite を versions/v{N}/ にコピーする。
- F-20:
worker/training_stub.py—run_training_stub() - F-21:
worker/github_dispatch.py—trigger_github_dispatch()(event:model-updated) - 手動起動:
scripts/run-training-stub.ps1 - GHA:
.github/workflows/android-build.yml(dispatch 受信・プレースホルダビルド) - ローカル検証:
--skip-dispatchで v1 生成を確認
次: WBS 1.4 — APK ビルド本実装。1.3.3 の E2E は worker/.env 設定後に dispatch 実行で確認。
WBS 1.4 / 1.5.1 実装 — GHA APK ビルド・配布手順
android-build.yml: Flutter セットアップ → モデル同梱 →app-release.apkartifact- アプリ:
assets/models/同梱・画面にバージョン表示(ModelBundle) scripts/install-apk.ps1: adb インストール用- runbook: runbook.html#gha
次: リモート push 後、Actions 手動実行または Worker dispatch で artifact 取得 → Pixel 7a 検証。
ナレッジ整理 — GHA / YAML / 月次パイプライン(K-19〜K-21)
WBS 1.4 着手に伴い、GitHub Actions・CI/CD の概念整理を実施。 Phase1 ナレッジ に以下を追記。
- K-19 — YAML の文法とツールごとのスキーマ(Docker Compose vs GHA)
- K-20 —
android-build.ymlの役割、リモート push、artifact / APK、手動ビルドの実体 - K-21 — 月次モデル更新(学習 →
repository_dispatch→ GHA → adb 配布、TestFlight は ②)
要点: YAML push だけではビルドは走らない(on: push なし)。
成果物は artifact に一時保存され、端末反映は PC ダウンロード + adb が Phase1 Android の想定。
WBS 1.4.1 / 1.5.1 E2E — GHA 手動ビルド → Pixel 7a 配布(A-2〜A-6)
GHA 操作手順(UI) に沿い、
workflow_dispatch 手動ビルドから実機配布まで完遂。証跡スクショは runbook に掲載。
| 手順 | 結果 |
|---|---|
| A-2 Android Build 選択 | OK(workflow_dispatch 表示) |
| A-3 Run workflow(model_version: v1) | OK |
| A-4 ビルド | Android Build #1 成功(7m 18s、Artifacts: 1) |
| A-5 artifact ダウンロード | app-release-apk-v1 → 解凍 → app-release.apk |
| A-6 adb install | 初回 INSTALL_FAILED_UPDATE_INCOMPATIBLE → adb uninstall 後 Success |
実機確認(GHA release APK):
- 画面上部:
同梱モデル: v1 (92 bytes) - FB 送信:
送信成功 (HTTP 201)(ID:0710ac54-44f8-41ec-b83b-aca8c12b02af) - DEBUG リボンなし(release ビルドとして正常)
副次対応: install-apk.ps1 を Android SDK の adb.exe 自動検出に修正(PATH 未設定対策)。
次: WBS 1.4.3 — run-training-stub.ps1 による repository_dispatch 通し検証。
実施内容
worker/.env.exampleをworker/.envにコピー(gitignore 済み、commit しない)- Classic PAT をユーザー Settings → Developer settings で発行(
repoスコープ)。リポジトリの Actions Secrets ではない — K-22 GITHUB_REPOSITORY=makoto55879/github-actions-testを設定.\scripts\run-training-stub.ps1実行
コンソール結果:
[1/2]学習スタブ:models/versions/v2/horse_model.tflite生成(前回 v1 済みのため v2)[2/2]dispatch: eventmodel-updated、status: 204
GitHub Actions: Android Build #2 が Repository dispatch で起動(方法 A の #1「Manually run」とは別トリガー)。
参照: GHA 操作手順 §B、Worker 手順 §3〜5。
実施内容
- Android Build #2 成功 → Artifacts
app-release-apk-v2を PC にダウンロード・ZIP 解凍 - Pixel 7a(
3C261JEHN19182)へ release APK を install:
.\scripts\install-apk.ps1 `
-ApkPath "C:\Users\wt2bp\Downloads\app-release-apk-v2\app-release.apk" `
-DeviceId 3C261JEHN19182
install 時のエラーと対処:
- 初回:
INSTALL_FAILED_UPDATE_INCOMPATIBLE(既存com.horsediagnosis.horse_stubの署名不一致) - 対処:
adb uninstall com.horsediagnosis.horse_stub→ 再 install → Success - 方法 A(v1)でも同症状。デバッグ版(
flutter run)残留時や release 上書き時に発生しうる — K-13
方法 B 通し確認(1.5.2):
| 工程 | 結果 |
|---|---|
| 学習スタブ v2 + dispatch 204 | 済 |
| Android Build #2(Repository dispatch) | 成功 |
artifact app-release-apk-v2 | 取得済み |
| adb install → Pixel 7a | Success |
起動後 同梱モデル: v2 表示 | 確認(2026-06-11) |
| Tunnel 経由 FB 送信 | HTTP 201(ID: 45cbbe07-c287-4db9-845f-dce8904bff91) |
実機確認(方法 B release APK):
- 画面上部:
同梱モデル: v2 (92 bytes) - API Base URL:
https://api.dammy-otoko.com - FB 送信:
送信成功 (HTTP 201) - DEBUG リボンなし(release ビルドとして正常)
証跡: GHA 操作手順 図 B-4b(10-app-release-v2.png)
次: WBS 1.5.3 — ① 完了レビュー。
① Android 向け検証 完了レビュー
1.5.2 の方法 B E2E をもって、検証計画 の ① 完了条件 4 項目すべてを満たしたと判定。 成果物: records.html#review。
- MS-0〜MS-3 すべて達成
- runbook 5 体系 + ナレッジ K-19〜K-23 で再現性を確保
- 月次フロー(Worker dispatch → GHA → artifact → adb → FB)確立
次: ② iPhone 向け検証 — Apple Developer Program 加入判断後、WBS 2.1 から。並行して WBS 3.1 本番移行設計。
integrations/github_actions_client.py—GitHubActionsClient(山梨大 Worker 組み込み用)integrations/notifier.py— 開発者 Webhook 通知scripts/archive-apk.ps1/rollback-apk.ps1— ローカル APK 世代管理server/api/sql/001_schema.sql+ DB スキーマ- 山梨大 GHA 連携ガイド
- 本番導入計画(test_plan_draft.html v0.1 を MS-3 実績で同期)
MS-3 後の振り返りで、本番導入計画 はコンポーネント構築までで、 ゴーライブ以降の監視・定常運用が未計画であることを確認。
- プロジェクト振り返り — ギャップ分析・優先度
- 運用・監視計画 v0.1(ドラフト)
- WBS・ガント v2.1 — WBS 3 追加、MS-6 / MS-7 設定
- 本番導入計画 v1.1 — Step 7(ゴーライブ)・Step 8(運用体制)追加
次: WBS 3.1 本番移行設計から着手。3.1.4 セキュリティ(API 認証)は MS-6 前必須。山梨大 Worker 結合(3.2)は並行調整。
基本設計のセキュリティは HTTPS + PII 禁止の 1 行のみ。実装は /api/v1/feedback が無認証のまま。
セキュリティ設計の理解に OSI・HTTPS・FW 等の前提が必要とのフィードバックを受け、 これまでの Q&A を Phase1 ナレッジ に集約。
MS-3 後のセキュリティ学習として、Tunnel 経由の FB・DB・Storage・ログ・無認証 POST・localhost 裏口を確認。
- Tunnel:
test-feedback.ps1→ 201(iddf37d39d-...) - DB: PII なし(inference JSON + 画像パスのみ)
- ログ: body 全文は出ず(メソッド・パス・ステータスのみ)
- 無認証 POST 可能 → SEC-01(API キー)の必要性を実感
localhost:8000で health OK → SEC-03(bind 制限)の必要性を実感
記録: K-28 実測記録。次: WBS 3.1.4(SEC-01〜04 実装)。
- SEC-01:
FEEDBACK_API_KEY設定時にAuthorization: Bearer必須(app/deps/auth.py) - SEC-02:
MAX_UPLOAD_BYTES超過で HTTP 413 - SEC-03:
docker-composeポートを127.0.0.1:8000:8000に変更 - SEC-04: デフォルト DB パスワード検知の起動 WARNING +
server/env.example - クライアント:
test-feedback.ps1 -ApiKey、Flutter--dart-define=FEEDBACK_API_KEY=...
検証: 無認証 401 / キーあり 201 / oversized 413 / Tunnel 経由 201(キー未設定時)。
- 誤設定:
FEEDBACK_API_KEYをworker/.envに追加してしまった(正しい置き場所はserver/.envのみ)。誤記載は削除済み - 症状:
test-feedback.ps1で health はokだが POST が401 invalid api key。プレースホルダ警告あり - 解消:
Remove-Item Env:FEEDBACK_API_KEY→rotate-server-secrets.ps1 -ApiKey -RestartApi→ Tunnel 経由で HTTP 201(id58b80bce-...、2026-06-14) - ドキュメント: README に「リポジトリ構成とシークレット」、docs/index.html 同セクション、サイドバー「リポジトリ・シークレット」グループを追加
- ナレッジ: K-30 に .env 配置ミスと 401 の整理を追記
- deny 実測: 誤キー →
401 invalid api key、認証なし →401 missing or invalid authorization header(K-30 deny)
記録: K-30。次: WBS 3.1.1 本番移行設計を継続。Flutter 本番ビルドへ --dart-define=FEEDBACK_API_KEY を渡す手順の整理。
android-build.yml:secrets.FEEDBACK_API_KEY→--dart-defineで APK に同梱scripts/build-flutter-apk.ps1: ローカル release ビルド(server/.env自動読み込み)- 手順: runbook-phase1-gha §4b
2-B 完了: 2026-06-15 マイルストーン を参照。
- GitHub → Settings → Secrets and variables → Actions →
FEEDBACK_API_KEY登録 - Android Build 手動 run(
model_versionラベル付き)→ 成功(約 7m) - ビルドログ:
FEEDBACK_API_KEY is set (length …)を確認
手順・スクショ: runbook §4b-1〜4b-6。注意: Secret 値は = 右のみ。length がローカル(43)と一致するか要確認。
build-flutter-apk.ps1→server/.envから鍵同梱(長さ 43)- 副次修正:
feedback_client.dartのimport '../config.dart';(release ビルドエラー解消) - Pixel 7a(
3C261JEHN19182):INSTALL_FAILED_UPDATE_INCOMPATIBLE→ uninstall 後 install Success - 実機 FB: HTTP 201(ID:
77d54315-7fe9-4c82-a48f-4fd628ec9067a) - 表示:
同梱モデル: local-dev (92 bytes)(ローカル release ビルドのため GHA 版 vN ラベルではない)
証跡: runbook §4c 図 4c-1。SEC-01 経路: サーバー + test-feedback.ps1 + Flutter APK(ローカルビルド)が揃った。
- 初回失敗: Secret に
FEEDBACK_API_KEY=...行全体を貼り付け → ビルドログ length 68 → 実機 FB 401 invalid api key - 修正: Actions Secret を
=右側のみに更新 → 再ビルド → ログ length 43(2-A と一致) - Pixel 7a(
3C261JEHN19182): uninstall → GHA artifact install Success - 実機 FB: HTTP 201(ID:
f3119e16-6f20-41d7-915b-15807b25c8fe) - 表示:
同梱モデル: v2 (Add Secrets) (92 bytes)
証跡: runbook §4c 図 4c-2。SEC-01 クライアント検証(WBS 3.1.4)完了: 2-A(ローカル)・2-B(GHA)の両経路で実機 FB 201。
- 方針: 本番正は パターン A(DB + Storage 直)。B Export API は代替として実装済み
- 環境: 検証は開発者 PC、本番は役場 PC(山梨大コンポーネントは最終的に役場へ)
- FB 想定: 月 100 件以下 — DB レスも可能だが Phase1 は PostgreSQL 維持
- DB:
002_feedback_lifecycle.sql/ B 用 API(pending・consume・image)
71ff554: 計画 / Runbook / 連携 / 設計 / 参照 / 記録 / ナレッジ + トップの 8 ページ構成- 旧 HTML はリダイレクトスタブ(例:
integration-boundary.html→integration.html#boundary) - 統合版へリンク統一・パターン A 方針・PC 移設 §5 を追記
- トップ(index §1): 計画→設計→構築・運用→連携→参照→記録の 6 層 + ナレッジ
- 各ページ冒頭に「この文書について」(目的・読者・標準章との対応表)
- Runbook を「構築・運用手順書」、サイドバーを ①〜⑥ の層番号に統一
4. 実装済みコンポーネント一覧
| コンポーネント | パス | 状態 |
|---|---|---|
| FastAPI + PostgreSQL | server/ | 稼働中 |
| cloudflared(Tunnel) | server/docker-compose.yml profile tunnel | 稼働中(Windows PC) |
| 疎通スクリプト | scripts/test-feedback.ps1 | Tunnel 経由確認済み |
| Flutter スタブ | app/ | SEC-01 実機 FB 201 — 2-A・2-B 両経路確認済み(2026-06-15) |
| AI Worker スタブ | worker/・models/ | dispatch 204 + GHA 起動確認済み(2026-06-10) |
| GitHub Actions | .github/workflows/android-build.yml | 手動 #1・dispatch #2 → 実機 install まで確認済み |
| APK インストール | scripts/install-apk.ps1 | Pixel 7a へ release APK 導入確認済み |
5. 関連リソース
| 種別 | 参照先 |
|---|---|
| PoC 記録(ローカル) | C:\Dev\PoC_スマート農業環境構築\ |
| Manus 作業記録 | RaspberryPiを用いたサーバ/クライアント構築と実現性検証 |
| Phase1 ナレッジ | knowledge.html(K-18 Flutter 基礎、K-19〜K-23 GHA / CI/CD / 運用) |
| 機能定義 | design.html#functions(F-01〜F-03 実装済み) |
| 現行 runbook | runbook.html#gha-ui(v1.5、§A/B E2E 証跡付き) |
§3 ① Android 完了レビュー
WBS 1.5.3 の成果物です。検証計画 の「① 完了条件」を 実施記録と照合し、MS-3(① Android 向け検証 完了) を宣言します。
1. マイルストーン達成状況
| MS | 内容 | 達成日 | 状態 |
|---|---|---|---|
| MS-0 | キックオフ・設計資料整備 | 2026-06-05 頃 | 達成 |
| MS-1 | FB 受信経路(Tunnel 経由) | 2026-06-07 | 達成 |
| MS-2 | Android ビルドパイプライン(GHA → artifact → adb) | 2026-06-10 | 達成 |
| MS-3 | ① Android 向け検証 完了(Webhook・配布・runbook) | 2026-06-11 | 達成 |
2. 完了基準チェックリスト(検証計画 §5)
| 完了条件 | 判定 | 証跡 |
|---|---|---|
| FB が Tunnel 経由で PC に届く | OK |
MS-1(2026-06-07): test-feedback.ps1 -BaseUrl https://api.dammy-otoko.com1.2.3 / 1.5.2: Pixel 7a から HTTP 201(ID: 45cbbe07-c287-4db9-845f-dce8904bff91 等)サーバー手順、開発ログ |
| 再学習(スタブ可)完了後に Webhook で GHA が起動する | OK |
1.4.3 / 1.5.2: run-training-stub.ps1 → dispatch 204 → Android Build #2(Repository dispatch)Worker 手順、GHA UI §B |
| APK がビルドされ artifact から取得できる | OK |
Build #1(手動): app-release-apk-v1(7m 18s)Build #2(dispatch): app-release-apk-v2GHA・APK 手順、GHA 操作手順(UI) |
| 手順書のみで第三者が同じ操作を再現できる | OK |
runbook 5 本(下表)。画面操作は UI 手順書+スクリーンショット証跡(A-6b / B-4b) ナレッジ K-19〜K-23(設計理解・PAT・運用) |
3. WBS 1.1〜1.5 実施サマリー
| WBS | 内容 | 完了日 |
|---|---|---|
| 1.1 | サーバー(FastAPI + PostgreSQL + Tunnel 移行) | 2026-06-07 |
| 1.2 | Flutter スタブアプリ(F-01〜F-03)・実機 FB | 2026-06-08 |
| 1.3 | AI Worker スタブ(学習コピー + repository_dispatch) | 2026-06-10 |
| 1.4 | GHA Android ビルド(手動 + dispatch) | 2026-06-10 |
| 1.5.1 | artifact 取得・adb install | 2026-06-10 |
| 1.5.2 | 月次通し E2E(方法 B: v2 → 実機 → FB) | 2026-06-11 |
| 1.5.3 | 本レビュー・チェックリスト確認 | 2026-06-11 |
4. runbook 一覧(再現手順)
| 手順書 | 対象 WBS | 主な操作 |
|---|---|---|
| Phase1 サーバー手順 | 1.1 | Docker 起動・Tunnel 移行・FB 疎通 |
| Phase1 Worker 手順 | 1.3 | 学習スタブ・PAT 設定・dispatch |
| Phase1 GHA・APK 手順 | 1.4 / 1.5.1 | モデル同梱ビルド・artifact・adb |
| GHA 操作手順(UI) | 1.4.1 / 1.5.2 | GitHub 画面での Run workflow・Artifacts 取得(方法 A/B) |
| K-23 運用 | 1.5 運用 | PAT ローテーション・artifact 30 日・APK 世代管理 |
5. 月次更新フロー(確立済み・方法 B)
flowchart LR
FB["Pixel: FB 送信"]
API["FastAPI + Storage"]
WK["Worker: 学習スタブ"]
GHA["GitHub Actions"]
APK["artifact APK"]
DEV["adb install"]
FB --> API
WK -->|"repository_dispatch"| GHA
GHA --> APK
APK --> DEV
2026-06-11 に方法 B で通し確認済み(v2 同梱表示・Tunnel FB 201)。詳細: 開発ログ(1.5.2 エントリ)。
6. 運用上の継続事項(① 完了後も実施)
- PAT 期限切れ前のローテーション(K-23)
- artifact ダウンロード後のローカル APK 保管(30 日で GitHub 上から消える)
- 月次: Docker 起動 → Worker dispatch → artifact 取得 → adb install
- 署名不一致時の
adb uninstall(K-13)
7. 既知の制限(スタブ検証の範囲)
| 項目 | 現状 | 本番想定 |
|---|---|---|
| 推論 | ダミー推論(DummyInference) |
オンデバイス TFLite 推論 |
| 学習 | モデルファイルのコピー | FB データを用いた再学習 |
| モデル同梱(GHA) | ベース stub + バージョンラベル(versions/ はローカルのみ) |
学習成果物のリポジトリ or ストレージ連携 |
| 配布 | adb 手動 install(管理下 1 台) | 社内配布手段の拡張(検討余地あり) |
いずれもインフラ検証のスコープ外として意図的にスタブ化しています(検証計画 §1)。
8. ② iPhone 向け検証 — 着手条件
MS-3 達成により、② への着手ゲートを満たしました。着手前に以下を決定してください。
| 条件 | 状態 | 備考 |
|---|---|---|
| ① チェックリスト完了 | 満たす | 本レビュー §2 |
| Apple Developer Program 加入 | 未加入 | WBS 2.1。TestFlight に必須(WBS) |
| macOS ランナー・署名コストの把握 | 着手時確認 | 月次 1 回更新想定(検証計画 §5) |
次のアクション(②): Apple Developer Program の Go / No-Go 判断 → WBS 2.1 から開始(ios-build.yml ドラフト等)。