← デモトップへ戻る最終更新: 2018/10/20 10:46
📋

琴平 WBS — 実装進捗 & チェックリスト

docs/_kotohira/wbs.md を表示しています。 KOTO_1〜14 / BASE_1〜7 / チェックリスト9項目を1ページで確認できます。

🚀

本番ページ クイックリンク(KOTO_1〜16)

WBS の各 KOTO シーンに対応する 実運用ページ へ 1 クリックで飛べます。 🟢 = 通常運用 / 🟡 = 実装済・運用条件待ち / ⚪ = 本番未実装(デモのみ)

KOTO_1① LINE友だち追加〜あいさつ
本番へ →
KOTO_2② リッチメニュー9面
デモのみ
KOTO_3③ LINE連携〜町民登録

※ 本番は LINE ログイン画面に遷移

本番へ →
KOTO_4④ マイページ(会員証・残高)
本番へ →
KOTO_5⑤ イベント一覧・詳細
本番へ →
KOTO_6⑥ イベントチェックイン

※ 本番チェックインはイベント詳細から起動

本番へ →
KOTO_7⑦ お店一覧・クーポン利用
本番へ →
KOTO_8⑧ お店マップ
本番へ →
KOTO_9⑨ 町内移動(mobi配車)
本番へ →
KOTO_10⑩ 町民どうしでお礼pt送金
本番へ →
KOTO_10B⑩B 未会員にもリンクで贈れる琴デジポイント
本番へ →
KOTO_11⑪ プレミアム購入(Stripe風決済)
本番へ →
KOTO_12⑫ プレミアム特典一覧
本番へ →
KOTO_13⑬ 町長選挙(候補者・投票)
本番へ →
KOTO_14⑭ お店オーナー管理画面
本番へ →
KOTO_15⑮ スポットワーク(地域版タイミー)
デモのみ
KOTO_16⑯ お問い合わせフォーム
本番へ →

※ ログインが必要なページ(マイページ・送金・選挙・購入)は、未ログインの場合 /auth/signin へ自動リダイレクトされます。

琴平デジタル町民 WBS(実装進捗 & チェックリスト)

