thiguchi125-debug

short-video-create

"ショート動画オーケストレーター:セリフ生成→fact→risk→挿入ビジュアル→7PF投稿文→📣DB保存を1パス。既存パッケージの修正はMode Rで5面へ差分伝播。Triggers: ショート動画作って/TikTokセット作って/Reels一式/セリフ直して。NOT: AIキャラ→ai-kusakawa、写真→photo-post、台本のみ→short-video-virality-architect"

thiguchi125-debug 0 Updated 4w ago

Resources

5
GitHub

Install

npx skillscat add thiguchi125-debug/claude-config/short-video-create

Install via the SkillsCat registry.

SKILL.md

short-video-create スキル

目的

草川がショート動画を作るたびに発生していた以下の手作業を1パスで吸収する:

  1. セリフ生成(short-video-virality-architect 呼び出し)
  2. ファクトチェック(content-fact-checker)
  3. リスクレビュー(content-risk-reviewer)
  4. 挿入ビジュアル制作(HTML/CSS→PNG・short-video-image-designer。固定順序=採寸→写真→レンダ→機械採点→目視1回)
  5. 全7プラットフォームSNS投稿文生成(sns-content-creator) ← 新規追加 2026-05-21
  6. 📣SNS投稿管理DB保存(タイトル🎬・プロパティ整備・PF別セクション化)

特に以下のループを構造的に潰す:

  • 「セリフは作ったけど画像プロンプトは別セッションで頼む→サイズ指定忘れる→やり直し」
  • 「動画は撮ったけどSNSへの拡散文を別途作るのを忘れて投稿タイミング逃す」 ← 新規対策

7PF全自動化により、動画を撮影UP後すぐに各SNSへコピペで展開可能な状態になる。

起動条件

以下のいずれかが含まれる発言で起動:

  • 「ショート動画作って」「ショート動画一式」「ショート動画フルパッケージ」
  • 「動画作って画像も」「セリフから画像までセットで」
  • 「TikTokセット」「Reels一式」「YouTube Shorts一式」
  • 「short-video-create」

