"写真1〜3枚+ひとこと→投稿文→SNS投稿画像(1:1+9:16・実写無加工合成)→10〜20秒ショート動画まで1パス。確認は切り口選択と投稿前の2回。ゲートskip禁止。Triggers: この写真で投稿作って/写真を投稿用にして/投稿画像にして/写真から動画も。NOT: 「記録」→nichijo、セリフ型動画→short-video-create"
Resources
7Install
npx skillscat add thiguchi125-debug/claude-config/photo-post Install via the SkillsCat registry.
photo-post — 写真+ひとこと → 投稿文・画像・動画の統合1パス
設計正本: 同ディレクトリ DESIGN.md(2026-07-05草川承認)。以下は実行手順。
定数
- CHROME:
/Applications/Google Chrome.app/Contents/MacOS/Google Chrome - テンプレ:
~/.claude/skills/photo-post/templates/(card_band=下帯型/card_side=サイドバー型/card_full=座布団型/video_overlay/video_endcard) - 動画:
~/.claude/skills/photo-post/scripts/make_video.sh -o OUT.mp4 -e ENDCARD.png [-t OVERLAY.png] PHOTO...(合計10秒以内=写真1枚6.5秒/2枚各3.4秒/3枚各2.4秒+エンドカード2.5秒・無音・9:16 1080×1920 30fps。よほどの品質でなければ10秒超は完視聴が落ちる=2026-07-05草川指示) - 出力:
~/outputs/photo-post/<YYYY-MM-DD>_<テーマ>/(絶対パス・cwd依存禁止) - ブランド: ライム#c7ff4a/濃緑#1f5a3a/最濃緑#0f3d27/生成り#f3efe4・絵文字禁止・他議員氏名禁止
Step 1: 受付
- 写真パス(1〜3枚)+ひとことを受け取る。写真未指定で「いい写真選んで」→ photo-curator に候補3〜5枚出させて草川選択。
- HEIC は
sips -s format jpeg <src> --out <dst>.jpgで変換。EXIF向きはpython3 -c "from PIL import Image, ImageOps; ImageOps.exif_transpose(Image.open('<src>')).save('<dst>')"で正規化(位置情報も落ちる)。実写の生成的改変はしない(色調・トリミングのみ可)。 - 出力ディレクトリを先に
mkdir -pしてそこで作業する。 - モード判定:
- A 統合1パス(既定): 写真+ひとこと → 以下全Step
- B 画像のみ: 写真だけ/「画像だけ」→ Step 2の投稿文を作らず画像コピーのみ、Step 5スキップ
- C PAIR: spark等から投稿文持ち込み → Step 2は文生成せずコピー抽出のみ
Step 2: 接地+文・コピー同時生成
- アーカイブ接地(省略禁止):
grep -rl "<話題ワード>" ~/.claude/agents/knowledge/kusagawa_archive/{01_council,02_publications,05_resources,06_election}/+草川独自表現も並列。ヒット1〜2件だけ読む。 - 同じ素材から一度に生成する:
- (a) 投稿文 = 種のサイズに応じてX/Threads等1〜2PF・voice-dna整合・絵文字なし・禁止フレーム回避・架空エピソード禁止・おうむ返し禁止
- (b) 画像用コピー = 見出し2行(H1A/H1B・各15字前後)+サブ1行(SUB)+タグ(TAG・#亀山市等)
- 文と画像コピーを別々に作らない(トーン統一+燃費)。
Step 3: ✋確認1回目(1画面で)
AskUserQuestion で提示: 切り口+投稿文案+デザイン3案(下帯型=王道・写真が主役/サイドバー型=情報整理・文字多め向き/座布団型=コピーが主役・写真は背景)+動画要否(既定ON)。草川選択後に次へ。
Step 4: 画像合成(固定順序=参照→採寸→写真→レンダ→機械採点→目視1回→模写採点・2026-09-05/09-15)
4-R 参照1本+5軸目標(着手前・skip禁止)
(2026-09-15 草川指示で追加・正本=memory feedback_design_reference_library_first)
~/.claude/agents/knowledge/design_system/references/_INDEX.mdから写真主体のSNS投稿画像の参照を1本だけ選び、画像を自分でReadする(カルテを読むだけで進まない)。1:1と9:16は同じテンプレの2レンダなので参照は共有する。Step3で選ばれたテンプレ(下帯型/サイドバー型/座布団型)に構図が近いものを選ぶ。- 5軸目標を数値で書き出す(下の0と同じメモに): ①級数ジャンプ率 ○倍(H1÷SUB)②色数 ○色と役割 ③図形語彙 ④写真占有率 ○% ⑤アイコン・図形アクセント ○点。
- 実写無加工の制約が優先。②③⑤はデザインレイヤー(帯・座布団・タグ・幾何アクセント)だけで数え、写真の中の色は色数に入れない。
- ④は写真を加工せずテンプレの選択とトリミング(
{{FOCUS}}・帯幅)で合わせる。参照の写真占有率に届かないなら帯を細くするか下帯型へ寄せる。写真に図形を重ねて占有率を削る方向には動かさない。 - ⑤は、参照がイラスト主体ならその参照は選ばない(写真主体の参照に取り替える)。参照がアイコン・図形アクセントを使うなら、デザインレイヤーにピル・角マーカー等で入れる。被写体の顔・主題に重ねない。絵文字・人物イラストは使わない。
- 参照未整備時(2026-09-15時点で該当=1:1・9:16の判型フォルダが無い): Step3の確認画面に「参照未整備」と1行添え、作る前に design-inspiration-researcher を起動してプロ制作の写真主体SNS投稿画像(報道機関・自治体・公的機関の公式アカウント等。議員の自作物は不可)を1〜3本収集→
references/sns_photo/へ画像+_karte.md(5軸採寸)を回収し_INDEX.mdに行を足してから入る。thumbnail/(16:9)は判型が別なので代用しない(memory feedback_reference_must_match_format)。- 収集できない場合のみ、草川に「参照なしで作る」と明示し、下の5の模写採点は「参照未整備のため未実施」と記録する。黙って飛ばさない。
4-S 採寸→合成→採点
- 採寸を先に確定:
~/.claude/scripts/specs.jsonのimage.1:1/image.9:16(読み込み口specs.py)からセーフ域・最小級数を読み、H1の級数・{{FOCUS}}(被写体位置・顔は画面高25〜35%)を着手前に決めて書き出す。 - 選択テンプレをコピーし
{{PHOTO}}(file://絶対パス)/{{H1A}}/{{H1B}}/{{SUB}}/{{TAG}}/{{FOCUS}}(既定center 35%・被写体位置に合わせ調整) を置換(sed可)。 - レンダ2枚:
"$CHROME" --headless --disable-gpu --hide-scrollbars --screenshot=<out>_sq.png --window-size=1080,1080 file://<html> "$CHROME" --headless --disable-gpu --hide-scrollbars --screenshot=<out>_9x16.png --window-size=1080,1920 file://<html> - 機械採点が通るまで目視しない:
python3 ~/.claude/scripts/check_overflow.py --canvas 1080x1080 <html>/--canvas 1080x1920、feed_preview.py still <1:1画像>/short <9:16画像>で縮小コンタクトシートを作る。FAILは font-size/FOCUS の数値を直して再レンダ。可読性フロア: 最小フォント21px相当・9:16はSNS UIセーフゾーン(下240px/右150pxに重要要素を置かない)。 - 目視は最後の1回=PNGを自分でRead(サブagent委譲禁止): 文字切れ・重なり・被写体と帯の衝突・コントラスト。崩れは数値を直して再レンダ→再度3から(最大3周)。
- 模写採点(skip禁止・2026-09-15追加): 4-Rの参照画像と出力PNG(1:1・9:16の2枚)を両方自分でReadし、5軸を数値比較(サブagent委譲禁止)。可の基準=①参照の70%以上 ②参照−1色まで ③参照の語彙の半分以上 ④参照の70%以上 ⑤参照が使うなら必ず使う。各画像5軸中4軸「可」で合格、不合格はテンプレ・級数・FOCUSの数値を直して2へ戻る。採点5行×2枚と素材の使い残し(渡された写真枚数 vs 画像・動画で使った枚数)1行をチャットに出す。
- 配信面ゲート(勝負所のみ・投稿画像は原則通す): 3のコンタクトシートを持って
feed-visual-reviewerを起動しPASSを取る。原寸で読めても実表示幅(400px/グリッド180px)で潰れていれば不合格。写真上の文字が読みにくい指摘は対症療法せずテンプレ変更(座布団型等の構造分離)で解決。natural-design-reviewer は紙の物理破綻用なので投稿画像では呼ばない。
Step 5: 動画生成(既定で続行・追加入力不要)
- video_overlay.html に H1A/H1B を差し込み→透過レンダ:
--default-background-color=00000000 --window-size=1080,1920→ overlay.png - video_endcard.html に
{{PORTRAIT}}/{{SLOGAN}}/{{TAG}}を差し込み→通常レンダ 1080×1920 → endcard.png- デザイン = 枠付きフォトカード(本人写真をライム枠のカードに額装+幾何アクセント+スローガン+名前)。実写のAI改変・白背景の切り抜きはしない(襟と背景が同じ白で破綻しやすい=2026-07-05検証で確認)。
{{PORTRAIT}}=file://~/.claude/skills/photo-post/assets/kusagawa_portrait_src.jpg(拳ポーズ公式写真・常用ブランド素材。白背景のままカードに額装するので無加工でよい){{SLOGAN}}= 既定声をチカラに(またはええやん亀山。「声を、チカラに。」の句読点付きは使わない){{TAG}}=#ええやん亀山等- (
scripts/cutout_portrait.pyは GrabCut 透過切り抜きの実験実装として残置。現行エンドカードは枠付きカード方式のため通常は使わない。)
make_video.sh -o <出力dir>/video.mp4 -e endcard.png -t overlay.png <写真...>- 末尾付近のフレームを1枚抜いて(
ffmpeg -ss <尺-1> -i video.mp4 -frames:v 1 frame.png)Readでエンドカード(人物と文字の重なり無し)を確認。
Step 6: 安全ゲート(skip禁止・まとめて1回)
content-fact-checker(投稿文・コピー内の数値/固有名詞/計画名)→ content-risk-reviewer(8軸+写真固有軸: 第三者の顔・子どもの顔・車ナンバー・個人宅特定・位置情報・公選法文書図画)。指示文に「画像PNG・動画フレームも確認対象」と ledger: <このテーマの保存先>/_ledger.json の1行を明記(テーマ内台帳)。画像・動画に焼く文言が投稿文と同一なら別起動せず台帳から継承する。HIGH以上はASK_USER・CRITICAL即停止。
Step 7: ✋確認2回目(最終)→保存
- 完成セット(投稿文+画像2枚+動画)を提示→草川OK後に1回で保存(D2原則)。
- 保存:
~/outputs/photo-post/<日付>_<テーマ>/に全ファイル- Drive
~/Library/CloudStorage/GoogleDrive-t.higuchi125@gmail.com/マイドライブ/📱動画素材/へ画像・動画を cp ミラー - 📣SNS投稿管理DB(ds
1bd98deb-)に1ページ(タイトル先頭📸・投稿文全文+画像/動画のDriveパス記載・ステータス=未着手)
- nichijo日次ログに🔖台帳1行:
🔖 HH:MM 〈テーマ15字〉→photo-post → <mention-page url="...">ページ名</mention-page> - 出来が良いレイアウトが生まれたら design_system への「SNSカード」テンプレ昇格を提案(強制しない)。
やらないこと
- 写真自体のAI生成改変(nano-banana等)はしない。AI画像生成ルートは 2026-09-05 に廃止(画像は HTML/CSS→Chrome→PNG のみ)。
- 7PF一括生成(sns-content-creator)・セリフ型ショート動画(short-video-create)・印刷物(design-studio)。
- BGM付与・本人ナレーション(スマホ編集の領分)。
📌 恒久ガードルール
(実運用フィードバックをここに追記する — feedback_rules_reside_in_agents 運用)
写真+動画+ひとことの発信依頼は最初からフル(合成画像+動画)を回す(2026-07-05)
「SNS投稿:〜」+写真3枚+動画の依頼で、テキスト仕上げ+安全ゲートだけで止めて提示→草川「写真が何も編集されてない、デザイン合成じゃないのか」「言われたことは全てやれ」と強い叱責。写真・動画が素材として渡された時点で期待は本スキルの完成形(実写無加工+デザインレイヤー合成の1:1+9:16+ショート動画)まで。
- 写真(1〜3枚)+ひとこと/投稿文+(あれば動画)が来たらモードAをフルで自走(投稿文→合成画像→動画→安全ゲート→Drive/Notion保存→nichijo🔖台帳)。テキストだけ返して止めない
- 確認はStep3・Step7の2回まで。判断済みの点を蒸し返さない
- 締め(📱動画素材ミラー・📣投稿管理DB保存・🔖台帳)まで自走して完了扱いにする
各写真は必ずRead(画素確認)してから採否・ラベル付けする
ファイル名から中身を推測して「PXL_...517=ヘリ」と誤認し、実際は体育館全景(顔写り込み=掲載見送り対象)を動画に混入させかけた(2026-07-05)。肖像権NGと決めた写真の取り違えは事故になる。複数枚はコンタクトシート1枚を生成して自Readし、ファイル名→内容→縦横を確定してから進む(content-pipeline も同手順)
- 投稿画像も参照1本+5軸目標→模写採点(5軸中4軸で可)を通す。実写は加工せず、5軸はデザインレイヤーとテンプレ・トリミングで合わせる(2026-09-15・正本=memory feedback_design_reference_library_first)
- 規格値の正本は
~/.claude/scripts/specs.json。発信物として保存する前に~/.claude/scripts/gate.pyを通す(2026-09-05追記)