HANDOFF · 2026-05-24 · 続編 #3
会員ガイド写真 — Symbolic Hero リワーク
「外観に寄った hero」→「施設を象徴する1枚」へロジック改善。yamato-club トップサムネ修正。Atelier 軽井沢 picks 確認。スコープ外で温まった写真キュレーション基盤(2層分類エンジン + GSheet matrix)をそのまま継承。
1. 現在地
全11施設のガイドサイトと yamato-club がデプロイ済み・classifier auto-picks v1 反映済み
- 分類エンジン稼働中:
scripts/classify_photos_v2.py が Layer1 (Gemini 2.5 Flash Lite で broad分類) + Layer2 (Gemini 2.5 Flash で 14スロット精密判定) を実行。キャッシュは scripts/photo_classifier_cache/{slug}.json
- auto_picks 自動マージ:
scripts/auto_picks_from_classifier.py が classifier top1 score を scripts/auto_picks.json に書き出し、build_member_guides.py が起動時に FACILITIES[*]["photo_picks"] へマージ
- 写真ステータスGSheet: 写真ステータスマトリクス v2(列=施設・行=14スロット×5候補・各セルに
=IMAGE() 表示)
- 哲学MD:
design_refs/member_guide_photos.md(5スロット定義・ステータス記号・採用フロー)
- 稼働中サイト:
- yamato-club.pages.dev = Member's Index
- 10施設ガイド: tateyama / kyoto / shibuya / karuizawa / minamiboso / kujukuri / minamihayama / karuizawa_core1 / karuizawa_core2 / kawaguchiko(全て
yamato-{slug}-guide.pages.dev)
- 晴海は別系統(
output/guides/_deploy/harumi/、build_member_guides には含まれていない)
2. Otake さんからの最終フィードバック(このセッション末尾)
- yamato-club トップで「晴海」と「京都」のサムネがイメージ写真(プレースホルダ系)になっている → 実物の symbolic shot に差し替え必要
- Hero 全般が「外観」に寄りすぎ → 施設の主訴/魅力/特徴がわかる1枚にしてほしい
- 例: 九十九里は外観がそれほど特徴的ではないので、プール/庭の様子が良い
- 例: 館山も外観でなく 夕景プール+海 など
- Atelier 軽井沢の写真が選択されていない(と Otake さんから見える状態) → yamato-club のサムネか hero どこかで欠落している可能性。確認・修正
- 切り分け: ページ内の
Before Your Stay 等の「リンク部分の小サムネ」はイメージ写真でも OK、トップ hero と yamato-club サムネは symbolic shot にする
3. このセッションで残した「やり残し」
次セッションで進めるべきこと
- yamato-club トップサムネ確認・修正
output/deploy/yamato_club/images/f_{slug}.{ext} の10枚を全て目視確認
- 「晴海」「京都」がプレースホルダになっている → 実物の hero と差し替え
- 晴海は本リポジトリの build_member_guides に含まれていないため別パス。
output/guides/_deploy/harumi/assets/hero.* を f_harumi.* として配置
- 軽井沢(Atelier)も同様に
f_karuizawa 確認
- Hero ロジック改善(重要): classifier の Layer 2 プロンプトに「外観に寄らず、施設の主訴/特徴/魅力が1枚で伝わる shot を hero に」と明示
- 現状 hero=「施設の世界観を1枚で語る代表ショット(外観引き+空・自然光)」と定義してあるので「外観」が強調されている
- 修正案: 「施設の主訴・特徴・魅力が1枚で伝わるショット。外観のみに限らず、プール/庭/サウナ/眺望など、その施設で一番強い体験を象徴する1枚を優先」
- 修正後
python scripts/classify_photos_v2.py --all --force で再分類(10分)→ auto_picks_from_classifier.py 再実行 → build + deploy
- もしくは「symbolic_hero」という新スロットを追加してそちらを yamato-club サムネ用にする選択肢もあり(hero/arrival との分離)
- Atelier 軽井沢 picks 確認: 現在の picks は
hero: TheForestRetreatKaruizawa_02676_s.jpg [score 0.9] -- テラスでのBBQ/食事
arrival: TheForestRetreatKaruizawa_73793_s.jpg [0.95] -- 玄関
facility: TheForestRetreatKaruizawa_91614_s.jpg [1.0] -- 豪華なバスルーム
Otake さんから「選択されていない」と見える状態の原因を特定(yamato-club サムネが古い or hero asset の copy 失敗)
- 九十九里 hero 差し替え: 現在
BEST SPA 99_外観_032.jpg(外観・駐車場)→ BEST SPA 99_1F_プール_309.jpg 系(プール×海×サウナ)等へ。手動 override or プロンプト調整で対応
- 手動 picks override 機構: classifier auto-picks を尊重しつつ、Otake さんが「ここはこのファイル」と指定したものを上書きできる
scripts/manual_picks.json を作る案
{
"kujukuri": {"hero": "BEST SPA 99_1F_プール_309.jpg"},
"tateyama": {"hero": "TheTravelersChateauTateyama_281231_s.jpg"}
}
マージ順: defaults → auto_picks → manual_picks → FACILITIES dict 手動
- Drive API thumbnail lookup の絶対パス問題:
build_photo_matrix.py の resolve_id が picks に絶対パスが入っている時に Drive API へ full path を渡してエラー。Path(name).name で basename に変換するパッチが必要(matrix の候補1セルの thumbnail が一部欠落している原因)
4. 遠い未来(このスコープを超えて)
- Ops レーン本格運用: floor_plan / keybox / utilities / parking_access / garbage / emergency の 6 スロットを枠として用意済み。撮影必要リストを GSheet 別シートに「不足施設×不足スロット」として一覧化 → 次回フォトグラファー手配判断資料
- 会員ガイドサイトに Ops 章追加:
build_member_guides.py の chapters_spec に operations 章を追加 → 認証付きエリアにのみ表示(既存 yamato-club Basic Auth 拡張 or 別 Subdomain)
- 晴海の統合: 現状別 build path。
build_member_guides.py の FACILITIES に harumi 追加して統一管理
- kawaguchiko / karuizawa_core1 など「pro photo curated」施設の picks ロックダウン: classifier 上書きで前回の手動 curated picks が変わってしまった。重要施設は
auto_picks_excluded_slugs や手動 picks override で保護したい
5. 実務情報(パス・URL・コマンド)
主要ファイル
| 用途 | パス |
| 哲学 SoT | design_refs/member_guide_photos.md |
| 分類エンジン | scripts/classify_photos_v2.py |
| 分類キャッシュ | scripts/photo_classifier_cache/{slug}.json |
| auto-picks 生成 | scripts/auto_picks_from_classifier.py |
| auto-picks 結果 | scripts/auto_picks.json |
| ビルドスクリプト | scripts/build_member_guides.py |
| matrix GSheet ビルダー | scripts/build_photo_matrix.py |
| yamato-club サムネ | output/deploy/yamato_club/images/f_{slug}.{ext} |
| 各施設 _deploy | output/guides/_deploy/{slug}/ |
主要URL
典型コマンド
# 分類実行(incremental — 既存キャッシュは skip)
python scripts/classify_photos_v2.py --all
# 分類強制再実行(--force)
python scripts/classify_photos_v2.py --facility kujukuri --force
# auto_picks.json 再生成
python scripts/auto_picks_from_classifier.py
# 全施設リビルド + リサイズ + デプロイ
python -X utf8 scripts/build_member_guides.py
# 続けて各施設 _deploy へコピー + 大画像リサイズ + wrangler deploy
# matrix 再生成
python scripts/build_photo_matrix.py --spreadsheet-id 11ne-fmjjf4CyLqgcI6CFb6qwRIva75kyeGue_AsDINo
FACILITIES 定義(picks の優先順位)
build_member_guides.py の流れ:
1. FACILITIES dict に手動 photo_picks を書ける(直接編集)
2. auto_picks.json が存在すれば、起動時に classifier 由来 picks をマージ(auto が優先)
3. _resolve_pick で絶対パス / 相対名 / 部分一致 の順に解決
4. photo_picks 未指定スロットは collect_photos の機械順 fallback
6. 次セッション冒頭の動き出し例
1) このハンドオフ HTML を Read で読む
2) output/deploy/yamato_club/images/ を ls で全件確認 → f_harumi / f_kyoto / f_karuizawa のサイズ・中身を見てプレースホルダ系か symbolic か判定
3) プレースホルダなら、各施設の _deploy/{slug}/assets/hero.* から symbolic な画像を選び直して f_{slug}.{ext} へ copy
4) classify_photos_v2.py の LAYER2_PROMPT 内 hero 定義を「施設の主訴・特徴・魅力が1枚で伝わる」へ拡張(具体例として九十九里=プール、館山=夕景プール+海 を入れる)
5) --all --force で再分類 → auto_picks_from_classifier.py → 全施設リビルド・リデプロイ
6) yamato-club サムネ更新・デプロイ
7) Otake さんに「symbolic hero v2 デプロイ完了。九十九里 hero がプール × 海 になったか確認お願いします」と報告