v5.5.16
Added
feat(suno):/suno//suno-lyricの成果物を検証するyt-suno-verifyCLI を追加。suno-patterns.yaml/suno-prompts.json/suno-lyrics.jsonの曲数、entry name 整合、歌詞構造、genre_line文字数を Suno UI 投入前に fail-loud で確認できるようにした(#1484)feat(helper):yt-collection-serveにGET /server-infoとチャンネル別*.localhostの canonical URL 表示を追加し、suno-helper / distrokid-helper の popup がローカル配信元候補を保存・選択できるようにした(#1352)。既定候補はhttp://youtube-automation.localhost:7873と legacyhttp://localhost:7873を併存し、複数チャンネルのサーバーを label 付きで切り替えられるfeat(video-description):BAHMetadataGenerator.generate_timestamps()/format_timestamps_text()にloopsパラメータを追加した。master をループ生成しているコレクション(yt-generate-master --loop N/--target-duration)で全ループ分のチャプターを機械展開できる。2 周目以降の開始秒は 1 周目と同じクロスフェード算術(int(current + duration - crossfade))で連続計算し、各行に 1 始まりのloopフィールドを付与(2 周目以降のタイトル装飾は呼び出し側の LLM リネームに委ねる)。既定loops=1は従来挙動と完全互換。従来は 1 ループ分しか生成できず、全ループ展開運用のチャンネルでは毎回 LLM が手計算していたfeat(masterup):/masterupの playlist 取得直後に playlist 曲名 ×suno-prompts.jsonentry name の突合ゲートyt-suno-verify-playlistを追加した。別コレクション曲の混入(unknown)・生成漏れ(missing)・clip 不足(underfilled、既定 2 clip/entry・--expected-clips-per-entryで調整)を fail-loud で検出し、非 0 終了時は Step 3(ダウンロード)へ進まない。曲名は/sunoが Song Title 欄へ注入する{name_jp} — {name_en}を照合キーとし、NFKC・空白圧縮・casefold で表記ゆれを吸収する。背景: 最新セット未完のまま前後コレクションの曲が playlist に混入して master 化される事故の再発防止(下流チャンネル実例: 深夜コレクションに昼テーマ 2 ペア混入 + 深夜 2 entry 未生成)feat(collection): コレクション標準骨格の検証・補完 CLIyt-collection-preflightを追加(#1494)。01-master/等の必須サブディレクトリ欠落を fail-loud で検知し、--fixで冪等・非破壊に補完する。骨格定義はyoutube_automation.utils.collection_paths.REQUIRED_SUBDIRSに一本化し、yt-init-collectionの scaffold も同定義を共有。/wf-new(init 直後の検証)//wf-next(フェーズ処理前のプリフライト)//suno-helper(サーバー起動前のプリフライト)//wf-status(詳細表示に骨格行)へ導線を追加し、/wf-newSKILL.md の scaffold 説明から漏れていた01-master/02-Individual-musicの記載も修正feat(thumbnail): thumbnail 候補の自動選択を標準化するyt-thumbnail-auto-selectCLI を追加。TTP 参照画像プール(image_generation.gemini.reference_images.default)の特徴量 centroid に最も近い候補を10-assets/thumbnail.jpgとして自動確定する。config/skills/thumbnail.yamlのimage_generation.auto_selection.enabled: trueで opt-in(未設定チャンネルは従来の手動承認フローのまま)。dry-run / apply を分離し、apply 時はworkflow-state.jsonに選択候補・distance・ランキング・実行時刻の監査ログを記録。候補なし・参照画像なし・16:9 逸脱・確定済みサムネ上書きは silent fallback せず明示エラーにする(#1370)feat(cli): 下流リポの automation 追従を機械実行するyt-automation-updateCLI を追加(#1473)。checkが実行場所・pin 形式(inline table / URL 直接参照の tag pin、main 追従、sha pin)・upstream 最新リリースとの差分を判定し exit code(0=最新 / 1=差分あり / 2=エラー)で返す。applyが pin 書き換え →uv lock→yt-skills sync(skills / claude-md 両 asset)→ smoke check(yt-skills list/yt-config-migrate verify)を順に実行し、失敗ステップを明示して非 0 終了する。commit / push は責務外(スキル・人間側に残置)feat(video-description):yt-title-duplicate-checkに YouTube タイトル上限(100 codepoint)の前倒しチェックを追加した。超過時は--strictに関係なく exit 1 で報告し、/video-descriptionの品質チェックにも「100 codepoint 以内」を明記。upload preflight(agents/_preflight.py)まで持ち越すと quota と時間を浪費するため、タイトル案の保存前に検出する(下流チャンネル実例: 104 codepoint でアップロード時に fail、2026-07-05)feat(thumbnail): サムネイル文字フォントを安定して指定できる決定的合成経路を追加(#1332)。yt-thumbnail-textCLI が textless 背景(main.png系)に実フォントファイル(.ttf/.otf/.ttc)を Pillow で描画し、同一の背景・テキスト・設定なら常に同一の出力を生成する。フォント指定は skill-configimage_generation.gemini.thumbnail_text.overlay(config/skills/thumbnail.yaml)で行い、フォント未設定・ファイル不在時は理由と代替手順(AI 経路へのフォールバック含む)を明示して停止する。AI プロンプト経路向けにもsingle_step.typography_clauseを追加し、SKILL.md に 2 経路の使い分けを示す「フォント安定化」章を新設feat(suno):/sunoの Style プロンプト生成に entry ごとの自動バリエーション機構(style_variation、既定で有効)を追加。genre_lineのコアジャンルを維持したまま texture / rhythm feel の descriptor を entry 通し番号ベースの決定的ローテーションで Style 第 1 行へ付与し、Suno V5.5 での楽曲同質化を防ぐ。先頭 entry は base style を維持(単一 entry の既存コレクションは出力不変)、stylevariant の明示 override がある entry は従来どおり優先、style_variation.enabled: falseで従来動作へ戻せる。全 entry の Style 文が完全一致する組は生成時に警告する(#1456)feat(wf-next):config/channel/workflow.json::workflow.wf_next.skip_manual_mastering(defaultfalse)を新設。trueのとき/wf-nextのマスター音源検出(2-B)で01-master/に別ファイルが無くてもassets.raw_masterをそのままassets.master_audioとして採用しphase: "mastered"へ進む(raw=final 運用)。approval_gates.audioとは独立で、後方互換(未設定は従来通り停止)。docs/workflow-cheatsheet.md のよくある質問に設定手順を追記(#1449)
Changed
refactor(suno-helper): 旧 Suno playlist capture 互換 route(POST /suno/playlists)とwrite_suno_playlists()/normalize_suno_title()/--playlist-capture-*を撤去し、DistroKid release 記録用の capture root を--distrokid-capture-rootに分離(#1301)docs(distrokid):/distrokid-prepスキルを/distrokid-helperに改名し、参照スクリプトと docs/features の表記を同期(#1350)feat(video-analyze):yt-video-analyzeを全尺解析から動画冒頭のクリップ窓解析(既定 900 秒 = 15 分、skill-configanalysis_window_secで上書き可)に変更。Gemini へ渡す Part にvideo_metadata(start_offset/end_offset)を付与して冒頭 2〜3 曲相当のみを解析し、長尺 Complete Collection の API コストを削減する。プロンプトをクリップ窓前提(bgm_arc.outroは窓内終盤、scene_timeline/editing_metricsは窓内対象)に整合させ、SKILL.md に解析後のレポート検証ステップ(窓超過タイムスタンプ・スキーマ欠落・不自然値の subagent レビュー)を追加。下流/sunoにも冒頭クリップ窓データである旨を注記した(#1495)- BREAKING
refactor(skills):/channel-setupスキルを削除し、/channel-newに統合した。詳細セットアップ/再生成(旧 Step 1〜8)は再生成モード(Step R1〜R8)、設定 push(旧 Step 9:yt-channel-settingsdiff / push / pull)は設定 push モードとして/channel-newが文脈から自動判別して受ける。共通テンプレート・スクリプト置き場は.claude/skills/channel-setup/references/から.claude/skills/channel-new/references/へ移設し、競合 branding snapshot 取得はインライン Python を廃止してreferences/fetch_branding_snapshot.pyに一本化。yt-doctor/ preflight の/channel-setup案内文言と CLAUDE.md / AGENTS.md のスクリプト配置規約も/channel-new系へ更新した。下流リポジトリはyt-skills syncの prune で追従する(#1461) refactor(automation-update):/automation-updateスキルの機械的ステップ(実行場所判定 / pin 形式判定 / 差分判定 / pin 書き換え /uv lock/ sync / smoke check)をyt-automation-updateCLI 呼び出しに置き換え、スキルは判断ポイント(リリース要約 / local fix 衝突 / 同意取得 / コミット)専任に薄型化(#1473)feat(hooks): review 頻出パターンのうち機械検出可能なテスト差分ゼロと広すぎる Any / any 型注釈を lefthook pre-push で検出するゲートを追加。SKIP_TEST_DIFF=1でテスト差分警告のみ明示 skip できるようにし、Python 未使用コード検出は既存 RuffF系継続、TS 未使用 export / dead code は既存ts-knip継続として docs に採否根拠を記録した(#1510)。その後の review-takt-default 指摘を受け、(1) any-usage-gate のスコープをsrc//tests//extensions//packages/限定からディレクトリ非依存の全*.py/*.ts/*.tsxに拡大(.claude/skills/*/references/*.py等も対象化)、(2) Python 側でfrom typing import Any直接 import 経由の裸Any使用も検出、(3) test-diff-gate のextensions/*/lib/*.test.tsが lib 判定に先取りされテスト差分ありなのに誤警告するバグを修正、(4) test-diff-gate に対応テスト差分ありなら警告しない成功パスの契約テストを追加、(5) lefthook の「同一 hook で use_stdin を持てるコマンドは 1 つ」制約に対応するため test-diff-gate / any-usage-gate を独立コマンドから外し changelog-gate.sh 1 本のエントリポイントに統合、ブランチ削除 push のスキップを 3 ゲート共通にした(#1510、PR #1525 review-takt-default 指摘対応)。再レビューでの追加指摘を受け、(6) Python 側の Any import 検出を 1 行正規表現からpython3/astベースに置き換え、複数行の括弧 import とasalias も解決できるようにし、(7) TypeScript 側は: any直書きに加えArray<any>/Record<string, any>等のジェネリック引数・union / intersection・tuple 要素の型位置anyも検出し、英語コメント・文字列リテラル中の "any" は誤検知しないよう型導入記号の直後という制約を追加、(8)SKIP_CHANGELOG=1が CHANGELOG チェックのみを省略し test-diff-gate / any-usage-gate は継続する契約テストを追加した(PR #1525 2 回目の review-takt-default 指摘対応)。3 回目の review-takt-default 指摘を受け、any-usage-gate の検出方式を正規表現の継ぎ足しから構造的な解析へ刷新した: Python 側は.lefthook/pre-push/any_usage_python_resolver.py(新設)がastでファイルを解析し、typing.Any修飾アクセスと直接 import 経由の裸Any(alias 含む)の両方を実際の参照行番号として解決するため、コメント・docstring・文字列リテラル中の "Any" は AST 上に現れず誤検知しない。TypeScript 側は型エイリアス代入(type X = any;)・型アサーション(value as any)も検出対象に加え、正規表現で候補行を検出したのち.lefthook/pre-push/any_usage_ts_line_cleaner.py(新設)で行コメント・文字列リテラルの中身を除去してから再判定することでコメント・文字列内の "any" 誤検知を防ぐ。あわせて diff の基準点(origin/mainとの merge-base)を changelog-gate.sh で一度だけ解決しPRE_PUSH_DIFF_BASEとして子ゲートへ export することで、3 スクリプトが個別に基準を再計算する重複を解消した(PR #1525 3 回目の review-takt-default 指摘対応)docs(channel-new):/channel-new(新規開設モード)の Step 7「簡易ペルソナ導出」冒頭に入口ゲートを追加し、承認済み TTP 対象(config/channel/analytics.json::benchmark.channels)が 0 件のままペルソナ生成へ進めないようにした。従来は 0 件検出が Step 9 の最終ゲートに集中しており、空のまま生成 → 差し戻しの手戻り(AI 生成コストの無駄)が発生し得た。判定基準は冒頭「TTP 完了条件(新規開設モード)」を単一ソースとして参照し、完了条件本体はコピーしない(#1517)feat(skills): comments-reply / pinned-comment に apply 実行前の承認ゲートを追加した(#1513)。両スキルの dry-run 確認ポイントを「全項目 PASS の場合のみ次フェーズへ進む」形式に統一し、1 項目でも FAIL なら dry-run を修正・再実行するまで apply へ進んではならない旨を明記した。comments-reply は Phase 4→5、pinned-comment は Phase 1→2 の間に承認ゲートを新設し、Claude Code では AskUserQuestion で dry-run 結果の要約を提示したうえで「投稿する」「キャンセル」の明示 2 択、AskUserQuestion 非対応環境(Codex 等)ではテキスト提示 + 明示的な承認発言待ちに統一したfeat(takt): lite workflow に提出前セルフ監査を組み込んだ(#1508)。過去の review-takt-default 指摘 371 件(183 レビュー)の全件分類から頻出 8 パターンを抽出した.takt/facets/policies/pre-review-checklist.mdを新設し、implementstep(自己監査 + 受入条件充足表の出力)とreviewstep(独立照合、スコープ外の改善提案は verdict に影響させない)に注入。あわせて lite のplanstep にinstruction: planを追加し、リポジトリ強化版 plan instruction(.takt/facets/instructions/plan.md)が lite でも注入されるようにした。運用・更新手順はdocs/takt-operations.mdの「提出前セルフ監査」節を参照docs(skills): takt 各 step の固定コンテキスト削減のため全スキルの frontmatter description を短縮(合計 22.4KB → 10.1KB。同義トリガー語の羅列と処理手順の重複を削り、スキル間 dispatch の境界語と機械検証キーワードは維持)。あわせて CLAUDE.md(18.9KB → 7.4KB)/ AGENTS.md(14.6KB → 2.2KB、CLAUDE.md への一元化)をスリム化し、詳細をdocs/architecture.md/docs/development.md/docs/takt-operations.mdへ移設。.takt/config.yamlに observability(usage_events_phase)を有効化し、小〜中規模 issue 用の軽量 3-step workflow.takt/workflows/lite.yamlを追加(使い分け基準はdocs/takt-operations.md)。さらに takt 内部実装(phase 分割実行)の調査に基づき、lite の review step を全 step codex 方針に合わせて codex 化し、structured_output(.takt/schemas/review-verdict.json)+ deterministicwhen:ルールで状態判定 phase の LLM 呼び出しを排除。phase コストモデルと workflow 設計指針をdocs/takt-operations.mdに文書化chore(distrokid-helper): manifest / package の shell を suno-helper 基準に揃えた(ADR-0016、#1359)。manifest 権限をlib/manifest.tsのMANIFEST_PERMISSIONS/MANIFEST_HOST_PERMISSIONSに SSOT 化してwxt.config.tsから参照し、tests/manifest.test.tsと CI(extensions.yml)の生成 manifest 検査で drift(広域権限や suno-helper 専用権限の混入、distrokid.com 以外の host 追加)を機械検知するようにした。あわせて dependencies の caret 指定を既存解決値へ exact pin(@webext-core/messaging2.3.0 /@wxt-dev/storage1.2.8 /reactreact-dom19.2.7)し、pnpm.onlyBuiltDependencies: ["esbuild"]を追加fix(skills): collection-ideate と wf-new の SKILL.md に別々の散文で重複記述され、既に文言が食い違っていた stale/freshness 判定ロジック(相対比較・絶対鮮度の OR 条件)をreferences/freshness-rules.mdへ単一ソース化した。文言の食い違い(片方のみ #1427 と自動呼び出し不可を記載、もう片方のみ deep-merge 手順を記載)を解消し、両 SKILL.md は挙動指示(stale なら中断 //analytics-collect→/analytics-analyzeの順 / 自動呼び出し不可)を残したまま「定義は freshness-rules.md を正とする」参照に縮約した。判定規則の内容(日数・順序・OR 条件)自体は変更していない(#1519)docs(postmortem):postmortem/SKILL.mdの症状判定閾値「チャンネル特性に応じて文脈調整可」に調整ルーブリックを追加した。調整して良い 3 ケース(新チャンネル: 公開 10 本未満 or 開設 30 日未満 → 平均比閾値を ±0.1 まで緩和可 / 直近テーマ転換: 過去平均比較は参考値としratio_vs_median系を優先 / 外部要因の明確な痕跡: 該当指標の判定を保留し外部要因を先に記録)を表で固定し、該当ケースがなければ表の係数をそのまま使う(自由裁量での調整は不可)ことを明記した。Sonnet 級モデルでの週次分析の再現性低下(恣意的調整または無調整への偏り)を防ぐ(#1522)docs(skills): 後工程スキルが前工程の出力を暗黙に信じて実行し、入口ではなく途中で失敗する問題を防ぐため、4 箇所に「存在確認 → なければ前工程を案内して停止」ガードを追加した。channel-setup は Step 2.1 の inline Python 実行前にauth/token.json/auth/client_secrets.jsonの存在確認(無ければ/setupを案内)、Step 3.5 の転記前にdocs/channel/channel-direction.mdの存在確認(無ければ/channel-directionを案内、順序固定)を追加。channel-research は手順冒頭に Step 0 を新設しdata/benchmark_*.json/data/comments_*.json/docs/benchmarks/*.mdの存在確認(欠損種別ごとに/benchmarkまたは/viewer-voiceを案内)を追加。audience-persona-design は Phase 6 入口にdocs/plans/viewing-scene-matrix.mdの存在確認を追加し、ユーザーがスキップを明示した場合のみ「viewing-scene 未検証」と注記して確定できるようにした(#1516)
Removed
- BREAKING
refactor(skills):/channel-importスキルを削除し、/channel-newの「既存チャンネル取り込みモード」として統合した(#1460、epic #1459 の 1/2)。取り込みモードは呼び出し文脈(「既存チャンネル」「チャンネル取り込み」「config 生成」「channel-import」)から自動判別し、ヒアリング → config 生成 → 検証 → OAuth / channel_id 取得 → 次ステップ案内を担う。旧 Step 0 のテンプレートリポジトリ clone 手順は廃止し、/channel-newの方式(現在のディレクトリ +/setup前提)に整合させた。yt-doctorのchannel_configロード失敗時の案内と他スキル SKILL.md /docs/features.mdの/channel-import言及も/channel-new(取り込みモード)へ更新。下流リポジトリはyt-skills syncの prune で削除に追従する
Changed
chore(ts-rewrite): main を feat/ts-rewrite へ追従 merge した(v5.5.15 まで、ADR-0008 の同期運用)。main 側の OAuth 契約 fix(#1330:installedブロック必須化 +redirect_uris検証)・TTP readiness(#1357)・DistroKid / comments config fix(#1211)を取り込み、OAuth boundary テストの fixture を新契約に追随。main が更新した lifecycle skill 文書(masterup の Suno 選曲 #1308/#1324、video-upload の予約公開 plan #1406、channel-import 統合 #1460 等)へ #965 のbunx tayk <cmd>置換を再適用し、distrokid-prep→distrokid-helperrename にも追随した。main でリリース済みの [Unreleased] エントリは各リリースセクションへ整理fix(ts-rewrite/cli): CLI smoke test が Bun デフォルト timeout(5000ms)に当たり REJECT される構造的問題を修正した(#1107)。subprocess smoke test に明示 timeout を設定し、重いロジック検証はcreateXxxCommand()を直接呼ぶ in-process テストに移行。subprocess テストは「dispatcher が subcommand を認識する」確認のみに限定。refactor(ts-rewrite/core): registry のMETADATA_GENERATE_REGISTRY_KEY定数を除去し、service キーをリテラル文字列でインライン化した(#1112)。public export を減らし registry データ内に閉じ込めることで、外部からの参照結合を排除。回帰テストregistry-deps.test.tsで定数非 export を機械担保。refactor(ts-rewrite/core): OAuth service(interactiveAuthService/refreshTokenService)をcreateServiceフレームに移行し、ADR-0003 の構造的不整合を解消した(#1139)。output schema をoauth/schema.tsに追加し、OAuth callback のstate生成・検証を追加。boundary テスト(input validation / success / failure)も追加。refactor(ts-rewrite/core): ADR-0003 の service 境界 frame(try/catch → Result 変換)をcreateServiceヘルパ(service-frame.ts)に抽出し、対象 10 service(analytics 5 + image / skills-sync 2 / suno-prompts / upload)を移行した(#1109)。新規 service は core function + schemas だけ書けば frame を正しく適用できるようになり、手書き frame のレビュー負荷と誤実装 fail mode を除去。refactor(ts-rewrite/core): analytics 5 service の共通クエリ実行をanalytics/query.ts::executeQueryに、列ヘッダー解決をanalytics/columns.tsに集約し、各 service の try/catch/ok/err ボイラープレートをservice.ts::createServiceラッパーで除去した(#1110)。column-helpers.ts→columns.tsリネーム、analytics/query.ts/service.ts新設。テスト追加:analytics-query.test.ts/service.test.tsfeat(ts-rewrite/core): Audience analytics の demographics / country / subscribedStatus 3 クエリを並列開始するよう変更した(#1115)。失敗時は開始済み retry が settled になるまで待ってから Result へ変換し、service 戻り後に API retry が残らないようにした。refactor(ts-rewrite/core): analytics service の列ヘッダー解決とセル読み取り処理をanalytics/column-helpers.tsに共通化し、channel / audience / traffic-source の重複実装を整理した(#1113)。refactor(ts-rewrite/core): analytics のエラー分類ロジックをerrors.tsに統合した(#1108)。analytics/query-error.tsとaudience/service.ts内の重複実装(toAnalyticsQueryError/shouldRetryAnalyticsQuery/parseRetryAfterSeconds)を削除し、classifyGaxiosError/shouldRetryApiQuery/ RFC 7231 準拠のparseRetryAfterSecondsに一本化。ネットワークエラーの retry 漏れも修正。feat(skills): dogfood ライフサイクルが踏む 12 skill(wf-new / wf-next / suno / suno-helper / masterup / videoup / video-upload / thumbnail / video-description / analytics-collect / playlist / distrokid-prep)のuv run yt-*呼び出しをbunx tayk <cmd>(ADR-0007 rebrand / ADR-0004 単一 dispatcher)へ置換した(#965)。TS 版を pin した下流でも skill 経由で Python が実行され dogfood が始まらない問題を解消する。対象 skill のuv run残骸ゼロをtests/test_lifecycle_skills_no_uv_run.pyで機械担保。lifecycle 外の skill の置換は #966 で対応予定。
Added
feat(ts-rewrite/core): Traffic source 内訳(search / browse / external / suggested 等)を期間集計するcollectTrafficSourceServiceを ADR-0003 準拠で実装した(#832)。packages/core/src/analytics/traffic-source/(schema / service / index)を新設し、Pythonutils/traffic_source_analytics.pyMixin を翻訳せず TS で新規記述。あわせて analytics 共通のエラー分類をanalytics/query-error.ts(toAnalyticsQueryError/shouldRetryAnalyticsQuery)へ集約し、video / channel / video-daily / traffic-source の各 service から参照する。quota(429)はwithRetryで retry せずdomain: "quota"の Result で返すfeat(ts-rewrite/core): resumable upload + thumbnail 圧縮 + metadata update を 1 atomic service に集約したuploadVideoServiceを ADR-0003 準拠で実装した(#837)feat(ts-rewrite/core): Per-video metrics(views / likes / comments / shares 等 8 指標)を YouTube Analytics API から収集する analytics video service を ADR-0003 準拠で実装した(#829)refactor(ts-rewrite/cli):generate-sunoのgetCwd()を遅延評価に変更し explicit path 指定時の不要な cwd 解決を排除。skills-bundle-pack.test.tsのbeforeAll共有 fixture を各テスト独立生成に改善(#1156)
Fixed
fix(ts-rewrite/generate-master): review 指摘を受け、masterup.yamlfallback はaudio直下の generate-master 用キーだけを読み、finalize-master 用 namespace のaudio.finalize.*は無視するよう修正した。JSON 優先はmasterupoverride に限定し、inline / scalaraudio、JSON root / audio shape 不備、空白bitrateは config / validation error に統一した。registry 経由でも明示 CLI 値の presence が config override より優先されるよう schema 境界を分離した。ffmpegの bitrate 指定では-b:aと-q:aの併用をやめ、single MP3 も bitrate 契約どおり encode 経路へ統一した。generate-masterpublic subpath から CLI 用 path resolver を外し、tayk generate-masterの CLI flag 実行 smoke と関連回帰テストを追加した(#772)fix(ts-rewrite/core): ADR-0009(JSON-only config)との実装乖離を解消し、packages/coreからyaml依存を排除した(#1415)。suno-prompts の定義ファイルを JSON 化(suno-patterns.yaml→suno-patterns.json、config/skills/suno.yaml→suno.json)し、parser をJSON.parseベース(parseTopLevelJson/parsePatternsJson)に変更。packages/core/package.jsonからyamlを削除し、ADR-0009 に Status(乖離解消日)を追記した。fix(ts-rewrite/core):uploadVideoServiceの予約公開時刻正規化で、不正な timezone offset(例:+25:99)を UTC 変換対象にしないよう修正した(#1120)。refactor(ts-rewrite/core):collectVideoDailyAnalyticsServiceの列マッピングをハードコード位置参照からcolumnHeadersベースの動的解決(requireHeaders/resolveColumnIndex)へ移行した(#1114)。API レスポンスの列順変更に対する堅牢性を向上fix(ts-rewrite/core):readReferenceFilesの参照画像読み込み失敗時エラーに対象パスを含め、元の filesystem error をcauseに保持するよう修正した(#1121)。fix(config):channel-import(/channel-new取り込みモード)が生成するconfig/localizations.jsonのtitle_templateがアップローダー許可プレースホルダ({scene_phrase}/{activities}/{scene_emoji})と不整合になり、アップロード時までエラーに気づけない問題を修正。yt-config-migrate verifyが生成直後に不正プレースホルダを検出して失敗するようにし(validate_localizations_title_templatesを新設)、channel-setup/references/localizations-template.jsonを許可プレースホルダのみの形へ更新、SKILL.md / config-generation-rules.md に許可リスト契約を明記した(#1471)fix(suno): ボーカルモードのtracks_per_patternを prompt entry name 契約に反映し、/sunoがsuno-prompts.jsonを展開後 entry 数で生成、/suno-lyric/yt-suno-verifyが同じTake N付き name と件数を検証するよう修正(#1484)fix(suno):yt-suno-verifyと/sunoの final entry name 生成を共有化し、suno-patterns.yaml/suno-prompts.json/suno-lyrics.jsonのnameに外側 whitespace がある場合は暗黙正規化せず fail-loud するよう修正(#1484)fix(suno-helper): duration NG clip を playlist 対象から除外する処理を origin/main の run 完了時リロード・stale selection guard と統合し、全 clip が NG の場合に raw ID を resume state へ残さないようにした。playlistExpectedClipCountは OK clip 数として保存しつつ、resume / failed-only rerun の raw 観測期待数は保存済み OK IDs + 今回実行 entry 数から別計算し、Download 再開可否は full collection 完走状態で判定するよう分離。active feed poll は duration を取得できる feed v3 POST に揃え、bridge 由来 duration は finite non-negative number のみ受け入れる。retryPlaylist/ failed-only rerun でも正規化済み OK clip ID 契約を維持し、duration 未観測 ID を新規 playlist 対象にしないようにした。manual adoption は未検証 ID として保持して retryPlaylist 側の duration filter に通し、duration_filterは snapshot / resume state に保存して popup 再 open 後も custom 閾値を維持する。download 完了 POST のexpected_file_countは duration-filtered 採用数としてサーバー側 workflow-state / collection index / artifact 展開の完了判定にも反映する。suno-prompts.json生成も collection-levelduration_filterenvelope へ対応し、bool / NaN / Infinity / 非 mapping を fail-loud にする(#1269)fix(doctor):yt-doctorのttp_wf_new_readinessがbranding/icon.png/branding/banner.png不在時に、同名 stem の別拡張子や-vN付き候補をbranding/から列挙してリネーム/変換を促すようにした。複数候補がある場合は最終版の人間確認を促し、自動判定しない旨を明示する。あわせて/channel-newと/automation-updateに、新規生成前の既存 branding ファイル確認手順を追記した(#1550)fix(masterup):/masterupStep 4.5 の本実行前にyt-suno-select-tracks --dry-runでpair_selection.min_song_sec未満候補を確認する手順を追加し、該当候補がある場合はファイル名・duration・設定中のmin_song_secを提示して続行可否を確認するようにした。あわせて dry-run stdout に短尺候補専用の[dropped_under_min]セクションとdropped_under_min件数を追加した(#1526)fix(masterup):.claude/skills/masterup/SKILL.mdの Step 1(コレクション特定条件)と「完了時の更新」セクションが workflow-state.json 旧スキーマ(v1、music.generated/music.approved/mp3_count/phase: "music-approved")のまま残っており、現行スキーマ(v2、.claude/skills/wf-new/references/schema.md)のassets.music_prompts/assets.raw_master/phase定義と食い違っていた。/wf-next側の既存検出ロジック(assets.music_prompts = trueかつassets.raw_master = nullを対象とする)、および実装(apply_rain_layers.pyが書き込むフィールドはassets.raw_master)と突き合わせて記述を修正し、/masterupは raw master 生成 +assets.raw_master記録までを担いphaseは遷移させない(raw_master→master_audio確定後の"mastered"遷移は/wf-nextの責務)旨を明記した。現行スキーマに対応フィールドが存在しないmp3_countは削除した(#1521 の実装中に副次的に発見。ドキュメントのみの変更でコード変更なし)fix(video-analyze):analysis_window_secを API 呼び出し前に bool ではない正の整数として検証し、不正な channel override(0 / 負数 / 文字列 / bool / null)が GeminiVideoMetadata.end_offsetへ流れないよう fail-fast にした。解析に使った窓幅は JSON のanalysis_window_sec/analysis_scopeと Markdown レポートに保存し、レポート検証 Step 3 には Gemini 生成物を untrusted data として扱う境界指示を追加。data/video_analysisを読む下流 skill には冒頭クリップ窓データである旨を明記した(#1495)fix(upload):yt-upload-collection --planの公開設定表示が schedule 無効時に固定「即時公開 (public)」となり実効 privacy_status と乖離する問題を修正。実効値(config/channel/youtube.json::privacy_status)を反映して public / unlisted / private を正しく表示する。あわせて、どこからも参照されていなかったschedule_config.json::upload_settings.privacy_statusをデフォルト設定・yt-channel-initテンプレート・schedule-template.jsonから撤去して設定箇所をyoutube.json::privacy_statusに一本化し、既存の schedule_config.json に残存する場合は警告ログで案内する(#1472)fix(upload): 単一言語チャンネル(supported_languagesが 1 言語以下)でyt-populate-scene-phrasesは no-op なのに upload preflight / metadata audit / localizations 生成がscene_phrasesを必須要求してエラー停止する矛盾を解消。「scene_phrases が必要か」の判定をpreflight_checks.requires_scene_phrases()に一本化し、単一言語では preflight・audit のチェックをスキップ、generate_localizations()は空 dict を返す(デフォルト言語のタイトル・概要欄は snippet 側で供給済みのため情報損失なし)。これにより populate → upload の通し実行が手動修正なしで成功する(#1470)fix(upload): upload preflight でworkflow-state.jsonの存在と JSON parse を単一言語チャンネルでも常時検証するようにし、scene_phrases完全性チェックだけを多言語チャンネル限定にした。/metadata-auditと/wf-newの skill 手順も単一言語では翻訳 JSON 不要、多言語ではscene_phrases必須という契約に揃えた(#1470)fix(upload): metadata generator のworkflow-state.json読み込みも fail-loud に揃え、単一言語チャンネルでも壊れたworkflow-state.jsonを localizations 空 dict の成功扱いで見逃さないようにした。yt-populate-scene-phrasesの collection 名拒否テストに空・.・..・backslash 入力を追加し、利用者向けscene_phrases.mdのエラーハンドリング表も単一言語 no-op / 多言語必須を明示した(#1470)fix(hooks): git worktree / Codex 実行環境で lefthook hook が stale な Nix store 固定パスや PATH 不在により silent skip され得る導線を修正。devShell の shellHook は trusted な flake 側.lefthook/install.shを呼び出して hook を毎回再生成し、生成済みpre-commit/pre-pushは install 時の lefthook 絶対パス + PATH fallback の wrapper へ置き換え、どちらも解決できない場合は exit 1 で fail-closed する。wrapper 生成失敗は部分適用のまま成功扱いにせず、既存のLEFTHOOK=0全 hook skip 契約も維持する。親 checkout / worktree それぞれの診断・再生成手順も docs に追加した(#1552)fix(automation-update):yt-automation-update applyの sync-only / smoke check / 失敗ステップ表示を hardened。URL 直接参照と inline table の ref 許可規則をmain/ 40 桁 sha /vX.Y.Ztag に統一し、--sync-onlyは local fix guard を通したうえで指定 skill の skills asset と claude-md を同期、未知 skill 名は副作用前に拒否、yt-config-migrate verify --target <repo>で対象 repo を固定、pyproject.toml書き換え時の I/O 失敗もステップ名付きで報告するようにした(#1473)fix(thumbnail):yt-generate-imageの${typography_clause}展開で malformed なimage_generation.gemini.single_step/thumbnail_text.font設定を{}や"consistent"に丸めず、ConfigErrorとして[ERROR]+ exit 1 で fail-loud するようにした(#1332)fix(suno-helper): Suno UI 改装(2026-07-04 観測、Lyrics 欄の Lexical エディタ化)で連続実行が「Lyrics 欄が見つかりません」の FatalRunError で必ず中断する問題を修正した(#1506)。Suno Custom Mode の Lyrics 欄がtextarea[data-testid="lyrics-textarea"]からdiv.lyrics-editor-content[contenteditable][data-lexical-editor](Meta Lexical エディタ)へ変わり、resolveFieldsが textarea 前提の解決で lyrics を見失っていた。対応: (1)shared/dom.ts::resolveFieldsの lyrics 解決に Lexical contenteditable の fallback を追加(従来の testid textarea を最優先に維持して旧 UI と併存、contenteditable=""の boolean 属性形式も許容、bbox 幅非ゼロで非マウント要素を除外)。ResolvedFields.lyricsはHTMLTextAreaElement | HTMLElement | nullへ拡張。(2) Style 解決は[data-testid="create-form-styles-wrapper"]内の可視 textarea を一次識別に昇格(lyrics が textarea でなくなり「Lyrics 以外の可視 textarea」述語だけでは特定根拠が弱くなったため。wrapper 不在の旧 UI は従来述語へ fallback)。(3) 注入は新設のsetLyricsValueが分岐する: textarea / input は従来の同期setNativeValue、Lexical contenteditable は value setter を持たないためfocus → execCommand("selectAll") → 200ms 待ち → DataTransfer + ClipboardEvent("paste") dispatch → 200ms 待ちの合成 paste で全置換する(Lexical 自身が購読する paste に text/plain を載せる React 互換経路)。selectAll の選択は Lexical が selectionchange 経由で内部 state に取り込むため反映が非同期で、同期実行では全選択が乗らず「置換」でなく「先頭挿入」に化ける(実機検証)— 200ms の selection 同期待ちが本質で、呼び出し側content.ts::injectAndGenerateの lyrics 注入も await 化した。実ページで 6 entries × 12 clips の連続生成 → playlist 一括追加 → ZIP DL の完走を確認済み。Vitest に resolveFields の Lexical fallback 5 ケース / styles-wrapper 一次識別 2 ケース / setLyricsValue の経路分岐・selectAll→paste 順序(fake timer で同期 paste 禁止を pin)・instrumental 空文字 3 ケースを追加、Playwright e2e に Lexical mock(paste 横取りで全置換する contenteditable)への注入スモークを追加。fix(suno-helper): #1506 の Lexical Lyrics 空文字注入を空 paste 依存からselectAll後のdeletecommand へ切り替え、readback が空にならない場合は Generate へ進まず fail-loud するようにした。actual run handler 経由で空 lyrics が Generate 前にクリア済みであること、非反映時に ERROR で止まること、共有 DOM mock がsetLyricsValueexport に追従していることをテストで固定した。fix(wf-next): raw=final 採用時の/wf-nextstate 更新でworkflow-state.json/01-master/ 採用音源の symlink を拒否し、collection 外の state 書き込みや外部音源採用を fail-closed にした。あわせてapproval_gates.uploadの非 boolean 拒否テストをaudioと同じ契約で固定(#1449)fix(suno-helper): popup のチェック選択実行を旧 range 指定からindicespayload に切り替え、done/failed 状態を含む選択復元・再実行で絶対 index がずれないようにした。旧 range UI 文言と helper を撤去し、content runner 側はindicesをrangeより優先して部分実行する(#1267)fix(suno-lyric):/suno-lyricがマルチ曲 collection で[Intro][Pre-Chorus][Bridge][Extended Outro]を全曲一言一句同一のまま出力するのを防ぐため、Workflow に「これらの section も曲ごとの scene / persona で書き分ける」指示を明記し、Validation に曲間セクション重複のセルフチェックと書き分け直し手順を追加。suno-lyrics.jsonの曲間重複を機械検出するreferences/check_lyric_duplication.pyを新設(重複検出時は exit 1、#1445)fix(doctor):ttp_wf_new_readinessの video_analysis 要件が benchmark top 5 のライブ配信(duration_iso == "P0D"、Gemini 取り込み不可で解析不能)により恒久的に充足不能になる問題を修正。live は期待集合から除外して次点 VOD を繰り上げ、VOD が不足する場合は母数を縮小し、除外時は message に「live 配信 N 本を除外」を明示する。yt-video-analyze --source benchmarkも同じ選定で live をスキップして次点 VOD を解析する(#1462)fix(hooks): oxlint.config.ts / oxfmt.config.ts のignorePatterns対象パス(examples/**docs/**config/**など)のみを変更した commit で lefthook pre-commit の oxlint / oxfmt が「対象ファイルなし」を non-zero exit で返し必ず失敗する問題(#1428 の同型)を修正。lefthook.ymlの両コマンドに--no-error-on-unmatched-patternを追加し、対象 0 件を成功として扱うようにした(ignorePatterns のパスを exclude へ列挙する二重管理は回避、#1452)fix(videoup):generate_videos.shのbuild_effect_filter()でVIDEOUP_EFFECT=particles/bokehを指定すると出力が緑一色または黒一色になる問題を修正。原因は 2 点あり、(1)geq=lum='...'でcb/cr(色差)を省略すると環境によってデフォルト値が中央値 128 ではなく 0 になり YUV→RGB 変換で緑被りが発生する、(2)geqの直前がformat=yuv420p(アルファプレーン無し)のままだとa=の不透明度式が無視され常時アルファ=255(完全不透明)になり、エフェクトレイヤーが背景を完全に覆い隠して黒一色化する。gradientエフェクトは元々geq直前にformat=yuva420pを明示していたためこの問題を踏んでいなかった。particlesはgeq=にcb=128:cr=128を追加して白い粒子を維持し、bokehはcb='cb(X,Y)':cr='cr(X,Y)'で元の暖色 chroma を維持したまま、両方でnoise=...の後・geq=...の前にformat=yuva420pを挿入した。あわせてfx_baked.paramsに filtergraph stamp を含め、旧 filtergraph で焼いた cache を再利用しないようにしたfix(analytics-report):analytics-report/SKILL.mdの「CTR 値の解釈」が「整数値 2606」から意味不明な式の否定を経て「そのまま使用」に至る自己矛盾した記述になっており、コード実態(reporting_api.pyのtotal_weighted / total_impressionsが返す百分率 float。例4.2= 4.2%、tests/test_ctr_resolver.pyのフィクスチャも 4.2)と食い違っていた。百分率 float である旨・表示フォーマット(小数 1〜2 桁 +%)・100 で割る/掛ける/整数再解釈の禁止・None時の表示を一義的な規則として書き直した(#1514)fix(skills): 兄弟スキル間の frontmatter description 矛盾・発動キーワード衝突を解消。viewer-voice の「/audience-persona-design らの前提データを作る任意後続スキル」を「/audience-persona-design の必須入力(viewer-voice-analysis.md)を作る前工程。実行タイミングは任意」に書き換え、audience-persona-design 側の必須入力表記との矛盾を解消(audience-persona-design 側も対象ファイル名を明記して双方向に整合)。benchmark と channel-research が共に持っていた発動キーワード「競合分析」の重複は、benchmark を「競合データ収集」に変更し末尾に「収集済みデータの分析は /channel-research」の否定トリガーを追加、channel-research 側に「データ収集・更新は /benchmark(未実行なら先に案内)」を追記して解消。videoup / video-upload は名前類似で相互区別が無かったため、互いを名指しする一文(videoup→「YouTube への投稿は /video-upload」、video-upload→「動画ファイルの生成(MP3→MP4)は /videoup」)を追加した(#1515)fix(setup):/setupの GCP project ID 推奨値生成で、30 文字超過時の truncate 手順が 2 通りに読め、機械的に切ると末尾ハイフン(GCP 制約違反)の ID も生成されうる問題を修正。yt-prefix は必ず保持し slug 末尾から削る→切り詰め後の末尾ハイフンを追加除去する→6 文字未満や意味が読み取れなくなる場合は自動生成をやめカスタム入力を求める、の 3 段手順 + 31→30 文字の具体例で一義化した(slug 生成規則自体は無変更、#1523)fix(thumbnail):thumbnail/SKILL.mdの TTP 差分プロンプト解説に地の文で置かれていたdaiki-beppu/rjn(private リポジトリ)への実装事例参照を、「参考(オペレーター向け・実行時は無視してよい)」の引用ブロックへ隔離した。下流リポジトリの実行者はアクセスできない非公開リポジトリへの取得試行で時間を浪費する問題を防ぎつつ、jazzgak チャンネルのcolor_themes.<theme>.reference_image多軸切替という参考情報自体は保持する(#1524)fix(suno):/sunoの「### モード判定」がキーワードスキャン 1 本(「ボーカル要素が含まれていれば」)で、対象語リストの範囲が不定・否定文脈(no vocals/instrumental等)の扱いが未定義・判断に迷った場合の手順が無く、誤判定が歌詞工程の要否と Suno UI の Instrumental ON/OFF を誤らせる高コストな手戻りを招き得た。4 段の決定木(1. 否定表現が先で他語より優先 → 2. ボーカル語の完全一致 → 3. どちらも該当なしは既定インスト → 4. 確信が持てない場合は推測せず該当箇所を提示して AskUserQuestion でユーザーに確認)に置き換え、リストが網羅ではない旨と該当なし語での歌唱可能性は必ず 4 に落とす旨を明記した(#1520)fix(live-clean):/live-cleanStep 3 末尾の削除承認指示が「AskUserQuestion で確認、承認されるまで実行しない」という自由記述のみで、質問文の内容・選択肢・曖昧応答時の扱いが未指定だった。AskUserQuestion の質問文に削除対象の実数(「削除対象: N コレクション / M ファイル / X.X GB」)と「削除は取り消せません(rm -f による物理削除)」の警告を含め、選択肢を「削除を実行する」「キャンセル」の明示 2 択に固定(デフォルトを実行側にしない)。「削除を実行する」が明示的に選ばれた場合のみ Step 4 へ進み、それ以外の応答(自由文・別話題・無回答)はすべてキャンセル扱いとした。AskUserQuestion 非対応環境(Codex 等)ではテキスト提示 + 明示的な承認発言待ちを明記し、Step 4 の実行条件も同じ選択文言(「削除を実行する」が明示的に選ばれた場合のみ)に揃えた(#1518)fix(masterup):/masterupが部分ダウンロード(例: 10 曲中 5 曲失敗)を検知できず、assets.music_downloadedがtrueのまま欠けた曲数でマスター音源を生成しうる問題を修正。コレクション特定 Step 直後に「DL 完全性チェック」を追加し、02-Individual-music/の実ファイル数(mp3/m4a/wav)を期待曲数(suno-prompts.jsonの entry 数 × 2、インスト / ボーカル共通の算式)と突合する。不足時はmusic_downloadedフラグに関わらず揃っているとみなさず不足曲数を提示して停止、ファイルが 0 件なら/suno-helper未実行として案内して停止する。期待曲数・実ファイル数の算出は/suno-helperの DL 完了判定・yt-collection-serveの status 判定と同じ既存ユーティリティ(suno_downloaded_workflow_state/suno_downloaded_archive)を再利用し、算式を二重管理しない(#1521)fix(wf-next):/wf-nextの Suno パスがworkflow-state.json::planning.music.suno_playlist_urlに記録済みの playlist URL を確認せず、02-Individual-music/のダウンロード完了実態も見ないまま常に AskUserQuestion で URL 再入力を要求していた問題を修正。URL 記録済み + 音声ファイル(mp3/m4a/wav)実在なら記録済み URL で/masterup <URL>を自動実行し、URL 記録済みだがファイル未実在ならダウンロード未完了の可能性を案内して停止、URL 未記録なら従来通り AskUserQuestion で入力を求めるようにした。wf-new/references/schema.mdにplanning.music.suno_playlist_url/assets.music_downloadedのフィールド定義も追記(#1539)fix(skills): suno / lyria / videoup の SKILL.md に workflow-state.json 旧スキーマ(v1)由来のフィールド名(music.*/production.*)が残存し、現行スキーマ(v2、wf-new/references/schema.mdが正)と食い違っていた問題を修正。/sunoはyt-generate-suno完了時の更新先をmusic.generated = trueからassets.music_prompts = trueに修正した(wf-new/SKILL.mdの同フィールド更新箇所・wf-next/SKILL.mdの Suno/Lyria 両パス前提条件と整合)。/lyriaは Step 5「完了時の更新」が本来/wf-nextの責務である最終マスター確定(assets.master_audio)と v2 に存在しないphase: "music-approved"への遷移まで誤って自スキルの責務として記述していたため、Lyria 自身が担うassets.music_prompts = trueへの更新とassets.raw_masterへのファイル名記録のみに縮約した。/videoupは自動検出条件をmusic.approved = trueかつproduction.generated = falseからassets.master_audioが設定済み(null以外)かつassets.master_videoがnullに修正し、完了時の更新もproduction.generated = trueからassets.master_videoへの動画ファイル名記録に修正した。init_collection.pyのassets初期化・apply_rain_layers.pyのraw_master更新など実装コードとの突合で v2 フィールド名を確認し、SKILL.md のみを修正(コード変更なし)
Migration
所要時間の目安: 0〜10 分
local fix 衝突注意:
- videoup:
generate_videos.shのbuild_effect_filter()(particles/bokeh)をこのバグの回避のためローカルパッチ済みの下流リポジトリは、yt-skills sync取り込み後にローカルパッチを外すこと(残したままだと二重適用にはならないが、次回 upstream 側の当該箇所の変更が sync で上書きされずローカル差分として残り続ける)。取り込み後はVIDEOUP_EFFECT=particles/bokehで一度動画を生成し、緑/黒一色になっていないか確認する。
サマリ:
/suno//suno-lyricの成果物検証、playlist 突合、コレクション骨格 preflight、thumbnail 自動選択など、制作フローの fail-loud 化と自動化を追加した。/channel-setup//channel-importを/channel-newに統合し、旧スキルを削除した。下流リポジトリはyt-skills syncの prune で追従する。yt-automation-updateCLI を追加し、下流リポジトリの pin 更新・lock 同期・skill sync・smoke check を機械実行できるようにした。particles/bokehエフェクトが緑一色・黒一色になる重大バグを修正した。エラーなく「生成完了」と表示されるため気づきにくく、該当エフェクトを使っている下流チャンネルは取り込み後に出力確認を推奨する。
追加移行メモ:
#775: Pythonyt-generate-suno相当の導線は TS dispatcher のtayk generate-suno <collection-dir> [--json]に移行する。per-CLI bin は追加せず、core registry entrysuno.generate経由でsuno-prompts.md/suno-prompts.jsonを生成する。#772: Pythonyt-generate-master相当の導線は TS dispatcher のtayk generate-master <collection-dir> [--json]に移行する。per-CLI bin /ytalias は追加せず、core registry entrymasterup.generate-master経由で Suno ダウンロード済み音声をmaster.mp3へクロスフェード結合する。skill-config はconfig/skills/masterup.jsonを優先し、存在しない場合のみ既存config/skills/masterup.yamlを fallback として読む。audiosection は optional で、存在する場合は object のみ有効。未対応 YAML 行や空 scalar は config error として停止する。
What's Changed
- [#731] issue-731-workspace-skeleton-p by @daiki-beppu in #794
- [#732] issue-732-first-tracer-bunx-yt by @daiki-beppu in #800
- [#734] issue-734-core-utils-exception by @daiki-beppu in #802
- [#699] issue-699-feat-distrokid-wxt-d by @daiki-beppu in #801
- [#735] issue-735-core-utils-secrets-p by @daiki-beppu in #804
- [#736] issue-736-core-utils-config-lo by @daiki-beppu in #805
- [#737] issue-737-core-utils-metadata by @daiki-beppu in #808
- [#738] issue-738-core-utils-image-pro by @daiki-beppu in #811
- feat(ts-rewrite/core): result.ts + ServiceError zod 化 + 5 名前タグ class 撤廃 (#821) by @daiki-beppu in #913
- refactor(ts-rewrite/core): secrets を packages/cli/lib/ に移動 + lib tier 整備 (#822) by @daiki-beppu in #914
- [#823] issue-823-ts-rewrite-phase1b-i by @daiki-beppu in #916
- [#824] issue-824-ts-rewrite-phase1b-s by @daiki-beppu in #918
- feat(ts-rewrite/core): core feature registry + citty dispatcher (#842) by @daiki-beppu in #958
- feat(ts-rewrite/core): withRetry 共通 seam を導入し image provider を 1-attempt 契約に縮退 (#959) by @daiki-beppu in #963
- [#964] issue-964-fix-ci-feat-ts-rewri by @daiki-beppu in #975
- feat(ts-rewrite/core): config 15 file を zod 化 + snakeToCamel 共用化 (#736 retrofit、構造維持) (#825) by @daiki-beppu in #920
- docs: ADR-0009 Turso (libSQL) ローカルデータストア導入 by @daiki-beppu in #989
- [#826] issue-826-ts-rewrite-phase1b-c by @daiki-beppu in #992
- feat(ts-rewrite/core): config 4-bucket 再編成 (#827) by @daiki-beppu in #1001
- refactor(ts-rewrite): DepsMap 実体化 + resolve-deps 一元化 + skills-sync src/ 統一 (#993) by @daiki-beppu in #1002
- feat(ts-rewrite/core): analytics channel service (#828) by @daiki-beppu in #1007
- feat(ts-rewrite/core): analytics video service (#829) by @daiki-beppu in #1008
- feat(ts-rewrite/core): analytics video-daily service (#830) by @daiki-beppu in #1009
- feat(skills-sync): import.meta リソース解決 + npm files 同梱 + .agents/skills symlink (#742) by @daiki-beppu in #1021
- [#837] issue-837-ts-rewrite-phase2-up by @daiki-beppu in #1024
- [#775] issue-775-cli-yt-generate-suno by @daiki-beppu in #1031
- [#833] issue-833-ts-rewrite-phase2-an by @daiki-beppu in #1033
- [#832] issue-832-ts-rewrite-phase2-an by @daiki-beppu in #1032
- [#965] issue-965-feat-skills-lifecycl by @daiki-beppu in #1047
- [#1118] issue-1118-knip-no-stale-pataa by @daiki-beppu in #1122
- [#1116] issue-1116-readreferencefiles by @daiki-beppu in #1121
- [#1113] issue-1113-analytics-herupaawo by @daiki-beppu in #1123
- [#1119] issue-1119-claude-md-ni-ts-rei by @daiki-beppu in #1124
- [#1115] issue-1115-audience-no-3-kueri by @daiki-beppu in #1125
- [#1117] issue-1117-image-saabisunoooke by @daiki-beppu in #1127
- [#1114] issue-1114-video-daily-nohaado by @daiki-beppu in #1128
- [#1130] issue-1130-google-auth-library-1 by @daiki-beppu in #1134
- Revert "[#1130] issue-1130-google-auth-library-1 (#1134)" by @daiki-beppu in #1135
- [#1108] issue-1108-refactor-error-clas by @daiki-beppu in #1133
- [#1120] issue-1120-normalizepublishat by @daiki-beppu in #1129
- [#1111] issue-1111-refactor-config-loa by @daiki-beppu in #1132
- [#1109] issue-1109-refactor-service-bo by @daiki-beppu in #1136
- [#1112] issue-1112-refactor-metadata-b by @daiki-beppu in #1138
- [#1110] issue-1110-refactor-analytics by @daiki-beppu in #1137
- [#1110] refactor: Analytics Query の共通 executor + column ユーティリティを抽出する by @daiki-beppu in #1153
- [#1139] issue-1139-fix-oauth-service-i by @daiki-beppu in #1154
- [#1112] issue-1112-refactor-metadata-b by @daiki-beppu in #1142
- [#1107] issue-1107-fix-cli-smoke-test by @daiki-beppu in #1141
- [#1156] issue-1156-refactor-ts-rewrite by @daiki-beppu in #1160
- [#1159] issue-1159-suno-helper-pureiri by @daiki-beppu in #1185
- fix(core): packages/core から yaml 依存を排除し ADR-0009 乖離を解消 (#1415) by @daiki-beppu in #1425
- feat: ObservedClip に duration と feed v3 定数を追加 (#1258) by @daiki-beppu in #1378
- feat(suno-helper): duration_filter の PromptResponse 型を追加 by @daiki-beppu in #1380
- chore(ci): issue 粒度 lint からタイトル文字数チェックを削除 by @daiki-beppu in #1457
- [codex] PatternListにentry選択チェックボックスを追加 by @daiki-beppu in #1379
- refactor(suno-helper): サーバー側 POST /suno/playlists を撤去 (#1261) by @daiki-beppu in #1381
- feat: yield guard の純粋判定ロジックを追加する by @daiki-beppu in #1387
- refactor!: channel-new に既存チャンネル取り込みモードを統合し channel-import を削除 (#1460) by @daiki-beppu in #1463
- refactor: Playlist Capture を撤去する by @daiki-beppu in #1383
- feat: fetch-bridge を feed v3 POST パーサーに対応 (#1263) by @daiki-beppu in #1384
- [#1143] feat: duration チェック結果 + リトライ状況のログ表示 by @daiki-beppu in #1388
- feat: clip-trackerにduration記録を追加 (#1264) by @daiki-beppu in #1385
- fix(doctor): video_analysis readiness から live 配信を除外し次点 VOD を繰り上げ (#1462) by @daiki-beppu in #1465
- docs: TS 移行手順のグリル決定を反映 — cutover 2026-09 / フルスコープ確定 (#727) by @daiki-beppu in #1478
- feat: suno bridgeのfeed観測をv3 POSTへ移行 by @daiki-beppu in #1389
- fix(hooks): ignorePatterns 対象のみの commit で pre-commit (oxlint/oxfmt) が落ちる問題を修正 (#1452) by @daiki-beppu in #1454
- fix(suno-lyric): 曲間で Intro/Pre-Chorus/Bridge/Outro が重複するのを防ぐセルフチェックを追加 (#1445) by @daiki-beppu in #1450
- docs: consolidate agent guidance into dedicated docs/ files by @daiki-beppu in #1500
- docs(takt): usage ログの記録先が worktree 側になる点と集計・読み方の注意を追記 by @daiki-beppu in #1503
- [codex] チェック状態からindices実行へ切り替え by @daiki-beppu in #1390
- feat(takt): lite workflow に提出前セルフ監査(pre-review-checklist)を組み込む (#1508) by @daiki-beppu in #1509
- docs(skill-design): Sonnet-safe スキル記述規約を制定 (#1512) by @daiki-beppu in #1529
- docs(channel-new): ペルソナ生成前に TTP 対象の中間ゲートを追加 (#1517) by @daiki-beppu in #1533
- docs(analytics-report): CTR 値の解釈記述をコード実態(百分率 float)に修正 by @daiki-beppu in #1536
- feat(skills): comments-reply / pinned-comment に apply 前の承認ゲートを追加 by @daiki-beppu in #1537
- fix(skills): 兄弟スキル間の frontmatter description 矛盾・キーワード衝突を解消 by @daiki-beppu in #1538
- fix(live-clean): 削除承認を明示2択+取消不可警告の形式に固定 by @daiki-beppu in #1541
- fix(skills): stale/freshness 判定ロジックを freshness-rules.md へ単一ソース化 by @daiki-beppu in #1546
- [#1510] issue-1510-rebyuu-no-pataanwo by @daiki-beppu in #1525
- fix(suno): モード判定を4段の決定木に置き換え by @daiki-beppu in #1543
- fix(setup): project ID truncate 手順の曖昧さを解消 (#1523) by @daiki-beppu in #1545
- docs(postmortem): 閾値「文脈調整可」に調整ルーブリックを追加 by @daiki-beppu in #1542
- docs(thumbnail): 外部リポジトリ参照をオペレーター向け注記に隔離 by @daiki-beppu in #1544
- fix(wf-next): suno_playlist_url 記録済みならURL再入力を省略して自動再利用 (#1539) by @daiki-beppu in #1547
- fix(masterup): 部分ダウンロード検知の入口チェックを追加 (#1521) by @daiki-beppu in #1549
- fix(videoup): particles/bokeh エフェクトが緑一色・黒一色になる問題を修正 by @catnaplabo in #1507
- feat(wf-next): raw master を final として扱う skip_manual_mastering を追加 (#1449) by @daiki-beppu in #1451
- chore(distrokid-helper): manifest/package shell を suno-helper 基準に揃える (#1359) by @daiki-beppu in #1444
- docs(skills): 工程チェーンの前提条件ガードを4箇所に追加 by @daiki-beppu in #1551
- fix(suno-helper): Suno 新 UI の Lexical 化した Lyrics 欄に対応する by @mhs2sowarabeuta-lang in #1506
- feat(suno): entry ごとの Style 自動バリエーション機構を追加 (#1456) by @daiki-beppu in #1458
- feat(thumbnail): サムネイル文字フォントの決定的合成経路 yt-thumbnail-text を追加 (#1332) by @daiki-beppu in #1453
- feat(video-description): yt-title-duplicate-check に 100 codepoint 前倒しチェックを追加 by @mhs2sowarabeuta-lang in #1531
- feat(cli): 下流リポの automation 追従を自動化する yt-automation-update CLI を追加 (#1473) by @daiki-beppu in #1482
- docs(plans): 第 2 回監査(スキル全般 Sonnet-safe 化)の記録を追加 by @daiki-beppu in #1555
- [#1552] issue-1552-worktree-demo-lefth by @daiki-beppu in #1559
- refactor(distrokid-helper): useDistrokidRunner を導入して popup を薄くする (#1361) by @daiki-beppu in #1446
- feat(distrokid-helper): 書き込み境界を background + serve token に揃える (#1360) by @daiki-beppu in #1447
- feat(thumbnail): 1枚生成候補の自動確定を標準化する yt-thumbnail-auto-select を追加 (#1370) by @daiki-beppu in #1455
- refactor(skills): channel-new に再生成・設定 push モードを統合し channel-setup を削除 (#1461) by @daiki-beppu in #1464
- fix(upload): 単一言語チャンネルで scene_phrases の populate と preflight の矛盾を解消 (#1470) by @daiki-beppu in #1480
- fix(upload): --plan の公開設定表示を実効 privacy_status に修正 (#1472) by @daiki-beppu in #1483
- feat(video-analyze): 全尺解析を冒頭クリップ窓(既定 900 秒・設定可)に絞る (#1495) by @daiki-beppu in #1497
- feat(collection): 骨格検証 CLI yt-collection-preflight を追加し初期化漏れを fail-loud 化 (#1494) by @daiki-beppu in #1498
- feat(masterup): playlist × suno-prompts.json 突合ゲート yt-suno-verify-playlist を追加 by @mhs2sowarabeuta-lang in #1530
- feat(video-description): generate_timestamps に loops パラメータを追加し全ループ分チャプターを機械展開 by @mhs2sowarabeuta-lang in #1532
- fix(skills): suno/lyria/videoupのworkflow-state.json旧スキーマ残骸を修正 by @daiki-beppu in #1553
- fix(masterup): workflow-state.json 旧スキーマ表記を現行 v2 に修正 by @daiki-beppu in #1554
- fix(masterup): workflow-state.json v1スキーマ残存を v2 に修正 by @daiki-beppu in #1556
- [#1526] issue-1526-masterup-ga-min-son by @daiki-beppu in #1557
- [#1550] issue-1550-feedback-yt-doctor by @daiki-beppu in #1558
- feat(ts-rewrite): generate-master を TS 移植 (#772) by @daiki-beppu in #1479
- fix(suno-helper): 形式選択モーダルclose待ちを延長する by @daiki-beppu in #1441
- feat: OKクリップのみプレイリスト追加する (#1269) by @daiki-beppu in #1391
- [#1143] feat: content.ts に yield guard 組込み + 自動再生成 by @daiki-beppu in #1392
- refactor(suno-helper): 旧playlist captureを撤去する (#1301) by @daiki-beppu in #1393
- feat: helper拡張の接続先をチャンネル別selector化 (#1352) by @daiki-beppu in #1394
- [#1484] issue-1484-suno-suno-lyric-no by @daiki-beppu in #1505
- fix(config): localizations title_template をアップローダー許可プレースホルダで生成時検証 (#1471) by @daiki-beppu in #1481
- fix(suno-helper): 全entry投入済みの再開バナーを非表示にする by @daiki-beppu in #1442
- feat(ts-rewrite): Python → TypeScript(bun) AI-first big-bang 移行 [umbrella PR for #727] by @daiki-beppu in #791
- chore(release): v5.5.16 by @daiki-beppu in #1570
New Contributors
- @catnaplabo made their first contribution in #1507
- @mhs2sowarabeuta-lang made their first contribution in #1506
Full Changelog: v5.5.15...v5.5.16