改訂モード(Mode R)のトリガー(既にパッケージがある案件の版更新):

  • 「ショート動画のセリフ直して」「動画の原稿を書き換えて」「〇〇(既存動画テーマ)を直して」
  • 「この版で確定」「これで完成させて」(草川が手直し版のセリフ全文を貼ってきた時)
  • 「全部直して」「画像もSNSも直して」
  • 既存の ~/Documents/ObsidianVault/50_発信/*/*ショート動画台本*・drafts/*_ショート動画*(2026-09-15以前の案件)や 📣投稿管理DBの🎬ページを参照している会話の途中で、セリフに修正が入った時は明示トリガーがなくても Mode R に入る(→ ## 🔁 改訂モード へ)

明示的なトリガーがなくとも、以下の文脈で草川に1問だけ確認してから起動:

  • 「〇〇でショート動画」と言われた時 → 「画像プロンプトもセットでいく?」
  • 「ショート動画磨いて」と言われ画像未整備の時 → 「画像プロンプトも一緒に作る?」

委譲先(このスキルが呼ばないもの)

  • 静止画のみのSNS展開(動画なし) → sns-content-creator 単独
  • AIインタビュー結果からのSNS化 → ai-interview-sns-poster
  • 長尺YouTube台本(>90秒) → 対象外(長尺は作らない方針・video-content-strategistは2026-07-02廃止)
  • 既存画像ライブラリからの選定 → photo-curator
  • 印刷物 → print-designer

ただし、動画+SNS展開セットは本スキルが内部的に sns-content-creator を呼んで一括処理する(草川が別途呼び直す必要はない)。

入力(草川から取得)

必須

  • テーマ または セリフ全文(どちらか)
    • テーマだけ → short-video-virality-architectで3バリアント生成
    • セリフ全文 → そのまま使う
  • target_length: 35〜50秒・目標45〜50秒(既定・厳守)/60秒・90秒は草川案件では使わない

任意(未指定はデフォルト値で進む)

  • target_platforms: TikTok / YouTube Shorts / Instagram Reels(複数可・既定3つ全部)
  • crosspost_platforms: X / Threads / Facebook / LINE(複数可・既定4つ全部)— 動画リンクをティーザー文と共にクロスポスト
  • num_images: 2〜5枚(既定3枚)
  • aspect: 9:16 / 1:1 / 16:9(既定9:16)
  • tonal_arc: 暖→寒 / アナログ→デジタル / before→after など(未指定時は内容から自動推定)
  • source_url: 元素材があれば
  • citizen_voice: 市民の声があれば(最優先素材)
  • video_only: true なら SNS投稿文生成をスキップ(既定 false = 7PF全生成)

処理フロー(8ステップ・完全自動)

Step 1: 入力解析・分岐判定

if 入力 == テーマだけ:
    mode = "from-theme"
    → Step 2 へ(セリフ生成)
elif 入力 == セリフ全文:
    mode = "from-script"
    → Step 3 へ(fact-checkから直行)
elif 入力 == 既存原稿の昇格依頼:
    mode = "polish"
    → short-video-virality-architect Polishモード → Step 3
elif 入力 == 既存パッケージのセリフ修正:
    mode = "revise"
    → 「## 🔁 改訂モード」へ(Step 2〜8は通らない・伝播フローが別)

mode 判定の要点:既に vault 50_発信/<日付>_<テーマ>/・drafts/(旧案件)・~/outputs/ の案件フォルダ か 📣投稿管理DB に同案件のパッケージが存在するなら、たとえ入力がセリフ全文でも from-script ではなく revise。from-script で入ると画像・SNS7種・Notionが旧版のまま取り残される。

Step 2: セリフ生成(from-theme時のみ)

並列起動:

  • short-video-virality-architect(Soloモード)

入力に渡すもの:

  • topic / target_length / target_platforms / citizen_voice / source_url
  • voice-dna・policy_compass 参照は agent 側で実施

出力期待値:

  • 3バリアント(A: hook最強 / B: 感情ストーリー / C: 議論誘発)
  • 各バリアントのカット表(秒単位)
  • 8軸スコア(合格点64/80)

草川好みのセリフ構成(2026-06-02反映): ①最強フック1.5秒 → ②名乗り(※「撮っている理由」の一言は2026-09-03 草川指示で廃止。「だから、撮っています」型は今後一切書かない) → ③本論1メッセージ → ④結びの主張=どうしたいか(〈実現主体は誰か〉→〈誰に何を求めるか〉→〈草川自身の意思〉の順。決意文句で固定しない=[[feedback_end_with_claim_not_resolve]]。「求めます/実現します」でなく「求めてほしい/働きかけたい」=[[feedback_sns_no_action_promise_assertions]]。2026-09-10 修正) → ⑤コメント誘発。尺は35〜50秒・目標45〜50秒厳守(名乗り+決意込みでも50秒以内)。冒頭の名乗りはコールドオープン回避のためフックの後ろに置く。詳細 [[feedback_short_video_use_virality_architect_first]] short-video-virality-architect.md 📌節「草川スクリプトスタイル13項目」。

草川に提示し どのバリアントで進めるか1問だけ確認(A/B/C)。承認後にStep 3へ。Step 3・4 を通したら Step 4.5(台本確認ゲート)で止まる。

Step 3: ファクトチェック

content-fact-checker を起動(指示文に ledger: ~/outputs/short-video/<slug>/_ledger.json を1行入れる=テーマ内台帳。フックが自動生成し Step 6 の派生ゲートが継承する):

  • セリフ内の数値・固有名詞・法令・統計を一次情報まで遡及
  • 修正必要箇所があれば草川に提示→承認後に修正

Step 4: リスクレビュー

content-risk-reviewer を起動:

  • 8軸(個人情報・機密・公選法・名誉毀損・差別・利益相反・品位・物議)
  • HIGH以上検出時は ASK_USER で草川判断仰ぐ
  • CRITICAL は即停止・草川通知
  • 公選法メモ(2026-06-02): 政策実現の主張・意思表明(「〜を求めてほしい」「私も働きかけたい」)は告示前の今は事前運動に当たらず投稿可(※実現主体が市の案件で「必ず実現させます」と断定約束しない。2026-09-10 修正)(投票依頼・選挙明示・期数言及がなければOK)。ただし告示日(2026-10-18想定)以降は再投稿・ピン留め・広告出稿・シェア誘導がNG(残置自体は可)(選挙運動判定域)。保存ページにこの運用注記を残す。
  • 市・執行部は「市の姿勢/市の答弁」止まりで名指し批判しない。別議員が引き出した数字・市長答弁を草川が引き出したように繋げない(質疑応答の誤帰属注意 [[feedback_giji_kusagawa_response_only]])。

Step 4.5: 台本確認ゲート(必須・skip禁止・2026-09-22新設)

ゲート2段を通った台本(セリフ+カット表)を 先に草川に見せて確定させる。画像(Step 5)とSNS7種(Step 6)は 台本確定まで着手しない。

  1. vault 50_発信/<日付>_<テーマ>/<日付>_<テーマ>_ショート動画台本_v1.md に Write → bash ~/.claude/scripts/obs_open.sh <パス> で開く
  2. 冒頭に「ゲート結果」「守っていること(帰属・言わないこと)」「決めてほしいこと」を置き、#注記 での修正を依頼して 待つ
  3. 注記・直接修正が入ったら v2 を作り、変更箇所だけ fact → risk を再通過 → 「この版で確定」を得てから Step 5・6 を 並列で起動

なぜ: 2026-09-22 個別避難計画×拠点避難所で、台本を見せる前に画像16枚とSNS7種を作り、草川の修正(結び・追加の一文)で全部作り直しになった。草川「先に内容確認しなくていいのか?台本だけでもobsidianで」「今回の進め方には問題がある」。

Step 5: 挿入ビジュアル生成(2ルート分岐・2026-06-02改訂)

挿入画像は用途で2ルートに分ける。草川に「説明図メイン?/イメージメイン?」を1問確認(または内容から自動推定)。多くの政策ショートはルートA(説明図)が主役、ルートBは補助。

制作の固定順序(2026-09-05・全ルート共通・skip禁止)

破棄画像28件の原因=〈作る→PNGを自分でRead→主観で直す〉。順序を次に固定する。

  1. 採寸を先に確定 — ~/.claude/scripts/specs.json の image.9:16(読み込み口 specs.py)から級数・字幕帯・セーフ域を読み、各画像の見出し級数・要素座標・写真の切り取り枠を着手前に書き出す
  2. 写真を先に切る — 実写が要る画は 📷写真ストック/10_使える写真/ を第一手にし、ファイル名の目利きタグを読む。顔は画面高 25〜35%(40%超は不合格)。縦位置の原本は寄らず全幅で縦に長く取る
  3. レンダ(HTML/CSS→Chrome→PNG のみ。AI画像生成ルートは無い)
  4. 機械採点 — check_subtitle_band.py <png>/check_image_design.py <html>/check_overflow.py <html>/feed_preview.py short。ここを通るまで目視しない
  5. 目視は最後の1回(PNGを自分でRead)
  6. 勝負所のみ feed-visual-reviewer

ルートA【推奨・データ/説明系】説明図インフォグラフィック(HTML/CSS → PNG)

「全国9割」「23/29市町」「年齢の崖」「Before/After」など数字・比較・構造を理解させる図は、AI画像生成を使わず HTML/CSSで設計して Chrome で PNG化する(print-designer と同じ作り方)。

  • 理由: nano-banana は日本語・数字を崩す+写真は雰囲気だけで情報量ゼロになりがち(2026-06-02 子ども医療費動画で「微妙」「情報少なすぎて何の画像か分からない」と本人NG)。説明図HTML→PNGなら正確な日本語+数字+出典が入り崩れない。
  • 草川ブランドカラー必須: ライム #c7ff4a(キーワードのハイライト下線=box-shadow:inset 0 -0.26em 0 #c7ff4a)/ディープグリーン #1f5a3a・#0f3d27/クリーム背景 #f3efe4。リーフレットと統一(正本=design_system/templates/leaflet_trifold/README.md)。勝手にアンバー+ネイビー等にしない。
  • スタイル: ニュースフリップ調 = kickerピル(深緑地+ライム点) → 見出し[キーワードにライム下線] → 中央ビジュアル[人型比率/マス目グリッド/アイコンカード/年齢チャート等] → 出典付きキャプション(一次出典明記)。
  • サイズ: 1080×1920(9:16)。レンダリング:
    "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --headless=new --disable-gpu \
      --hide-scrollbars --force-device-scale-factor=1 --window-size=1080,1920 \
      --default-background-color=FFFFFFFF --screenshot=out.png "file://<html絶対パス>"
    出力後 sips -g pixelWidth -g pixelHeight out.png で 1080×1920 を確認。次に固定順序④の機械採点を通し、通るまでReadしない。通ったら⑤の目視を1回だけ行い、字割れ・はみ出しがあれば数値を直して再レンダ。
  • HTMLソースも残す(数字・文言の微修正→即再レンダリング可能・ガチャ不要)。
  • 雛形: ~/outputs/daily-content/2026-05-27/kodomo-iryouhi-18-musho/infographics/ の既存5枚(人型比率/年齢の崖/3場面アイコンカード/29マスグリッド/強調ピン)を流用・改変するのが最速。
何枚作るかは草川に聞かない。カット表が決める(2026-07-30 追加)

num_images の既定3枚は上限ではなく初期値。確定したカット表を上から読み、次に当たるカットは全部インサート画にする。枚数を先に決めて途中で止めない。

カット表の記述 作る
「答弁引用テロップ全画面」「テロップ全画面」 ○ 逐語の答弁は手打ちさせない(打ち間違いが致命的)
「◯◯図解」「A・B図解」「比較図」「グラフ」 ○
「【重要】2行を1枚で同時表示」等の編集の絶対条件が付いたテロップ ◎ 最優先。1枚のPNGに焼けば編集で物理的に分割できなくなる=リスク緩和策がファイルとして担保される
結び(「まず◯◯/そして◯◯」型の2段まとめ) ○
サムネ文字案 ○ 1枚。元写真は photo-curator で自分で選び切る(草川に聞かない・2026-09-04 改訂)。合う写真が無いときだけタイポ版を作り、撮影後に差し替え可能な構造にしておく
実写で撮る画(草川バストアップ/現場の引き・アップ) ✕

焼き込む文言は台本の確定版から機械的に取る。このとき台本の「草川判断の記録」に表記ルール(例:「50台」単独表記は避けA・Bの内訳を必ず添える)が書かれていたら、画像とサムネにも同じルールを適用する。台本本文だけ守って画像で破るのが最頻の抜け。

配信面ゲート(必須・skip禁止): 画像が出揃ったら、パッケージ確定の前に
python3 ~/.claude/scripts/feed_preview.py short <カバー.png> <挿入画...> を走らせ、
feed-visual-reviewer を起動して PASS を取る。見るのは3軸だけ——
①カバーがグリッド(幅180px)で読めるか ②PF UIの遮蔽ゾーン(上部ナビ・右アクション列・下部キャプション帯)に出典や数字が入っていないか ③テロップの秒数×文字数(日本語1秒6〜7字、ナレーション同時なら5字)。
字幕セーフ帯 y1240〜1460 と挿入画の原寸可読性は short-video-image-designer の担当なので二重に採点しない。

ルートB【雰囲気/イメージ系】写真ストック → フラットイラスト情景

卒業式・病院待合など雰囲気B-rollや抽象イメージは、①📷写真ストック/10_使える写真/ から引く(固定順序②)→②合う写真が無ければ short-video-image-designer のリッチなフラットイラスト情景(HTML/CSS→PNG)。AI画像生成(nano-banana等)のルートは 2026-09-05 に廃止(設計書 D5=画像は HTML/CSS→Chrome→PNG のみ)。顔・実在ロゴ・学校名・他議員は写真でもイラストでも出さない。

共通: スマホ編集前提なら完成画像をDriveへ

草川は動画編集をスマホ(CapCut)でやることが多い。完成PNG(ルートA/B問わず)は Google Driveミラー
~/Library/CloudStorage/GoogleDrive-t.higuchi125@gmail.com/マイドライブ/📱動画素材/<YYYY-MM>_<テーマ>/
にコピーする。→ スマホのDriveアプリ→カメラロール→CapCut で取り込める。ファイル名は挿入順(a1,a2,…)で並ぶようにする。

Step 6: 全7プラットフォームSNS投稿文生成(新規・2026-05-21)

sns-content-creator を起動(video-aware モード):

入力に渡すもの:

  • 確定したセリフ全文(fact-check / risk-review済み)
  • 動画メタ情報(テーマ / 長さ / 採用バリアント / voice-dna軸)
  • target_platforms(動画ホスト)+ crosspost_platforms(クロスポスト)
  • ハッシュタグ素材(テーマ・分野・地名「亀山市」必須)

video_only=true なら本ステップをスキップ。

出力期待値: 7PF分の投稿文セット。各PF最適化済み:

動画ホスト3PF(動画本体を載せる場所)

PF 文字数 フォーマット ハッシュタグ
TikTok 150字以内 1行フック → 1行核心メッセージ → コール(CTA) 3〜5個(#亀山市 #市議会 #テーマタグ)
YouTube Shorts 説明欄 100〜300字 + ハッシュタグ フック → 動画の中身予告 → 草川自己紹介1行 → CTA 5〜8個(SEOキーワード厚め)
Instagram Reels 600〜1000字 詩的・ストーリー型導入 → 詳細展開 → CTA → ハッシュタグ束 10〜15個(広域ハッシュタグ含む)

クロスポスト4PF(動画リンクを貼って拡散)

PF 文字数 フォーマット 動画リンク扱い
X (Twitter) 140字厳守 強フック1文 + 動画リンク + 1〜2ハッシュタグ リンク必須
Threads 300〜500字 問いかけ型導入 → 共感 → 動画への誘導 → CTA リンク or 「詳しくは動画で」誘導
Facebook 500〜800字 論理型・背景説明 → 動画の意義 → CTA リンク or 動画埋込
LINE公式 300〜500字 アナウンス型「市議会の最新動画」 → 要点3行 → 動画リンク リンク必須

各PF共通の必須要素:

  • voice-dna軸(伝える/繋ぐ/希望)に整合
  • 「亀山市」「亀山市議会議員」など草川識別ワード1回以上
  • voice-dna NG表現リスト回避(「届かないを終わらせる」「最後の100m」等)
  • 公選法配慮(投票依頼・寄附該当表現含めず)

ライト再チェック:

  • セリフから抜き出した範囲はテーマ内台帳 ~/outputs/short-video/<slug>/_ledger.json から継承(再取得しない)
  • 7PF文を content-gate-lite 派生モードに束ねて1回通す(mode: derivative+ledger: を渡す。新規に足した情報と圧縮で落ちた但し書きだけ精読)。content-fact-checker/content-risk-reviewer の個別起動はしない(2026-09-05 設計書§3-E)

Step 7: 統合パッケージ提示

草川に以下を1メッセージで提示:

# 🎬 ショート動画フルパッケージ「<テーマ>」

## 📋 メタ
- 長さ: 35〜50秒・目標45〜50秒
- 動画ホスト: TikTok / YouTube Shorts / Instagram Reels
- クロスポスト: X / Threads / Facebook / LINE
- 採用バリアント: B(感情ストーリー)
- 8軸スコア: 72/80 ✅
- fact-checker: ✅ / risk-reviewer: ✅

## 🎤 セリフ・カット表
(秒数 / ナレ / 画 / テロップ)

## 🖼 挿入画像(PNG+HTMLソース)
(a1〜aN・カット表の秒と対応・機械採点PASS)

## 🎬 配置マップ
| 秒 | ナレ | 画 |

## 📱 SNS投稿文セット(全7PF・コピペ運用)

### 動画ホスト3PF
- **TikTok**(150字以内): <投稿文 code block>
- **YouTube Shorts**(説明欄): <投稿文 code block>
- **Instagram Reels**(600〜1000字): <投稿文 code block>

### クロスポスト4PF(動画リンク `<VIDEO_URL>` 含む)
- **X**(140字厳守): <投稿文 code block>
- **Threads**(300〜500字): <投稿文 code block>
- **Facebook**(500〜800字): <投稿文 code block>
- **LINE公式**(300〜500字): <投稿文 code block>

文字数チェック: 全PF✅ / NG表現スキャン: ✅ / 公選法: ✅

---
**草川承認後、📣SNS投稿管理DBへ保存します。OK?**

パッケージ本文の置き場(2026-09-15・必須): 上のフルパッケージ(セリフ・カット表・配置マップ・7PF投稿文)は ~/Documents/ObsidianVault/50_発信/<日付>_<テーマ>/<日付>_<テーマ>_ショート動画台本_v<n>.md に Write し、bash ~/.claude/scripts/obs_open.sh <パス> で開いてから承認を聞く。drafts/・~/outputs/ に置くとObsidianで読めない(OPERATIONS.md【C】D7)。ファイル名の「ショート動画」は台本フックの判定に使うので外さない。画像・_ledger.json は ~/outputs/short-video/<日付>_<slug>/ のまま。

Step 8: Notion 📣SNS投稿管理DB 保存

草川承認後、notion-saver agent(または直接MCP)で保存:

DB: 📣SNS投稿管理DB

  • database_id: 78f40f33-ae71-4f32-9cc3-b00c0a36707c
  • data_source_id: 1bd98deb-624f-402c-aeb3-bdaa4782b389

プロパティ:

  • 投稿タイトル: 🎬【ショート動画+SNS7PF】<テーマ要約>
  • ステータス: 進行中(DBに「下書き完成」選択肢ないため)
  • プラットフォーム (multi_select): 動画ホスト3PF+クロスポスト4PF を全てチェック(YouTube / TikTok / Instagram / X / Threads / Facebook / LINE)
  • 分野: テーマから自動判定(行政/福祉/子育て/教育/防災/産業/交通/環境/都市計画/その他)
  • ネタ元: 議会/委員会・日次活動・市民相談・行政資料・SNS/新聞 のいずれか
  • アイコン: 🎬

page content(セクション順):

  1. メタ情報(テーマ・長さ・PF・voice-dna軸・採用バリアント)
  2. 安全ゲート判定(fact-checker / risk-reviewer 結果)
  3. セリフ・カット表(採用バージョン)
  4. 挿入画像一覧(a1〜aN のDriveパス+使い所の秒)
  5. 機械採点の結果(check_subtitle_band/check_image_design PASS)
  6. 配置マップ
  7. タイトル案・サムネ案
  8. 📱 SNS投稿文セット(7PF)— 動画UP後のコピペ展開用
    • 8-A. TikTok 投稿文(code block)
    • 8-B. YouTube Shorts 説明欄(code block)
    • 8-C. Instagram Reels キャプション(code block)
    • 8-D. X 投稿文(140字厳守・code block)
    • 8-E. Threads 投稿文(code block)
    • 8-F. Facebook 投稿文(code block)
    • 8-G. LINE公式 アナウンス(code block)
    • 8-H. ハッシュタグ群(PF別表)
  9. 横展開メモ(ブログ深掘り提案)
  10. アンチ想定+返信案
  11. 撮影前チェックリスト
  12. 公開後タスク — 動画UP後の作業フロー(YouTube/TikTok/Reelsの順でUP→クロスポスト4PFは動画URL確定後コピペ→Notion ステータスを「完了」に)
  13. リサーチソース・元素材URL

🔁 改訂モード(Mode R・2026-07-27新設)

このモードが無かったせいで何が起きたか(2026-07-27 アーバンスポーツ署名 v3→v5.1):
セリフを1行直すたびに、カット表の秒数・挿入画像に焼き込まれた文言・SNS7種に散在する同一フレーズ・Notionページを全部手作業で追いかけた。結果、画像 b1_45percent.png に誤情報(「市内でいちばん、子どもが多い学区」)が焼き込まれたまま2版分放置されていた。Mode R はこの伝播を機械化する。

R-0. 対象の3点セットを特定

  1. ローカル正本: ~/Documents/ObsidianVault/50_発信/<日付>_<テーマ>/<日付>_<テーマ>_ショート動画台本_v*.md(2026-09-15以前の案件は drafts/<日付>_<テーマ>_v*.md か ~/outputs/<案件>/ 内。直した版は vault に v<n+1> で書く)
  2. 画像一式: ~/outputs/short-video/<日付>_<slug>/infographics*/(HTMLとPNGが対で存在)
  3. Notionページ: 📣投稿管理DB(1bd98deb-624f-402c-aeb3-bdaa4782b389) の🎬ページ

