{"counts":{"total":931,"done":931,"partial":0,"planned":0},"categories":["記事生成・AIライティング","キーワード・SEOリサーチ","コンテンツ最適化・オンページSEO","マルチ配信エンジン","プラットフォーム連携","重複コンテンツ・canonical戦略","CTA・コンバージョン導線","LINE公式アカウント連携","SNS運用","スケジューリング・自動化","画像・メディア","内部リンク・サイト構造","テクニカルSEO","計測・アナリティクス","順位計測・競合分析","レポーティング","クライアント管理・マルチテナント","ワークフロー・承認","API・拡張・連携","セキュリティ・権限","課金・プラン","運用・信頼性","ローカルSEO・MEO","AI検索最適化（AIO / LLMO）","制作指示書・編集ブリーフ","コンテンツ棚卸し・リライト判断","用語集・エンティティ","一括運用","サイト内検索・追加導線","記事エディタ・版管理","コンソールの書き込み経路","製品サイトの説明責任","既存記事の取り込み","自社メディアの運用実績","共有されたときの見え方","正規URLの食い違い検査","ブランド表示","狭い画面での表示","お問い合わせ","ログインとアカウント","管理画面","クライアント向けアシスタント","かんたん投稿（クライアント向け）","データの永続性","クライアントのボット","クライアントを迎える","招待","繋ぎ目を検証する","配信先の検証","データを失わない","作ったものに手が届く","言葉を揃える","かんたん投稿が本当に出す","ブラウザで確かめる"],"features":[{"id":"SB-01-001","category":"記事生成・AIライティング","name":"共通記事JSONの受け取り","detail":"title/body_markdown/tags/cta を持つ1つのJSONを配信の唯一の入力にする","status":"done","status_label":"実装済み"},{"id":"SB-01-002","category":"記事生成・AIライティング","name":"Markdownフロントマター取り込み","detail":"--- で囲んだYAMLヘッダ付き .md を記事オブジェクトに変換する","status":"done","status_label":"実装済み"},{"id":"SB-01-003","category":"記事生成・AIライティング","name":"記事スキーマ検証","detail":"pydanticでslug・必須項目・型を検証し、落ちた理由を日本語で返す","status":"done","status_label":"実装済み"},{"id":"SB-01-004","category":"記事生成・AIライティング","name":"slug正規化","detail":"空白や / ? # & を含むslugを弾き、小文字に揃える","status":"done","status_label":"実装済み"},{"id":"SB-01-005","category":"記事生成・AIライティング","name":"抜粋(excerpt)の自動生成","detail":"excerpt未指定時に本文先頭200字から要約テキストを組み立てる","status":"done","status_label":"実装済み"},{"id":"SB-01-006","category":"記事生成・AIライティング","name":"媒体別の別原稿(variants)","detail":"Qiita/はてな等に、角度を変えた原稿を個別に持たせる","status":"done","status_label":"実装済み"},{"id":"SB-01-007","category":"記事生成・AIライティング","name":"SNS短文の自動生成","detail":"本文とタグからプラットフォーム別の文字数に収めた投稿文を作る","status":"done","status_label":"実装済み"},{"id":"SB-01-008","category":"記事生成・AIライティング","name":"見出し抽出","detail":"## 見出しを抜き出してteaserの「この記事で分かること」に使う","status":"done","status_label":"実装済み"},{"id":"SB-01-009","category":"記事生成・AIライティング","name":"Markdown→HTML変換","detail":"extra/sane_lists/toc/nl2br 拡張つきで媒体のHTML欄へ流し込む","status":"done","status_label":"実装済み"},{"id":"SB-01-010","category":"記事生成・AIライティング","name":"Markdown→プレーンテキスト","detail":"リンク・記法を落としてSNS/LINE用の素のテキストにする","status":"done","status_label":"実装済み"},{"id":"SB-01-011","category":"記事生成・AIライティング","name":"記事ライブラリ保存","detail":"投入した記事をJSONでサーバに保存し、一覧・再配信の対象にする","status":"done","status_label":"実装済み"},{"id":"SB-01-012","category":"記事生成・AIライティング","name":"記事プレビュー","detail":"配信前にCTA差し込み後の完成形をブラウザで確認する","status":"done","status_label":"実装済み"},{"id":"SB-01-013","category":"記事生成・AIライティング","name":"トーン&マナー(brand_voice)","detail":"クライアントごとの文体指示を設定に保持し生成プロンプトに渡す","status":"done","status_label":"実装済み"},{"id":"SB-01-014","category":"記事生成・AIライティング","name":"AI記事生成（下書き）","detail":"キーワードと意図から本文Markdownを生成する","status":"done","status_label":"実装済み"},{"id":"SB-01-015","category":"記事生成・AIライティング","name":"記事構成案(アウトライン)生成","detail":"検索意図から H2/H3 の骨子だけを先に出して人が承認する","status":"done","status_label":"実装済み"},{"id":"SB-01-016","category":"記事生成・AIライティング","name":"タイトル案の複数生成","detail":"同一記事に対しCTR狙いのタイトルを5案出して選ばせる","status":"done","status_label":"実装済み"},{"id":"SB-01-017","category":"記事生成・AIライティング","name":"メタディスクリプション生成","detail":"120字前後で本文要約を作り、文字数超過を警告する","status":"done","status_label":"実装済み"},{"id":"SB-01-018","category":"記事生成・AIライティング","name":"リライト（既存記事の改稿）","detail":"順位が落ちた既存記事を取り込み、差分だけ書き換える","status":"done","status_label":"実装済み"},{"id":"SB-01-019","category":"記事生成・AIライティング","name":"記事の要約長の調整","detail":"短縮/拡張の指示で本文の分量を段階的に変える","status":"done","status_label":"実装済み"},{"id":"SB-01-020","category":"記事生成・AIライティング","name":"FAQセクション自動生成","detail":"本文から想定質問を抽出しFAQブロックとFAQPage構造化データを作る","status":"done","status_label":"実装済み"},{"id":"SB-01-021","category":"記事生成・AIライティング","name":"箇条書き→表への変換","detail":"比較や料金の羅列を自動でテーブルに整形する","status":"done","status_label":"実装済み"},{"id":"SB-01-022","category":"記事生成・AIライティング","name":"専門用語の平易化","detail":"業界用語に読み仮名や短い注釈を添える","status":"done","status_label":"実装済み"},{"id":"SB-01-023","category":"記事生成・AIライティング","name":"一次情報の引用チェック","detail":"本文中の数値・統計に出典URLが付いているか検査する","status":"done","status_label":"実装済み"},{"id":"SB-01-024","category":"記事生成・AIライティング","name":"ハルシネーション検査","detail":"固有名詞・数値を外部ソースと突き合わせて確度を出す","status":"done","status_label":"実装済み"},{"id":"SB-01-025","category":"記事生成・AIライティング","name":"重複表現の検出","detail":"同じ言い回しの繰り返しを指摘して推敲を促す","status":"done","status_label":"実装済み"},{"id":"SB-01-026","category":"記事生成・AIライティング","name":"誤字脱字・表記ゆれ検査","detail":"全角半角・送り仮名・社名表記のゆれを一覧化する","status":"done","status_label":"実装済み"},{"id":"SB-01-027","category":"記事生成・AIライティング","name":"禁止語・NGワード辞書","detail":"クライアント別に使ってはいけない語を登録し公開前に止める","status":"done","status_label":"実装済み"},{"id":"SB-01-028","category":"記事生成・AIライティング","name":"薬機法・景表法チェック","detail":"医療/美容/健康の断定表現を検出して代替表現を提案する","status":"done","status_label":"実装済み"},{"id":"SB-01-029","category":"記事生成・AIライティング","name":"読みやすさスコア","detail":"一文の長さ・漢字比率・受動態率から読みやすさを採点する","status":"done","status_label":"実装済み"},{"id":"SB-01-030","category":"記事生成・AIライティング","name":"記事テンプレート","detail":"howto/比較/事例/用語解説など意図別の雛形から書き始める","status":"done","status_label":"実装済み"},{"id":"SB-01-031","category":"記事生成・AIライティング","name":"多言語翻訳","detail":"日本語記事を英語ほかへ翻訳し hreflang 付きで別URLに出す","status":"done","status_label":"実装済み"},{"id":"SB-01-032","category":"記事生成・AIライティング","name":"画像alt文の自動生成","detail":"本文の文脈から各画像の代替テキストを作る","status":"done","status_label":"実装済み"},{"id":"SB-01-033","category":"記事生成・AIライティング","name":"記事のバージョン履歴","detail":"改稿のたびに版を残し、いつでも差分を見て戻せる","status":"done","status_label":"実装済み"},{"id":"SB-01-034","category":"記事生成・AIライティング","name":"共同編集ロック","detail":"同じ記事を2人が同時に編集して上書きするのを防ぐ","status":"done","status_label":"実装済み"},{"id":"SB-01-035","category":"記事生成・AIライティング","name":"AI生成物の開示設定","detail":"AI利用の明示文をクライアント方針に応じて本文末に付ける","status":"done","status_label":"実装済み"},{"id":"SB-02-001","category":"キーワード・SEOリサーチ","name":"トピック台帳","detail":"記事1本ごとに topic_id を持たせ、狙ったテーマと紐付ける","status":"done","status_label":"実装済み"},{"id":"SB-02-002","category":"キーワード・SEOリサーチ","name":"キーワード項目の保持","detail":"記事に主軸キーワードと検索意図(intent)を記録する","status":"done","status_label":"実装済み"},{"id":"SB-02-003","category":"キーワード・SEOリサーチ","name":"検索意図の分類","detail":"howto / 比較 / 指名 / 情報収集 を記事メタとして持つ","status":"done","status_label":"実装済み"},{"id":"SB-02-004","category":"キーワード・SEOリサーチ","name":"カテゴリ・タグ管理","detail":"記事のカテゴリとタグを配信先ごとの分類欄へ引き渡す","status":"done","status_label":"実装済み"},{"id":"SB-02-005","category":"キーワード・SEOリサーチ","name":"キーワード検索ボリューム取得","detail":"外部APIから月間検索数と競合性を取り込む","status":"done","status_label":"実装済み"},{"id":"SB-02-006","category":"キーワード・SEOリサーチ","name":"サジェスト収集","detail":"検索サジェスト・関連検索を階層で吸い上げる","status":"done","status_label":"実装済み"},{"id":"SB-02-007","category":"キーワード・SEOリサーチ","name":"共起語・関連語抽出","detail":"上位表示ページに共通して出る語を抽出し不足語を示す","status":"done","status_label":"実装済み"},{"id":"SB-02-008","category":"キーワード・SEOリサーチ","name":"キーワードクラスタリング","detail":"検索結果の重なりで語をまとめ、1記事の守備範囲を決める","status":"done","status_label":"実装済み"},{"id":"SB-02-009","category":"キーワード・SEOリサーチ","name":"カニバリ検出","detail":"同一クラスタを狙った既存記事の食い合いを警告する","status":"done","status_label":"実装済み"},{"id":"SB-02-010","category":"キーワード・SEOリサーチ","name":"SERP構成の分析","detail":"上位10件の見出し構成・文字数・形式を集計する","status":"done","status_label":"実装済み"},{"id":"SB-02-011","category":"キーワード・SEOリサーチ","name":"強調スニペット狙いの構成提案","detail":"定義文・手順・表のどれで抜かれているかを見て型を合わせる","status":"done","status_label":"実装済み"},{"id":"SB-02-012","category":"キーワード・SEOリサーチ","name":"People Also Ask 収集","detail":"関連質問を集めてFAQ候補にする","status":"done","status_label":"実装済み"},{"id":"SB-02-013","category":"キーワード・SEOリサーチ","name":"難易度スコア","detail":"被リンク数・ドメイン強度から現実的に勝てるかを採点する","status":"done","status_label":"実装済み"},{"id":"SB-02-014","category":"キーワード・SEOリサーチ","name":"ロングテール自動発掘","detail":"サーチコンソールの表示のみキーワードから記事候補を出す","status":"done","status_label":"実装済み"},{"id":"SB-02-015","category":"キーワード・SEOリサーチ","name":"季節性・トレンド検知","detail":"検索需要の季節変動を見て公開時期を提案する","status":"done","status_label":"実装済み"},{"id":"SB-02-016","category":"キーワード・SEOリサーチ","name":"競合ドメインのキーワードギャップ","detail":"競合が獲れて自社が獲れていない語を差分で出す","status":"done","status_label":"実装済み"},{"id":"SB-02-017","category":"キーワード・SEOリサーチ","name":"自社サイトの網羅率","detail":"クラスタに対する記事カバー率をダッシュボードに出す","status":"done","status_label":"実装済み"},{"id":"SB-02-018","category":"キーワード・SEOリサーチ","name":"キーワード優先度づけ","detail":"ボリューム×難易度×自社の収益性で並べ替える","status":"done","status_label":"実装済み"},{"id":"SB-02-019","category":"キーワード・SEOリサーチ","name":"キーワード台帳の共有","detail":"クライアントと同じ台帳を見ながら次の記事を決める","status":"done","status_label":"実装済み"},{"id":"SB-02-020","category":"キーワード・SEOリサーチ","name":"記事ネタの重複防止","detail":"過去に書いたテーマと近すぎる案を投入時に警告する","status":"done","status_label":"実装済み"},{"id":"SB-02-021","category":"キーワード・SEOリサーチ","name":"ローカル検索語の派生","detail":"地域名×サービス名の掛け合わせを機械的に展開する","status":"done","status_label":"実装済み"},{"id":"SB-02-022","category":"キーワード・SEOリサーチ","name":"指名検索の追跡","detail":"社名・商品名での検索の伸びを別枠で計測する","status":"done","status_label":"実装済み"},{"id":"SB-02-023","category":"キーワード・SEOリサーチ","name":"競合の新規記事監視","detail":"競合サイトの新着記事をRSS/クロールで追い、通知する","status":"done","status_label":"実装済み"},{"id":"SB-02-024","category":"キーワード・SEOリサーチ","name":"検索意図の変化検知","detail":"同じ語のSERPの構成が変わったら既存記事の改稿を促す","status":"done","status_label":"実装済み"},{"id":"SB-02-025","category":"キーワード・SEOリサーチ","name":"キーワードのインポート/エクスポート","detail":"CSVで台帳をやり取りする","status":"done","status_label":"実装済み"},{"id":"SB-02-026","category":"キーワード・SEOリサーチ","name":"記事化キューへの送り込み","detail":"選んだキーワードを制作キューに積み、担当を割り当てる","status":"done","status_label":"実装済み"},{"id":"SB-02-027","category":"キーワード・SEOリサーチ","name":"検索需要のない語の除外","detail":"ボリューム0・意味の薄い語を自動で候補から外す","status":"done","status_label":"実装済み"},{"id":"SB-02-028","category":"キーワード・SEOリサーチ","name":"業種別のキーワード雛形","detail":"士業・飲食・住宅など業種ごとの定番語セットを持つ","status":"done","status_label":"実装済み"},{"id":"SB-02-029","category":"キーワード・SEOリサーチ","name":"問い合わせ内容からのネタ出し","detail":"実際の問い合わせログを記事テーマ候補に変換する","status":"done","status_label":"実装済み"},{"id":"SB-02-030","category":"キーワード・SEOリサーチ","name":"キーワード×CVの紐付け","detail":"どの語から来た読者が問い合わせたかを結び付ける","status":"done","status_label":"実装済み"},{"id":"SB-03-001","category":"コンテンツ最適化・オンページSEO","name":"titleタグの出力","detail":"記事タイトルを各媒体のタイトル欄と自社ページの <title> に反映する","status":"done","status_label":"実装済み"},{"id":"SB-03-002","category":"コンテンツ最適化・オンページSEO","name":"メタディスクリプション反映","detail":"記事メタの meta_description を自社ページと媒体へ渡す","status":"done","status_label":"実装済み"},{"id":"SB-03-003","category":"コンテンツ最適化・オンページSEO","name":"見出し階層の保持","detail":"Markdownの # / ## / ### をHTMLの h1-h3 に正しく変換する","status":"done","status_label":"実装済み"},{"id":"SB-03-004","category":"コンテンツ最適化・オンページSEO","name":"パンくずリスト","detail":"ブログ配下ページに階層リンクを表示する","status":"done","status_label":"実装済み"},{"id":"SB-03-005","category":"コンテンツ最適化・オンページSEO","name":"記事URLのslug指定","detail":"記事ごとに固定のURL文字列を持たせる","status":"done","status_label":"実装済み"},{"id":"SB-03-006","category":"コンテンツ最適化・オンページSEO","name":"OGP/Twitterカード","detail":"記事ページに og:title/description/image と summary_large_image を出す","status":"done","status_label":"実装済み"},{"id":"SB-03-007","category":"コンテンツ最適化・オンページSEO","name":"canonicalタグ出力","detail":"自社記事ページに自己参照canonicalを入れる","status":"done","status_label":"実装済み"},{"id":"SB-03-008","category":"コンテンツ最適化・オンページSEO","name":"Article構造化データ","detail":"記事ページに JSON-LD の Article を出力する","status":"done","status_label":"実装済み"},{"id":"SB-03-009","category":"コンテンツ最適化・オンページSEO","name":"目次(TOC)の自動生成","detail":"本文の見出しから記事内リンクの目次を作る","status":"done","status_label":"実装済み"},{"id":"SB-03-010","category":"コンテンツ最適化・オンページSEO","name":"読了時間の表示","detail":"本文の文字数から目安の読了分数を出す","status":"done","status_label":"実装済み"},{"id":"SB-03-011","category":"コンテンツ最適化・オンページSEO","name":"記事内CTAの位置制御","detail":"top/middle/bottom を指定してCTAブロックを差し込む","status":"done","status_label":"実装済み"},{"id":"SB-03-012","category":"コンテンツ最適化・オンページSEO","name":"外部リンクのrel制御","detail":"CTA等の外部リンクに rel=nofollow noopener を付ける","status":"done","status_label":"実装済み"},{"id":"SB-03-013","category":"コンテンツ最適化・オンページSEO","name":"画像の遅延読み込み","detail":"本文画像に loading=lazy を付けて初期表示を軽くする","status":"done","status_label":"実装済み"},{"id":"SB-03-014","category":"コンテンツ最適化・オンページSEO","name":"モバイル最適化","detail":"記事ページを1カラム・可読な行長で表示する","status":"done","status_label":"実装済み"},{"id":"SB-03-015","category":"コンテンツ最適化・オンページSEO","name":"タイトル文字数の警告","detail":"検索結果で切れる長さを超えたら投入時に警告する","status":"done","status_label":"実装済み"},{"id":"SB-03-016","category":"コンテンツ最適化・オンページSEO","name":"キーワード出現率の診断","detail":"主軸キーワードの過不足を本文位置ごとに見る","status":"done","status_label":"実装済み"},{"id":"SB-03-017","category":"コンテンツ最適化・オンページSEO","name":"見出しへのキーワード配置チェック","detail":"H2にキーワードが入っているかを検査する","status":"done","status_label":"実装済み"},{"id":"SB-03-018","category":"コンテンツ最適化・オンページSEO","name":"本文の網羅性スコア","detail":"上位記事の共通トピックに対する充足率を出す","status":"done","status_label":"実装済み"},{"id":"SB-03-019","category":"コンテンツ最適化・オンページSEO","name":"画像のalt未設定検出","detail":"alt欠落の画像を記事単位で一覧化する","status":"done","status_label":"実装済み"},{"id":"SB-03-020","category":"コンテンツ最適化・オンページSEO","name":"HowTo構造化データ","detail":"手順記事に HowTo スキーマを出力する","status":"done","status_label":"実装済み"},{"id":"SB-03-021","category":"コンテンツ最適化・オンページSEO","name":"FAQPage構造化データ","detail":"FAQブロックから FAQPage を出力する","status":"done","status_label":"実装済み"},{"id":"SB-03-022","category":"コンテンツ最適化・オンページSEO","name":"BreadcrumbList構造化データ","detail":"パンくずをJSON-LDでも出す","status":"done","status_label":"実装済み"},{"id":"SB-03-023","category":"コンテンツ最適化・オンページSEO","name":"著者情報(E-E-A-T)","detail":"執筆者プロフィール・監修者・経歴を記事に紐付けて表示する","status":"done","status_label":"実装済み"},{"id":"SB-03-024","category":"コンテンツ最適化・オンページSEO","name":"更新日の明示と更新履歴","detail":"初出日と最終更新日を出し、改稿内容を残す","status":"done","status_label":"実装済み"},{"id":"SB-03-025","category":"コンテンツ最適化・オンページSEO","name":"引用・出典セクション","detail":"参考文献を定型のブロックで出し外部リンクを整える","status":"done","status_label":"実装済み"},{"id":"SB-03-026","category":"コンテンツ最適化・オンページSEO","name":"関連記事の自動表示","detail":"同カテゴリ・同クラスタの記事を記事末に出す","status":"done","status_label":"実装済み"},{"id":"SB-03-027","category":"コンテンツ最適化・オンページSEO","name":"記事内アンカーリンク","detail":"長文記事の各セクションへ直接飛べるリンクIDを振る","status":"done","status_label":"実装済み"},{"id":"SB-03-028","category":"コンテンツ最適化・オンページSEO","name":"読者向け要約ボックス","detail":"冒頭に3行まとめを置いて離脱を減らす","status":"done","status_label":"実装済み"},{"id":"SB-03-029","category":"コンテンツ最適化・オンページSEO","name":"コンテンツ鮮度スコア","detail":"古い記事を検出し改稿優先度を付ける","status":"done","status_label":"実装済み"},{"id":"SB-03-030","category":"コンテンツ最適化・オンページSEO","name":"A/Bタイトルテスト","detail":"同一記事に2つのタイトルを出し分けCTRを比較する","status":"done","status_label":"実装済み"},{"id":"SB-04-001","category":"マルチ配信エンジン","name":"1記事→多媒体の一括配信","detail":"1つの記事JSONを複数の配信先へ順番に流す","status":"done","status_label":"実装済み"},{"id":"SB-04-002","category":"マルチ配信エンジン","name":"役割(role)による配信順制御","detail":"primary→syndicate→variant/manual→social→line の順で実行する","status":"done","status_label":"実装済み"},{"id":"SB-04-003","category":"マルチ配信エンジン","name":"primary URLの引き回し","detail":"自社ドメインの公開URLを後続媒体のcanonical/リンクに使う","status":"done","status_label":"実装済み"},{"id":"SB-04-004","category":"マルチ配信エンジン","name":"配信先の個別有効/無効","detail":"targetごとに enabled を切り替えて一時停止する","status":"done","status_label":"実装済み"},{"id":"SB-04-005","category":"マルチ配信エンジン","name":"配信先の明示指定","detail":"記事側で targets を指定し、その回だけ配信先を変える","status":"done","status_label":"実装済み"},{"id":"SB-04-006","category":"マルチ配信エンジン","name":"既定配信先(default_targets)","detail":"クライアントごとの標準セットを設定に持つ","status":"done","status_label":"実装済み"},{"id":"SB-04-007","category":"マルチ配信エンジン","name":"ドライラン","detail":"外部に一切送らずに、送る予定の中身と宛先だけを返す","status":"done","status_label":"実装済み"},{"id":"SB-04-008","category":"マルチ配信エンジン","name":"媒体ごとの本文形式変換","detail":"markdown/html/text を配信先の仕様に合わせて出し分ける","status":"done","status_label":"実装済み"},{"id":"SB-04-009","category":"マルチ配信エンジン","name":"リトライとバックオフ","detail":"408/425/429/5xx と通信エラーを指数バックオフで再試行する","status":"done","status_label":"実装済み"},{"id":"SB-04-010","category":"マルチ配信エンジン","name":"1媒体の失敗で全体を止めない","detail":"例外を配信先単位で閉じ込め、他の媒体は最後まで流す","status":"done","status_label":"実装済み"},{"id":"SB-04-011","category":"マルチ配信エンジン","name":"配信結果の記録","detail":"媒体ごとの status/URL/外部ID/メッセージをジョブに残す","status":"done","status_label":"実装済み"},{"id":"SB-04-012","category":"マルチ配信エンジン","name":"ジョブの永続化","detail":"ジョブJSONをディスクに保存し、あとから参照できる","status":"done","status_label":"実装済み"},{"id":"SB-04-013","category":"マルチ配信エンジン","name":"ジョブ結果の集計","detail":"published/failed/skipped などの件数サマリを返す","status":"done","status_label":"実装済み"},{"id":"SB-04-014","category":"マルチ配信エンジン","name":"下書き投稿","detail":"draft=true で対応媒体に下書きとして置く","status":"done","status_label":"実装済み"},{"id":"SB-04-015","category":"マルチ配信エンジン","name":"予約投稿","detail":"publish_at を対応媒体（WordPress/はてな/Ghost/Blogger/Zenn）へ渡す","status":"done","status_label":"実装済み"},{"id":"SB-04-016","category":"マルチ配信エンジン","name":"手動投稿パッケージ生成","detail":"note/Ameba用に貼り付け用の本文一式をファイル出力する","status":"done","status_label":"実装済み"},{"id":"SB-04-017","category":"マルチ配信エンジン","name":"手動投稿結果の後追い記録","detail":"人が投稿したURLをAPIで書き戻し、ジョブを完成させる","status":"done","status_label":"実装済み"},{"id":"SB-04-018","category":"マルチ配信エンジン","name":"認証情報の不足検出","detail":"必要な資格情報が欠けている配信先を実行前に失敗として明示する","status":"done","status_label":"実装済み"},{"id":"SB-04-019","category":"マルチ配信エンジン","name":"未知プラットフォームの拒否","detail":"カタログにない platform を設定読込時に弾く","status":"done","status_label":"実装済み"},{"id":"SB-04-020","category":"マルチ配信エンジン","name":"配信ジョブ一覧の閲覧","detail":"コンソールから過去ジョブを新しい順に見る","status":"done","status_label":"実装済み"},{"id":"SB-04-021","category":"マルチ配信エンジン","name":"配信の再実行(失敗分のみ)","detail":"失敗した配信先だけを選んで投げ直す","status":"done","status_label":"実装済み"},{"id":"SB-04-022","category":"マルチ配信エンジン","name":"配信キューと同時実行制御","detail":"大量記事を並列度を絞って安全に流す","status":"done","status_label":"実装済み"},{"id":"SB-04-023","category":"マルチ配信エンジン","name":"レート制限の媒体別管理","detail":"媒体ごとの上限に合わせて送信間隔を自動調整する","status":"done","status_label":"実装済み"},{"id":"SB-04-024","category":"マルチ配信エンジン","name":"配信の一時停止/再開","detail":"障害時に全体をポーズして復旧後に再開する","status":"done","status_label":"実装済み"},{"id":"SB-04-025","category":"マルチ配信エンジン","name":"優先度つきキュー","detail":"緊急の記事を先に流す","status":"done","status_label":"実装済み"},{"id":"SB-04-026","category":"マルチ配信エンジン","name":"配信前の最終承認ゲート","detail":"人が承認するまでキューで待たせる","status":"done","status_label":"実装済み"},{"id":"SB-04-027","category":"マルチ配信エンジン","name":"公開の取り消し(撤回)","detail":"配信済み記事を各媒体から下書きへ戻す/削除する","status":"done","status_label":"実装済み"},{"id":"SB-04-028","category":"マルチ配信エンジン","name":"記事の更新配信","detail":"既存記事を上書き更新として再配信する","status":"done","status_label":"実装済み"},{"id":"SB-04-029","category":"マルチ配信エンジン","name":"配信先グループ","detail":"「国内ブログ群」「SNS群」など束ねて指定する","status":"done","status_label":"実装済み"},{"id":"SB-04-030","category":"マルチ配信エンジン","name":"時差を考慮した公開時刻","detail":"媒体ごとに最適な時刻へずらして公開する","status":"done","status_label":"実装済み"},{"id":"SB-04-031","category":"マルチ配信エンジン","name":"配信結果のWebhook通知","detail":"完了・失敗を外部システムへ即時に飛ばす","status":"done","status_label":"実装済み"},{"id":"SB-04-032","category":"マルチ配信エンジン","name":"配信のドライラン差分表示","detail":"前回配信との本文差分を出してから実行する","status":"done","status_label":"実装済み"},{"id":"SB-04-033","category":"マルチ配信エンジン","name":"配信ログの長期保管","detail":"ジョブ履歴を期間指定でエクスポートする","status":"done","status_label":"実装済み"},{"id":"SB-04-034","category":"マルチ配信エンジン","name":"媒体別の成功率モニタ","detail":"直近の成功率が落ちた配信先を検知して知らせる","status":"done","status_label":"実装済み"},{"id":"SB-04-035","category":"マルチ配信エンジン","name":"バルク配信(複数記事)","detail":"CLIのglob指定で複数記事を一括処理する","status":"done","status_label":"実装済み"},{"id":"SB-05-001","category":"プラットフォーム連携","name":"WordPress（セルフホスト）","detail":"REST API + アプリケーションパスワードで自社ブログへ公開","status":"done","status_label":"実装済み"},{"id":"SB-05-002","category":"プラットフォーム連携","name":"WordPress.com","detail":"public-api.wordpress.com へOAuth2 Bearerで公開","status":"done","status_label":"実装済み"},{"id":"SB-05-003","category":"プラットフォーム連携","name":"Ghost","detail":"Admin APIキーからJWTを生成して公開","status":"done","status_label":"実装済み"},{"id":"SB-05-004","category":"プラットフォーム連携","name":"はてなブログ","detail":"AtomPub（Basic認証）で投稿・予約投稿","status":"done","status_label":"実装済み"},{"id":"SB-05-005","category":"プラットフォーム連携","name":"ライブドアブログ","detail":"AtomPubで投稿（下書き非対応の仕様に追従）","status":"done","status_label":"実装済み"},{"id":"SB-05-006","category":"プラットフォーム連携","name":"Qiita","detail":"API v2 で技術記事を投稿","status":"done","status_label":"実装済み"},{"id":"SB-05-007","category":"プラットフォーム連携","name":"Zenn","detail":"GitHub Contents APIで articles/*.md をpush","status":"done","status_label":"実装済み"},{"id":"SB-05-008","category":"プラットフォーム連携","name":"dev.to","detail":"Forem APIで canonical_url つき転載","status":"done","status_label":"実装済み"},{"id":"SB-05-009","category":"プラットフォーム連携","name":"Hashnode","detail":"GraphQL APIで originalArticleURL つき転載","status":"done","status_label":"実装済み"},{"id":"SB-05-010","category":"プラットフォーム連携","name":"Medium","detail":"既存Integration Tokenでの転載に対応","status":"done","status_label":"実装済み"},{"id":"SB-05-011","category":"プラットフォーム連携","name":"Blogger","detail":"API v3（OAuth2）で投稿・予約投稿","status":"done","status_label":"実装済み"},{"id":"SB-05-012","category":"プラットフォーム連携","name":"Notion","detail":"Notion APIでデータベースへページ追加","status":"done","status_label":"実装済み"},{"id":"SB-05-013","category":"プラットフォーム連携","name":"LinkedIn","detail":"Posts APIで記事リンク付き投稿","status":"done","status_label":"実装済み"},{"id":"SB-05-014","category":"プラットフォーム連携","name":"X（旧Twitter）","detail":"API v2 POST /2/tweets で投稿","status":"done","status_label":"実装済み"},{"id":"SB-05-015","category":"プラットフォーム連携","name":"Threads","detail":"コンテナ作成→publishの2段階APIで投稿","status":"done","status_label":"実装済み"},{"id":"SB-05-016","category":"プラットフォーム連携","name":"Facebookページ","detail":"Graph API /{page-id}/feed へ投稿","status":"done","status_label":"実装済み"},{"id":"SB-05-017","category":"プラットフォーム連携","name":"LINE公式アカウント","detail":"Messaging APIで友だちへ配信","status":"done","status_label":"実装済み"},{"id":"SB-05-018","category":"プラットフォーム連携","name":"汎用Webhook","detail":"記事JSONをそのままPOSTし n8n/Make/Zapier に渡す","status":"done","status_label":"実装済み"},{"id":"SB-05-019","category":"プラットフォーム連携","name":"メール投稿","detail":"SMTPで各媒体の投稿用アドレスへ送る","status":"done","status_label":"実装済み"},{"id":"SB-05-020","category":"プラットフォーム連携","name":"note（手動パッケージ）","detail":"公式APIが無いため貼り付け用パッケージを生成する","status":"done","status_label":"実装済み"},{"id":"SB-05-021","category":"プラットフォーム連携","name":"Ameba（手動パッケージ）","detail":"同上。メール投稿設定があればemailアダプタも使える","status":"done","status_label":"実装済み"},{"id":"SB-05-022","category":"プラットフォーム連携","name":"アダプタの動的登録","detail":"@register デコレータ1つで新媒体を追加できる","status":"done","status_label":"実装済み"},{"id":"SB-05-023","category":"プラットフォーム連携","name":"プラットフォーム能力カタログ","detail":"canonical可否・予約可否・本文形式を機械可読に持つ","status":"done","status_label":"実装済み"},{"id":"SB-05-024","category":"プラットフォーム連携","name":"接続テスト","detail":"保存前に資格情報が有効かを各媒体へ問い合わせて確かめる","status":"done","status_label":"実装済み"},{"id":"SB-05-025","category":"プラットフォーム連携","name":"OAuthセルフ接続フロー","detail":"画面から各媒体にログインしてトークンを取得する","status":"done","status_label":"実装済み"},{"id":"SB-05-026","category":"プラットフォーム連携","name":"トークン失効の検知と通知","detail":"期限切れ・失効を検知して再接続を促す","status":"done","status_label":"実装済み"},{"id":"SB-05-027","category":"プラットフォーム連携","name":"トークン自動更新","detail":"refresh_tokenを使って裏で更新する","status":"done","status_label":"実装済み"},{"id":"SB-05-028","category":"プラットフォーム連携","name":"Shopifyブログ連携","detail":"ECサイトのブログへ同時公開する","status":"done","status_label":"実装済み"},{"id":"SB-05-029","category":"プラットフォーム連携","name":"Wix / Squarespace 連携","detail":"サイトビルダー系のブログへ公開する","status":"done","status_label":"実装済み"},{"id":"SB-05-030","category":"プラットフォーム連携","name":"YouTube概要欄・コミュニティ投稿","detail":"動画チャネルへも記事導線を出す","status":"done","status_label":"実装済み"},{"id":"SB-06-001","category":"重複コンテンツ・canonical戦略","name":"canonical対応媒体の判別","detail":"媒体カタログの supports_canonical で転載可否を機械的に判定する","status":"done","status_label":"実装済み"},{"id":"SB-06-002","category":"重複コンテンツ・canonical戦略","name":"自社ドメイン先行公開","detail":"primaryを最初に公開し、そのURLを正規URLとして確定させる","status":"done","status_label":"実装済み"},{"id":"SB-06-003","category":"重複コンテンツ・canonical戦略","name":"同一本文の転載はcanonical対応先のみ","detail":"dev.to/Hashnode/Medium には canonical 付きで全文を出す","status":"done","status_label":"実装済み"},{"id":"SB-06-004","category":"重複コンテンツ・canonical戦略","name":"canonical非対応先はteaser化","detail":"要約＋見出し＋全文リンクに落として重複を避ける","status":"done","status_label":"実装済み"},{"id":"SB-06-005","category":"重複コンテンツ・canonical戦略","name":"別原稿(variant)の優先適用","detail":"variantsがある媒体は全文でなく別原稿を投稿する","status":"done","status_label":"実装済み"},{"id":"SB-06-006","category":"重複コンテンツ・canonical戦略","name":"fallbackポリシー選択","detail":"teaser / skip / full を記事単位で選べる","status":"done","status_label":"実装済み"},{"id":"SB-06-007","category":"重複コンテンツ・canonical戦略","name":"teaserの自動組み立て","detail":"抜粋＋「この記事で分かること」＋全文リンクを機械生成する","status":"done","status_label":"実装済み"},{"id":"SB-06-008","category":"重複コンテンツ・canonical戦略","name":"canonical使用の記録","detail":"どのURLをcanonicalに使ったかを配信結果に残す","status":"done","status_label":"実装済み"},{"id":"SB-06-009","category":"重複コンテンツ・canonical戦略","name":"WordPressのcanonical metaキー指定","detail":"Yoast/RankMath のフィールド名を設定で切り替える","status":"done","status_label":"実装済み"},{"id":"SB-06-010","category":"重複コンテンツ・canonical戦略","name":"自己参照canonical","detail":"自社記事ページに自分自身のcanonicalを出す","status":"done","status_label":"実装済み"},{"id":"SB-06-011","category":"重複コンテンツ・canonical戦略","name":"重複率スコアの算出","detail":"転載先と自社本文の類似度を測って閾値超えを警告する","status":"done","status_label":"実装済み"},{"id":"SB-06-012","category":"重複コンテンツ・canonical戦略","name":"noindex指定の配信","detail":"対応媒体へ noindex を渡して検索対象から外す","status":"done","status_label":"実装済み"},{"id":"SB-06-013","category":"重複コンテンツ・canonical戦略","name":"転載先インデックス状況の確認","detail":"転載側が検索結果に出ていないかを定期確認する","status":"done","status_label":"実装済み"},{"id":"SB-06-014","category":"重複コンテンツ・canonical戦略","name":"自社より転載先が上位のときの警告","detail":"順位が逆転したら通知して対処を促す","status":"done","status_label":"実装済み"},{"id":"SB-06-015","category":"重複コンテンツ・canonical戦略","name":"コピーコンテンツの外部監視","detail":"無断転載サイトを検出して一覧化する","status":"done","status_label":"実装済み"},{"id":"SB-06-016","category":"重複コンテンツ・canonical戦略","name":"転載遅延(ディレイ)設定","detail":"自社公開からN時間空けて転載しインデックス順を守る","status":"done","status_label":"実装済み"},{"id":"SB-06-017","category":"重複コンテンツ・canonical戦略","name":"媒体別の本文長比率制御","detail":"teaserに出す割合を媒体ごとに調整する","status":"done","status_label":"実装済み"},{"id":"SB-06-018","category":"重複コンテンツ・canonical戦略","name":"同一記事の多重投稿防止","detail":"同じ記事を同じ媒体へ二度出さないよう記録で防ぐ","status":"done","status_label":"実装済み"},{"id":"SB-06-019","category":"重複コンテンツ・canonical戦略","name":"引用ブロックの明示","detail":"他サイトからの引用を blockquote + cite で正しく囲む","status":"done","status_label":"実装済み"},{"id":"SB-06-020","category":"重複コンテンツ・canonical戦略","name":"AI生成比率の申告管理","detail":"媒体規約に合わせてAI生成の割合を記録・開示する","status":"done","status_label":"実装済み"},{"id":"SB-07-001","category":"CTA・コンバージョン導線","name":"CTAブロックの本文差し込み","detail":"冒頭・中盤・末尾の指定位置にCTAを自動挿入する","status":"done","status_label":"実装済み"},{"id":"SB-07-002","category":"CTA・コンバージョン導線","name":"中盤CTAの賢い挿入位置","detail":"H2の中央を探して段落の切れ目に入れる","status":"done","status_label":"実装済み"},{"id":"SB-07-003","category":"CTA・コンバージョン導線","name":"末尾CTAを参考情報の前に置く","detail":"出典リストの後ろに埋もれないよう位置を補正する","status":"done","status_label":"実装済み"},{"id":"SB-07-004","category":"CTA・コンバージョン導線","name":"CTA二重挿入の防止","detail":"本文に同じLINE URLが既にあれば挿入しない","status":"done","status_label":"実装済み"},{"id":"SB-07-005","category":"CTA・コンバージョン導線","name":"HTML版CTAの装飾","detail":"媒体依存しないインラインCSSでボタンを描画する","status":"done","status_label":"実装済み"},{"id":"SB-07-006","category":"CTA・コンバージョン導線","name":"クライアント設定からのCTA自動補完","detail":"記事にCTA未指定ならクライアントのLINE URL/オファーで補う","status":"done","status_label":"実装済み"},{"id":"SB-07-007","category":"CTA・コンバージョン導線","name":"UTMパラメータ自動付与","detail":"source/medium/campaign/content を全CTAリンクに付ける","status":"done","status_label":"実装済み"},{"id":"SB-07-008","category":"CTA・コンバージョン導線","name":"CTA位置別のutm_content","detail":"cta_top / cta_middle / cta_bottom を区別して計測する","status":"done","status_label":"実装済み"},{"id":"SB-07-009","category":"CTA・コンバージョン導線","name":"既存クエリの保持","detail":"リンクに元から付いているパラメータを壊さない","status":"done","status_label":"実装済み"},{"id":"SB-07-010","category":"CTA・コンバージョン導線","name":"オファー文言のクライアント別設定","detail":"「無料診断」等の訴求をクライアント単位で持つ","status":"done","status_label":"実装済み"},{"id":"SB-07-011","category":"CTA・コンバージョン導線","name":"CTAラベルのカスタム","detail":"ボタン文言を記事ごとに変える","status":"done","status_label":"実装済み"},{"id":"SB-07-012","category":"CTA・コンバージョン導線","name":"記事とLINEの文言統一チェック","detail":"記事のオファー名とLINEあいさつ文の不一致を警告する","status":"done","status_label":"実装済み"},{"id":"SB-07-013","category":"CTA・コンバージョン導線","name":"CTAのA/Bテスト","detail":"2種類のCTAを出し分けてクリック率を比較する","status":"done","status_label":"実装済み"},{"id":"SB-07-014","category":"CTA・コンバージョン導線","name":"スクロール率連動CTA","detail":"一定割合スクロールした読者にだけ表示する","status":"done","status_label":"実装済み"},{"id":"SB-07-015","category":"CTA・コンバージョン導線","name":"離脱時ポップアップ","detail":"ページを離れる動きを検知してオファーを出す","status":"done","status_label":"実装済み"},{"id":"SB-07-016","category":"CTA・コンバージョン導線","name":"フォーム埋め込みCTA","detail":"LINE以外にメールフォーム型のCTAを差し込む","status":"done","status_label":"実装済み"},{"id":"SB-07-017","category":"CTA・コンバージョン導線","name":"電話タップCTA","detail":"モバイルのみ発信ボタンを出す","status":"done","status_label":"実装済み"},{"id":"SB-07-018","category":"CTA・コンバージョン導線","name":"記事別CTA出し分け","detail":"検索意図に応じて資料DL/相談/来店予約を切り替える","status":"done","status_label":"実装済み"},{"id":"SB-07-019","category":"CTA・コンバージョン導線","name":"CTAクリックの実測","detail":"クリック数を自前で記録しCVRを出す","status":"done","status_label":"実装済み"},{"id":"SB-07-020","category":"CTA・コンバージョン導線","name":"CV(問い合わせ)の記事別帰属","detail":"どの記事経由の友だち追加が成約したかを追う","status":"done","status_label":"実装済み"},{"id":"SB-08-001","category":"LINE公式アカウント連携","name":"新着記事のブロードキャスト","detail":"Messaging APIで友だち全員へ記事を通知する","status":"done","status_label":"実装済み"},{"id":"SB-08-002","category":"LINE公式アカウント連携","name":"Flexメッセージ配信","detail":"画像・見出し・ボタン付きのカード型で送る","status":"done","status_label":"実装済み"},{"id":"SB-08-003","category":"LINE公式アカウント連携","name":"テキスト配信モード","detail":"Flexを使わず素のテキストで送る設定","status":"done","status_label":"実装済み"},{"id":"SB-08-004","category":"LINE公式アカウント連携","name":"任意URLの単発配信","detail":"記事以外のキャンペーンLPをAPIから配信する","status":"done","status_label":"実装済み"},{"id":"SB-08-005","category":"LINE公式アカウント連携","name":"ボタンラベルの設定","detail":"「記事を読む」等のCTA文言を設定で変える","status":"done","status_label":"実装済み"},{"id":"SB-08-006","category":"LINE公式アカウント連携","name":"配信リンクへのUTM付与","detail":"LINE経由の流入を計測できるようにする","status":"done","status_label":"実装済み"},{"id":"SB-08-007","category":"LINE公式アカウント連携","name":"配信結果のジョブ記録","detail":"送信の成否をほかの媒体と同じ形式で残す","status":"done","status_label":"実装済み"},{"id":"SB-08-008","category":"LINE公式アカウント連携","name":"チャネルトークンの環境変数管理","detail":"トークンを設定ファイルに直書きせず環境変数から読む","status":"done","status_label":"実装済み"},{"id":"SB-08-009","category":"LINE公式アカウント連携","name":"週次まとめ配信","detail":"記事ごとに送らず週1でまとめて通数を節約する","status":"done","status_label":"実装済み"},{"id":"SB-08-010","category":"LINE公式アカウント連携","name":"セグメント配信(narrowcast)","detail":"属性・行動で絞って配信する","status":"done","status_label":"実装済み"},{"id":"SB-08-011","category":"LINE公式アカウント連携","name":"プッシュ配信(個別)","detail":"特定ユーザーにだけ送る","status":"done","status_label":"実装済み"},{"id":"SB-08-012","category":"LINE公式アカウント連携","name":"配信通数の見積もりと上限警告","detail":"月間プランの上限に対する消費を可視化する","status":"done","status_label":"実装済み"},{"id":"SB-08-013","category":"LINE公式アカウント連携","name":"あいさつメッセージ管理","detail":"友だち追加直後の案内文を画面から編集する","status":"done","status_label":"実装済み"},{"id":"SB-08-014","category":"LINE公式アカウント連携","name":"応答メッセージ(よくある質問20問)","detail":"キーワード自動返信の辞書を管理する","status":"done","status_label":"実装済み"},{"id":"SB-08-015","category":"LINE公式アカウント連携","name":"AIチャットボット応答","detail":"FAQに無い質問へAIが一次回答する","status":"done","status_label":"実装済み"},{"id":"SB-08-016","category":"LINE公式アカウント連携","name":"有人切り替え(エスカレーション)","detail":"見積もり・苦情は人へ転送する","status":"done","status_label":"実装済み"},{"id":"SB-08-017","category":"LINE公式アカウント連携","name":"営業時間内外の応答切替","detail":"時間帯で自動/有人を切り替える","status":"done","status_label":"実装済み"},{"id":"SB-08-018","category":"LINE公式アカウント連携","name":"リッチメニュー管理","detail":"記事導線を含むメニューを差し替える","status":"done","status_label":"実装済み"},{"id":"SB-08-019","category":"LINE公式アカウント連携","name":"友だち数・ブロック率の推移","detail":"配信のたびの増減を記録する","status":"done","status_label":"実装済み"},{"id":"SB-08-020","category":"LINE公式アカウント連携","name":"クーポン・予約導線","detail":"LINEからの予約/クーポン配布に繋ぐ","status":"done","status_label":"実装済み"},{"id":"SB-08-021","category":"LINE公式アカウント連携","name":"配信予約","detail":"指定日時にLINE配信を自動実行する","status":"done","status_label":"実装済み"},{"id":"SB-08-022","category":"LINE公式アカウント連携","name":"配信文面のプレビュー","detail":"送信前に実機表示に近い形で確認する","status":"done","status_label":"実装済み"},{"id":"SB-09-001","category":"SNS運用","name":"記事の自動SNS告知","detail":"公開と同時に要約＋リンクをSNSへ流す","status":"done","status_label":"実装済み"},{"id":"SB-09-002","category":"SNS運用","name":"プラットフォーム別文字数調整","detail":"上限に収まるよう末尾を省略記号で丸める","status":"done","status_label":"実装済み"},{"id":"SB-09-003","category":"SNS運用","name":"ハッシュタグ自動付与","detail":"記事タグの先頭3件を # 付きで添える","status":"done","status_label":"実装済み"},{"id":"SB-09-004","category":"SNS運用","name":"手書き投稿文の優先","detail":"social.x / social.linkedin があればそちらを使う","status":"done","status_label":"実装済み"},{"id":"SB-09-005","category":"SNS運用","name":"リンクへのUTM付与","detail":"SNS別に utm_content を分けて流入元を切り分ける","status":"done","status_label":"実装済み"},{"id":"SB-09-006","category":"SNS運用","name":"LinkedIn個人/法人の切替","detail":"author_urn で個人・組織アカウントを使い分ける","status":"done","status_label":"実装済み"},{"id":"SB-09-007","category":"SNS運用","name":"Facebookページ投稿","detail":"ページIDとページトークンで法人ページへ投稿する","status":"done","status_label":"実装済み"},{"id":"SB-09-008","category":"SNS運用","name":"Threads2段階投稿","detail":"コンテナ作成→公開のAPI仕様に対応する","status":"done","status_label":"実装済み"},{"id":"SB-09-009","category":"SNS運用","name":"画像付き投稿","detail":"カバー画像を添えてSNSの表示面積を稼ぐ","status":"done","status_label":"実装済み"},{"id":"SB-09-010","category":"SNS運用","name":"スレッド(連投)生成","detail":"長文記事を数投に分割して連続投稿する","status":"done","status_label":"実装済み"},{"id":"SB-09-011","category":"SNS運用","name":"投稿時間の最適化","detail":"エンゲージメントの高い時間帯に自動でずらす","status":"done","status_label":"実装済み"},{"id":"SB-09-012","category":"SNS運用","name":"リサイクル投稿","detail":"過去記事を一定期間後に再告知する","status":"done","status_label":"実装済み"},{"id":"SB-09-013","category":"SNS運用","name":"Instagram連携","detail":"ビジネスアカウントへフィード/ストーリーズ投稿する","status":"done","status_label":"実装済み"},{"id":"SB-09-014","category":"SNS運用","name":"TikTok連携","detail":"記事から短尺動画の台本・絵コンテを作り、出来た動画を投稿する","status":"done","status_label":"実装済み"},{"id":"SB-09-015","category":"SNS運用","name":"Pinterest連携","detail":"記事画像をピンとして配信する","status":"done","status_label":"実装済み"},{"id":"SB-09-016","category":"SNS運用","name":"SNS反応の取り込み","detail":"いいね・リポスト数を記事の成果に紐付ける","status":"done","status_label":"実装済み"},{"id":"SB-09-017","category":"SNS運用","name":"メンション・エゴサーチ監視","detail":"社名の言及を拾って通知する","status":"done","status_label":"実装済み"},{"id":"SB-09-018","category":"SNS運用","name":"コメント返信の一元受信","detail":"各SNSのコメントを1画面に集める","status":"done","status_label":"実装済み"},{"id":"SB-09-019","category":"SNS運用","name":"投稿カレンダー","detail":"SNS投稿予定を月次カレンダーで俯瞰する","status":"done","status_label":"実装済み"},{"id":"SB-09-020","category":"SNS運用","name":"ブランドハッシュタグ管理","detail":"常時付けるタグをクライアント別に持つ","status":"done","status_label":"実装済み"},{"id":"SB-09-021","category":"SNS運用","name":"投稿文のトンマナ検査","detail":"SNS別の文体ルールに沿っているか点検する","status":"done","status_label":"実装済み"},{"id":"SB-09-022","category":"SNS運用","name":"失敗投稿の再送","detail":"APIエラーで落ちた投稿だけを後から流し直す","status":"done","status_label":"実装済み"},{"id":"SB-10-001","category":"スケジューリング・自動化","name":"記事の予約公開","detail":"publish_at を対応媒体の予約投稿機能へ引き渡す","status":"done","status_label":"実装済み"},{"id":"SB-10-002","category":"スケジューリング・自動化","name":"毎朝の記事投入を受け付けるAPI","detail":"外部スケジューラから POST /v1/articles を叩くだけで回る","status":"done","status_label":"実装済み"},{"id":"SB-10-003","category":"スケジューリング・自動化","name":"CLIからのバッチ実行","detail":"cron から python -m autopost publish today/*.json を回す","status":"done","status_label":"実装済み"},{"id":"SB-10-004","category":"スケジューリング・自動化","name":"環境変数によるシークレット注入","detail":"${VAR} 記法で実行時にトークンを差し込む","status":"done","status_label":"実装済み"},{"id":"SB-10-005","category":"スケジューリング・自動化","name":"ドライラン付きの安全な自動実行","detail":"本番前に --dry-run で内容だけ確認する運用ができる","status":"done","status_label":"実装済み"},{"id":"SB-10-006","category":"スケジューリング・自動化","name":"内蔵スケジューラ","detail":"画面から公開時刻を指定して自動実行させる","status":"done","status_label":"実装済み"},{"id":"SB-10-007","category":"スケジューリング・自動化","name":"編集カレンダー","detail":"月次で公開予定を並べ、ドラッグで日付を動かす","status":"done","status_label":"実装済み"},{"id":"SB-10-008","category":"スケジューリング・自動化","name":"公開頻度ルール","detail":"週3本などの目標を設定し不足を警告する","status":"done","status_label":"実装済み"},{"id":"SB-10-009","category":"スケジューリング・自動化","name":"祝日・営業日カレンダー","detail":"休業日を避けて公開日をずらす","status":"done","status_label":"実装済み"},{"id":"SB-10-010","category":"スケジューリング・自動化","name":"繰り返しジョブ","detail":"定期的な再告知・再配信をルール化する","status":"done","status_label":"実装済み"},{"id":"SB-10-011","category":"スケジューリング・自動化","name":"トリガー自動化(if-then)","detail":"順位が下がったら改稿タスクを自動生成する","status":"done","status_label":"実装済み"},{"id":"SB-10-012","category":"スケジューリング・自動化","name":"パイプライン定義","detail":"生成→校正→承認→配信の段取りをテンプレ化する","status":"done","status_label":"実装済み"},{"id":"SB-10-013","category":"スケジューリング・自動化","name":"失敗時の自動リトライ計画","detail":"指数バックオフの上限・回数を管理画面から変える","status":"done","status_label":"実装済み"},{"id":"SB-10-014","category":"スケジューリング・自動化","name":"デッドレターキュー","detail":"何度も失敗したジョブを隔離して人が確認する","status":"done","status_label":"実装済み"},{"id":"SB-10-015","category":"スケジューリング・自動化","name":"ジョブのタイムアウト制御","detail":"長時間ハングした配信を打ち切る","status":"done","status_label":"実装済み"},{"id":"SB-10-016","category":"スケジューリング・自動化","name":"同時実行数の上限設定","detail":"外部APIを叩きすぎないよう並列度を絞る","status":"done","status_label":"実装済み"},{"id":"SB-10-017","category":"スケジューリング・自動化","name":"配信の一括キャンセル","detail":"予約済みジョブをまとめて取り消す","status":"done","status_label":"実装済み"},{"id":"SB-10-018","category":"スケジューリング・自動化","name":"下書き→公開の自動昇格","detail":"承認が付いた時点で自動的に公開へ進める","status":"done","status_label":"実装済み"},{"id":"SB-10-019","category":"スケジューリング・自動化","name":"記事の自動アーカイブ","detail":"古い記事を一定期間後に見直しキューへ入れる","status":"done","status_label":"実装済み"},{"id":"SB-10-020","category":"スケジューリング・自動化","name":"Claudeスケジュールタスク連携","detail":"毎朝の記事生成タスクの出力をそのまま取り込む","status":"done","status_label":"実装済み"},{"id":"SB-10-021","category":"スケジューリング・自動化","name":"n8n / Make 連携","detail":"Webhookアダプタ経由で既存の自動化基盤に流す","status":"done","status_label":"実装済み"},{"id":"SB-10-022","category":"スケジューリング・自動化","name":"Zapier連携","detail":"Zapのトリガー/アクションとして接続する","status":"done","status_label":"実装済み"},{"id":"SB-10-023","category":"スケジューリング・自動化","name":"Slack通知","detail":"公開・失敗をSlackチャンネルへ流す","status":"done","status_label":"実装済み"},{"id":"SB-10-024","category":"スケジューリング・自動化","name":"メール通知","detail":"日次サマリを担当者へ送る","status":"done","status_label":"実装済み"},{"id":"SB-10-025","category":"スケジューリング・自動化","name":"実行ログのリアルタイム表示","detail":"配信中の進捗を画面でストリーム表示する","status":"done","status_label":"実装済み"},{"id":"SB-11-001","category":"画像・メディア","name":"カバー画像URLの保持","detail":"記事にアイキャッチURLを持たせ各媒体へ渡す","status":"done","status_label":"実装済み"},{"id":"SB-11-002","category":"画像・メディア","name":"媒体へのアイキャッチ引き渡し","detail":"対応媒体のカバー画像フィールドにセットする","status":"done","status_label":"実装済み"},{"id":"SB-11-003","category":"画像・メディア","name":"OG画像の出力","detail":"記事ページのog:imageにカバー画像を使う","status":"done","status_label":"実装済み"},{"id":"SB-11-004","category":"画像・メディア","name":"画像の遅延読み込み","detail":"記事本文の画像を loading=lazy で読む","status":"done","status_label":"実装済み"},{"id":"SB-11-005","category":"画像・メディア","name":"本文内画像のMarkdown対応","detail":"![alt](url) をHTML変換で正しく描画する","status":"done","status_label":"実装済み"},{"id":"SB-11-006","category":"画像・メディア","name":"アイキャッチ自動生成","detail":"タイトル文字を載せたOG画像をサーバで描く","status":"done","status_label":"実装済み"},{"id":"SB-11-007","category":"画像・メディア","name":"画像のアップロード管理","detail":"自社ストレージに上げてCDN URLを配る","status":"done","status_label":"実装済み"},{"id":"SB-11-008","category":"画像・メディア","name":"媒体別の画像リサイズ","detail":"各SNSの推奨比率に自動で切り出す","status":"done","status_label":"実装済み"},{"id":"SB-11-009","category":"画像・メディア","name":"WebP/AVIF変換","detail":"軽量フォーマットへ変換して配信する","status":"done","status_label":"実装済み"},{"id":"SB-11-010","category":"画像・メディア","name":"画像圧縮","detail":"画質を保ったままファイルサイズを落とす","status":"done","status_label":"実装済み"},{"id":"SB-11-011","category":"画像・メディア","name":"alt文の一括点検","detail":"未設定・重複のaltを洗い出す","status":"done","status_label":"実装済み"},{"id":"SB-11-012","category":"画像・メディア","name":"画像の著作権・出典管理","detail":"素材の出典とライセンスを記録する","status":"done","status_label":"実装済み"},{"id":"SB-11-013","category":"画像・メディア","name":"ストックフォトAPI連携","detail":"記事テーマから候補画像を検索して差し込む","status":"done","status_label":"実装済み"},{"id":"SB-11-014","category":"画像・メディア","name":"AI画像生成","detail":"記事内容に沿った図版を生成する","status":"done","status_label":"実装済み"},{"id":"SB-11-015","category":"画像・メディア","name":"図解・チャート生成","detail":"数値データから記事用グラフを作る","status":"done","status_label":"実装済み"},{"id":"SB-11-016","category":"画像・メディア","name":"動画の埋め込み","detail":"YouTube等を記事に埋め込みVideoObjectを出す","status":"done","status_label":"実装済み"},{"id":"SB-11-017","category":"画像・メディア","name":"音声版記事(読み上げ)","detail":"本文を音声化してポッドキャスト配信する","status":"done","status_label":"実装済み"},{"id":"SB-11-018","category":"画像・メディア","name":"画像のCDNキャッシュ制御","detail":"更新時にキャッシュを破棄する","status":"done","status_label":"実装済み"},{"id":"SB-11-019","category":"画像・メディア","name":"画像ファイル名のSEO最適化","detail":"内容が分かる英字ファイル名に整える","status":"done","status_label":"実装済み"},{"id":"SB-11-020","category":"画像・メディア","name":"スクリーンショット自動取得","detail":"参照サイトの画面を証跡として保存する","status":"done","status_label":"実装済み"},{"id":"SB-11-021","category":"画像・メディア","name":"画像の重複検出","detail":"同じ画像の使い回しを検知する","status":"done","status_label":"実装済み"},{"id":"SB-11-022","category":"画像・メディア","name":"メディアライブラリ","detail":"使用済み画像を横断検索できる棚を持つ","status":"done","status_label":"実装済み"},{"id":"SB-12-001","category":"内部リンク・サイト構造","name":"記事一覧ページ","detail":"公開記事をカード一覧で並べる","status":"done","status_label":"実装済み"},{"id":"SB-12-002","category":"内部リンク・サイト構造","name":"カテゴリ別の分類表示","detail":"記事のカテゴリを一覧に出す","status":"done","status_label":"実装済み"},{"id":"SB-12-003","category":"内部リンク・サイト構造","name":"タグ表示","detail":"記事に付いたタグを表示する","status":"done","status_label":"実装済み"},{"id":"SB-12-004","category":"内部リンク・サイト構造","name":"パンくずの階層","detail":"トップ→ブログ→記事 の導線を出す","status":"done","status_label":"実装済み"},{"id":"SB-12-005","category":"内部リンク・サイト構造","name":"サイト全体の共通ナビゲーション","detail":"全ページで同じヘッダ/フッタ導線を持つ","status":"done","status_label":"実装済み"},{"id":"SB-12-006","category":"内部リンク・サイト構造","name":"記事内目次からの内部アンカー","detail":"見出しへのジャンプリンクを張る","status":"done","status_label":"実装済み"},{"id":"SB-12-007","category":"内部リンク・サイト構造","name":"関連記事の自動リンク","detail":"同クラスタの記事を機械的に相互リンクする","status":"done","status_label":"実装済み"},{"id":"SB-12-008","category":"内部リンク・サイト構造","name":"内部リンク不足の検出","detail":"被リンクの少ない孤立記事を洗い出す","status":"done","status_label":"実装済み"},{"id":"SB-12-009","category":"内部リンク・サイト構造","name":"アンカーテキストの最適化提案","detail":"「こちら」等の弱いリンク文言を指摘する","status":"done","status_label":"実装済み"},{"id":"SB-12-010","category":"内部リンク・サイト構造","name":"リンク切れ検査","detail":"内部・外部リンクの404を定期巡回で見つける","status":"done","status_label":"実装済み"},{"id":"SB-12-011","category":"内部リンク・サイト構造","name":"リダイレクト管理","detail":"slug変更時に301を自動で張る","status":"done","status_label":"実装済み"},{"id":"SB-12-012","category":"内部リンク・サイト構造","name":"ピラーページ/クラスタ構造","detail":"軸記事とサテライト記事の関係を管理する","status":"done","status_label":"実装済み"},{"id":"SB-12-013","category":"内部リンク・サイト構造","name":"カテゴリページのSEO最適化","detail":"一覧ページにも独自の説明文と構造化データを持たせる","status":"done","status_label":"実装済み"},{"id":"SB-12-014","category":"内部リンク・サイト構造","name":"タグページの間引き","detail":"記事数の少ないタグページをnoindexにする","status":"done","status_label":"実装済み"},{"id":"SB-12-015","category":"内部リンク・サイト構造","name":"ページネーション制御","detail":"一覧の分割にrel/canonicalを正しく設定する","status":"done","status_label":"実装済み"},{"id":"SB-12-016","category":"内部リンク・サイト構造","name":"サイト内検索","detail":"記事本文を全文検索する","status":"done","status_label":"実装済み"},{"id":"SB-12-017","category":"内部リンク・サイト構造","name":"サイトマップの階層可視化","detail":"サイト構造をツリーで俯瞰する","status":"done","status_label":"実装済み"},{"id":"SB-12-018","category":"内部リンク・サイト構造","name":"孤立ページの検出","detail":"どこからもリンクされていないURLを見つける","status":"done","status_label":"実装済み"},{"id":"SB-12-019","category":"内部リンク・サイト構造","name":"URL設計ルールの強制","detail":"階層の深さ・命名規則を投入時に検査する","status":"done","status_label":"実装済み"},{"id":"SB-12-020","category":"内部リンク・サイト構造","name":"多階層カテゴリ","detail":"親子カテゴリでサイトを整理する","status":"done","status_label":"実装済み"},{"id":"SB-13-001","category":"テクニカルSEO","name":"robots.txt の配信","detail":"クロール許可とサイトマップ位置を明示する","status":"done","status_label":"実装済み"},{"id":"SB-13-002","category":"テクニカルSEO","name":"sitemap.xml の自動生成","detail":"全ページと記事URLをlastmod付きで出力する","status":"done","status_label":"実装済み"},{"id":"SB-13-003","category":"テクニカルSEO","name":"RSSフィード","detail":"記事の更新をRSS 2.0で配信する","status":"done","status_label":"実装済み"},{"id":"SB-13-004","category":"テクニカルSEO","name":"正規URLの統一","detail":"自己参照canonicalで重複URLを1本に寄せる","status":"done","status_label":"実装済み"},{"id":"SB-13-005","category":"テクニカルSEO","name":"HTTPS配信","detail":"全ページをTLS経由で提供する","status":"done","status_label":"実装済み"},{"id":"SB-13-006","category":"テクニカルSEO","name":"レスポンシブ表示","detail":"スマホ・タブレット・PCで崩れないレイアウト","status":"done","status_label":"実装済み"},{"id":"SB-13-007","category":"テクニカルSEO","name":"軽量な初期表示","detail":"外部フレームワーク非依存でCSS/JSを最小限にする","status":"done","status_label":"実装済み"},{"id":"SB-13-008","category":"テクニカルSEO","name":"文字コード・言語宣言","detail":"UTF-8 と lang=ja を明示する","status":"done","status_label":"実装済み"},{"id":"SB-13-009","category":"テクニカルSEO","name":"meta viewport","detail":"モバイルで正しい縮尺で表示する","status":"done","status_label":"実装済み"},{"id":"SB-13-010","category":"テクニカルSEO","name":"404ページ","detail":"存在しないURLに案内付きの404を返す","status":"done","status_label":"実装済み"},{"id":"SB-13-011","category":"テクニカルSEO","name":"HTMLの構造化(セマンティック)","detail":"header/main/article/nav を正しく使う","status":"done","status_label":"実装済み"},{"id":"SB-13-012","category":"テクニカルSEO","name":"ヘルスチェックエンドポイント","detail":"/v1/health で稼働状態を機械的に確認する","status":"done","status_label":"実装済み"},{"id":"SB-13-013","category":"テクニカルSEO","name":"Core Web Vitals計測","detail":"LCP/INP/CLSを実ユーザーから収集する","status":"done","status_label":"実装済み"},{"id":"SB-13-014","category":"テクニカルSEO","name":"ページ速度の改善提案","detail":"重い要素を指摘して具体策を出す","status":"done","status_label":"実装済み"},{"id":"SB-13-015","category":"テクニカルSEO","name":"インデックス状況の確認","detail":"検索エンジンに登録されたURL数を追う","status":"done","status_label":"実装済み"},{"id":"SB-13-016","category":"テクニカルSEO","name":"クロールエラー監視","detail":"サーバエラー・ソフト404を検知する","status":"done","status_label":"実装済み"},{"id":"SB-13-017","category":"テクニカルSEO","name":"hreflang出力","detail":"多言語版の対応関係を宣言する","status":"done","status_label":"実装済み"},{"id":"SB-13-018","category":"テクニカルSEO","name":"AMP/軽量版の提供","detail":"モバイル向け軽量ページを別に出す","status":"done","status_label":"実装済み"},{"id":"SB-13-019","category":"テクニカルSEO","name":"構造化データの検証","detail":"JSON-LDの必須項目欠落を自動テストする","status":"done","status_label":"実装済み"},{"id":"SB-13-020","category":"テクニカルSEO","name":"IndexNow / URL通知","detail":"公開直後に検索エンジンへURLを送信する","status":"done","status_label":"実装済み"},{"id":"SB-13-021","category":"テクニカルSEO","name":"HTTPヘッダの最適化","detail":"キャッシュ・圧縮・セキュリティヘッダを整える","status":"done","status_label":"実装済み"},{"id":"SB-13-022","category":"テクニカルSEO","name":"ログファイル解析","detail":"クローラの巡回頻度をアクセスログから見る","status":"done","status_label":"実装済み"},{"id":"SB-13-023","category":"テクニカルSEO","name":"JavaScript依存の削減","detail":"本文がJS無しで読める状態を保つ","status":"done","status_label":"実装済み"},{"id":"SB-13-024","category":"テクニカルSEO","name":"画像のサイズ属性指定","detail":"width/heightを入れてレイアウトシフトを防ぐ","status":"done","status_label":"実装済み"},{"id":"SB-13-025","category":"テクニカルSEO","name":"カスタムドメイン対応","detail":"独自ドメインで配信する","status":"done","status_label":"実装済み"},{"id":"SB-14-001","category":"計測・アナリティクス","name":"UTMパラメータ設計","detail":"source/medium/campaign/content の付与ルールを統一する","status":"done","status_label":"実装済み"},{"id":"SB-14-002","category":"計測・アナリティクス","name":"媒体別のutm_content","detail":"どの配信先から来たかを1パラメータで切り分ける","status":"done","status_label":"実装済み"},{"id":"SB-14-003","category":"計測・アナリティクス","name":"CTA位置別の計測タグ","detail":"冒頭/中盤/末尾のどのCTAが効いたかを分ける","status":"done","status_label":"実装済み"},{"id":"SB-14-004","category":"計測・アナリティクス","name":"クライアント別campaign","detail":"utm_campaignをクライアント単位で自動採番する","status":"done","status_label":"実装済み"},{"id":"SB-14-005","category":"計測・アナリティクス","name":"配信結果の件数集計","detail":"ジョブごとの成功/失敗/スキップ数を出す","status":"done","status_label":"実装済み"},{"id":"SB-14-006","category":"計測・アナリティクス","name":"媒体別の公開URL一覧","detail":"1記事がどこに何のURLで載ったかを一覧で持つ","status":"done","status_label":"実装済み"},{"id":"SB-14-007","category":"計測・アナリティクス","name":"コンソールのサマリ指標","detail":"記事数・ジョブ数・配信先数をダッシュボードに出す","status":"done","status_label":"実装済み"},{"id":"SB-14-008","category":"計測・アナリティクス","name":"Google Analytics 4連携","detail":"GA4のイベントを取り込み記事別に集計する","status":"done","status_label":"実装済み"},{"id":"SB-14-009","category":"計測・アナリティクス","name":"Search Console連携","detail":"表示回数・クリック・平均掲載順位を取り込む","status":"done","status_label":"実装済み"},{"id":"SB-14-010","category":"計測・アナリティクス","name":"記事別ダッシュボード","detail":"1記事のPV・CTR・CVを1画面にまとめる","status":"done","status_label":"実装済み"},{"id":"SB-14-011","category":"計測・アナリティクス","name":"流入チャネル分析","detail":"検索/SNS/LINE/直接の内訳を出す","status":"done","status_label":"実装済み"},{"id":"SB-14-012","category":"計測・アナリティクス","name":"AI検索からの流入計測","detail":"ChatGPT・Perplexity等のリファラを分離して数える","status":"done","status_label":"実装済み"},{"id":"SB-14-013","category":"計測・アナリティクス","name":"滞在時間・スクロール深度","detail":"読まれた深さを計測して離脱箇所を見る","status":"done","status_label":"実装済み"},{"id":"SB-14-014","category":"計測・アナリティクス","name":"ヒートマップ","detail":"クリック位置を可視化する","status":"done","status_label":"実装済み"},{"id":"SB-14-015","category":"計測・アナリティクス","name":"CVトラッキング","detail":"友だち追加・問い合わせ・購入を成果として記録する","status":"done","status_label":"実装済み"},{"id":"SB-14-016","category":"計測・アナリティクス","name":"マルチタッチ・アトリビューション","detail":"複数記事を経た成約の貢献度を配分する","status":"done","status_label":"実装済み"},{"id":"SB-14-017","category":"計測・アナリティクス","name":"記事のROI算出","detail":"制作コストと獲得成果を突き合わせる","status":"done","status_label":"実装済み"},{"id":"SB-14-018","category":"計測・アナリティクス","name":"コホート分析","detail":"公開月ごとの記事の伸び方を比較する","status":"done","status_label":"実装済み"},{"id":"SB-14-019","category":"計測・アナリティクス","name":"目標(KPI)設定と進捗","detail":"月間の流入・CV目標に対する達成率を出す","status":"done","status_label":"実装済み"},{"id":"SB-14-020","category":"計測・アナリティクス","name":"異常検知アラート","detail":"流入の急落を検知して通知する","status":"done","status_label":"実装済み"},{"id":"SB-14-021","category":"計測・アナリティクス","name":"イベントの自前収集","detail":"外部ツールに頼らず自社でPVを記録する","status":"done","status_label":"実装済み"},{"id":"SB-14-022","category":"計測・アナリティクス","name":"Cookie同意管理","detail":"計測前に同意を取り、拒否時は計測しない","status":"done","status_label":"実装済み"},{"id":"SB-14-023","category":"計測・アナリティクス","name":"プライバシー配慮の匿名計測","detail":"個人を特定しない形でアクセスを数える","status":"done","status_label":"実装済み"},{"id":"SB-14-024","category":"計測・アナリティクス","name":"リアルタイム閲覧数","detail":"いま読まれている記事を表示する","status":"done","status_label":"実装済み"},{"id":"SB-14-025","category":"計測・アナリティクス","name":"参照元ドメインの一覧","detail":"被リンク元から実際に来た流入を見る","status":"done","status_label":"実装済み"},{"id":"SB-14-026","category":"計測・アナリティクス","name":"検索クエリ別の成果","detail":"クエリごとのCVRを出して記事改善に使う","status":"done","status_label":"実装済み"},{"id":"SB-14-027","category":"計測・アナリティクス","name":"デバイス別・地域別の内訳","detail":"モバイル比率や都道府県別の流入を見る","status":"done","status_label":"実装済み"},{"id":"SB-14-028","category":"計測・アナリティクス","name":"レポートの自動配信","detail":"週次・月次で指標をメール送付する","status":"done","status_label":"実装済み"},{"id":"SB-14-029","category":"計測・アナリティクス","name":"ダッシュボードの共有リンク","detail":"クライアントに読み取り専用URLを渡す","status":"done","status_label":"実装済み"},{"id":"SB-14-030","category":"計測・アナリティクス","name":"データエクスポート","detail":"計測値をCSV/JSONで書き出す","status":"done","status_label":"実装済み"},{"id":"SB-15-001","category":"順位計測・競合分析","name":"キーワード登録","detail":"追跡したい語を記事に紐付けて登録する","status":"done","status_label":"実装済み"},{"id":"SB-15-002","category":"順位計測・競合分析","name":"日次順位取得","detail":"登録語の検索順位を毎日記録する","status":"done","status_label":"実装済み"},{"id":"SB-15-003","category":"順位計測・競合分析","name":"順位推移グラフ","detail":"期間指定で順位の上下を折れ線で見る","status":"done","status_label":"実装済み"},{"id":"SB-15-004","category":"順位計測・競合分析","name":"順位変動アラート","detail":"大きく落ちた語を検知して通知する","status":"done","status_label":"実装済み"},{"id":"SB-15-005","category":"順位計測・競合分析","name":"PC/モバイル別順位","detail":"デバイスごとに分けて計測する","status":"done","status_label":"実装済み"},{"id":"SB-15-006","category":"順位計測・競合分析","name":"地域別順位","detail":"都市単位のローカル検索順位を取る","status":"done","status_label":"実装済み"},{"id":"SB-15-007","category":"順位計測・競合分析","name":"競合サイトの並行追跡","detail":"同じ語で競合が何位かを併記する","status":"done","status_label":"実装済み"},{"id":"SB-15-008","category":"順位計測・競合分析","name":"SERP機能の占有状況","detail":"強調スニペット・PAA・地図枠を誰が取っているか見る","status":"done","status_label":"実装済み"},{"id":"SB-15-009","category":"順位計測・競合分析","name":"順位×流入の相関","detail":"順位が上がった語が実際に流入を生んだか確かめる","status":"done","status_label":"実装済み"},{"id":"SB-15-010","category":"順位計測・競合分析","name":"勝ちパターンの抽出","detail":"上位化した記事に共通する構成を洗い出す","status":"done","status_label":"実装済み"},{"id":"SB-15-011","category":"順位計測・競合分析","name":"競合の被リンク分析","detail":"競合が獲得しているリンク元を調べる","status":"done","status_label":"実装済み"},{"id":"SB-15-012","category":"順位計測・競合分析","name":"自社の被リンク監視","detail":"新規・喪失リンクを追跡する","status":"done","status_label":"実装済み"},{"id":"SB-15-013","category":"順位計測・競合分析","name":"ドメイン評価スコア","detail":"自社と競合の相対的な強さを数値で持つ","status":"done","status_label":"実装済み"},{"id":"SB-15-014","category":"順位計測・競合分析","name":"競合のコンテンツ更新頻度","detail":"競合の投稿ペースを測る","status":"done","status_label":"実装済み"},{"id":"SB-15-015","category":"順位計測・競合分析","name":"シェア・オブ・ボイス","detail":"対象クラスタでの露出シェアを算出する","status":"done","status_label":"実装済み"},{"id":"SB-15-016","category":"順位計測・競合分析","name":"順位レポートのPDF出力","detail":"クライアント提出用の体裁で出す","status":"done","status_label":"実装済み"},{"id":"SB-15-017","category":"順位計測・競合分析","name":"改稿優先度の自動提示","detail":"11〜20位の「あと一歩」の記事を優先させる","status":"done","status_label":"実装済み"},{"id":"SB-15-018","category":"順位計測・競合分析","name":"カニバリの順位面での検出","detail":"同一語で2記事が入れ替わる状態を見つける","status":"done","status_label":"実装済み"},{"id":"SB-15-019","category":"順位計測・競合分析","name":"インデックス削除の検知","detail":"急に順位が消えた語を警告する","status":"done","status_label":"実装済み"},{"id":"SB-15-020","category":"順位計測・競合分析","name":"アルゴリズム更新の記録","detail":"検索エンジンの大型更新日を年表として重ねる","status":"done","status_label":"実装済み"},{"id":"SB-15-021","category":"順位計測・競合分析","name":"順位データのAPI提供","detail":"外部BIツールから読める形で出す","status":"done","status_label":"実装済み"},{"id":"SB-15-022","category":"順位計測・競合分析","name":"計測対象の上限管理","detail":"プランごとの追跡キーワード数を制御する","status":"done","status_label":"実装済み"},{"id":"SB-15-023","category":"順位計測・競合分析","name":"履歴データの長期保管","detail":"過去数年分の順位を保持して比較する","status":"done","status_label":"実装済み"},{"id":"SB-15-024","category":"順位計測・競合分析","name":"ブランド語と一般語の分離","detail":"指名検索と非指名を分けて評価する","status":"done","status_label":"実装済み"},{"id":"SB-15-025","category":"順位計測・競合分析","name":"AI検索での引用状況","detail":"生成AIの回答に自社が引用されたかを追う","status":"done","status_label":"実装済み"},{"id":"SB-16-001","category":"レポーティング","name":"配信ジョブの詳細ビュー","detail":"1ジョブの媒体別結果・URL・エラー文を1画面で読む","status":"done","status_label":"実装済み"},{"id":"SB-16-002","category":"レポーティング","name":"配信サマリの表示","detail":"成功/失敗/スキップの内訳を数で出す","status":"done","status_label":"実装済み"},{"id":"SB-16-003","category":"レポーティング","name":"ジョブ履歴の一覧","detail":"過去の配信を新しい順に並べる","status":"done","status_label":"実装済み"},{"id":"SB-16-004","category":"レポーティング","name":"失敗理由の日本語表示","detail":"資格情報不足・HTTPエラーを読める文言で出す","status":"done","status_label":"実装済み"},{"id":"SB-16-005","category":"レポーティング","name":"月次レポートの自動生成","detail":"流入・順位・CVをまとめた定型レポートを作る","status":"done","status_label":"実装済み"},{"id":"SB-16-006","category":"レポーティング","name":"クライアント向けPDF出力","detail":"ロゴ入りの報告書として書き出す","status":"done","status_label":"実装済み"},{"id":"SB-16-007","category":"レポーティング","name":"レポートのテンプレート編集","detail":"項目の取捨選択と並び順を保存する","status":"done","status_label":"実装済み"},{"id":"SB-16-008","category":"レポーティング","name":"前月比・前年比の自動計算","detail":"増減率と差分を自動で添える","status":"done","status_label":"実装済み"},{"id":"SB-16-009","category":"レポーティング","name":"施策と成果の対応表","detail":"実施した改稿と順位変動を並べて示す","status":"done","status_label":"実装済み"},{"id":"SB-16-010","category":"レポーティング","name":"コメント欄付きレポート","detail":"担当者の所見を数字の横に書き添える","status":"done","status_label":"実装済み"},{"id":"SB-16-011","category":"レポーティング","name":"レポート配信のスケジュール","detail":"毎月1日に自動送付する","status":"done","status_label":"実装済み"},{"id":"SB-16-012","category":"レポーティング","name":"複数クライアントの横断比較","detail":"運用中の全アカウントを1表で見る","status":"done","status_label":"実装済み"},{"id":"SB-16-013","category":"レポーティング","name":"ホワイトラベル出力","detail":"代理店ブランドで報告書を出す","status":"done","status_label":"実装済み"},{"id":"SB-16-014","category":"レポーティング","name":"レポートの共有URL","detail":"PDFでなくWebページとして共有する","status":"done","status_label":"実装済み"},{"id":"SB-17-001","category":"クライアント管理・マルチテナント","name":"複数クライアントの並行運用","detail":"1つの基盤で複数社の配信設定を持つ","status":"done","status_label":"実装済み"},{"id":"SB-17-002","category":"クライアント管理・マルチテナント","name":"クライアント設定のYAML管理","detail":"clients.yaml に配信先・CTA・トンマナをまとめる","status":"done","status_label":"実装済み"},{"id":"SB-17-003","category":"クライアント管理・マルチテナント","name":"クライアントのAPI登録","detail":"POST /v1/clients で設定を投入する","status":"done","status_label":"実装済み"},{"id":"SB-17-004","category":"クライアント管理・マルチテナント","name":"クライアント一覧API","detail":"登録済みの全クライアントを取得する","status":"done","status_label":"実装済み"},{"id":"SB-17-005","category":"クライアント管理・マルチテナント","name":"認証情報のマスク返却","detail":"APIの応答でトークンを *** に伏せる","status":"done","status_label":"実装済み"},{"id":"SB-17-006","category":"クライアント管理・マルチテナント","name":"配信先の役割上書き","detail":"既定の役割をクライアント側で変更する","status":"done","status_label":"実装済み"},{"id":"SB-17-007","category":"クライアント管理・マルチテナント","name":"クライアント別UTMキャンペーン","detail":"計測パラメータを社ごとに分ける","status":"done","status_label":"実装済み"},{"id":"SB-17-008","category":"クライアント管理・マルチテナント","name":"業種(industry)の保持","detail":"業種を設定に持ち、雛形の出し分けに使う","status":"done","status_label":"実装済み"},{"id":"SB-17-009","category":"クライアント管理・マルチテナント","name":"サテライトサイト構成","detail":"同一クライアントで別ドメインをprimaryに持つ","status":"done","status_label":"実装済み"},{"id":"SB-17-010","category":"クライアント管理・マルチテナント","name":"コンソールのクライアント切替","detail":"画面上部でクライアントを選び全ビューに反映する","status":"done","status_label":"実装済み"},{"id":"SB-17-011","category":"クライアント管理・マルチテナント","name":"クライアント別の記事棚","detail":"記事をクライアント単位で分けて保管する","status":"done","status_label":"実装済み"},{"id":"SB-17-012","category":"クライアント管理・マルチテナント","name":"クライアント追加ウィザード","detail":"画面から数ステップで新規クライアントを作る","status":"done","status_label":"実装済み"},{"id":"SB-17-013","category":"クライアント管理・マルチテナント","name":"クライアントごとの利用量計測","detail":"記事数・配信数をテナント別に数える","status":"done","status_label":"実装済み"},{"id":"SB-17-014","category":"クライアント管理・マルチテナント","name":"データの完全分離","detail":"テナント別の窓口で参照を強制し、混在しないことを検証・書き出し・削除できる","status":"done","status_label":"実装済み"},{"id":"SB-17-015","category":"クライアント管理・マルチテナント","name":"クライアント側ログイン","detail":"顧客が自分の記事と成果だけを見る画面","status":"done","status_label":"実装済み"},{"id":"SB-17-016","category":"クライアント管理・マルチテナント","name":"代理店アカウント階層","detail":"代理店→エンドクライアントの2階層で管理する","status":"done","status_label":"実装済み"},{"id":"SB-18-001","category":"ワークフロー・承認","name":"ドライラン確認フロー","detail":"配信前に中身を確認してから本番実行する運用ができる","status":"done","status_label":"実装済み"},{"id":"SB-18-002","category":"ワークフロー・承認","name":"下書き公開","detail":"draft指定で媒体に下書きとして置き、人が最終確認する","status":"done","status_label":"実装済み"},{"id":"SB-18-003","category":"ワークフロー・承認","name":"手動投稿タスクの生成","detail":"note/Ameba用の作業パッケージを自動で用意する","status":"done","status_label":"実装済み"},{"id":"SB-18-004","category":"ワークフロー・承認","name":"手動投稿の完了記録","detail":"投稿後のURLを登録してジョブを閉じる","status":"done","status_label":"実装済み"},{"id":"SB-18-005","category":"ワークフロー・承認","name":"承認ステータス管理","detail":"draft→レビュー中→承認済み→公開 の状態を持つ","status":"done","status_label":"実装済み"},{"id":"SB-18-006","category":"ワークフロー・承認","name":"担当者アサイン","detail":"記事ごとに執筆者・校正者・承認者を割り当てる","status":"done","status_label":"実装済み"},{"id":"SB-18-007","category":"ワークフロー・承認","name":"コメント・修正指示","detail":"記事の該当箇所にコメントを付けてやり取りする","status":"done","status_label":"実装済み"},{"id":"SB-18-008","category":"ワークフロー・承認","name":"差し戻し","detail":"承認者が理由を付けて執筆者に返す","status":"done","status_label":"実装済み"},{"id":"SB-18-009","category":"ワークフロー・承認","name":"承認期限と催促","detail":"期限切れの承認待ちを自動で催促する","status":"done","status_label":"実装済み"},{"id":"SB-18-010","category":"ワークフロー・承認","name":"チェックリスト","detail":"公開前の確認項目を必須化する","status":"done","status_label":"実装済み"},{"id":"SB-18-011","category":"ワークフロー・承認","name":"変更履歴と監査証跡","detail":"誰がいつ何を変えたかを残す","status":"done","status_label":"実装済み"},{"id":"SB-18-012","category":"ワークフロー・承認","name":"タスクボード","detail":"制作中の記事をカンバンで俯瞰する","status":"done","status_label":"実装済み"},{"id":"SB-19-001","category":"API・拡張・連携","name":"REST API","detail":"記事投入・ジョブ取得・クライアント管理をHTTPで提供する","status":"done","status_label":"実装済み"},{"id":"SB-19-002","category":"API・拡張・連携","name":"APIキー認証","detail":"X-API-Key ヘッダで保護する（未設定ならローカル用に無認証）","status":"done","status_label":"実装済み"},{"id":"SB-19-003","category":"API・拡張・連携","name":"OpenAPI仕様の自動生成","detail":"FastAPIが /openapi.json とSwagger UIを出す","status":"done","status_label":"実装済み"},{"id":"SB-19-004","category":"API・拡張・連携","name":"プラットフォーム能力API","detail":"対応媒体と機能をJSONで取得する","status":"done","status_label":"実装済み"},{"id":"SB-19-005","category":"API・拡張・連携","name":"機能カタログAPI","detail":"全機能とその実装状況をJSONで返す","status":"done","status_label":"実装済み"},{"id":"SB-19-006","category":"API・拡張・連携","name":"版番号の出どころを1つにする","detail":"変更履歴の最新見出しをそのまま版番号にする（手で書き換える運用では必ずずれる）","status":"done","status_label":"実装済み"},{"id":"SB-19-007","category":"API・拡張・連携","name":"終わらないリンクを画面に置かない","detail":"SSEを<a href>で貼ると押した人のタブが固まる。画面内で購読し、止められる形にする","status":"done","status_label":"実装済み"},{"id":"SB-19-008","category":"API・拡張・連携","name":"自サイトを自分で巡回する回帰テスト","detail":"全ページを辿ってリンク切れと、返ってこないリンクの両方を検出する","status":"done","status_label":"実装済み"},{"id":"SB-19-009","category":"API・拡張・連携","name":"テストは専用のDBで動かす","detail":"手元でアカウントを1つ作っただけで無関係な17件が落ちた。開発中の状態に左右させない","status":"done","status_label":"実装済み"},{"id":"SB-19-010","category":"API・拡張・連携","name":"Webhookアダプタ","detail":"任意の外部システムへ記事JSONをPOSTする","status":"done","status_label":"実装済み"},{"id":"SB-19-011","category":"API・拡張・連携","name":"Webhook署名","detail":"共有シークレットで送信元を検証できるようにする","status":"done","status_label":"実装済み"},{"id":"SB-19-012","category":"API・拡張・連携","name":"CLI","detail":"platforms / validate / publish をコマンドで実行する","status":"done","status_label":"実装済み"},{"id":"SB-19-013","category":"API・拡張・連携","name":"アダプタ拡張点","detail":"@register を付けたクラス1つで新媒体を追加できる","status":"done","status_label":"実装済み"},{"id":"SB-19-014","category":"API・拡張・連携","name":"Pythonパッケージとして利用","detail":"pip install してライブラリとして組み込む","status":"done","status_label":"実装済み"},{"id":"SB-19-015","category":"API・拡張・連携","name":"Webhook受信(インバウンド)","detail":"外部の公開イベントを受け取って状態を更新する","status":"done","status_label":"実装済み"},{"id":"SB-19-016","category":"API・拡張・連携","name":"APIレート制限","detail":"キーごとの呼び出し上限を設ける","status":"done","status_label":"実装済み"},{"id":"SB-19-017","category":"API・拡張・連携","name":"APIキーのスコープ","detail":"読み取り専用キーと配信可能キーを分ける","status":"done","status_label":"実装済み"},{"id":"SB-19-018","category":"API・拡張・連携","name":"SDK提供","detail":"JavaScript / Python のクライアントライブラリを配る","status":"done","status_label":"実装済み"},{"id":"SB-20-001","category":"セキュリティ・権限","name":"シークレットの環境変数化","detail":"トークンを設定ファイルに直書きせず実行時に注入する","status":"done","status_label":"実装済み"},{"id":"SB-20-002","category":"セキュリティ・権限","name":"応答での資格情報マスク","detail":"APIレスポンスから実トークンを排除する","status":"done","status_label":"実装済み"},{"id":"SB-20-003","category":"セキュリティ・権限","name":"APIキーによるアクセス制御","detail":"配信系エンドポイントを鍵付きにする","status":"done","status_label":"実装済み"},{"id":"SB-20-004","category":"セキュリティ・権限","name":"コンソールの読み取り専用モード","detail":"鍵が無い閲覧者には配信操作をさせない","status":"done","status_label":"実装済み"},{"id":"SB-20-005","category":"セキュリティ・権限","name":"HTTPS前提の通信","detail":"外部API・自サイトともTLSで通す","status":"done","status_label":"実装済み"},{"id":"SB-20-006","category":"セキュリティ・権限","name":"外部リンクのnoopener","detail":"タブナビング対策としてrelを付ける","status":"done","status_label":"実装済み"},{"id":"SB-20-007","category":"セキュリティ・権限","name":"入力値の検証","detail":"pydanticで型・必須・書式を検査して不正入力を弾く","status":"done","status_label":"実装済み"},{"id":"SB-20-008","category":"セキュリティ・権限","name":"ユーザーアカウントとログイン","detail":"個人単位の認証を持つ","status":"done","status_label":"実装済み"},{"id":"SB-20-009","category":"セキュリティ・権限","name":"ロール権限(RBAC)","detail":"管理者/編集者/閲覧者で操作を分ける","status":"done","status_label":"実装済み"},{"id":"SB-20-010","category":"セキュリティ・権限","name":"二要素認証","detail":"ログインに追加の確認要素を求める","status":"done","status_label":"実装済み"},{"id":"SB-20-011","category":"セキュリティ・権限","name":"シークレットの暗号化保管","detail":"トークンを暗号化してデータベースに持つ","status":"done","status_label":"実装済み"},{"id":"SB-20-012","category":"セキュリティ・権限","name":"監査ログ","detail":"設定変更・配信操作の履歴を残す","status":"done","status_label":"実装済み"},{"id":"SB-20-013","category":"セキュリティ・権限","name":"IP制限","detail":"管理画面へのアクセス元を絞る","status":"done","status_label":"実装済み"},{"id":"SB-20-014","category":"セキュリティ・権限","name":"個人情報の取り扱い方針","detail":"収集項目と保持期間を明文化して守る","status":"done","status_label":"実装済み"},{"id":"SB-21-001","category":"課金・プラン","name":"料金プランの提示","detail":"プラン内容と価格をサイト上で明示する","status":"done","status_label":"実装済み"},{"id":"SB-21-002","category":"課金・プラン","name":"プラン別の機能差の明示","detail":"どのプランで何が使えるかを表で示す","status":"done","status_label":"実装済み"},{"id":"SB-21-003","category":"課金・プラン","name":"問い合わせ導線","detail":"見積もり・相談への導線を各ページに置く","status":"done","status_label":"実装済み"},{"id":"SB-21-004","category":"課金・プラン","name":"利用量の計測","detail":"記事数・配信数・LINE通数をプラン上限と突き合わせる","status":"done","status_label":"実装済み"},{"id":"SB-21-005","category":"課金・プラン","name":"上限超過の警告","detail":"しきい値到達時に通知する","status":"done","status_label":"実装済み"},{"id":"SB-21-006","category":"課金・プラン","name":"クレジットカード決済","detail":"オンラインで申し込みと支払いを完結させる","status":"done","status_label":"実装済み"},{"id":"SB-21-007","category":"課金・プラン","name":"請求書発行","detail":"月次の請求書PDFを自動発行する","status":"done","status_label":"実装済み"},{"id":"SB-21-008","category":"課金・プラン","name":"インボイス制度対応","detail":"適格請求書の記載要件を満たす","status":"done","status_label":"実装済み"},{"id":"SB-21-009","category":"課金・プラン","name":"トライアル期間","detail":"一定期間の無料利用を管理する","status":"done","status_label":"実装済み"},{"id":"SB-21-010","category":"課金・プラン","name":"プラン変更・解約","detail":"画面から即時に切り替える","status":"done","status_label":"実装済み"},{"id":"SB-22-001","category":"運用・信頼性","name":"自動テスト","detail":"エンジン・アダプタ・API・本文整形のテストを備える","status":"done","status_label":"実装済み"},{"id":"SB-22-002","category":"運用・信頼性","name":"HTTPモックによるアダプタ検証","detail":"respxで外部APIを模してリクエスト内容を検査する","status":"done","status_label":"実装済み"},{"id":"SB-22-003","category":"運用・信頼性","name":"ヘルスチェック","detail":"/v1/health で稼働とクライアント数を返す","status":"done","status_label":"実装済み"},{"id":"SB-22-004","category":"運用・信頼性","name":"コンテナ化","detail":"Dockerイメージ1つで起動する","status":"done","status_label":"実装済み"},{"id":"SB-22-005","category":"運用・信頼性","name":"設定不備の早期発見","detail":"起動時にYAMLを検証し不正な配信先を弾く","status":"done","status_label":"実装済み"},{"id":"SB-22-006","category":"運用・信頼性","name":"障害の局所化","detail":"1媒体の障害が他媒体の配信を止めない","status":"done","status_label":"実装済み"},{"id":"SB-22-007","category":"運用・信頼性","name":"バージョン表示","detail":"稼働中のバージョンをAPIとフッタに出す","status":"done","status_label":"実装済み"},{"id":"SB-22-008","category":"運用・信頼性","name":"変更履歴(CHANGELOG)","detail":"出荷した機能を公開の変更履歴に残す","status":"done","status_label":"実装済み"},{"id":"SB-22-009","category":"運用・信頼性","name":"構造化ログ","detail":"ジョブIDつきの機械可読ログを出す","status":"done","status_label":"実装済み"},{"id":"SB-22-010","category":"運用・信頼性","name":"メトリクス出力","detail":"配信数・失敗率をPrometheus形式で出す","status":"done","status_label":"実装済み"},{"id":"SB-22-011","category":"運用・信頼性","name":"バックアップと復元","detail":"設定とジョブ履歴を定期バックアップする","status":"done","status_label":"実装済み"},{"id":"SB-22-012","category":"運用・信頼性","name":"ステータスページ","detail":"各媒体連携の稼働状況を公開する","status":"done","status_label":"実装済み"},{"id":"SB-23-001","category":"ローカルSEO・MEO","name":"地域名を含む記事運用","detail":"地域×サービスの記事をクライアント設定から回せる","status":"done","status_label":"実装済み"},{"id":"SB-23-002","category":"ローカルSEO・MEO","name":"Googleビジネスプロフィール連携","detail":"投稿・営業情報の更新を自動化する","status":"done","status_label":"実装済み"},{"id":"SB-23-003","category":"ローカルSEO・MEO","name":"口コミの収集と返信支援","detail":"レビューを集約しAIが返信文を下書きする","status":"done","status_label":"実装済み"},{"id":"SB-23-004","category":"ローカルSEO・MEO","name":"NAP情報の一貫性チェック","detail":"社名・住所・電話の表記ゆれを各所で点検する","status":"done","status_label":"実装済み"},{"id":"SB-23-005","category":"ローカルSEO・MEO","name":"地図検索順位の計測","detail":"地点ごとのローカルパック順位を測る","status":"done","status_label":"実装済み"},{"id":"SB-23-006","category":"ローカルSEO・MEO","name":"店舗別ページの量産","detail":"多店舗のページを構造化データ付きで生成する","status":"done","status_label":"実装済み"},{"id":"SB-23-007","category":"ローカルSEO・MEO","name":"LocalBusiness構造化データ","detail":"営業時間・住所・電話をJSON-LDで出す","status":"done","status_label":"実装済み"},{"id":"SB-23-008","category":"ローカルSEO・MEO","name":"地域メディアへの配信","detail":"地域情報サイトへの掲載導線を管理する","status":"done","status_label":"実装済み"},{"id":"SB-24-001","category":"AI検索最適化（AIO / LLMO）","name":"機械可読な記事構造","detail":"見出し・箇条書き・表を保ったMarkdownを一次情報として持つ","status":"done","status_label":"実装済み"},{"id":"SB-24-002","category":"AI検索最適化（AIO / LLMO）","name":"要約(excerpt)の明示提供","detail":"AIが引用しやすい短い要約を記事に必ず持たせる","status":"done","status_label":"実装済み"},{"id":"SB-24-003","category":"AI検索最適化（AIO / LLMO）","name":"構造化データの出力","detail":"Article JSON-LDでページの意味を機械に伝える","status":"done","status_label":"実装済み"},{"id":"SB-24-004","category":"AI検索最適化（AIO / LLMO）","name":"クロール許可の明示","detail":"robots.txtでAIクローラの扱いを宣言できる","status":"done","status_label":"実装済み"},{"id":"SB-24-005","category":"AI検索最適化（AIO / LLMO）","name":"llms.txt の提供","detail":"サイトの要点をLLM向けの索引として公開する","status":"done","status_label":"実装済み"},{"id":"SB-24-006","category":"AI検索最適化（AIO / LLMO）","name":"AI検索での引用監視","detail":"生成AIの回答に自社が現れるかを定点観測する","status":"done","status_label":"実装済み"},{"id":"SB-24-007","category":"AI検索最適化（AIO / LLMO）","name":"回答されやすい定義文の設計","detail":"冒頭に一問一答形式の定義を置く型を用意する","status":"done","status_label":"実装済み"},{"id":"SB-24-008","category":"AI検索最適化（AIO / LLMO）","name":"一次情報・独自データの付与","detail":"自社調査の数値を記事に持たせて引用価値を上げる","status":"done","status_label":"実装済み"},{"id":"SB-24-009","category":"AI検索最適化（AIO / LLMO）","name":"エンティティ整合","detail":"社名・製品名の表記を全媒体で統一し実体を認識させる","status":"done","status_label":"実装済み"},{"id":"SB-25-001","category":"制作指示書・編集ブリーフ","name":"キーワードから制作指示書を生成","detail":"狙う語を渡すと、構成・話題・質問・内部リンクを束ねた1枚を組み立てる","status":"done","status_label":"実装済み"},{"id":"SB-25-002","category":"制作指示書・編集ブリーフ","name":"検索意図別の構成雛形","detail":"howto/compare/transactional/local/navigational ごとにH2の骨格を持つ","status":"done","status_label":"実装済み"},{"id":"SB-25-003","category":"制作指示書・編集ブリーフ","name":"上位ページの見出しから構成を合成","detail":"SERP上位3件のH2を突き合わせ、共通する流れを構成案にする","status":"done","status_label":"実装済み"},{"id":"SB-25-004","category":"制作指示書・編集ブリーフ","name":"見出しの重複と断片の除去","detail":"包含関係にある見出しは1本にまとめ、「ステップ1」のような中身の無い断片は落とす","status":"done","status_label":"実装済み"},{"id":"SB-25-005","category":"制作指示書・編集ブリーフ","name":"外せない話題を言及率つきで提示","detail":"上位ページの何割が扱っているかを添えるので、優先順位が判断できる","status":"done","status_label":"実装済み"},{"id":"SB-25-006","category":"制作指示書・編集ブリーフ","name":"答えるべき質問の抽出","detail":"関連質問(PAA)をそのままFAQ節に使える形で並べる","status":"done","status_label":"実装済み"},{"id":"SB-25-007","category":"制作指示書・編集ブリーフ","name":"入れたい語（共起語）の提示","detail":"上位ページで一緒に使われている語を、詰め込み注意の但し書きつきで出す","status":"done","status_label":"実装済み"},{"id":"SB-25-008","category":"制作指示書・編集ブリーフ","name":"目安の文字数を上位の中央値から","detail":"平均でなく中央値を使う（極端に長い1本に引きずられないため）","status":"done","status_label":"実装済み"},{"id":"SB-25-009","category":"制作指示書・編集ブリーフ","name":"強調スニペットの型と狙い方","detail":"現在抜かれている型（定義/手順/表）を判定し、合わせ方を書く","status":"done","status_label":"実装済み"},{"id":"SB-25-010","category":"制作指示書・編集ブリーフ","name":"上位ページ一覧の添付","detail":"順位・ドメイン・文字数・表や箇条書きの有無を表で渡す","status":"done","status_label":"実装済み"},{"id":"SB-25-011","category":"制作指示書・編集ブリーフ","name":"仮タイトル案","detail":"検索意図別の型で作り、検索結果で切れない長さまで自動で詰める","status":"done","status_label":"実装済み"},{"id":"SB-25-012","category":"制作指示書・編集ブリーフ","name":"メタディスクリプション案","detail":"構成の上位3見出しから作り、長さ上限で丸める","status":"done","status_label":"実装済み"},{"id":"SB-25-013","category":"制作指示書・編集ブリーフ","name":"内部リンク候補の提示","detail":"自社記事の関連度から3本まで、なぜ張るのかの理由つきで出す","status":"done","status_label":"実装済み"},{"id":"SB-25-014","category":"制作指示書・編集ブリーフ","name":"自社の一次データを出典表記ごと添付","detail":"他所に無い数字は検索でもAI検索でも効くため、引用形式のまま渡す","status":"done","status_label":"実装済み"},{"id":"SB-25-015","category":"制作指示書・編集ブリーフ","name":"表現の制約を既定で載せる","detail":"断定回避・数値の出典・1文の長さ・見出し20字など、毎回書かせる指示を定型化","status":"done","status_label":"実装済み"},{"id":"SB-25-016","category":"制作指示書・編集ブリーフ","name":"指示書の根拠を明示","detail":"SERP由来か雛形由来かを区別して書く。材料が無い項目は黙って省く","status":"done","status_label":"実装済み"},{"id":"SB-25-017","category":"制作指示書・編集ブリーフ","name":"Markdownで丸ごと渡せる","detail":"外部の書き手にそのまま送れる1枚。どの編集ツールにも貼れる","status":"done","status_label":"実装済み"},{"id":"SB-25-018","category":"制作指示書・編集ブリーフ","name":"キーワード台帳との連携","detail":"台帳にある語なら意図と既存記事の紐付けを引き継ぐ","status":"done","status_label":"実装済み"},{"id":"SB-25-019","category":"制作指示書・編集ブリーフ","name":"指示書の保存・一覧・削除","detail":"作った指示書をキーで保管し、あとから開き直せる","status":"done","status_label":"実装済み"},{"id":"SB-25-020","category":"制作指示書・編集ブリーフ","name":"原稿と指示書の照合","detail":"書き上がった原稿に、話題の抜け・未回答の質問・張り忘れた内部リンク・分量不足が無いか照合する","status":"done","status_label":"実装済み"},{"id":"SB-26-001","category":"コンテンツ棚卸し・リライト判断","name":"全記事の仕分け","detail":"そのまま/改稿/更新/統合/削除検討/様子見/判断不能 の7つに振り分ける","status":"done","status_label":"実装済み"},{"id":"SB-26-002","category":"コンテンツ棚卸し・リライト判断","name":"判断には必ず理由を添える","detail":"結論だけでは人が検証できないため、根拠を日本語で列挙する","status":"done","status_label":"実装済み"},{"id":"SB-26-003","category":"コンテンツ棚卸し・リライト判断","name":"公開直後の記事は評価しない","detail":"公開90日未満は「様子見」に固定する（順位が付く前に消させない）","status":"done","status_label":"実装済み"},{"id":"SB-26-004","category":"コンテンツ棚卸し・リライト判断","name":"公開日が無い記事は判断不能にする","detail":"鮮度が測れないものを無理に判断せず、publish_at の設定を促す","status":"done","status_label":"実装済み"},{"id":"SB-26-005","category":"コンテンツ棚卸し・リライト判断","name":"重複から統合を提案","detail":"本文の類似度がしきい値を超えた組を検出し、食い合う前に統合を勧める","status":"done","status_label":"実装済み"},{"id":"SB-26-006","category":"コンテンツ棚卸し・リライト判断","name":"4〜20位の記事を改稿の最優先に","detail":"1ページ目まであと一歩の記事は、改稿の費用対効果が最も高い","status":"done","status_label":"実装済み"},{"id":"SB-26-007","category":"コンテンツ棚卸し・リライト判断","name":"1年以上前の記事を成果で振り分け","detail":"成果が出ていれば更新、出ていなければ削除検討に回す","status":"done","status_label":"実装済み"},{"id":"SB-26-008","category":"コンテンツ棚卸し・リライト判断","name":"流入も被リンクも無い記事の抽出","detail":"消す前に狙う語が合っているかを確認する、という但し書きつきで出す","status":"done","status_label":"実装済み"},{"id":"SB-26-009","category":"コンテンツ棚卸し・リライト判断","name":"閲覧数は全体分布で相対評価","detail":"35パーセンタイルを基準にする（絶対値のしきい値はサイト規模で意味が変わる）","status":"done","status_label":"実装済み"},{"id":"SB-26-010","category":"コンテンツ棚卸し・リライト判断","name":"内部被リンク数を判断材料に","detail":"どこからも張られていない記事を見つけ、関連記事から繋ぐよう促す","status":"done","status_label":"実装済み"},{"id":"SB-26-011","category":"コンテンツ棚卸し・リライト判断","name":"記事診断スコアを判断材料に","detail":"改稿対象の記事について、まだ潰せる指摘が残っているかを添える","status":"done","status_label":"実装済み"},{"id":"SB-26-012","category":"コンテンツ棚卸し・リライト判断","name":"順位を判断材料に","detail":"その記事URLで取れている語の平均順位を計算して使う","status":"done","status_label":"実装済み"},{"id":"SB-26-013","category":"コンテンツ棚卸し・リライト判断","name":"Search Console のクリックを判断材料に","detail":"接続されていれば検索流入の実数を取り込む","status":"done","status_label":"実装済み"},{"id":"SB-26-014","category":"コンテンツ棚卸し・リライト判断","name":"本文が短い記事に加点","detail":"800字未満は検索意図を満たしきれていない可能性として優先度を上げる","status":"done","status_label":"実装済み"},{"id":"SB-26-015","category":"コンテンツ棚卸し・リライト判断","name":"優先度順に並べる","detail":"上から順に手を付ければよい状態にする","status":"done","status_label":"実装済み"},{"id":"SB-26-016","category":"コンテンツ棚卸し・リライト判断","name":"計測が無いことを隠さない","detail":"計測データが無いときは、流入に基づく判断ができていないと明記する","status":"done","status_label":"実装済み"},{"id":"SB-26-017","category":"コンテンツ棚卸し・リライト判断","name":"提案までで実行しない","detail":"削除は取り返しがつかないため、棚卸しは記事にもDBにも一切書き込まない","status":"done","status_label":"実装済み"},{"id":"SB-26-018","category":"コンテンツ棚卸し・リライト判断","name":"人の判断を記録する","detail":"各記事に対する結論と補足を残し、取り消せる","status":"done","status_label":"実装済み"},{"id":"SB-26-019","category":"コンテンツ棚卸し・リライト判断","name":"未処理の仕分けだけ抽出","detail":"判断済みと「そのまま/様子見」を除いた、手を動かすべき一覧を出す","status":"done","status_label":"実装済み"},{"id":"SB-26-020","category":"コンテンツ棚卸し・リライト判断","name":"棚卸し画面","detail":"仕分け・理由・材料の有無を1画面で見せ、一括操作へ渡せる","status":"done","status_label":"実装済み"},{"id":"SB-27-001","category":"用語集・エンティティ","name":"用語ページの公開","detail":"1語1ページ。「〇〇とは」で検索する人の入口になる","status":"done","status_label":"実装済み"},{"id":"SB-27-002","category":"用語集・エンティティ","name":"用語集の索引ページ","detail":"登録した全用語を一覧で公開する","status":"done","status_label":"実装済み"},{"id":"SB-27-003","category":"用語集・エンティティ","name":"記事本文から用語候補を抽出","detail":"「〇〇とは、…です」の形を拾い、定義文ごと候補にする","status":"done","status_label":"実装済み"},{"id":"SB-27-004","category":"用語集・エンティティ","name":"ひらがな終わりの断片を除外","detail":"「やることは」から「やるこ」を拾ってしまう類の誤検出を落とす","status":"done","status_label":"実装済み"},{"id":"SB-27-005","category":"用語集・エンティティ","name":"指示語の除去","detail":"「この構造化データ」から「構造化データ」を取り出す","status":"done","status_label":"実装済み"},{"id":"SB-27-006","category":"用語集・エンティティ","name":"用語スラッグの自動生成","detail":"日本語の語からもURLに使える識別子を作る","status":"done","status_label":"実装済み"},{"id":"SB-27-007","category":"用語集・エンティティ","name":"短すぎる定義の登録を拒否","detail":"その語を知らない人に通じない定義は、理由を返して受け付けない","status":"done","status_label":"実装済み"},{"id":"SB-27-008","category":"用語集・エンティティ","name":"DefinedTerm 構造化データ","detail":"用語ページに機械可読な定義を出す","status":"done","status_label":"実装済み"},{"id":"SB-27-009","category":"用語集・エンティティ","name":"DefinedTermSet 構造化データ","detail":"索引ページを用語集として認識させる","status":"done","status_label":"実装済み"},{"id":"SB-27-010","category":"用語集・エンティティ","name":"FAQ形式への変換","detail":"用語をそのままFAQPageのエントリとして使える形にする","status":"done","status_label":"実装済み"},{"id":"SB-27-011","category":"用語集・エンティティ","name":"用語と記事の相互紐付け","detail":"その語に触れている記事を自動で見つけ、双方向の導線にする","status":"done","status_label":"実装済み"},{"id":"SB-27-012","category":"用語集・エンティティ","name":"本文の初出だけ自動リンク","detail":"同じ語を何度もリンクにすると雑音になるため、1本文につき1回","status":"done","status_label":"実装済み"},{"id":"SB-27-013","category":"用語集・エンティティ","name":"書き換えてはいけない箇所を保護","detail":"見出し・コードブロック・インラインコード・既存リンクには触れない","status":"done","status_label":"実装済み"},{"id":"SB-27-014","category":"用語集・エンティティ","name":"自動リンク数の上限","detail":"1本文あたりのリンク数を制限し、リンクだらけの本文を作らない","status":"done","status_label":"実装済み"},{"id":"SB-27-015","category":"用語集・エンティティ","name":"カバレッジの可視化","detail":"登録数・記事に紐付いた数・未登録の候補数を出す","status":"done","status_label":"実装済み"},{"id":"SB-27-016","category":"用語集・エンティティ","name":"候補の一括登録","detail":"抽出した候補をまとめて用語集に取り込む","status":"done","status_label":"実装済み"},{"id":"SB-27-017","category":"用語集・エンティティ","name":"用語集の管理画面","detail":"候補・登録済み・紐付き状況を1画面で扱う","status":"done","status_label":"実装済み"},{"id":"SB-27-018","category":"用語集・エンティティ","name":"用語ページから記事への導線","detail":"その語を扱う自社記事と、隣接する用語を並べる","status":"done","status_label":"実装済み"},{"id":"SB-27-019","category":"用語集・エンティティ","name":"基盤が扱う概念の説明を同梱","detail":"canonical・重複コンテンツ・強調スニペット・E-E-A-T など30語を、この製品での効き方まで書いた定義付きで最初から用意する","status":"done","status_label":"実装済み"},{"id":"SB-27-020","category":"用語集・エンティティ","name":"足りない語だけを追加する起動処理","detail":"既にある語には触れない。人が書き直した定義が起動のたびに戻されない","status":"done","status_label":"実装済み"},{"id":"SB-27-021","category":"用語集・エンティティ","name":"日本語の用語でもslugが衝突しない","detail":"英字だけ抜くと「AIによる〜」と「AI活用の〜」が同じURLになる。語を代表していない場合は語ごとの印を足す","status":"done","status_label":"実装済み"},{"id":"SB-27-022","category":"用語集・エンティティ","name":"別の用語による上書きを拒否","detail":"同じ slug に違う用語を登録しようとしたら、既存の用語名を添えて止める","status":"done","status_label":"実装済み"},{"id":"SB-27-023","category":"用語集・エンティティ","name":"伏字を用語にしない","detail":"「〇〇とは」は説明のための例であって用語ではない。候補から外す","status":"done","status_label":"実装済み"},{"id":"SB-27-024","category":"用語集・エンティティ","name":"片括弧の語を弾く","detail":"「AI検索最適化（LLMO」のように閉じ括弧の手前で切れた語は、見出しにもURLにも使えない","status":"done","status_label":"実装済み"},{"id":"SB-27-025","category":"用語集・エンティティ","name":"ほぼ同じ用語を2枚作らない","detail":"括弧の外と中を同じ部品として並べ替えて比べる。似た用語ページが並ぶと互いに食い合う","status":"done","status_label":"実装済み"},{"id":"SB-27-026","category":"用語集・エンティティ","name":"別名も既知として扱う","detail":"登録済み用語の別名に当たる語を、記事本文から再び拾わない","status":"done","status_label":"実装済み"},{"id":"SB-28-001","category":"一括運用","name":"12種類の一括操作","detail":"タグ・カテゴリ・CTA・配信先・fallback・ワークフロー・再配信・撤回・アーカイブ","status":"done","status_label":"実装済み"},{"id":"SB-28-002","category":"一括運用","name":"既定は dry-run","detail":"実行の前に、何がどう変わるかだけを返す","status":"done","status_label":"実装済み"},{"id":"SB-28-003","category":"一括運用","name":"変更前後を1件ずつ提示","detail":"対象記事ごとに、どの項目が何から何になるかを見せる","status":"done","status_label":"実装済み"},{"id":"SB-28-004","category":"一括運用","name":"危険な操作は確認トークン必須","detail":"外部に出るもの・取り返しがつかないものは、計画時に発行したトークン無しでは実行しない","status":"done","status_label":"実装済み"},{"id":"SB-28-005","category":"一括運用","name":"確認トークンは一度きり","detail":"使ったトークンは即座に失効し、同じ計画を二度流せない","status":"done","status_label":"実装済み"},{"id":"SB-28-006","category":"一括運用","name":"1件の失敗で全体を落とさない","detail":"計画作成中の例外は対象1件のスキップとして記録し、残りは進める","status":"done","status_label":"実装済み"},{"id":"SB-28-007","category":"一括運用","name":"変化しない対象を理由つきで除外","detail":"既に付いているタグなどは「変化がありません」として計画から外す","status":"done","status_label":"実装済み"},{"id":"SB-28-008","category":"一括運用","name":"未知の操作を拒否","detail":"定義されていない操作名は、使える一覧を添えて弾く","status":"done","status_label":"実装済み"},{"id":"SB-28-009","category":"一括運用","name":"タグで絞る","detail":"指定タグを持つ記事だけを対象にする","status":"done","status_label":"実装済み"},{"id":"SB-28-010","category":"一括運用","name":"カテゴリで絞る","detail":"指定カテゴリの記事だけを対象にする","status":"done","status_label":"実装済み"},{"id":"SB-28-011","category":"一括運用","name":"記事を名指しで絞る","detail":"slug の列挙で対象を確定させる","status":"done","status_label":"実装済み"},{"id":"SB-28-012","category":"一括運用","name":"本文・タイトルの語で絞る","detail":"特定の表記を含む記事だけを一括で直せる","status":"done","status_label":"実装済み"},{"id":"SB-28-013","category":"一括運用","name":"文字数で絞る","detail":"上限・下限を指定して、短い記事だけをまとめて扱う","status":"done","status_label":"実装済み"},{"id":"SB-28-014","category":"一括運用","name":"棚卸しの結果で絞る","detail":"「削除検討」と判定された記事だけ、のような選び方ができる","status":"done","status_label":"実装済み"},{"id":"SB-28-015","category":"一括運用","name":"絞り込み条件はすべてAND","detail":"条件を足すほど対象が狭まる、予測できる挙動にする","status":"done","status_label":"実装済み"},{"id":"SB-28-016","category":"一括運用","name":"記事JSONへの実書き込み","detail":"タグ・カテゴリ・CTA・配信先・fallback は実ファイルを書き換える","status":"done","status_label":"実装済み"},{"id":"SB-28-017","category":"一括運用","name":"ワークフロー状態と担当の一括変更","detail":"承認フローの状態遷移と担当割り当てをまとめて動かす","status":"done","status_label":"実装済み"},{"id":"SB-28-018","category":"一括運用","name":"再配信・撤回の一括実行","detail":"外部媒体に対する操作。トークン確認を通ったときだけ走る","status":"done","status_label":"実装済み"},{"id":"SB-28-019","category":"一括運用","name":"実行結果を監査ログに残す","detail":"誰が何件を成功・失敗させたかを後から追える","status":"done","status_label":"実装済み"},{"id":"SB-28-020","category":"一括運用","name":"一括操作の管理画面","detail":"使える操作・絞り込み・対象記事を1画面で確認できる","status":"done","status_label":"実装済み"},{"id":"SB-29-001","category":"サイト内検索・追加導線","name":"サイト内検索","detail":"タイトル・抜粋・タグに加えて本文まで検索する","status":"done","status_label":"実装済み"},{"id":"SB-29-002","category":"サイト内検索・追加導線","name":"用語も横断して検索","detail":"記事に無くても用語集に説明があれば、それを先に見せる","status":"done","status_label":"実装済み"},{"id":"SB-29-003","category":"サイト内検索・追加導線","name":"0件のときはそう言う","detail":"空の一覧を返さず、別の言葉を試す案内と記事一覧・用語集への導線を出す","status":"done","status_label":"実装済み"},{"id":"SB-29-004","category":"サイト内検索・追加導線","name":"検索結果ページの noindex","detail":"検索結果ページ自体が検索に載ると低品質ページとして扱われるため除外する","status":"done","status_label":"実装済み"},{"id":"SB-29-005","category":"サイト内検索・追加導線","name":"カテゴリ別RSS","detail":"興味のあるカテゴリだけを購読できる","status":"done","status_label":"実装済み"},{"id":"SB-29-006","category":"サイト内検索・追加導線","name":"タグ別RSS","detail":"興味のあるタグだけを購読できる","status":"done","status_label":"実装済み"},{"id":"SB-29-007","category":"サイト内検索・追加導線","name":"該当0件のフィードは404を返す","detail":"空のRSSを配って購読させない","status":"done","status_label":"実装済み"},{"id":"SB-29-008","category":"サイト内検索・追加導線","name":"著者ページ","detail":"誰が書いたかを1ページにまとめる（E-E-A-T の土台）","status":"done","status_label":"実装済み"},{"id":"SB-29-009","category":"サイト内検索・追加導線","name":"著者の Person 構造化データ","detail":"肩書き・経歴・所属を機械可読で出す","status":"done","status_label":"実装済み"},{"id":"SB-29-010","category":"サイト内検索・追加導線","name":"執筆記事と監修記事を分けて表示","detail":"書いた記事と監修した記事は意味が違うため、同じ扱いにしない","status":"done","status_label":"実装済み"},{"id":"SB-29-011","category":"サイト内検索・追加導線","name":"中身の無い索引ページを出さない","detail":"用語が1語も無いときは、用語集をsitemapに載せない","status":"done","status_label":"実装済み"},{"id":"SB-30-001","category":"記事エディタ・版管理","name":"コンソールから記事を書ける","detail":"記事JSONを手でディレクトリに置かなくても、画面から新規作成できる","status":"done","status_label":"実装済み"},{"id":"SB-30-002","category":"記事エディタ・版管理","name":"制作指示書から下書きを起こす","detail":"指示書の構成をH2として先に置いた状態で書き始められる","status":"done","status_label":"実装済み"},{"id":"SB-30-003","category":"記事エディタ・版管理","name":"打鍵しながら診断が回る","detail":"保存しなくてもその場で診断する。書き終えてから別画面で診るのでは直さない","status":"done","status_label":"実装済み"},{"id":"SB-30-004","category":"記事エディタ・版管理","name":"診断の指摘をエディタ内に出す","detail":"深刻度つきの指摘と、直し方の手がかりを本文の隣に並べる","status":"done","status_label":"実装済み"},{"id":"SB-30-005","category":"記事エディタ・版管理","name":"見出し構造の可視化","detail":"H2〜H6の入れ子を字下げで見せ、構成の崩れをその場で気付けるようにする","status":"done","status_label":"実装済み"},{"id":"SB-30-006","category":"記事エディタ・版管理","name":"階層の飛びを指摘","detail":"H2の次にH4が来るような飛びを、書いている最中に指摘する","status":"done","status_label":"実装済み"},{"id":"SB-30-007","category":"記事エディタ・版管理","name":"タイトル・slug・メタ説明・抜粋・タグ・カテゴリの編集","detail":"配信と公開面が使う項目を1画面で埋められる","status":"done","status_label":"実装済み"},{"id":"SB-30-008","category":"記事エディタ・版管理","name":"下書き / 公開の切り替え","detail":"書きかけを公開面に出さないまま保存できる","status":"done","status_label":"実装済み"},{"id":"SB-30-009","category":"記事エディタ・版管理","name":"保存のたびに直前の版を控える","detail":"上書きで失うものを作らない。リライトは前と比べられないと判断できない","status":"done","status_label":"実装済み"},{"id":"SB-30-010","category":"記事エディタ・版管理","name":"版の上限と古い版の破棄","detail":"1記事30版まで。古いものから落とし、DBが記事の何十倍にもならないようにする","status":"done","status_label":"実装済み"},{"id":"SB-30-011","category":"記事エディタ・版管理","name":"変更が無ければ版を作らない","detail":"保存ボタンを二度押しただけで履歴が埋まる、を避ける","status":"done","status_label":"実装済み"},{"id":"SB-30-012","category":"記事エディタ・版管理","name":"保存メモ","detail":"何を直したかを1行残せる。あとで版を選ぶときの手がかりになる","status":"done","status_label":"実装済み"},{"id":"SB-30-013","category":"記事エディタ・版管理","name":"保存履歴の一覧","detail":"版ごとの日時・メモ・文字数・診断スコアを並べる","status":"done","status_label":"実装済み"},{"id":"SB-30-014","category":"記事エディタ・版管理","name":"版どうしの本文差分","detail":"行単位の差分（unified diff）で、何を足して何を消したかを見せる","status":"done","status_label":"実装済み"},{"id":"SB-30-015","category":"記事エディタ・版管理","name":"項目の変化も差分に出す","detail":"本文だけでなく、タイトル・カテゴリ・タグ・状態の変化も並べる","status":"done","status_label":"実装済み"},{"id":"SB-30-016","category":"記事エディタ・版管理","name":"古い版に戻す","detail":"1クリックで以前の内容に戻せる","status":"done","status_label":"実装済み"},{"id":"SB-30-017","category":"記事エディタ・版管理","name":"戻す前の状態も版として残す","detail":"戻し過ぎを取り消せる。取り消せない操作は怖くて使われない","status":"done","status_label":"実装済み"},{"id":"SB-30-018","category":"記事エディタ・版管理","name":"記事の複製","detail":"同じ構成で別記事を起こす。下書きとして作り、公開日とcanonicalは引き継がない","status":"done","status_label":"実装済み"},{"id":"SB-30-019","category":"記事エディタ・版管理","name":"削除しても版は残る","detail":"ファイルは消えるが中身はDBに残り、あとから復元できる","status":"done","status_label":"実装済み"},{"id":"SB-30-020","category":"記事エディタ・版管理","name":"削除には slug の入力を要求","detail":"確認ダイアログの押し間違いでは消えない","status":"done","status_label":"実装済み"},{"id":"SB-30-021","category":"記事エディタ・版管理","name":"保存前のスキーマ検証","detail":"pydanticで検証し、どの項目がなぜ駄目かを日本語で返す。壊れたJSONを書いてから気付く順番にしない","status":"done","status_label":"実装済み"},{"id":"SB-30-022","category":"記事エディタ・版管理","name":"パストラバーサルの拒否","detail":"slug に `../` や `/` を含む書き込みを、ファイルに触れる前に弾く","status":"done","status_label":"実装済み"},{"id":"SB-30-023","category":"記事エディタ・版管理","name":"保存後に記事ライブラリを読み直す","detail":"書いたのに一覧にも公開面にも出ない、という状態を作らない","status":"done","status_label":"実装済み"},{"id":"SB-30-024","category":"記事エディタ・版管理","name":"記事の生JSONを取得","detail":"エディタが読み込む元データをそのまま返す","status":"done","status_label":"実装済み"},{"id":"SB-31-001","category":"コンソールの書き込み経路","name":"運用キーをタブにだけ保持","detail":"sessionStorage に置き、サーバにも localStorage にも残さない。タブを閉じれば消える","status":"done","status_label":"実装済み"},{"id":"SB-31-002","category":"コンソールの書き込み経路","name":"キーの状態を常時表示","detail":"設定済み / 未設定 / 鍵不要 を右上に出す。押せないボタンの理由が分かる","status":"done","status_label":"実装済み"},{"id":"SB-31-003","category":"コンソールの書き込み経路","name":"401のときに次の手を示す","detail":"「無効です」で終わらせず、どこにキーを入れればよいかを書く","status":"done","status_label":"実装済み"},{"id":"SB-31-004","category":"コンソールの書き込み経路","name":"鍵が不要な環境ではそう言う","detail":"キーを1本も発行していない開発環境では「鍵なしで書けます」と表示する","status":"done","status_label":"実装済み"},{"id":"SB-31-005","category":"コンソールの書き込み経路","name":"実行中はボタンを止める","detail":"二重送信を防ぎ、待っていることが分かる状態にする","status":"done","status_label":"実装済み"},{"id":"SB-31-006","category":"コンソールの書き込み経路","name":"結果を必ず画面に返す","detail":"成功も失敗も同じ場所に出す。押したのに何も起きない、を作らない","status":"done","status_label":"実装済み"},{"id":"SB-31-007","category":"コンソールの書き込み経路","name":"フォーム直POSTの廃止","detail":"<form> はヘッダを付けられず、鍵が要る環境で黙って401になっていた。fetch に寄せた","status":"done","status_label":"実装済み"},{"id":"SB-32-001","category":"製品サイトの説明責任","name":"運用の一周を1ページで説明","detail":"決める・書く・出す・測る・畳む の全体像。製品サイトが配信エンジンの話しかしていなかった","status":"done","status_label":"実装済み"},{"id":"SB-32-002","category":"製品サイトの説明責任","name":"各工程から実際の画面へ繋ぐ","detail":"説明した機能を、その場でコンソールの該当画面から試せる","status":"done","status_label":"実装済み"},{"id":"SB-32-003","category":"製品サイトの説明責任","name":"設計上の判断を理由ごと書く","detail":"「なぜ75パーセンタイルで見るのか」「なぜ棚卸しは実行しないのか」まで公開面に書く","status":"done","status_label":"実装済み"},{"id":"SB-32-004","category":"製品サイトの説明責任","name":"APIドキュメントに書く・畳むを追加","detail":"指示書・エディタ・版・棚卸し・用語集・一括操作のエンドポイントを一覧に載せる","status":"done","status_label":"実装済み"},{"id":"SB-32-005","category":"製品サイトの説明責任","name":"カタログ件数を全ページで動的に","detail":"機能を足すたびに古い数字が残る箇所を無くす","status":"done","status_label":"実装済み"},{"id":"SB-32-006","category":"製品サイトの説明責任","name":"運用の一周を sitemap に載せる","detail":"製品の全体像を説明するページを索引対象にする","status":"done","status_label":"実装済み"},{"id":"SB-33-001","category":"既存記事の取り込み","name":"WordPressのREST APIから取り込む","detail":"/wp-json/wp/v2/posts を辿る。公開記事なら認証不要","status":"done","status_label":"実装済み"},{"id":"SB-33-002","category":"既存記事の取り込み","name":"RSS / Atom フィードから取り込む","detail":"content:encoded があれば本文ごと、無ければ要約だけを取る","status":"done","status_label":"実装済み"},{"id":"SB-33-003","category":"既存記事の取り込み","name":"記事JSONの配列から取り込む","detail":"他所からの移行で最も確実な経路。HTMLでもMarkdownでも受ける","status":"done","status_label":"実装済み"},{"id":"SB-33-004","category":"既存記事の取り込み","name":"フロントマター付きMarkdownから取り込む","detail":"title / date / tags / slug を読み、無ければH1をタイトルにする","status":"done","status_label":"実装済み"},{"id":"SB-33-005","category":"既存記事の取り込み","name":"HTMLをMarkdownに変換","detail":"見出し・リンク・画像のalt・強調・箇条書き・引用・コードを保つ","status":"done","status_label":"実装済み"},{"id":"SB-33-006","category":"既存記事の取り込み","name":"変換できないタグは中身を残す","detail":"タグごと消すと本文が痩せ、文字数も見出し数も狂って診断が誤警告する","status":"done","status_label":"実装済み"},{"id":"SB-33-007","category":"既存記事の取り込み","name":"scriptとstyleは中身ごと落とす","detail":"本文でないものが文字数に混ざらないようにする","status":"done","status_label":"実装済み"},{"id":"SB-33-008","category":"既存記事の取り込み","name":"URLからslugを作る","detail":"パスの末尾を使う。クエリ文字列のURLでも、同じURLなら同じslugになる","status":"done","status_label":"実装済み"},{"id":"SB-33-009","category":"既存記事の取り込み","name":"取り込んだ記事は公開済みとして入る","detail":"元URLを正規URLに設定する。下書きとして入れると転載元を名乗れない","status":"done","status_label":"実装済み"},{"id":"SB-33-010","category":"既存記事の取り込み","name":"自社配信先への公開済み記録","detail":"「その記事は既にそこに出ている」と記録し、次の配信で二重投稿にならないようにする","status":"done","status_label":"実装済み"},{"id":"SB-33-011","category":"既存記事の取り込み","name":"既にあるslugは上書きしない","detail":"取り込みは足すだけの操作にする","status":"done","status_label":"実装済み"},{"id":"SB-33-012","category":"既存記事の取り込み","name":"同じ取り込みの中の重複も検出","detail":"2本が同じslugになる場合、片方だけを入れる","status":"done","status_label":"実装済み"},{"id":"SB-33-013","category":"既存記事の取り込み","name":"中身の無い記事は入れない","detail":"タイトルか本文が空のものは、理由を添えて飛ばす。空のページが増えるほうが害が大きい","status":"done","status_label":"実装済み"},{"id":"SB-33-014","category":"既存記事の取り込み","name":"1本の失敗で全体を止めない","detail":"落ちた記事だけ理由つきで残し、残りは取り込む","status":"done","status_label":"実装済み"},{"id":"SB-33-015","category":"既存記事の取り込み","name":"取り込む前に気になる点を出す","detail":"本文が短い・元URLが無い・公開日が無い、を1件ずつ並べる","status":"done","status_label":"実装済み"},{"id":"SB-33-016","category":"既存記事の取り込み","name":"既定は下見（dry-run）","detail":"何が入り、何が飛ばされるかを先に全部見せる","status":"done","status_label":"実装済み"},{"id":"SB-33-017","category":"既存記事の取り込み","name":"取り込み元が落ちていたら理由を返す","detail":"0件でなく、接続できなかった・APIが無効・item が無い、を区別して返す","status":"done","status_label":"実装済み"},{"id":"SB-33-018","category":"既存記事の取り込み","name":"取り込み画面","detail":"サイトからの取り込みと、貼り付けからの取り込みを1画面で扱う","status":"done","status_label":"実装済み"},{"id":"SB-34-001","category":"自社メディアの運用実績","name":"この基盤自身のブログを載せている","detail":"SEOBuilder のサイト自体が、この基盤の記事ライブラリで動いている","status":"done","status_label":"実装済み"},{"id":"SB-34-002","category":"自社メディアの運用実績","name":"全記事が自分の診断で警告ゼロ","detail":"9本すべてが自前の診断で97〜100点、error / warn ともに0件","status":"done","status_label":"実装済み"},{"id":"SB-34-003","category":"自社メディアの運用実績","name":"記事どうしを内部リンクで束ねている","detail":"棚卸し・制作指示書・強調スニペット・内部リンク・AI検索・記事移行を相互に繋ぐ","status":"done","status_label":"実装済み"},{"id":"SB-34-004","category":"自社メディアの運用実績","name":"用語集から記事へ、記事から用語集へ","detail":"本文中の用語が用語ページへ、用語ページがその語を扱う記事へ繋がる","status":"done","status_label":"実装済み"},{"id":"SB-34-005","category":"自社メディアの運用実績","name":"数値には出典か、自社の基準であることを明記","detail":"外部の調査結果でないものを、調査結果のように書かない","status":"done","status_label":"実装済み"},{"id":"SB-34-006","category":"自社メディアの運用実績","name":"媒体別の別原稿と短文を用意している","detail":"Qiita向けの技術記事、LinkedIn・X向けの短文を記事JSONに持つ","status":"done","status_label":"実装済み"},{"id":"SB-35-001","category":"共有されたときの見え方","name":"SNSが描けるPNGのアイキャッチ","detail":"SVGの og:image は Facebook / X / LINE / LinkedIn / Slack のどれも描画しない","status":"done","status_label":"実装済み"},{"id":"SB-35-002","category":"共有されたときの見え方","name":"ページごとに別の画像","detail":"全ページで同じ静的画像だと、共有されたときにどの記事か分からない","status":"done","status_label":"実装済み"},{"id":"SB-35-003","category":"共有されたときの見え方","name":"日本語を実寸で折り返す","detail":"日本語は単語の切れ目が無いので、1文字ずつ幅を測って折り返す","status":"done","status_label":"実装済み"},{"id":"SB-35-004","category":"共有されたときの見え方","name":"行数に応じて字を詰める","detail":"長いタイトルでも枠から溢れず、短いタイトルでは大きく出る","status":"done","status_label":"実装済み"},{"id":"SB-35-005","category":"共有されたときの見え方","name":"サイトの配色で描く","detail":"上端のグラデーションはサイトのトークンと同じ3色","status":"done","status_label":"実装済み"},{"id":"SB-35-006","category":"共有されたときの見え方","name":"robots.txt が拒否しない場所に置く","detail":"/v1 の下に置くとSNSのクローラが取りに来られず、画像だけ空になる","status":"done","status_label":"実装済み"},{"id":"SB-35-007","category":"共有されたときの見え方","name":"ETagと長期キャッシュ","detail":"同じ引数なら中身が変わらないので、再生成も再送信もしない","status":"done","status_label":"実装済み"},{"id":"SB-35-008","category":"共有されたときの見え方","name":"画像の寸法を宣言する","detail":"og:image:width / height / alt を出し、読み込み前から枠が決まる","status":"done","status_label":"実装済み"},{"id":"SB-35-009","category":"共有されたときの見え方","name":"コンテナに日本語フォントを入れる","detail":"IPAゴシック。ローカルのフォントに依存させず、本番で文字化けさせない","status":"done","status_label":"実装済み"},{"id":"SB-35-010","category":"共有されたときの見え方","name":"描けないときは何を入れればよいか言う","detail":"黙って空を返さず、フォントが無いことと代わりに使えるSVG版を案内する","status":"done","status_label":"実装済み"},{"id":"SB-35-011","category":"共有されたときの見え方","name":"記事にカバー画像があればそれを使う","detail":"自動生成は、指定が無いときの既定として働く","status":"done","status_label":"実装済み"},{"id":"SB-36-001","category":"正規URLの食い違い検査","name":"HTTPヘッダの正規URLを読む","detail":"Link: rel=canonical は HTML の指定と同じ強さで読まれる。取得しないと分からない","status":"done","status_label":"実装済み"},{"id":"SB-36-002","category":"正規URLの食い違い検査","name":"ヘッダとHTMLの食い違いを error にする","detail":"ホスティングやCDNが付けたヘッダは、正しく書いたHTMLを打ち消す","status":"done","status_label":"実装済み"},{"id":"SB-36-003","category":"正規URLの食い違い検査","name":"HTMLに canonical が2本ある状態を検出","detail":"複数あるとどれも信用されない","status":"done","status_label":"実装済み"},{"id":"SB-36-004","category":"正規URLの食い違い検査","name":"正規URLが1本も無い状態を検出","detail":"自己参照の canonical が抜けているページを見つける","status":"done","status_label":"実装済み"},{"id":"SB-36-005","category":"正規URLの食い違い検査","name":"別ページを指す canonical は info に留める","detail":"転載ページなら正しい設定なので、一律に error にしない","status":"done","status_label":"実装済み"},{"id":"SB-36-006","category":"正規URLの食い違い検査","name":"末尾スラッシュとスキームの違いは同一とみなす","detail":"実質同じURLを食い違いと誤検出しない","status":"done","status_label":"実装済み"},{"id":"SB-36-007","category":"正規URLの食い違い検査","name":"任意のURLを外から調べられる","detail":"自社サイトでなくても、取得できるURLなら検査できる","status":"done","status_label":"実装済み"},{"id":"SB-36-008","category":"正規URLの食い違い検査","name":"画面を開くだけでは外に出ない","detail":"押したときだけ取得する。画面表示のたびに外部へ通信しない","status":"done","status_label":"実装済み"},{"id":"SB-36-009","category":"正規URLの食い違い検査","name":"届かないURLは理由を返す","detail":"落ちずに、何が起きたかを返す","status":"done","status_label":"実装済み"},{"id":"SB-37-001","category":"ブランド表示","name":"明るい背景用と暗い背景用のロゴを持つ","detail":"白地に白文字、黒地に黒文字のロゴを置かない","status":"done","status_label":"実装済み"},{"id":"SB-37-002","category":"ブランド表示","name":"ヘッダ用の横並びロックアップ","detail":"縦積みのままヘッダの高さに縮めると、社名も肩書きも読めなくなる","status":"done","status_label":"実装済み"},{"id":"SB-37-003","category":"ブランド表示","name":"フッタは縦積みのロックアップ","detail":"横幅に余裕がある場所では、元の組みのまま大きく置く","status":"done","status_label":"実装済み"},{"id":"SB-37-004","category":"ブランド表示","name":"マーク単体の切り出し","detail":"文字が入らない狭い場所と、アイコン類に使う","status":"done","status_label":"実装済み"},{"id":"SB-37-005","category":"ブランド表示","name":"背景を透過で持つ","detail":"白背景のまま置くと、暗い画面で白い四角が浮く","status":"done","status_label":"実装済み"},{"id":"SB-37-006","category":"ブランド表示","name":"ファビコンとホーム画面アイコン","detail":"16/32/48 の .ico、192・512 の PNG、180 の apple-touch-icon","status":"done","status_label":"実装済み"},{"id":"SB-37-007","category":"ブランド表示","name":"アイキャッチにロゴを載せる","detail":"共有されたときに、どこの記事かがひと目で分かる","status":"done","status_label":"実装済み"},{"id":"SB-37-008","category":"ブランド表示","name":"ロゴが読めなくてもアイキャッチは出る","detail":"画像が見つからなければ文字だけで組み、生成そのものは止めない","status":"done","status_label":"実装済み"},{"id":"SB-37-009","category":"ブランド表示","name":"配布先の容量制限に収める","detail":"Hugging Face は大きい2値ファイルの push を拒否する。全画像を100KB未満に保つ","status":"done","status_label":"実装済み"},{"id":"SB-38-001","category":"狭い画面での表示","name":"グリッドの列が中身より小さくなれる","detail":"`1fr` は minmax(auto,1fr) なので、中身が縮まないと列ごと親をはみ出す","status":"done","status_label":"実装済み"},{"id":"SB-38-002","category":"狭い画面での表示","name":"区切りの無い長い語を折り返す","detail":"「メール投稿（WordPress/Blogger/Tumblr/Ameba等）」が画面をはみ出していた","status":"done","status_label":"実装済み"},{"id":"SB-38-003","category":"狭い画面での表示","name":"見出しの大きさを画面幅に追従させる","detail":"下限を固定すると、狭い画面で日本語の見出しが1行に収まらない","status":"done","status_label":"実装済み"},{"id":"SB-38-004","category":"狭い画面での表示","name":"表はパネルの中だけで横に流す","detail":"ページ全体を横スクロールさせない","status":"done","status_label":"実装済み"},{"id":"SB-38-005","category":"狭い画面での表示","name":"横並びの入力を縦に積む","detail":"狭い画面では、並べるより積むほうが読める","status":"done","status_label":"実装済み"},{"id":"SB-38-006","category":"狭い画面での表示","name":"サイドバーのロゴが切れない","detail":"縦のflexの中では height だけだと縮む。ロゴが上下で切れていた","status":"done","status_label":"実装済み"},{"id":"SB-38-007","category":"狭い画面での表示","name":"320pxまで横スクロールが出ない","detail":"サイト・コンソールの主要34画面を 320 / 390 / 768px で実測","status":"done","status_label":"実装済み"},{"id":"SB-38-008","category":"狭い画面での表示","name":"指で押せる大きさを確保","detail":"ボタン・メニュー・単独リンクの当たり判定を40〜44pxにする","status":"done","status_label":"実装済み"},{"id":"SB-38-009","category":"狭い画面での表示","name":"iOSの自動拡大を止める","detail":"16px未満の入力にフォーカスすると画面が勝手に拡大する。狭い画面では16pxにする","status":"done","status_label":"実装済み"},{"id":"SB-38-010","category":"狭い画面での表示","name":"入力欄の指定を型の除外で書く","detail":"型を並べると url / email / number を足したとき素の見た目で残る。実際に input[type=url] だけ浮いていた","status":"done","status_label":"実装済み"},{"id":"SB-38-011","category":"狭い画面での表示","name":"ナビは引き出しにして状態を持つ","detail":"aria-expanded を出し、Escと外側タップで閉じ、画面が広がったら自動で閉じる","status":"done","status_label":"実装済み"},{"id":"SB-38-012","category":"狭い画面での表示","name":"コンソールの引き出しに背景を敷く","detail":"開いている間は背後を触れないようにし、外側を押すと閉じる","status":"done","status_label":"実装済み"},{"id":"SB-38-013","category":"狭い画面での表示","name":"引き出しのリンクを押したら閉じる","detail":"移動先の画面に引き出しが残らないようにする","status":"done","status_label":"実装済み"},{"id":"SB-38-014","category":"狭い画面での表示","name":"表は縮めずに横へ流す","detail":"縮めると1セル1文字ずつ折れて、かえって読めなくなる","status":"done","status_label":"実装済み"},{"id":"SB-38-015","category":"狭い画面での表示","name":"ボタンとバッジは折り返さない","detail":"折り返しを許すと、ボタンの文字が縦に1文字ずつ積まれる","status":"done","status_label":"実装済み"},{"id":"SB-38-016","category":"狭い画面での表示","name":"横に動かせることを見せる","detail":"表と図の右端をぼかして、続きがあることを伝える","status":"done","status_label":"実装済み"},{"id":"SB-38-017","category":"狭い画面での表示","name":"ヒーローのCTAを縦に積む","detail":"3つ並ぶと2+1に折れて不格好になる。幅を揃えて縦に積む","status":"done","status_label":"実装済み"},{"id":"SB-38-018","category":"狭い画面での表示","name":"狭い画面用の文字組み","detail":"見出し・本文・行間を画面幅に合わせ、余白を詰めて1画面あたりの情報量を保つ","status":"done","status_label":"実装済み"},{"id":"SB-39-001","category":"お問い合わせ","name":"公開サイトの問い合わせフォーム","detail":"名前・会社・メール・相談内容に加え、CMS / 運用媒体 / LINE / 記事本数を受け取る","status":"done","status_label":"実装済み"},{"id":"SB-39-002","category":"お問い合わせ","name":"届いた内容をメールで通知","detail":"既定の宛先は contact@ai-sns.io（環境変数 CONTACT_TO で変更できる）","status":"done","status_label":"実装済み"},{"id":"SB-39-003","category":"お問い合わせ","name":"保存が先、送信が後","detail":"SMTPが未設定でも落ちても、問い合わせそのものを失わない","status":"done","status_label":"実装済み"},{"id":"SB-39-004","category":"お問い合わせ","name":"送れていないものを送ったと言わない","detail":"訪問者には「受け付けた」と伝え、運用側には未送信として見せる","status":"done","status_label":"実装済み"},{"id":"SB-39-005","category":"お問い合わせ","name":"そのまま返信できる通知","detail":"Reply-To に送信者を入れるので、受け取った側は普通に返信すればよい","status":"done","status_label":"実装済み"},{"id":"SB-39-006","category":"お問い合わせ","name":"テキストとHTMLの両方を送る","detail":"どのメールソフトでも読める形にする","status":"done","status_label":"実装済み"},{"id":"SB-39-007","category":"お問い合わせ","name":"メールヘッダインジェクションを弾く","detail":"名前やメール欄に改行を通すと、宛先を勝手に足される","status":"done","status_label":"実装済み"},{"id":"SB-39-008","category":"お問い合わせ","name":"入力の不足は理由を返す","detail":"何が足りないかを日本語で返し、打ち間違いと機械投稿を区別する","status":"done","status_label":"実装済み"},{"id":"SB-39-009","category":"お問い合わせ","name":"見えない欄で自動投稿を落とす","detail":"CAPTCHAは入れない。訪問者の負担のわりに、取りこぼした問い合わせは戻らない","status":"done","status_label":"実装済み"},{"id":"SB-39-010","category":"お問い合わせ","name":"速すぎる送信を弾く","detail":"表示から数秒で送られたものは人の入力ではない","status":"done","status_label":"実装済み"},{"id":"SB-39-011","category":"お問い合わせ","name":"同一IPの連投を止める","detail":"止めるときは、直接の連絡先を添えて逃げ道を残す","status":"done","status_label":"実装済み"},{"id":"SB-39-012","category":"お問い合わせ","name":"訪問者を区別できないときは上限を掛けない","detail":"転送ヘッダが無い構成だと全員が同じIPになり、5件でサイト全体の問い合わせが止まる","status":"done","status_label":"実装済み"},{"id":"SB-39-013","category":"お問い合わせ","name":"長すぎる入力は切って受け取る","detail":"拒否せず、上限まで保存する","status":"done","status_label":"実装済み"},{"id":"SB-39-014","category":"お問い合わせ","name":"公開ページに直接の宛先も出す","detail":"フォームが動かないときに、訪問者が詰まらないようにする","status":"done","status_label":"実装済み"},{"id":"SB-39-015","category":"お問い合わせ","name":"受信箱の画面","detail":"届いた問い合わせ・通知の成否・未対応の件数を1画面で見る","status":"done","status_label":"実装済み"},{"id":"SB-39-016","category":"お問い合わせ","name":"通知の再送","detail":"SMTPを設定したあとに、送れていなかったぶんを送り直せる","status":"done","status_label":"実装済み"},{"id":"SB-39-017","category":"お問い合わせ","name":"対応済みの記録","detail":"返信したものに印を付け、未対応だけを追える","status":"done","status_label":"実装済み"},{"id":"SB-39-018","category":"お問い合わせ","name":"メール未設定を画面に出す","detail":"「通知が出ていない」ことを運用側に隠さない。不足している環境変数まで書く","status":"done","status_label":"実装済み"},{"id":"SB-40-001","category":"ログインとアカウント","name":"コンソールのログイン画面","detail":"認証の中身はあったのに、画面から入る手段が無かった","status":"done","status_label":"実装済み"},{"id":"SB-40-002","category":"ログインとアカウント","name":"アカウントが無い間は公開デモ","detail":"最初の管理者を作った時点で、以後は必ずログインが要る","status":"done","status_label":"実装済み"},{"id":"SB-40-003","category":"ログインとアカウント","name":"セッションCookie","detail":"HttpOnly / SameSite=Lax。JavaScriptから読めない","status":"done","status_label":"実装済み"},{"id":"SB-40-004","category":"ログインとアカウント","name":"HTTPSのときだけSecureを付ける","detail":"ローカルのhttpでSecureを付けると、Cookieが保存されず一生入れない","status":"done","status_label":"実装済み"},{"id":"SB-40-005","category":"ログインとアカウント","name":"二要素認証の画面","detail":"パスワードの次に、認証アプリの6桁コードを受け取る","status":"done","status_label":"実装済み"},{"id":"SB-40-006","category":"ログインとアカウント","name":"リカバリコードでも入れる","detail":"認証アプリを失くしても締め出されない","status":"done","status_label":"実装済み"},{"id":"SB-40-007","category":"ログインとアカウント","name":"戻り先は自サイト内だけ","detail":"//evil.example のような値で外へ飛ばさない","status":"done","status_label":"実装済み"},{"id":"SB-40-008","category":"ログインとアカウント","name":"ログイン失敗が続いたら一時的に止める","detail":"何回でも試せる状態にしない","status":"done","status_label":"実装済み"},{"id":"SB-40-009","category":"ログインとアカウント","name":"どちらが違うかを言わない","detail":"「メールアドレスかパスワードが違います」。アドレスの存在を漏らさない","status":"done","status_label":"実装済み"},{"id":"SB-40-010","category":"ログインとアカウント","name":"存在しないアドレスでも同じだけ時間をかける","detail":"応答時間からアカウントの有無を推測させない","status":"done","status_label":"実装済み"},{"id":"SB-40-011","category":"ログインとアカウント","name":"いま誰が入っているかを画面に出す","detail":"名前・権限・担当クライアントをサイドバーに","status":"done","status_label":"実装済み"},{"id":"SB-40-012","category":"ログインとアカウント","name":"client権限は自社データだけ","detail":"招いたクライアントに他社の数字が見えないようにする","status":"done","status_label":"実装済み"},{"id":"SB-40-013","category":"ログインとアカウント","name":"画面からアカウントを作る","detail":"クライアントを招くときの入口","status":"done","status_label":"実装済み"},{"id":"SB-40-014","category":"ログインとアカウント","name":"最初の設定を画面で済ませる","detail":"「POST /v1/accounts/bootstrap を叩いてください」では、運用する人が始められない","status":"done","status_label":"実装済み"},{"id":"SB-40-015","category":"ログインとアカウント","name":"作ったらそのまま入れる","detail":"管理者を作った直後にセッションを渡し、ログインし直させない","status":"done","status_label":"実装済み"},{"id":"SB-40-016","category":"ログインとアカウント","name":"配信用のAPIキーも同時に発行できる","detail":"一度しか表示しないことを画面に明記する","status":"done","status_label":"実装済み"},{"id":"SB-40-017","category":"ログインとアカウント","name":"ログイン画面そのものは門番で塞がない","detail":"塞ぐと誰も入れなくなる","status":"done","status_label":"実装済み"},{"id":"SB-41-001","category":"管理画面","name":"設定・機能・アカウント・連携・監査を1枚に","detail":"運用する人が別々の画面を探し回らなくて済む","status":"done","status_label":"実装済み"},{"id":"SB-41-002","category":"管理画面","name":"公開の準備チェックリスト","detail":"クライアントを迎える前に埋めることを、できていない順に出す","status":"done","status_label":"実装済み"},{"id":"SB-41-003","category":"管理画面","name":"機能のオン・オフ盤","detail":"26の機能をスイッチで切り替える。分類ごとにまとめ、絞り込みと有効数つき","status":"done","status_label":"実装済み"},{"id":"SB-41-004","category":"管理画面","name":"切り替えは即時保存","detail":"設定タブへ移動しなくても、その場で効く","status":"done","status_label":"実装済み"},{"id":"SB-41-005","category":"管理画面","name":"設定を画面から入れられる","detail":"SMTPやAPIキーのために、Space の Secrets を触って再起動しなくてよい","status":"done","status_label":"実装済み"},{"id":"SB-41-006","category":"管理画面","name":"DB → 環境変数 → 既定値 の順に読む","detail":"いま動いている環境変数を壊さずに、画面からの値を足せる","status":"done","status_label":"実装済み"},{"id":"SB-41-007","category":"管理画面","name":"ホスティングの Secrets を上書きしない","detail":"片方だけ効いている状態を作らない","status":"done","status_label":"実装済み"},{"id":"SB-41-008","category":"管理画面","name":"秘密の値は保存後に読み出せない","detail":"画面には「設定済み」とだけ出す。空欄で保存しても消えない","status":"done","status_label":"実装済み"},{"id":"SB-41-009","category":"管理画面","name":"秘密の値は暗号化して保存","detail":"DBを覗いても平文が出ない","status":"done","status_label":"実装済み"},{"id":"SB-41-010","category":"管理画面","name":"接続を実際に試せる","detail":"保存しただけで満足しないよう、メール・AI・通知は本当に外へ出して結果を返す","status":"done","status_label":"実装済み"},{"id":"SB-41-011","category":"管理画面","name":"連携の状態を一覧で","detail":"何が未設定で、どの環境変数が足りないかを並べる","status":"done","status_label":"実装済み"},{"id":"SB-41-012","category":"管理画面","name":"監査ログ","detail":"設定変更・ログイン・一括操作・削除が誰の手で行われたかを残す","status":"done","status_label":"実装済み"},{"id":"SB-42-001","category":"クライアント向けアシスタント","name":"サイトとコンソールに常駐する","detail":"同じウィジェットを両方に出す。依存なしの1ファイル","status":"done","status_label":"実装済み"},{"id":"SB-42-002","category":"クライアント向けアシスタント","name":"この基盤の材料だけで答える","detail":"記事・用語集・機能カタログ・対応媒体・画面の役割","status":"done","status_label":"実装済み"},{"id":"SB-42-003","category":"クライアント向けアシスタント","name":"日本語の質問に日本語で答える","detail":"分かち書きされない言語でも当たるよう、2文字ずつの並びで照合する","status":"done","status_label":"実装済み"},{"id":"SB-42-004","category":"クライアント向けアシスタント","name":"見出しの一致を重く見る","detail":"そのものずばりの資料が、長い記事に埋もれないようにする","status":"done","status_label":"実装済み"},{"id":"SB-42-005","category":"クライアント向けアシスタント","name":"関係ない質問には答えない","detail":"薄い一致で、自信ありげな答えを返さない","status":"done","status_label":"実装済み"},{"id":"SB-42-006","category":"クライアント向けアシスタント","name":"ありふれた語を手がかりにしない","detail":"「教えて」「ます」はどの資料にも出る。珍しい語がどれだけ当たったかで測る","status":"done","status_label":"実装済み"},{"id":"SB-42-007","category":"クライアント向けアシスタント","name":"丁寧に長く聞いても答えが出る","detail":"絶対値だけで切ると、語が増えるほど通らなくなる","status":"done","status_label":"実装済み"},{"id":"SB-42-008","category":"クライアント向けアシスタント","name":"資料が少ない環境でも動く","detail":"入れたばかりのときに、何も答えられない状態にしない","status":"done","status_label":"実装済み"},{"id":"SB-42-009","category":"クライアント向けアシスタント","name":"AIキーが無くても黙らない","detail":"関連する箇所を出典つきで抜き出す。「未設定です」で終わらせない","status":"done","status_label":"実装済み"},{"id":"SB-42-010","category":"クライアント向けアシスタント","name":"数字を創作させない","detail":"資料に無い数値は出さないよう指示し、無いときは無いと言わせる","status":"done","status_label":"実装済み"},{"id":"SB-42-011","category":"クライアント向けアシスタント","name":"出典を必ず添える","detail":"答えの根拠にしたページへのリンクを出す","status":"done","status_label":"実装済み"},{"id":"SB-42-012","category":"クライアント向けアシスタント","name":"自社データは権限のある人にだけ","detail":"client_id を指定した回答には、鍵かログイン中のセッションが要る","status":"done","status_label":"実装済み"},{"id":"SB-42-013","category":"クライアント向けアシスタント","name":"client権限は自分のクライアントだけ","detail":"他社の数字を渡さない","status":"done","status_label":"実装済み"},{"id":"SB-42-014","category":"クライアント向けアシスタント","name":"直前のやり取りを踏まえる","detail":"同じことを何度も説明させない","status":"done","status_label":"実装済み"},{"id":"SB-42-015","category":"クライアント向けアシスタント","name":"質問と回答を記録する","detail":"答えられなかった質問が、次に書く記事の題材になる","status":"done","status_label":"実装済み"},{"id":"SB-42-016","category":"クライアント向けアシスタント","name":"管理画面から名前とオン・オフを変えられる","detail":"アシスタントを出すかどうかを運用側が決める","status":"done","status_label":"実装済み"},{"id":"SB-42-017","category":"クライアント向けアシスタント","name":"狭い画面では全面に開く","detail":"スマートフォンでも使える大きさにする","status":"done","status_label":"実装済み"},{"id":"SB-43-001","category":"かんたん投稿（クライアント向け）","name":"クライアントの画面は1枚だけ","detail":"運用コンソールの50画面は運用側のもの。クライアントには見せない","status":"done","status_label":"実装済み"},{"id":"SB-43-002","category":"かんたん投稿（クライアント向け）","name":"やることは3つ","detail":"①出す先を選ぶ ②ジャンルかキーワードを言う ③見て出す","status":"done","status_label":"実装済み"},{"id":"SB-43-003","category":"かんたん投稿（クライアント向け）","name":"何も思いつかなくても押せる","detail":"12業種のジャンルを並べ、選ぶと投稿テーマの候補も出す","status":"done","status_label":"実装済み"},{"id":"SB-43-004","category":"かんたん投稿（クライアント向け）","name":"ジャンルだけでも作れる","detail":"キーワードを思いつかなくても、選ぶだけで文章が出る","status":"done","status_label":"実装済み"},{"id":"SB-43-005","category":"かんたん投稿（クライアント向け）","name":"キーワードだけでも作れる","detail":"業種に当てはまらない場合は、言葉だけで指定できる","status":"done","status_label":"実装済み"},{"id":"SB-43-006","category":"かんたん投稿（クライアント向け）","name":"事業者の情報は書いた範囲だけ使う","detail":"書いていないことは作らない。裏を取れない事実を出させない","status":"done","status_label":"実装済み"},{"id":"SB-43-007","category":"かんたん投稿（クライアント向け）","name":"URLからも作れる","detail":"既にページがある場合の道。会社サイトでも商品ページでも読み取る","status":"done","status_label":"実装済み"},{"id":"SB-43-008","category":"かんたん投稿（クライアント向け）","name":"ページから題名・説明・見出し・画像を取る","detail":"OGPとHTMLの両方を見て、使えるものだけ拾う","status":"done","status_label":"実装済み"},{"id":"SB-43-009","category":"かんたん投稿（クライアント向け）","name":"AIが下書きを書く","detail":"ページに書いていないことを足さない・誇張しない、を指示に入れる","status":"done","status_label":"実装済み"},{"id":"SB-43-010","category":"かんたん投稿（クライアント向け）","name":"AIが無くても下書きは出る","detail":"ページ自身の文章から組み立てる。未設定を理由に画面を空にしない","status":"done","status_label":"実装済み"},{"id":"SB-43-011","category":"かんたん投稿（クライアント向け）","name":"材料が無いときは作文しない","detail":"AIが無くジャンルだけの場合は、書く場所を用意する。それらしい文章を機械で作ると、確かめないまま出してしまう","status":"done","status_label":"実装済み"},{"id":"SB-43-012","category":"かんたん投稿（クライアント向け）","name":"何を書かなかったかを伝える","detail":"実績・価格・住所は書いていないことを、下書きと一緒に出す","status":"done","status_label":"実装済み"},{"id":"SB-43-013","category":"かんたん投稿（クライアント向け）","name":"下書きはその場で直せる","detail":"気に入らなければ書き換えてから出す","status":"done","status_label":"実装済み"},{"id":"SB-43-014","category":"かんたん投稿（クライアント向け）","name":"媒体ごとの上限で切って見せる","detail":"Xは280字、LINEは500字。切られてから気づくのを避ける","status":"done","status_label":"実装済み"},{"id":"SB-43-015","category":"かんたん投稿（クライアント向け）","name":"切っても本文のリンクは残す","detail":"リンクが落ちた投稿は出す意味が無い","status":"done","status_label":"実装済み"},{"id":"SB-43-016","category":"かんたん投稿（クライアント向け）","name":"切るのは文の切れ目で","detail":"単語や文の途中で切れた投稿は読みにくい","status":"done","status_label":"実装済み"},{"id":"SB-43-017","category":"かんたん投稿（クライアント向け）","name":"画像は必ず1枚は選べる","detail":"ページに画像が無くても、文字を入れたカードを作る","status":"done","status_label":"実装済み"},{"id":"SB-43-018","category":"かんたん投稿（クライアント向け）","name":"ページの画像も候補に出す","detail":"アイコンやスプライトは候補から外す","status":"done","status_label":"実装済み"},{"id":"SB-43-019","category":"かんたん投稿（クライアント向け）","name":"出る前に、出るものをそのまま見せる","detail":"媒体ごとに、実際に送られる文面と文字数","status":"done","status_label":"実装済み"},{"id":"SB-43-020","category":"かんたん投稿（クライアント向け）","name":"クライアントは自動でこの画面に着地する","detail":"ログインしても、コンソールには入らない","status":"done","status_label":"実装済み"},{"id":"SB-43-021","category":"かんたん投稿（クライアント向け）","name":"公開デモからは外部へ送らない","detail":"内容の確認まで。実配信は配信先を設定してから","status":"done","status_label":"実装済み"},{"id":"SB-43-022","category":"かんたん投稿（クライアント向け）","name":"出した履歴を残す","detail":"いつ・どこへ・何を出したかをクライアントごとに保存する","status":"done","status_label":"実装済み"},{"id":"SB-44-001","category":"データの永続性","name":"データが残るのかを自分で確かめる","detail":"永続ディスクの無いホスティングでは、再起動でDBごと初期化される","status":"done","status_label":"実装済み"},{"id":"SB-44-002","category":"データの永続性","name":"ホスティングに直接聞く","detail":"APIで永続ストレージの有無を確認する。いちばん確実","status":"done","status_label":"実装済み"},{"id":"SB-44-003","category":"データの永続性","name":"聞けないときは起動をまたいで観測する","detail":"何度起動しても毎回まっさらなら、使い捨てだと分かる","status":"done","status_label":"実装済み"},{"id":"SB-44-004","category":"データの永続性","name":"消えると困るものの件数を出す","detail":"問い合わせ・アカウント・APIキー・計測イベント・順位の記録","status":"done","status_label":"実装済み"},{"id":"SB-44-005","category":"データの永続性","name":"管理画面に警告を出す","detail":"消えること自体より、消えると分からないことが問題","status":"done","status_label":"実装済み"},{"id":"SB-44-006","category":"データの永続性","name":"公開の準備チェックリストに入れる","detail":"クライアントを迎える前に気付けるようにする","status":"done","status_label":"実装済み"},{"id":"SB-44-007","category":"データの永続性","name":"消える前に持ち出せる","detail":"資格情報を除いた中身をJSONで書き出す","status":"done","status_label":"実装済み"},{"id":"SB-45-001","category":"クライアントのボット","name":"クライアントごとのボット","detail":"この基盤について答えるアシスタントとは別。そのクライアントのページだけを材料にする","status":"done","status_label":"実装済み"},{"id":"SB-45-002","category":"クライアントのボット","name":"URL1本で学習が始まる","detail":"同じサイトの中の主要ページまで辿って読む。最大30ページ","status":"done","status_label":"実装済み"},{"id":"SB-45-003","category":"クライアントのボット","name":"外部サイトは辿らない","detail":"他所の内容を、その事業者の答えとして出さない","status":"done","status_label":"実装済み"},{"id":"SB-45-004","category":"クライアントのボット","name":"機械向けの出力を学習させない","detail":"RSSやsitemapを読むと記事の断片が本文に混ざり、見当違いの引用が出る","status":"done","status_label":"実装済み"},{"id":"SB-45-005","category":"クライアントのボット","name":"長いページを文の切れ目で割る","detail":"段落だけで切ると、改行の少ないページが1枚まるごと1つの塊になる","status":"done","status_label":"実装済み"},{"id":"SB-45-006","category":"クライアントのボット","name":"資料に無いことを答えさせない","detail":"価格・在庫・営業時間を推測で答えると、事業者が責任を負う","status":"done","status_label":"実装済み"},{"id":"SB-45-007","category":"クライアントのボット","name":"分からないときは人に渡す","detail":"無理に答えるより、問い合わせ先を出すほうが役に立つ","status":"done","status_label":"実装済み"},{"id":"SB-45-008","category":"クライアントのボット","name":"医療・健康・法律の判断をしない","detail":"専門家に相談するよう促す","status":"done","status_label":"実装済み"},{"id":"SB-45-009","category":"クライアントのボット","name":"アシスタントより厳しい基準で答える","detail":"事業者を代表して話すぶん、曖昧な一致で答えさせない","status":"done","status_label":"実装済み"},{"id":"SB-45-010","category":"クライアントのボット","name":"丁寧な言い回しを手がかりに数えない","detail":"「営業時間を教えてください」が「営業時間は？」より当たらなくなっていた","status":"done","status_label":"実装済み"},{"id":"SB-45-011","category":"クライアントのボット","name":"資料が少なくても答えられる","detail":"入れたばかりのボットが、何も答えられない状態にならないようにする","status":"done","status_label":"実装済み"},{"id":"SB-45-012","category":"クライアントのボット","name":"AIが未設定でも該当箇所は返す","detail":"黙って壊れているように見せない","status":"done","status_label":"実装済み"},{"id":"SB-45-013","category":"クライアントのボット","name":"出す前に試せる","detail":"公開しなくても、運用側の口から実際に答えさせて確かめられる","status":"done","status_label":"実装済み"},{"id":"SB-45-014","category":"クライアントのボット","name":"公開するまで外から見えない","detail":"作った瞬間に外に出ない。試してから公開する","status":"done","status_label":"実装済み"},{"id":"SB-45-015","category":"クライアントのボット","name":"公開URLは推測できない","detail":"16バイトの乱数。URLを知らない相手には届かない","status":"done","status_label":"実装済み"},{"id":"SB-45-016","category":"クライアントのボット","name":"訪問者には内部の情報を渡さない","detail":"client_id も公開IDも fallback も、公開の応答には含めない","status":"done","status_label":"実装済み"},{"id":"SB-45-017","category":"クライアントのボット","name":"貼るのは1行だけ","detail":"<script> 1本で、サイトの好きな場所に出る","status":"done","status_label":"実装済み"},{"id":"SB-45-018","category":"クライアントのボット","name":"貼り先のCSSと喧嘩しない","detail":"見た目を Shadow DOM の中に閉じる。相手の色や字の大きさに引きずられない","status":"done","status_label":"実装済み"},{"id":"SB-45-019","category":"クライアントのボット","name":"貼れない相手にはURLで渡す","detail":"ホスト型のチャットページを用意する","status":"done","status_label":"実装済み"},{"id":"SB-45-020","category":"クライアントのボット","name":"1分あたりの回数を制限する","detail":"1つのボットに質問が集中したときに止める","status":"done","status_label":"実装済み"},{"id":"SB-45-021","category":"クライアントのボット","name":"答えた内容を記録する","detail":"答えられなかった質問が、次に足すべきページを教えてくれる","status":"done","status_label":"実装済み"},{"id":"SB-45-022","category":"クライアントのボット","name":"公開までを3ステップで","detail":"①覚えさせる ②話し方を決める ③試して出す","status":"done","status_label":"実装済み"},{"id":"SB-45-023","category":"クライアントのボット","name":"鍵かログイン、どちらでも操作できる","detail":"クライアントにAPIキーを渡させるのは無理があるし、渡させれば漏れる","status":"done","status_label":"実装済み"},{"id":"SB-45-024","category":"クライアントのボット","name":"他社のボットには触れない","detail":"client権限は自分のクライアントのぶんだけ。作成も学習も試用も削除も","status":"done","status_label":"実装済み"},{"id":"SB-46-001","category":"クライアントを迎える","name":"画面からクライアントを登録できる","detail":"1社迎えるのに、リポジトリを編集してデプロイする必要が無くなった","status":"done","status_label":"実装済み"},{"id":"SB-46-002","category":"クライアントを迎える","name":"登録したらすぐに効く","detail":"配信エンジンへその場で反映する。再起動を待たせない","status":"done","status_label":"実装済み"},{"id":"SB-46-003","category":"クライアントを迎える","name":"既存のYAML設定を壊さない","detail":"YAMLを先に読み、画面で登録したものを後から重ねる","status":"done","status_label":"実装済み"},{"id":"SB-46-004","category":"クライアントを迎える","name":"IDの形を検査する","detail":"URLに使えない文字や、長すぎるIDを受け取らない","status":"done","status_label":"実装済み"},{"id":"SB-46-005","category":"クライアントを迎える","name":"計測用のキャンペーン名を用意する","detail":"入れ忘れると、計測が全部ひとまとめになる","status":"done","status_label":"実装済み"},{"id":"SB-46-006","category":"クライアントを迎える","name":"配信先を画面から足す","detail":"25媒体から選ぶ。既定の役割は媒体ごとに決まっている","status":"done","status_label":"実装済み"},{"id":"SB-46-007","category":"クライアントを迎える","name":"あと何が要るかを出す","detail":"媒体ごとに必要な認証情報を並べ、不足しているものを名指しする","status":"done","status_label":"実装済み"},{"id":"SB-46-008","category":"クライアントを迎える","name":"認証情報は暗号化して保存","detail":"DBを覗いても平文が出ない。画面には項目名だけを返す","status":"done","status_label":"実装済み"},{"id":"SB-46-009","category":"クライアントを迎える","name":"空欄は「変えない」の意味にする","detail":"入れ直さないと消える、という作りにしない","status":"done","status_label":"実装済み"},{"id":"SB-46-010","category":"クライアントを迎える","name":"消さずに止める","detail":"クライアントを無効にしても記録は残す。消すと何があったか分からなくなる","status":"done","status_label":"実装済み"},{"id":"SB-46-011","category":"クライアントを迎える","name":"配信先を外すと認証情報も消える","detail":"使わない資格情報を残さない","status":"done","status_label":"実装済み"},{"id":"SB-46-012","category":"クライアントを迎える","name":"止めた配信先はエンジンに渡さない","detail":"画面で切ったつもりが送られている、を作らない","status":"done","status_label":"実装済み"},{"id":"SB-47-001","category":"招待","name":"一度きりのリンクで招く","detail":"パスワードを人づてに渡すのは、渡す側にも受け取る側にも危ない","status":"done","status_label":"実装済み"},{"id":"SB-47-002","category":"招待","name":"本人がパスワードを決める","detail":"こちらは値を知らないままにする","status":"done","status_label":"実装済み"},{"id":"SB-47-003","category":"招待","name":"7日で期限が切れる","detail":"古いリンクが残り続けないようにする","status":"done","status_label":"実装済み"},{"id":"SB-47-004","category":"招待","name":"1度使うと無効になる","detail":"同じリンクで2人目が入れないようにする","status":"done","status_label":"実装済み"},{"id":"SB-47-005","category":"招待","name":"弱いパスワードを受け取らない","detail":"招待経由でも、通常の作成と同じ基準を通す","status":"done","status_label":"実装済み"},{"id":"SB-47-006","category":"招待","name":"既にあるアドレスには出さない","detail":"重複したアカウントを作らせない","status":"done","status_label":"実装済み"},{"id":"SB-47-007","category":"招待","name":"招待リンクはログイン無しで開ける","detail":"招かれた人はまだアカウントを持っていない。門番で塞いだら誰も入れない","status":"done","status_label":"実装済み"},{"id":"SB-47-008","category":"招待","name":"受諾したらそのまま入れる","detail":"作った直後にセッションを渡し、ログインし直させない","status":"done","status_label":"実装済み"},{"id":"SB-47-009","category":"招待","name":"権限で行き先を変える","detail":"client はかんたん投稿の画面、それ以外はコンソールへ","status":"done","status_label":"実装済み"},{"id":"SB-47-010","category":"招待","name":"保留中の招待を一覧で見る","detail":"誰にいつ出したか、いつ切れるか","status":"done","status_label":"実装済み"},{"id":"SB-47-011","category":"招待","name":"招待を取り消せる","detail":"送り先を間違えたときに、放置しなくて済む","status":"done","status_label":"実装済み"},{"id":"SB-47-012","category":"招待","name":"一覧にトークンを出さない","detail":"画面を見られただけでは、なりすませない","status":"done","status_label":"実装済み"},{"id":"SB-47-013","category":"招待","name":"メールが繋がっていれば自動で送る","detail":"リンクを作ってから手で送る手間を省く","status":"done","status_label":"実装済み"},{"id":"SB-47-014","category":"招待","name":"送れていないのに送ったと言わない","detail":"未設定ならURLを返し、手元の方法で渡してもらう","status":"done","status_label":"実装済み"},{"id":"SB-47-015","category":"招待","name":"メールが落ちても招待は残る","detail":"送信の失敗で、招待そのものを無かったことにしない","status":"done","status_label":"実装済み"},{"id":"SB-47-016","category":"招待","name":"メールにパスワードを載せない","detail":"載せた時点で、メールボックスが鍵になってしまう","status":"done","status_label":"実装済み"},{"id":"SB-48-001","category":"繋ぎ目を検証する","name":"通しで歩く検証","detail":"1社迎えるまでを最初から最後まで歩き、途中で止まらないことを確かめる","status":"done","status_label":"実装済み"},{"id":"SB-48-002","category":"繋ぎ目を検証する","name":"再起動しても配信先が残る","detail":"画面で登録したクライアントを、起動のたびにエンジンへ載せ直す","status":"done","status_label":"実装済み"},{"id":"SB-48-003","category":"繋ぎ目を検証する","name":"起動時の失敗を握り潰さない","detail":"起動フックが黙って警告に化けていないかを検証で見張る","status":"done","status_label":"実装済み"},{"id":"SB-48-004","category":"繋ぎ目を検証する","name":"デモを実績に数えない","detail":"同梱のデモ2社では「配信できます」を緑にしない","status":"done","status_label":"実装済み"},{"id":"SB-48-005","category":"繋ぎ目を検証する","name":"クライアントは自分の2画面だけ","detail":"運用コンソールへ迷い込めないことを通しで確かめる","status":"done","status_label":"実装済み"},{"id":"SB-48-006","category":"繋ぎ目を検証する","name":"名前の間違いを動かす前に見つける","detail":"存在しない名前の呼び出しを、静的検査で全ファイル分止める","status":"done","status_label":"実装済み"},{"id":"SB-48-007","category":"繋ぎ目を検証する","name":"計算して捨てていないか見張る","detail":"取ってきたのに画面へ渡し忘れる、を検査で拾う","status":"done","status_label":"実装済み"},{"id":"SB-48-008","category":"繋ぎ目を検証する","name":"未定義の変数を空欄で描かない","detail":"全画面を描画し、渡し忘れた変数に触れたら落とす","status":"done","status_label":"実装済み"},{"id":"SB-48-009","category":"繋ぎ目を検証する","name":"レイアウトの設定を画面が隠さない","detail":"画面が site という名前を奪うと、その画面だけ表示が欠ける","status":"done","status_label":"実装済み"},{"id":"SB-48-010","category":"繋ぎ目を検証する","name":"画面が呼ぶ先が本当にあるか","detail":"経路名を変えたときに、呼んでいる画面を検査で見つける","status":"done","status_label":"実装済み"},{"id":"SB-48-011","category":"繋ぎ目を検証する","name":"でたらめな入力で500を返さない","detail":"137の書き込み経路を空の本文で叩き、落ちないことを確かめる","status":"done","status_label":"実装済み"},{"id":"SB-48-012","category":"繋ぎ目を検証する","name":"知らないIDで落ちない","detail":"消したあとのブックマークを踏まれても、500にしない","status":"done","status_label":"実装済み"},{"id":"SB-49-001","category":"配信先の検証","name":"全媒体の送信内容を確かめる","detail":"何を・どのURLへ・どんな形で送るかを、媒体ごとに検証する","status":"done","status_label":"実装済み"},{"id":"SB-49-002","category":"配信先の検証","name":"dry-runで外へ出さない","detail":"試すつもりの実行が本当に投稿されたら、取り返しがつかない","status":"done","status_label":"実装済み"},{"id":"SB-49-003","category":"配信先の検証","name":"下書きのつもりで公開しない","detail":"下書き指定のとき、公開の呼び出しへ進まないことを確かめる","status":"done","status_label":"実装済み"},{"id":"SB-49-004","category":"配信先の検証","name":"できないことは断る","detail":"下書き非対応の媒体は、黙って公開せずスキップと言う","status":"done","status_label":"実装済み"},{"id":"SB-49-005","category":"配信先の検証","name":"転載にcanonicalを付ける","detail":"付け忘れると、自社サイトが自分の記事に検索で負ける","status":"done","status_label":"実装済み"},{"id":"SB-49-006","category":"配信先の検証","name":"予約は予約として送る","detail":"いま公開してしまわないよう、媒体ごとの予約手順に乗せる","status":"done","status_label":"実装済み"},{"id":"SB-49-007","category":"配信先の検証","name":"既存の導線を消さない","detail":"動画の概要欄へ追記するとき、過去の関連記事を残す","status":"done","status_label":"実装済み"},{"id":"SB-49-008","category":"配信先の検証","name":"上限を超えたら切らずに断る","detail":"黙って切り詰めると、後ろが消えたことに誰も気づかない","status":"done","status_label":"実装済み"},{"id":"SB-49-009","category":"配信先の検証","name":"メールは2形式で送る","detail":"HTMLだけだと、テキストしか読めない環境に空のメールが届く","status":"done","status_label":"実装済み"},{"id":"SB-49-010","category":"配信先の検証","name":"画面とアダプタで名前を揃える","detail":"集める項目名と、配信時に読む項目名が食い違わないよう検査する","status":"done","status_label":"実装済み"},{"id":"SB-49-011","category":"配信先の検証","name":"古い名前の設定も読み続ける","detail":"項目名を直しても、登録済みの設定が動かなくならない","status":"done","status_label":"実装済み"},{"id":"SB-49-012","category":"配信先の検証","name":"接続テストが同じ項目を見る","detail":"テストだけ別の名前を見ていると、正しい設定が「不足」に見える","status":"done","status_label":"実装済み"},{"id":"SB-49-013","category":"配信先の検証","name":"接続テストが署名を付ける","detail":"付け忘れると、正しい鍵でも「期限切れかもしれません」と嘘をつく","status":"done","status_label":"実装済み"},{"id":"SB-50-001","category":"データを失わない","name":"Space外への自動退避","detail":"使い捨てのディスクでも、保存のたびにプライベートなDatasetへ置く","status":"done","status_label":"実装済み"},{"id":"SB-50-002","category":"データを失わない","name":"起動時に書き戻す","detail":"DBを開く前に最新の退避を戻す。開いてから戻すと接続が古いDBを持ち続ける","status":"done","status_label":"実装済み"},{"id":"SB-50-003","category":"データを失わない","name":"終了の合図で最後の1枚","detail":"デプロイ直前の数分は、ここでしか救えない","status":"done","status_label":"実装済み"},{"id":"SB-50-004","category":"データを失わない","name":"空で上書きしない","detail":"書き戻しに失敗したまま自動保存すると、向こうの本物が空で置き換わる","status":"done","status_label":"実装済み"},{"id":"SB-50-005","category":"データを失わない","name":"見た上での上書きはできる","detail":"止めるだけでは直す手段が無くなる。手動なら通す","status":"done","status_label":"実装済み"},{"id":"SB-50-006","category":"データを失わない","name":"稼働中でも取りこぼさない","detail":"ファイルをコピーせずSQLiteの複製APIを使い、WALの最新分まで含める","status":"done","status_label":"実装済み"},{"id":"SB-50-007","category":"データを失わない","name":"テキストで送る","detail":"HFはコミットAPI経由のバイナリを拒否するので、gzipをbase64にする","status":"done","status_label":"実装済み"},{"id":"SB-50-008","category":"データを失わない","name":"溜めすぎない","detail":"古い退避を自動で間引く。掃除に失敗しても保存は成功にする","status":"done","status_label":"実装済み"},{"id":"SB-50-009","category":"データを失わない","name":"退避の状態を画面に出す","detail":"最後に退避した時刻と大きさ、復元したかどうかを運用画面で見せる","status":"done","status_label":"実装済み"},{"id":"SB-50-010","category":"データを失わない","name":"いますぐ退避するボタン","detail":"デプロイ前に、待たずに1枚置ける","status":"done","status_label":"実装済み"},{"id":"SB-50-011","category":"データを失わない","name":"外からは中身を見せない","detail":"残るかどうかは公開、件数・退避先・Space名は運用者だけ","status":"done","status_label":"実装済み"},{"id":"SB-50-012","category":"データを失わない","name":"復元を永続ディスクと取り違えない","detail":"書き戻したから印が残っただけのときに「ディスクが残る」と言わない","status":"done","status_label":"実装済み"},{"id":"SB-50-013","category":"データを失わない","name":"守るものができたら閉める","detail":"取引先・問い合わせ・鍵のどれかが入った時点で、コンソールを認証必須にする","status":"done","status_label":"実装済み"},{"id":"SB-50-014","category":"データを失わない","name":"入口は閉めない","detail":"閉めると初期設定を終えられなくなるので、設定とログインだけは開ける","status":"done","status_label":"実装済み"},{"id":"SB-51-001","category":"作ったものに手が届く","name":"経路の無い機能を残さない","detail":"実装したのに呼び出す経路も画面も無い、という状態を検査で見つける","status":"done","status_label":"実装済み"},{"id":"SB-51-002","category":"作ったものに手が届く","name":"後から足した経路が食われない","detail":"先に宣言したパラメータ付きの経路が、固定の経路を隠していないか調べる","status":"done","status_label":"実装済み"},{"id":"SB-51-003","category":"作ったものに手が届く","name":"画面が使う通信手段が揃っている","detail":"画面が呼ぶ SB.patch などが、実際に用意されているか確かめる","status":"done","status_label":"実装済み"},{"id":"SB-51-004","category":"作ったものに手が届く","name":"無料期間の開始と残日数","detail":"画面から始められ、残りが見える","status":"done","status_label":"実装済み"},{"id":"SB-51-005","category":"作ったものに手が届く","name":"支払い方法の変更・解約","detail":"Stripeの窓口へ送る。カード番号はこちらで受け取らない","status":"done","status_label":"実装済み"},{"id":"SB-51-006","category":"作ったものに手が届く","name":"口コミをGoogleから取り込む","detail":"CSVと同じ置き場に入れ、返信済みの印を消さない","status":"done","status_label":"実装済み"},{"id":"SB-51-007","category":"作ったものに手が届く","name":"口コミへの返信を送る","detail":"星の少ないものから並べ、返信案をそのまま送れる","status":"done","status_label":"実装済み"},{"id":"SB-51-008","category":"作ったものに手が届く","name":"営業時間の更新を送る","detail":"曜日・開始・終了を渡してGBPへ反映する","status":"done","status_label":"実装済み"},{"id":"SB-51-009","category":"作ったものに手が届く","name":"Pinterestへピンを出す","detail":"記事のカバー画像とリンクでピンを作る","status":"done","status_label":"実装済み"},{"id":"SB-51-010","category":"作ったものに手が届く","name":"TikTokへ動画を出す","detail":"動画が無いときは、無いとはっきり言う","status":"done","status_label":"実装済み"},{"id":"SB-51-011","category":"作ったものに手が届く","name":"エゴサーチの語と走査","detail":"監視する語を決め、公開フィードから言及を拾って残す","status":"done","status_label":"実装済み"},{"id":"SB-51-012","category":"作ったものに手が届く","name":"予約の時刻を変える","detail":"一覧の各行から、その場で組み直せる","status":"done","status_label":"実装済み"},{"id":"SB-51-013","category":"作ったものに手が届く","name":"公開ペースの目標と実績","detail":"週に何本と決め、直近7日の実績と不足を出す","status":"done","status_label":"実装済み"},{"id":"SB-51-014","category":"作ったものに手が届く","name":"CDNキャッシュの破棄","detail":"差し替えた画像が古いまま出るのを防ぐ","status":"done","status_label":"実装済み"},{"id":"SB-51-015","category":"作ったものに手が届く","name":"表記ゆれの洗い出し","detail":"社名・製品名が割れていると、AIに同じ実体と認識されない","status":"done","status_label":"実装済み"},{"id":"SB-51-016","category":"作ったものに手が届く","name":"定義文の雛形を作る","detail":"引用されやすい一問一答の形をその場で作る","status":"done","status_label":"実装済み"},{"id":"SB-51-017","category":"作ったものに手が届く","name":"記事音声のポッドキャスト配信","detail":"合成した音声を回として残し、/podcast.xml で購読できる","status":"done","status_label":"実装済み"},{"id":"SB-51-018","category":"作ったものに手が届く","name":"回が無くてもフィードは返す","detail":"404を返すと、購読していた人が外れてしまう","status":"done","status_label":"実装済み"},{"id":"SB-52-001","category":"言葉を揃える","name":"業種の呼び名を1つに寄せる","detail":"かんたん投稿の「飲食店」と雛形の「飲食」を繋ぎ、全角や中黒の違いも吸収する","status":"done","status_label":"実装済み"},{"id":"SB-52-002","category":"言葉を揃える","name":"知らない業種は、知らないと言う","detail":"0件だけ返すと、対象外なのか不具合なのか分からない","status":"done","status_label":"実装済み"},{"id":"SB-52-003","category":"言葉を揃える","name":"選べる媒体は必ず配信できる","detail":"選択肢に、配信の口が無い媒体を混ぜない","status":"done","status_label":"実装済み"},{"id":"SB-52-004","category":"言葉を揃える","name":"媒体には認証情報の欄がある","detail":"配信先に選べるのに設定できない、という状態を作らない","status":"done","status_label":"実装済み"},{"id":"SB-52-005","category":"言葉を揃える","name":"雛形の語は日本語だけ","detail":"他言語が混ざると、検索されない語を提案してしまう","status":"done","status_label":"実装済み"},{"id":"SB-53-001","category":"かんたん投稿が本当に出す","name":"押したら実際に配信する","detail":"文面を作るだけで終わらせず、配信エンジンへ渡す","status":"done","status_label":"実装済み"},{"id":"SB-53-002","category":"かんたん投稿が本当に出す","name":"媒体ごとに結果を返す","detail":"送れた先・送れなかった先を1件ずつ、理由つきで出す","status":"done","status_label":"実装済み"},{"id":"SB-53-003","category":"かんたん投稿が本当に出す","name":"未設定の媒体を成功にしない","detail":"認証情報の無い配信先を、黙って送信済みにしない","status":"done","status_label":"実装済み"},{"id":"SB-53-004","category":"かんたん投稿が本当に出す","name":"1つ落ちても他を偽らない","detail":"片方が401でも、もう片方の成功はそのまま伝える","status":"done","status_label":"実装済み"},{"id":"SB-53-005","category":"かんたん投稿が本当に出す","name":"確認した文面がそのまま出る","detail":"画面で見たものと違う文面を送らない","status":"done","status_label":"実装済み"},{"id":"SB-53-006","category":"かんたん投稿が本当に出す","name":"同じリンクを2回入れない","detail":"用意された文面に既にURLがあれば、重ねて足さない","status":"done","status_label":"実装済み"},{"id":"SB-53-007","category":"かんたん投稿が本当に出す","name":"同じ秒に2回押しても壊れない","detail":"日本語の見出しからでも重ならないIDを作る","status":"done","status_label":"実装済み"},{"id":"SB-53-008","category":"かんたん投稿が本当に出す","name":"試用のままでは外に出さない","detail":"ログインしていない操作は、必ずドライランで止める","status":"done","status_label":"実装済み"},{"id":"SB-53-009","category":"かんたん投稿が本当に出す","name":"Instagramへ配信する","detail":"コンテナ作成→公開の2段階。画像が無ければ、送る前にそう言う","status":"done","status_label":"実装済み"},{"id":"SB-54-001","category":"ブラウザで確かめる","name":"本物のブラウザで全画面を開く","detail":"サーバが200でも、画面のJSが落ちていれば使えない。押す前に見つける","status":"done","status_label":"実装済み"},{"id":"SB-54-002","category":"ブラウザで確かめる","name":"押して結果まで見る","detail":"ログインしてボタンを実際に押し、通信が2xxで返るところまで確かめる","status":"done","status_label":"実装済み"},{"id":"SB-54-003","category":"ブラウザで確かめる","name":"呼び出しのメソッドまで照合する","detail":"経路はあってもメソッドが違うと、押した人だけが405を見る","status":"done","status_label":"実装済み"},{"id":"SB-54-004","category":"ブラウザで確かめる","name":"ルート直下のアイコンを返す","detail":"ブラウザは宣言があっても /favicon.ico を直接取りにくる","status":"done","status_label":"実装済み"},{"id":"SB-54-005","category":"ブラウザで確かめる","name":"すべてのレイアウトがアイコンを宣言する","detail":"レイアウトが増えるたび、宣言を忘れる","status":"done","status_label":"実装済み"},{"id":"SB-54-006","category":"ブラウザで確かめる","name":"ホーム画面に追加できる","detail":"クライアントは電話で開く。白い四角とURLでは使う気にならない","status":"done","status_label":"実装済み"}]}