Skip to content

v5.6.0

Choose a tag to compare

@daiki-beppu daiki-beppu released this 31 Jul 14:22
7ad3a62
  • chore(takt): takt 0.54.1 追随 — 0.53 で既定 off になった Codex Skill 継承(.agents/skills の repo スコープ)を yt-auto-* 全 workflow で復元し、builtin 準拠の fix-report 契約(instruction: fix の 2 step)・session: compact(yt-auto-audit の台帳拡張 step)・final-gate タグルーティング(最終関門のみ Sol へ)・use-relevant-skills partial(実装系 4 instruction)を導入した(#2686)。

  • chore(takt): audit-unit-split の検収ゲートを v4/v5 へ更新。v4 は supervise を project facet で shadow(承認基準 5 点・差し戻しは物理的欠落のみ)し policy: review の「APPROVE は issue 0 件」注入を除去(T07/T08/T10/T11 の max_steps 枯渇対策)。v5 は判定 LLM が承認宣言の応答を差し戻しへ誤分類する事象(T15/T16 で計 3 回・約 9 step 空転)への対策として全 rule condition を宣言文の機械照合形式へ変更し、review からも policy: review を除去。F 番号の連番規約(F-001 起点・欠番禁止・取り下げ見出し)と優先度集計の実数カウントを契約・instruction に明文化した(#2680)。

  • fix(extensions): Community / DistroKid helper の cleanup・stop・storage・asset relay・content injection 失敗を後続副作用なしで扱い、shared-ui の portal・primitive・refresh・drag・viewport 境界と entrypoint lifecycle を実 mount 回帰テストで固定した(#2926#2946)。

  • fix(skills): スキル配布・パッケージング監査の25件を実行可能な成功/失敗契約へ置換し、market/persona の状態判定、schedule/GCP/shell reference の外部コマンド境界、thumbnail のatomic更新、動画ベンチマーク、コメント収集のpagination・途中失敗・atomic保存・CLI終了コードを回帰テストで固定した(#2831#2855)。

  • test(repository): リポジトリ契約監査の文字列・行数・自己テストを実行時境界へ置換し、Chrome extension/worktree解決、Git ignore、dotenv非使用、pytest lane、shared-ui relay、隔離fallow cacheの回帰契約を強化した(#2888)。

  • fix(dashboard): detail 選択の競合 response が現在の表示・loading/error 状態を上書きしないようにし、Analytics snapshot の bool・負値・不正 nested shape を公開 read model/API で安全な値へ正規化。dashboard・refresh・architecture・fixture/helper の失敗/境界経路を実行時回帰テストで補強し、session-expiry の定数形式テストを 404/410 の公開 upload 動作へ統合した(#2857, #2858, #2859, #2860, #2861, #2862, #2863, #2864, #2865, #2866, #2867)。

  • fix(system): notification・競合 CLI・automation update・settings merge・doctor・preflight の失敗/境界契約を実行テストで固定し、thumbnail routing の 21 件の文書固定テストを provider・reference routing・thumbnail/main 成果物・loop-video on/off・cost 拒否の実行シナリオへ置換。doctor readiness は現行の composition_rules.text_lines 契約へ更新した(#2807, #2808, #2809, #2810, #2811, #2812, #2813, #2814, #2815, #2816)。

  • fix(metadata): metadata remote audit の不正 snippet 応答を動画単位の診断へ変換し、連続 channel 実行時の skill-config 混入を防止。collection 必須 directory の壊れた symlink と作成 I/O 失敗も文脈付き ValidationError へ統一し、metadata・collection・localization の監査 findings 19件を実回帰テストで固定した(#2787#2806)。

  • fix(suno-distrokid): DistroKid の atomic write・metadata・workflow-state 読込境界と、Suno の ffmpeg cleanup・unattended HTTP・verify CLI・artifact reader の成功/失敗契約を直接回帰テストで固定し、不正な workflow-state shape と I/O 失敗を ConfigError に統一した(#2719, #2720, #2721, #2722, #2723, #2724, #2725, #2726, #2727, #2728, #2729)。

  • fix(thumbnail): 画像保存・provider retry・参照履歴・自動選択・比較CLI・stock設定の失敗/境界契約を実回帰テストで固定し、参照画像欠落を stderr へ報告、非有限の自動選択 tolerance、非object stock metadata、不正な stock theme/max-count 設定を安全に拒否する。Codex wrapper と thumbnail skill の内部文字列だけを固定していた重複テストは、同等以上のCLI・成果物・失敗診断テストへ統合した(#2768#2786)。

  • fix(analytics): 競合候補の channel ID を YouTube API 上限の 50 件単位で取得し、uploads playlist 欠損または有効な公開日を持つ動画がない候補を結果から除外する境界を公開 API テストで担保した(#2631)。

  • fix(analytics): retention timeline が不正な retention 数値(変換不能・NaN・Infinity)や非有限の動画尺を ValidationError として利用者向けに拒否し、壊れたJSON・曖昧なanalysis参照・duration fallback・未照合・Markdown escaping の境界を直接検証した(#2612, #2636)。

  • fix(live-chat): Codex の構造化出力が JSON object でない場合も GeneratorError として安全に拒否し、facade・filter・history保存失敗・投稿失敗・chat終了後再探索・CLI enabled/割込み/例外終了の実行時契約を直接検証した(#2648, #2651)。

  • fix(playlist): playlist manager/status CLI が成功・中断・外部失敗を明示的な終了コードで返し、status/help/引数不備では不要な書き込み認証を開始せず、init/status/clean/assign の引数伝播と表示を command-level test で担保した(#2653)。

  • fix(video-analyze): Gemini が JSON object 以外を返した場合を明示的な ValidationError として扱い、解析失敗時に sleep や結果保存へ進まない境界を固定(#2678)。

  • fix(benchmark): Gemini サムネイル分析が依存欠落・client初期化・画像取得・生成・JSON解析で失敗した場合は収集済み動画データを変更せず、解析成功時だけ thumbnail_analysis とgeneration記録を追加する fail-soft 契約を明確化(#2611)。

  • fix(benchmark): Short判定のISO 8601 durationを完全一致で検証し、空の PT や末尾に不正文字を含む値をShortとして扱わないよう修正(#2618)。

  • fix(analytics): launch-curve plotでtargetなし・benchmarkサンプル不足によりラベル対象がない場合、空legendを描画せず警告なくPNGを生成する(#2617)。

  • fix(config): channel targetの明示指定・CHANNEL_DIR・cwd fallbackの優先順位を検証し、fallback cwdがdirectoryでない場合も ConfigError で拒否する(#2630)。

  • fix(video-validator): ffprobe の 0/0 frame rate を検証失敗として扱い、CLI をクラッシュさせず既存の metadata 読取失敗契約へ統一(#2644)。

  • fix(pinned-comment): CLI で破損した履歴 JSON と atomic 履歴保存の I/O 失敗を終了コード 1 のエラー契約へ変換し、未処理例外で終了しないようにした(#2652)。

  • fix(apply-rain-layers): ffmpeg 出力後の workflow-state 保存失敗を終了コード 1 として報告し、生成済み出力と更新前 state を保ったまま安全に再実行できるようにした(#2660)。

  • fix(generate-videos-batch): 複数 collection の workflow-state 永続化が途中で失敗した場合を終了コード 1 に変換し、更新済み collection を再実行対象から除外したまま未更新分だけ再開できる契約を固定(#2662)。

  • ffprobe の nan / inf / -inf を duration・bitrate の取得失敗として正規化(#2668

  • 動画 metadata の codec 欠落・非文字列を例外にせず validation error として分類(#2671

  • Lyria の中断時回収ファイル保存に失敗しても元の KeyboardInterrupt を保ち、誤った回収成功表示を出さないよう修正(#2667

  • chore(takt): ユニットテスト監査で稼働中の audit-unit-split workflow 資産(workflow 1 本 + facets 4 本、v3 の上書きセマンティクス対策済み)を無改変で git 管理下に置いた。#2686.takt/workflows/ / .takt/facets/ の git 管理が前提となったため、worktree・他 checkout でも定義を解決できるようにする(#2690)。

  • feat(takt): リポジトリ専用 workflow 群を整備し、takt を開発の標準実装経路へ戻した(#2453 の廃止根拠だった「workflow 実体の不在」を、.takt/workflows/ の git 管理 + takt workflow doctor 検証で解消)。レーンは yt-auto-feature(設計ゲート + テスト先行)/ yt-auto-fix(診断ゲート + 再現テスト red 検証)/ yt-auto-docs(文書・スキル限定の軽量レーン)/ yt-auto-maintenance(維持契約の列挙 + safety net 付きリファクタリング)/ yt-auto-audit(台帳ベース汎用監査)の 5 本と、共通 callable の yt-auto-intake / yt-auto-impl-review。全実装レーンに CI 同等ゲート(ci_verify: ruff / any-gate / pytest / CHANGELOG のローカル実行。ローカル git hook 廃止後の push 前関門)を置き、facets(personas / knowledge / policies / instructions / output-contracts)約 50 本と persona routing を追加した。CLAUDE.md / AGENTS.md / docs/development.md / docs/takt-operations.md の「takt は使用しない」を反転し、/issue-direct は対話用の代替経路として残した(#2686)。

  • fix(config): DistroKid credits の role と songwriter 名を空でない文字列に限定し、契約外 shape を ConfigError で早期拒否する。audio 上限、community draft、localizations、branding の実行時設定契約テストを補強し、community draft ADR 本文の文字列固定テストを削除(#2593, #2594, #2595, #2596, #2597, #2658)。

  • fix(analytics): 不正な video analytics row と短い video-daily row を fail-soft に扱い、audience / channel / CTR / retention / revenue / traffic / video mixin の空応答・ゼロ値・API失敗・query境界を実行時テストで固定。audience mixin の docstring 文字列固定テストを削除(#2620, #2621, #2622, #2623, #2624, #2625, #2626, #2627, #2637)。

  • refactor(integration): B6 の統合 receipt と sdist allowlist を追加し、root auth/、未使用 logging/template、helper の旧 Prettier 設定を整理した。Community Helper の install/update 導線を /ext-install と機能カタログへ追加した。OAuth セットアップは推奨経路(/setup)を ONBOARDING.md 2.3、手動ルート A / B・client_secrets.json の解決順・Vertex AI の project / location 解決・トラブルシューティングを新設の docs/oauth-setup.md へ移し、root auth/SETUP.md を廃止した。解決順の記述は client_secrets_file_candidates() の実装に合わせ、workspace root と main 作業ツリーへのフォールバック(#1721)を追記している。README 側の環境変数表も同じ 4 候補を明記し、workspace channel かつ linked worktree の fixture で全候補を観測して README / docs/oauth-setup.md の記載順が実装の候補列と一致することを tests/test_oauth_onboarding_contract.py で機械担保した。sdist allowlist には ONBOARDING.md / docs/oauth-setup.md / docs/oauth-scopes.md と、ルート B 詳細の infra/terraform/gcp/README.md を含め、README から辿る OAuth 導線が配布物内で解決することを実ビルド検査で機械担保した(infra/ はこの README 以外を配布しない)。移設に伴って存在確認へ弱まっていた契約テスト(dashboard の起動時 API・--skip-refresh・部分エラー・配布境界・Spell UI 禁止、onboarding の dotenv 禁止と ADC / 1Password 記述、手動ルート A / B)は、移設先の docs/architecture.md / ONBOARDING.md / docs/oauth-setup.md に対して削除前と同等の内容 assertion を復元した(#2309)。

  • refactor(packaging): 旧 cli/ 16 files と scripts/ 64 files を commands/{analytics,channel,collections,distrokid,media,metadata,suno,system,thumbnail,uploads,youtube}/ の 11 domain へ移し、cli_entrypoints.pyentrypoints.py へ改名。console script を 76→75 とし、yt-distrokid-migrate を entry / wrapper / module / test / CLI mapping / NON_BILLED_CLIS の 6 面から削除(DistroKid domain・extension・yt-distrokid-prepare は維持)。20 個の skill symlink は link path を維持したまま 14 個の新 command target へ張り替えた。agents/ に残っていた yt-upload-auto / yt-upload-collection / yt-upload-shortsutils/yt-audio-visualizer-fillinfrastructure/auth/yt-oauthcommands/{uploads,media,system}/ へ移し、agents/ パッケージを退役させて、全 75 wrapper が例外なく commands/<domain> を target とする状態にした(tests/test_cli_stdio.py::test_entrypoint_wrappers_only_target_command_modulesentrypoints.py の AST から機械担保する)。あわせて --help が設定・skill-config なしで exit 0 を返すよう、yt-channel-status / yt-playlist-manager / yt-playlist-status / yt-suno-unattended-request / yt-upload-auto / yt-upload-collection / yt-discover-competitors の設定解決を引数解析より後ろへ移動し、yt-metadata-audit のモジュールトップ COLLECTIONS_DIR 即時評価を解消。help 文言は静的化した(parser 構築時にチャンネル名を解決する経路を作らない)。yt-skills の repo root 解決を深さ index から youtube_automation パッケージ基準へ変更し、移動のたびに壊れる/上位ディレクトリを誤認する事故を防いだ。この --help 契約は tests/test_cli_help_contract.py で機械担保する(全 75 console script の実バイナリを CHANNEL_DIR 未設定・credential 欠落の隔離 subprocess で起動し、exit 0 / usage: <script 名> / load_config()channel_dir()・認証・API client 生成の未呼び出し / 隔離 HOME への非書き込み / 15 秒以内を検証。設定解決まで観測点に含めるのは、ConfigError を握り潰す fallback を挟めば「設定なしで exit 0」は保ててしまい、help 文言の設定依存を検出できないため。観測は PYTHONPATH 注入の sitecustomize プローブで行い、実プロセスを 75 本起動するため slow レーンに分類)(#2308)。

  • refactor(packaging): command adapter に残っていた共有ロジックを business layer へ移し、commands/ を thin adapter に揃えた。benchmark の鮮度更新(ensure_benchmark_fresh)と JSON クエリ(find_latest_benchmark_json / load_benchmark_videos)を application/analytics/、DistroKid の disc 列挙を application/distrokid/、live / short 判定などの動画ポリシーを domains/analytics/benchmark.py、Suno の route 定数群を domains/suno/downloaded/models.py--target ディレクトリ解決を utils/channel_target.py、setup ディレクトリ契約を utils/setup_directory_contract.py へ移設(application/ / domains/ / utils/ から commands/ への import は 0 件)。ensure_benchmark_fresh は collector / analyzer / reporter を Protocol + factory で受け取る形にし、収集結果が空・サムネイル取得失敗のときに JSON 保存とレポート生成へ進まないことを tests/test_benchmark_collector_no_fallback.py で固定した。yt-skills の repo root 解決は「pyproject.tomlsrc/youtube_automation.claude/skills を備え、実行中のパッケージを含む checkout」を探索する方式へ変更し、深さ非依存かつ無関係な親ディレクトリを root と誤認しないことをテストで機械担保(#2308)。

  • feat(dashboard): デジタル庁のダッシュボード設計ガイドを基準に、初期表示を概況・データ前提・指標定義・チャンネル比較・詳細の判断順へ再構成。比較表に詳細導線を統合し、狭幅では行をカード表示に切り替えて横方向の見切れを解消。ダークテーマの背景を黒からニュートラルグレーの階調へ調整し、カードとの境界を識別しやすくした。ガイドブック35ページ掲載の全10色相・各5段階配色を切り替えて比較できるパレットUIを右上の設定パネルへ追加し、選択色を背景・見出し・指標カードにも反映。36・37ページに沿って純増登録者の正負を符号と意味色で統一し、棒グラフへ再生数を常時併記。全パレットのライト/ダークで棒3:1・値ラベル4.5:1以上を検証した(#2546)。

  • fix(skills): #2566 のテンプレ再構成で生じた、配布 skill から解決できない参照 5 件を修正(wf-new / wf-next / wf-statusCLAUDE.md §6setup/references/check-runbook.md の「fork 運用者向け」節、channel-new/references/claude-md-template.md のスキル一覧)。あわせて契約テスト tests/test_distributed_skill_references.py を追加し、節番号参照の禁止と wheel 非同梱 docs への新規参照の禁止を機械担保(既存 13 ペアは ratchet の allowlist として凍結し #2568 で解消)(#2567)。

  • docs(skills): 下流配布される CLAUDE.template.md を 256→70 行へ圧縮し、run_in_background 強制と sleep/until ポーリング禁止(規約「書かないこと」と矛盾)、skill description と重複するコマンド早見表・スキル一覧、下流で解決できない fork 運用者向け upstream パス表を削除。fork 参照一覧は docs/development.md へ移設。8 skill の「長時間処理の取り扱い」節を所要時間・ログ・完了報告だけに圧縮し、frontmatter 記法規約の実文重複を AGENTS.md / docs/development.md から解消(#2565)。

  • docs(skills): スキル記述規約へ「例より引数」「spec は検証可能な形で置く」を追加し、CLI の choices= / help= を単一ソースとする実行系インターフェース規約と、script / rubric / checklist / テストを spec として置く指針を明文化。あわせて段階的開示を実装し、setup 550→184 行、automation-update 572→466 行、masterup 738→565 行、suno-helper 337→291 行へ縮小して check runbook・fallback 経路・落とし穴を references/ へ分離(#2565)。

  • docs(skills): スキル記述規約を Claude 5 前提へ改訂し、「Sonnet-safe」7 ルール(判断の余地を残さない設計)を必須 3 点(不可逆操作の承認ゲート / 前提の存在ガード / 配布先で解決できる参照)+「書かないこと」リストへ再構成。22 skill の設定読み込みゲート冒頭文、10 skill の Subagent Contract 共通文、8 skill の run_in_background 指示を削減し、下流で解決できない docs/skill-design/ 参照 2 件を解消(#2565)。

  • refactor(dx): lefthook とローカル git hook・bootstrap wrapper(.lefthook/)を廃止し、品質ゲート(ruff / CHANGELOG / any 型)を CI へ一本化。any ゲートは .github/scripts/ へ、worktree TMPDIR 分離は .nix/worktree-tmpdir.sh へ移設し、yt-preflight の hook_policy 検査を削除。開発 bootstrap は direnv / nix develop(shellHook が uv sync)へ統一(#2534)。

  • refactor(config): yt-doctor・channel init/import・GCP bootstrap・Terraform apply からチャンネルルート .env の生成・検査・読込を削除し、GCP セットアップ完了条件を API/IAM/ADC quota project に限定(#2478)。

  • feat(skills): /suno/thumbnail/loop-video/alignment-checkdocs/channel/creative-constraints.md の担当セクションを毎回参照し、不在時は既存チャンネルを止めず /creative-constraints を案内(#2449)。

  • fix(masterup): config/channel/audio.json の目標尺を master loop 解決と upload preflight の SSOT にし、整数ループでは min–max を満たせない構成と目標尺外動画を明示 override なしで停止(#2469)。

  • feat(post-publish): 予約公開前の pinned-comment を pending_until_publish と実行可能時刻で履歴化し、公開後は同じ video ID で安全に再開。予定時刻超過後も private の場合は apply せず actionable error とする(#2470)。

  • feat(suno-helper): 通常時の Create 3–9秒・最大10 request を維持し、30秒内 burst と同一 run の Turnstile 検知時だけ中断可能な追加 cooldown/backoff を適用。正常投入で段階回復する共有 policy を serial/queue/retry に接続(#2472)。

  • docs(config): 配布 skill・README・認証/GCP 文書からチャンネルルート .env の作成・読込手順を除去し、ADC quota project・用途別 location・process env / OAuth file / 1Password の実経路へ統一(#2476)。

  • refactor(config): production Python からチャンネルルート .env の自動読込と python-dotenv 依存を削除し、Vertex AI client の location を用途別の内部固定値として必須化。GOOGLE_CLOUD_PROJECT / ADC の project 解決は維持(#2477)。

  • docs(workflow): thumbnail::textless.enabled: false の共有 main.jpg を wf-new・loop-video・videoup・wf-next が正規の文字入り動画背景として貫通させる契約を追加(#2458)。

  • fix(metadata-audit): channel audio の target duration(分)を秒へ正規化してからローカル動画尺と比較し、60〜90分を1分扱いする誤検知を解消(#2468)。

  • fix(masterup): libmp3lame の bitrate (-b:a) と VBR quality (-q:a) の同時指定を解消し、FFmpeg 8.1.2 の末尾 frame flush error を防止(#2466)。

  • fix(video-upload): 2026-06-01以降の YouTube Data API quota を videos.insert / search.list の独立100-call bucket とその他 endpoint の10,000-unit pool に分離し、plan と preflight を更新(#2467)。

  • fix(suno-helper): 可視で対話が必要な Cloudflare Turnstile challenge を CAPTCHA 待機へ接続し、非表示の background verification は誤検知せず、解消後に重複 Create なしで再開(#2471)。

  • fix(extensions): MV3 background の認証付き localhost mutation で runtime extension origin を明示送信し、サーバー側の exact extension lock と一致する場合だけ Origin: null / 省略を許可。Suno downloaded/unattended と DistroKid release の token 取得・stale token 1回再試行を同じ境界へ統一(#2465)。

  • feat(thumbnail): textless.enabled: false の opt-in で追加の textless 生成・承認を省略し、確定済み thumbnail.jpg を同一内容の main.jpg として検証付きで共用(#2457)。

  • fix(workspace): yt-channel-import が移行元・コピー対象内の通常ファイル symlink を安全検証後に実体化し、外部・対象外・壊れた・directory link は従来どおり rollback(#2462)。

  • fix(wf-auto): Suno の生成・playlist 追加・ZIP download・strict 検証を browser use で agent が完走し、人間への handoff を login / CAPTCHA の該当操作だけに限定(#2454)。

  • feat(flop-analysis): postmortem の一般化可能な学びを、出典付きの禁止制約案として明示承認後に creative-constraints.md へ還流する最終工程を追加(#2451)。

  • feat(masterup): 全曲の integrated LUFS 最大差を既定 2.0 LU で検証し、逸脱時は明示承認までマスター結合を停止するゲートを追加(#2450)。

  • docs(workflow): takt workflow routing を廃止し、GitHub issue + /issue-direct + linked worktree を正規開発経路として文書化(#2453)。

  • feat(masterup): Suno 個別音源 cleanup を既定 ON にし、曲ごとの -14 LUFS 正規化と明示 opt-out を標準化(#2445)。

  • feat(loop-video): Veo / Omni の既定プロンプトへ全画面の明滅・ストロボ・急な輝度変化・顔アップを避ける注意誘引ガードを追加(#2446)。

  • feat(suno): 既定 Exclude Styles に sudden drops・risers・drum fills・hard transitions・dramatic buildups を追加(#2447)。

  • feat(suno): data/insights.jsonl の検証済み lever=bgm open entry をStyle・Exclude Styles設計へ還流する読み取り経路を追加(#2448)。

  • feat(skills): ペルソナと視聴シーンを、音・映像・サムネ・タイトル・測定の機械検証可能な制約へ翻訳する /creative-constraints を追加(#2442)。

  • feat(skills): シーン定義・制約翻訳・公開前ゲート・指標還流の価値ループを読み取り専用で診断する /value-loop-audit を追加(#2443)。

  • refactor(domains): Analytics、thumbnail、media、DistroKid、weekly vote の domain 公開面を追加し、consumer の旧 owner 参照を domain 境界へ接続(#2306)。

  • fix(upload/oauth): upload と OAuth の CLI 境界で想定されたドメイン・入出力エラーを安全に終了し、redaction の共有 infrastructure owner と現行移行先ドキュメントを正本化。

  • B4 の OAuth / secret / retry / error infrastructure owner と playlist の YouTubeClients 注入契約を整理。

  • fix(doctor): workspace root の --channel 選択を診断対象へ反映し、channel 配下からの診断でも root の pyproject.toml・共有 skills・.agents/skills・重複ファイル検査を利用するよう修正(#2463)。

  • breaking(refactor/domains): Suno 14旧 utils.suno_* module と utils.metadata_generator を削除し、domains.suno / domains.suno.downloaded / domains.metadata へ移行。旧 import path は恒久 facade として提供しない(#2305)。

  • feat(skills-sync): Claude Code settings の allow / deny / hook を既存値保持・hook 明示承認付きで downstream へ JSON merge 配布し、開発専用 skill を同期対象外として既存配置は prune 可能にした(#2425, #2426, #2428)。

  • fix(upload): assets.master_video を動画選択の正本にして Preview 誤選択を防ぎ、plan で全 locale の100文字制限を検証。タイトル短縮の再承認と公開時刻 conflict の停止契約も追加(#2429, #2434, #2437, #2438)。

  • fix(videoup): runtime mask helper を uv 環境で起動し、overlay を一回だけ切り替える env / CLI override を追加(#2430, #2431)。

  • fix(suno-helper): duration 再生成後は最新 clip pair を playlist 対象に採用し、collection server の拡張検出 fail-loud 契約と redirect 時の起動ログ即時出力を明確化(#2432, #2433, #2439)。

  • docs(workflow): thumbnail 自動選択と承認 gate の組合せを決定表にし、長時間 subagent の Monitor arm + self-stop を禁止して active polling を正規化(#2435, #2436)。

  • feat(workflow): /wf-auto の企画選択、企画プレビュー費用、Lyria 生成、動画プレビュー、Veo 課金・品質確認をチャンネル単位の明示 opt-in skip 設定で無人化し、既定の承認停止、安全上限、監査用成果物を維持(#2416, #2418, #2419, #2420, #2421, #2422)。

  • feat(dashboard): 全チャンネルの公開予約ストック・更新状態・主要Analytics指標を横断比較できる一覧テーブルを追加し、在庫昇順、未取得の分離、在庫閾値の警告、狭い画面での内部横スクロールに対応。

  • refactor(configuration): 設定 owner を youtube_automation.configuration へ移し、wf_next.approval_gatescomments.rules を廃止して旧キーを ConfigError で拒否。skip_audio_approval / skip_upload_approvalwf-batch の新経路を正本化(#2304)。

  • fix(dashboard): 選択前から全チャンネルの主要指標をカード一覧で比較できる構成へ変更し、折り返し可能な Badge 群によって狭い画面でも更新状態・公開予約数が右端から見切れないように修正(#2399)。

  • refactor(skills): chain manifest の正規承認 field を approvalGate.skip へ移行し、true = 承認省略 に統一。旧 enabled は反転解決する後方互換 alias として受理し、新旧同時指定は拒否(#2404)。

  • refactor(config): workflow.post-publish.skip_approvals を正規キーとして追加し、true = 承認省略 に統一。旧 approval_gates は逆向きの後方互換 alias として維持し、同一 step の新旧同時指定は拒否(#2403)。

  • refactor(workflow): /automation-run 互換 skill を削除し、一気通貫 workflow の公開入口を /wf-auto に一本化。旧 target_workflow: automation-run は黙って変換せず移行案内付きで拒否し、.automation-run/ の lease・履歴パスは維持(#2400)。

  • security(scripts): open / ffmpeg へ渡すファイルパスを絶対パス化し、先頭 - を option と誤解釈する余地を排除(#2396)。

  • security(streaming): stream key / Discord webhook の Terraform file provisioner staging を素の /tmp から root 所有 0700 の /run/youtube-stream-provision へ移し、転送直後の権限露出を解消(#2395)。

  • security(auth): 1Password fallback の client_secrets を tempfile 経由から in-memory 渡しへ変更し、異常終了時に平文 JSON がディスクへ残る経路を削除(#2394)。

  • chore(actions-deps): CI / dashboard / extension release workflow の外部 action を最新安定版へ更新し、全 uses: を version コメント付き immutable commit SHA に統一する supply-chain 契約を追加(#2357)。

  • chore(terraform-deps): 3 stack の Terraform CLI を 1.15.x、Google / Vultr / null / external / tls provider を最新安定 major の bounded constraint へ更新し、lockfile と静的検証契約を同期(#2358)。

  • chore(extensions-deps): 3 helper と shared UI の npm 依存、security overrides、pnpm toolchain を最新安定版へ統一し、4 workspace の lockfile・Nix・release 検証契約を同期(#2356)。

  • chore(deps): Python の runtime / development dependencies と Nix input を最新安定版へ更新し、google-genai 2 系・Python 3.14 開発環境へ移行。japanize-matplotlib の Python 3.12+ 互換用に公式推奨の Setuptools distutils shim を明示し、deprecated の google-auth-httplib2 は Google API client の transport 依存が残るため 0.4.0 へ更新して残置判断を再記録(#2355)。

  • fix(dashboard): チャンネル概要行を縦積みと折り返し可能な Badge 群へ変更し、狭いカード幅でも更新状態・公開予約数・動画数が右端から見切れないように修正(#2399)。

  • feat(dashboard): yt-dashboard の通常起動時に全登録チャンネルの Analytics を直列更新し、失敗をチャンネル単位で隔離して前回 snapshot を表示する。概要カードの「準備完了」を YouTube の将来 publishAt に基づく 公開予約 N本 へ置き換え、OAuth のない E2E / 配布確認用に --skip-refresh を追加(#2397)。

  • feat(dashboard): React / Vite と公式 shadcn/ui Base UI primitives による読み取り専用 Analytics dashboard、同一 origin の loopback Python server、yt-dashboard --port/--open、keyboard 操作、light / dark theme、Vitest / Playwright / wheel smoke を追加(#2385)。

  • feat(dashboard): ~/.config/tayk/channels.json の絶対 path registry loader と、各チャンネルの最新 Analytics snapshot を概要・動画指標・CTRへ正規化する読み取り専用 read model/APIを追加。snapshot 欠損・破損・meta 不正はチャンネル単位の状態として隔離する(#2387)。

  • refactor(workflow): /wf-auto を一気通貫 workflow の正規入口にし、scheduler の新規既定を wf-auto へ変更。/automation-run は既存の明示設定を保つ薄い互換 alias とし、.automation-run/ の lease・履歴パスは維持する(#2383)。

  • feat(workflow): /wf-auto を追加し、active collection が無い場合は state を捏造せず /wf-new から開始し、作成された collection を同じ run で固定して制作・公開・post-publish まで再評価する一気通貫入口を実装。既存 collection の再開、無人実行の手動介入履歴、公開禁止、upload reconciliation、完了済み公開後処理の契約を共有 resolver で維持する(#2382)。

  • videoup の overlay H.264 encoder を同一条件で計測し、既定の libx264 経路を維持しつつ、VideoToolbox / NVENC の明示 opt-in、codec 固有引数、利用不能・起動失敗時の libx264 fallback、再現可能な benchmark を追加(#2372)。

  • feat(live-chat): アクティブ配信を検出し、YouTube の指定間隔で新着チャットを取得、Codex の構造化判定と機械フィルタ・返信上限・履歴による重複防止を通して投稿する yt-live-chat-reply を追加(#2374)。

  • feat(streaming): ライブチャット返信 daemon を opt-in で既存 Vultr VPS に同居させ、ephemeral Terraform 変数による 1Password 認証注入、専用 systemd service、Codex CLI / Python package の pin 配備と無効化時の安全な削除を追加(#2375)。

  • docs(live-chat): 配信中チャットの設定・人間認証・1Password 保存・VPS 配備・検証・障害復旧を一気通貫で案内する /live-chat-reply skill を追加し、/comments-reply/streaming との相互排他、設定サンプル、主要モジュール文書を整備(#2376)。

  • /automation-schedule の既定登録先を Codex / Claude のネイティブ Scheduled Task へ移し、依存性に応じた Cloud/local 分岐、backend ID による重複防止、明示承認時だけの launchd / cron fallback を追加しました(#2369)。

  • feat(channel-new): 承認済み TTP ごとの再生数上位 5 Long VOD から Shorts / live を除外して初期動画尺の min/max を外向き丸めで導出し、根拠提示・ユーザー承認・audio.json 反映・承認済み例外・yt-doctor 完了ゲートを追加(#2368

  • fix(suno-helper): 投入方式の選択 radio に残っていた青い info 色の override を撤去し、枠と中央ドットが overlay の primary ブランド色へ追従するように統一(#2366

  • fix(suno-helper): 投入方式の選択中カードでタイトルと説明文を黒い foreground 色へ戻し、枠・淡い背景による選択表示は維持(#2364

  • refactor(extensions-ui): 3 helper の手組みフォーム・空状態・警告・確認 UI を公式 shadcn/ui Base UI の Field / Input / Select / Alert / AlertDialog / Empty / ScrollArea へ移行し、ShadowRoot portal・最前面表示・選択前の配信元更新・既存 data / ARIA 契約を維持(#2360

  • fix(extensions): Suno・DistroKid Helper のヘッダーと primary 系 UI を指定 OKLCH 配色へ統一し、実描画色に対する WCAG AA コントラスト検証を追加(#2352

  • fix(extensions-ui): shared Shadow DOM theme の spacing・typography・radius・responsive token を px 基準へ固定し、ホストページの root font-size が Helper overlay の視認サイズを縮小しないように修正(#2351

  • fix(suno-helper): コレクション一覧と楽曲一覧を shared shadcn/ui Scroll Area へ移行し、件数が多い場合は同じ高さ上限で一覧内を縦スクロールできるようにした(#2353)。

  • feat(extensions): Suno・DistroKid・Community Helper の共通 overlay ヘッダーへ、公式一次資料に基づく識別可能なサービス別配色と WCAG AA コントラスト検証を追加(#2327

  • refactor(community-helper): native popup を YouTube チャンネル投稿ページ上の shared shadcn/ui Shadow DOM overlay へ移し、drag・viewport clamp・最小化・action toggle・reload 復元を追加した。run / stop / progress / error は background が送信元と同一タブへ relay し、既存の server fetch 境界と投稿 runner を維持する(#2320)。

  • refactor(distrokid-helper): popup UI を distrokid.com/new 上の shared shadcn/ui Shadow DOM overlay へ移し、drag・viewport clamp・最小化・action toggle・reload 復元を追加した。command / progress は background が送信元と同一タブへ型付き relay し、既存 fetch・フォーム注入・停止・配信済み記録を維持する(#2319)。

  • feat(suno-helper): 完了通知 UI を shared shadcn/ui Switch 1つへ簡素化し、最終 FINISHED / ERROR で OS 通知と状態別の固定 Web Audio を独立して発火するようにした。旧 preset は enabled を維持して自動削除し、通知失敗は run 結果へ影響させない(#2334)。

  • refactor(extensions-ui): draggable overlay の shell・pointer drag・viewport clamp を shared UI、状態型・純関数・helper key 注入型 storage adapter を extensions shared へ抽出した。Suno は共通 consumer へ移行し、既存 selector・最小化・action toggle・reload 復元を維持する(#2318)。

  • fix(extensions-ui): Suno / DistroKid / Community helper を OS の配色設定に依存しないライトテーマへ固定し、薄いグレーのページ背景と白い card / popover を共通 token に定義した。dark variant・system theme watcher・dark theme token を撤去して3拡張の表示契約を統一した(#2326)。

  • feat(suno-helper): コレクション一覧と楽曲一覧を shared shadcn/ui Collapsible で個別に折りたためるようにし、初期状態を閉、見出しに件数を表示した。楽曲一覧の既存スクロール上限と選択・実行ロジックは維持する(#2330)。

  • refactor(extensions-ui): shared Alert / Button / Card / Checkbox / Field / Label / RadioGroup / Select を現行 shadcn/ui Base UI registryへ再同期し、完全な Field composition、invalid state、現行 size・animationを追加した。独自 status variant、Radio選択色、ShadowRoot内Select portalは維持する(#2324)。

  • feat(suno-helper): paused / completed の collection queue summary にアクセシブルな Close を追加し、paused はインライン確認後、completed は即時に永続 queue state を削除できるようにした。running queue と単発 Resume state は破棄対象外とする(#2328)。

  • fix(extensions-ui): shared Base UI RadioGroupItem の選択時 root 塗りつぶしを除去し、semantic color の円枠と中央配置した indicator dot で状態を示す公式 primitive 構成へ是正した。Suno の mouse / keyboard 選択、保存、disabled、カード配色は維持する(#2332)。

  • feat(extensions): Suno / DistroKid / Community helper に用途とブランド色を区別できる透過 PNG アイコンを追加し、WXT が 16 / 32 / 48 / 128px の manifest icon を自動検出する契約を固定した(#2335)。

  • fix(suno-helper): 曲リストとコレクション選択の checkbox をラベル先頭行へ揃え、異常値再生成 OFF の余白も同じ 2px 基準へ統一した。1行時のカード中央配置、完了音、選択 callback・ARIA は維持する(#2325)。

  • perf(ci): issue イベントごとの lint workflow を廃止し、PR / main push の changed path を共通 classifier で判定するようにした。required lint / test は常時結果を返しつつ、extension-only 変更では Python full suite・wheel smoke・Windows・ADR を起動せず、Extensions も影響 helper だけを検証する(#2333)。

  • chore(extensions-ui): 公式 shadcn/ui skill をリポジトリ管理下へ導入し、Claude Code / Codex / wheel sync で共有する info・公式docs・registry diff先行のUI実装手順を追加した(#2323)。

  • fix(collection-serve): collections/planning の Suno 一覧と個別 prompts 配信から、対応する collections/live/<id>/workflow-state.jsonphase: complete の collection を除外した。不在・破損・未完了状態は従来どおり表示し、DistroKid 一覧にはフィルタを適用しない(#2331)。

  • fix(suno-helper): 異常値再生成オプションを1行時は中央、説明表示時は先頭行へ揃え、曲リストのチェックボックスにコレクションカードと同じ余白基準を適用した(#2316)。

  • fix(suno-helper): 投入方式の選択カードを薄い info 背景と青い枠へ調整し、light / dark の両方でモード名と説明文を読みやすくした(#2315)。

  • docs(channel-new): localization 言語の生成規則を、TTP 多言語では競合セットを完全踏襲、TTP 非多言語では en のみ、非 TTP では単一言語・localizations 省略可の 3 分岐へ固定した。独自の高 CPM 言語追加を廃止し、生成テンプレートから de を除外した(#2295)。

  • fix(doctor): yt-doctor の OAuth / Reporting 診断が期限切れ access token を refresh token で自動更新し、更新結果を token.json へ安全に保存するようにした。refresh token が失効・欠落した場合だけブラウザ再認証を案内し、2 診断の token 判定を統一した(#2293)。

  • fix(viewer-voice): yt-benchmark-commentscommentThreads.list に必要な youtube.force-ssl を持つ full-scope token を使うよう修正し、readonly token 発行済み環境で全件 403 になる問題を解消した(#2286)。

  • fix(collection-preflight): 単一言語チャンネルでは共有 requires_scene_phrases() 判定に従って scene_phrases を要求せず、多言語時だけ検証するよう修正した(#2270)。

  • docs(auth): doctor の YouTube OAuth next_action と /setup を、AI/setup が uv run yt-oauth を background 起動して stdout の同意 URL を中継・exit待機・doctor再検証し、人間はブラウザ同意だけを担う契約へ統一した(#2279)。

  • feat(videoup): ring visualizer が fill.type: conical の角度→色相フルスペクトル充填を振幅・円弧 mask 内へ合成できるようにし、旧 channel-local ring patch の設定移行表を追加した(#2278)。

  • fix(doctor/automation-update): OAuth token の失効時に upload_readyRefreshError でクラッシュせず再認証用の構造化 fail を返すようにし、channel_config=ok なら他 doctor check の非ゼロ終了で apply を失敗扱いにしないよう修正した(#2277)。

  • fix(automation-update): tag pin の check/apply が GitHub release 一覧から本体の stable vX.Y.Z だけを publish 日時順で選ぶようにし、より新しい ext-vX.Y.Z 拡張 release を追従先と誤認して exit 2 になる問題を修正した(#2276)。

  • test(pytest): repository / docs / CI / packaging の静的契約を repo_contract、実 tool・process・待機を伴うテストを slow marker へ分類し、製品 behavior 用 fast lane と変更種別別の最小コマンドを追加した。CI の無選別 full suite は維持する(#2268)。

  • test(packaging): candidate wheelを隔離venvへinstallし、空の擬似下流への全asset sync、sourceとの完全一致、.agents/skills symlink、installed yt-skills diffの差分なしをCIとローカルで同じpytest targetから検証できるrelease前E2E smokeを追加した(#2266)。

  • fix(skills): thumbnail の Codex 単発・batch と videoup の fill helper が fresh / partial worktree で通常の uv run により依存同期してから project code を実行するよう統一した。禁止語 config を読めない場合は Codex 起動前に fail-closed とし、環境不備と config 不備を復旧手順付きで区別する(#2269)。

  • fix(doctor,setup): setup の全コマンド起動・実行・再診断を AI / setup 側へ統一し、認証時の人間の責務をブラウザ上のログイン・アカウント選択・OAuth 同意・秘密情報入力だけに限定した。認証 action は実行主体・人間の役割・起動コマンドを構造化して返し、--apply の無人認証拒否は維持する(#2262)。

  • refactor(extensions): 3 helper の shadcn/ui Button・Card・Alert・Select、cn()、Tailwind theme contract を workspace package @youtube-automation/ui へ集約し、各 helper の単体 install / test / build / zip 契約を維持した(#2246)。

  • refactor(community-helper): Popup を shadcn/ui の Button・Alert・Card primitive と共通 theme token へ移行し、既存の server URL、互換性確認、3 投稿進捗、エラー表示の挙動を維持した(#2245)。

  • docs(setup): /setup wizard の automation 導入後ループを yt-doctor --apply --json に統一し、completed / human_required / decision_required / command_failed の停止理由ごとに対話・再実行する手順へ更新した。変更前の明示承認と project・billing flag の累積保持を定め、automation 導入前の bootstrap、HUMAN STEP、トラブルシュートは維持した(#2226)。

  • feat(doctor): yt-doctor --apply を追加し、next_action.kind=ai-exec の診断・実行・再診断を human/project・billing 決定待ち/完了まで連続化した。停止理由と実行履歴は JSON で返し、対話 OAuth は実行せず、失敗・無進捗時は check・command・stderr を保持して停止する(#2225)。

  • feat(suno-helper): FINISHEDERROR を区別する Web Audio 合成音を追加し、shadcn/ui の完了音 ON/OFF・3 preset・試聴 UI と永続設定を overlay に追加した。手動 STOPPED では鳴らさない(#2077)。

  • feat(suno-helper): collection 選択を shadcn ベースの checkbox 一覧へ拡張し、選択順ではなく server 一覧順で生成・playlist 追加・ZIP download を直列実行する永続 queue を追加した。collection 間はページ reload で clip tracker / multi-select を分離し、部分失敗後も後続を継続して成功・失敗 summary と失敗分再実行を提供する(#2029)。

  • feat(thumbnail): 単発 codex-image.sh を変更せず、config/CLI で同時起動数を制御し、preflight を 1 回だけ行って複数候補を並列生成する codex-image-batch.sh を追加した。部分失敗時も残りを完走して失敗一覧を返す(#2028)。

  • refactor(channel-new): standalone /channel-research/channel-new の第 6 モード「分析モード」へ挙動不変で統合し、既存の入力 gate、subagent 委譲、TTP 分析、成果物パスを維持したまま skill と導線を集約した(#2027)。

  • feat(thumbnail): 伸びた動画の CTR と流入構成からサムネ寄与を gate し、勝因を 1 要素ずつ Studio 比較して検証済み champion を次回 /thumbnail の internal TTP へ還元する /thumbnail-iterate を追加した。複数要素が独立して勝った場合は機械的に合成せず、一貫した再生成と最終比較を要求する(#1969)。

  • feat(workspace): yt-channel-import を追加し、既存の単一 channel repository から channel 固有データだけを channels/<slug>/ へ transaction copy できるようにした。meta 由来 slug の確認、必須 config と実 load の検証、auth 所在報告、symlink / 上書き拒否、生成 media を除外する workspace .gitignore scaffold、.env / CHANNEL_DIR 警告、共通 yt-skills sync 案内と external user 向け移行・rollback・archive ガイドを追加した(#1949)。

  • feat(workflow): /automation-run を追加し、active collection 1 件を durable lease 下で選択して、Lyria / Suno の音源生成、masterup、動画・metadata 生成、公開許可付き YouTube upload、post-publish まで既存 skill へ状態駆動で委譲できるようにした。工程ごとに成果物を再評価し、失敗・手動介入・公開未許可では停止理由と再開地点を履歴へ記録する。定期実行の既定 target は automation-run とし、未設定チャンネルの enabled: false / allow_external_publish: false は維持する(#1894)。

  • feat(suno-helper): 定期実行用の loopback 限定 launch URL 契約と CLI を追加し、collection / entry / DL 形式 / entry・concurrency・retry 上限を指定可能にした。既存 resume state から entry / playlist / download を重複なしで再開し、上限超過は checkpoint、ログイン・CAPTCHA・課金確認・UI 非互換は手動介入理由として保存する。手動 overlay flow は従来挙動を維持する(#1893)。

  • feat(extensions): community-helper を統一 ext-v* Release の build / zip / asset / インストール案内へ追加し、Extensions CI で Oxlint + Oxfmt、TypeScript、Vitest、WXT build を必須化した。release 前の単一検証スクリプトと automation-release の asset 完了条件も3拡張へ同期した(#1715)。

  • feat(extensions): community-helper の content runner を実装し、3 投稿の本文・画像・予約日時・確定を逐次処理する。localhost fetch と画像の base64 wire 転送を background の extension context へ移し、途中失敗時の composer cleanup と重複再実行ロックを追加した。content injection は YouTube チャンネル投稿ページに限定し、Studio page-origin CORS 例外を撤去した(#1714)。

  • feat(extensions): 実機 DOM map に基づく shared/community-dom.ts を追加し、community-helper の本文注入、画像添付、予約日時設定、投稿完了待機を locale-independent な selector と open Shadow DOM fallback で fail-loud に実装した(#1713)。

  • feat(extensions): community-helper の WXT + React + TypeScript スキャフォールドを追加し、YouTube Studio 限定の MV3 最小権限、Studio origin に限定した /version CORS 互換チェック、Popup の 3 投稿進捗、型付き background/content relay を実装した(#1712)。

  • feat(extensions): community-helper 共通層に CommunityPost wire 型、投稿 JSON/画像の fail-loud API client、runner フェーズ定数を追加した(#1711)。

  • feat(collection-serve): community-helper 向けに GET /community/posts.json と投稿画像ルートを追加し、channel root 内の画像だけを Content-Type 付きで配信する。Chrome 拡張と YouTube Studio origin の CORS、および共有 route 定数を同時に追加した(#1710)。

  • feat(community): /community-draft--batch 専用の決定的 JSON generator へ移行し、旧 type 別 Markdown/clipboard フローを撤去した(#1709)。

Added

  • yt-channel list を追加し、workspace 内の利用可能な channel slug を副作用なく一覧表示できるようにした (#2052)

  • skills: /video-upload 後続を config opt-in の /post-publish チェーン(community-post → pinned-comment → metadata-audit)へ委譲し、step ごとの承認ゲートと video ID 単位の再開可能な実行履歴を追加した。workflow.post-publish 未設定時は従来の community-post 単独案内を維持する (#1824)

  • feat(loop-video): yt-generate-loop-video--engine {veo,omni} を追加した。既定の Veo 経路は維持し、--engine omni では Gemini Developer API の gemini-omni-flash-preview を API key 認証で呼び、画像→動画の一発生成、URI delivery の完了待ち、ループ補正まで行う。モデル名・timeout・poll 間隔は skill-config の omni セクションで上書きできる(#1722)。

  • 動画構成を明示する video_type 契約を追加し、loop/static の背景選択と将来の生成 hook 拡張ポイントを整備 (#1723)

  • feat(community): optional の config/channel/community-draft.json::community_draft を型付き設定として追加し、投稿テンプレート、決定的な変数ソース、公開 timezone 基準の予約日時算出契約を定義した(#1707)。

  • feat(videoup): workflow-state.json v2 の assets.master_audio / assets.master_video を基準に未動画化コレクションを検出し、既存 generate_videos.sh を collection 単位で並列実行する yt-generate-videos-batch CLI を追加した。成功時の assets.master_video 更新はファイルロック下で直列化し、--include-live と CLI / env / skill-config による並列度指定を提供する(#1658)。

  • docs(loop-video): loop.mp4 の生成・リトライ・継ぎ目補正後に動画プレイヤーを開き、静止画 fallback・動き・ループ継ぎ目を目視確認する必須承認ゲートを追加した。不受理時は --smooth または課金再承認付き Veo 再生成へ戻し、再プレビューで承認されるまで /videoup へ進まない(#1717)。

  • feat(auth): multi-channel workspace の OAuth client secret 解決を channel 配下優先・workspace ルート auth/client_secrets.json fallback に拡張した。複数チャンネルが個別の client secret を持つ場合、yt-doctor はルート共有へ統合可能であり全チャンネルの再認証が必要なことを info レベルで案内する。強制・自動統合は行わず、単一チャンネル構成の挙動は維持する(#1950)。

  • feat(thumbnail): ab_test.enabled と最大 3 件の pattern(name / variation)を skill-config に追加し、yt-generate-image --ab-pattern が pattern 別 clause を最終プロンプトへ合成できるようにした。/thumbnail は全 pattern を個別承認して thumbnail-<name>.jpg を確定し、先頭 pattern と同一内容の thumbnail.jpg を維持する(#1904)。

  • feat(workflow): チャンネルごとの定期制作設定 workflow.scheduled_automation(有効化 / timezone / run_time / cadence / 対象 workflow / 再試行 / 並行実行禁止 / 通知 / 外部公開許可)を optional で追加し、未設定チャンネルは全 default(enabled: false)で従来挙動を維持する。新規スキル /automation-schedule を単一入口として、前提診断(detect_runtime.sh)→ config 生成・差分更新(schedule_config.py、loader と同一検証)→ Claude Code(claude -p)/ Codex(codex exec)向け定期実行ジョブの作成・更新・確認・停止(scheduler_job.sh、launchd / cron へ同一 label で冪等反映)を行えるようにした。実行ラッパー run_scheduled.sh は lock による実行排他・再試行・allow_external_publish: false 時の外部反映禁止プロンプト注入を担い、外部公開の有効化には skill の明示承認ゲートを必須とする(#1892)。

  • Breaking: benchmark 系 CLI の競合 slug 指定を --channel から --competitor へ即時リネームした。対象は yt-benchmark-collect / yt-video-analyze / yt-thumbnail-compare / yt-benchmark-comments で、旧 --channel は alias として受理せず移行先を明示して終了する(#1948)。

  • skills: /analytics-run を追加し、Analytics の収集・分析・最新レポート表示を成果物鮮度に基づいて一括実行・途中再開できるようにした (#1823)

  • feat(strategy): 状態を持たず任意実行できる /market-research skill を追加した。TTP 入替候補とニッチ仮説を根拠・不確実性付きで会話内に返し、明示依頼時だけ日付付き Markdown を保存する。/channel-new から /discover-competitors と用途を分けて案内し、config や TTP は自動変更しない(#2051)。

  • docs(skills): 全 48 SKILL.md の frontmatter 直後に機械抽出可能な 前工程 / 後工程 ブロックを追加し、散文・矢印形式の依存一覧を統一した。skill-authoring-guidelines.md に書式、なし / 共通基盤の表現、rg 抽出方法、実在例を規定した(#1821)。

  • feat(videoup): overlays.audio_visualizer.style: "heart" を追加した。cardioid の角度と法線距離へ showfreqs を再マッピングし、実行時生成する離散バー mask で、音楽スペクトラムがハート輪郭上を内外へ波打つ。既存の fill / rounding / glow と組み合わせられ、外部 asset は不要(#1689)。

  • 対応する yt-* CLI に共通の --channel <slug> 選択を追加し、CHANNEL / CHANNEL_DIR / cwd から multi-channel workspace の対象チャンネルを安全に解決できるようにした (#2049)

  • docs(setup): yt-doctor の upload 診断を /setup の利用者導線へ接続し、YouTube チャンネル未作成時の HUMAN STEP、remote channel ID の yt-channel-settings pull --channel-id-only 反映、local / remote ID 不一致時の非自動選択、quota / auth / network 失敗時の再試行・再認証導線を明記した(#2054)。

  • fix(takt): repo-local .takt/config.yaml から provider / model routing と concurrency の重複指定を除去し、グローバル設定を正しく継承するようにした。persona_providers が deep merge されず project 側の辞書で丸ごと置換される takt 0.51 の解決契約をテストで固定し、グローバルの Luna / Sol / Terra 割当が失われる回帰を防止する。repo-local lite は worktree 環境契約だけを差分として残し、グローバル版の max_steps: 18 / loop threshold 5 へ同期した。project facet には takt 0.51 builtin の Knowledge / Policy 確認と最新の CI 委譲ルールを取り込んだ。

  • feat(analytics): benchmark.channels の pre-filter 投稿走査を upload_scan として保存し、60 日以上の投稿停滞と直近 90 日平均再生数の前期比 50% 以下を判定する yt-ttp-health を追加した。/analytics-analyze の analysis JSON を schema v2 に更新し、健全・アラート・データ不足・入力欠損を区別する ttp_health を必須化した(#2050)。

  • feat(videoup): overlays.audio_visualizer.style に後方互換の barmirror-mountain / ring / ring-line preset を追加した。bars / size / position / ring.inner_r / ring.length / ring.arc_deg を config から filtergraph へ反映し、不正 style は ffmpeg 起動前に有効値付きで拒否する。追加 style のバー間隔・円弧マスク PNG は同梱 Python helper が一時領域へ実行時生成するため、外部素材・補助スクリプトは不要(#1684)。

  • feat(videoup): overlays.audio_visualizerfill(solid / gradient / rainbow)、中央鏡像、上下対称、角丸、nested glow を追加した。gradient / rainbow 素材は yt-audio-visualizer-fill が実行時生成し、不正な配色は FFmpeg 起動前に拒否する。既存の fill 未指定・フラット glow config は従来挙動を維持する(#1686)。

  • feat(thumbnail): auto_selection.modeselection_only / full)を追加し、CLI 結果と workflow-state 監査ログへの mode 記録、監査値の strict 検証、full で適格候補ゼロ時の手動フロー切替ガイダンスを実装した(#2166)。

  • feat(captions): suno-lyrics.jsondescriptions.md のトラック開始時刻・総時間から、各トラック区間へ歌詞行を均等配置した重複なし SRT を生成する yt-captions-upload を追加した。--apply では YouTube Data API の captions resource を使い、同一言語の既存字幕を対話確認または --existing update|skip で更新・スキップして二重追加を防ぐ。captions list / insert / update の quota も発行 request 単位で記録する(#1809)。

  • feat(doctor): yt-doctor の upload preflight が認証済み YouTube アカウントの実チャンネルを channels.list(mine=true) で確認し、チャンネル未作成・ローカル ID 不一致・認証 / quota / network 起因の API 失敗を区別して案内するようにした。成功時と不一致時は --jsondata に remote channel ID を含め、ローカル設定だけでは検出できなかった token / meta.json の取り違えを upload 前に停止する(#2053)。

  • feat(auth): OAuth token の scope 分離を導入し、read-only skill が write scope の token を共用しない設計にした。YouTubeOAuthHandlerREADONLY_SCOPESyoutube.readonly + yt-analytics(.monetary)?.readonly、write scope なし)と用途別 token auth/token.readonly.json の発行・解決(create_readonly / readonly_token_path。探索順は #1721 と同じ channel 側 → main worktree 側)を追加し、新 CLI yt-oauth--readonly で readonly token 発行)を登録した。ServiceRegistry の read 系(analytics / reporting / 新設の youtube_readonly / credentials_readonly / get_readonly_handler)は readonly token を優先し、未発行時は warning ログで発行手順を案内した上で token.json へフォールバックする(サイレント失敗しない。既存運用は無変更で動作)。read-only 系呼び出し元(analytics 収集 / benchmark / channel-status / metadata-audit / playlist-status / discover-competitors / stream-bandwidth)を readonly 経路へ移行し、write 系(upload / playlist 管理 / bulk update / コメント投稿)は従来どおり token.json を使う。skill × 実効 scope の対応表と運用手順を docs/oauth-scopes.md に新設した(#1699)。

Added

  • feat(videoup): generate_videos.sh --preview [15-30] で effect / audio visualizer / subscribe popup を反映した短尺 MP4 を 01-master/<Collection>-Preview.mp4 として生成できるようにした。プレビューは全尺 Master と workflow state を更新せず、全尺の経路種別・時間見通しを表示する。/videoup は visual 設定が有効な場合、プレビューの明示受理前に全尺エンコードへ進まない(#1749

  • yt-retention-timeline を追加し、収集済み retention drop を /video-analyze の scene / BGM 区間へ自動照合して JSON / Markdown レポートを生成できるようにした (#1814)

  • feat(cost): 動画 metadata 一括更新 3 CLI(yt-bulk-update-desc / yt-shorts-bulk-update-loc / yt-bulk-update-synthetic-media)に YouTube Data API quota 記録(cost_tracker.log_quota)を配線した。read-before-write を含む発行済みリクエスト 1 回につき 1 エントリ(videos.list / channels.list / playlistItems.list = 1 unit、videos.update = 50 units)を記録し、dry-run は実際に発行した read のみ、batch / pagination はリクエスト回数と記録件数が一致する。quota はリクエスト失敗時も消費されるため、update 失敗時も記録した上で従来の例外・部分進捗契約(continue / exit code / 最初の失敗の再 raise)を維持する(#2058)。

  • feat(cost): channel status・stream key・metadata audit・playlist status の read API 呼び出しに quota 記録を配線した。yt-* 4 CLI(get_channel_status / yt-fetch-stream-key / metadata_audit / playlist_status)の各 read リクエスト(channels.list / playlists.list / playlistItems.list / liveStreams.list / videos.list、Analytics は reports.queryyoutube-analytics-api として別 service で記録)が、成功・失敗のどちらでもリクエスト 1 回につき cost_tracker.log_quota を 1 回だけ呼ぶ(pagination はページ = リクエスト単位で記録)。tracker が書き込み不能・例外を吐く場合も従来の出力と終了状態を変えない(--stdout の pipe 契約保護のため警告は stderr へ逃がす)。benchmark / upload agent の read API と write API は兄弟 issue のスコープ(#2055)。

  • feat(cost): benchmark read API の quota 記録を配線した。benchmark_collector の channels / playlists / playlistItems / videos 各 list request と fetch_benchmark_comments の commentThreads.list が、page / バッチ単位の request ごとに cost_tracker.log_quota("youtube-data-api", "<method>.list", 1) を記録する。quota は失敗した request でも消費されるため記録は成否に関わらず行い(try/finally)、元例外の伝播・既存のエラーハンドリング・benchmark JSON / CLI 出力は変更しない(#2056)。

  • feat(cost): pinned comment workflow(yt-pinned-comment)に YouTube Data API quota 記録を配線した。preflight の videos.list(part="status") は 50 件 chunk の request ごとに 1 unit、--video-id 経路のタイトル取得 videos.list(part="snippet") も request ごとに 1 unit、commentThreads.insert は投稿 1 回ごとに 50 units を cost_tracker.log_quota で記録する。HttpError 時(API 処理済み = quota 消費済み)も記録した上で元の例外ハンドリングを維持し、dry-run / skip(already_posted / private / not_found)では未実行の write quota を記録しない(#2061)。

  • feat(cost): yt-channel-settings push --applychannels().update() 経路に YouTube Data API quota 記録を配線した。part(brandingSettings / localizations / status)ごとの実 request 1 回につき cost_tracker.log_quota("youtube-data-api", "channels.update", 50, metadata={part, channel_id}) を 1 件記録し、実 request を発行した時点で quota は消費されるため update 失敗時も記録してから既存の YouTubeAPIError を維持する。dry-run では write quota を記録せず、記録自体の失敗は debug ログのみで push を止めない(#2060)。

  • feat(cost): upload agent の read preflight(publish 直前 dedup 検索と公開日一覧取得)が YouTube Data API quota を cost_tracker.log_quota へ記録するようにした。_find_existing_video_by_title_get_published_datessearch.list(100 units)/ videos.list(1 unit)実 request ごとに service="youtube-data-api" で 1 件記録し、API failure 時も記録後に既存の fail-open / fail-safe をそのまま維持する(失敗 request も quota を消費するため)。dedup 候補ゼロ等で videos.list を実行しない場合はその分を記録しない。upload write API の quota 記録は別 issue(#2057)。

  • feat(cost): playlist mutation 経路(playlist_manager.py)に YouTube Data API quota 記録を配線した。playlist create(playlists.insert 50 units)・item add(playlistItems.insert 50 units / request)・削除済みエントリ cleanup(playlistItems.list 1 unit / page と playlistItems.delete 50 units / 件を別 operation で記録)に加え、assign 時の重複チェック(read-before-write の playlistItems.list)もページ単位で記録する。記録は try/finally で行い、mutation 失敗時も quota を記録した上で元の例外ハンドリングを維持する。dry-run では delete request を発行しないため delete の quota 記録も発生しない(#2059)。

  • feat(wf-next): 複数 collection を直列自動進行させる batch orchestrator CLI yt-wf-batch を追加した。collections/planning/ を走査して phase=prepared / assets.music_prompts=true / assets.raw_master=null / planning.music.suno_playlist_url 記録済み / 02-Individual-music/ ダウンロード済みの collection を対象に、/wf-next 相当の CLI チェーン(preflight → 選曲 → raw master 生成 → yt-raw-master-check --applymaster_audio_transition.pygenerate_videos.shyt-upload-collection)を非対話で 1 件ずつ実行する。1 件の失敗(空 playlist / preflight validation error / ffmpeg error 等)では停止せず後続 collection を継続し、reports/wf-batch-<timestamp>/summary.json(total / success / failed / elapsed と成功 entry の video_id / video_url / live_path)と per-collection の <slug>.log を出力する。--dry-run / --only <slug,slug> / --from <slug> / --limit N で対象確認・絞り込み・再開・試運転件数制限ができる。workflow.wf_next.approval_gates が有効なチャンネルでは非対話で承認を処理できないため fail-loud で停止する(#1667)。

  • feat(config): workflow.wf_next の boolean 設定を「true = 手動工程(承認)を省いて自動進行」の向きに統一する新キー skip_audio_approval / skip_upload_approval(既定 true = 従来どおり承認ゲートなし)を導入した。旧キー approval_gates.audio / approval_gates.upload(true=承認する)は後方互換 alias として読み続け、既存チャンネルの設定は挙動を変えない。同一ゲートへ新旧キーを同時指定した場合は silent な優先解決をせず ConfigError にする。WfNext.approval_gates は既存 consumer 向けの derived view として残し、常に skip_* の否定と整合させる。example / wf-next / wf-status / wf-new schema の記述も新キー主体へ更新した(#1744)。

  • feat(cost): YouTube Data API quota の記録 schema と yt-cost-report 集計を追加した。cost_tracker.log_quota(service, bucket, units) が生成コストと同じ保存境界(CHANNEL_DIR/data/quota_costs.json + file lock)で quota event を永続化し(USD 単価は保持しない)、read_quota_log() はキー欠落エントリをデフォルト値で吸収して読む。yt-cost-report は既定サマリに quota 記録がある場合のみ「API Quota Summary」(service 別 / 月別 / bucket 別 units 集計)を併記し、--quota で quota のみ・--quota --detail で個別エントリを表示する。quota 未記録の既存データでは従来表示のまま後方互換。実 API 呼び出しへの instrumentation は別 issue(#2006)。

  • chore(extensions): extensions(suno-helper / distrokid-helper / shared)の lint / format を ultracite の Oxlint + Oxfmt toolchain へ移行した。lint は extensions/.oxlintrc.json を廃止して ultracite/oxlint/core + ultracite/oxlint/react preset を extends する extensions/oxlint.config.ts に、formatter は Prettier を ultracite/oxfmt preset の oxfmt(extensions/oxfmt.config.ts)に置き換え、scripts / CI を pnpm check / pnpm fix に統一して全ソースを oxfmt で一括再フォーマットした。旧構成のルール水準(react/rules-of-hooks=error / react/exhaustive-deps=warn / react-compiler 無効 / browser・chrome globals)は維持し、preset 導入時点で既存コードに違反が残るルールは off として段階的有効化を別 issue に委ねる(#2154)。

  • fix(video-analyze): yt-video-analyze に解析結果キャッシュを追加し、既存の有効な data/video_analysis/<slug>/<video_id>.json がある動画は Gemini を呼ばず既存結果を再利用するようにした(再実行時の再課金防止)。明示的に再解析したい場合のみ新設の --force で既存 JSON を無視して上書きする。部分書き込み等で壊れた JSON(パース不能 / object でない)は警告の上で破損扱いとし再解析する(サイレントな壊れ結果の再利用防止)。SKILL.md にキャッシュ挙動と --force を追記した(#1693)。

  • fix(dx): takt worker の runtime path を current worktree へ隔離した。.takt/runtime-prepare.shTAKT_RUNTIME_ROOT から TMPDIR / XDG_CACHE_HOME / XDG_CONFIG_HOME / XDG_DATA_HOME / XDG_STATE_HOME / UV_CACHE_DIR を導出・ディレクトリ作成して stdout(KEY=VALUE)で注入し、親 process から継承した sibling worktree の path(別 worktree の uv cache 参照による test 開始前 exit 2 の原因)を上書きする。yt-preflightruntime_path 分類を追加し、takt runtime 内(TAKT_RUNTIME_ROOT 設定時)は上記 6 変数それぞれの絶対 path / current runtime root 配下 / ディレクトリ存在 / 書込み可否を検査する(違反 detail は変数名と違反種別のみで path 実値は出力しない。非 takt 環境は検査対象外として合格)(#2163)。

  • feat(thumbnail): 画像 prompt への NG ワード / 他ドメイン値混入を生成前に止める検査を追加した。config/skills/thumbnail.yaml::image_generation.gemini.forbid_keywords(未設定時 no-op の list[str])を新設し、yt-generate-image は最終プロンプト(大小文字無視の部分一致)にヒットすると生成 API を呼ばず終了コード非 0 で停止し、該当キーワードを標準エラーへ列挙する。codex-image.sh も codex 起動前に同等の検査を行う(CODEX_IMAGE_FORBID_KEYWORDS 明示指定を優先し、未指定なら merged skill-config から自動解決。config 文脈が無い実行は no-op)。SKILL.md の TTP プリフライト・チェックリストに workflow-state.json::planning.music.*(音楽用フィールド)を image prompt に転写しない項目を追加した(#1664)。

  • refactor(thumbnail): 過密なプロンプト指示を簡素化し、TTP を参照画像主導へ戻した。config.default.yaml の single_step clause 6 種のうち既定で注入されるものを ip_safety_clause の 1 つに集約(variation / style_lock / text_strip / anatomy / typography は既定空文字の opt-in、推奨文面はコメントに残置)、composition_rules は実効キー text_lines のみに縮小、thumbnail_texttext_overlay_prompt を単一入口として旧個別フィールド 6 種を段階的廃止(deprecated)にした。deprecated キーの channel override は従来どおり deep-merge で有効のまま、load_skill_config が DeprecationWarning で移行を促す(物理削除は後続リリース)。SKILL.md のプロンプト指示解説を「プロンプト構築」1 セクション + モード別差分に再編し、既定 config でプロバイダーへ渡る最終プロンプト全文の例を掲載した。channel-new / channel-init の scaffold からも deprecated キーを除去した(#1702)。

  • feat(audio-gen): yt-generate-master 手動実行(/masterup フォールバック運用)後に workflow-state.json::assets.raw_master が未更新のまま残る不整合を検知する CLI yt-raw-master-check を追加した。既定は読み取り専用の突合チェック(exit 0=整合 / 2=不整合 / 1=エラー)で、--apply 時のみ assets.raw_master / updated_at を一時ファイル + rename の原子的更新で修復する。/masterup Step 1.4 と /wf-status に AskUserQuestion 承認ゲート付きのチェック導線を追加し、非承認時は state を変更せず次回起動時に同じ警告を再表示する(silent 続行の禁止)。assets.master_audio の確定は従来どおり /wf-next の責務のまま変更しない(#1668)。

  • feat(thumbnail): /thumbnail のテキスト描画既定を AI 焼き込みから決定的合成経路(yt-thumbnail-text)へ標準化した。標準フローは「textless 背景 main.png/jpg の生成・承認 → 実フォント(Pillow)合成で thumbnail.jpg 確定」の 2 段構成になり、書体の揺れが発生しない。/channel-researchdocs/benchmarks/thumbnail-text-profile.md が存在する場合はフォント傾向 → ローカル日本語フォント選定(overlay.font.title)、テキスト内容パターン → コピー生成制約(行数・言語・文字数レンジ。競合固有文言は不使用)、配置傾向 → overlay.layout.anchor / margin へ変換して適用し、不在時はエラーにせず現行デフォルト値で続行する。AI 焼き込み経路は運用者が明示選択したときだけ使う fallback として残し改修しない(#1907)。

  • feat(masterup): yt-suno-verify-playlist --music-dir が非正準形ファイル(Suno UI 手動 DL 由来の Title.mp3 / Title (1).mp3 / Title_1.mp3 等)を suno-prompts.json と照合して正準形 NN{a|b}-Title.ext へ自動リネームしてから突合するようにした。照合は ZIP 展開(suno_downloaded_archive.py)の既存ロジックを単一ソースとして再利用し、照合できないファイルはリネームせず unknown として fail-loud 報告する。/masterup Step 1.6 と /wf-next は playlist URL の記録有無に依らずローカルファイル名から突合ゲートを完走する(#1998)。

  • docs(skills): 課金 API(Vertex AI Gemini / Veo / Lyria、OpenAI Images、YouTube Data / Analytics API)を呼ぶ 26 project skill の SKILL.md に、実行前見積もり可能な「想定 API call 数」セクション(API 別の call 数 / 算出式・変動要因・上限 / 承認の安全弁)を追加した。対象は契約テスト tests/test_skill_api_call_estimate_contract.py が機械抽出(pyproject 全 CLI の課金分類 × skill の CLI 参照走査)で導出し、非対象理由・追加対象理由・新規 CLI の分類漏れ・記載漏れを CI で検出する(#2010)。

  • feat(analytics): 成長 KPI 定点ビュー CLI yt-kpi-dashboard を追加した。data/analytics_data_*.json 全スナップショットを日付後勝ちで横断マージし、レバー別 KPI(views / インプレッション / CTR / 平均視聴維持率 / 登録者純増)の週次推移を前週比付きの構造化 JSON と Markdown テーブルで出力する(--savereports/kpi_weekly_YYYYMMDD.{json,md} 保存)。Reporting API の保持期間(60 日)を超えた過去の Imp / CTR も reporting_api.impressions_summary.per_day から復元して時系列に含め、欠測週は補間せず欠測として明示する。スナップショット 1 件以下ではエラーではなく複数スナップショットが必要な旨の案内を出す。/analytics-analyze の CLI 一覧にも定点ビュー参照の導線を追加した(#1819)。

  • feat(auth): OAuth 新規ブラウザ認証の run_local_server() にチャンネル名(meta.channel_short)入りの authorization_prompt_message / success_message を渡し、複数チャンネル並列運用でトークン失効が重なった際にターミナルログと認証完了ページのどちらからも対象チャンネルを判別できるようにした。prompt には認証 URL(redirect 先ポート入り)も含め、config 読込不可時はディレクトリ名へフォールバックする(#1966)。

  • chore(extensions): TypeScript 7.0.2 固定後の suno-helper / distrokid-helper を実経路(lint / format:check / compile / unit / build / Playwright e2e / CI Typecheck 契約テスト)で回帰検証した。TS 7 起因の互換修正は不要で、唯一再現した失敗は suno-helper の overlay e2e が開発マシンで稼働中の yt-collection-serve(port 7873/7872)を発見して「ローカル配信元なし」前提が破れる分離不足だったため、--host-resolver-rules で discovery 先ホストを遮断して環境非依存にした(#2015)。

  • feat(analytics): 収集済みの traffic_sources / audience.by_device / YT_SEARCH 検索語を分析経路に接続した。yt-analytics の standard 以上で get_traffic_source_detail("YT_SEARCH") を呼び検索語トップ N を traffic_sources.search_terms へ保存し、スナップショット横断の流入源シェア推移・デバイス別集計・検索語トップ N を JSON で返す yt-traffic-trend CLI(--top-search / --text)を追加した。/analytics-analyzeyt-traffic-trend を 4 番目の必須 CLI とし、分析項目 6「流入源・デバイス分析」と validator の 4 CLI evidence 契約を追加した(#1804)。

  • chore(extensions): suno-helper / distrokid-helper の TypeScript を 7.0.2 に固定し、pnpm 11.12.0(Nix extensions shell 契約)で両 lockfile を正規再生成した。TS 7 で削除された baseUrl を両 tsconfig から除去し(paths は相対形式のまま)、suno-helper は types: ["chrome"] で chrome グローバル型を明示 include。TypeScript 7.0.2 固定・lockfile 整合・削除済みオプション不使用は契約テスト(tests/test_extension_typescript_contract.py)で機械担保する(#2014)。

  • fix(collection-serve): POST /collections/<id>/downloaded が期待数未満の部分 ZIP(Suno が一部 entry で 1 clip しか生成しないケース)を 500 で拒否せず、配置済みファイルを受理して warning 付き 200 を返すようにした。workflow-state には planning.music.actual_file_count / missing_file_count を機械可読に記録し、assets.music_downloaded=true と collections index の status=downloaded へ貫通させる。suno-helper は warning を progress 通知に表示する。0 件配置・壊れた ZIP の 500 契約は維持(#1913)。

  • feat(analytics): yt-thumbnail-correlate に有意性検定(両側 p 値)・Benjamini-Hochberg 多重比較補正・significant 判定を追加し、最小サンプル数の既定を 10 に引き上げた(n<10 は「サンプル不足で判定不能」を明示)。有意でない相関には断定的な解釈文を出さない。--metric 未指定で CTR が欠測のチャンネルでは views に自動フォールバックし、出力 JSON の metric_fallback に理由を残す。/analytics-analyzesignificant: false の相関を方針根拠に使わない注記を追加した(#1801)。

  • feat(thumbnail): Gemini API 経路の既定 prompt を Codex と同じ TTP 方針(winning layout 維持・最小限の品質改善のみ)へ揃えた。config.default.yamlimage_generation.gemini.diff_prompt_template 既定値を codex 既定テンプレートと方針行を同期した TTP テンプレート({title_line1} / {title_line2} + ${ip_safety_clause})にし、チャンネル側 diff_prompt_template override の優先(deep-merge スカラ置換)と方針同期をテストで機械担保した。SKILL.md / prompting.md に provider 差のない TTP 方針を明記した(#2070)。

  • feat(thumbnail): gemini_cli 経路が #2070 と同じ TTP 方針(codex と同期した既定 diff_prompt_template)を provider 切替でも損なわないことを contract test で機械担保した。CLI ラッパー _build_prompt はプロンプトをそのまま透過し方針文言を独自に持たないことを検証し、SKILL.md に gemini_cli が同じ diff_prompt_template と構築手順を共有する旨を明記した。model / timeout / CLI protocol は変更なし(#2071)。

  • feat(auth): git worktree 上で gitignore された auth/ が複製されず OAuth 認証が FileNotFoundError になる問題に対応した。.git pointer ファイルと commondir から git コマンド非依存で main 作業ツリーを検知する utils/worktree.py::main_worktree_root() を追加し、worktree では client_secrets.json の候補列末尾に main 側 auth/ を追加、ローカル token.json が無い場合は token の読み書きを main 側 auth/token.json に集約する(refresh 結果の分岐防止)。CLIENT_SECRETS_DIR 最優先・非 worktree 環境の解決順序は不変で、未検出時のエラーには探索した全候補パスを表示する(#1721)。

  • fix(devshell): 並列 worktree の Nix キャッシュ競合(同一 fingerprint の flake を複数 worktree が同時評価すると、ユーザーグローバルな ~/.cache/nix の eval-cache SQLite への同時書込みが「error (ignored): SQLite database ... is busy」で破棄され続け、レビュー step の遅延・再試行を誘発する問題)を診断し、.envrc / .lefthook/setup-worktree.sh / shellHook が Nix 専用の NIX_CACHE_HOME を worktree 分離 TMPDIR 配下へ export して各 worktree が自分の評価結果だけを参照するようにした。XDG_CACHE_HOME は変更せず、解決失敗時は共有キャッシュのまま fail-open で続行する(#2089)。

  • feat(dx): yt-skills lint [<skill>...] を追加し、SKILL.md frontmatter の検証(strict YAML パース / name・description 非空 / description の double-quote)を pytest 全体実行なしで秒単位で回せるようにした。検証ロジックは CLI 側を単一ソースとし、既存の回帰テスト(tests/test_skill_frontmatter_yaml.py)は同ロジックを呼ぶ形に寄せた(#2096)。

  • fix(devshell): 並列 run 間の共有 TMPDIR 競合(macOS の per-user TMPDIR を複数 worktree の並行 pytest が奪い合い、conftest の stale cleanup 等が run 間で干渉しうる問題)を診断し、devShell 入場時に .lefthook/worktree-tmpdir.sh が共有 TMPDIR 配下の worktree ごとの決定的サブディレクトリへ TMPDIR を分離するようにした。takt core が注入する checkout 内 TMPDIR は尊重し、解決失敗時は共有 TMPDIR のまま fail-open で続行する(#2088)。

  • fix(dx): explicit setup 経路(bash .lefthook/setup-worktree.sh [<command>...])の依存同期を fail-closed 化した。devShell 入場後に新設の .lefthook/sync-deps.shuv sync を明示実行し、失敗時は後続コマンドを実行せず exit 非 0 で停止する。対話 shell(direnv / nix develop の shellHook)は従来どおり warning 継続で入場をブロックしない(#2125)。

  • feat(preflight): worktree / takt clone の環境不備(checkout 種別・Nix eval・lock drift・Git identity・lefthook policy)を実装着手前に read-only で検査し、git_commit_identity / nix_eval / lock_drift / hook_policy の分類キー付きで報告する CLI yt-preflight を追加した。identity の値は出力に含めず、lefthook は YOUTUBE_AUTOMATION_SKIP_LEFTHOOK=1 の明示 skip のみ合格として曖昧な未導入を不合格にする(#2124)。

  • chore(extensions): suno-helper と distrokid-helper の full gate / Playwright e2e を維持し、Extensions CI が各 package の既存 pnpm lint 入口から共通設定の Oxlint を実行する接続契約を追加した。契約テスト自体の変更でも Extensions CI が起動するよう path filter を接続した(#2020)。

  • feat(analytics): /analytics-analyze/flop-analysis(postmortem)の学びを下流の data/insights.jsonl(append-only)へ機械可読に蓄積し、次サイクルの /wf-new/collection-ideate が open エントリを企画根拠として消費・status 反映(adopted / dismissed)し、/thumbnail が lever=thumbnail の学びを制作前に参照する接続を追加した。エントリ形式は insights-entry.schema.json を単一ソースとし、schema 駆動の validate_insights.py で検証する。insights 不在の初回チャンネルでは既存の analytics / benchmark fallback / minimal mode を阻害しない(#1830)。

  • feat(analytics): yt-analytics に既定 standard--depth {standard,full} を追加し、full 指定時に視聴維持率と地域別データを収集・保存できるようにした。full 専用 API の明示エラーは不完全な成果物として保存せず失敗終了する。/analytics-collect full の導線と、/analytics-analyze が full データの維持率を数値根拠として扱う分析契約も追加した(#1799)。

  • feat(collection-serve): port 別 PID ファイル、同一構成の既存 server の liveness check と再利用、--stop --port による明示停止、既定 60 分の idle timeout を追加し、suno-helper / distrokid-helper の完了手順で server を停止するようにした(#1725)。

  • feat(thumbnail): archive.enabled(既定 false)を追加し、サムネ承認・確定直後に thumbnail.jpg/png を元の内容と拡張子のまま assets/thumbnail-gallery/<collection-dir-name>.<ext> へ原子的にコピーできるようにした。同一コレクションの再承認は最新画像へ置換し、設定不正・サムネ欠落・シンボリックリンク・コピー失敗は非 0 で停止する(#1942)。

  • feat(channel-new,doctor): 新規チャンネルの簡易ペルソナを /viewer-voice/audience-persona-design/viewing-scene の必須チェーンへ置換し、公開前は既存の競合 / TTP / viewer-voice 成果物を入力に Analytics report や任意の本格 benchmark なしで完走する契約を追加した。yt-doctorttp_wf_new_readinessdocs/channel/personas/persona-definition.md の欠落を警告する(#2079)。

  • feat(masterup): yt-suno-verify-playlist に collection 相対の --music-dir を追加し、NN{a|b}-<title>.<ext> 形式のローカル音声ファイル名を name/title の英語 alias・apostrophe 除去名から canonical entry へ対応付け、entry + a/b variant 単位で unknown / missing / underfilled を fail-loud 検出できるようにした。/masterup の primary path は 02-Individual-music/ を直接突合するため、playlist URL や title list の確認なしで Step 5 前ゲートを実行する(#1898)。

  • feat(doctor,setup): yt-doctor --fix-client-secrets を追加し、Downloads の構造妥当かつ GCP project 一致する最新 OAuth client JSON を auth/client_secrets.json へ移動できるようにした。既存ファイルは上書きせず、/setup の HUMAN STEP は secret 発行・Download JSON・done のみに簡素化した(#1903)。

  • feat(flop-analysis): Phase 3 の全主仮説を承認プロンプトなしで自動検証し、全件反証時だけ副仮説へ進む orchestration へ更新した。対話必須スキルは read-only 成果物境界から起動せず、期間・比較元・閾値を固定して判定する。個別検証がデータ不足・子スキル失敗で実行不能な場合は理由付きの「未検証」として残りを続行し、検証結果から postmortem.md の「結論 / 反証 / 学び」まで自動記入する(#1972)。

  • fix(suno): yt-suno-verify と共通 initial-setup preflight が config/skills/suno.yaml::style_char_limit の上書きを尊重し、長文の base genre_line・video analysis 由来 Style・使用中 style variant を設定上限で検証するようにした。未設定時は従来どおり 120 文字超過をエラーにする(#1938)。

  • chore(extensions): Oxlint 1.73.0 の React plugin と、旧 severity を維持できる native React Hooks rules を共通設定で有効化し、代表的違反を実行時 fixture で検証するようにした。severity を保持できる native 代替がない14規則は、集約 React Compiler rule による warn の error 化を避けて独立 follow-up として明示した(#2019)。

  • perf(dx): .envrc に nix-direnv 3.1.1 のブートストラップを追加し、devShell 入場コストを削減した。dev 環境を .direnv/ にキャッシュし flake.nix / flake.lock / .envrc 変更時のみ再評価するため、dirty worktree でも 2 回目以降の direnv exec が 1 秒未満で安定する(従来は入場のたびに flake 評価が走り 7〜80 秒まで変動)。shellHook(lefthook install / uv sync)は従来どおり毎入場で実行される(#2097)。

  • docs(wf-new): analytics mode の stale report を /collection-ideate の freshness SSOT に従って自動更新し、再検証後に入力モード判定と企画フローを継続する契約へ更新した。更新失敗時は古い report を使わず、理由と再開条件を示して停止する(#2063)。

  • docs(skills): /channel-research/thumbnail-research/collection-ideate の TTP 分析に欲求レイヤーを追加した。高再生パターンを視聴者欲求へ抽象化して自チャンネルへ再具体化し、コメント / persona 由来の欲求語彙、最低 3 回の具体⇄抽象の往復、上位群 / 下位群の欲求比較、ttp_mode の欲求整合根拠を各成果物へ記録する(#2026)。

  • docs(setup): yt-doctor が stale Analytics report を表示した場合も手動の /analytics-analyze を HUMAN STEP として要求せず、後続の /collection-ideate が自動更新する契約を案内するよう統一した。更新失敗時の停止・再開条件は freshness-rules.md を参照し、fresh / benchmark fallback / minimal mode の既存案内は維持する(#2064)。

  • refactor(distrokid-helper): status と release review を shadcn Alert / Card primitive へ移行し、既存の phase message・配色・props、release metadata・fallback、および error の accessible alert 契約を維持した(#2066)。

  • chore(extensions): Fallow audit を PR の base commit との差分に対する extensions 全体の品質ゲートとして CI へ統合した(#2076)。

  • chore(test-infra): pytest-xdist を dev dependency に追加し、uv run pytest -n auto での並列実行に対応した。tests/conftest.pyCHANNEL_DIR の tmp コピーを xdist worker ごとに独立して作り直し、CI の test ジョブは -n auto を有効化した。ローカル既定は直列のまま(opt-in、詳細は docs/development.md)(#2093)。

  • feat(skills): /postmortem skill command / directory を /flop-analysis へ改称し、feedback・workflow・機能一覧・現役戦略文書の利用者導線を新名称へ統一した。下流の config/skills/postmortem.yamlconfig/skills/flop-analysis.yaml へリネームすること。旧 override は移行 fallback として警告付きで読み込むが、旧 command alias と旧 skill directory は残さない(#2023)。

  • chore(extensions): suno-helper と distrokid-helper の lint を共通設定の Oxlint 1.73.0 へ移行し、旧 ESLint の direct dependencies と設定を削除した(#2018)。

  • fix(upload): upload preflight が複数セパレータの title.template と準拠タイトルを正しく照合し、3パート以上のタイトルを誤って拒否しないようにした(#2037)。

  • perf(test-infra): utils/retry.py にモジュールスコープの sleep/jitter シーム(_DEFAULT_SLEEP / _DEFAULT_JITTER)を追加し、execute_with_retry にも後方互換の optional sleep / jitter 引数を貫通させた。テスト側は no_retry_backoff fixture と CommentReplier への sleep_fn 注入で retry backoff / delay_between_replies_sec の実時間 sleep(計 ~33s)を排除した(#2091)。

  • feat(doctor,setup): yt-doctor の api カテゴリに reporting_job check を追加し、OAuth 済み環境で YouTube Reporting API ジョブ未作成を検出して uv run yt-analytics --reporting-create-job を案内するようにした。/setup wizard はコマンド実行後に doctor を再診断し、ジョブ作成済みを確認する(#1974)。

  • refactor(distrokid-helper): popup のローカル配信元・collection/disc selector を shadcn theme token に揃え、フォーム一括入力・停止操作を Button primitive へ移行した。既存の value・handler・disabled・accessible name と runner action は維持する(#2065)。

  • docs(collection-ideate): stale な Analytics report を検出した際、相対 stale は /analytics-analyze、絶対 stale は /analytics-collect/analytics-analyze を自動実行し、再検証成功後に同じ企画フローを継続する契約へ更新した。更新失敗時は stale report を使わず、理由と再開条件を示して停止する(#2062)。

  • fix(secrets): 1Password CLI 2.33 が stdin を JSON item template として解釈する仕様に合わせ、stream key の edit/create を JSON template 経由に変更した。新規 PASSWORD item には必須の組み込み password field を含め、secret は引き続き argv や一時ファイルに露出しない(#1784)。

  • feat(helper): yt-collection-serve の固定 loopback registry(heartbeat / TTL / owner takeover)と shared discovery client を追加し、suno-helper / distrokid-helper の候補履歴蓄積を廃止して、稼働中 server の動的検出と legacy storage migration に切り替えた。selector は更新完了前の古い native menu を開かず、registry の DELETE 境界と未対応 method status も公開契約どおり検証する(#1616)。

  • fix(test-infra): dev shell 統合テストのコピー対象と teardown を最適化し、pytest の成功時 tmp と強制終了された過去 run の fixture 残骸が蓄積しないようにした(#2072)。

  • fix(suno-helper): 連続実行開始時に collection server の疎通を確認し、無応答時は Lyrics 欄エラーより先に明示的な server エラーで停止するようにした(#2003)。

  • fix(suno-helper): server の一時的な取得失敗時に明示選択した配信元と collection を保持する(#2002

  • fix(collection-serve): SIGTERM による予期せぬ停止を専用例外へ変換し、終了理由と traceback が stderr に残るようにした(#2001)。

  • chore(suno-helper): React 19 と Tailwind CSS 4 の Vite plugin 構成へ移行し、@/* alias、Shadow DOM 対応 CSS variable theme、cn utility、Button primitive を含む shadcn/ui 最小基盤を追加した(#2011)。

  • chore(distrokid-helper): Tailwind CSS 4 の Vite plugin 構成へ移行し、@/* alias、CSS variable theme、cn utility、Button primitive を含む shadcn/ui 最小基盤を追加した(#2012)。

  • refactor(scripts): yt-bulk-update-desc の YouTube API HttpErrorYouTubeAPIError へ変換し、metadata の意味的エラーだけを collection 単位で継続するよう例外境界を限定した。更新 API 失敗時は後続動画を処理後にドメイン例外を伝播し、破損 JSON / I/O error も fail-loud とした。tags / categoryId / defaultLanguage 欠落時の既存フォールバックは公開 main() 経路の回帰テストで固定した(#2032)。

  • refactor(logging): yt-bulk-update-desc の進捗・成功・失敗出力を module logger 経由に統一した(#2031)。

  • fix(skill-config): load_skill_config("postmortem")load_channel_override("postmortem")config/skills/flop-analysis.yaml を優先し、旧 config/skills/postmortem.yaml だけがある場合は互換読み込みして UserWarning で移行を案内する。利用者は postmortem.yamlflop-analysis.yaml へリネームすることで警告を解消できる(#2022)。

  • fix(skills): yt-skills sync --prune が upstream 管理外のローカル skill を削除しないよう、既知の旧 skill 名だけを prune 対象に限定した(#1939)。

  • fix(dx): sandbox 化された takt worker がホーム配下(direnv allow ストア・共有 hooks)へ書込みできず direnv / lefthook セットアップが反復停滞する障害を解消した。.takt/config.yamlruntime.prepare.takt/runtime-prepare.sh)が全 worker へ XDG_DATA_HOME=<worktree>/.takt/.runtime/dataYOUTUBE_AUTOMATION_SKIP_LEFTHOOK=1 を注入し、flake.nix shellHook / .lefthook/install.sh は同変数で lefthook install を安全にスキップ(ゲートは CI 側で担保)、.lefthook/setup-worktree.shdirenv allow 失敗時に nix develop へフォールバックする(#1999)。

  • docs(workflow): /wf-new/wf-next の制作フェーズ実行を subagent 委譲契約へ統一し、親エージェントが前提確認・承認・状態更新を保持しつつ、各フェーズの成果物を絶対パス付きで受け取って検証する責務境界を明確化した。運用チートシートも同じ委譲モデルへ同期した(#1661)。

  • docs(collection-ideate): stale な Analytics report 検出時に推論コスト見積もり付きの 3 択を提示し、承認時または上限内の freshness.stale_action: auto 時だけ /analytics-analyze を同一セッションで実行する導線を追加した。/wf-new は判定を委譲し二重ダイアログを防ぐ(#1716)。

  • docs(skills): wf-* から委譲される制作系 10 skill に subagent 入出力契約を追加し、リポジトリ相対の入力、成果物絶対パスの完了報告、state 非更新、承認・選択確定後のみの委譲を明記した。state を扱う /masterup の over-max 例外採用と /suno vocal の標準 collection 生成はメインエージェントが実行する(#1662)。

  • feat(thumbnail): TTP 参照画像の直近コレクション重複除外を追加(#1649)。reference_images.dedup_recent_collections(既定 5)が collection ごとに採用企画の参照 1 件を Reference Assignments へ保存し、全割当節から未使用参照を先頭候補として優先する。不足する候補枠だけ位置順で補うため、候補数より大きいプールは全参照が採用されるまで先頭候補を再利用しない。

Added

  • feat(analytics): Analytics API の収益メトリクス(estimated revenue / monetized playbacks / CPM)を日別・動画別に収集し、テーマ・コレクション別の加重 RPM 分析契約を追加した。収益化未承認時は収益データだけを警告付きで skip し、既存メトリクス収集を継続する(#1807)。

  • feat(collection-ideate): skill-config に ttp_mode(既定 false)を追加した。config/skills/collection-ideate.yamltrue にすると差別化軸の掛け合わせと競合カバー済みテーマの回避をスキップし、競合の高再生コレクションから抽出した構造・パターン・型を転写元付きで企画候補へ反映する。転写元が無い minimal mode では /benchmark を案内して停止する(#1977

  • docs(feedback): /feedback に、status="recorded" の未還流 entry を一覧・選択し、open issue の類似タイトル照合とユーザー承認を経て daiki-beppu/youtube-automationfeedback ラベル付き issue を起票する還流モードを追加した。成功した entry は status="filed"issue_url を記録して候補から除外し、二重起票を防ぐ。起票本文テンプレート、発生チャンネル掲載の個別確認、起票直前の機密情報再マスクも明記した(#1829)。

  • docs(channel-research): サムネイルのフォント傾向・テキスト内容パターン・配置傾向を、固有名詞やコピー原文を除いた構造化プロファイル docs/benchmarks/thumbnail-text-profile.md として生成する契約を /channel-research に追加した。前回生成したプロファイルは個別ベンチマークレポートの存在判定と fallback 入力から除外する(#1906)。

  • docs(thumbnail-research): /benchmark の収集済み JSON と競合サムネイル画像を再生数上位群 / 下位群で比較し、構図・配色・テキスト配置・視線誘導・被写体の勝ちパターンを docs/benchmarks/thumbnail-analysis.md に出力する /thumbnail-research スキルを追加した。レポートの推奨事項と参照候補を /thumbnail の TTP 入力として相互参照し、データ収集・チャンネル全体分析・320px 視認性比較との発動条件を分離した(#1796)。

  • docs(channel-new): 入口系またはモード判別不能な発動時に既存チャンネル / 新規開設を最初に確認するゲートを追加した。既存チャンネルでは yt-channel-seed --no-write-benchmark --json の登録者数・動画数・直近タイトルを提示して既存踏襲 / 方向性見直しを確認し、見直し選択時も取り込み完了後に必要な TTP メモまたは分析レポートを明示して方向性検討モードへ接続する(#1897

  • docs(analytics): /analytics-analyze の必須 3 CLI 出力と数値 evidence を reports/analysis_YYYYMMDD.json に構造化保存し、Markdown とのペア生成と validator 成功を完了条件にした。/collection-ideate は同 validator で検証済みの固定キーから §5 / §6 / §8 相当を読み取る(#1805)。

  • docs(thumbnail): YouTube Studio のサムネイル A/B テストについて、候補 2〜3 案の設計、operator 向け手動設定、watch time share・結果のコレクション別 JSON 記録を行う /thumbnail-test スキルを追加した。確定 Winner の構図・配色・文字量が 2 entry 以上で反復した場合に限り次回 /thumbnail のプロンプト方針へ還元し、/postmortem では対象動画のテスト結果を flop 仮説の根拠・反証として併記する(#1808)。

  • docs(skills): 下流チャンネルリポジトリでスキル実行中の不具合・摩擦・改善案を data/feedback/feedback-log.jsonl に append-only JSONL として記録する /feedback スキルを追加した。entry schema は .claude/skills/feedback/references/feedback-entry.schema.json に単一ソース化し、date / skill / category / summary / context / status / issue_url の構造、status="recorded" の新規記録、機密情報の ***REDACTED*** マスクを SKILL.md に明記した。下流配布 CLAUDE.md テンプレにもスキル摩擦時に /feedback を案内する導線を追加した(#1828)。

  • docs(setup): /setup の全 check 緑後・完了報告前に、workflow.wf_next の音源 / アップロード承認ゲート、手動マスタリング検出スキップ、Veo 課金を伴う loop-video の有効状態を 1 問ずつ確認する運用設定インタビューを追加した。現在値と推奨回答を提示し、変更時だけ config を更新する(#1902

  • feat(upload): collection の workflow-state.json::title_template_check.allow_volume_patterns: true で、そのコレクションだけ公開タイトルの Vol. / Part / #N / ローマ数字の巻数表記を upload preflight で許可できるようにした。未設定・false の既定検出、RHS 鋳型・完全重複・核語彙の検査、および content.json::title.template_check.volume_patterns は変更しない(#1729

  • docs(setup): /setup wizard の起動直後にライブ配信予定の有無を確認し、予定ありの場合は YouTube のライブ配信有効化に最大 24 時間かかる旨と YouTube Studio での有効化リクエスト手順を [HUMAN STEP] で案内するようにした。案内後は有効化完了を待たず通常の setup フローを続行する(#1896

  • feat(analytics-report): HTML レポートのテーマ色を analytics-report/config.default.yaml::theme.colors に移し、config/skills/analytics-report.yaml の channel override で差し替えられるようにした。未設定チャンネルでは既存パレットを維持する(#1691

Changed

  • docs(thumbnail): image_generation.auto_selection.mode: full/thumbnail 手順を追加し、テーマを config → collection metadata の順で自動決定して、生成可否・textless 背景・候補の承認を含む 4 ゲートを省略し yt-thumbnail-auto-select --apply まで無人で進めるよう明文化した。selection_only の既存挙動は維持し、生成・適格候補ゼロ時の手動切替と /wf-new Phase 2c の追随分岐も追加した(#2167)。

  • refactor(suno-helper): PatternList の entry 選択表示を、selection semantics・accessible name・data-suno-entry-* 契約を維持したまま shadcn variant と Tailwind semantic token へ移行した(#2068)。

  • refactor(suno-helper): Overlay header・shell と status / warning / error 表示を、drag・minimize・位置永続化・semantic role・data-suno-* 契約を維持したまま shadcn primitive へ移行した(#2069)。

  • refactor(suno-helper): collection・投入方式・開始/停止・resume/retry controls を、既存 handler・disabled 条件・data-suno-control / aria 契約を維持したまま shadcn primitive へ移行した(#2067)。

  • feat(distrokid-helper): 初回表示、コレクション選択、ローカル配信元選択の各タイミングで collection 一覧と release.json を自動取得し、手動の「データ取得」ボタンを廃止した(#1992)。

  • feat(suno-helper): 初回表示、コレクション選択、ローカル配信元選択の各タイミングで collection prompts を自動取得し、手動の「データ取得」ボタンを廃止した(#1991)。

  • feat(suno-helper): Queue mode の duration guard 全滅 entry を、全 entry の ACK 先行投入後に既存 pacing で同一 prompt から最大 2 回自動再生成する挙動を明示し、Queue mode の説明文にも自動再生成を追記した(#1775)。

  • perf(discover-competitors): search.list 結果を 24 時間キャッシュし、--refresh による強制更新と benchmark 登録済みチャンネルの除外を追加した(#1694

  • feat(suno-helper): duration guard NG の同一 prompt 再生成を popup の「異常値の曲を再生成する」で切り替え可能にした。既定 ON は安全・高速モードとも最大 2 回再生成し、OFF は NG を警告表示しつつ生成済み全 clip を playlist / download 候補に維持する。選択は popup 再表示、resume、失敗分再実行、playlist 再実行へ引き継ぐ(#1733

  • docs(skills): リサーチ・戦略チェーンの 6 スキル(benchmark / discover-competitors / viewer-voice / audience-persona-design / viewing-scene / channel-research)の冒頭 60 行以内に、停止する fail と許容する fail を分離した前提成果物ガードを統一書式で整備した。必須入力が無い場合は生成元の前工程スキルを案内して停止し、後続 Step で生成・自動更新・代替できる入力欠如は停止条件から除外する(#1825

  • docs(automation-release): extension release の skill / checklist を Nix extensions shell 契約(Node 24 / pnpm 11.12.0)へ同期した(#1956)。両拡張の frozen install → build → zip、期待名 zip、lockfile 無差分を verify-extensions.sh で検証し、ambient Node / pnpm と --ignore-workspace を使わないことを明記。Python 本体の release flow と release-extensions.yml は変更なし

  • docs(extensions): extension のローカル install / build / zip / Vitest / Playwright / 成果物確認と /suno の初回 build 導線を、CI と同じ Nix extensions shell(Node 24 / pnpm 11.12.0)入口へ統一した(#1957)。ambient pnpm / 旧 npx pnpm 導線の不在を文書契約テストで固定

  • docs(suno-helper): Suno UI の旧「Custom Mode」および「Instrumental ON/OFF」表記を、現行の Advanced タブと Lyrics mode(Write / Instrumental)の用語へ更新した。operator 手順、拡張 description、保守用コメントを対象とし、実行時のセレクタ・エラーメッセージ・テスト期待値は変更していない(#1900

Fixed

  • fix(suno): ボーカルの標準コレクション生成時に、workflow-state.json::track_count を曲数の SSOT として suno-patterns.yaml::tracks の完全一致および展開後 prompt entry 数の下限を fail-loud で検証するようにした。entry 数が曲数未満、または両ファイルの曲数が不一致なら suno-prompts.json を生成しない(#1785)。

  • fix(doctor): uv tool install youtube-channels-automation によるグローバル導入を uv_project / automation_package の bootstrap check で検出し、pyproject.toml に依存がない正常な環境を fail と誤判定しないようにした(#1724)。

  • fix(api): playlist / benchmark / analytics / comments-reply / discover-competitors の YouTube API 呼び出しで、429・5xx・quota 系 403・network error を jitter 付き指数 backoff で最大 3 回試行し、恒久 4xx は即座にドメイン例外へ変換する共通 retry 境界を追加した(#1695)。

  • fix(suno-helper): Download all メニューの短時間 auto-close レースに対し、More クリック直後から探索を開始し、検出失敗時は最大 3 回再クリックしてダウンロードを継続できるようにした(#1926)。

  • fix(suno-helper): 拡張更新時に既存の Suno タブを自動リロードし、旧 content script の orphaned context を残さず新しい bundle を再注入するようにした(#1718)。

  • fix(suno-helper): feed/v3 の active poll が ids フィルタ無効化後も cursor ページネーションを追跡し、最新ページ外の保存済み clip を完了確認できるようにした(#1929)。

  • fix(thumbnail): /thumbnail SKILL.md の標準生成順序と Single-Step / TTP 章を、テキスト付き thumbnail.jpg 先行 → 承認済み thumbnail.jpg から textless main.png/jpg 後続再生成の契約へ統一した。config.default.yaml の single_step コメント、サンプルプロンプト、short-thumbnail の前提案内も同じ順序へ追従し、旧 textless 先行文言を回帰テストでロックした(#1901)。

  • fix(thumbnail): codex-image.sh に codex CLI とサーバー側デフォルトモデルの互換性プリフライトを追加し、非互換時は画像生成を試みず CLI version・検出モデル・アップグレード手順を stderr に出して停止するようにした。生成失敗時の診断 dump にも codex CLI version と default model 推定値を含める(#1915)。

  • fix(suno-helper): Download all ZIP の展開・音声配置・workflow-state.json 更新がすべて成功した後に、元 ZIP を自動削除するようにした。ZIP 削除だけが失敗した場合は、成功済みの音声と workflow-state を維持し、警告を記録する(#1890)。

  • fix(upload): yt-upload-collection-c 未指定時の自動選択を、collections/planning/ 配下で phase=mastered かつ upload.video_id=null の未公開コレクション 1 件だけに限定した。live/ の公開済みコレクションは候補外とし、候補が 0 件または複数件なら -c 明示を要求して停止する。--plan / --status / 実アップロードと日次実行に同じ選択条件を適用した(#1731)。

  • fix(upload): タグ件数下限が YouTube の 500 字上限の下で到達不能な場合、upload preflight と metadata audit が件数不足ではなく、tags.min_count を下げるか base タグを短縮するよう案内する明示診断を返すようにした。配布する content.json テンプレートの tags.min_count も 26 に統一した(#1732)。

  • fix(loop-video): Ctrl+C 後の Veo operation resume state に入力画像の SHA-256 を保存し、再実行時に指定モデルまたは入力画像内容が state と異なる場合は旧 operation を破棄して指定どおり新規生成するようにした(#1746)。旧形式 state は安全側で破棄する。

  • fix(analytics): yt-channel-trend の z-score 基準から当日を除外し、min_periods 未達を null として明示するよう修正した。トレンド判定は直近 28 日とその前の 28 日の平均を比較し、週次前週比は完全な 7 日間の週だけで計算する(#1803)。

  • fix(suno-helper): Queue mode の生成完了待ちが stall タイムアウトした際、ラン全体を ERROR で中断せず graceful degradation するようにした。waitForSubmittedClipsComplete は throw の代わりに { timedOut, stalledClipIds } を返し、停滞 clip を entry 単位で失敗記録(ENTRY_FAILED)したうえで、完了済み clip の duration yield guard・playlist 追加・ダウンロードを続行する。stalled entry は resume state の failedIndices として保持され「失敗分のみ再実行」導線で回収できる。全 entry が stall した場合は従来の失敗保留(playlist 追加を再実行後に委ねる)とし、serial mode・retryPlaylist・resume 由来 clip の stall は従来どおり中断する(#1994)。

  • docs(suno,suno-helper): 長尺 BGM チャンネル向けに config/skills/suno.yaml::duration_filtermin_sec / max_sec、部分指定は既定値と deep-merge)の override 手順を /suno Step 2 と /suno-helper の duration guard 節へ文書化した。override が suno-prompts.json へ反映される契約は回帰テストで pin し(機能自体は #1269 で実装済み・既定 60〜300 秒は不変)、閾値変更後は yt-generate-suno の再生成が必要なことと、resume が run 開始時点の閾値を保持するため新規 run で効かせる注意も明記した(#1937)。

  • fix(suno-helper): 新 Create UI(2026-07)で playlist の clip row 検出が全件 missing になる問題を実 DOM capture(匿名化 fixture)に基づき修正した。復活した .clip-row コンテナを row 導出の最優先アンカーにし、div 化した再生ボタン([role="button"][aria-label^="Play "])と row 自身の aria-label を曲名フォールバックに追加。仮想ウィンドウ走査(scrollAndMultiSelectByIds / readSelectedClipIds)は共通ヘルパへ抽出し、ウィンドウ外 row の空シェル化・再描画遅延に対して描画 signature 変化の poll(上限 3s)で hydration を待ち、ページネーションで走査中に成長する scrollHeight へ maxScroll 毎ステップ再計算で追従する。旧 DOM / grid view の検出経路と fixture は不変(#2043)。

Added

  • feat(analytics): 動画別の subscribersGained ÷ views × 100 による登録転換率ランキングと、登録済み/未登録視聴者別の subscribedStatus 集計を analytics スナップショットへ追加した。/analytics-analyze は両データを組み合わせて「登録を生む動画の型」を分析し、チャンネル全体の subscribedStatus を動画個別の因果として断定しない(#1813)。
  • feat(analytics): standard / full depth の Analytics 収集に、視聴数上位 200 件の playlist dimension における views・平均視聴時間・上位 200 件内の視聴シェアを追加し、/analytics-analyze が Complete Collection を含むプレイリスト内視聴をレポートできるようにした(#1815)。

Migration

所要時間の目安: 20〜30 分

local fix 衝突注意:

  • flop-analysis: /postmortem からの改称(#2023)。下流の config/skills/postmortem.yamlconfig/skills/flop-analysis.yaml へリネームが必要。旧ファイル名は警告付きの互換読み込みのみで、旧 command alias と旧 skill directory は残らない
  • wf-auto: /automation-run 互換 skill を削除し一気通貫入口を /wf-auto へ一本化(#2400)。/automation-run を参照する local fix は要更新
  • channel-new: /channel-research を第 6 モード「分析モード」へ挙動不変で統合(#2027)。/channel-research を参照する local fix は要更新
  • thumbnail: 標準生成順序を textless 背景先行 → 実フォント合成(yt-thumbnail-text)へ変更し、thumbnail_text の個別フィールド 6 種を deprecated 化(#1702, #1907, #2166)。改修規模が大きく local fix は上書きされる可能性が高い
  • setup, masterup, automation-update, collection-ideate, channel-new: 段階的開示で SKILL.md 本文を references/ へ分割し行数が大きく変わった(#2565)。local fix は要再適用
  • benchmark, video-analyze, thumbnail-compare, viewer-voice: 競合 slug の指定を --channel から --competitor へ即時リネーム(#1948)。旧 --channel は alias として受理されない
  • suno-helper, distrokid-helper, community-helper, ext-install: overlay UI を shared shadcn/ui へ全面移行(#2318#2360)。拡張本体の配布は ext-v* 系列で独立

必須の手作業(下流チャンネルリポジトリ):

  • config/skills/postmortem.yamlconfig/skills/flop-analysis.yaml へリネームする(#2023)。未実施でも警告付きで読めるが、警告は解消されない
  • workflow.jsonwf_next.approval_gates / comments.rules は廃止キーとして ConfigError で拒否される。skip_audio_approval / skip_upload_approval へ移行する(#2304
  • チャンネルルート .env の自動読込と python-dotenv 依存を削除した(#2477, #2478)。.env に置いていた値は process env / OAuth ファイル / 1Password のいずれかへ移す。GCP は ADC の quota project へ統一し、Vertex AI の location は用途別の内部固定値になる
  • 定期実行を設定済みの場合は workflow.scheduled_automation.target_workflowautomation-run から wf-auto へ変更する(#2400)。旧値は移行案内付きで拒否される
  • Python から utils.suno_* / utils.metadata_generator を直接 import している local script があれば domains.suno / domains.suno.downloaded / domains.metadata へ移行する(#2305)。旧 import path の facade は提供しない

サマリ:

  • BREAKING 6 件: benchmark 系 4 CLI の --competitor リネーム(#1948)、utils.suno_* / utils.metadata_generator の削除(#2305)、wf_next.approval_gates / comments.rules の廃止(#2304)、/automation-run の削除(#2400)と /postmortem の改称(#2023)、チャンネルルート .env の廃止(#2477, #2478
  • 読み取り専用 Analytics dashboard(React + Vite + shadcn/ui、yt-dashboard)を新設し、全チャンネル横断の指標比較・公開予約ストック・デジタル庁ガイド準拠の配色を追加(#2385, #2387, #2397, #2399, #2546
  • 新規 skill 13 件: /wf-auto, /analytics-run, /post-publish, /flop-analysis, /market-research, /creative-constraints, /value-loop-audit, /thumbnail-iterate, /thumbnail-test, /thumbnail-research, /feedback, /live-chat-reply, /automation-schedule
  • YouTube Data API quota の記録 schema と yt-cost-report --quota 集計を追加し、read / write の全経路へ instrumentation を配線(#2006, #2055#2061
  • takt を開発の標準実装経路へ復帰させ、.takt/workflows/ の yt-auto-* 5 レーンと共通 callable を git 管理下で整備(#2686, #2690
  • 監査由来の回帰テスト強化を大規模に実施(skills / repository / dashboard / metadata / suno / distrokid / thumbnail / analytics / extensions の findings を実行時契約へ置換)

What's Changed

Full Changelog: v5.5.17...v5.6.0