3つ揃わない場合は、欠けているものを草川に確認してから進む。勝手に新規パッケージを作らない(旧版が残って二重管理になる)。

R-1. 差分表の確定

新セリフを1つに確定する。草川の手直し版が常に正。旧セリフとの差分を old → new のペア表にする。この差分表が以降すべての伝播の唯一の入力になる。

R-2. 安全ゲート再実行(skip禁止)

content-fact-checker → content-risk-reviewer を必ず両方通す。変更していない箇所も再検証する。指示文に ledger: を渡し、台帳の VERIFIED 主張は転記でよいが、下記4類型は台帳にあっても毎回ゼロから検算する。

過去版を通過した記述でも、以下は毎回ゼロから検算する:

  • 最上級(いちばん/最も/唯一/最多/No.1)を含む主張 → 比較対象の全件表を突合してから通す。2026-07-27の事故は「44.6%」の検算だけが行われ、他校区との比較が一度もされていなかったのが原因(実際は2位)
  • 断定の否定形(「〜がない」「〜ゼロ」) → 限定語なしで言い切っていないか。既存の公共施設を否定したと読まれないか
  • 数値の射程 → 総人口か子ども人口か/いつ時点か/丸め方は上振れしていないか(「44.6%」を「2人に1人近く」は上振れ)
  • 程度の副詞(急激に/大幅に/激減) → 実数と合っているか(10年で+2.5%は「急激」ではない)

