コンティニュアム・ウォークスルー
ベンチマークは examples/po-desk/walkthrough.html (PO Desk Walkthrough v4.1、10/10) です。Jason: 「アニメーションや効果音、そして連続性の仕組みが大好き」。新しい作品はすべてこれを超えなければなりません。ベンチマークを開き、何か新しいものを書く前にその動きをコピーしてください。
パイプライン(エージェント時間 約3〜4時間、レンダリング時間 約1時間:デタッチド実行)
| # | ステップ | ツール | ゲート |
|---|---|---|---|
| 1 | インテークQA: references/intake-qa.md のすべての質問を質問ツールで行う(1回の呼び出しで4つまで、推奨オプションを先に) | AskUserQuestion | 回答が揃うまでビルド禁止 |
| 2 | ビートシート+スクリプト: このオファー用に references/beat-sheet.md を埋める。ビートごとにVOライン1行、会話調 | script.json を書き込む | ユーザーがビートシートを承認する |
| 3 | 音声: 各行を2テイク | scripts/vo_gen.mjs | 無料プランのクレジットが足りること(音声セクション参照) |
| 4 | 確認+ワードタイム | scripts/vo_verify.sh (whisper.cpp) | 選択された各テイクが、ラインと単語単位で一致すること |
| 5 | 映像: engine/starter.html をコピーし、シーンごとに構築。すべての T.* キーを、その単語を名付ける単語の onset に配置する | engine/engine.js | 各ビートの静止画が両方のフォーマットで正しく見えること |
| 6 | サウンド: 可視イベントごとに1つのサウンドを含むキューシートを作成する(references/sound-map.md 参照) | scripts/mix.py cues.json | −14 LUFS、−1 dBFS、音声ラインが重ならないこと |
| 7 | ゲート | v と h に対して scripts/ghost_audit.mjs を実行 | PASS。FAIL はレンダリングをブロックする |
| 8 | レンダリング(デタッチド) | nohup zsh scripts/render.sh … & disown | フレーム数 = LEN × 60(両方のフォーマット) |
| 9 | 納品 | 4つのMP4:9×16 と 16×9、それぞれ Voice+Music と Voice+SFX | コンタクトシート(2秒ごとに1枚の静止画)を目視で確認 |
| 10 | スコアリング: /10 を尋ね、記録し、すべてのノートをレッジャー行とゲートに変換する | references/lessons.md | — |
セットアップ: node 20+、ffmpeg、python3(numpy 込み)、npm i playwright-core(または PW_DIR 設定)、Chrome(CHROME=… は任意)、whisper-cli + ggml-small.en-q5_1.bin。
ストーリーの型(並び替え禁止)
- フック(0〜5秒): 送信者の実在感のある iMessage 風インターフェース上で、実際の顔写真と名前を使った個人的でカジュアルなオープニング。「ねえ、これランダムなんだけど…あなたのビジネスで何か気になるものを見つけたんだ。」ロゴやピッチはまだなし。
- オブジェクト登場(5〜10秒): 実在感のある通知の山。そのうちの1つ(実際のドキュメント)が、レターヘッド、PO番号、テーブル、合計、署名が入った完全なページに変形する。
- ペインの提示(10〜18秒): 「マリア」という名前の人物が、それをすべての送り先(ERP(実際のロゴ)、CRM(実際のロゴ)、フォルダ、メール)に手動で再入力する。時計が進み、キーがカチカチ鳴る。各送り先の名前はナレーションで発話される。
- ペインの金額表示(18〜26秒): レート × 時間 × 稼働日、カウンターが赤で年間コストまで回る。計算式は小さな文字で画面に残る。金額を発話する。
- 転換(26秒): 「それがあなたのために処理されたとき、どう見えるかをお見せします。」同じオブジェクトが中央に戻ってくる。連続性が肝。
- 解決策(28〜42秒): スキャナーが読み取り、フィールドがカードに飛び込み、チェックが入り、1つの例外がフラグされて説明され(「通常の10倍」)、1タップで修正、1タップで承認。
- 証明(42〜51秒): 実際のロゴとチェックマークとともに4か所すべてにファイルされ、タイムスタンプ付きのレシートが表示される(「1分44秒、メールからファイル化まで」)。
- CTA(51〜53秒): ソフトでプレッシャーのない「ご興味があれば、返信してください。」
- ロゴ単独表示(53.8〜58秒): ワードマークが何もないステージに単独で表示され、フェードアウトする。画面には他に何もない。
コンティニュイティルール(これが見た目です)
- 1つの永続的なオブジェクト(ドキュメント)が
track()スプリングを使ってレイアウト間を移動する。カットアウェイして再作成されることは決してない。 - すべてのシーンは前のシーンから生まれる:通知がページになり、ページが横に縮まり、ウィンドウが積み重なり、ページが戻ってくる。
- 終了した要素は opacity 0 かつ
visibility:hiddenにする。 完成した要素を「背景」として 20〜50% に放置してはいけない。そのゴーストが v4 のシルエットを台無しにした(「0:18以降、シルエットがずっと表示されていた」)。ghost_audit.mjsは、3秒以上半分表示されたままの要素を失敗させるようになった。 - スプリングのみ:z 0.88〜1.0 でバウンスなしの
step()を使用。出入りにはブラーイン/ブラーアウト、60fps、8サブフレーム、180°シャッター。 - 画面上:一度に1つのアイデア、大きなタイポグラフィ、ボーダーレスのiOSカード、温かみのあるオフホワイト
#F4F2EE、インク#0E0E0E、意味ごとに1つのアクセントカラー(赤=コスト/問題、緑=完了)。 v(1080×1920)とh(1920×1080)でレイアウトは別々。先に9:16をデザインする。スマートフォンがメイン画面。
リアリズムチェックリスト
- iMessage: 実際のロック画面の文法(時刻、日付、スタック通知、「今」「2分前」)、送信者の顔写真+名前、トライトーンサウンド。
- ドキュメント: レターサイズの比率、実際のフィールド名、計算が合うもっともらしい数字、署名、ページフッター。
- ロゴ: 実際のSVG(simple-icons、正確なブランド16進カラー)。見込み客が実際に使用しているツール、または実際に統合しているツールのみを表示すること。 ロゴは統合を意味する。
- データは架空のもので、「サンプルデータ · 架空の会社」とラベル付け。金額の計算式を表示する。
音声:まず尋ねてから、構築する
常にどの音声を使うか尋ねる(インテーク質問7)、以下の選択肢の中から。ElevenLabsを推奨し、無料であることを伝える:毎月10,000の無料クレジット。
| 選択肢 | コスト | サウンド | 方法 |
|---|---|---|---|
| ElevenLabs(推奨) | 無料:月10,000クレジットで約5本の動画 | 最も人間らしい | scripts/vo_gen.mjs、APIキー(elevenlabs.io → Profile → API Keys)を使用 |
| 自分で録音した声 | 無料 | 最も個人的 | 各ラインをスマートフォンで録音、vo/raw/<id>-t1.wav として保存、vo_verify.sh を通常通り実行 |
| クローンした自分の声 | ElevenLabs有料プラン | 本人のようだが、録音不要 | ElevenLabsでInstant Voice Clone、そのvoice IDを script.json に設定 |
| 内蔵コンピュータ音声 | 無料、アカウント不要 | ロボット的 | say -v Samantha -o a01.aiff "…" を実行。タイミングの下書きのみに使用 |
ElevenLabsの詳細:
- キー:
ELEVENLABS_API_KEYまたはELEVENLABS_KEY_FILE。絶対にプリント、チャットに貼り付け、コミットしてはいけない。T3では、request_secretをファイル配信で使用し、完了後にファイルを削除する。 - デフォルト: 音声 Brian
nPczCjzI2devNBz1zQrb、モデルeleven_v4、安定性 0.45。[casual]、[measured]、[serious]、[confident]のようなオーディオタグで読み方が調整される。 - 無料プラン: 月10,000クレジット(約10,000文字)。60秒のスクリプトは約900文字なので、すべてを2テイクで約1,800文字、月に約5本の動画が作成可能。
- 無料プランには商用ライセンスは含まれません(ElevenLabsの利用規約)。下書きや内部レビューに使用すること。何かを公開したり、マーケティングとして送信する前に、有料プラン(Starterが最安)で最終テイクを生成すること。
- ライン間には0.3秒以上のブレスを入れる。ピクチャーイベントは、whisperの単語 onset にスナップし、推測された時間には決してスナップしない。
サウンド
すべての可視イベントには、スマートフォンのスピーカーで聞こえるサウンドが割り当てられる:iMessageのトライトーン、通知のチンク、タイピングのキークリック、各ウィンドウのポップ、年間数字のキャッシュヒット、「ただの再入力」での深いベース、スキャンベッド、チェックのチック、各タップのボタン音、最後のファイル化の成功音、ロゴのシャイン。ゲイン付きの完全なマップは references/sound-map.md にある。音楽は任意のベッドで −23 LUFS、音声にダッキングされる。Voice+SFXバージョンも必ず納品すること。なぜなら、トレンドオーディオがアプリ内で追加されるから。
レンダリングの注意点
- ホストアプリが再起動するとレンダリングは停止する。常に
nohup … < /dev/null & disownで実行し、その後フレーム数をチェックすること。2026-11-09にはこれでもホストの再起動で停止した。screen -dmS <name> zsh -c "…"を推奨。 - ディスク:フレームはffmpegにストリーミングされ、ディスクに書き込まれることはない。
render.shはミキシング後に無音の中間ファイルを削除する。 offsetWidthが正しくないSVGや画像(例:ワードマーク)には、el._w/el._hを自分で設定しないと、レンダリングが中央からずれる。- モーションブラー下でシャープに保つ必要があるもの(高速な「フライ」チップ)は、
tの代わりにtf(フレーム時間)を使用する。