最終更新: 2026-09-17(住民向け画面の「読めない・押せない」を一括改善: 本文級の小さい文字(12px)271箇所を14pxへ引き上げ(送金画面の残高・金額は全件対象)。キーボード操作時にフォーカス位置が見えない箇所を修正(管理画面の入力欄4箇所は古い指定のため表示ゼロだった)。スマホで右端が切れて読めなかった一覧表10箇所を横スクロール可能に。ブラウザ標準の入力窓を自前ダイアログへ統一。test:unit 3049 PASS / lint 0 error。branch fix/uiux-critical-2026-09 push 済み・main 未マージ)。/旧記載 2026-07-29(LINE設定画面を刷新(保存情報の暗号化・接続状態の見える化): 管理画面の LINE 連携設定を新方式に切替。Channel Secret / Access Token は暗号化して保存され、保存後に画面へ再表示されない安全な方式に統一。あわせて「Messaging / Webhook / テスト送信」の接続状態が個別に確認できる接続状況カードを追加。既存の琴平 LINE 配信・受信は従来どおり動作(設定値の変更なし・移行作業不要)。PR#133)。/旧記載 2026-07-04(「琴平モデル」説明資料を新規作成: 琴平モデル(LINE入口→町民証→ためる→つかう→加盟店循環)を外部に説明するための A4縦・4ページ・2列レイアウト資料。トップ/はじめての方へ/マイページ(会員証・残高)/ポイント引換メニュー/イベント一覧・詳細/お店一覧・マップ/ギフトリンク/加盟店オーナー管理画面/公開WBS の各機能をスマホ実画面スクリーンショット12枚つきで解説。HTML+PDF を docs/_kotohira/kotohira-model-guide.{html,pdf} に配置。スクショは本番の公開ページと公開デモページのみ使用=個人情報なし)。/旧記載 2026-06-27(「送金しようとすると『LINE連携未完のため送信できません』で送れない」を根治+影響範囲を定量化(顧客バグ報告対応 / KOTO_10 P2P送金): アカウント統合済みの住民にポイントを送ろうとすると送れない、との報告。原因=送金が forcommunity LINE(汎用チャネル)連携を必須にしていたが、琴平住民は 琴平公式LINE でログインしており、汎用チャネル連携を持たないため送り手・受け手とも弾かれていた。送金完了通知は琴平公式LINEで届くので汎用連携を必須にする理由は無く、会員ランク判定(citizen)も既に「どちらかのLINE連携があればOK」だったのに送金ガードだけがそれと食い違っていた設計バグ。修正=LINE連携の判定を共通の純関数 userHasUsableLineLink に集約し、琴平では公式LINE単独でも送受金可能に(会員ランク判定とロジック統一=将来のズレ防止)。本番計測で琴平メンバー2065名中1958名(約95%)がこのバグの影響対象=報告者個人ではなく住民ほぼ全員に効いていた重大バグ。うち残高>0=33名 / オンボーディング完了済=35名が実害可能性=高。test:unit 82(変更領域)PASS / lint 0 / build OK / 本番実データで「旧=送れない→新=送れる」を実証。PR#79 main マージ・本番デプロイ済。対象住民は追加操作なしで送受金可能に。報告者・対象住民の実名は社内のみ(playbook §10)。commit 125dd68b。/旧記載 2026-06-18(納品アイコンが「全体的に小さく見える」問題を一括解消+アイコン1種の意味ズレ修正: ①新アイコンが小さく見える原因=納品 SVG の中に約34%の余白が組み込まれていた(絵柄が枠の約66%しか占めない)こと。アイコン描画を1ファイル直すだけで全画面(約110箇所)のアイコンが約1.3倍に大きく見えるよう修正(レイアウトのサイズ自体は変えず見た目だけ拡大、画質劣化なし)。SNS ロゴのような「枠いっぱいで完成しているアイコン」だけは拡大対象から除外(はみ出し防止)。②「コミュニティの顔(アバター)未設定時」に表示していたアイコンが、実はデザイナーが**「遊休資産(眠った資産が芽吹く)」の意味で作った『芽+¥』アイコンの流用で意味がずれていた(高木氏指摘)ため、アバターは地球儀アイコンに変更し、『芽+¥』は本来意図に近い会員証の「ポイント循環」表示に整理。test:unit 2310 PASS / lint 0 error / build OK、実画面で拡大効果・はみ出しなしを確認。commit 323cbc8a、branch kotohira/channel-sns-icons(main 未マージ)。/旧記載 2026-06-18: 町民チャンネルページ(/c/kotohira/channel)の SNS アイコンを納品 SVG ロゴに統一: 「フォローする」一覧で YouTube だけが正式ロゴで、Instagram / X / オープンチャットは仮の文字記号(◉ / X / L)のままだったのを、4つとも納品済みの SNS ロゴ(青タイル+白ロゴ)に差し替え。仮で敷いていた色違いの背景タイルが正式ロゴと二重に重なって全部同じ青に見える状態だったため背景も整理し、各ロゴが正しく見分けられるよう修正。test:unit 2310 PASS / lint 0 error / build OK、実画面スクリーンショットで表示確認済み。commit 406adfb1、branch kotohira/channel-sns-icons(main 未マージ)。/旧記載 2026-06-12: サイト全体の画面アイコンをデザイナー納品の正式アイコン(青×黄39種+SNSロゴ)に刷新: これまで絵文字で仮表示だったホーム・お店一覧/詳細・マップ・マイページ・取引履歴・イベント・はじめての方へ等の約110箇所を置換。アイコン定義は1ファイル集中管理で、今後の差し替えは1行の変更で全画面に反映。参照画像の実在は自動テストで担保。「お問い合わせ」のみSVG追納待ちでPNG代用。commit f7c15985、同日 main マージ・本番反映済み f4b0f901(本番スモーク 6/6 OK)。/旧記載 2026-06-08: 町民登録の生年月日を1桁(ゼロ埋めなし)で入力しても登録できるよう修正: コトリで会った学生が iPhone で登録完了できずポイントを渡せなかった報告対応。生年月日が「06」のように2桁ちょうどでないと認識されない仕様が原因で、「6」のような1桁でも確定するよう修正。12月入力のリグレッション防止+送信時取りこぼし防止も実装。UAT に AC-7(P0) 追加、自動テストで担保(test:unit 2264 / lint 0 / build / e2e UAT 5/5)。iPhone 実機確認は別途必要、当面は「06」「0601」とゼロ埋めで回避可。commit e89651f0。/旧記載 2026-06-06: ①オンボーディング登録 500 (consent-commit-failed) の真因 P6005 を確定・根治+本番反映**。本番構造化ログで prismaCode:P6005「Accelerate 対話型 tx の上限 15000ms 超過」を確定。緩和策として入れた timeout:20_000 が上限超過で即拒否され、PR#28 以降オンボーディング完了が構造的に全滅していた(「現地1名」は誤認、全ユーザー)。timeout を 14_000 に下げ+tx を ~9→~4 往復に短縮+P6005 を非リトライ化。本番Accelerateで「20000→P6005 / 14000→OK」を実証。PR#38。②同意(consent)をログイン直後の強制ゲートから「イベント参加・価値操作時」へ移動。閲覧自由化(Gate の consent 強制 redirect 撤去、line-link 誘導は維持)。共通ヘルパー isKotohiraOnboardingComplete + サーバ側 403 ガードを events/join・gift/issue・points/transfer・quests/apply に追加(全て kotohira community 限定スコープ=他コミュニティ無影響)。未同意なら consent へ誘導し同意後に元操作へ戻す。PR#39。両 PR とも build 完走確認・本番デプロイ Ready・主要動線スモーク 200。/2026-06-05: ポイント台帳の残高修復を本番適用: 全住民75名を「受け取った額の合計 − 送った額の合計=本来の残高」で再監査し、過去の送金・ギフトが残高に正しく反映されていなかった住民の残高を一括補正。全住民で「正規の台帳=履歴の足し算」一致を確認。住民には履歴の調整明細で内訳を1件ずつ透明化。再発防止 CI gate+会計ロジックの unit test 凍結も追加。補正額・対象住民は社内のみ=playbook §10 参照。本番DB補正は適用済み・main 未 merge。commit 1d94e78f ほか3本。/旧記載: 顧客バグ報告対応 オンボーディング登録の「consent-commit-failed」(500) に対し、Phase 1 トランザクションの耐障害性を強化(全ロールバック系の一過性失敗=tx タイムアウト/接続系/ネットワーク reset を自動リトライ+timeout 緩和)し、失敗時に Prisma error code を構造化ログ化して次回発生時に真因を確定できるようにした。真因は当時のログ・DB痕跡が残らず未確定だが、本番データ整合で制約/FK/競合系は除外済み。旧コメントの「弱回線→tx 5s超過」因果は誤りのため訂正(tx はサーバ側実行でモバイル回線とは無関係)。test:unit 2139 PASS / lint 0 / build OK。⚠️ branch push 済み・main 未 merge(本番未反映)。commit e0b836c8。/同日: 回答済み住民にオンボーディング・アンケートが毎ログイン再表示される問題を修正。真因はオンボーディング完了判定が2カラム(CommunityFormResponse行 / CommunityMember.onboardingCompletedAt)に分散保存される中、表示トリガが叩く status route だけが共通判定関数を使わず response 行のみ見ていたため、onboardingCompletedAt だけある住民が「未回答」と誤判定されていた。完了判定を全経路で共通関数 isKotohiraOnboardingFormSatisfied に一本化(DB変更なし・副作用なし)。commit 89aad7e1。/同日: 「ポイントを送っても送り手のポイントが減らない」報告を本番DB+実Postgres統合テストで調査。送金の実残高(取引台帳の合計)は正しく減算されておりコアロジックにバグ無しと実証。真因は 表示レイヤ(送金画面ヘッダーの残高がページ読込時の値で固定され、送金後の再描画反映ラグの間「古い残高」が見え続け、減っていないと誤読される)。送金完了で残高を即時反映+完了画面に残高表示、台帳の実額不明 marker を「+0」→「—」表示、履歴詳細のペア検索を改善。commit 45be2af6。/2026-05-31: イベント説明文の 見出し/リストが反映されない根因(Tailwind 4 で @tailwindcss/typography 未導入 → prose がアプリ全体で無効)を修正。commit 352f7cbd。/2026-05-29: コトリ運営依頼で①問い合わせ受信先メールを kotobus → support@kotohira.love に切替、②LINE トーク受信時の 自動返信(メール窓口へ誘導)を webhook 実装。※自動返信の実反映には LINE 応答モードを「チャット(webhook)」にする運営側確認が必須) 正本: 本ファイル(docs/_kotohira/wbs.md) 公開URL: /c/kotohira/demo/wbs(誰でもアクセス可) 社内詳細: docs/_kotohira/_internal/playbook.html §12(社内限定)

⚠️ 本ファイルは琴平案件の 唯一の進捗管理 SoT (Source of Truth) です。 琴平関連の commit / PR / docs 追加・修正があった場合は、必ずここを同時に更新してください(/kotohira-playbook-update skill が自動連動)。


📊 ダッシュボード(クイックビュー)

全体進捗

区分完了進行中ブロックスコープ外計
KOTO(デモシーン連動)1323119
BASE(基盤タスク)01517
チェックリスト9項目71019

5/7 切替(Webhook 切替日)までの必須項目

  • ✅ KOTO_1, KOTO_2, KOTO_3, KOTO_4, KOTO_5, KOTO_6, KOTO_10
  • 🔴 BASE_1(Token 受領)— 依然未受領、TRAPOL社へ催促中
  • ⏳ BASE_3(内部配信テスト)— BASE_1 待ち
  • ⏳ BASE_4(Webhook 切替本番)— 5/7 当日実施

5/14 安定稼働確認まで

  • BASE_6(モニタリング)

5/7 切替直前 実行チェックリスト(2026-05-03版 / 厳格判定)

完了判定ゲート(先に満たすべき5条件)

  • G-0: npm run check:kotohira:cutover 実行で FAIL=0(BLOCKED は外部依存として管理)
  • G-A: npm run check:kotohira:acceptance 実行で lint + unit test を毎回通す(control が BLOCKED の場合は外部依存として記録)
  • G-1: KOTOHIRA_LINE_CHANNEL_ACCESS_TOKEN が本番環境に設定済み(受領時刻・受領者を記録)
  • G-2: preview / complete / welcome の内部配信テスト3件で受信確認(スクショ3枚)
  • G-3: 告知最終稿で {{メンテ開始}} {{メンテ終了}} {{問い合わせ窓口}} が全て解決
  • G-4: Webhook 切替後に follow / postback 疎通ログを取得
  • G-5: checkin と P2P 送金の DB 書き込みを本番で確認

担当・期限つき運用版(証跡必須)

ID実行項目Owner期限完了条件(DoD)必須証跡現在
CL-00事前自動監査MMD運用毎日 09:00 / 18:00npm run check:kotohira:control 実行で FAIL=0 を維持(snapshot + brief 同時生成)実行ログ🟡 decision=BLOCKED(cutover/blockers待ち)/ status+brief+history更新済(2026-05-03 02:05)
CL-00A受け入れテストMMD運用変更ごとnpm run check:kotohira:acceptance(標準)/ 切替前は acceptance:full(琴平E2E込み)実行ログ🟡 lint PASS / test:unit 1678 PASS / test:e2e:kotohira 2 PASS(controlはBLOCKED, 2026-05-04)。最新値は npm run test:unit で確認すること
CL-01BASE_1 Token 受領 + 保管三好氏(対外窓口) / MMD運用5/6 18:00Token 受領 + 本番環境へ設定 + 受領時刻記録。未受領時のエスカレーション発火条件を満たす環境変数設定確認、受領ログ(時刻/担当)🔴 未着手(外部待ち)
CL-02BASE_3 内部配信テストMMD運用CL-01完了後 30分以内本番 Channel で preview / complete / welcome を 高木の test 受信LINE に送信し、3件受信を確認送信結果 + 受信スクショ3枚(テンプレ別)🔴 CL-01待ち
CL-03BASE_5 配信文面確定三好氏(値確定) / MMD運用(反映)5/6 20:00{{メンテ開始}} {{メンテ終了}} {{問い合わせ窓口}} 解決済み最終稿を outreach に保存。未確定時は BLOCKED 明示最終稿ファイル + 更新コミット⏸ BLOCKED(三好氏値待ち)
CL-04aKOTO_2 リッチメニュー deployMMD開発5/6 21:00scripts/create-kotohira-rich-menus.ts --deploy 実行で本番ID生成data/kotohira-richmenu-ids.json🔴 CL-01待ち
CL-04bKOTO_2 default attachMMD開発CL-05完了後--attach-default 実行 + guest/citizen/premium の3状態実機確認実行ログ + 3状態スクショ🔴 CL-05待ち
CL-05BASE_4 Webhook 切替TRAPOL社 + MMD運用5/7 09:30Webhook URL 切替完了 + follow/postback 疎通確認。失敗時は docs/runbooks/kotohira-webhook-cutover-rollback.md に従い切戻し設定画面スクショ + 疎通ログ⏳ 当日実施
CL-05.5BASE_2 名寄せドライランMMD運用5/7 09:50friend ID と既存ユーザーの名寄せ結果(マッチ/未マッチ)を出力し、例外件数を記録実行結果レポート🔴 未着手
CL-06KOTO_5/6/10 動線スモークMMD QA5/7 10:00events→detail→checkin、/send 4ステップ完走 + DB書込確認smoke-evidence-template-2026-05.md + 画面スクショ🟡 事前ルートチェック12/12 PASS(認証/DB証跡待ち)
CL-07KOTO_7/8 暫定表示確認MMD QA5/7 10:30/places 全25件で暫定表示確認、/map マーカー整合確認smoke-evidence-template-2026-05.md + 画面確認ログ🟡 証跡テンプレ準備済み
CL-08BASE_6 監視開始セットMMD運用5/7 18:005/8〜5/14 の日次運用表(担当・時刻・確認項目・連絡先)を確定ops-monitoring-5-8-to-5-14.md🟡 担当・時刻確定済(TRAPOL電話番号待ち)

📋 KOTO-WBS(デモシーン番号ベース)

/c/kotohira/demo の KOTO_1〜KOTO_14 を主キーに採用。完了報告は「KOTO_◯ の進捗: xx%」形式で。

運用ルール

  1. タスク・課題・報告は必ず KOTO_X を付ける(例: 「KOTO_10 の P2P送金、本番稼働OK」)
  2. 1タスクが複数 KOTO にまたがる場合は主 KOTO を1つ+副 KOTO を列挙(例: 主 KOTO_4 / 副 KOTO_10)
  3. KOTO 番号外のタスクは「BASE_◯」として扱う
  4. ステータス: 🔴 未着手 / 🟡 進行中 / 🟢 完了 / ⏸ ブロック中 / ➖ スコープ外

KOTO_1〜KOTO_14 一覧

IDシーン実装運用5/7 必須次のアクション
KOTO_1LINE友だち追加〜あいさつ🟢⏸✅BASE_1(Token受領)待ち
KOTO_2リッチメニュー9面🟢🟡✅BASE_1 → --deploy → --attach-default
KOTO_3LINE連携〜町民登録🟢🟢✅A/B(forcommunity A + Kotohira B)方針ドキュメント・サーバ側ガード・専用入口を landing(commit ae6bafe6)。楠木氏相談後にフォーム項目追加判断
KOTO_4マイページ(会員証・残高)🟢🟡✅BASE_2(名寄せドライラン)待ち。年次会員証 NFT コレクション表示を追加(commit 3c992a32)
KOTO_5イベント一覧・詳細🟢🟡✅本番ページ /c/kotohira/events 実装済(commit 52ea1e62)。移行対象イベント10〜20件の再登録は別タスク
KOTO_6イベントチェックイン🟢🟢✅既存 /events/[id]/checkin をイベント詳細経由で利用。動線確認済
KOTO_7加盟店一覧・クーポン利用🟢🟡🔴 部分サムネ 21/25 反映済、不足 4店舗は手配待ち
KOTO_8加盟店マップ🟢🟢✅本番ページ /c/kotohira/map 実装済(commit 7dd4ec5e、5/6)。Place の lat/lng で実座標ピン描画 + カテゴリフィルタ + 詳細シート + Google マップ経路リンク。ランドマーク (金刀比羅宮 / 琴電琴平駅) 表示
KOTO_9町内移動(mobi配車)🟡⏸➖mobi API 仕様確認(楠木氏)
KOTO_10町民どうしでお礼pt送金(P2P)🟢🟢✅本番ページ /c/kotohira/send 実装済(commit 52ea1e62、4ステップフロー)。5/2 告知文で訴求予定
KOTO_11プレミアム購入(Stripe)🟢⏸➖本番購入フロー /c/kotohira/premium/checkout 実装済(commit 52ea1e62)。プラン未登録時は「準備中」表示で安全運転。プラン登録は運用判断(¥25,000/年で 6 月販売開始想定、2026-05-06 に ¥30,000 → ¥25,000 へ仮提案変更)
KOTO_12プレミアム特典一覧🟢⏸➖/c/kotohira/about/premium を SoT に集約、/c/kotohira/premium はリダイレクト導線。加入 CTA + 選挙文言フィーチャーフラグ統合済(commit 52ea1e62)
KOTO_13町長選挙(候補者・投票)🟢⏸➖基盤実装完了(commit 280255e4: Election/Candidate/Vote 3 テーブル + 立候補/投票 API + UI /c/kotohira/election + 状態遷移 cron + 当選バッジ NFT)。shouldShowElectionContent() フラグも UI 統合済(commit 52ea1e62)。運用開始は 町法務確認後
KOTO_14加盟店オーナー管理画面🟢🟡🔴 部分本番加盟店オーナー画面 /c/kotohira/merchant 実装済(commit 52ea1e62、ownerUserId + PlaceManager 両方を見る、自店商品の直近30日注文集計)
KOTO_15スポットワーク(地域版タイミー)🟢 demo⏸➖demo 実装済(commit 79c95bba)。本番化は別フェーズ
KOTO_16お問い合わせフォーム🟢🟡➖実装済(commit df756b3c)。受信先メール確定は三好氏 D-4 で対応
KOTO_17Shopify × Cardano NFT 自動ミント統合🟡 dev 疎通完走⏸➖5/5 P0 実装完了 (commit 53ce02af) + 5/6 dev 疎通テスト完走: 自前 Railway (cardano-shop-api-production.up.railway.app) 立ち上げ / Treasury Preprod 1,000 tADA 入金 / Vercel preview env 4 変数投入 (CARDANO_NFT_API_BASE_URL / _API_KEY / _WEBHOOK_SECRET / _POLICY_NAME=琴平デジタル町民 プレミアム住民証) / /wallet/treasury /nft/policy (policyId fb060d5d...) /wallet/address (決定論性) 全 PASS / HMAC 署名付き擬似 webhook で 404 期待値確認 (HMAC 一致 + payload パース成功 + DB 検索到達)。残運用前提: Shopify dev ストア webhook 二重配信設定 (Dev Dashboard 系なら GraphQL webhookSubscriptionCreate 必須) / dev end-to-end smoke test (テスト購入 → mint queue → 30s worker → webhook → Entitlement auto-create) / prod env 投入 / prod 切替判断 / 法務確認。P1 P2 は未着手。詳細は shopify-cardano-integration.md §3.2
KOTO_18ポイント運用ルール確定(5/5 議事 議題1 由来)🔴⏸➖5/5 議事メモ 議題1 で 4 論点提起、本セッションで追加 5 論点を抽出し合計 9 論点 (Q1〜Q4 + Q1-α〜Q1-ε)。実装は src/lib/ledger.ts:88-103 に B-ii リフレッシュ仕様で稼働中。確定要: ① B-ii リフレッシュ継続 vs 期限撤廃 (Q1〜Q3) / ② リング送金検知の定義・閾値・アクション (Q4 + Q1-α / Q1-β) / ③ 発行→受領 と ユーザー間送金 の同一扱い妥当性 (Q1-γ) / ④ 失効済 lot 保存方針 (Q1-δ) / ⑤ 期限切れ事前通知 UX (Q1-ε)。議事原文は社内限 docs/_kotohira/_gijiroku/0505.md(gitignore 想定)。公開判断材料は /c/kotohira/demo/decisions-pending Q1〜Q4 にも掲載
KOTO_19NFT/Cardano 運用ルール確定(5/5 議事 議題2 由来)🔴⏸➖5/5 議事メモ 議題2 で 4 論点提起 (Q5〜Q8)、本セッションで追加 7 論点を抽出し合計 11 論点 (Q5〜Q8 + Q5-α / Q6-α / Q7-α / Q7-β / Q9 / Q10 / Q11)。確定要: ① 法務確認 Owner/期限 (Q5) / ② Treasury 初期入金額・下限アラート (Q6 + Q6-α) / ③ Railway 障害時ポリシー = 販売継続 vs 停止 + 縮退検知方法 (Q7 + Q7-α / Q7-β) / ④ Preprod→Mainnet テスト件数 (Q8) / ⑤ A 案 ADR 正式化 Owner (Q5-α) / ⑥ ウォレット紛失救済手順 (Q9) / ⑦ 二次流通 (transfer) ポリシー (Q10) / ⑧ Mock chain 既発行 NFT の Cardano 再発行可否 (Q11)。議事原文は社内限 docs/_kotohira/_gijiroku/0505.md(gitignore 想定)+ 仕様 SoT は shopify-cardano-integration.md

🛠 BASE-WBS(基盤タスク)

KOTO 番号に直接紐づかない、全シーン共通の前提タスク。

IDタスク関係 KOTO状態期限 / 次のアクション
BASE_1TRAPOL社 Channel Access Token 受領全KOTO🔴4/22期限済。志鳥氏にリマインダー(trapol-migration-request.md)
BASE_2ユーザー名寄せドライランKOTO_3 / 4⏸ BASE_1待ちToken受領後に LINE Messaging API で friend ID 1,818名取得 → 既存1,462名と名寄せ
BASE_3内部配信テスト(管理者宛)KOTO_1 / 2⏸ BASE_1待ち4/25期限。Token受領後すぐ実施
BASE_4Webhook URL切替(5/7実施)全KOTO🔴5/7実施。TRAPOL社との最終調整
BASE_5ユーザー向け LINE 告知(2本)KOTO_2 / 4 / 10 / 7🟡5/2(宣伝)/ 5/6(実務)。三好氏返答で {{メンテ時間}} {{窓口}} 充足
BASE_6安定稼働モニタリング全KOTO⏸ BASE_4後5/8〜5/14。Webhookエラー・配信失敗・残高齟齬を監視
BASE_7rewards 本番DB投入KOTO_4⏸ 運行再開待ち4商品全て期限切れ判明(4/24)。夏の運行再開日確認後に再シード

✅ リッチメニュー&会員系チェックリスト(9項目)

No項目担当状況コミット / Evidence
19面の管理名が決まっているか開発🟢 完了scripts/create-kotohira-rich-menus.ts GUEST_FACES / CITIZEN_FACES / PREMIUM_FACES
2各ボタンの遷移先URL/ハブページ制作/開発🟢 完了URLS定数(CHANNEL/MOBILITY/ABOUT_*)+ ハブページ5本実装済
3guest/citizen/premium の切替条件開発🟢 完了src/lib/roles/tier.ts にサブスク経路 + 手動Entitlement OR評価(commit 1382fdeb)
4LINE連携後に同タブ町民メニューへ切替開発🟢 完了richmenuswitch + manageName=${state}_${tab} で tab 維持
5町民チャンネルのハブページ制作🟢 完了src/app/c/kotohira/channel/page.tsx(YouTube/IG/公式)
6働く・滞在ハブに Nomad/JOB 枠制作🟡 部分demo は実装、Nomad Kotohira / KOTOHIRA JOB の2区分は 運営判断待ち(B-1/B-2/B-3)
7クリックログ event_type/button_id開発🟢 完了src/lib/analytics/rich-menu-click.ts 実装(commit 1382fdeb)+ LINE webhook の postback 受信統合完了(commit 52ea1e62、handlePostbackEvent 追加)
8プレミアム会員のNFT保有確認方法開発/運営🟢 Mock 稼働年度ごとに自動発行(commit 3c992a32)。Stripe サブスク ACTIVE/TRIALING 同期時に nftType=membership chain=mock で発行。マイページの会員証セクションが NftMintRecord 由来でコレクション表示。Cardano 連携は別途(見積スコープ外明記)
9町長選挙期間中の文言差し替えルール運営🟢 完了src/lib/feature-flags/election.ts 実装(commit 1382fdeb)。UI 差し替えは別タスク

🚧 残タスク・運営確認待ち

運営判断待ち

  • B-1/B-2/B-3: 「働く・滞在」ハブの Nomad Kotohira / KOTOHIRA JOB 区分仕様
  • KOTO_3: フォーム項目最終確定(楠木氏相談後)
  • KOTO_7: 加盟店18店舗の住所(座標未取得)
  • KOTO_9: mobi API 仕様(楠木氏経由で確認)
  • KOTO_11/12: プレミアム制度の収益設計
  • BASE_5: 5/2 配信文面の {{メンテ時間}} {{窓口}} 充足
  • 旧アプリ PHONE 認証残高の引き継ぎ(手渡し 18 名): 旧アプリで電話番号認証だったポイント保有者のうち、did-event 未登録(受け皿なし)の 18 名は機械突合できないため、公式 LINE 等で本人確認 → 新アプリ登録案内 → 登録後に Treasury から付与する運用待ち。連絡リストは社内のみ(個人情報のため git 管理外)。

統合実装待ち(ヘルパは完成済み)

  • ✅ 加盟店オーナー LINE 通知: notifyPlaceOwnersForOrder 追加 + /api/store/checkout から after() 呼び出し(commit 52ea1e62)
  • ✅ リッチメニュークリックログ: LINE webhook の handlePostbackEvent で recordRichMenuClick を呼ぶ統合完了(commit 52ea1e62)
  • ✅ 選挙文言フィーチャーフラグ: getElectionCopy() を mypage / about/premium / election ページに統合(commit 52ea1e62)。about/premium は force-dynamic 指定で SSR キャッシュ問題を回避

🔗 関連ドキュメント


📜 更新ログ(直近)

日付内容commit
2026-09-17住民向け画面の「読めない・押せない」を一括改善(アクセシビリティ / 可読性 / UI全般)。①文字サイズ: 琴平の UI ガイドラインは本文16px以上を定めるが、本文級の小さい文字(12px)が310箇所あり高齢の住民に読みづらい状態だった。271箇所を14pxへ引き上げ。とくに送金画面は残高・金額・エラー文言を含む12箇所すべてを対象(金額が読めないのは致命的なため最優先)。残した27箇所は「SHOPS & COUPONS」等の英字小見出しラベルで、装飾として意図的に小さいまま。②キーボード操作: 操作中に「今どこを選んでいるか」が見えない箇所を修正。とくに管理画面の入力欄4箇所は、現在のデザイン基盤に存在しない古い指定を使っていたためフォーカス位置が一切表示されていなかった(監査で見落としていた不具合)。③スマホで切れる表: 管理画面ほか10箇所の一覧表が、スマホ幅で右端が切れて読めず横スクロールもできない状態だったのを修正。④入力ダイアログ: イベントの定例化設定で残っていたブラウザ標準の入力窓を、他画面と同じ自前ダイアログに統一(キャンセルと空入力を区別、テスト7件で固定)。⑤あわせて未ログイン時の導線欠陥7件(「はじめる」が読込のまま止まる等)、読み込み/404画面の新設、確認ダイアログ80箇所の統一も同ブランチに含む。検証: test:unit 3049 PASS / lint 0 error / 型エラー増加 0。branch fix/uiux-critical-2026-09 に push 済み・main 未マージ(本番未反映)。3dd68019
2026-07-29LINE設定画面を刷新(保存情報の暗号化・接続状態の見える化)。管理画面の LINE 連携設定を、Channel Secret / Access Token を暗号化保存し保存後は再表示しない安全な方式に統一。「Messaging / Webhook / テスト送信」の接続状態を個別確認できる接続状況カードを追加。管理ホームにも次回イベント・LINE接続状態カードを追加。既存の琴平 LINE 配信・受信は従来どおり動作(設定値の変更なし・移行作業不要)。PR#133。d671ed4a
2026-07-04「琴平モデル」説明資料を追加(対外説明用ドキュメント)。A4縦・4ページ・2列レイアウトで、しくみ全体図(LINE→町民証→ためる→つかう→加盟店循環)+主要12機能をスマホ実画面スクショつきで解説。マイページ・加盟店管理画面など要ログイン画面は公開デモページ(町民状態)で撮影し個人情報を含まない。docs/_kotohira/kotohira-model-guide.html(印刷可)と同 .pdf(4ページ)。(docs)
2026-06-27「送金しようとすると『LINE連携未完のため送信できません』で送れない」を根治+影響範囲を定量化(顧客バグ報告対応 / KOTO_10 P2P送金)。アカウント統合済みの住民にポイントを送ろうとすると送れない、との報告。原因=送金API が送り手・受け手とも forcommunity LINE(汎用チャネル lineForcommunityUserId)連携を必須にしていたが、琴平住民は 琴平公式LINE(lineKotohiraUserId) でログインし汎用チャネル連携を持たないため弾かれていた。琴平の送金完了通知は公式LINE(sendKotohiraLineFlexNotification)で届くため汎用連携を必須にする技術的理由は無く、会員ランク(citizen)判定 getMemberTier も既に「琴平は A or B どちらかのLINE連携で可」だったのに 送金ガードだけが汎用必須でロジックが食い違っていた設計バグ。修正=LINE連携判定を純関数 userHasUsableLineLink(user, isKotohira)(琴平=A or B / 非琴平=A 必須)に集約し、transfer/route.ts と tier.ts の両方で再利用(DRY・ドリフト防止)。本番計測(read-only scripts/audit-kotohira-line-gate-victims.ts)で琴平メンバー2065名中1958名(約95%)が影響対象=個人ではなく住民ほぼ全員。うち残高>0=33名 / オンボーディング完了済=35名が実害可能性=高。変更領域 test:unit 82 PASS / lint 0 / build(webpack) OK / 本番実データで「旧=受取不可→新=受取可」を実証。strict-reviewer/verifier とも PASS。PR#79 main マージ(squash)・本番デプロイ Ready・送金API疎通(未認証401=正常停止)確認。対象住民は追加操作なしで送受金可能に。報告者・対象住民の実名は社内のみ(playbook §10)。125dd68b
2026-06-18納品アイコンが「全体的に小さく見える」問題を一括解消+アイコン1種の意味ズレ修正(表示改善 / 全画面UI、高木氏スマホ・タブレット・PC 確認フィードバック由来)。①小さく見える問題: 原因は納品 SVG の viewBox に対し絵柄が約66%しか占めず、片側約17%(全体約34%)の余白が SVG 内に組み込まれていたこと(実測で 7 アイコンサンプル全て占有率 66〜68%、 asset 系の sheet32 のみ 79%)。対応は「設定で大きくする」方を採用=アイコン描画コンポーネント KotohiraIcon に視覚拡大定数 VISUAL_SCALE=1.3 を入れ、レイアウト上の占有サイズ(width/height)は維持したまま transform: scale で見た目だけ拡大。1ファイルの定数変更で全参照(約110箇所)に一括反映、画質劣化なし。デザイナー再納品(全39枚の余白切り直し)より低コストかつ即時。SNS ロゴ等の完成タイル型(青角丸タイルで余白ゼロ=占有率ほぼ100%)は拡大するとタイルからはみ出して角が欠けるため、bleed prop で scale を opt-out(channel の 4 ロゴ+加盟店 Instagram リンク 2 箇所)。完成タイル型は SNS_ICONS 系のみで、LINE/NFT 等(占有率66〜76%)は通常アイコン扱いで拡大対象=漏れなしを全 KotohiraIcon 呼び出し走査で確認。②アイコンの意味ズレ修正: アイコンマッピング資料の「要確認」リストにあった No.61 communityFallback(sheet 32) について、デザイナーは**「遊休資産(眠った資産が芽吹いて価値を生む)」の意味で『芽+¥』として起こしたものだったとの高木氏指摘。これを「コミュニティアバター未設定時のフォールバック(コミュニティの汎用シンボルが欲しい場所)」に流用していたのは意味がずれるため、アバターは NAV_ICONS.globe(地球儀=場所/コミュニティの中立シンボル)に変更。『芽+¥』(sheet 32) は本来意図に近い「ポイント/資産の循環」用途**として ASSET_ICONS.pointCirculation に再定義し、会員証カードの「ポイントでいろいろやりとり(貯める・使う・贈る・交換、町の中でポイントが循環)」行が参照(この用途は意味的に合致するため流用継続)。紛らわしい communityFallback キーは撤去。test:unit 2310 PASS(アイコン画像実在テスト icons.test.ts 含む)/ lint 0 error / build OK。places のアイコン拡大効果・channel の SNS ロゴが拡大除外でタイル内に収まることを実画面スクショで確認。⚠️ branch kotohira/channel-sns-icons に push 済み・main 未マージ(本番未反映)。323cbc8a
2026-06-18町民チャンネルページ(/c/kotohira/channel)の SNS アイコンを納品ロゴに統一(表示改善 / KOTO 系UI)。「フォローする(FOLLOW US)」一覧で YouTube だけが正式の SNS ロゴで表示され、**Instagram / X / オープンチャットは仮の文字記号(◉ / X / L)**のまま残っていたのを、4つとも納品済みの SNS ロゴ(SNS_ICONS の青タイル+白ロゴ SVG)に差し替え。納品ロゴ自体が「青い角丸タイル+白ロゴ」で完成しているのに、その背後へ仮で SNS 別の色違い背景タイル(赤/ピンク/黒/緑)を敷いていたため、青タイルが上に重なって 4 つとも同じ青に潰れて見える状態だった。背景タイルを整理して納品ロゴをそのまま見せる形にし、各ロゴ(再生マーク / カメラ / X / L)が正しく見分けられるよう修正。変更は表示のみ(ロジック・DB・認証に影響なし)。test:unit 2310 PASS / lint 0 error / build OK、実画面スクリーンショットで 4 ロゴの表示・重なり解消を確認。⚠️ branch kotohira/channel-sns-icons に push 済み・main 未マージ(本番未反映)。406adfb1
2026-06-12main へマージし本番反映。下記アイコン全面刷新と、6月実施の防御セキュリティ強化一式(認可・なりすまし・XSS・SSRF・ポイント二重支払い対策ほか)を本番へデプロイ。リリース判定の受け入れテスト UAT(kotohira) 5/5 PASS・本番スモーク 6/6 OK(トップ/イベント/お店/特典/アイコン配信すべて 200)。f4b0f901
2026-06-12サイト全体の画面アイコンをデザイナー納品の正式アイコン(青×黄)へ全面刷新(デザインシステム)。これまで絵文字で仮表示していたアイコン — ホーム「琴平のお店」カテゴリ、お店一覧/詳細の住所・営業時間・電話・タグ・リンク類、マップのカテゴリピン・ランドマーク、マイページ(4タブ・スキャン/QRシェア・会員証NFT・LINE連携案内)、取引履歴の種別アイコン、イベント一覧、はじめての方へ/貯め方/使い道/移行ガイド、クエスト、ヘッダーメニュー等(demo を除く34ファイル・約110箇所) — を、デザインシステムから起こされた納品アイコン39種+SNSブランドロゴに置き換え。アイコン定義は1ファイル(icons.ts)に集中管理され全画面が同一定義を参照するため、今後の差し替え・追加は1行の変更で全画面に反映される。参照画像の実在・「PNGは未納品の13(contact)のみ」を自動テストで担保(欠品・タイポを検知)。表示はSVGで高精細・軽量、未納品の「お問い合わせ」アイコンのみPNG代用(SVG追納後は1箇所の修正で切替)。シートに無い概念(添付ファイル種別・料金・駅など)は絵文字を意図的に維持し、次回デザイナー発注候補として番号付き対応表(社内 docs/_internal/icon-mapping-review.html No.1〜96)に整理。test:unit 2303 PASS / lint 0 error / build OK / e2e 169 PASS(失敗2件は本変更と無関係の既存問題であることを変更前コードとの比較実行で実証)。f7c15985
2026-06-08町民登録の生年月日を「1桁(ゼロ埋めなし)」で入力しても登録できるように修正(顧客バグ報告対応 / KOTO_3 LINE連携〜町民登録)。コトリで会った学生が iPhone で町民登録を完了できず、ポイントを渡せないとの報告。原因=生年月日の入力欄が月・日を 「06」のように2桁ちょうど入力しないと認識しない仕様で、「6」のように1桁で入れると未入力扱いになり登録が完了できなかった(「06」「0601」とゼロ埋めすれば回避可能だった)。修正後は 「6月」「1日」のように1桁で入力しても、また入力欄から離れる/送信ボタンを押した時点で正しく確定し登録できる。あわせて「1と打って12月にしたい人」が誤って1月で確定されないリグレッション防止、iPhone で送信ボタンを直接押しても取りこぼさない送信時確定処理も実装。受け入れテスト(UAT)に本ケースを AC-7(P0) として追加し、自動テストで担保(生年月日まわり 36 件+送信フロー結合テスト新規)。test:unit 2264 PASS / lint 0 error / build OK / e2e UAT(kotohira) 5/5 PASS。⚠️ iPhone 実機での最終確認は別途必要。当面は「06」「0601」とゼロ埋めすれば登録可能。e89651f0
2026-06-06同意(consent)をログイン直後の強制ゲートから「イベント参加・価値操作時」へ移動(UX改善・顧客要望)。旧 KotohiraOnboardingGate はログイン済み未同意の住民が kotohira 配下の任意ページを開いた瞬間に同意画面へ強制送還し、同意4件+アンケートを今すぐ全部要求していた(「ただ町のページを見たいだけ」なのに LINE ログイン直後に同意を強制される体験)。これを閲覧自由化(Gate の consent 強制 redirect を撤去、line-link 誘導は維持)し、同意は実際に価値ある操作をする時に取る方式へ。共通判定 isKotohiraOnboardingComplete(status route と同基準・ドリフト防止)+サーバ側 403 kotohira-consent-required ガードを イベント参加(events/join)・ギフト発行(gift/issue)・ポイント送金(points/transfer)・クエスト応募(quests/apply) に追加。全ガードは kotohira community 限定スコープで他コミュニティに一切波及しない。未同意なら同意画面へ誘導し、同意後 returnTo で元の操作画面に戻る。open-redirect は pathname のみ使用で防止維持(実証済み)。変更領域 64 tests pass / tsc 0 / lint 0 / build 完走(178ページ) / 本番デプロイ Ready・スモーク 200。fd200d34
2026-06-06オンボーディング登録「consent-commit-failed」(500) の真因 P6005 を確定・根治(本番障害)。本番の構造化ログ(先行PRで仕込み)で真因確定: prismaCode:'P6005'「Interactive transactions running through Accelerate are limited to a max timeout of 15000ms」。緩和策として入れた timeout:20_000 が Accelerate 対話型トランザクションの上限 15000ms を超過 → Prisma が無効パラメータ P6005 で即拒否 → message に "timeout" を含むため自動リトライが誤発火 → 3回失敗で 500。つまり「真因確定用ログ」と「それを壊す緩和策の timeout 値」を同じ PR(#28) で入れており、902ebece 以降オンボーディング完了が構造的に全滅していた(当初「現地1名・モバイル」は誤認、実態は全ユーザー・全環境)。根治: ①timeout を上限未満の 14_000 に下げる ②Phase-1 tx を ~9→~4 往復に短縮(consent×3→createMany / member upsert に onboardingCompletedAt 統合 / form・DID・survey 検証を tx 外へ)し一過性失敗の窓を構造的に縮小 ③P6005 を非リトライ化。本番 Accelerate に対し「20000→P6005 / 14000→OK」を実証。db-retry 13 tests / build 完走 / 本番デプロイ Ready・スモーク 200。教訓: Accelerate 対話型 tx の timeout 上限は 15000ms。超える値は P6005 で即死。9378a832
2026-06-05ポイント台帳の残高修復を本番適用+履歴に内訳表示(KOTO_10 P2P送金 / KOTO_4 残高)。6/4 の調査では「送金台帳にバグ無し」と結論づけたが、全住民(75名)を「受け取った額の合計 − 送った額の合計 = 本来の残高」という独立した正しい式で再監査した結果、一部の住民で過去の送金・ギフトが残高に正しく反映されておらず、残高が本来よりズレていたことが判明(原因=ポイント有効期限つき lot 会計を後付けした移行期の送金未減算、過去の修復処理の副作用、残高不足のまま成立した送金など)。各住民の正しい残高を算出し、本番残高を一括補正。全住民で「正規の台帳=住民が履歴を足し算した額」が一致することを確認済み。住民には履歴の調整明細をタップすると「あなたのこの送金/ギフトがどうなったか(例: 相手が受け取ったため引く/誰も受け取らなかったため戻す/送った分が引かれていなかったため引く)」が1件ずつ見える形で透明化。再発防止として台帳の lot 行を破壊的に書き換える経路を検出する CI gate も追加。会計ロジックは純関数+ユニットテスト(11件)で凍結。test:unit 2150 PASS / lint 0 / build OK。補正額・対象住民の明細は社内のみ(個人情報のため公開 WBS には記載せず、playbook §10 参照)。⚠️ branch push 済み・main 未 merge だが本番DBの残高補正は適用済み。commit 1d94e78f ほか3本。1d94e78f
2026-06-04オンボーディング登録の「consent-commit-failed」(500) 耐障害性向上+真因確定用ログ追加(顧客バグ報告対応 / オンボーディング同意登録)。現地で住民1名が同意画面の「同意して登録する」を押すと consent-commit-failed が出て、閉じて何度試しても解消しないとの報告(写真)。/api/c/kotohira/onboarding/complete の Phase 1 トランザクション(同意3件+コミュニティ加入+初回アンケート保存+DID発行申請を1トランザクションで実行、Prisma Accelerate HTTP経由)が失敗し 500 を返す経路。真因は未確定: 失敗時 tx は全ロールバックされ DB に痕跡が残らず、本番ログ保持も約1時間と短く、当時の実エラーコードを復元できなかった。本番DB読み取り+網羅監査で 制約違反/FK/競合/直列化/設定系は本番データと整合せず除外(他住民は同時刻に正常完了・本番replay成功)。症状(1名のみ・再試行で再発・他は成功)と整合するのは 全ロールバック系(tx タイムアウト P2028 / 接続系 P1001・P1002・P1017 / 生のネットワーク reset・"fetch failed")に絞られた(DB状態が同一で互いに区別不能)。対策(原因特定を待たず全候補に有効): ①これらを自動リトライ(ロールバック済みのため同意の二重記録なし=安全)②トランザクションの timeout を緩和③失敗時に Prisma error code を構造化ログ化(次回発生時に真因を確定)。なお旧コメントの「弱回線→tx 5s超過」という因果は誤りのため訂正(tx はサーバ側実行で、5sタイマーが計るのは Vercel↔Accelerate↔Postgres 間遅延〔実測平均~80ms〕でありモバイル回線ではない)。test:unit 2139 PASS / lint 0 error / build OK。e2e は chunk-hash 不整合(ハーネスの実行中 .next 再ビルド)由来の環境フレークで赤だが本変更領域(onboarding/consent)の失敗はゼロ。本番DBへの書き込みなし(調査は SELECT のみ/コードは読み出しリトライとログ追加のみ)。⚠️ branch fix/kotohira-onboarding-consent-commit-resilience に push 済み。main へ merge するまで本番未反映(=次回発生時の確定ログもまだ出ない)。e0b836c8
2026-06-04回答済み住民にオンボーディング・アンケートが毎ログイン再表示される問題を修正(顧客バグ報告対応)。「琴平の住民で、アンケート回答が終わっているのに、毎回ログインのたびにアンケートが出る」との報告。根因=オンボーディング完了の判定が 2カラム(CommunityFormResponse 行 / CommunityMember.onboardingCompletedAt)に分かれて保存されるが、表示トリガ(KotohiraOnboardingGate)が叩く status route だけが共通判定関数 isKotohiraOnboardingFormSatisfied を使わず、CommunityFormResponse 行のみを直接見て onboardingCompletedAt を無視していたこと。そのため「onboardingCompletedAt はあるが response 行が無い」住民(旧 complete 実装で回答した人など)が status だけ「未回答」と誤判定され、Gate が毎回 consent/アンケートへ redirect していた(マイページ等の他画面は共通関数経由で正しく「完了」判定するため、住民から見ると「他は普通に見えるのに毎回アンケートに戻される」挙動)。修正=完了判定を全経路で共通関数に一本化(①status/route.ts ②onboarding/consent/page.tsx の inline コピー ③complete の冪等ガード)。DB 変更不要。副作用なし(真の未回答者=両カラム無しは従来どおりアンケート表示維持、phase ガードも据え置き、kotohira 専用で他コミュニティ無影響)。test:unit 2133 PASS / lint 0 error / build OK(180ページ生成)。本番DBへの書き込みなし(読み出し判定ロジックの統一のみ)。89aad7e1
2026-06-04「送ったのにポイントが減らない」報告の調査+表示UXバグ修正(顧客バグ報告対応 / KOTO_10 P2P 送金)。送金しても送り手の残高が減らないとの報告を本番DB読み取り+実Postgres統合テストで調査。送金の実残高(取引台帳 PointTransaction の合計)は送金額ぶん正しく減算されており、台帳ロジックにバグは無いことを実証(統合テスト3件 PASS。EARN レガシー lot からの送金・受領 lot 連鎖・送金直後の集計残高がいずれも正しく減ることを確認)。真因は 表示レイヤ: 送金画面(/c/kotohira/send)のヘッダー残高がページ読込時の値で固定されており、送金後の router.refresh()(サーバー再描画)が反映されるまでの間「古い残高」が見え続け、減っていないと誤読されていた。修正: ①SendClient の残高を state 化し送金成功時に API が返す新残高で即時更新(無ければ送金額ぶん楽観的に減算)、送金完了画面にも残高を表示。②/api/points/transfer の成功/冪等レスポンスに送り手の集計残高 senderBalance を追加(台帳への書き込みは無し、合計の読み取りのみ)。③台帳ページ(/c/kotohira/ledger)で実額を復元できない古い消費 marker を「+0」ではなく「—」表示に(「+0」は減っていないと誤読されるため)。④履歴詳細のペア取引検索を idempotencyKey 優先+時刻窓 60秒→5分に拡大+本文完全一致条件を撤去し空振りを低減。test:unit 2133 PASS / 新規 integration 3 PASS / lint 0 error / build OK。本番DBへの書き込みは一切なし(調査は SELECT/集計のみ)。45be2af6
2026-05-31イベント説明文の見出し/リストが反映されない根因を修正(顧客バグ報告対応)。琴平主催イベント詳細 /events/[id] の説明文で、Tiptap で入力した H1/H2 見出し・リストが本文と同じ見た目になり反映されない(太字は効く)との報告。根因は Tailwind CSS 4 で @tailwindcss/typography プラグインが未導入だったこと。prose クラスがアプリ全体で no-op になっており、Preflight が h1/h2/ul/ol を inherit にリセットしたまま復元されず見出し・リストが本文と同化していた(太字だけ効くのは <strong> の font-weight が UA 既定で残るため)。@tailwindcss/typography@0.5.19 を導入し globals.css に @plugin を追加。プラグイン有効化に伴う prose 既定幅(65ch)の副作用対策として 2 箇所に max-w-none を追加。ビルド後 CSS に見出しスタイル生成を確認。test:unit 2120 PASS / lint 0 error / build OK。自分の修正のみ限定 commit/push(作業ツリーの他者未コミット変更には触れず)。352f7cbd
2026-05-29コトリ運営依頼: 問い合わせ受信先メール切替 + LINE 自動返信の実装。①Community.contactEmail(kotohira-digital-townspeople)を n.miyoshi@kotobus.com → support@kotohira.love に本番DB更新。/c/kotohira/contact ページの「kotobus に設定」注記も support@kotohira.love に修正。②ユーザーからのトーク受信時に 自動返信専用 の固定文(『こちらのアカウントは自動返信専用です。お問い合わせは support@kotohira.love までメールにてご連絡ください。』)を返す処理を src/app/api/webhooks/line/community/route.ts に実装(handleKotohiraMessageEvent、isKotohiraLineCommunity 判定で琴平チャネルのみ replyMessage、message 全種別を対象)。route.test.ts 3 件追加・PASS、lint clean、全 unit 2087 PASS。⚠️ 実反映の前提: LINE 応答モードが「応答メッセージ」だと replyToken が先に消費され webhook の replyMessage が失敗するため、応答モードを 「チャット(webhook)」 に設定する運営側確認が必須。—
2026-05-29ポイント台帳の冪等性バグ修正(二重実行防止の本番復旧)。src/lib/ledger.ts の createPointTransaction / consumePointsFifo / consumePointsFifoV2 の冪等性チェックが const lookup = pt.findFirst ?? pt.findUnique; lookup(...) とメソッドを receiver から剥がして呼んでいたため、@prisma/extension-accelerate の delegate が内部参照する this.$parent が undefined になり throw、catch で握りつぶされて idempotencyKey による二重実行防止が本番で常時無効化されていた。本番DBで receiver 付き呼び出し(pt.findFirst(...))なら成功することを実証し、3箇所を receiver 付きに修正+戻り値型を具体化。呼び出し側4箇所(points/redeem・points/transfer・coupon×2・treasury script)も tx を分解せずそのまま渡すよう統一。test:unit 2056 PASS / lint 0 error / build OK。459afc0b
2026-05-29旧アプリ(forcommunity)PHONE認証残高の引き継ぎ漏れ調査・一部対応。「ポイントが0で引き継がれていない」報告を調査。原因=(a) 4/16 に LINE 名簿 2,005 名をポイント情報なしで一括 import、(b) 移行対象は旧アプリ正規会員 97 名(LINE 60 / PHONE 37)のみで、突合キー(LINE UID)を持たない PHONE 認証会員と名簿外の人が取りこぼされた。突合ロジック自体は LINE 60 名で 100% 成功(バグなし)。PHONE 認証で残高>0 の 26 名を精査し、8 名は既に移行済み("forcommunity より" 表記の早期移行 tx を持つ)、本日 3 名(イナマリアノ 11,100 / 佐藤潤 1,500 / 齊藤弘起 200、計 12,800pt)を Treasury から再配分付与。残り 18 名(計 183,000pt)は did-event 未登録で受け皿なし→手渡し対象として連絡リスト化。流通総量は不変(既発行分の再配分)。—
2026-05-26mobility ページのレンタル提供元をコトリ琴平に差し替え。/c/kotohira/mobility のレンタサイクル・レンタカー欄を KOTOHIRA TRAVEL (kotohira-travel.com) から コトリ コワーキング&ホステル琴平 (kotori-japan.com/kotohira/activity.html) に変更。料金表記も実情報を反映(e-bike 1日6,000円 / クロスバイク 1日3,000円 / 軽自動車 3時間3,300円〜・宿泊者50%OFF)。デモ側 /c/kotohira/demo/mobility も同期し、タップで window.open(..., "_blank", "noopener,noreferrer") で外部遷移。rich-menu の「体験予約」(KOTOHIRA TRAVEL) は別サービス(琴平バス系の体験予約)のため据え置き。test:unit 1999 PASS / lint warnings only / build OK。69e358ab
2026-05-18琴平主催クエスト詳細ページのテーマ統一 + Shunsuke 負残高補正。① /quests/[id] で community.id === "kotohira-digital-townspeople" のとき、/events/[id] と同じ KotohiraEventHeaderWrapper + kotohira-home bg-kotohira-cream を適用、/c/kotohira 配下ではヘッダー二重描画を回避(breadcrumb も非表示)。strict-reviewer + strict-verifier PASS、test:unit 1937 / lint clean / build OK。② Shunsuke Takagi (user-1764752355624) の kotohira cm.points が過剰消費で -40pt になっていたため scripts/reset-shunsuke-kotohira-balance.ts 追加。+40 EARN audit tx (lotStatus=null / expiresAt=null) で SoT (PointTransaction sum) を 0 に整え、cm.points=0 + User.points global キャッシュも同 transaction で +40 increment(points-cache-sync の cron 再実行でも安定)。dry-run / --apply 2 段階、TARGET_USER_ID ハードコード固定で誤対象 abort ガード付き。実行結果: cm.points -40→0、User.points 9456→9496、tx sum (kotohira) -40→0。150a9a2b / 8423110c
2026-05-17琴平お手伝い・クエスト UX 改善。①一覧カードに 報酬ポイントバッジ (#fff200/#0075c2) と 締切バッジ (M/D + 「あとN日」「本日締切」表記) を追加(Quest 型に rewardPoints / deadline を追加し、既に API が返している値を表示)。②詳細ページ /quests/[id] の応募系ボタン(応募する / チャットルームへ / ログインして応募 / 編集 / 編集保存)を bg-blue-600 全廃、bg-[#0075c2] hover:bg-[#005fa3] に統一して琴平カラーで連続性確保。③ステータスバッジを open / in_progress / closed の 3 値判定に拡張、進行中ラベル追加。④in_progress のとき新規応募ボタンを抑止し「進行中のため新規応募を受け付けていません」を表示、既応募者へのチャット導線(applicationId へのリンク)のみ維持。⑤応募成功後に GET /api/quests/[id] を再フェッチして applicationStatus / applicationId を最新化、リフェッチ失敗時も applicationStatus: "PENDING" を仮埋めして二重応募を防止(refreshed フラグ)。⑥投稿成功時のリダイレクトを communityId === KOTOHIRA_COMMUNITY_ID ? '/c/kotohira/quests' : '/quests' で分岐し琴平から投稿した町民が琴平一覧に戻れるように修正。⑦IN_PROGRESS_CLOSED_MESSAGE を定数化して重複文字列を排除。strict-reviewer サイクル 3 回(in_progress 時の応募ガード欠落 / リフェッチ失敗時 stale UI / 定数化漏れ)と strict-verifier 2 回(bg-blue-600 残存検出)を全消化。test:unit 1937 PASS / lint warnings only / build OK。E2E は本変更が静的 UI / 分岐のみのためスキップ。9d5f68a2
2026-05-10forcommunity 救済 LINE 文面・救済ページの表記調整。ポイント案内を「事務局でインポート済み」から 「旧サービスでのポイントをお持ちの方」 に変更(正式・短縮・push-kotohira-forcommunity-rescue-line.ts 既定・/c/kotohira/onboarding/forcommunity-rescue)。test:unit / lint 後 push、build OK。b1782257
2026-05-10琴平外部 CSV インポートのユーザー解決を B 主キー化。scripts/import_external_community.ts が琴平かつ CSV に B(lineKotohiraUserId 列優先、無ければ lineUserId)がある場合、メール先行をせず Account(provider=line-kotohira-prod) → User.lineKotohiraUserId で既存 User に紐づけ、無ければ新規作成。処理後に Account を upsert して OAuth 突合と整合。解決ロジックは src/lib/kotohira/resolve-user-for-kotohira-import.ts + Vitest。docs/_kotohira/forcommunity-line-rescue-ops.md・audit-kotohira-users-recent-updates(PRINT_RESCUE_IDS)・救済案内ページ・push-kotohira-forcommunity-rescue-line.ts を同梱。test:unit / lint / build / test:e2e(165 pass・11 skip・1 flaky)後 main push 済み。2dea3559
2026-05-09Kotohira LINE A/B 連携の文書化・実装同期・監査資産。決定書 line-a-b-linkage-resolution.md / 実装チェックリスト / 監査方針 / 6ケース検証メモ / クリーンアップ runbook、社内 _internal/ab-parent-audit-2026-05-09.md(監査スクリプト実行記録)。コード: link-intent、Kotohira 専用 GET /api/c/kotohira/auth/line/start、auth.ts の Kotohira callback 時 A リンク成立条件、line-kotohira-prod callback テスト、動的 test-user の tutorialStatus=PENDING(オンボーディング E2E)、リッチメニュー JSON/生成スクリプトの guest CTA を B サインイン URL へ、監査用 scripts/audit-kotohira-*.ts 等。npm run build 成功後 main へ push 済み。E2E 全件グリーンは未達(別途継続)。ae6bafe6
2026-05-08LEGAL/表記の整備。特商法表記は「有償販売未解放」の段階として導線(フッター/関連リンク/オンボーディング等)から一時非表示化。外部送信ページの送信先表記を forcommunity 株式会社(demo: 仮表記) → 100万人DAO合同会社に修正。利用規約/プライバシー/特商法等の本文中の会社名を 100万人DAO合同会社に統一し、お問い合わせ窓口メールを dev@mmdao.org に統一。—
2026-05-07ポイント整合性の根本修正 — レガシー lot 消費可能化 + マージ後 CommunityMember.points 即時再計算 + 本番 drift 67 件一括解消。3 つの直交する課題を一括対応: ① B修正: src/lib/ledger.ts の consumePointsFifo() が lotStatus="ACTIVE" のみを「使える残高」として集計していたため、期限ポリシー導入前の lotStatus=null の正 amount tx(レガシー lot、移行 EARN を含む)が表示残高には含まれるのに送金時は不足扱いされていた。OR: [{ lotStatus: "ACTIVE" }, { lotStatus: null }] で消費対象に含め、expiresAt asc, createdAt asc で並べてレガシー lot は末尾消費(B-ii リフレッシュの優先順序を維持)。② マージ後整合: src/lib/services/user-merge.ts の mergeAccounts() で PointTransaction を survivor に付け替えた直後に groupBy(communityId) → CommunityMember.points を community ごとに updateMany で再計算。マージ直後のマイページ表示が即時整合(週次 cron 待ちでズレない)。③ 本番 drift 一括解消: syncAllPointsCache() を本番DBで実行し、CommunityMember.points 67 件 / User.points 67 件の drift(合計 1,229,397pt + 1,252,606pt の乖離)を解消。冪等な updateMany where points: { not: correctBalance } で差分のあるレコードのみ書き込み、0 errors。ledger.test.ts +1 / user-merge.test.ts +1 で回帰カバー。test:unit 1775 PASS / lint clean / build OK3e5f2b7c
2026-05-07公開ページに表示すべきでない情報を削除。/c/kotohira/demo/wbs は誰でも閲覧可能なため、内部情報を非表示化。docs/_kotohira/wbs.md から該当セクションとダッシュボード行を削除、src/app/c/kotohira/demo/wbs/page.tsx バナー / <metadata.description> から関連表記を削除。npm run build PASSfaaf0bb8
2026-05-07/c/kotohira/contact のお名前/メアドのデフォルト入力を撤去。ログイン中ユーザーの displayName / email を getServerSession + prisma.user.findUnique で取得して ContactForm の initialName / initialEmail props に渡してプリフィルしていたため、フォームを開くと「自分の名前とメアドが既に入っている」状態だった。スクショ指摘 [Image #21] を受けて、page.tsx の session lookup + user.findUnique を完全削除、ContactForm の Props 型から initialName / initialEmail を削除、useState 初期値を "" に。合わせて placeholder にハードコードされていた実在の人名「髙木 俊輔」(自分自身)を一般例「山田 太郎」に変更(プライバシー / 保守性)。strict-reviewer 1ラウンドで「placeholder にも実名」指摘を解消。npm run build PASS / 編集ファイルに型エラーなし16fd8001
2026-05-07クーポン使い方ガイドを kotohira about 配下に新設 + demo フロー実機能同期。/c/kotohira/about/coupon-guide を新規作成(286 行、kotohira トーン: kotohira-cream / kotohira-primary / kotohira-gold / font-display)。3 視点 (① 加盟店オーナー 5 step / ② お客さん 4 step / ③ 店員 4 step) + FAQ 5 件 + デモ動線。/c/kotohira/about の FEATURES 配列に「加盟店のクーポンを使う」カードを追加 + 加盟店管理 CouponsTab に communityId 判定の amber バナー (kotohira 限定) + 加盟店公開ページ (places/[id]/page.tsx) のクーポン section header に「使い方ガイド →」リンク。demo flow merchant-coupon の step 4 (カメラスキャン + emerald ガイド枠 + 「カメラが使えない場合 ▾」表記) と step 5 (✓ 消込完了 + 振動 60ms + 本セッション消込累計 + 8 秒自動 dismiss) を PR #18 後の実 UI に追従。strict-reviewer 1 ラウンドで MUST FIX 2 件 (ring-kotohira-gold-soft 未定義 → ring-[hsl(var(--kotohira-gold-soft))] 置換 / gift/[code] test の status 400→410 + mock model 名 pointGiftAttempt → giftClaimAttempt) を解消。test:unit 1773 PASS / lint 0 errors / build OK19c05b12
2026-05-07/c/kotohira/about/earn の②③を運営フィードバックで調整。顧客スクショ指摘で「②お手伝い・クエストをこなす」セクションは現状クリックで /c/kotohira/events に飛び、イベント参加でポイントが貯まると誤認させる懸念があるため、comingSoon: true フラグを Way 型に追加して「準備中」バッジ表示 + CTA Link を抑止に変更。「③町内のお店でチェックインする」は実施未定(常時運用ではなく町内回遊型大型イベント時に組み合わせる方針)のため WAYS 配列から完全削除。付随で stale comment 4つの貯め方 を 貯め方一覧 に修正、key={i} を key={w.title} に変更。strict-reviewer 1ラウンドで stale comment / index key 指摘を解消。npm run build PASS / 編集ファイルに型エラーなし3c59babe
2026-05-07加盟店セクションを Local Partners 表記化 + 写真なし加盟店のキャラ単独表示 + カード写真上寄せ。トップ加盟店ブロック (Merchants.tsx) の英語ラベルを MERCHANTS → LOCAL PARTNERS に変更(加盟店以外の地域パートナー掲載予定のため。/c/kotohira/places 一覧側のラベル統一は前 commit 6ae2ce38 で先行実施済)。虎屋別館(Place ID cmo157pwi0006cfjur13t26rw)はサムネ写真未提供のため imageUrl=null のまま、getMerchantCharacter が /カフェ森と山|虎屋別館/ にマッチして yamauchi(山内さん)を返す既存マップを活かし、card / modal の imageUrl && ガードを撤廃して写真なしでもキャラだけ表示する形に。同時に、キャラがある場合はフォールバックの中央カテゴリ絵文字(card は text-4xl、modal は text-6xl)を非表示にして二重表示を回避。さらに、ユーザー指摘「画像の上下の白い部分が気になる」への対処として、画像 21 枚の端ピクセル/上下 1 行平均色を解析した結果、純白フチを持つ画像は 0 件(=自動 trim 不可)と判明したため、CSS で object-cover object-[center_35%](やや上寄せ)に変更し、看板や被写体が画面上部にある一般的な店舗写真の構図で被写体を中心に寄せる方針を採用。test:unit 1773 PASS / lint clean / build OKd3c43b74
2026-05-07クーポン機能 受け入れテスト + UI/UX 全面ブラッシュアップ完了。API レベルは本番DB (kotohira / shunsuke 1000pt 残高) に対し 19/19 通過 (scripts/acceptance-test-coupon.ts、lot snapshot/restore 方式で残高完全保全)。UI は 25 issue (#2-#27) を /ui-check 静的解析で抽出 → Critical 7 + Warning 13 を全件解消。主な改修: ① スキャン画面に カメラ起動 実装 (scanCanvas = BarcodeDetector + jsQR fallback、振動/累計/自動 dismiss)、② CouponQRModal 共通コンポーネント新設 (店舗詳細 + マイページ + /me/coupons の 3 箇所で共有、Esc/背景閉じ/コピー/期限切れ→再発行)、③ API ENUM バリデーション追加 (src/lib/coupon-types.ts で discountType/status/period 検証、legacy 値で PATCH を破壊しない実装)、④ ポイント不足時の inline amber バナー (toast は plain text のみ対応のため UI で誘導)、⑤ 多重発行 disabled / マイページから QR 直接再表示 / EXPIRED+REDEEMED に再チャレンジ導線。strict-reviewer サイクル 3 回 (MUST FIX 4件: handleReissue id ベース化 / recentTokens タイムアウト解放 / handleRedeem 依存最小化 / legacy discountType 互換) を全消化。test:unit 1773 PASS / lint 0 errors / build OK / shunsuke 残高 1000pt → 1000pt 完全保全。PR #180285f470
2026-05-06プレミアム年会費の仮提案を ¥30,000 → ¥25,000 に変更(5/14 顧客相談文に整合)。/c/kotohira/about/premium (本番ページ、行 118 / 213 の 2 箇所) / /c/kotohira/demo/premium-purchase (4 箇所) / /c/kotohira/demo/premium (1 箇所) / payment-and-premium-overview.md (Q2 価格仮案 / デモ画面注記 / 価格表 = 月割換算 ¥2,500 → 約 ¥2,083 に再計算) を一括更新。premium-pricing-benefits-plain.md の年会費仮提案 25,000 円 / 年と整合。OP-6 デイリーダイジェスト (¥30,000) や旧システム保守費 (¥30,000/月) は別項目のため変更しない。lint clean / test:unit 1773 PASS / build OK— (docs + UI only)
2026-05-06KOTO_17 dev 疎通テスト完走(Railway → did-event preview)。Treasury Preprod faucet で 1,000 tADA 入金 / Vercel preview env 4 変数投入 (CARDANO_NFT_API_BASE_URL / _API_KEY / _WEBHOOK_SECRET / _POLICY_NAME=琴平デジタル町民 プレミアム住民証) / Railway 直叩きで /wallet/treasury / /nft/policy (policyId fb060d5d... 取得) / /wallet/address 決定論性 (同 sub で 2 回叩いて同一 addr_test1... 返却) 全 PASS / did-event preview に vercel deploy でデプロイ + Preview Protection Bypass トークン取得 / HMAC-SHA256 署名付き擬似 webhook 送信 → 404 NftMintRecord not found(期待値: HMAC 一致 + payload パース成功 + DB 検索到達)を確認。気付き: (1) ベンダー実装の /wallet/address は README で「JWT body 渡しのみ」と書かれていたが実際は x-api-key ヘッダ必須 → integration.md §2.1 / §2.7 を修正。(2) cutover-runbook.md Step 1 はベンダー Railway URL を開く前提だったが現状 A-1 自前構築のため冒頭に「スキップして自前 URL 使用」の注記を追加。残運用: Shopify dev webhook 二重配信 / dev end-to-end smoke / prod 切替— (docs only)
2026-05-06SEC-1: .env.preview git history 漏洩事故 — 最低限対応。vercel env pull で取得した .env.preview が f48e69db 等で private repo に commit 済みだった (DATABASE_URL / Firebase service account / Google service account private key / OAuth secrets 等漏洩)。private repo のため即時流出はないが要 rotate。最低限対応: .gitignore に .env.preview 等追加 / git rm --cached .env.preview / tasks/todo.md に SEC-1 として登録。漏洩 secret rotate と git history からの完全削除は別タスクとして残置— (docs only)
2026-05-06KOTO_17 自前 Railway dev 環境立ち上げ完了。ベンダー Railway project (2ef1d063-...) は弊社アカウントから 404 で見えないため A-1 自前構築方針を実行。japanxcollege/cardano-shop-api (fork) を Railway に Deploy from GitHub → PostgreSQL 追加 → env 一式投入 (Blockfrost preprod/mainnet / Pinata JWT / Treasury 24単語ニーモニック / MASTER_SECRET / API_KEY / WEBHOOK_SECRET / PORT=3001) → Public Domain cardano-shop-api-production.up.railway.app 発行 → GET / 200 / GET /wallet/treasury で addr_test1qrz9s... 取得確認 → Preprod faucet で tADA 入金。ハマリどころ 2 件をドキュメント反映: (1) npm run generate:wallet はベンダー fork に scripts/ ディレクトリが含まれず失敗 → MeshSDK 直叩き (MeshWallet.brew()) で代替、(2) Railway 自動注入の $PORT と Networking Public Domain Port 不一致で 502 → PORT=3001 明示 + Networking Port も 3001 に揃える運用に確定。shopify-cardano-railway-setup.md §2.4/§2.5 / shopify-cardano-integration.md Status & §9 を更新。残運用: Vercel preview env 投入 (4 変数) / dev smoke test / Shopify webhook 二重配信— (docs only)
2026-05-06トップ About 撤去 → about へ情報集約 / Hero にキャッチコピー復活。トップから _components/About.tsx (3 ステップカード) を削除 + 物理ファイル削除、page.tsx の import / 使用を除去。/c/kotohira/about ヘッダーに「琴平での一日が、すこし面白くなる。」サブコピーと「町の人・訪れる人・加盟店をつなぐ LINE 発の町民プラットフォーム」リード文を移植。Hero 画像下に旧キャッチコピー (KOTOHIRA Digital Town Residents / 琴デジポイントを貯めて、使って、町に関わる。/ 感謝と関係性が循環する、新しいコミュニティ体験を。) を復活。e2e/kotohira_header_dropdown.spec.ts を describe.skip 化 + TODO(KOTO_HEADER_E2E) コメント (commit df6f6588 以降の新仕様用に書き直し必要)。build OK / Playwright スクショで意図通りbf264aec
2026-05-06琴平ページ全体を青/黄/白黒のフラット配色に統一。design-tokens.md (docs/_kotohira/design/design-tokens.md) を SoT として新設し、青 (Primary) / 黄 (Accent) / 白黒 (グレースケール) / 赤 (警告のみ) の世界観を定義。src/app/c/kotohira/** + src/components/kotohira/** の禁止色 (emerald / indigo / amber / orange / rose / pink / purple / violet / fuchsia / slate / sky / cyan / teal / lime / green) を Tailwind/Hex 全削除、グラデ 81 箇所をフラット化、backdrop-blur 21 箇所撤去。kotohira-home.css / kotohira-theme.css の .btn-primary linear-gradient を単色化し、--kotohira-navy (深緑) を全廃。MyPageClient.tsx で退会セクション削除 (議事録 0505.md に「退会機能は持たない、通知 OFF で代替」仮確定論点を記録)。SoT §2.1.2 で和風装飾 (pattern-asanoha / placeholder-banner / skeleton) を例外として明示。strict-reviewer 4 ラウンドで重大→中→低指摘を全解消、最終 PASS。test:unit 1768 PASS / lint clean / build OK / Playwright スクショで全ページ世界観達成を確認2c37e45f 6b38f2aa 3eec1ff8 4e04f4c6
2026-05-06KOTO_17 P1 Cardano Treasury 残高監視ページ新設。/admin/c/[id]/cardano-treasury を新設し、Shopify 購入 → Cardano NFT 自動 mint で使用する Railway ホットウォレットの残高を Admin が監視できる UI を提供。CardanoNftProvider#getTreasury() (GET /wallet/treasury) で取得し、ADA / lovelace / network を表示。閾値ベースのアラート色分け (50 ADA 未満で警告 / 10 ADA 未満で重大)。Mint 統計 (直近 30 日: MINTED / 処理中 / FAILED) と直近 10 件の mint 履歴 (status / tokenId / txHash) を併設。Railway API 失敗時はエラーメッセージ + 環境変数確認案内を表示。認可は ownerOrganizerId / ownerUserId / role=ADMIN のみ。運用前提: Vercel env CARDANO_NFT_API_BASE_URL / _API_KEY 設定が前提 (KOTO_17 残運用項目)。NFT 一覧 UI は既存 MembershipNftCollection が chain/txHash/explorer link 含めて Cardano 完全対応済みのため改修不要と判断。lint clean / build OKfed6954d
2026-05-06/c/kotohira/about 回遊性向上。STEP 02「町を楽しんで貯める」に /c/kotohira/about/earn への btn-ghost、STEP 03「町で使う・交換する」に /c/kotohira/rewards への btn-ghost を追加。関連ナビカードを 2 枚 (events / mypage) → 4 枚 (places / map を追加) に拡張。デザインは既に kotohira-cream + asanoha + .card で組まれていたため大改修不要、回遊リンクのみの最小差分。lint clean / build OK308bce59
2026-05-06/c/kotohira/premium/checkout を kotohira トーンに統一。従来の青グラデ + #c8dcea ハードコード色を kotohira-cream / kotohira-primary / kotohira-gold + .card / .btn-primary / .btn-ghost / font-display に置換。プラン選択は ring-2 ring-kotohira-primary でアクティブ表示、「準備中」プランはアンバーピル型バッジで誠実に開示。「住民証 NFT」表記を「年次会員証 NFT」に統一 (about/premium と整合)。決済情報非保持の説明を追記。lint clean / build OK4dff0938
2026-05-06KOTO_8 加盟店マップ本番ページ新設。demo の /c/kotohira/demo/map を本番化し /c/kotohira/map を新設。Place モデルの lat/lng から実座標を簡略マップに描画し、カテゴリ filter (飲食/宿泊/体験/物販/観光) + 一覧 + 詳細シート + Google マップ経路リンクを提供。デザインは kotohira HP top に揃え kotohira-cream 背景 + pattern-asanoha + .card / .btn-primary / .btn-ghost ユーティリティ + font-display。ピン色はプレミアム加盟店が kotohira-gold、それ以外は white。ランドマーク (金刀比羅宮 / 琴電琴平駅) を kotohira-red / kotohira-navy で配置。詳細シートは sm 以上で中央モーダル、モバイルではボトムシート。lint clean / build OK7dd4ec5e
2026-05-06admin events 画面を旧 system 風 table + 画面遷移なし編集に改修。/admin/c/[id]/events を全面リニューアル: サムネ列追加、名前/開始日/終了日/有効 のソート (asc/desc トグル)、各カラムの絞込検索、isPublic を ○/× で表示、行アクション (鉛筆=編集 / ゴミ箱=削除 / 外部リンク=詳細)、フッターに行数・New ボタン・CSV エクスポート (BOM 付き、filtered 行のみ)。スライドオーバー編集パネル新設 (画面遷移なし、画像 drag&drop → /api/upload、title/開始日/終了日/説明/website/googleMapsUrl、PATCH /api/events/[id]、空入力バリデーション)。1 行削除は 2 段階確認 + 参加者ありは disabled (フィルタ/検索変更で pending 自動リセット)。test:unit 1768 PASS / lint clean / build OK35934c8d
2026-05-06権限の根本修正: asis 264件に organizerCommunityId 補填 (同 commit 35934c8d)。/api/events/[id] PATCH/DELETE は organizerCommunityId 経由で MANAGE_EVENTS を判定するため、import 時に未設定だった 264 件は kotohira community ADMIN でも編集不可だった。scripts/fix-kotohira-asis-organizer.ts を新設し 264 件全件を補填 (実 DB 更新済)。import スクリプトも次回以降 organizerCommunityId を書き込むよう修正(同上)
2026-05-05fix: tags を JSON 配列形式に統一し /events/[id] のクラッシュ修復。EventDetailClientPage が JSON.parse(event.tags) で読むため、初版 import で投入した ;asis;asis:<hashId>; 非 JSON 文字列が SyntaxError: Unexpected token ';' で本番を落としていた。scripts/fix-kotohira-asis-tags.ts を新設して 264 件全件を ["asis","asis:<hashId>"] JSON 配列形式に書き換え (実 DB 更新済、旧 0 / 新 264 を確認、JSON.parse 成功)。import スクリプトも JSON 配列出力に変更、admin events フィルタも tags.includes('"asis"') に修正、import 再実行で全件 dup 検出 (冪等性維持)885d988f
2026-05-05asis 旧 system イベント 264 件を Event テーブルに取込 + admin 一括操作機能。docs/_kotohira/data/ を _data/ にリネーム (他の underscore prefix と整合)。scripts/import-kotohira-asis-events.ts 新設: csv-parse で寛容パース (未エスケープ " 含む CSV)、dry-run 既定 / --apply で書込 / --limit N、冪等キー tags の asis:<hashId> で contains 検索、25 件チャンク × prisma.$transaction × {maxWait:10000,timeout:30000}、投入時 status=draft / isPublic=false / visibility=private で運営確認待ち。POST /api/communities/[id]/events/bulk-action を新設: 認可は ADMIN/ORGANIZER/OWNER (line-broadcast パターン準拠)、受信 eventIds は communityId/organizerCommunityId で本コミュニティに再フィルタ、delete は participants > 0 を除外、上限 500 件/req。/admin/c/[id]/events にチェックボックス・全選択・一括操作バー・asis フィルタ・削除二段階確認を追加。DB 上に 264 件投入済 (冪等性も再実行で実証)82f32842
2026-05-05demo の状態切替で実 LINE Bot リッチメニュー反映 (テスト bot 限定)。demo の MemberStateSwitcher に「実LINEに反映 ON/OFF」トグルを追加。ON にすると guest/citizen/premium 切替時に kotohira-test community に紐付くテスト LINE Bot のリッチメニューを実 API で切替える。POST /api/c/kotohira/demo/apply-richmenu 新設 (ログイン必須 / community は KOTOHIRA_TEST_COMMUNITY_ID にハードコード、本番 community への副作用は経路として存在しない)。applyKotohiraRichMenuByTierOverride() を新設し DB tier 判定をバイパスして引数 tier の richmenu を直接 link。localStorage で ON/OFF 永続化、pending 中は連打防止、ok/error バナー表示。ユニットテスト 5 件追加 (tier 3 種、未紐付け skip、非 kotohira ガード)a3bb8849
2026-05-05/c/kotohira/about/premium を kotohira トーンで全面再構築。従来の青グラデ + 黄帯デザインから、kotohira-cream / kotohira-primary / kotohira-gold + 丸ゴシック (M PLUS Rounded 1c) を使った Hero + 3 段会員ティア + 6 特典ブロック構成へ。0505 議事録 (_gijiroku/0505.md) で議論したプレミアム特典 Phase 設計を実装に反映: バッジ表示=「利用可」緑バッジ / 月次ポイントボーナス=「順次開始」/ 限定クーポン・先行予約・町長選挙・Discord サロン=「準備中」アンバーバッジ + 各々の statusNote で進捗を誠実に開示。加入 CTA を独立カード化(年会費 ¥30,000 / 6 月販売開始予定は据置)+ FAQ 4 件を details/summary でアコーディオン表示。選挙関連は getPremiumBenefitItems() フィーチャーフラグを継続利用しつつ別セクションに分離。test:unit 1732 PASS / lint clean (kotohira terminology guard 通過) / build OKedbeb89a
2026-05-05琴平ヘッダーに運営ロール向け管理画面導線を追加。OWNER/ADMIN/ORGANIZER (isStaffRole) のメンバーがアイコンタップ後のメニュー先頭から /admin/c/{communityId} に遷移できる Link を追加。KotohiraViewer (citizen) に isAdmin: boolean フィールドを追加し、src/lib/roles/staff-role.ts の正本ヘルパで判定(OWNER 漏れを strict-reviewer 指摘で修正)。KotohiraHeader props に communityId 追加し layout から渡す形に。サーバ側認可は変更せず UI 露出のみ追加。type/lint/build clean6fdda54b
2026-05-05マイページ 4 タブを遷移なしで完結化。前 commit b620f936(5/4)でタブ UI を導入したものの、クーポン/送るタブはリンクボタン案内のみ・イベントタブは直近 3 件 take の状態だった。本 commit で (1) events を take: 3 撤廃でコミュニティ開催予定全件表示、(2) coupons タブで /api/communities/kotohira/coupons を fetch して一覧表示(pt 表示・店舗名・有効期限)、(3) send タブに既存 SendClient を直接埋め込み、検索→金額→確認→完了をマイページ離脱なしで実行可能に。MyPageClient 側 Props に communityId / communityName を追加し page.tsx から community.id/name を渡す形に変更。test:unit 1701 PASS / lint clean / build OK35805def
2026-05-05KOTO_17 行を 🔴 未着手 → 🟡 P0 完了に状態更新。本表行 91 (KOTO_17) が 5/4 タスク新設時の「🔴 未着手 / NFT一覧 UI 未着手」表記のままで、5/5 commit 53ce02af で実装された P0 (cardano.ts 書換 / cardano-mint webhook 新設 / User.cardanoAddress カラム追加) を反映していなかった。状態カラムを 🟡 P0完了 に変更し、内容欄を「P0 実装完了 (commit 参照) / 残運用前提 (Railway URL / Vercel env 4 件 / Treasury / dev→prod / 法務) / P1・P2 未着手」に書き直し。0505 議事メモ (_gijiroku/0505.md gitignored) で「次に更新する必要あり」と明記していた作業を実行—
2026-05-05マイページ QR を中央配置に戻し、スキャン/QRシェアを下に横並び。前 commit b620f936 で QR 横+ボタン縦並びにしていたが、ユーザー要望(QR は真ん中・その下にシェア&スキャン)を受け、flex flex-col items-center で QR を中央配置 → 下に flex items-stretch justify-center gap-2 で 2 ボタンを横並び(各ボタン flex-1 で均等幅)。QRシェアポップアップは right-0 から left-1/2 -translate-x-1/2 に変更しボタン直下中央表示に統一。lint exit 0 / build OK1f1f6ec1
2026-05-05マイページ会員証カード右上を設定ボタン化 + /mypage/settings 設定ページ新設。ユーザー要望 [Image #9]: 会員証カード右上の日本地図/王冠絵文字(🗾/👑)を削除し、設定ボタン(歯車 inline SVG / /c/kotohira/mypage/settings 遷移)と将来のバッジ用の横並び空コンテナ(data-slot="kotohira-mypage-badges" / aria-hidden="true" / バッジ追加時に外す TODO 注記)に差し替え。本文側「琴平デジタル町民 PREMIUM」表記には pr-20 で右余白を確保し設定ボタンとの被りを防止。設定ページ /c/kotohira/mypage/settings を新規作成(mypage と同 auth ガード + 非メンバー時「町民登録ページへ」案内 UI で UX 統一)し、5 項目(プロフィール / 通知 / プライバシー / ログイン連携 / 退会)を「準備中」バッジ付きで配置。strict-reviewer 4件指摘(bg-kotohira-primary の layout スコープ確認 / 空 aria-label を aria-hidden に / 非メンバー時 UX 整合 / テキストはみ出し対策)を全反映。並列セッションで上書きされた編集は最終的に main で吸収済み(MyPageClient.tsx は HEAD と diff なし、settings/page.tsx のみ新規 commit)。test:unit 1701 PASS / lint clean / build OK45c5f5b3
2026-05-05会員制度マトリクス + 未決事項判断材料を公開ページ化。docs/_kotohira/decisions-pending.md に「送金で受け取った lot の有効期限(B-ii リフレッシュ仕様)をどう扱うか」「添付ファイル30日 TTL の妥当性」「citizen がイベント作成できるか」「premium 専用機能の取扱い」「OWNER のポイント発行上限」「NFT 正式運用方針」など、運用入り前に三好氏 / 運営事務局で確定すべき判断項目 10 件を Q1〜Q10 として整理。src/lib/kotohira/membership-matrix.ts に SSoT データ(6 カテゴリ × 22 機能 × 6 ティア = 132 セル)を構造化し、/c/kotohira/demo/membership-matrix で誰でも閲覧可能に。/c/kotohira/demo/decisions-pending も併設し、force-static + revalidate 600s でビルド時固定 + 10分再生成。⚠ 未決マークで運営事務局がひと目で「決まっていない項目」を識別できる。三好氏との会話の素材として使う想定。test:unit 1701 PASS / lint clean / build OK53860dfd
2026-05-04マイページを 4 タブ統合(イベント / クーポン / 送る / 履歴)+ QR ブロック横並び化 + シェアポップアップ実装。ユーザー要望: ヘッダードロップダウンから遷移できる「イベント / クーポン / 送る / 履歴」をマイページ内のタブで切り替えできるよう統合し、QR コード右側に「📲 スキャン」「📤 QRシェア▼」の縦並び 2 ボタンを配置。シェア▼ ポップアップでは navigator.share 利用可能ならネイティブシェア、不可なら navigator.clipboard.writeText で URL コピー、それも不可なら alert(url) fallback。「QR画像をダウンロード」は react-qr-code の SVG を XMLSerializer + Blob + <a download> で SVG のままダウンロード。mypage/page.tsx で開催予定イベント直近 3 件を server-side 取得して events タブのサマリに表示、その他タブ(coupons / send)はデータ不要のリンクボタンのみ。既存ショートカット 4 つ(イベント/クーポン/送る/スキャン)と「最近の履歴」セクションは 4 タブに統合して撤去。clickOutside は mousedown/touchstart で React onClick 競合を回避。TS の "share" in navigator narrowing で else 側が never 化する不具合を回避するため typeof nav.share === "function" ベースに統一。test:unit 1701 PASS / lint clean / build OKb620f936
2026-05-04KOTO_17 Shopify × Cardano NFT 自動ミント統合タスクを新設。外注ベンダーから (1) Shopify アプリ 2 ストア (digital-resident-dev / iavzbc-7m) + (2) Railway デプロイ済み NestJS API(dev/prod env 各 1)+ (3) Cardano NFT 自動ミント基盤(決定論的アドレス・リトライバックオフ 1→2→4 秒・WEBHOOK_URLS 複数対応)+ (4) サンプル Next.js (cardano-shop-frontend) + (5) YouTube デモ動画 を受領。受領済 API として GET /nft/:address GET /wallet/treasury および NFT 商品 CRUD 7 エンドポイントを確認。did-event 側の接続作業は未着手のため docs/_kotohira/shopify-cardano-integration.md を SoT として新設し、KOTO_17 として WBS 化。P0(接続最低限・5/14目標): ① src/lib/nft/cardano.ts を Railway クライアントに書き換え、② /api/webhooks/cardano-mint を新設し HMAC 検証 + NftMintRecord 更新 + Entitlement auto-create、③ Shopify webhook の二重配信整理(did-event=ポイント引落 / Railway=NFT mint)、④ User.cardanoAddress カラム追加で決定論的アドレスを永続化。P1: NFT 一覧 UI (/c/kotohira/mypage) / Treasury 残高 Admin / 商品管理 UI 二重化解消。P2: E2E + Testnet→Mainnet 切替手順 + 障害時手動 mint。未確定事項: ① Railway 公開 URL(dashboard で確認)、② Shopify mint endpoint の正式 path(README 照合)、③ アプリが Dev Dashboard 系か legacy 系か(webhook 登録手段に影響)。既存 docs/runbooks/cardano-nft-integration.md(Blockfrost 直接実装の中立資料)と本ドキュメントの方針差異も明文化—
2026-05-04Hero / FooterCTA の「マイページ」CTA を /c/kotohira/mypage に切替。ユーザー要望 [Image #6]: 琴平 HP トップの「マイページを見る」ボタンが forcommunity 側 /mypage に飛んでいたが、琴平のマイページに飛ぶべき。src/app/c/kotohira/_components/Hero.tsx と src/app/c/kotohira/_components/FooterCTA.tsx の href="/mypage" を /c/kotohira/mypage に修正。KotohiraHeader 2階層目「総合アカウント」の /mypage は説明文どおり forcommunity 横展機能のため意図通り残置。lint exit 0 / build exit 018691dbb
2026-05-04用語ガードレール追加(コトカ混同・誤解表現の再発防止)。scripts/check-kotohira-terminology.ts を新設し src/app/c/kotohira/ + src/lib/kotohira/ 配下(demo/ 除外)で 6 禁止語(プレミアム町民 / KOTOHIRA DIGITAL CITIZEN / 現金のように / 現金と同じ / いつでも換金 / いつでも返金)を grep 検出。「琴デジポイント」前置強制はしない設計(「ポイント」単独は許容、要件通り)。npm run lint に && tsx scripts/check-kotohira-terminology.ts を連結し push 前ゲートに統合。check:kotohira:terminology 独立コマンドも追加。スクリプト内部関数を export し scripts/check-kotohira-terminology.test.ts で 15 テスト網羅(境界値・除外規則・絶対パス→相対正規化・FORBIDDEN 内訳)。vitest.config.ts の include に scripts/**/*.test.ts を追加。import.meta.url === file://${process.argv[1]} でメインモジュール判定し vitest からの import 時に main() が走らないようガード。検証: lint exit 0 / vitest 15 PASS / プローブで 6 禁止語全検出 exit 1 確認 / test:unit 1701 PASS / build OKfd1a2c71
2026-05-04KotohiraHeader を layout.tsx に集約し琴平内全ページで自動表示。ユーザー要望([Image #5] のドロップダウンから遷移できる先全部にヘッダーを置きたい)を受け、demo/ 以外の琴平内 18 ページで KotohiraHeader 不在を確認し、個別追加ではなく src/app/c/kotohira/layout.tsx を async Server Component に変更して共通化。src/lib/kotohira/viewer.ts に React cache() でラップした getKotohiraCommunity / resolveKotohiraViewer と純関数 buildKotohiraLineHref を追加し、layout / page で同一リクエスト内の重複クエリを dedupe。KotohiraHeader の NAV_ITEMS を #merchants 等のフラグメントから /c/kotohira#merchants 等の絶対パスに変更(非トップページからも遷移可能)+ 並び順を page.tsx の DOM セクション順に合わせて修正。kotohira-home.css に scroll-padding-top: 3.5rem(sticky header h-14 = 56px 分)を追加し #anchor 遷移時にセクション見出しがヘッダーに隠れないよう対策。test:unit 1685 PASS / lint clean / build OK(e2e は Docker daemon 停止のためスキップ)b040a831
2026-05-04/c/kotohira/send に画像/動画/PDF 添付を実装(Phase 2・30日 TTL)。PointTransaction に metadata Json? と attachmentsExpireAt DateTime? を追加(migration 20260504125759_add_pointtx_attachments、partial index で索引サイズ抑制、nullable from start で無停止 ALTER 可)。/api/transfers/attachments を新規追加し Cloudinary に保存(MIME + magic number で拡張子偽装を検証)。/api/points/transfer で attachments を受け取り validateAggregateLimits で再検証、OUT/IN 両方の metadata と attachmentsExpireAt を $transaction 内で update、LINE 通知文に「📎 画像N/動画/PDF」サマリ追加。SendClient + AttachmentPicker で画像5枚(合計5MB)/動画1本(10MB)/PDF1個(5MB)を選択・プレビュー・削除可能。mypage 取引履歴に添付サムネイル表示、期限切れは「保存期間が終了しました」表示。scripts/cleanup-transfer-attachments.ts + .github/workflows/cleanup-transfer-attachments.yml(日次04:15JST)で期限切れ行の Cloudinary destroy + DB metadata クリア。運用前提: 本番で prisma migrate deploy 実行 + Actions secrets に Cloudinary 関連 env を追加が必要。test:unit 1701 PASS / lint clean / build OK99248c29
2026-05-04ヘッダーをアバター直下ドロップダウンに変更(ボトムシート廃止)。forcommunity の ProfileDropdown と同じ「アバター直下に absolute right-0 で展開する」UI に揃える。role="menu" + aria-haspopup="menu" + aria-expanded、各項目に role="menuitem" を付与し、aria-label は静的化("琴平ヘッダーメニュー")。clickOutside は React onClick との競合を避けるため mousedown/touchstart で監視。階層構造(1階層目 5アクション + forcommunityへ / 2階層目 総合アカウント・総合名刺・クエスト)は維持。Portal / safe-area / dvh / scrollTop / useLayoutEffect 等のシート用特殊コードは全削除(absolute なので backdrop-filter 影響を受けず Portal 不要)。QRScannerModal の Portal 化は保険として残置。e2e spec を kotohira_header_dropdown.spec.ts にリネーム + ドロップダウン用に書き換え、メニュー外クリックで閉じる検証を追加(4 ステート 2 PASS, 19.2s)。test:unit 1685 PASS / lint clean / build OK56462e6e
2026-05-04用語固定 + コトカ混同回避コピー反映。三好氏フィードバック(コトカ=琴平町電子マネーとの混同事例あり)を受け、kotohira/ 配下を一斉に統一: 「ポイント」→「琴デジポイント」、「プレミアム」→「プレミアム琴平デジタル町民」、英語表記をロゴと同期し KOTOHIRA DIGITAL CITIZEN → KOTOHIRA Digital Town Residents に変更(Hero / MemberCard 計3箇所)。about/use に「現金とは異なるトークン/換金・返金不可(コトカとは別物)」の免責を追記。Hero見出しを「琴デジポイントを貯めて、使って、町に関わる。感謝と関係性が循環する、新しいコミュニティ体験を。」に差し替え。About を「すこし面白くなる」に変更。STEP 02 を「町のお手伝いなどで琴デジポイントが貯まる」、STEP 03 を「町の遊休資産(空きスペース宿泊・移動・体験等)と交換」に更新。RewardsPreview の引換価格を実態に合わせ高速バス 5,000→7,500 / 宿泊 8,000→2,500 / mobi 500→1,000 に更新し、宿泊 note を「通常の宿泊エリアではないスペースでの宿泊」、体験 note を「イベントでの試食権利等」に変更。ServiceGuide 副題を「空きスペース宿泊・移動 等」「X・オープンチャット(準備中)」「琴平mobi」(GOタクシー削除)に整理。Announcements 見出しを「運営事務局からのお知らせ」に変更し、本文末尾「こちらで様々な情報をお届けします」追記。フッターに「琴平デジタル町民運営事務局」表示追加。Hero 背景は「キャラクター集合」素材未提供のため TODO コメントで現行(金刀比羅宮参道)を維持。test:unit 1678 PASS / lint clean / build OK6919d4d2
2026-05-04/c/kotohira/send 送り先カードを mypage 構成に同期(Phase 1)。/api/users/search に communityId 指定時の member: { communityName, memberNo, registeredAt } を後方互換で付加(追加プロパティ、他5箇所の caller は data.users の追加 prop を無視するため破壊なし)。deriveMemberNo を src/lib/kotohira/member-no.ts に共通化し mypage / send で同一ロジック化。SendClient の Recipient 型と RecipientCard・検索結果リストを「コミュニティ名 / 表示名 / 町民No. NNNN / YYYY年M月 登録」の4要素表示に。添付機能(画像5枚/合計5MB・動画1本10MB・PDF1個5MB・30日 TTL)は Phase 2 で別 PR 対応予定(Vercel Blob 導入が前提:@vercel/blob パッケージ + BLOB_READ_WRITE_TOKEN 環境変数の手動設定が必要)。test:unit 1678 PASS / lint clean / build OK684f8278
2026-05-04ヘッダーボトムシートを Portal 化して backdrop-filter 汚染を根本解消。<header className="sticky top-0 backdrop-blur"> の backdrop-filter が CSS 仕様で新しい containing block を作るため、子の position: fixed なボトムシートが viewport 基準ではなく header 基準になり、ページスクロールで header が画面外に去ると一緒に画面外へ押し出される症状が発生していた。createPortal でボトムシート + QRScannerModal を document.body 直下に逃がし、portalReady state で SSR ガード、viewer.status === "citizen" で型ガード統一。回帰防止のため e2e/kotohira_header_bottom_sheet.spec.ts を新規追加し iPhone X viewport(chromium emulate)で会員時の階層遷移と ゲスト時の LINE+ 表示を 2 PASS。prisma/seed.ts に琴平 community + test1 membership を追加し e2e 前提を整備。test:unit 1685 PASS / lint clean / build OKc47642eb
2026-05-04マイページ「琴平町公式HPへ」リンクを琴平デジタル町民トップに切替。MyPageClient.tsx の KOTOHIRA_OFFICIAL_SITE_URL を town.kotohira.kagawa.jp から did-event.vercel.app/c/kotohira に変更。自サイト側のトップへ動線を集約de50f115
2026-05-04CL-00A 受け入れテスト数値を 1678 PASS に最新化。big-picture.md (docs/_internal/big-picture.md) との整合を取るため、wbs 行47 の test:unit 1627 PASS (2026-05-03 古い snapshot) を最新の 1678 PASS に更新し、最新値は npm run test:unit で確認するよう明記—
2026-05-04琴平 HP ヘッダー右上アイコンを行動メニュー化 + ボトムシートのスクロール位置リセット。会員時の右上アイコンを /mypage 直リンクからボトムシート起動ボタンへ変更し、1階層目に琴平アクション5項目(QRスキャナ直起動 / 会員証QR提示 #qr / イベント受付 / ポイントを使う / お店&イベント探索)、2階層目「forcommunity」に総合アカウント・総合名刺・クエストを集約。requestAnimationFrame による z-index 競合回避、同ページアンカーは scrollIntoView フォールバック、role=dialog/aria-modal/Esc キーで a11y 担保、useRef + useEffect で階層切替後の scrollTop=0 リセット、max-h-[85dvh] + paddingBottom: calc(env(safe-area-inset-bottom)+24px) で URL バー / ホームインジケータ被り対策。test:unit 1671 PASS / lint clean / build OK(commit 75136f72 時点の数値。同日後続の big-picture.md / Stripe テストテンプレ追加で +7 され現在 1678、CL-00A 行 47 と本表上端の最新エントリを参照)75136f72
2026-05-03リッチメニュー tier=citizen 表示問題を修正。line-test callback の lineUserId.toUpperCase() を撤去し、src/lib/auth.ts の本番 line provider 側 toUpperCase() も統一撤去。linkRichMenuToLineUser に canonical (U+lower) 優先 + 404 時に生値を試す後方互換リトライを追加。scripts/normalize-line-user-ids.ts で既存 User.lineUserId / Account(line, line-test).providerAccountId を canonical へバックフィルする運用を整備。test:unit 1638 PASS / lint clean / build OK—
2026-05-03watch-signals を8系統対応へ更新。check-kotohira-followup-watch-signals.ts に now-watch シグナルを統合し、HEALTHY/EXTERNAL_WAITING を正常判定として扱うよう拡張。supervisor/ensure でも HEALTHY/READY を維持—
2026-05-03autopilot を8系統へ実運用昇格。start/stop/status を now lane 対応へ更新し、stop -> start で now_pid を含む state へ移行。status で 8PID all alive、followup-now で EXTERNAL_WAITING を確認—
2026-05-03autopilot 管理ロジックを8系統対応へ拡張。start-kotohira-followup-autopilot.ts / stop-kotohira-followup-autopilot.ts / check-kotohira-followup-autopilot-status.ts へ nowPid/nowLog と manual判定(8系統/legacy7系統)を追加—
2026-05-03followup-now-watch 定期監視を追加。watch-kotohira-followup-now.ts(followup-now-watch(:5))を追加し、followup-now を定期実行。HEALTHY/EXTERNAL_WAITING を正常系として継続監視し、異常時のみ runbook へ記録する運用を追加—
2026-05-03現況サマリ 1コマンド(followup-now)を追加。check-kotohira-followup-now.ts で autopilot-status + readiness を束ね、運用判断を HEALTHY / EXTERNAL_WAITING / NEED_ATTENTION / ACTION_REQUIRED で即時返却。現時点は EXTERNAL_WAITING—
2026-05-03acceptance再実行で品質ゲート維持を確認。check:kotohira:acceptance で lint PASS / test:unit 1627 PASS(190 files)を再確認。control は外部依存により BLOCKED 継続で、残課題が外部返信待ちのみであることを再確認—
2026-05-03watch-signals 統合後の再帰なし回帰確認。watch-signals と readiness-watch --once を再実行し、循環呼び出しなしで HEALTHY / EXTERNAL_WAITING を維持することを確認—
2026-05-03watch-signals に readiness 監視線を統合。check-kotohira-followup-watch-signals.ts が readiness-watch シグナル(READY/EXTERNAL_WAITING)を判定対象に追加。supervisor / ensure 経由でも watch_signals_exit=0 を維持し、7系統最上位判定へ反映—
2026-05-03autopilot status の lane欠損判定を厳密化。check-kotohira-followup-autopilot-status.ts で supervisor/readiness PID が state 欠損時でも実プロセススキャン結果を使って alive/down を判定するよう修正し、見逃しを防止—
2026-05-03autopilot を7系統へ実運用昇格。start/stop/status を readiness lane 対応へ更新し、stop -> start で readiness_pid を含む state へ移行。status で 7PID all alive、readiness で EXTERNAL_WAITING を確認—
2026-05-03autopilot 管理ロジックを7系統対応へ拡張。start-kotohira-followup-autopilot.ts / stop-kotohira-followup-autopilot.ts / check-kotohira-followup-autopilot-status.ts へ readinessPid/readinessLog と manual判定(7系統/legacy6系統)を追加—
2026-05-03readiness-watch 定期監視を追加。watch-kotohira-followup-readiness.ts(followup-readiness-watch(:5))を追加し、EXTERNAL_WAITING を正常系として監視継続、NEED_ATTENTION/ACTION_REQUIRED のみ異常記録する運用へ拡張—
2026-05-03readiness 最上位判定を追加。check-kotohira-followup-readiness.ts を新設し、supervisor + followup-gaps から READY / EXTERNAL_WAITING / NEED_ATTENTION / ACTION_REQUIRED を判定。現時点は EXTERNAL_WAITING(内部健全・外部返信待ち)を確認—
2026-05-03統合判定で「実装完了・外部返信待ち」を再確認。followup-supervisor=HEALTHY、followup-autopilot:ensure=READY、followup-gaps:now=immediate_input 0 / external_waiting_input 2 を確認し、残タスクが外部返信依存のみであることを明文化—
2026-05-03watcher HEALTHYシグナル更新を修正。watch-kotohira-followup-ops-now.ts / watch-kotohira-followup-supervisor.ts で refresh閾値超過時に同一シグナルでも updatedAt を更新するよう修正し、stale誤検知を抑止—
2026-05-03recover 判定も supervisor-first に統一。recover-kotohira-followup-autopilot.ts が ensure 後に supervisor 判定を追加し、supervisor 正常時は restart を回避。再起動後も supervisor で最終確認—
2026-05-03ensure を supervisor-first に最適化。ensure-kotohira-followup-autopilot.ts の最終判定を followup-supervisor 優先に変更。異常時のみ ops-now/watch-signals を追加実行する方式で重複実行を削減—
2026-05-03ensure 判定を watch-signals まで拡張。ensure-kotohira-followup-autopilot.ts が followup-watch-signals を最終判定へ追加し、ops-now + watch-signals が両方健全のときのみ READY を返すよう厳格化—
2026-05-03autopilot:adopt を6系統必須化。--adopt-running 時に supervisor-watch 未検出なら adopt-rejected(exit=4)を返すよう更新。必要時のみ --allow-legacy-adopt で旧5系統取り込みを許可—
2026-05-03autopilot status のmanual判定を6系統化。state 不在時に supervisor を含む manual 判定へ厳密化し、5系統のみ稼働は MANUAL_RUNNING_LEGACY で明示。6系統再起動への誘導を追加—
2026-05-03autopilot を実運用で6系統へ昇格。followup-autopilot:stop:5 → start:5 を実施し、supervisor_pid を含む state へ更新。status/ensure/supervisor まで HEALTHY を確認—
2026-05-03autopilot を 6系統管理へ拡張。start/stop/status が supervisor-watch を管理対象に追加。旧5系統stateは後方互換で RUNNING 継続しつつ、再起動で6系統stateへ移行するヒントを表示—
2026-05-03supervisor-watch 定期監視を追加。watch-kotohira-followup-supervisor.ts(followup-supervisor-watch(:5))を追加し、supervisor を定期実行する最上位監視線を実装。異常時 context付き記録と同一シグナル抑止に対応—
2026-05-03supervisor 最上位統合チェックを追加。check-kotohira-followup-supervisor.ts(followup-supervisor(:5))で ops-now と watch-signals を束ね、最終 decision を返す運用入口を1コマンド化。latest/history レポートを自動更新—
2026-05-03watch-signals 統合チェックを追加。check-kotohira-followup-watch-signals.ts(followup-watch-signals(:5))で guard / ops-now-watch signal を同時判定。HEALTHY stale は runtime freshness 二次判定で誤検知を抑止—
2026-05-03ops-now-watch の同一異常シグナル連投を抑止。watch-kotohira-followup-ops-now.ts に followup-ops-now-watch-last-signal-{hour}.json を導入し、同一異常の runbook 連投を抑止。正常復帰時は HEALTHY にリセット—
2026-05-03ops-now-watch 異常ログへ統合コンテキストを付与。watch-kotohira-followup-ops-now.ts が followup-ops-now-latest.md の decision/runtime/freshness/guard_signal を異常行へ埋め込むよう更新し、runbook 1行で一次切り分け可能にした—
2026-05-03ops-now に guard-signal 判定を統合。check-kotohira-followup-ops-now.ts が followup-guard-signal を実行し、guard_signal_exit を latest/history に保存するよう更新。統合判定が runtime系と guard系の両面を監視—
2026-05-03guard-signal 統合チェックを追加。check-kotohira-followup-guard-signal.ts(followup-guard-signal(:5))を追加し、signal内容+鮮度を1コマンドで判定。HEALTHY stale時は followup-freshness で二次判定し、HEALTHY_STABLE_SIGNAL を返す誤検知抑止を実装—
2026-05-03guard の healthy シグナル更新を差分化。watch-kotohira-followup-guard.ts で HEALTHY 同値時の state ファイル再書込を抑止し、監視継続時の不要I/Oを削減—
2026-05-03guard ログを状態変化時のみ追記に最適化。watch-kotohira-followup-guard.ts に followup-guard-last-signal-{hour}.json を導入し、同一 異常/注意 シグナルの連続追記を抑止。healthy 復帰でシグナルをリセットする方式へ更新—
2026-05-03guard に注意ログ(非致命)を追加。watch-kotohira-followup-guard.ts で recover_exit=2 を followup guard 注意 として runbook 自動記録し、異常停止と要手動ケースを分離して可視化—
2026-05-03guard 異常ログを stage タグ化。watch-kotohira-followup-guard.ts の runbook 自動追記に `[stage=ensurerecover
2026-05-03recover に ensure 判定を統合。recover-kotohira-followup-autopilot.ts を更新し、先頭で ensure を実行して healed-by-ensure を返せるようにした。再起動後も ensure_after を必須化し、失敗時は ensure-failed-after-restart(exit=3)で明示—
2026-05-03autopilot:start に ensure フックを追加。start-kotohira-followup-autopilot.ts で新規起動/ adopt 完了直後に followup-autopilot:ensure を自動実行するよう更新。起動直後の状態ずれを start フローで吸収—
2026-05-03guard を ensure→recover 二段化。watch-kotohira-followup-guard.ts を更新し、毎周期で followup-autopilot:ensure を先行実行、ensure_exit=2 のときだけ recover へフォールバックする方式へ変更。通常時の不要再起動を抑制—
2026-05-03autopilot ensure コマンドを追加。ensure-kotohira-followup-autopilot.ts(followup-autopilot:ensure(:5))を追加し、状態に応じて noop/adopt/restart を自動選択して ops-now で最終確認する整備導線を実装—
2026-05-03guard 異常時の自動アラート記録を追加。watch-kotohira-followup-guard.ts が recover失敗/timeout で停止する際、runbookへ異常行を自動追記するようにした。self-heal 監視の証跡を強化—
2026-05-03self-heal guard を追加。watch-kotohira-followup-guard.ts(followup-guard(:5))を追加し、waiting 中に followup-autopilot:recover を定期実行する自己復旧監視線を構築。通常時は no-op、異常時のみ復旧を実行—
2026-05-03autopilot 復旧コマンドを追加。recover-kotohira-followup-autopilot.ts(followup-autopilot:recover(:5))を追加し、ops-now 異常時に stop/start→再判定までを1コマンドで実行可能にした(正常時は no-op)—
2026-05-03autopilot を5系統一元管理へ拡張。ops-now-watch を state/健全性判定へ組み込み、adopt-running で既存稼働中プロセスを取り込めるよう整備。state: present で5系統 all alive を確認—
2026-05-03ops-now watch 監視ループを追加。watch-kotohira-followup-ops-now.ts を追加し、統合判定を定期実行。異常時は runbook へ自動アラート行を追記する仕組みを実装—
2026-05-03ops-now の重複実行を解消。check-kotohira-followup-ops-now.ts が followup-runtime-latest.md から status/pipeline/gaps exit を読む方式へ変更し、同じチェックの二重実行を排除。ログノイズと負荷を軽減—
2026-05-03ops-now 変化履歴を追加。followup-ops-now-history.md を追加し、followup-ops-now 実行時に状態変化がある場合のみ追記する方式にした。統合判定の時系列監査をノイズ少なく保持—
2026-05-03ops-now 最新レポートを追加。check-kotohira-followup-ops-now.ts 実行時に followup-ops-now-latest.md を自動更新するようにし、統合判定(HEALTHY / ACTION_REQUIRED など)をファイルで即共有可能にした—
2026-05-03followup 運用の統合チェックを追加。check-kotohira-followup-ops-now.ts を追加し、runtime/freshness/status/pipeline/gaps を1コマンドで評価して decision を返すようにした。引き継ぎ時の確認工数を削減—
2026-05-03runtime-watch 異常時の自動アラート記録を追加。watch-kotohira-followup-runtime.ts が runtime fail / timeout で停止する際、runbookへ異常行を追記するようにした。監視停止の証跡を自動保存—
2026-05-03runtime レポート鮮度チェックを追加。check-kotohira-followup-freshness.ts を追加し、followup-runtime-latest.md の更新時刻から stale 判定(既定20分)を返せるようにした。監視停止の早期検知を補強—
2026-05-03runtime history の重複抑止を修正。followup-runtime-history.md のシグネチャ比較ロジックを修正し、同一判定が連続した場合は追記せず unchanged でスキップするようにした—
2026-05-03runtime 変化履歴を追加。followup-runtime-history.md を追加し、followup-runtime 実行ごとに decision/exit が変化した時だけ行を追記する方式に。最新値だけでなく時系列監査も可能になった—
2026-05-03runtime 最新レポートを追加。followup-runtime 実行時に docs/_kotohira/followup-runtime-latest.md を自動更新するようにし、pipeline/autopilot/gaps の直近判定(HEALTHY含む)を1ファイルで即確認可能にした—
2026-05-03手動4系統を autopilot state に取り込み。followup-autopilot:adopt:5 を追加し、実行中 PID 群を state 化できるようにした。これにより当夜途中からでも autopilot:status=RUNNING / followup-runtime=HEALTHY の一元監視へ移行可能—
2026-05-0305:00 watch を最新版へ切替。既存 watch プロセスを再起動し、finished 後に followup-gaps:now まで実行する最新ロジックを当夜運用へ反映。05:00到達時の後処理漏れリスクを低減—
2026-05-03autopilot を4系統管理へ拡張。followup-at / followup-watch / followup-heartbeat-watch / followup-runtime-watch を state で一括管理するよう start/stop/status を更新。手動検知も4系統で判定する形に統一—
2026-05-03runtime 監視ループを追加。followup-runtime-watch(:5)(watch-kotohira-followup-runtime.ts)を追加し、waiting 中に pipeline/autopilot/gaps の統合判定を定期実行。監視の継続性を自動化—
2026-05-03status/runtime の終了コードを厳密化。autopilot:status を 2=MANUAL_RUNNING / 3=UNHEALTHY or NOT-RUNNING に分離し、followup-runtime が autopilot_exit=3 を失敗として扱うよう更新。異常見逃しを抑止—
2026-05-03autopilot status に手動3本検知を追加。state ファイルが無い場合でも ps ベースで followup-at/watch/heartbeat を検出し、MANUAL_RUNNING を表示。誤って「停止中」と判断して再起動するリスクを低減—
2026-05-03ランタイム統合チェックを追加。followup-runtime(:5)(check-kotohira-followup-runtime.ts)で pipeline / autopilot / immediate gaps を1コマンドで判定し、手動起動ラインでも健全性と次アクションを即時表示できるようにした—
2026-05-03watch 後処理に即時ギャップ監査を追加。followup-watch の finished 分岐で followup-gaps:now を自動実行し、05:00実行直後に「今すぐ手入力が必要か」を自動判定できるようにした—
2026-05-03autopilot 健全性チェックを追加。followup-autopilot:status(check-kotohira-followup-autopilot-status.ts)を追加し、state / marker / PID 生存を1コマンドで判定できるようにした。監視コマンドの定点確認を標準化—
2026-05-03watcher 後処理の marker 連携を修正。followup-watch が followup-finalize 実行時に --marker-file を引き継ぐよう修正し、05:00ラインでも finalize が正しい marker(followup-at-5-last-run.md)を参照するよう統一—
2026-05-03autopilot を任意時刻化。followup-autopilot:start/stop を --hour 対応へ拡張し、state/log を時刻別に分離。followup-at + followup-watch + followup-heartbeat-watch の3本を1コマンドで管理できる運用に更新—
2026-05-0305:00定点監視を自動化。followup-pipeline / followup-heartbeat / followup-heartbeat-watch を marker 指定対応に拡張し、followup-at-5-last-run.md を基準に待機中ヘルスログを継続記録できるようにした—
2026-05-03受け入れ再実行(標準)を確認。check:kotohira:acceptance で lint / unit は PASS、control は external blockers 4件により BLOCKED 継続。品質ゲートは維持しつつ、残タスクが外部依存であることを再確認—
2026-05-0305:00再催促サイクルを自動起動。汎用スケジューラ followup-at --hour=5 と marker 指定 watcher を追加起動し、followup-at-5-last-run.md で待機状態を記録。次回再催促の実行漏れを防止—
2026-05-03即時入力ギャップを解消。outreach の 03:00/03:10 実績欄を実測で更新し、followup-gaps:now で immediate_input=0 を確認。残りは external_waiting_input=2(tracker要記入)—
2026-05-03即時入力専用コマンドを追加。check:kotohira:followup-gaps:now を追加し、外部待ち項目を除外して「今すぐ埋める2件(outreach)」だけを抽出可能にした—
2026-05-03手入力ギャップを即時/外部待ちで分離。followup-gaps を改善し、残4件のうち「今すぐ入力すべき2件(outreach)」と「外部返信後に入力する2件(tracker)」を分離表示するようにした—
2026-05-0303:06時点の手入力ギャップを再整理。outreach の重複テンプレ行を整理し、followup-gaps を再実行。未入力は4件(outreach 2件 + tracker 2件)まで圧縮—
2026-05-0303:00後の未入力ギャップ監査を追加。check:kotohira:followup-gaps(check-kotohira-followup-manual-gaps.ts)を追加し、実績欄の未入力(実績記入/要記入)を自動抽出。現時点の残ギャップは5件—
2026-05-0303:03時点で後処理ラインの完走を再検証。check:kotohira:followup-watch -- --timeout-min=1 --poll-sec=1 を再実行し、marker=finished 即検知から followup-finalize / control まで成功することを確認(判定は引き続き BLOCKED)—
2026-05-0303:00後処理を復旧完了。followup-watch 内の初回 followup-finalize 失敗(runbook表検出)を修正後に followup-finalize を再実行し、tracker/runbook/outreach 反映まで完了。check:kotohira:control 再実行で decision=BLOCKED(外部依存継続)を確認—
2026-05-0303:00前の監視線を再確認。02:27時点で pipeline=waiting(残り約32分)を確認し、followup-at-3 / followup-watch / followup-heartbeat-watch の3プロセス稼働を runbook へ記録—
2026-05-0303:00前の定点記録をループ自動化。check:kotohira:followup-heartbeat-watch を追加し、5分ごとに heartbeat を記録、marker finished で自動停止。heartbeat は同一行の重複追記をスキップするよう改善—
2026-05-03定点監視ログの自動追記を追加。check:kotohira:followup-heartbeat(log-kotohira-followup-heartbeat.ts)を追加し、marker 状態と残り時間を runbook 実行ログへ1コマンドで記録可能にした—
2026-05-0303:00前の定点監視を継続。02:24時点で followup-pipeline=waiting(残り約35分)と followup-at-3 / followup-watch 稼働継続を確認し、runbookに定点ログを追記—
2026-05-0303:00前ヘルスチェックを記録。check:kotohira:followup-pipeline で waiting / 残り時間を確認し、followup-at-3 と followup-watch の稼働を実測で確認。runbook 実行ログへ反映—
2026-05-0303:00自動化の起動/停止を追加。followup-autopilot:start/stop を追加し、followup-at-3 + followup-watch の一括管理(pid/state/log)を可能にした。次回運用の再現性を向上—
2026-05-0303:00パイプラインの状態可視化を追加。check:kotohira:followup-pipeline(check-kotohira-followup-pipeline.ts)を追加し、marker 状態・残り時間・次アクションを1コマンドで確認可能にした—
2026-05-0303:00後の後処理監視を自動化。check:kotohira:followup-watch(watch-kotohira-followup-finish.ts)を追加し、marker が finished になったら followup-finalize → control を自動実行する監視を開始—
2026-05-0303:00実行後の追記を自動化。check:kotohira:followup-finalize(finalize-kotohira-followup-run.ts)を追加し、followup-at-3 の marker 完了後に tracker/runbook/outreach へ結果行を追記できるようにした(waiting時は安全に skip)—
2026-05-03blockerログの並びを整理。external-blockers-tracker.md のコンタクトログで実績系(実時刻)と (想定) 行の順序を分離し、03:00実行後の確認性を向上—
2026-05-0303:00自動実行に証跡ファイルを追加。run-kotohira-followup-at-3.ts を更新し、docs/_kotohira/followup-at-3-last-run.md に waiting/finished/exit_code を記録。ジョブを再起動して反映済み—
2026-05-0303:00送信ログの記入テンプレを追加。outreach/cutover-escalation-2026-05-03.md の送信ログに 03:00 / 03:10 の実績記入行を先置きし、実行後の証跡更新を高速化—
2026-05-0303:00運用コマンドを固定化。cutover-day-runbook-2026-05-07.md に「03:00前/03:00/03:00後」の実行コマンドを追記し、運用時の判断迷いを排除—
2026-05-03完了定義に03:00運用を追記。done-definition.md の日次運用ルールに followup-cycle / followup-at-3 と「(想定)表記ルール」を追加し、実績ログとの混同を防止—
2026-05-0303:00実行後の記録手順を固定。cutover-day-runbook-2026-05-07.md に「3分以内の更新手順」(tracker/outreach/control/runbook追記)を追加し、実送信後の記録漏れを防止—
2026-05-0303:00自動実行ジョブを起動。check:kotohira:followup-at-3(run-kotohira-followup-at-3.ts)を追加し、次の03:00(JST)で followup-cycle を1回自動実行する待機を開始。手作業の実行漏れリスクを低減—
2026-05-0303:00即送信文面を固定。outreach/cutover-escalation-2026-05-03.md に EXT-01/02 向けの「03:00到達時の即送信版」を追加し、送信ログに準備時刻を記録。再催促時の文面迷いを排除—
2026-05-03再催促サイクルを1コマンド化。check:kotohira:followup-cycle(run-kotohira-followup-cycle.ts)を追加し、followups → followups:log → control を連続実行。followups:log は同一行の重複追記を抑止し、03:01想定の再実行でも冪等に運用できることを確認—
2026-05-0303:00再催促判定ログを自動化。check:kotohira:followups:log(scripts/log-kotohira-followup-check.ts)を追加し、external-blockers-tracker.md のコンタクトログへ send now / prepare soon 判定を自動追記可能にした。03:01想定では send now=2(EXT-01/02)を記録—
2026-05-03受け入れ full を琴平スコープE2Eに修正。test:e2e:kotohira と e2e/kotohira_smoke.spec.ts を追加し、check:kotohira:acceptance:full で実行する対象を全体E2Eから琴平受け入れに一致させた。実行結果は lint PASS / unit 1627 PASS / kotohira E2E 2 PASS、control は外部依存で BLOCKED—
2026-05-03受け入れを2段階化。check:kotohira:acceptance:full(E2E込み)を追加し、done-definition.md に標準/最終確認の使い分けを明記。standard再実行で lint PASS / unit 1627 PASS を確認—
2026-05-03controlを拡張。check:kotohira:control 実行時に brief 生成まで自動化し、status-history.md に brief_exit 列を追加して履歴追記。最新は BLOCKED (suite=2, snapshot=0, brief=0)—
2026-05-03運用ブリーフを自動生成。check:kotohira:brief を追加し、operator-brief-latest.md に decision / demo進捗 / 直近優先アクション / 外部ブロッカーを自動集約—
2026-05-03完了定義を固定。done-definition.md を新設し、READY判定条件・否認条件・日次運用(09:00/18:00 control + 変更後acceptance)を明文化。完了主張のぶれを排除—
2026-05-03latestレポートに履歴を添付。snapshot-kotohira-status.ts を更新し、status-latest.md に status-history.md の直近判定(最大5件)を自動表示。共有時に最新判定と推移を1枚で確認可能にした—
2026-05-03判定履歴を自動蓄積。check:kotohira:control 実行時に status-history.md へ READY/BLOCKED/FAIL を追記するよう更新。最新行は BLOCKED(suite=2, snapshot=0)—
2026-05-03受け入れテスト運用を追加。check:kotohira:acceptance を追加して毎回 lint + unit test + control を実行。最新実行は lint PASS / unit 1627 PASS、外部依存のため decision=BLOCKED—
2026-05-03コントロールタワー化。check:kotohira:control を追加し、suite 実行 + snapshot 生成 + READY/BLOCKED/FAIL 判定を1コマンド化。最新判定は decision=BLOCKED—
2026-05-0303:00再催促対象を事前確定。check:kotohira:followups --at=2026-05-03T03:01:00+09:00 で send now=2(EXT-01/02)を確認し、TRAPOL向け再催促の即時実行準備をログ化—
2026-05-03ステータスの自動出力を追加。check:kotohira:snapshot を追加し、cutover/routes/blockers/followups の最新実行結果を status-latest.md に自動集約。共有用の単一参照を作成—
2026-05-03再催促計画を自動抽出。scripts/plan-kotohira-followups.ts と npm run check:kotohira:followups を追加し、「今すぐ送信」「直近準備」を自動表示。現状は send now=0 / prepare soon=2(EXT-01/02, 03:00)—
2026-05-03外部ブロッカー監査を強化。external-blockers-tracker.md に次回確認時刻を追加し、check:kotohira:blockers で followup due(再催促到来件数)を自動表示。現状は waiting=4 / overdue=0 / followup due=0—
2026-05-03外部ブロッカー監査を自動化。scripts/check-kotohira-external-blockers.ts と npm run check:kotohira:blockers を追加し、EXT-01〜04 の待ち/期限超過を機械判定。suite にも統合(cutover BLOCKED / routes PASS / blockers BLOCKED)—
2026-05-03外部ブロッカー管理を追加。external-blockers-tracker.md を新設し、EXT-01〜04(Token/緊急連絡先/文面3項目/同席確定)を期限・状態・次アクション付きで管理開始—
2026-05-03チェックをスイート化。scripts/check-kotohira-suite.ts と npm run check:kotohira:suite を追加。実行結果: cutover=BLOCKED(外部待ち)/ route-health=PASS(12/12)—
2026-05-03ワンコマンド運用化。package.json に check:kotohira:cutover / check:kotohira:routes を追加。実行結果: cutover FAIL=0 / BLOCKED=3、routes 12/12 PASS—
2026-05-03アンブロック即応手順を追加。cutover-unblock-fastpath.md を新設し、外部返信受領後 15 分で CL-01/03/04a を解除する実行順(deploy→文面確定→再判定)を固定化—
2026-05-03本番ルート事前チェックを実施。npx tsx scripts/check-kotohira-routes.ts https://did-event.vercel.app で 12/12 PASS(events/send/premium/merchant 含む)。CL-06 は認証導線とDB書込証跡の取得待ち—
2026-05-03自動監査を運用に組み込み。scripts/check-kotohira-cutover-readiness.ts を追加し、PASS/BLOCKED/FAIL を機械判定。初回実行結果は FAIL=0 / BLOCKED=3(Token未設定、本番richmenu ID未生成、5/6文面プレースホルダー)—
2026-05-03当日実行の証跡テンプレを追加。cutover-day-runbook-2026-05-07.md(当日タイムライン + 実行ログ)と smoke-evidence-template-2026-05.md(CL-06/07 証跡台帳)を新設し、当日記録を標準化—
2026-05-03外部依存の即応テンプレを追加。outreach/cutover-escalation-2026-05-03.md を新設し、TRAPOL向け(Token/緊急連絡先)・三好氏向け(5/6配信3項目)・2時間後再催促文面を整備—
2026-05-03Critical是正。CL-02 を「本番Channel + 高木test受信LINE」へ一意化、CL-03 を BLOCKED 明示、CL-05 にロールバックrunbook参照を追加。docs/runbooks/kotohira-webhook-cutover-rollback.md を新設—
2026-05-03CL-08 を前倒しで進行。ops-monitoring-5-8-to-5-14.md の 5/8〜5/14 監視担当(09:00/18:00)を確定。残る未確定は TRAPOL社電話番号のみ—
2026-05-03当日運用の証跡基盤を追加。ops-monitoring-5-8-to-5-14.md を新設(5/8〜5/14 の監視表、連絡体制、異常時テンプレ)。outreach に 5/2 最終稿と 5/6 最終稿ドラフトを分離し、文面確定作業を前倒し—
2026-05-035/7 切替チェックリストを厳格判定版へ更新。CL-04 を deploy/attach に分割、CL-05.5(名寄せ)を追加、証跡列と現在ステータス列を導入。偽完了を防ぐ5つのゲート(G-1〜G-5)を明記—
2026-05-035/7 切替チェックリストを担当・期限付き運用版に拡張。CL-01〜08 を追加し、Owner/期限/DoD を明記して当日オペレーションへ直結する形に再編—
2026-05-035/7 切替直前の実行チェックリストを追加。未完タスクを「受領→テスト→切替→監視」の実行順に整理し、BASE_1/3/4/5/6 と KOTO_2/5/6/7/8/10 の当日確認項目を明文化—
2026-05-01残課題 10 件完走 — UX 修正 + 運用基盤 + テスト網羅。WBS 完走後の再クロールで発見した残 10 件を実装: (1) マイページに「送る」ショートカット追加 / (2) 本番ホームフッターを 6 リンクに拡張 / (3) 用語統一「住民証 NFT → 年次会員証 NFT」/ (4) /api/cron/events/archive 新設 (終了 +14 日 + isPublic=true の保守的閾値) / (5) getPremiumBenefitItems(phase) 純関数化 / (6) mergeMerchantPlaces / buildMerchantSellerIds 純関数化 / (7) handlePostbackEvent を別ファイル化 (Next.js Route export 制約対応) / (8) ヘルスチェックスクリプト scripts/check-kotohira-routes.ts / (9-10) テスト 22 件追加(election 4 + place-owner 4 + postback 6 + merchant 8)。test:unit 1571→1593 件 pass45eadca6
2026-05-01WBS 完走 — 6 ページ本番化 + 統合実装 3 種。WBS 厳密クロールで「実装済」表記の実態が demo のみで本番未着手だった機能を一気通貫で本番化。KOTO_5 イベント一覧 (/c/kotohira/events) / KOTO_10 P2P 送金 (/c/kotohira/send 4ステップ) / KOTO_11 プレミアム購入 (/c/kotohira/premium/checkout Stripe Checkout 連携) / KOTO_12 特典一覧 (/c/kotohira/premium リダイレクト + about/premium に CTA 追加) / KOTO_14 加盟店オーナー画面 (/c/kotohira/merchant)。統合 3 種は (a) 加盟店通知 fire-and-forget → after() 化(Vercel Functions silent failure 回避)、(b) リッチメニュークリックログ webhook postback 統合、(c) 選挙文言フィーチャーフラグの SSR 対応 + force-dynamic 追加。strict-reviewer 指摘 3 件(fire-and-forget / SSR キャッシュ / merchant sellerIds バグ)も同時修正。test:unit 1571 件 pass、lint clean、build OK52ea1e62
2026-04-30加盟店マップ・一覧ページ 本番ホーム統合。/c/kotohira フッターから /c/kotohira/places(カテゴリ別25件全表示)と /c/kotohira/map(Leaflet マップ)への 2 本リンクに分離。旧 /map 404 を解消。/c/[slug]/map に slug 別中心座標フォールバック導入(kotohira: 34.185, 133.816, zoom 16)。LeafletMap で lat/lng null フィルタ追加(Cannot read properties of null (reading 'lat') クライアントクラッシュ防止)。Playwright 動的検証(home/places/map 全 PASS、map: tile=24 marker=7)+ test:unit 1558 pass + lint clean + build OK9a616660
2026-04-30加盟店住所 15 件 DB 反映 + 調査ドキュメント整備。OSM Nominatim dry-run で 7 件マッチ / 18 件未発見、Web 検索(公式サイト・観光協会・marugame2.jp 等)で 18 件の候補住所を取得、[暫定] 2 件(さぬき名物 骨付鳥 田中屋・ことね本館)を除く 15 件の Place.address を本番 DB に UPDATE。scripts/community/apply-kotohira-place-addresses.ts 新設(dry-run/apply 切替)。geocode-places.ts の User-Agent ヘッダから日本語コミュニティ名を除外(undici ByteString エラー修正)20ac4774
2026-04-305/7 移行配信 管理 UI /admin/blasts/kotohira-migration 新設。3テンプレ(preview / complete / welcome)× 3配信先(test / community / broadcast)の選択 → 確認ダイアログ → 送信 → 結果表示。dispatchFlexToCommunity / dispatchFlexBroadcast / dispatchFlexToLineUser の汎用ヘルパも追加。週次配信ページにも導線カード設置。+10 テストで test:unit 1558 passcb520d2f
2026-04-295/7 リニューアル移行 LP /c/kotohira/about/migration 新設(フル版6セクション・状態別CTA)+ Flex 3種(5/2 予告 / 5/7 切替完了 9バブル carousel / 新規友だち welcome)+ webhook で kotohira系のみ新welcome に切替。テスト +16件で test:unit 1548 passa903227f
2026-04-29会員NFT 自動発行 + 琴平デジタル町長選挙基盤 一気通貫実装。Stripe webhook 経由で年度ごとに会員 NFT (nftType=membership, mock chain, /nft/{slug}/{year}/membership.svg) を発行。Election / ElectionCandidate / ElectionVote 3 テーブル追加 + 立候補/投票 API + UI (/c/kotohira/election) + 状態遷移 cron。法務確認は別トラック (Q2 と一緒に三好さん経由で町法務へ)。テスト 23 件追加で全 1532 件 pass、lint clean、build OK3c992a32 280255e4
2026-04-29公開 WBS ページ /c/kotohira/demo/wbs 新設、demo top に導線カード追加、/kotohira-playbook-update skill 拡張(wbs.md+playbook 二重更新義務化)e057be6b
2026-04-29本 wbs.md 新設(playbook §12 + 検証レポート + チェックリストを統合)e057be6b
2026-04-28チェックリスト No.3/7/9 完了(tier サブスク経路 / postback ログ / 選挙フラグ)1382fdeb
2026-04-26KOTO_5 イベント参加登録 UX 改善 E1/E2/E347ab31fb
2026-04-26既存成果物の定期厳格レビュー基盤 strict-audit 新設1951dcf1
2026-04-24KOTO_2 リッチメニュー動的切替 3トリガー配線253268cc
2026-04-24KOTO_7 加盟店サムネ 21/25 反映fad5ee49
2026-04-24内部見積資料を新設(社内限定)4bb10b0d

詳細な日次差分ログは docs/_kotohira/_internal/playbook.html §10 を参照

更新したい時は docs/_kotohira/wbs.md を編集 → push してください。
/kotohira-playbook-update skill が自動で反映を支援します。