R-3. 5面へ一括伝播(手作業禁止)

差分表を以下の5面すべてに適用する。1面でも落とすと版が割れる。

# 面 手順 検証
1 セリフ本文 差分表を適用 字数を数える(下記R-4の尺計算)
2 カット表 秒数を引き直す。字数が変われば全カットの開始・終了がずれる。カット分割そのものも再計算 合計尺が target_length 内か
3 挿入画像のHTML まず ls ~/outputs/short-video/<slug>/infographics*/ で画像の有無を見る。
(a) 無い or カット表が要求する枚数に足りない → 「伝播対象なし」で終わらせず Step 5 に入って作る(不足分だけでよい)
(b) 有る → grep -rn "<旧文言>" ~/outputs/short-video/<slug>/ で焼き込み箇所を洗う → HTML編集 → 旧PNGを _v1_backup/ へ退避 → Chrome headless再レンダ → PNGを自分でRead して目視検証
字割れ・はみ出し・旧文言の残存/カット表の要求枚数との突合
4 SNS7種 同じ一節がX・Threads・TikTok・Instagram・LINEに重複して散在する。1箇所直して満足しない grep -c "<旧文言>" で0件を確認
5 Notionページ replace_content で差し替え → fetch で実体確認(一括置換のサイレット失敗+漢字化けの前科あり) 本文が実際に入れ替わっているか

一括置換の副作用に注意:sed/str.replace で機械的に置換すると、既に新表現になっている箇所に二重適用されることがある(2026-07-27は「どちらも、どちらも、目的は同じです」が発生)。置換後に必ず全文をgrepして重複語・二重表現を確認する。

R-4. 尺の再計算(毎回・省略禁止)

6字/秒で計算する(architect・memoryと統一。8.4字/秒は過小見積もりで60秒級を生む原因だった。2026-09-03修正)。字数が増えたら必ず草川に申告し、削る候補を1〜2個添える。黙って50秒を超えない。

python3 -c "s='''<セリフ全文>'''; n=len(s.replace(chr(10),'')); print(n,'字 →',round(n/8.4,1),'秒')"

R-5. 残存チェックと版の記録

  1. 旧語句を全ファイルgrepして0件を確認。ただし「変更履歴」「安全ゲート」セクションに旧語句が引用として残るのは正常(本文セクションと区別すること)
  2. ローカル正本に 「確定時の判断」節を追記:何を採用し、何を不採用にしたか、その理由
  3. 安全ゲートの指摘を不採用にした場合は、どの代替手段で担保するかを必ず明記する。例:2026-07-27は risk-reviewer の「『私はその一員です』を入れる」(MEDIUM)を草川判断で不採用 → 「0秒からの主体分離テロップと火消しオーバーレイが唯一の防波堤になる」とカット表に注記した

📌 恒久ガードルール(Mode R)

  • 規格値の正本は ~/.claude/scripts/specs.json(short_video=尺・カット・数値、image.9:16=挿入画像)。発信物として保存する前に ~/.claude/scripts/gate.py を通す(2026-09-05追記)。挿入画像の制作規範は ~/.claude/agents/knowledge/design_system/short_video_templates/README.md

  • セリフを直したら画像を疑う。 挿入画像には文言が焼き込まれている。セリフ側だけ直して画像が旧版のまま残るのが最頻の事故

  • 既存パッケージがあるのに from-script で入らない。 画像・SNS・Notionが取り残される

  • 「過去のfact-checkを通過済み」は安全の根拠にならない。 通過時に検証されたのは当時の主張だけ。特に最上級は毎回全件突合

  • 画像PNGは必ず自分がReadする。 サブエージェント委譲禁止([[natural-design-reviewer]] の鉄則と同じ)

  • 「未作成=伝播対象なし」は結論にしない。(2026-07-30 JR亀山駅前送迎環境で発覚)伝播は「既にあるものを直す」だけの工程ではない。画像がゼロなら、それはStep 5 が一度も走っていないという意味であり、Mode R の中で作りにいくのが正しい。「該当ディレクトリなし→対象なし」と書いて閉じると、台本だけが版を重ね、画像はいつまでも生まれない

  • 会話の流れで台本を直し続けた案件は、スキルが一度も起動していないことを疑う。 台本に「agent未起動・手動検証」「未伝播」「該当ディレクトリなし」と書かれていたら、それが未起動の痕跡。その時点で Step 3〜5 を回収する(fact-checker / risk-reviewer / 挿入画像)

  • 画像の枚数は草川に聞かずカット表が決める。「テロップ全画面」「◯◯図解」「編集の絶対条件が付いたテロップ」「結びの2段まとめ」「サムネ」は全部作る。逐語の答弁はCapCut手打ちに任せない(打ち間違いが致命的)

  • 編集の絶対条件が付いたテロップ(例:2行を1枚で同時表示)は最優先で1枚のPNGに焼く。 編集で物理的に分割できなくなり、リスク緩和策がファイルとして担保される。運用ルールを人の記憶に預けない

  • 台本の「草川判断の記録」にある表記ルール(例:「50台」単独表記は避けA・Bの内訳を添える)は画像とサムネにも適用。 台本本文だけ守って画像で破るのが最頻の抜け(JR亀山駅前のサムネ初稿で実際に発生)

出力フォーマット(草川画面)

Step 7で示すフルパッケージ+Step 8でNotion保存後に保存先URLを1行で報告:

✅ 保存完了: <NotionページURL>
   →動画ホスト3PFにUP後、ページ内のcode blockを各SNSにコピペでクロスポスト
   →説明図PNGは 📱動画素材/<日付>_<テーマ>/ に配置済(スマホDrive→CapCut取込可)
   →雰囲気イメージは AI Studio/Geminiアプリ で手動生成(API無料枠は0)

⚡ トークン効率化方針

  • リサーチは並列・必要最小限(playbook全読みは agent 任せ)
  • fact-checker / risk-reviewer は順次直列(並列にすると修正が二重発生)
  • sns-content-creator はセリフ確定後の単一呼出(PF別個別呼出は禁止・トークン3倍化する)
  • SNS再チェックは7PF分まとめて1回(個別チェックNG)
  • Notion保存は1回だけ(途中保存禁止、承認後一発・7PF分のセクションを同時に書く)
  • 目標トークン: 120〜180K(SNS生成追加後の新基準)

🚦 失敗時のフォールバック

失敗 対応
short-video-virality-architectが64点未満連発 草川に「テーマ角度を変えるか、別agentで素材集めるか」確認
fact-checkerでファクト崩壊 該当部分削除or修正→risk-reviewerに進む
risk-reviewerでCRITICAL 即停止・草川判断仰ぐ、Notion保存しない
挿入画像に人物の顔が要りそう 手元・モノ・後ろ姿に置き換える(顔は出さない)
sns-content-creator がX 140字超過 即圧縮(要点だけ残す)→再チェック、3回失敗で草川に「Xは手動短縮」依頼
sns-content-creator がvoice-dna NG表現混入 該当箇所のみ書き直し(全文再生成NG・トークン無駄)
クロスポスト4PFで動画URL未確定 プレースホルダ <VIDEO_URL> で保存・公開後タスクでURL差し替え注記
Notion保存timeout 1回だけリトライ、それでもダメなら草川に手動保存url案内

🎯 関連エージェント・スキル

  • short-video-virality-architect — セリフ生成(Solo / Polish・35〜50秒・目標45〜50秒・名乗り+決意型)
  • 説明図インフォグラフィック — HTML/CSS→Chrome→PNG(草川カラー・print-designer流)。ルートA・主役
  • short-video-image-designer — 挿入画像の実装(説明図・フラットイラスト情景・機械採点ループ)
  • sns-content-creator — 7PF SNS投稿文生成(video-aware モード)
  • content-fact-checker — 一次情報遡及
  • content-risk-reviewer — 8軸リスクスキャン
  • sns-content-polisher — 仕上がり品質が低い時のSNS文磨き直し(オンデマンド)
  • notion-saver — Notion保存代行
  • 長尺動画(>90秒)はこのスキル対象外(専任agentは2026-07-02廃止・必要時は都度依頼)

🔧 学習・改善

このスキル運用で発見した改善点は feedback_short_video_create.md に追記し、本SKILL.mdに反映。
特に以下の指標を月1で確認:

  • 機械採点を通す前に目視した件数(目標: 0件/月)
  • Notion保存先迷子件数(目標: 0件/月)
  • 草川の途中差し戻し件数(目標: 月3件以下)
  • SNS投稿文の追加修正発生率(目標: 月10%以下 = 7PFのうち平均0.7PF未満修正)
  • 動画UP後のSNS展開完了までの所要時間(目標: 15分以内)
  • X 140字制限違反件数(目標: 0件/月)

🆕 2026-05-21 更新メモ

SNS投稿文生成(Step 6 新規)を追加し、7ステップ → 8ステップに拡張。
従来は動画完成後に手動で各SNSの投稿文を考えていた → 平均 30〜60分の作業を構造化排除。
動画ホスト3PF(TikTok/Shorts/Reels)はキャプション、クロスポスト4PF(X/Threads/Facebook/LINE)は動画URL付きティーザーとして自動分岐。

🆕 2026-09-05 更新メモ(発信フロー構造改善 フェーズ2 C)

  • Step5 に制作の固定順序(採寸→写真→レンダ→機械採点→目視1回→勝負所のみreviewer)を追加。目視は機械採点が通ってから1回。
  • ルートB の nano-banana(AI画像生成)ルートを廃止。雰囲気カットは写真ストック→フラットイラスト情景。nanobanana-prompt-designer は退避(~/Archive/_trash_pending_2026-09-05/)。
  • 字幕帯座標は specs.json を 1240 に修正し検査器・README・agent節と整合。

🆕 2026-06-02 更新メモ(子ども医療費18歳ショート動画の制作から)

Step 5 を「nano-banana一択」→「2ルート分岐」に刷新。今回の最大の学び=説明図はAI画像生成ではなくHTML/CSS→PNGで作る。

  • 経緯: nano-banana実写B-rollが「微妙」、純アイコン図は「情報少なすぎて何の画像か分からない」と本人NG。原因=AI画像は日本語/数字を崩し、写真は雰囲気だけ。
  • 解決: print-designerと同じHTML→Chrome→PNG で、正確な日本語+数字+出典入りのニュースフリップ図を制作。崩れ・ガチャなし、微修正は即再レンダ。
  • 草川ブランドカラー必須(ライム#c7ff4a/グリーン#1f5a3a・#0f3d27/クリーム#f3efe4)。初回アンバー+ネイビーで作って「草川カラー踏襲してない」と差し戻し→ブランド色は毎回厳守。
  • Gemini API画像は無料枠0(limit:0)。「API無料で全自動」は誤案内だった。無料は手動(AI Studio/Geminiアプリ)、自動は課金。
  • セリフ: ①コールドオープンのフック → ②名乗り(撮っている理由は書かない・2026-09-03廃止) → ③本論1メッセージ → ④結びの主張=どうしたいか(実現主体→要求先と要求内容→草川自身の意思。決意文句で固定しない) → ⑤コメント誘発。35〜50秒・目標45〜50秒(データ系で本論のビート数が多い回は <!-- FORMAT-EXCEPTION: 尺=NN秒 / 草川承認 / 理由 --> を原稿に書けば≤60秒まで可。2026-08-05追加)。※「撮っている理由」ブロックは廃止(2026-09-03 草川指示)。
  • 公選法: 告示前の決意表明OK/告示後の再投稿NG注記を保存ページに残す。
  • スマホ編集前提 → 完成PNGを Driveミラー 📱動画素材/ へコピーして phone-accessible に。
  • 制作資産: ~/.claude/agents/knowledge/short_video_templates/insert_image_v1/(template_a/b/c+sample png)と design_system/short_video_templates/_starter_9x16.html。制作規範=同dir README.md(2026-05-27の雛形5枚は削除済み)。

🆕 2026-07-27 更新メモ(アーバンスポーツ署名 v3→v5.1 の改訂作業から)

新設: ## 🔁 改訂モード(Mode R)+起動条件とStep 1分岐に mode = "revise" を追加。

背景: 「子どもの居場所のショート動画の原稿なかったっけ?」という検索から始まり、そのまま5往復の改稿に入ったため、本スキルが最後まで一度も起動しなかった。結果すべて手作業になり、以下が発生した。

  1. 画像に誤情報が2版分残っていた — b1_45percent.png の「市内でいちばん、子どもが多い学区。」。セリフ側だけ直して画像を見ていなかった。実際は亀山中学校区1,209人(45.6%)が最多で、中部中学校区1,184人(44.6%)は2位
  2. 過去2版のfact-checkを通過していた誤り — 「44.6%」という数字の検算だけが行われ、他校区との全件突合が一度もされていなかった
  3. 同一フレーズがSNS5PFに散在 — 1箇所直しても他が旧版のまま
  4. 一括置換の二重適用 — 「どちらも、どちらも、目的は同じです」が発生
  5. 尺の見落とし — 加筆のたびに字数が増え、最終的に35〜45秒基準に対して69秒になった

この5つがそのまま Mode R のチェック項目になっている。

あわせて確立した数値: セリフの尺は 8.4字/秒 で計算する(v3実測から。578字→69秒)。