<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>changeloop blog</title><description>リリースノートの実践と、ビルド成果物としてのchangelog。</description><link>https://changeloop.dev/</link><language>ja-JP</language><item><title>バグ修正のリリースノートの書き方と使える書き換え例</title><link>https://changeloop.dev/blog/ja/bug-fix-release-notes/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/bug-fix-release-notes/</guid><description>バグ修正のリリースノートは、症状、影響を受けた人、次の行動を示せば役に立つ。書き換え例と、セキュリティとデータ損失のルールを解説する。</description><pubDate>Fri, 02 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;良いバグ修正のリリースノートは、コードが何を間違えたかではなく、ユーザーが何がおかしくなったと見たかを書く。各エントリは、誰が影響を受けたか、いつから起きていたか、修正は完全か、読者が何かする必要があるかを伝える。「対応は不要です」だけの場合でもそうだ。&lt;/p&gt;
&lt;p&gt;多くのチームは、コミットメッセージの一行をそのまま写している。下の表に6つの書き換えを示し、その後のセクションでルールを説明する。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;前(コミットメッセージ)&lt;/th&gt;
&lt;th&gt;後(症状)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;エクスポートハンドラのnullポインタを修正&lt;/td&gt;
&lt;td&gt;タグのないプロジェクトで、エクスポートが「問題が発生しました」と表示して失敗することがなくなりました。9月3日以降に失敗したエクスポートは、もう一度実行してください。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;同期ワーカーの競合状態を解消&lt;/td&gt;
&lt;td&gt;2台のデバイスで数秒以内に行った編集が、互いに上書きされなくなりました。対応は不要です。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;タイムゾーンのバグを修正&lt;/td&gt;
&lt;td&gt;定期レポートが設定した時刻に実行されるようになりました。UTCより東のアカウントでは、8月12日以降、レポートが最大で1日早く実行されていました。変更の必要はありません。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;コメントレンダラーのXSSにパッチを適用&lt;/td&gt;
&lt;td&gt;セキュリティ修正:細工されたコメントが、他のユーザーのブラウザでスクリプトを実行できる状態でした。本日4.2.1にアップグレードしてください。ログ上で悪用は確認されていません。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4.1.0からのリグレッションを修正&lt;/td&gt;
&lt;td&gt;ハイフンを含む検索で、検索が再び動作するようになりました。4.1.0で壊れ、4.1.1で修正されました。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;バグ修正とパフォーマンスの改善&lt;/td&gt;
&lt;td&gt;どれなのかを書く。最後のセクションを参照。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;リリースノートのバグ修正エントリはどう書くか&lt;/h2&gt;
&lt;p&gt;ユーザーの言葉で症状から始め、次に誰がいつから影響を受けたか、修正の状態、そして取るべき行動を書く。たいてい一、二文で足りる。コード上の原因は、エンジニアが探しに行くプルリクエストに置く。&lt;/p&gt;
&lt;p&gt;読者が探すのは一つだけだ。「これは自分のことか?」ほとんどのエントリは、次の4つの部分でカバーできる。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;症状。&lt;/strong&gt; 画面、APIのレスポンス、請求書に何が現れたか。エラーメッセージがあれば引用する。人はその文面で検索するからだ。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;範囲。&lt;/strong&gt; どのプラン、プラットフォーム、APIバージョン、データの形か。「5万行を超えるアカウント」は確認できるが、「一部のユーザー」は確認できない。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;期間。&lt;/strong&gt; どのリリースまたは日付からか。昨日の妙な結果がそのバグだったかを、読者が判断できるようにする。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;行動。&lt;/strong&gt; 再実行、再同期、アップグレード、回避策の削除、あるいは何もしない。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ユーザーが回避策を作っていた場合は、行動の行で、それを削除してよいと伝える。&lt;/p&gt;
&lt;h2&gt;リリースノートとチェンジログの違いは何か&lt;/h2&gt;
&lt;p&gt;チェンジログは変更の完全で継続的な記録だ。リリースノートは、関心を持つかどうかを決める人に向けて、一つのリリースについて選び、書き直したメッセージだ。バグ修正の場合、チェンジログはすべての修正を載せ、ノートは読者が気づいていた可能性のあるものを先頭に置く。&lt;/p&gt;
&lt;p&gt;ツールチップの誤字はチェンジログだけに載せる。請求書の税率の誤りは、両方に載せる。両者の分け方の全体像は&lt;a href=&quot;https://changeloop.dev/blog/ja/changelog-vs-release-notes/&quot;&gt;チェンジログとリリースノートの違い&lt;/a&gt;に、良いノートの形は&lt;a href=&quot;https://changeloop.dev/blog/ja/how-to-write-release-notes/&quot;&gt;リリースノートの書き方&lt;/a&gt;にある。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://keepachangelog.com/en/1.1.0/&quot;&gt;Keep a Changelog&lt;/a&gt;は、記録の側で役に立つ慣習だ。バグ修正には「Fixed」を使い、脆弱性には別の「Security」見出しを使う。これは、この記事が読者のために行っている分け方と同じだ。&lt;/p&gt;
&lt;h2&gt;バグ修正はアップデートか&lt;/h2&gt;
&lt;p&gt;そうだ。バグ修正は製品を変えるので、それをリリースすることはアップデートだ。&lt;a href=&quot;https://semver.org/&quot;&gt;セマンティックバージョニング&lt;/a&gt;では、後方互換性のある修正はパッチリリースで、たとえば4.2.0から4.2.1になる。&lt;/p&gt;
&lt;p&gt;読者が何かをする必要があるかどうかは別の問題で、ノートはそれに答えるべきだ。正しく使っている呼び出し側に見える挙動を変える修正は、破壊的変更に近い。その線がどこにあるかは&lt;a href=&quot;https://changeloop.dev/blog/ja/breaking-changes/&quot;&gt;破壊的変更&lt;/a&gt;で説明している。&lt;/p&gt;
&lt;h2&gt;修正を独立したエントリにするのはいつで、軽微な修正にまとめるのはいつか&lt;/h2&gt;
&lt;p&gt;ユーザーがそのバグに気づいた可能性がある、時間やデータを失った、またはそれを回避する策を作った場合は、独立したエントリにする。チーム外の誰にも見えなかったものは、短い「軽微な修正」のリストにまとめる。判断は、差分の大きさではなく、読者の体験でする。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;独立したエントリにする&lt;/th&gt;
&lt;th&gt;軽微な修正のリストに入れる&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;顧客から報告された、または多くの人が遭遇した&lt;/td&gt;
&lt;td&gt;めったに開かれない画面の表示上の不具合&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;誤った出力、失敗したジョブ、失われた作業を引き起こした&lt;/td&gt;
&lt;td&gt;誤字、余白、ずれたアイコン&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;読者の行動が必要&lt;/td&gt;
&lt;td&gt;社内ツールや管理ページの修正&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;最近のリリースからのリグレッション&lt;/td&gt;
&lt;td&gt;テスト環境でしか見られなかった失敗&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;課金、権限、データに関わる&lt;/td&gt;
&lt;td&gt;ログの文言、ユーザーに影響のない依存関係の更新&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;グループ内の各行も、何かを伝えるべきだ。「UIの不具合をいくつか修正」はただのプレースホルダーだ。&lt;/p&gt;
&lt;h2&gt;リグレッションについてはどう書くか&lt;/h2&gt;
&lt;p&gt;それを持ち込んだリリースを名指しし、リグレッションと呼び、修正するリリースを書く。バグに遭遇した人は壊れたことをすでに知っているので、短く率直に認めるほうが、曖昧な表現よりも役に立つ。&lt;/p&gt;
&lt;p&gt;たとえばこうだ。「ハイフンを含む検索語での検索結果が、4.1.0で空になっていました。4.1.1で修正されました。ハイフンを避けるように検索語を変えていた場合は、元に戻して構いません。」&lt;/p&gt;
&lt;p&gt;「検索の信頼性を改善」は、そのバグで午後を一つ無駄にした人には、はぐらかしに読める。原因がまだ確認中なら、そう書く。&lt;a href=&quot;https://changeloop.dev/blog/ja/emergency-release-notes/&quot;&gt;緊急リリースノート&lt;/a&gt;の指針にもあるとおり、ノートがチームの確信より強く聞こえてはならない。&lt;/p&gt;
&lt;h2&gt;セキュリティ修正はどう告知するか&lt;/h2&gt;
&lt;p&gt;深刻度をはっきり述べ、影響を受けるバージョンと修正されたバージョンを挙げ、アップグレードの緊急度を伝え、CVE識別子があれば含める。詳細は、ユーザーが対処できるようになってから公開する。報告者がいる場合は、協調的な情報開示のプロセスに従う。&lt;/p&gt;
&lt;p&gt;順序が重要だ。報告者があなたに非公開で伝え、あなたが修正をリリースし、ユーザーが自分を守れるようになってから公開ノートを出す。&lt;a href=&quot;https://www.cisa.gov/coordinated-vulnerability-disclosure-process&quot;&gt;CISAの協調的脆弱性開示プロセス&lt;/a&gt;は、脆弱性の報告、分析、公開を調整する。&lt;a href=&quot;https://www.cve.org/ResourcesSupport/AllResources/CNARules&quot;&gt;CVE Numbering Authorityのルール&lt;/a&gt;は、CVEレコードの割り当てと公開の方法を定めており、GitHubでは&lt;a href=&quot;https://docs.github.com/en/code-security/security-advisories/working-with-repository-security-advisories/about-repository-security-advisories&quot;&gt;リポジトリのセキュリティアドバイザリ&lt;/a&gt;を使えば、アドバイザリを非公開で下書きし、識別子を申請できる。&lt;/p&gt;
&lt;p&gt;セキュリティのエントリには、通常、次の4つの事実が含まれる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;攻撃者が何をできたか。一文で、概念実証は書かない。&lt;/li&gt;
&lt;li&gt;影響を受けるバージョンと、修正されたバージョン。&lt;/li&gt;
&lt;li&gt;緊急度。「本日アップグレード」か「次のリリース時にアップグレード」か。&lt;/li&gt;
&lt;li&gt;悪用を確認したかどうか。報告者が同意していれば、その謝辞。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;悪用の手順は書かない。&lt;/p&gt;
&lt;h2&gt;データ損失の修正について、ノートには何を書くべきか&lt;/h2&gt;
&lt;p&gt;どのデータが影響を受けたか、自分のデータが該当するかどうかをどう確かめるか、復旧できるかどうかを書く。ここで「対応は不要です」が当てはまることはまずなく、読者の最初の問いは「自分のデータは消えたのか」だ。&lt;/p&gt;
&lt;p&gt;使えるエントリには、データが失われた条件(「同期の実行中にフォルダを削除した場合」)、それが起こり得た期間、確認方法(「ゴミ箱を開いて、9月3日から9日の日付の項目を探してください」)、復旧の手順が書かれている。データが復旧できないなら、そう伝える。影響を受けた顧客には直接も連絡する。リリースノートが、データが被害を受けたことを知る唯一の場所であってはならないからだ。&lt;/p&gt;
&lt;h2&gt;「バグ修正とパフォーマンスの改善」がなぜ良くないノートなのか&lt;/h2&gt;
&lt;p&gt;読者が行動できる材料を何も与えず、誰かが待っていた修正を隠してしまう。クラッシュを報告した顧客は、それが直ったのかどうか分からず、回避策を使っている顧客は、それを外すべきかどうか分からない。&lt;/p&gt;
&lt;p&gt;誠実な選択肢は二つある。読者が気づけるものが何もないリリースなら、ノートは公開せず、記録はチェンジログに任せる。修正があるなら、読者の言葉で並べる。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;前:
  バグ修正とパフォーマンスの改善。

後:
  修正: タグのないプロジェクトでCSVエクスポートが失敗する。
  修正: ダークモードでコメント欄のカーソルが見えない。
  高速化: プロジェクトが100件を超えるワークスペースで、
  ダッシュボードの表示が速くなりました。
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;バグ修正のノートは何を元に書くのか&lt;/h2&gt;
&lt;p&gt;バグを直したプルリクエストと、きっかけになった報告が元になる。報告者の言葉が修正と一緒に伝わっていれば、症状の半分はもう書けている。&lt;/p&gt;
&lt;p&gt;報告を正しくラベル付けすることが、誰が担当するかを決める理由は、&lt;a href=&quot;https://changeloop.dev/blog/ja/feature-request-vs-bug-report/&quot;&gt;機能リクエストとバグ報告の違い&lt;/a&gt;で説明している。Changeloopでは、ウィジェットから報告されたバグは &lt;code&gt;bug&lt;/code&gt; ラベル付きのGitHub Issueになり、チェンジログのエントリはマージされたプルリクエストから下書きされ、公開前に人が承認するまで保留される。&lt;a href=&quot;https://changeloop.dev/release-notes-template&quot;&gt;リリースノートのテンプレート&lt;/a&gt;は、手で書くときの同じエントリの形を示す。症状、範囲、期間、行動だ。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;バグ修正のリリースノートには何を含めるべきか?&lt;/strong&gt;
各エントリで、ユーザーが見た症状、誰が影響を受けたか、どのリリースまたは日付からか、修正は完全か、読者が何をする必要があるか(「何もない」を含む)を示す。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;すべてのバグ修正をリリースノートに載せるべきか?&lt;/strong&gt;
載せない。ユーザーが気づいた可能性がある、時間を失った、または回避したものを載せ、見た目上や社内の修正は短い「軽微な修正」のリストにまとめる。チェンジログは、確認したい人のためにすべての修正を保持する。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;自分が持ち込んだバグのリリースノートはどう書くか?&lt;/strong&gt;
リグレッションだったと述べ、それを持ち込んだリリースと修正したリリースを挙げ、回避策を外してよいかどうかを読者に伝える。柔らかくした表現よりも、率直な書き方のほうが読みやすい。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;自分が使っている製品のリリースノートはどう確認するか?&lt;/strong&gt;
製品のヘルプメニュー、フッター、ドキュメントからリンクされているチェンジログやリリースノートのページを探す。オープンソースなら、リポジトリのリリースタブを見る。&lt;/p&gt;
</content:encoded></item><item><title>ソフトウェア製品で顧客フィードバックを求める方法と使える質問文</title><link>https://changeloop.dev/blog/ja/how-to-ask-for-customer-feedback/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/how-to-ask-for-customer-feedback/</guid><description>顧客フィードバックは、ユーザーが作業を終えた直後に、その場で具体的な質問を一つだけ投げて集める。場面別の質問文、避ける聞き方、回答の扱いを紹介する。</description><pubDate>Fri, 02 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;ソフトウェア製品で顧客フィードバックを求めるには、ユーザーがたった今したことについて、それをした場所で、具体的な質問を一つだけ投げる。エクスポートの直後に「このレポートのエクスポートはどうでしたか?」と聞けば答えが返ってくる。フッターに「製品についてのご意見をお聞かせください」と置いても、返ってくるのは沈黙だ。このページの残りは、聞くタイミング、チャネル、そして具体的な文面についてだ。&lt;/p&gt;
&lt;p&gt;この話題の助言の多くは、店舗やサービスデスク向けに書かれている。ソフトウェアのチームは、ユーザーが一秒前に何をしたかを正確に知っている。だから質問も、その行動について聞ける。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;タイミング&lt;/th&gt;
&lt;th&gt;聞く場所&lt;/th&gt;
&lt;th&gt;そのまま使える質問&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;タスクが終わった直後&lt;/td&gt;
&lt;td&gt;アプリ内、結果のそば&lt;/td&gt;
&lt;td&gt;「このエクスポートで必要なことはできましたか?」&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;新機能を初めて使った後&lt;/td&gt;
&lt;td&gt;アプリ内、一度だけ&lt;/td&gt;
&lt;td&gt;「一括編集で何をしようとしていましたか?」&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;サポートチケットが解決した後&lt;/td&gt;
&lt;td&gt;サポートのスレッド内&lt;/td&gt;
&lt;td&gt;「それで解決しましたか、それとも何かまだおかしいですか?」&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ユーザーが止まった、またはフローを離れた後&lt;/td&gt;
&lt;td&gt;メール、翌日&lt;/td&gt;
&lt;td&gt;「セットアップの3ステップ目で止まっていました。何が障害になりましたか?」&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;30日間の定期利用の後&lt;/td&gt;
&lt;td&gt;名前のある人からのメール&lt;/td&gt;
&lt;td&gt;「一つだけ変えるとしたら何ですか?」&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ユーザーが解約するとき&lt;/td&gt;
&lt;td&gt;解約フローの中&lt;/td&gt;
&lt;td&gt;「今日やめると決めた理由は何ですか?」&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;依頼されたものをリリースした後&lt;/td&gt;
&lt;td&gt;依頼された場所&lt;/td&gt;
&lt;td&gt;「CSVインポートをご要望いただきました。公開されました。ご利用のケースに合っていますか?」&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;フィードバックを求める適切なタイミングはいつか&lt;/h2&gt;
&lt;p&gt;適切なタイミングは、ユーザーが何かを終えた直後で、細部がまだ頭に残っているときだ。行動に続く質問は、その行動についての答えを引き出す。突然届く質問は、そのときの気分についての答えか、答えなしで終わる。&lt;/p&gt;
&lt;p&gt;登録時には聞かない。まだ誰も何も使っていないからだ。作業の途中でも聞かない。知りたいことそのものを邪魔してしまう。一度答えてくれた人には、報告できることができるまでそっとしておく。&lt;/p&gt;
&lt;h2&gt;顧客フィードバックはどこで求めるべきか&lt;/h2&gt;
&lt;p&gt;体験が起きた場所で聞く。画面についての質問にはアプリ内のプロンプトが合う。修正についての質問にはサポートのスレッドが合う。一週間の利用や、途中でやめたフローについての質問にはメールが合う。予測できない質問には通話が合う。&lt;/p&gt;
&lt;p&gt;チャネルごとに得られる答えの種類は違う。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;アプリ内:&lt;/strong&gt; 短く、即時で、具体的。ただし、その場にいる人からしか返ってこない。去ったユーザーからは何も聞こえない。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;サポートのスレッド:&lt;/strong&gt; わざわざ問い合わせるほど苛立っていた人からのもの。壊れているものを見つけるには良いが、製品の残りの部分を判断するには向かない。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;メール:&lt;/strong&gt; 人数は少ないが長い答えが返ってくる。静かになったユーザーに届く唯一の方法でもある。名前のある人からの短いメモとして書き、質問は一つだけにする。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;インタビュー:&lt;/strong&gt; 人がなぜそうするのかを知る方法。普段の仕事のやり方を見せてもらい、その間は黙っている。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;各チャネルの話をどう重み付けるかは、&lt;a href=&quot;https://changeloop.dev/blog/ja/feedback-signal-quality/&quot;&gt;フィードバックのシグナルの質&lt;/a&gt;で扱っている。&lt;/p&gt;
&lt;h2&gt;失礼にならずにフィードバックを依頼するには&lt;/h2&gt;
&lt;p&gt;対象を具体的にし、なぜ聞くのかを伝え、答えるのに一分もかからないようにする。きちんとした依頼は、タイミングを特定し、誰かが答えを読むことを明らかにし、邪魔したことを詫びない。&lt;/p&gt;
&lt;p&gt;実行したばかりの操作を正確に名指し(「先ほど実行したエクスポート」)、聞くのは一つだけにし、必須項目のない自由記述欄を使い、名前で署名する。&lt;/p&gt;
&lt;h2&gt;フィードバックを求める良い一文とは&lt;/h2&gt;
&lt;p&gt;良い一文は、特定の場面についての質問で、数語で答えられるものだ。下の二つの列を比べてほしい。左はどれも肩をすくめるだけで答えられる。右は、本当にあったことを思い出してもらう必要がある。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;弱い聞き方&lt;/th&gt;
&lt;th&gt;強い聞き方&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;「ご意見はありますか?」&lt;/td&gt;
&lt;td&gt;「このセットアップで一番難しかったのは何ですか?」&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;「当社の製品はいかがですか?」&lt;/td&gt;
&lt;td&gt;「先週、これを何に使いましたか?」&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;「体験を10段階で評価してください。」&lt;/td&gt;
&lt;td&gt;「今日やりに来たことは終わりましたか?」&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;「改善点を教えてください。」&lt;/td&gt;
&lt;td&gt;「今週、作業が遅くなったことを一つ挙げるとしたら何ですか?」&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;「当社を人にすすめますか?」&lt;/td&gt;
&lt;td&gt;「最後にこれを誰に見せて、何と言いましたか?」&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;ほとんどどこでも使えるもう一つの質問がある。「これがうまくいかないとき、代わりに何を使っていますか?」本当の競合を浮かび上がらせる質問で、それはたいていスプレッドシートだ。&lt;/p&gt;
&lt;h2&gt;フィードバックの最悪な聞き方とは&lt;/h2&gt;
&lt;p&gt;最悪の聞き方は、広すぎる、早すぎる、長すぎる、誘導的である、のどれかだ。共通する問題は、本来あなたがすべき思考を、相手がやらなければ答えられないことだ。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;「20問のアンケートにご協力ください。」&lt;/strong&gt; 最後まで答える人は、時間が最もある人か、意見が最も強い人だ。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ログイン後の最初のページに出るポップアップ。&lt;/strong&gt; ユーザーは何かをしに来たのに、あなたがそれを妨げた。閉じるのが唯一の賢明な答えだ。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;質問のない「ご意見をお待ちしています!」&lt;/strong&gt; 話題を考えるところからユーザーに頼んでいる。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;誘導質問:「新しいダッシュボードはどのくらい気に入りましたか?」&lt;/strong&gt; 同意は得られるが、何も学べない。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;フォローアップのない評価。&lt;/strong&gt; 10点中6点は気分を伝えるが、何を変えるべきかは伝えない。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;聞いたきり、沈黙する。&lt;/strong&gt; 次の回を失うことになる。これは後で説明する。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;製品についての顧客フィードバックは何と呼ぶか&lt;/h2&gt;
&lt;p&gt;製品についてのフィードバックは通常、プロダクトフィードバックと呼ばれ、二つに分類される。バグ報告は、何かが意図どおりに動いていないことを伝える。機能リクエストは、何かが足りないことを伝える。この区別が、誰が最初に見るかを決める。その線引きは&lt;a href=&quot;https://changeloop.dev/blog/ja/feature-request-vs-bug-report/&quot;&gt;機能リクエストとバグ報告の違い&lt;/a&gt;で説明している。三つ目の種類である称賛は、取っておいて、許可を得て引用する価値がある。&lt;/p&gt;
&lt;p&gt;最初の選択肢として「バグ」と「機能リクエスト」を提示するフィードバックフォームは、この最初の仕分けを代わりにやってくれる。&lt;/p&gt;
&lt;h2&gt;回答をどうするか&lt;/h2&gt;
&lt;p&gt;すべての回答を、チームがすでに作業している場所に、本人の言葉のまま置く。引用した一行のテキストは、あなたによる要約より価値がある。種類とおおよその緊急度でタグ付けし、重複をまとめ、決める。作る、保留する、断る、のどれかだ。&lt;/p&gt;
&lt;p&gt;断ることも一つの答えだ。「これは作りません。理由はこうです」と伝えれば待たせることが終わる。その言い方は&lt;a href=&quot;https://changeloop.dev/blog/ja/declining-feature-requests/&quot;&gt;機能リクエストを断る&lt;/a&gt;にある。仕組みの面では、&lt;a href=&quot;https://changeloop.dev/blog/ja/feature-request-tracking/&quot;&gt;機能リクエストの追跡&lt;/a&gt;が、5つのチャネルからのリクエストを一つのリストにまとめる方法を説明している。リクエストを文章で受け付けるなら、&lt;a href=&quot;https://changeloop.dev/blog/ja/feature-request-template/&quot;&gt;機能リクエストのテンプレート&lt;/a&gt;が、リクエストを比較可能な形に保つ。&lt;/p&gt;
&lt;p&gt;Changeloopのウィジェットは、投稿ごとにGitHubのIssueを作るので、フィードバックはそれを直すコードのすぐ隣に届く。どのツールでもルールは同じだ。リストは一つ、担当者は一人、誰かの受信箱に残されたままの回答は作らない。&lt;/p&gt;
&lt;h2&gt;なぜリリースしたことを伝えるのか&lt;/h2&gt;
&lt;p&gt;答えることに時間をかける価値があったと、相手に示せるからだ。何かを伝えて、後から「これがリリースされました、ありがとうございます」と聞いたユーザーには、また答える理由ができる。何も聞かなかったユーザーは、あの入力欄は読まれていないと結論づける。&lt;/p&gt;
&lt;p&gt;だから聞くことの最後のステップは返信になる。依頼した一人ひとりに、リクエストがリリースされたときに、本人の言葉で、使ったチャネルで伝える。&lt;a href=&quot;https://changeloop.dev/blog/ja/customer-feedback-loop/&quot;&gt;カスタマーフィードバックループを閉じる&lt;/a&gt;では仕組みを説明している。公開されたチェンジログのエントリがメッセージのきっかけになるので、依頼者に伝わるのは変更が実際に公開されてからだ。Changeloopでは、ウィジェットのフィードバックがGitHubのIssueになり、マージされたプルリクエストがそれを閉じた場合、エントリを承認するとそのIssueに「Shipped」のコメントが投稿され、投稿者にはウィジェットの中でそのエントリが表示される。手作業で立てたIssueや、GitLabとBitbucketのリポジトリには、コメントは付かない。&lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;ウィジェットとフィードの設定&lt;/a&gt;はドキュメントに載っている。&lt;/p&gt;
&lt;p&gt;返信は短くていい。「3月にCSVインポートをご要望いただきました。本日公開されました。使い方はこちらです。」それは次の最良の質問、つまり必要なことをカバーできているかどうかを聞く機会にもなる。&lt;/p&gt;
&lt;h2&gt;最初の計画&lt;/h2&gt;
&lt;p&gt;冒頭の表から、ユーザーが最も成功するか諦めるかの場面を一つ選ぶ。それ用の質問を一つ書き、一つのチャネルに置き、二つ目のプロンプトを加える前に二週間、すべての回答を読む。具体的なことを教えてくれた人には必ず返信する。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;顧客にはどのくらいの頻度でフィードバックを求めるべきか?&lt;/strong&gt;
カレンダーではなくイベントに紐づけて聞く。ユーザーに見せるプロンプトは週に一回まで、回答直後には出さない。フィードバックの次に送るメッセージは、それがどうなったかについての返信であるべきだ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ユーザーを煩わせずにフィードバックを求めるには?&lt;/strong&gt;
タスクの後に聞き、途中では決して聞かない。質問は一つに絞り、簡単に閉じられるようにする。閉じられたら、数週間はその意思を尊重する。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;フィードバックにインセンティブを用意すべきか?&lt;/strong&gt;
たいていは必要ない。具体的な質問と目に見える返信のほうが、ギフトカードより重みがあり、インセンティブは報酬が目当ての人を引き寄せる。取っておくのはインタビューで、相手の20分をお願いする場面だ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;誰も答えてくれない場合は?&lt;/strong&gt;
質問を絞り、場面にもっと近づける。たとえば一つの画面について、使った直後に聞く。それでも静かなら、数人のユーザーに直接メールを送り、その会話を使ってより良いプロンプトを書く。&lt;/p&gt;
</content:encoded></item><item><title>プロダクトロードマップの例:6つの形式と、それぞれの失敗パターン</title><link>https://changeloop.dev/blog/ja/product-roadmap-examples/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/product-roadmap-examples/</guid><description>Now/Next/Laterなど6形式のロードマップを、現実的な項目例で解説する。各形式が向く読者と崩れる典型的な原因、形式の選び方、最新に保つ方法を紹介する。</description><pubDate>Fri, 02 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;参考にする価値のあるプロダクトロードマップの例は、6つの形式に分かれる。Now/Next/Later、四半期のタイムライン、テーマ型、アウトカム型、公開ロードマップ、そして社内のリリースロードマップだ。それぞれ違う読者の違う問いに答えるので、選ぶべき例は、自分のロードマップを読む人に合うものになる。見た目のレイアウトを決めるのは最後でいい。&lt;/p&gt;
&lt;p&gt;以下の例はすべて、小さなチーム向けタスク管理アプリという架空のプロダクトのもので、項目もすべて作り話だ。注目してほしいのは形のほうである。各スロットに何を書くか、実際のエントリはどんな見た目か、そしてその形式が一四半期後にどこで破綻するか。&lt;/p&gt;
&lt;h2&gt;良いプロダクトロードマップの例とは&lt;/h2&gt;
&lt;p&gt;良いロードマップの例は、短く、読者が決まっていて、約束の種類が一つに絞られている。守れる約束に合わせて形式を選ぶ。方向性、日付、取り組みのテーマ、成果、公開のコミットメント、提供スケジュールのどれかだ。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;形式&lt;/th&gt;
&lt;th&gt;想定する読者&lt;/th&gt;
&lt;th&gt;機能する条件&lt;/th&gt;
&lt;th&gt;破綻する条件&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Now/Next/Later&lt;/td&gt;
&lt;td&gt;会社全体&lt;/td&gt;
&lt;td&gt;計画がよく変わる&lt;/td&gt;
&lt;td&gt;「Next」が埋まって順番待ちの列になる&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;四半期タイムライン&lt;/td&gt;
&lt;td&gt;営業、サポート、経営層&lt;/td&gt;
&lt;td&gt;日付が本物の制約である&lt;/td&gt;
&lt;td&gt;日付がずれても誰も更新しない&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;テーマ型&lt;/td&gt;
&lt;td&gt;経営層、新入社員&lt;/td&gt;
&lt;td&gt;理由を説明したい&lt;/td&gt;
&lt;td&gt;テーマが広すぎてどの項目も当てはまる&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;アウトカム型&lt;/td&gt;
&lt;td&gt;プロダクトとエンジニアリング&lt;/td&gt;
&lt;td&gt;目標を測定できる&lt;/td&gt;
&lt;td&gt;指標に担当者もデータもない&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;公開&lt;/td&gt;
&lt;td&gt;顧客&lt;/td&gt;
&lt;td&gt;小さく保てる&lt;/td&gt;
&lt;td&gt;バックログの捨て場になる&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;社内リリース&lt;/td&gt;
&lt;td&gt;エンジニアリング、QA、サポート&lt;/td&gt;
&lt;td&gt;複数のチームが同時にリリースする&lt;/td&gt;
&lt;td&gt;戦略と取り違えられる&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;プロダクトロードマップの例は実際どんな見た目か&lt;/h2&gt;
&lt;p&gt;以下では各形式を現実的なエントリで示し、続けて、誰に向いているか、いつ持ちこたえるか、そしてたいていどう失敗するかを書く。&lt;/p&gt;
&lt;h3&gt;Now/Next/Later&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;NOW (今月、開発中)
  受信トレイの保存ビュー
  大規模アカウントで動くCSVエクスポート
NEXT (決定済み、順番は未定)
  Teamプラン向けSSO
  Slack通知
LATER (方向性のみ、約束なし)
  モバイルアプリ
  監査ログ
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;日付を約束したくない会社に向いており、初期段階のチームの多くに当てはまる。3つの列が確度の違いを表しているので長持ちする。「now」は進行中、「next」は決定済み、「later」は願望だ。破綻するのは、「later」が断りたくないアイデアの置き場になったときと、「next」がいつの間にか順番と日付を持ち、誰もそれをタイムラインと呼ばないまま運用されるときだ。&lt;/p&gt;
&lt;h3&gt;タイムライン(四半期)ロードマップ&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;2026年 Q4
  10月  受信トレイの保存ビュー
  11月  デザインパートナー5社とSSOベータ
  12月  SSO一般提供
2027年 Q1
  1月   Slack通知
  3月   監査ログ(エクスポートのみ)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;何かに合わせて計画を立てる必要がある営業、サポート、経理に向いている。契約、カンファレンス、コンプライアンスの期限のように、日付が本物の制約であるときに機能する。日付が推測にすぎないと破綻する。ロードマップ上の「何月」は、数週間のうちに営業資料の中で約束に変わってしまうからだ。この形式を使うなら、各四半期に「確定」か「見込み」かを明記し、2四半期目は1四半期目よりはっきりと曖昧に見えるようにする。&lt;/p&gt;
&lt;h3&gt;テーマ型ロードマップ&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;THEME: 最初の1週間の体験
  CSVとTrelloからのインポート
  スターターテンプレート
THEME: 大きなチームへの対応
  SSO
  監査ログ
  ロール権限
THEME: 手作業を減らす
  Slack通知
  繰り返しタスク
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;作業を並べる前に、その作業がなぜあるのかを説明するので、経営層への報告や新入社員向けに向いている。各テーマが顧客の関心の理由に対応しているなら持ちこたえる。テーマが「成長」「品質」のように広すぎて、どの項目もどのテーマにも入ってしまうと破綻する。そうなると、グルーピングは何も説明していない。&lt;/p&gt;
&lt;h3&gt;アウトカム型ロードマップ&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;GOAL: セットアップを終える新規チームを増やす
  指標: 7日以内にセットアップ完了、40%から55%
  施策: CSVインポート、スターターテンプレート
GOAL: エクスポート関連のサポート問い合わせを減らす
  指標: 週あたりのエクスポート問い合わせ、30件から10件
  施策: 大規模アカウントのエクスポート修正、エクスポート状況ページ
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;数字は説明用のものであり、ポイントはレイアウトだ。目標が一つ、開始値と目標値のある指標が一つ、そして試す施策。解決策の選択を任されているプロダクトチームとエンジニアリングチームに向いている。指標が存在し、担当者がいれば機能する。目標が測定できないとき、または「施策」が以前と同じ機能リストに成果の一文を載せただけのときに破綻する。&lt;/p&gt;
&lt;h3&gt;公開向けの顧客ロードマップ&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;PLANNED
  受信トレイの保存ビュー
BUILDING
  Slack通知
SHIPPED
  大規模アカウント向けCSVエクスポート
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最も小さい形式で、最も強い約束をする。自分の要望が届いたかどうかを知りたい顧客に向いている。項目がごく少なく、日付がなく、タイトルが顧客の言葉で書かれていれば持ちこたえる。バックログの捨て場になると破綻する。載せた「かもしれない」項目は、あとで誰かに問われる約束になる。課題トラッカーから運用する仕組みは&lt;a href=&quot;https://changeloop.dev/blog/ja/public-roadmap/&quot;&gt;3つの列で作る公開ロードマップ&lt;/a&gt;にあるので、ここでは繰り返さない。&lt;/p&gt;
&lt;h3&gt;社内リリースロードマップ&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;リリース&lt;/th&gt;
&lt;th&gt;目標&lt;/th&gt;
&lt;th&gt;担当&lt;/th&gt;
&lt;th&gt;依存&lt;/th&gt;
&lt;th&gt;ステータス&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;5.2&lt;/td&gt;
&lt;td&gt;10月14日&lt;/td&gt;
&lt;td&gt;Platform&lt;/td&gt;
&lt;td&gt;認証サービスのアップグレード&lt;/td&gt;
&lt;td&gt;コード完成&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.3&lt;/td&gt;
&lt;td&gt;11月11日&lt;/td&gt;
&lt;td&gt;Inbox&lt;/td&gt;
&lt;td&gt;保存ビューAPI&lt;/td&gt;
&lt;td&gt;進行中&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.4&lt;/td&gt;
&lt;td&gt;12月9日&lt;/td&gt;
&lt;td&gt;Platform&lt;/td&gt;
&lt;td&gt;SSOベンダーとの契約&lt;/td&gt;
&lt;td&gt;ブロック中&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;何が同時に出荷され、何が何をブロックしているかを知る必要があるエンジニアリング、QA、サポートに向いている。週単位で正確で、各行に担当者がいれば機能する。誰かが戦略と取り違えたときに破綻する。提供スケジュールは、何がいつ出ていくかを示すだけで、そのリリースが正しい賭けだったかどうかについては何も語らない。&lt;/p&gt;
&lt;h2&gt;どのプロダクトロードマップ形式を選ぶべきか&lt;/h2&gt;
&lt;p&gt;まず読者で選び、次に実際にどれだけ確度があるかで選ぶ。誰が読み、それがどんな判断に役立つのか答えられないなら、上のどの例を使っても立て直せない。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;顧客が「私の声は届いた?」と聞いている。&lt;/strong&gt; 公開形式を使い、項目は数個に絞る。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;営業とサポートが「顧客に日付を言っていい?」と聞いている。&lt;/strong&gt; 四半期タイムラインを使い、確定と見込みをはっきり分ける。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;経営層が「なぜこの作業?」と聞いている。&lt;/strong&gt; テーマ型、データがあるならアウトカム型を使う。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;毎月方向が変わるチーム。&lt;/strong&gt; Now/Next/Laterを使い、日付を付けるのを我慢する。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;エンジニアが「何がいつ出る?」と聞いている。&lt;/strong&gt; リリースロードマップを使い、戦略のロードマップとは分けておく。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;多くのチームは、最終的に2つに落ち着く。最初の4つの形のどれかによる戦略ロードマップと、その下にあるリリーススケジュールだ。公開ロードマップは、戦略ロードマップから、自分たちが責任を持てるものだけを取り出したフィルタ済みのビューになる。&lt;/p&gt;
&lt;h2&gt;プロダクトロードマップはどう書くか&lt;/h2&gt;
&lt;p&gt;読者に名前を付け、その人の問いに合う形式を選び、会議で擁護できる項目だけを並べ、各項目にステータスと担当者を付けて書く。そして公開する前に、どのくらいの頻度で見直すかを決める。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;読者と判断を決める。&lt;/strong&gt;「サポートがSSOについて顧客に何と伝えるかを決める」は理由になる。「全員がロードマップを見られるように」では、設計の手がかりがない。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;すでに知っていることから始める。&lt;/strong&gt; 未対応の要望を、&lt;a href=&quot;https://changeloop.dev/blog/ja/prioritizing-feature-requests/&quot;&gt;説明できるルールで順位付け&lt;/a&gt;したものは、ブレインストーミングよりも良い素材になる。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;各項目を顧客の成果として書く。&lt;/strong&gt;「よく使うフィルタを保持する」は「保存ビューの永続化を実装」より読みやすく、それが自分の問題かどうかを顧客に伝える。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ロードマップに含めないものを決める。&lt;/strong&gt; 日付、見積もり、アイデアのバックログが、よくある3つの除外対象だ。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;見直しの日を決める。&lt;/strong&gt; 見直しの予定がないロードマップには、予定のない葬式が待っている。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;プロダクトロードマップを最新に保つには&lt;/h2&gt;
&lt;p&gt;作業が動いたときに、作業を追跡している同じ場所から項目を動かし、項目がリリースされたり取りやめになったりしたときに何が起きたかを記録する。別のツールで手作業で更新するロードマップは、誰の日常業務でもないので古くなる。&lt;/p&gt;
&lt;p&gt;最も安上がりな信頼できる情報源は課題トラッカーだ。ロードマップの各列が課題のラベルに対応していれば、ラベルが変わるとロードマップも変わり、何も打ち直す必要がない。Changeloopの方式では &lt;code&gt;roadmap:planned&lt;/code&gt;、&lt;code&gt;roadmap:building&lt;/code&gt;、&lt;code&gt;roadmap:shipped&lt;/code&gt; のラベルを使い、課題に2つ付いている場合は、より進んでいるほうが優先される。カードをshippedに動かすのは、やはり独立したラベル変更なので、チェンジログのエントリを承認するレビューの一部にしておく。&lt;/p&gt;
&lt;p&gt;そのエントリが、もう半分だ。項目がリリースされたとき、チェンジログは顧客の言葉で何が変わったかを伝え、それを求めた人にも知らせることができる。このループを閉じることが&lt;a href=&quot;https://changeloop.dev/blog/ja/customer-feedback-loop/&quot;&gt;カスタマーフィードバックループ&lt;/a&gt;の目的であり、ロードマップは、リリースの前に顧客が見られるそのループの一区間だ。項目を取りやめるなら、そう伝える。公開の「やらない」という答えも、そのリクエストを閉じる。その書き方は&lt;a href=&quot;https://changeloop.dev/blog/ja/declining-feature-requests/&quot;&gt;機能リクエストを断る&lt;/a&gt;で扱っている。完成したエントリがどう読めるかを見たいチームは、&lt;a href=&quot;https://changeloop.dev/changelog-examples&quot;&gt;チェンジログの例&lt;/a&gt;を参照してほしい。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;最もシンプルなプロダクトロードマップの形式は何か?&lt;/strong&gt;
Now/Next/Laterだ。列は3つで、日付は不要、項目を確度でグループ化する。頻繁に方向を変える小さなチームにとって、恥ずかしい形で大きく間違えにくい形式でもある。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;プロダクトロードマップには何項目あるべきか?&lt;/strong&gt;
思ったより少なくていい。公開ロードマップなら全列を合わせて10項目未満で足り、社内の戦略ロードマップも12項目を超えることはまずない。それ以上は、見出しだけ立派なバックログだ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;プロダクトロードマップに日付を入れるべきか?&lt;/strong&gt;
日付が本物の制約である場合に限り、それも直近の四半期だけにする。それより先は列かテーマを使う。ロードマップ上の日付は、意図したかどうかにかかわらず、営業の会話の中でコミットメントになる。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;プロダクトロードマップとリリース計画の違いは何か?&lt;/strong&gt;
ロードマップは何をなぜ作るつもりかを示し、リリース計画はどのビルドをいつ出荷し、誰が担当するかを示す。ロードマップは戦略が変わると変わり、リリース計画は作業が変わると変わる。&lt;/p&gt;
</content:encoded></item><item><title>頻繁にリリースするチームのためのリリース管理プロセス</title><link>https://changeloop.dev/blog/ja/release-management-process/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/release-management-process/</guid><description>スコープ計画から振り返りまでの七つのステップで、リリース管理プロセスを説明する。各担当者と完了条件、リリース種別ごとの違い、DORA指標を紹介する。</description><pubDate>Fri, 02 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;リリース管理プロセスとは、変更を「マージ済み」から「本番で動いていて、影響を受ける人に説明されている」状態まで進める一連のステップだ。頻繁にリリースするチームなら、7つのステップに集約される。スコープの計画、変更の分離、ビルドとテスト、承認、デプロイと検証、連絡、そして振り返りだ。各ステップには、名前のある担当者と一つの完了条件が必要で、なければ、いつの間にか行われなくなる。&lt;/p&gt;
&lt;p&gt;このガイドは、週次または毎日デプロイし、プロセスが邪魔にならないようにしたい、5人から50人のエンジニアのチームを想定している。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ステップ&lt;/th&gt;
&lt;th&gt;担当&lt;/th&gt;
&lt;th&gt;完了条件&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;1. スコープを計画する&lt;/td&gt;
&lt;td&gt;プロダクトまたはテックリード&lt;/td&gt;
&lt;td&gt;このリリースの変更リストが書き出され、リスクのあるものに印が付いている&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. ブランチまたはフラグ&lt;/td&gt;
&lt;td&gt;変更を担当するエンジニア&lt;/td&gt;
&lt;td&gt;作業が短命のブランチかフラグの裏にあり、mainがリリース可能な状態に保たれている&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. ビルドとテスト&lt;/td&gt;
&lt;td&gt;CI、失敗時は作者が対応&lt;/td&gt;
&lt;td&gt;出荷するそのコミットでパイプラインがグリーン&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. 承認&lt;/td&gt;
&lt;td&gt;レビュアー、リスクのある変更ではリリースマネージャーも&lt;/td&gt;
&lt;td&gt;レビュー完了、ロールバックの手順が明記され、Go/No-Goが記録されている&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5. デプロイと検証&lt;/td&gt;
&lt;td&gt;リリースマネージャーまたはオンコールのエンジニア&lt;/td&gt;
&lt;td&gt;デプロイ済み、スモークチェックが通り、エラー率とレイテンシがリリース前のベースラインと一致&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6. 連絡する&lt;/td&gt;
&lt;td&gt;変更を理解している人、理解していない人が編集&lt;/td&gt;
&lt;td&gt;ユーザーが読む場所にリリースノートが公開され、サポートと営業に伝わっている&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7. 振り返る&lt;/td&gt;
&lt;td&gt;リリースマネージャー&lt;/td&gt;
&lt;td&gt;指標を読み、うまくいかなかったことに担当者と修正がある&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;リリース管理プロセスとは何か&lt;/h2&gt;
&lt;p&gt;変更がユーザーに届くまでにたどる、繰り返せる道筋のことだ。スコープ、ビルド、テスト、承認、デプロイ、検証、告知、そして振り返り。これを書き出す意味は、すべてのリリースが同じ道筋をたどるので、休暇中の人も、新入社員も、午前2時のオンコールのエンジニアも、誰にも聞かずに実行できるようになることだ。&lt;/p&gt;
&lt;h2&gt;リリース管理にはどんな種類があるか&lt;/h2&gt;
&lt;p&gt;実用的には三つの種類がある。継続的デプロイ、定期リリース、そして規制対応の変更管理だ。リリースの前にどれだけのことが行われ、どれだけが自動化されているかが違う。継続的デプロイはマージされたすべての変更を出荷し、定期リリースは変更をまとめてトレインに載せ、規制対応の変更管理は正式な承認と監査証跡を加える。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;継続的デプロイ&lt;/th&gt;
&lt;th&gt;定期リリース&lt;/th&gt;
&lt;th&gt;規制対応またはITILの変更管理&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;リリースの単位&lt;/td&gt;
&lt;td&gt;マージされたプルリクエスト一つ&lt;/td&gt;
&lt;td&gt;週次または隔週のまとまり&lt;/td&gt;
&lt;td&gt;変更要求&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;スコープのステップ&lt;/td&gt;
&lt;td&gt;暗黙的、マージがスコープ&lt;/td&gt;
&lt;td&gt;リリース計画のミーティング&lt;/td&gt;
&lt;td&gt;リスク評価付きの変更記録&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;承認&lt;/td&gt;
&lt;td&gt;コードレビューと自動チェック&lt;/td&gt;
&lt;td&gt;リリースマネージャーがまとまりを承認&lt;/td&gt;
&lt;td&gt;変更諮問委員会または委任された承認者&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;リスク管理&lt;/td&gt;
&lt;td&gt;フィーチャーフラグ、カナリア、高速なロールバック&lt;/td&gt;
&lt;td&gt;ステージングでの検証、リリース候補&lt;/td&gt;
&lt;td&gt;文書化された切り戻し計画、メンテナンスウィンドウ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;典型的な頻度&lt;/td&gt;
&lt;td&gt;1日に何度も&lt;/td&gt;
&lt;td&gt;週次から月次&lt;/td&gt;
&lt;td&gt;変更カレンダーで決まる&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;弱点&lt;/td&gt;
&lt;td&gt;何が変わったかを誰もユーザーに伝えない&lt;/td&gt;
&lt;td&gt;大きなまとまりが、壊したのがどの変更かを隠す&lt;/td&gt;
&lt;td&gt;プロセスにかかる時間が変更そのものを上回る&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;ほとんどのチームは混合型だ。SaaS製品は継続的にデプロイしながら、モバイルアプリは週次のトレインで出し、監査人が気にする決済サービスだけは正式な変更記録に従う、ということがある。種類は会社ごとではなく、サービスごとに選ぶ。変更が段階的にしか公開されない場合、リリースと告知は別々のイベントになる。そのケースは&lt;a href=&quot;https://changeloop.dev/blog/ja/feature-flags-feature-requests/&quot;&gt;フィーチャーフラグのリリースノート&lt;/a&gt;で扱っている。&lt;/p&gt;
&lt;h2&gt;リリースマネージャーの責任は何か&lt;/h2&gt;
&lt;p&gt;リリースマネージャーは、変更が本番に至る道筋を管理する。リリースカレンダーを保ち、変更の準備ができているかを判断し、デプロイを実行または監督し、ロールバックの判断を下し、ユーザーに確実に伝え、その後の振り返りを行う。&lt;/p&gt;
&lt;p&gt;リリースの前には、スコープを確認し、リスクのあるすべての変更にロールバックの手順があるかをチェックする。リリース中は、デプロイのチェックリストを実行し、本番の指標の最初の数分を見守り、早めにロールバックを判断する。その後は、ノートが出されたことを確認し、プロセスで直すべき点を記録する。&lt;/p&gt;
&lt;p&gt;小さなチームでは、この役割を週ごとに交代し、誰も暗黙知を必要としないようにチェックリストを書いておく。独立してリリースされるパッケージが多い&lt;a href=&quot;https://changeloop.dev/blog/ja/monorepo-changelogs/&quot;&gt;モノレポ&lt;/a&gt;では、通常、パッケージごとにリリース担当者が必要で、そうしないとこの役割がボトルネックになる。&lt;/p&gt;
&lt;h2&gt;リリース管理の主なKPIは何か&lt;/h2&gt;
&lt;p&gt;DORAのソフトウェアデリバリー指標を追跡し、自分たちの指標を一つ加える。ユーザーに伝えるまでにかかる時間だ。DORAの調査は五つの指標を挙げており、スループット(変更のリードタイム、デプロイ頻度、失敗したデプロイからの復旧時間)と不安定性(変更失敗率、デプロイのやり直し率)に分かれる。&lt;/p&gt;
&lt;p&gt;DORAのガイドは、それらを平易な言葉で定義している(&lt;a href=&quot;https://dora.dev/guides/dora-metrics/&quot;&gt;dora.dev、ソフトウェアデリバリー指標&lt;/a&gt;)。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;KPI&lt;/th&gt;
&lt;th&gt;測るもの&lt;/th&gt;
&lt;th&gt;注目すべき点&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;変更のリードタイム&lt;/td&gt;
&lt;td&gt;バージョン管理へのコミットから本番にデプロイされるまでの時間&lt;/td&gt;
&lt;td&gt;数字が上がるなら、通常はレビューや承認に待ち行列がある&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;デプロイ頻度&lt;/td&gt;
&lt;td&gt;デプロイする頻度、またはデプロイの間隔&lt;/td&gt;
&lt;td&gt;頻度が落ちるなら、まとまりが大きくなっている&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;失敗したデプロイからの復旧時間&lt;/td&gt;
&lt;td&gt;すぐに介入が必要なデプロイから復旧するまでの時間&lt;/td&gt;
&lt;td&gt;ロールバックとアラートの問題がここに現れる&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;変更失敗率&lt;/td&gt;
&lt;td&gt;ロールバックやホットフィックスが必要になったデプロイの割合&lt;/td&gt;
&lt;td&gt;まとまりが大きすぎるか、テストが薄いと上がる&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;デプロイのやり直し率&lt;/td&gt;
&lt;td&gt;本番のインシデントが原因の、計画外のデプロイの割合&lt;/td&gt;
&lt;td&gt;学びよりも修正のほうが速く出荷されているサイン&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ユーザーに伝えるまでの時間&lt;/td&gt;
&lt;td&gt;本番デプロイから、ユーザー向けのノートが公開されるまでの分数&lt;/td&gt;
&lt;td&gt;自分で測る。どのフレームワークも提供していない&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;古い資料は四つの指標を挙げ、復旧を「復元までの時間」と呼んでいる。現在のガイドは、上の五つを使っている。&lt;/p&gt;
&lt;p&gt;同じガイドは、これらを目標として扱うことに警告している。「年末までにすべてが1日に何度もデプロイされるように」といった目標を設定すると、チームが数字をごまかす原因になり、指標は会社全体で混ぜずに、アプリケーションやサービスごとに読むものだ。そのすべてを改善するための実践的な助言は、一つひとつの変更の大きさを縮めることだ。小さい変更は、レビューしやすく、パイプラインを通りやすく、復旧しやすいからだ。&lt;/p&gt;
&lt;h2&gt;リリースの連絡は、リリース管理プロセスのどこに位置づくか&lt;/h2&gt;
&lt;p&gt;6番目のステップで、他のステップと同じように担当者と完了条件がある。ユーザーが読む場所にノートが公開され、社内のチームに伝わっていることだ。デプロイのツールは、コードが公開された瞬間に成功を報告するので、チームが最もよく飛ばすステップでもある。&lt;/p&gt;
&lt;p&gt;このステップを予定どおりに保つ最も安上がりな方法は、リリースが出荷されるときではなく、変更がマージされるときにエントリを書くことだ。プルリクエストには、すでにタイトル、作者、リンクされたIssue、背景がある。それから作った下書きは、一週間後に記憶から書くのではなく、編集される。これが&lt;a href=&quot;https://changeloop.dev/blog/ja/changelog-automation/&quot;&gt;チェンジログの自動化&lt;/a&gt;の考え方だ。マージ時に下書きを作り、人が承認するまで保留し、一つの情報源からあらゆる場所に公開する。Changeloopはこの方式で動き、マージされたプルリクエストからAIでエントリの下書きを作り、何かが公開される前に承認を待つ。&lt;/p&gt;
&lt;p&gt;あらかじめ計画しておく価値のあるバリエーションが二つある。サポートと営業には顧客向けとは違うノートが必要で、そのためにあるのが&lt;a href=&quot;https://changeloop.dev/blog/ja/internal-release-notes/&quot;&gt;社内向けリリースノート&lt;/a&gt;だ。インシデント対応のリリースには、通常の下書きのループを回す時間がないので、&lt;a href=&quot;https://changeloop.dev/blog/ja/emergency-release-notes/&quot;&gt;緊急リリースノート&lt;/a&gt;で説明されているように、短いテンプレートを用意しておく。&lt;a href=&quot;https://changeloop.dev/release-notes-template&quot;&gt;リリースノートのテンプレート&lt;/a&gt;は、顧客向けバージョンの出発点になる形を示している。&lt;/p&gt;
&lt;h2&gt;プロセスを軽く保つには&lt;/h2&gt;
&lt;p&gt;機械が確認できる完了条件はすべて自動化し、人は判断が必要なことに残す。グリーンのパイプライン、ダッシュボード上のデプロイのマーカー、マージされたプルリクエストごとのチェンジログの下書きは、確認できる。ロールバックの計画が信頼できるか、ノートが顧客に通じるかは、人が必要だ。&lt;/p&gt;
&lt;p&gt;プロセスを試すには、先月のリリースを一つ選び、チームの外の誰かが、書かれた記録だけから、何が出荷され、誰が承認し、どう検証され、いつユーザーに伝えられたかを分かるかを問う。ギャップがあれば、それが次の改善点だ。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;リリース管理と変更管理の違いは何か?&lt;/strong&gt;
リリース管理は、一連の変更をビルドし、テストし、デプロイし、告知する。変更管理は、ITILの意味では、個々の変更を取り巻く承認とリスクのプロセスだ。頻繁にリリースするチームは、承認をコードレビューと自動チェックに組み込んでいる。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;どのくらいの頻度でリリースすべきか?&lt;/strong&gt;
テストとロールバックの手順が許す限り頻繁に。多くのWebチームでは、それは毎日かそれ以上だ。DORAの指針は、一つひとつの変更の大きさを縮めることで、小さな変更はレビューしやすく、復旧しやすい。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;小さなチームにリリースマネージャーは必要か?&lt;/strong&gt;
責任は必要だが、肩書きは必ずしも必要ない。エンジニアの間で役割を交代し、当番の人に書かれたチェックリストを渡し、7つのステップそれぞれに担当者がいるようにする。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;リリースのチェックリストには何を含めるべきか?&lt;/strong&gt;
スコープの確認、出荷するコミットでのパイプラインのグリーン、ロールバックの手順の明記、承認の記録、デプロイ後のスモークチェック、ベースラインとの指標の比較、リリースノートの公開、サポートへの連絡、振り返りの予定だ。一ページに収める。&lt;/p&gt;
</content:encoded></item><item><title>あらゆる種類の変更に使えるリリースノートの例文集</title><link>https://changeloop.dev/blog/ja/release-notes-examples/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/release-notes-examples/</guid><description>新機能、改善、バグ修正、破壊的変更など8種類のリリースノート例文を、請求書アプリを題材に示し、なぜ機能するのかを一つずつ解説する。</description><pubDate>Fri, 02 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;優れたリリースノートの例は、短く、誰に影響するかを明示し、次に何をすればいいかを伝えている。以下では、公開することになる変更の種類ごとに一つずつ例を示し、それが機能する理由を添える。形をそのまま真似て、自分の事実に差し替えてほしい。&lt;/p&gt;
&lt;p&gt;例はすべて架空のもので、Tidepoolという架空の請求書アプリを題材にしている。&lt;/p&gt;
&lt;h2&gt;良いリリースノートの例に共通するものは何か&lt;/h2&gt;
&lt;p&gt;読者の言葉で、何が変わったか、そして何かすべきことがあればそれは何かを伝えている。変更の種類ごとに役割が違うので、種類によって形も変わる。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;変更の種類&lt;/th&gt;
&lt;th&gt;エントリが述べるべきこと&lt;/th&gt;
&lt;th&gt;置く場所&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;新機能&lt;/td&gt;
&lt;td&gt;読者が今できること、誰が使えるか&lt;/td&gt;
&lt;td&gt;ノートの先頭&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;改善&lt;/td&gt;
&lt;td&gt;何が速く、または楽になったか、数字があればそれも&lt;/td&gt;
&lt;td&gt;機能の後&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;バグ修正&lt;/td&gt;
&lt;td&gt;読者が見た症状と、修正済みであること&lt;/td&gt;
&lt;td&gt;改善の後&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;破壊的変更&lt;/td&gt;
&lt;td&gt;影響を受ける人、日付、移行方法&lt;/td&gt;
&lt;td&gt;常に最初&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;セキュリティ修正&lt;/td&gt;
&lt;td&gt;何が露出したか、悪用されたか、何をすべきか&lt;/td&gt;
&lt;td&gt;最初&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;非推奨&lt;/td&gt;
&lt;td&gt;何がなくなるか、終了日、代替手段&lt;/td&gt;
&lt;td&gt;上のほう&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;アプリストアの文面&lt;/td&gt;
&lt;td&gt;変更ごとに平易な一文、文字数制限内で&lt;/td&gt;
&lt;td&gt;ストアの掲載情報&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;社内向けノート&lt;/td&gt;
&lt;td&gt;何が変わったか、顧客に何と伝えるか&lt;/td&gt;
&lt;td&gt;サポートと営業のチャネル&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;良い新機能のノートはどんな見た目か&lt;/h2&gt;
&lt;p&gt;良い機能のノートは、読者が今できることから書き始め、それを使えるプランや役割を名指しする。実装の話は省く。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;お客様の言語で請求書を送れるようになりました。&lt;/strong&gt;
顧客ごとに言語を選べるようになり、その顧客宛ての請求書、督促、支払いページが選んだ言語に従います。フランス語、ドイツ語、スペイン語、ポルトガル語がすべてのプランで使えます。設定は、顧客のページの「請求設定」で行います。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;見出しは読者が口に出して言いそうな言い回しで、本文が範囲と場所を伝えている。太字の行だけを流し読みした読者も、何がリリースされたかを把握できる。より広い方法論は&lt;a href=&quot;https://changeloop.dev/blog/ja/how-to-write-release-notes/&quot;&gt;リリースノートの書き方&lt;/a&gt;にある。&lt;/p&gt;
&lt;h2&gt;良い改善のノートはどんな見た目か&lt;/h2&gt;
&lt;p&gt;改善のノートは、読者が体感できる変化を述べ、測定した数字があればそれを添える。数字がなければ、読者がもうしなくてよくなったことを書く。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;請求書一覧の読み込みが約3倍速くなりました。&lt;/strong&gt;
請求書が5,000件を超えるアカウントでは、一覧の表示に約9秒かかっていました。現在は約3秒で開きます。対応は不要です。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;「パフォーマンスの改善」では読者は何も分からないが、9秒が3秒になったという主張なら、月曜の朝に自分で確かめられる。末尾の「対応は不要です」は、すべての読者が抱く問いに答えている。&lt;/p&gt;
&lt;h2&gt;良いバグ修正のノートはどんな見た目か&lt;/h2&gt;
&lt;p&gt;バグ修正のノートは、コード上の原因ではなく、ユーザーが見た症状を書き、やり直しが必要かどうかを伝える。誰も気づかなかった修正は、末尾のリストに入れてよい。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;修正:支払期日に督促メールが2通届く問題。&lt;/strong&gt;
請求書の支払期日が月末だった場合、一部のお客様に同じ督促が2通届くことがありました。これは修正されました。すでに送信された督促には影響がなく、再送の必要もありません。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;見出しを「修正」で始めておくと、流し読みする人がひと目で分類できる。そして本当の条件(月末)がすぐ後に続く。&lt;/p&gt;
&lt;h2&gt;破壊的変更のリリースノートはどう書くか&lt;/h2&gt;
&lt;p&gt;破壊的変更のノートは、日付と影響を受けるグループから始め、同じエントリの中で移行方法を示す。読者が見逃してはならない唯一のエントリなので、リリースノートの最初に置く。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026年12月1日からWebhookの署名が必須になります。&lt;/strong&gt;
この日以降、Tidepoolは署名のないWebhookペイロードを送信しなくなります。&lt;code&gt;Tidepool-Signature&lt;/code&gt; ヘッダーを確認せずにWebhookを受信している方が対象です。移行するには、「設定」の「開発者」にあるシークレットを使ってヘッダーを検証してください。すでに署名を検証している場合は、対応不要です。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;日付が見出しにあるので、流し読みしても残る。影響を受けるグループは、その人たちが何をしているかで指定され、最後の一文はすでに問題のない人を解放するので、サポートの負担が減る。変更が該当するかどうかの判断は、&lt;a href=&quot;https://changeloop.dev/blog/ja/breaking-changes/&quot;&gt;破壊的変更&lt;/a&gt;のガイドで扱っている。&lt;/p&gt;
&lt;h2&gt;セキュリティ修正のノートはどんな見た目か&lt;/h2&gt;
&lt;p&gt;セキュリティのノートは、何が露出したか、誰かが悪用したか、誰が影響を受けるか、何をしなければならないかを述べる。事実だけを、落ち着いて書く。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;セキュリティ:パスワードリセットのリンクが再利用できた問題。&lt;/strong&gt;
2026年9月3日から17日の間、パスワードリセットのリンクが、一度使用した後も有効なままでした。悪用された形跡は確認されていません。すでに修正済みで、未使用のリセットリンクもすべて無効化しました。この期間中にリセットを依頼した方は、新しいリンクを依頼してください。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;正確な期間によって、読者は自分が影響を受けたかを判断でき、悪用についての一文は、誰もが最初に尋ねる問いに答える。「潜在的な問題」という書き方は隠蔽のように読めるので、分かっていることを述べる。&lt;/p&gt;
&lt;h2&gt;非推奨の通知はどう書くか&lt;/h2&gt;
&lt;p&gt;非推奨の通知は、何が削除されるのかを示し、確定した終了日を伝え、代替手段を指し示す。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;v1の請求書エンドポイントは非推奨となり、2027年3月1日に終了します。&lt;/strong&gt;
&lt;code&gt;GET /v1/invoices&lt;/code&gt; は2027年3月1日まで動作し、その後は &lt;code&gt;410 Gone&lt;/code&gt; を返します。同じフィールドに &lt;code&gt;currency&lt;/code&gt; を加えて返す &lt;code&gt;GET /v2/invoices&lt;/code&gt; をご利用ください。v1からのレスポンスには、終了日を示す &lt;code&gt;Sunset&lt;/code&gt; ヘッダーが付くようになりました。新旧を並べた移行ガイドはドキュメントにあります。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;影響を受ける人はエンドポイント名で検索するので、名前は見出しに入れ、代替手段は削除の隣に置く。&lt;code&gt;Sunset&lt;/code&gt; ヘッダーは、どの呼び出しがまだ古いバージョンを使っているかを開発者に教える。詳しい説明は&lt;a href=&quot;https://changeloop.dev/blog/ja/api-deprecation/&quot;&gt;APIの非推奨化&lt;/a&gt;にある。&lt;/p&gt;
&lt;h2&gt;アプリストアのリリースノートはどんな見た目か&lt;/h2&gt;
&lt;p&gt;アプリストアのノートは、平易な二、三文にする。ほとんどの人は最初の一行しか読まないからだ。ユーザーが気づく変更から始める。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;紙のレシートをスキャンすると、Tidepoolが金額、日付、取引先を入力します。ダークモードがスマートフォンの設定に従うようになりました。通知から請求書を開くとクラッシュする問題も修正しました。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;最も役立つ変更が最初に来て、修正はクラッシュした状況を名指ししている。バージョン番号も、「バグ修正と改善」もない。ストア固有のルールは&lt;a href=&quot;https://changeloop.dev/blog/ja/mobile-app-release-notes/&quot;&gt;モバイルアプリのリリースノート&lt;/a&gt;で扱っている。&lt;/p&gt;
&lt;h2&gt;社内向けのリリースノートには何を含めるべきか&lt;/h2&gt;
&lt;p&gt;社内向けのノートは、サポートと営業のためのバージョンだ。公開ノートが省いたもの、つまり何と言うべきか、何を約束してはいけないかを加える。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;多言語の請求書を本日リリースしました(全プラン)。&lt;/strong&gt;
サポート:顧客は「請求設定」で言語を設定します。既存の請求書は元の言語のままです。イタリア語はまだありません。営業:全プランで使えるので、アップグレードの特典として売り込まないでください。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;読者ごとにラベル付きの行があり、顧客が尋ねる前に境界線(「イタリア語はまだありません」)を引いている。形式とチャネルは&lt;a href=&quot;https://changeloop.dev/blog/ja/internal-release-notes/&quot;&gt;社内向けリリースノート&lt;/a&gt;の記事で扱っている。&lt;/p&gt;
&lt;h2&gt;悪いリリースノートを書き直すとどうなるか&lt;/h2&gt;
&lt;p&gt;悪いリリースノートは、読者が得るものではなく、チームがしたことを並べている。成果を先頭に移し、社内の用語を削除して直す。&lt;/p&gt;
&lt;p&gt;前:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;v3.8.1&lt;/strong&gt; 督促スケジューラをリファクタリング。&lt;code&gt;ReminderJob&lt;/code&gt; の競合状態を修正。&lt;code&gt;bull&lt;/code&gt; を4.12に更新。その他の改善。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;後:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;督促メールが2通届かなくなりました。&lt;/strong&gt;
請求書の支払期日が月末のお客様に、督促が2通届くことがありました。これは修正されており、すでに送信された督促を再送する必要はありません。対応は不要です。&lt;/p&gt;
&lt;p&gt;3.8.1ではさらに:&lt;code&gt;bull&lt;/code&gt; を4.12に更新。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;依存関係の更新は末尾の一行に下がり、競合状態は顧客が思い当たる症状になった。&lt;/p&gt;
&lt;h2&gt;リリースごとにリリースノートの一貫性を保つには&lt;/h2&gt;
&lt;p&gt;変更がマージされたときに各エントリの下書きを作り、リリース前に人が承認する。&lt;/p&gt;
&lt;p&gt;Changeloopはこの方式で動く。マージされたプルリクエストごとにAIでエントリの下書きを作り、人が承認するまで保留する。承認のステップが、編集者が上のルールを適用する場面だ。先に形式を決めるなら、&lt;a href=&quot;https://changeloop.dev/release-notes-template&quot;&gt;リリースノートのテンプレート&lt;/a&gt;から始めるといい。完成したページの見た目は&lt;a href=&quot;https://changeloop.dev/changelog-examples&quot;&gt;チェンジログの例&lt;/a&gt;を参照してほしい。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;新しいリリースノートとは何か?&lt;/strong&gt;
製品の最新リリースと一緒に公開されるメッセージで、何が変わったか、ユーザーが何をする必要があるかを説明する。機能、改善、修正、破壊的変更を扱う。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;リリースノートとチェンジログの違いは何か?&lt;/strong&gt;
チェンジログはすべてを残し、完全な履歴を求める人のためにある。リリースノートはそこから選ぶ。一つのリリースについて、自分に関係があるかを判断する読者に向けて書く。詳しい比較は&lt;a href=&quot;https://changeloop.dev/blog/ja/changelog-vs-release-notes/&quot;&gt;チェンジログとリリースノートの違い&lt;/a&gt;にある。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;リリースノートとはどういう意味か?&lt;/strong&gt;
リリースで何が変わったかをユーザーに伝えるものだ。この言葉は、アプリストアの「新機能」のテキストから、会社のWebサイトのページまで、何がリリースされたかを説明するもの全般を指す。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;リリースノートの各エントリはどのくらいの長さにすべきか?&lt;/strong&gt;
ほとんどのエントリは二〜四文で足りる。成果、誰が影響を受けるか、何をすべきかだ。破壊的変更やセキュリティ修正は、日付や移行方法が必要なので、もっと長くなることがある。&lt;/p&gt;
</content:encoded></item><item><title>Stripe APIのバージョニングの仕組みと、真似すべき点</title><link>https://changeloop.dev/blog/ja/stripe-api-versioning/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/stripe-api-versioning/</guid><description>Stripe APIは、アカウントごとに日付付きバージョンを固定し、リクエストごとに上書きもできる。その仕組みとWebhook、コスト、真似すべき点を解説する。</description><pubDate>Fri, 02 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Stripe APIのバージョニングは日付で動く。すべてのアカウントはリリース日にちなんだ名前のAPIバージョンに固定され、個々のリクエストは &lt;code&gt;Stripe-Version&lt;/code&gt; ヘッダーでその固定を上書きできる。執筆時点(2026年10月)でStripeのドキュメントにある最新バージョンは &lt;code&gt;2026-09-30.endive&lt;/code&gt; で、同じ仕組みは、はるかに小さなAPIでも週末で真似できる。&lt;/p&gt;
&lt;p&gt;以下のStripeに関する事実はすべてStripe自身のページに基づいており、使った箇所にリンクを付けている。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;仕組み&lt;/th&gt;
&lt;th&gt;Stripeの実装&lt;/th&gt;
&lt;th&gt;出典&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;バージョン名&lt;/td&gt;
&lt;td&gt;日付、2024年以降はリリース名も付く(&lt;code&gt;2026-09-30.endive&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://docs.stripe.com/api/versioning&quot;&gt;Versioning&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;デフォルトのバージョン&lt;/td&gt;
&lt;td&gt;アカウントに固定され、Workbenchで変更する&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://docs.stripe.com/api/versioning&quot;&gt;Versioning&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;リクエストごとの上書き&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Stripe-Version&lt;/code&gt; ヘッダー、またはSDKのオプション&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://docs.stripe.com/upgrades&quot;&gt;Upgrades&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Webhook&lt;/td&gt;
&lt;td&gt;エンドポイントに設定されたバージョンで生成される&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://docs.stripe.com/upgrades&quot;&gt;Upgrades&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;リリースの頻度&lt;/td&gt;
&lt;td&gt;破壊的変更のない月次リリースと、年2回のメジャーリリース&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://docs.stripe.com/api/versioning&quot;&gt;Versioning&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;古いバージョン&lt;/td&gt;
&lt;td&gt;内部のバージョン変更モジュールで動作を維持&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://stripe.com/blog/api-versioning&quot;&gt;Engineering post&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Stripe APIのバージョニングはどう動くのか&lt;/h2&gt;
&lt;p&gt;StripeはすべてのアカウントにデフォルトのAPIバージョンを与え、バージョンを指定しないリクエストはすべてそれを使う。いつ移行するかは呼び出し側が選ぶ。デフォルトを変更するか、個々のリクエストにバージョンを設定する。&lt;/p&gt;
&lt;p&gt;Stripeのエンジニアリングの記事によれば、アカウントは最初にAPIリクエストを行ったときに固定される。アカウントは「利用可能な最新バージョンに自動的に固定され」、それ以降のすべての呼び出しには、暗黙のうちにそのバージョンが割り当てられる。&lt;/p&gt;
&lt;p&gt;バージョン文字列は日付だ。&lt;code&gt;2024-09-30.acacia&lt;/code&gt; リリース以降は名前も付き、&lt;code&gt;2026-09-30.endive&lt;/code&gt; のようになる。日付はバージョンの順序を決め、名前は、そのバージョンがどのメジャーリリースのファミリーに属するかを示す。&lt;/p&gt;
&lt;h2&gt;リクエストごとにバージョンを選ぶには&lt;/h2&gt;
&lt;p&gt;リクエストに &lt;code&gt;Stripe-Version&lt;/code&gt; ヘッダーを送るか、SDKでバージョンを設定する。Stripeのアップグレードガイドにはヘッダーの形式が示されており、同じ呼び出しが本番環境でもテスト環境でも使える。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;curl https://api.stripe.com/v1/charges \
  -u &amp;quot;$STRIPE_SECRET_KEY:&amp;quot; \
  -H &amp;quot;Stripe-Version: 2026-09-30.endive&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Stripeのガイドによれば、SDKでバージョンをグローバルに、またはリクエストごとに設定すると、レスポンスオブジェクトはそのバージョンで返ってくる。&lt;/p&gt;
&lt;p&gt;Stripeは、アカウントのデフォルトに頼らないことも勧めている。リクエストごとに、ヘッダーか固定したSDKでバージョンを指定すべきだというのだ。そうすれば、バージョンを決めるのはダッシュボードの設定ではなく、コードになる。&lt;/p&gt;
&lt;p&gt;SDKの固定のされ方は言語によって違う。ドキュメントによれば、動的型付け言語のライブラリの最近のバージョンは、そのSDKがリリースされた時点の最新のAPIバージョンを使い、静的型付けのもの(Java、Go、.NET)はそれに固定されている。ライブラリのバージョンをインストールすることは、事実上、APIバージョンを選ぶことだ。&lt;/p&gt;
&lt;h2&gt;バージョンが変わるとWebhookはどうなるのか&lt;/h2&gt;
&lt;p&gt;Webhookイベントは、サーバーコードが使うバージョンではなく、そのエンドポイントに紐づいたAPIバージョンで生成される。Stripeのドキュメントによれば、イベントはエンドポイントの作成時に設定されたバージョンを使い、設定がなければアカウントのデフォルトを使う。SDKのバージョンを変えても、Webhookハンドラーが受け取るものは変わらない。&lt;/p&gt;
&lt;p&gt;そのため、リクエストの経路とイベントの経路は、別々のバージョンに置かれることがある。イベントの送信先では、&lt;code&gt;snapshot_api_version&lt;/code&gt; は送信先を作成するときにしか設定できないので、別のバージョンにするには新しい送信先が必要になる。&lt;/p&gt;
&lt;p&gt;この移行のためのStripeの手順は、並行運用だ。目標バージョンで新しいエンドポイントを作り、同じイベントを両方に送り、ハンドラーが片方を処理してもう片方を無視するようにしてから、切り替えて古いエンドポイントを無効にする。重複期間中はすべてのイベントが二度届くので、ハンドラーは冪等でなければならない。これはイベントを発行するどんなAPIにも真似する価値のあるパターンで、それが必要になるペイロードの変更を告知する場所が、&lt;a href=&quot;https://changeloop.dev/blog/ja/webhook-changelog/&quot;&gt;Webhookのチェンジログ&lt;/a&gt;だ。&lt;/p&gt;
&lt;h2&gt;月次リリースとメジャーリリースとは何か&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;2024-09-30.acacia&lt;/code&gt; リリース以降、Stripeは破壊的変更のない新しいAPIバージョンを毎月リリースし、年に2回、破壊的変更を含むバージョンから始まる新しいメジャーリリースを出す。バージョニングのページによれば、月次リリースにはコードを更新せずにアップグレードできるが、メジャーリリースでは変更が必要になることがある。&lt;/p&gt;
&lt;p&gt;メジャーリリースには名前が付く。バージョニングのページはBasilを例に挙げており、このプロセスについてのStripeの発表では、名前は植物に由来し、Acaciaから始まるとされている。月次リリースは直前のメジャーリリースの名前を引き継ぐので、名前がそのままアップグレードしても安全であることを示す。Stripeの&lt;a href=&quot;https://docs.stripe.com/changelog&quot;&gt;変更履歴&lt;/a&gt;には使われている名前が並んでおり、執筆時点で最新のエントリは &lt;code&gt;2026-09-30.endive&lt;/code&gt; だ。&lt;/p&gt;
&lt;p&gt;つまり、日付は「どのくらい新しいか」に答え、名前は「これは破壊的変更の境目か」に答える。Stripeの発表には例外の余地も残されている。それがなければ連携が深刻な影響を受ける場合には、サイクル外で破壊的変更を出す権利を留保しているのだ。この発表は&lt;a href=&quot;https://stripe.com/blog/introducing-stripes-new-api-release-process&quot;&gt;Stripeの新しいAPIリリースプロセス&lt;/a&gt;にある。&lt;/p&gt;
&lt;h2&gt;Stripe APIの最新バージョンは何か&lt;/h2&gt;
&lt;p&gt;執筆時点(2026年10月)で、Stripeのバージョニングのページは、現在のバージョンを &lt;code&gt;2026-09-30.endive&lt;/code&gt; と記しており、変更履歴も同じバージョンを最新としている。Stripeは毎月新しいバージョンを公開するので、記事に印刷された文字列はすぐに古くなる。何かを固定する前に、最新の変更履歴を読み、テストしたバージョンを固定すること。&lt;/p&gt;
&lt;h2&gt;Stripeはどうやって古いバージョンを動かし続けているのか&lt;/h2&gt;
&lt;p&gt;Stripeは、すべての破壊的変更を、自己完結したバージョン変更モジュールとして書き、データの最新の形から逆向きにそれらのモジュールを適用することで、古いバージョンを動かし続けている。その仕組みは&lt;a href=&quot;https://stripe.com/blog/api-versioning&quot;&gt;APIバージョニングについてのエンジニアリングの記事&lt;/a&gt;に書かれている。&lt;/p&gt;
&lt;p&gt;各モジュールは、何を変えるかを宣言し、変更を文書化し、変換関数を含む。記事の例では、フィールドが文字列からハッシュに変わる。レスポンスを作るには、システムは目標のバージョンを割り出し、そこから時間をさかのぼって、途中で見つけた各モジュールを、そのバージョンに到達するまで適用する。&lt;/p&gt;
&lt;p&gt;この設計からは二つの副次的な効果が生まれ、記事はどちらも挙げている。モジュールが触れるフィールドとリソースを宣言するので、Stripeはデプロイ時にそこからAPIの変更履歴を生成できる。そして、アカウントのバージョンが分かっているので、ドキュメントをそれに合わせて調整し、そのバージョン以降の後方互換性のない変更について警告できる。&lt;/p&gt;
&lt;h2&gt;コストはどのくらいで、小さなAPIは何を真似すべきか&lt;/h2&gt;
&lt;p&gt;バージョニングにはエンジニアリングの注意力というコストがかかり、Stripe自身もそう述べている。エンジニアリングの記事は、保守の負担を認めたうえで、新しいコードを書くときに古い挙動について考える必要が少ないほど良い、という目標を述べている。また、そもそもバージョン変更を必要としないよう、リリース前に軽量なAPIレビューを行うことも説明している。&lt;/p&gt;
&lt;p&gt;小さなAPIは、古いバージョンごとにモジュールの連鎖を持つ余裕はなく、その必要もない。価値を運ぶ部分を真似すればよい。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;日付付きのバージョン。&lt;/strong&gt; 日付なら何が「メジャー」かの判断が要らず、呼び出し側も読める。URL方式やヘッダー方式との比較は、&lt;a href=&quot;https://changeloop.dev/blog/ja/api-versioning-best-practices/&quot;&gt;バージョニングのベストプラクティス&lt;/a&gt;の記事にある。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;固定されたデフォルト。&lt;/strong&gt; アカウントまたはキーを、最初に使った時点のバージョンに固定し、動いている連携の下でAPIが変わらないようにする。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;リクエストごとの上書き。&lt;/strong&gt; 呼び出し側が、確定する前に、本番環境で一回の呼び出しに新しいバージョンを試せるヘッダー。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Webhookエンドポイントのバージョン。&lt;/strong&gt; イベントのペイロードは、呼び出し側が最も驚かされる場所だ。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;バージョンごとに一つのチェンジログエントリ。&lt;/strong&gt; バージョン、日付、誰が影響を受けるか、何をすべきかを書く。&lt;a href=&quot;https://changeloop.dev/blog/ja/breaking-changes/&quot;&gt;何が破壊的変更にあたるか&lt;/a&gt;は、そもそも何が新しいバージョンに入るかを判断する基準で、エントリそのものは&lt;a href=&quot;https://changeloop.dev/blog/ja/api-changelog/&quot;&gt;APIチェンジログ&lt;/a&gt;の記事で扱っている。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;サポートするバージョンの数が必要に迫るまで、モジュールの連鎖は作らない。稼働中のバージョンが二つか三つなら、いくつかの分岐と廃止日で処理でき、その手順は&lt;a href=&quot;https://changeloop.dev/blog/ja/sunsetting-api-version/&quot;&gt;APIバージョンの廃止&lt;/a&gt;で説明している。&lt;/p&gt;
&lt;p&gt;日付付きのチェンジログを公開するなら、バージョンの履歴はエントリの質で決まる。&lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;Changeloop&lt;/a&gt;では、マージされたプルリクエストごとにエントリの下書きが作られ、チェンジログのページとフィードに公開される前に、人が承認するまで保留される。バージョンごとのエントリはここで書かれ、一つだけの人によるゲートが、呼び出し側が何をすべきかを確認するレビューになる。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Stripe APIの最新バージョンは何か?&lt;/strong&gt;
執筆時点(2026年10月)で、Stripeのバージョニングのページは、現在のバージョンを &lt;code&gt;2026-09-30.endive&lt;/code&gt; と記している。Stripeは毎月新しいバージョンを出すので、固定する前に変更履歴を確認し、アカウントのデフォルトに頼らずに、バージョンをコードに書き込むこと。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;リクエストにStripe APIのバージョンを設定するには?&lt;/strong&gt;
&lt;code&gt;Stripe-Version&lt;/code&gt; ヘッダー(たとえば &lt;code&gt;Stripe-Version: 2026-09-30.endive&lt;/code&gt;)を送るか、サーバー側のSDKでグローバルに、またはリクエストごとにバージョンを設定する。どちらもなければ、リクエストはアカウントのデフォルトバージョンを使い、それはWorkbenchで自分で設定する。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Webhookはリクエストと同じStripe APIバージョンを使うのか?&lt;/strong&gt;
必ずしもそうではない。Webhookイベントは、エンドポイントの作成時に設定されたバージョンを使い、設定がなければアカウントのデフォルトを使う。SDKをアップグレードしても、Webhookハンドラーが受け取るペイロードは変わらないので、エンドポイントは別にアップグレードし、並行してテストする。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stripe方式の日付によるバージョニングは小さなAPIに向いているか?&lt;/strong&gt;
日付付きのバージョン、固定されたデフォルト、リクエストごとのヘッダー、バージョンごとに一つのチェンジログエントリは、安上がりで真似する価値がある。内部のバージョン変更モジュールの連鎖は、多くの古いバージョンを同時にサポートするまでは不要だ。稼働中のバージョン二つと、古いほうの廃止日から始めるといい。&lt;/p&gt;
</content:encoded></item><item><title>チェンジログは誰が書いていて、誰が書くべきか</title><link>https://changeloop.dev/blog/ja/changelog-entry-ownership/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/changelog-entry-ownership/</guid><description>チェンジログは誰が書くべきか。PR作者は何が変わったかを、PMはなぜ重要かを知っている。どちらか一方だけでは、顧客に使える項目は書けない。</description><pubDate>Tue, 22 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;チームに誰がチェンジログを書くのかと尋ねると、正直な答えはたいてい「覚えている誰か」であり、
これは&lt;a href=&quot;https://changeloop.dev/blog/ja/changelog-ci-enforcement/&quot;&gt;CIでチェンジログの項目を強制する&lt;/a&gt;がメカニカルな
レベルで修正しようとしているのとまったく同じ失敗モードだ。しかし項目が存在することを強制して
も、誰が良い項目を書く資格があるかは決まらない。その問いを飛ばしてしまうチームは、たいてい
強制しやすい人、通常はPRの作者に、それが本当に上手く書ける人かどうかを確認しないままデフォル
トで頼ることになる。&lt;/p&gt;
&lt;h2&gt;なぜPRの作者が自動的に最良のチェンジログ執筆者にはならないのか&lt;/h2&gt;
&lt;p&gt;彼女は実装を知っているが、必ずしも影響を知っているわけではなく、それは異なる種類の知識だから
だ。&lt;a href=&quot;https://changeloop.dev/blog/ja/conventional-commits-changelog/&quot;&gt;Conventional commitsはどこで力尽きるか&lt;/a&gt;は、
コミットメッセージ側からこのギャップを扱っている。&lt;code&gt;fix(auth): reject expired refresh tokens&lt;/code&gt;
は正しいが、顧客には何も伝えない。その修正を書いた人は、それを翻訳するのに最も不向きなことが
多い。何時間もそのバグの観点で考え続けたせいで、ユーザーが実際に何を経験したかという外部の
視点を失っているからだ。それは、実装を影響へと翻訳することが、そのものを作った経験とは別の
スキルであり、コードにどれほど長けたエンジニアであっても習熟には練習が要るという、テクニカル
ライターという職業が存在するのとまったく同じ理由だ。&lt;/p&gt;
&lt;h2&gt;それはプロダクトやサポートがすべての項目を代わりに書くべきだということか&lt;/h2&gt;
&lt;p&gt;いいえ、彼らは逆のギャップを持っているからだ。ユーザーにとって何が重要かは知っているが、実際
に何が出荷されたかを常に知っているわけではなく、それは読みやすいが範囲において時々誤っている
項目、まだフラグの背後にある機能に対する「今はXをサポートしています」という主張、あるいは
三つのうち一つのケースしかカバーしていないのに完了したと説明された修正を生み出す。開発者が
書いた項目の失敗モードは読みにくいが正確であり、PMが書いた項目の失敗モードは読みやすいが未検証
だ。どちらの役割も、良い項目に必要なものの両方の半分を所有していない。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;役割&lt;/th&gt;
&lt;th&gt;通常うまくいく点&lt;/th&gt;
&lt;th&gt;通常間違う点&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;コードを書いた開発者&lt;/td&gt;
&lt;td&gt;何が変わったかの正確な範囲&lt;/td&gt;
&lt;td&gt;それを構築していない人向けの枠組み&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PMまたはサポートリード&lt;/td&gt;
&lt;td&gt;ユーザーにとってなぜ重要か&lt;/td&gt;
&lt;td&gt;実際に出荷されたものの正確な境界&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;専任のチェンジログ所有者&lt;/td&gt;
&lt;td&gt;一貫した声、範囲を照合する&lt;/td&gt;
&lt;td&gt;照合するには上記の両方が必要&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;実際に機能する所有権モデルはどのようなものか&lt;/h2&gt;
&lt;p&gt;変更に最も近い人からの下書きを、ユーザーに最も近い人がレビューし、全員が誰か他の人が問題を
捕まえてくれると想定する代わりに、最終的な文言に責任を持つ一人の指名された人物がいることだ。
下書きは、優れている必要があるよりも、存在して正確である必要のほうが大きい。開発者が書いた、何が変わったかを
正しく述べる粗い一文は、磨かれているが未検証のものよりも良い出発点だ。明確さのために書き直す
ことは、正確さのために書き直すことよりも簡単だからだ。レビューのステップは、PMまたはサポート
リードが下書きを読み、可読性のギャップを捕らえる唯一の質問をする場所だ。コードを見ていなくて
もこれを理解できるだろうか、と。&lt;/p&gt;
&lt;h2&gt;常に同じ人が責任を持つべきか、それとも交代制であるべきか&lt;/h2&gt;
&lt;p&gt;指名され安定していることは、少なくとも最終承認については交代制に勝る。交代する所有者は、
チームの慣習をゼロから再導出する誰かによって毎回項目がレビューされることを意味し、それは
まさに声が項目ごとに漂流し、読者がチェンジログが委員会によって書かれたことに気づき始める
仕組みだ。一人の人物、あるいは非常に小さな安定したグループは、時間をかけて判断を蓄積する。
いつ「改善しました」と言い、いつ具体的な数字を挙げるか、いつ修正が独自の項目を必要とし、
いつバッチにまとめるか。その判断は、作業を均等に分配することよりも価値がある。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;下書き（開発者、PRから）:
&amp;quot;Fixed pagination cursor not respecting the `sort` param
in some edge cases.&amp;quot;

レビュー済み（チェンジログ所有者、実際のPRと照合済み）:
「修正: 日付でソートされたエクスポートが、最初の
ページを超えると順序を無視した結果を返すことが
ありました。現在はすべてのページで一貫しています。」
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;小さなチームは一行のテキストのためにこれほど多くのプロセスを必要とするか&lt;/h2&gt;
&lt;p&gt;別々の人物としての役割ではないが、二つのステップはソロであっても依然として重要だ。一人だけの
チームは開発者でありレビュアーでもあり、その規模で生き残る規律は、レビューを別個の精神的な
パスとして行うことであり、修正を書くことからその説明を公開することへ、同じ呼吸の中で直接
飛び移らないことだ。小規模での罠は、外部から誰も強制しないために第二のパスを完全に飛ばして
しまうことであり、二人目が足りないことではない。そのパスが捕らえるために存在する正確さの
ギャップは、同じ人物が理論的には自分自身の盲点に気づくことができるという理由だけでは消えない。&lt;/p&gt;
&lt;h2&gt;最終的な項目に誰も責任を持たないとどうなるか&lt;/h2&gt;
&lt;p&gt;チェンジログは完全に失敗するのではなく、不均一に劣化する。それは読者が指摘するまで誰も気づか
ないため、より悪い。ある項目は、書いた人が気にかけていたために鋭いままだが、他の項目は、書い
た人が急いでいて公開前に誰も捕まえなかったために、「様々な改善とバグ修正」のように曖昧になる。
&lt;a href=&quot;https://changeloop.dev/blog/ja/keep-a-changelog-implemented/&quot;&gt;Keep a Changelog&lt;/a&gt;のフォーマット制約は、構造的な
逸脱、欠落した日付、間違ったカテゴリを捕らえるが、テンプレートの中には、技術的には正しく
フォーマットされている曖昧な項目を捕らえるものは何もない。それはまさに、指名された所有者が
存在して埋めるべきギャップだ。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;チェンジログ所有者はエンジニアリングの役割であるべきか、プロダクトの役割であるべきか?&lt;/strong&gt;
両方とも、その人が範囲を検証する技術的な流暢さと、外部の読者のために書くのに十分な実装から
の距離の両方を持っているなら機能する。肩書きは、両方の半分をこなせるか、あるいは自分ができ
ない半分について誰に尋ねればよいか知っているかどうかほど重要ではない。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;オンコールのようなローテーションスケジュールはチェンジログの所有権に適していることがあるか?&lt;/strong&gt;
量については時々、チームが小さすぎて一人がすべてをレビューできない場合はそうだ。声と判断に
ついてはノーだ。それはまさにローテーションが侵食するものだからだ。安定した一人のレビュアー
を維持しながら下書きの負担を共有するローテーションは、ドリフトなしにその利点を得る。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;現在の所有権の設定に何か問題があることを示す最も早い兆候は何か?&lt;/strong&gt;
正確だが読みにくい項目、あるいは読みやすいが範囲において間違っている項目が、誰が書いたかに
従うパターンで現れることだ。品質が一貫しているのではなく作者と相関しているなら、ギャップは
所有権にあり、執筆スキルにはない。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;自動化は所有権がどれほど重要かを減らすか?&lt;/strong&gt;
必要な執筆量を減らすが、必要な判断量は減らさない。&lt;a href=&quot;https://changeloop.dev/blog/ja/changelog-automation/&quot;&gt;チェンジログの自動化&lt;/a&gt;
は、パイプラインが安全に生成できるもの、フォーマット、公開、クロスポスティングを扱っている。
文言、グループ化、そして何が言及に値するかは、パイプラインのどれだけが自動化されているかに
かかわらず、人間の決定であり続ける。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PRの作者とレビュアーが文言について意見が合わない場合はどうなるか?&lt;/strong&gt;
レビュアーの判断が優先される。彼らが答えている問い、つまり「外部の読者はこれを理解できるか」
こそが、その役割が守るために存在するものだからだ。だからといってエンジニアの読み取りが無価値
になるわけではない。意見の相違が文言ではなく正確さについてのものであれば、レビュアーは譲る。
範囲を正しく把握することは作者側の役割だからだ。文言をめぐる相違と正確さをめぐる相違を分けて
考えることが、これらの大半が膠着状態になるのを防ぐ。&lt;/p&gt;
</content:encoded></item><item><title>緊急リリースノート: 実時間の時間的プレッシャーの下で書く</title><link>https://changeloop.dev/blog/ja/emergency-release-notes/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/emergency-release-notes/</guid><description>緊急リリースは、数日ではなく数分でリリースノートを書く必要がある。通常の執筆プロセスが前提とする時間的余裕がない中で、何を書くかを説明する。</description><pubDate>Tue, 22 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;ほとんどのリリースノートはコードが完成した後に書かれ、落ち着いてレビューされ、それを誰かがどれ
だけ緊急に読む必要があるかとは無関係なスケジュールに沿って公開される。緊急リリース、セキュリ
ティパッチ、データ損失バグ、障害の修正は、これらの条件すべてを一度にひっくり返す。ノートは
ほとんどの人が通常書き始めるよりも前に存在しなければならず、レビューをほとんど受けず、落ち
着いた読者ではなく不安な読者に読まれる。&lt;a href=&quot;https://changeloop.dev/blog/ja/how-to-write-release-notes/&quot;&gt;リリースノートの書き方&lt;/a&gt;
は通常のプロセスを扱っている。これは、それに従う時間が残っていないときに何が変わるかについて
だ。&lt;/p&gt;
&lt;h2&gt;他の何よりも緊急リリースノートが正しく行わなければならない一つのことは何か&lt;/h2&gt;
&lt;p&gt;読者が何かをする必要があるかどうかを、それ以前の枠組みなしで最初の文で述べることだ。インシデ
ントによって引き起こされたノートに出会う読者は、ステータスページ、サポートスレッド、あるいは
自分自身のユーザーから問題について聞いたために、すでに心配していることが多い。行動項目の前に
コンテキストで始まるノートは、まさに保留が最悪に読まれる状況で情報を保留しているように読まれ
る。「アクションは不要です。これはユーザーデータを悪用に必要としない脆弱性にパッチを当てるもの
です」と「今すぐ更新してください。このリリースは、あるアカウントのデータを別のアカウントに表
示する可能性があったバグを修正します」はどちらも一文であり、どちらも不安な読者が他の何かを
読む前に必要とする仕事のすべてを行う。&lt;/p&gt;
&lt;h2&gt;通常の編集は、それを行う時間がないときでも適用されるか&lt;/h2&gt;
&lt;p&gt;圧縮する本能は、それを通常生み出す複数下書きのプロセスが存在しなくても生き残る。&lt;a href=&quot;https://changeloop.dev/blog/ja/how-to-write-release-notes/&quot;&gt;書き直し&lt;/a&gt;
は、冗長な最初の下書きをその本質にまで削ることを説明している。時間的プレッシャーの下では最初
の下書きが存在しないことが多く、それはその規律が後の別のステップとしてではなく、書いている
最中に頭の中で機能しなければならないことを意味する。最も速いアプローチ: 「何を知る必要がある
か」と尋ねる人に声に出して言うであろう文を書き、そこで止まること。なぜならその文は通常、生成
するのに最も速く、その状態にある読者が実際に処理するであろう唯一のものだからだ。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;通常のリリースノート&lt;/th&gt;
&lt;th&gt;緊急リリースノート&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;コードレビュー後、公開前に書かれる&lt;/td&gt;
&lt;td&gt;修正と並行して、完全なレビュー前に書かれることが多い&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;複数の項目を素早くスキャンするために最適化されている&lt;/td&gt;
&lt;td&gt;ストレス下で単独で読まれる一項目のために最適化されている&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;詳細をリンクされたチェンジログに委ねてよい&lt;/td&gt;
&lt;td&gt;最も重要な事実を最初に置かなければならない&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;枠組みとコンテキストは歓迎される&lt;/td&gt;
&lt;td&gt;行動項目の前の枠組みは引き延ばしのように読まれる&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;問題の原因について本当に確信を持つ前にノートを公開しても大丈夫な場合はあるか&lt;/h2&gt;
&lt;p&gt;はい、そのノートが持っていない確信をほのめかす代わりに、その不確実性について正直であるなら
ば。「チェックアウトでのエラー率上昇に対する修正をデプロイしました。根本原因はまだ確認中であ
り、このノートを更新します」は擁護可能で、正しく時間を稼ぐ。実際には確認していない具体的な
原因を主張するノートは、それが間違っていることが判明した場合に後で人々があなたに引用し返す
ような種類の推測だ。ここで重要な規律は診断の速さではなく、ノートの確信がチームの実際の確信を
決して超えないようにすることだ。緊急ノート内の誤った技術的主張は、認められた無知よりも信頼を
損なうからだ。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;過度に確信的、未検証:
&amp;quot;Fixed: a race condition in the payment webhook handler
caused duplicate charges.&amp;quot;

時間的プレッシャーの下での正直さ:
&amp;quot;修正済み: 一部のお客様が一つの注文に対して二重に
請求されていました。新しい発生を停止し、影響を受けた
アカウントには24時間以内に返金しました。根本原因を
調査中です。&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;緊急ノートは問題の原因に言及すべきか、それとも修正されたことだけを述べるべきか&lt;/h2&gt;
&lt;p&gt;何が修正されたか、そして読者が何をすべきかを述べること。根本原因は、推測ではなく実際に判明
した時点でのフォローアップのために取っておくこと。インシデントの最中にいる読者はまさに二つの
事実を求めている。それは解決されたか、そしてそれは自分に影響するか、であり、根本原因の説明は
たとえ正確であっても、それを失う最悪の瞬間にその二つの事実と注意を奪い合う。ポストモーテムは
調査が完了した時点で別に公開されるもので、根本原因が属する場所だ。時間的プレッシャーの下で両
方の文書を混ぜると、書くのも読むのも遅くなるノートが生まれる。それは緊急事態が必要とするもの
の正反対だ。&lt;/p&gt;
&lt;h2&gt;モバイルアプリの強制アップデートの問題もここに当てはまるか&lt;/h2&gt;
&lt;p&gt;同じ原則が、さらに圧縮された形で当てはまる。&lt;a href=&quot;https://changeloop.dev/blog/ja/mobile-app-release-notes/&quot;&gt;モバイルアプリのリリースノート&lt;/a&gt;
は強制アップデートを扱っており、そこではノートは他の何よりも先に理由と期限を述べなければなら
ない。読者は選択肢がないことにすでに苛立っているからだ。ウェブの緊急ノートは通常、読者にとって
それに基づいて行動するかどうかを選ぶという意味でオプトインだが、同じ「制約を最初に述べる」と
いう本能が当てはまる。ただし理由が異なる。苛立ちではなく、緊急性のためだ。&lt;/p&gt;
&lt;h2&gt;そうあるべきではないのに、緊急ノートが罪の告白のように読まれるのを避けるにはどうすればよいか&lt;/h2&gt;
&lt;p&gt;エラーそのものではなく、修正とその効果を説明し、過剰に謝罪する衝動を抑えること。それは上記の
二つの事実を求める読者にとって埋め草のように読まれる。「一部のエクスポートに影響していたバグ
を発見し、修正しました」は、それにドラマを加えることなく何が起きたかを述べている。「大切なお
客様に影響を与えたこの深刻な問題について心よりお詫び申し上げます」は、読者が求めていない感情
的な瞬間を伝えるために、丸々一文分の有用な情報を遅らせる。簡潔で事実に基づいたノートは冷たい
のではなく、読者の本当の状態への敬意だ。本当のプレッシャーの下でそれは、安心の必要ではなく、
苛立ちだからだ。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;緊急リリースノートは通常のものと同じレビュープロセスを経るべきか?&lt;/strong&gt;
より軽いもので、まったくないわけではない。ノートが確信を誇張していないことを確認する一人の
迅速なレビュアーは、それが必要とする数分の価値がある。レビューされていない技術的主張が間違っ
ている危険性は、まさにそれが速く書かれたために高いからだ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;さらなる詳細へのリンクなしで緊急ノートを公開しても大丈夫か?&lt;/strong&gt;
少しの間だけ。リンクのないノートは、最初に公開されるものとしては問題ない。どちらかが存在し
次第、ステータスページかフォローアップへのリンクを一つ追加すること。あなたが与えた一文以上を
求める読者は、行き先を必要とするからだ。たとえその場所が「さらなる詳細は近日中」と言っている
だけであっても。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;緊急ノートは完全に省略され、修正が静かに出荷されることがあってもよいか?&lt;/strong&gt;
どの読者も気づいたり影響を受けたりできない問題についてのみ。読者がその問題を経験した可能性が
あるなら、ノートはそれが終わったことを伝えるものであり、沈黙は問題がまだアクティブかもしれ
ないように読まれる。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;インシデントが解決された後、緊急ノートはどのくらいの期間ピン留めされたり目立たせたりするべきか?&lt;/strong&gt;
差し迫った不安の窓が閉じるまで、通常は一日か二日で、その後は他のどの項目とも同じように通常
のチェンジログに折り込むことができる。何週間もピン留めされたままのノートは、解決された懸念
ではなく、未解決の懸念のように読まれ始める。&lt;/p&gt;
</content:encoded></item><item><title>Protobufの破壊的変更：ワイヤー上で生き残るもの</title><link>https://changeloop.dev/blog/ja/grpc-protobuf-api-changes/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/grpc-protobuf-api-changes/</guid><description>Protobufの破壊的変更は、URLではなくワイヤーフォーマット上で起きる。安全なフィールド変更と、全クライアントを静かに壊す変更の違いを説明する。</description><pubDate>Tue, 22 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;REST APIはJSONの形が変わるときに変わり、その形の大半はブラウザで読める応答の中に見えている。
gRPC APIは&lt;code&gt;.proto&lt;/code&gt;ファイルが変わるときに変わり、Protocol Buffersのバイナリワイヤーフォーマット
には、フィールド名が何を語ろうとクライアントが耐えられるものについて独自のルールがある。diffの
中では同じくらい些細に見える二つの変更、フィールドの番号を振り直すことと新しいフィールドを
追加することは、&lt;a href=&quot;https://changeloop.dev/blog/ja/breaking-changes/&quot;&gt;breaking changes&lt;/a&gt;が一般に引く線の反対側に落ちる。
一方は既存のすべてのクライアントに見えず、もう一方はそれらすべてを一度に壊す。protobufの破壊的
変更を安全な変更と見分けるには、&lt;code&gt;.proto&lt;/code&gt;のdiffの見た目から推測するのではなく、ワイヤーフォー
マット自身のルールを読む必要がある。&lt;/p&gt;
&lt;h2&gt;Protobufでフィールド名よりも番号のほうが重要なのはなぜか&lt;/h2&gt;
&lt;p&gt;ワイヤーフォーマットが名前ではなく番号でフィールドをエンコードするからだ。各言語の生成コード
はこの番号を読み書きする。&lt;code&gt;.proto&lt;/code&gt;ファイルの&lt;code&gt;email&lt;/code&gt;というフィールド名は人間のための便宜に
すぎず、ネットワーク上を流れるバイナリのバイト列には一切触れない。フィールドの名前を変える、
&lt;code&gt;email&lt;/code&gt;を&lt;code&gt;email_address&lt;/code&gt;にする、ことは番号が同じままである限りバイナリのワイヤー上では安全であり、
これはリネームされたJSONキーがまさにクライアントを壊すタイプの変更であるRESTに慣れたエンジニア
を驚かせる。例外はそのRESTと同じケースだ。&lt;a href=&quot;https://protobuf.dev/programming-guides/json/&quot;&gt;ProtoJSONとテキスト形式&lt;/a&gt;
は名前をシリアライズするので、リネームはJSONトランスコーディング（たとえばgrpc-gateway）、
テキスト形式のファイル、フィールドマスクを壊す。同じフィールドの番号を振り直す、名前は保ったまま&lt;code&gt;1&lt;/code&gt;を&lt;code&gt;7&lt;/code&gt;に変える、ことはちょうど
逆で、名前だけを見るコードレビューでは見えず、その瞬間からクライアントが送受信するすべての
メッセージを壊す。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;変更&lt;/th&gt;
&lt;th&gt;ワイヤー上で安全か&lt;/th&gt;
&lt;th&gt;理由&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;フィールド名を変える、番号は保つ&lt;/td&gt;
&lt;td&gt;バイナリははい、JSONとテキストはいいえ&lt;/td&gt;
&lt;td&gt;バイナリのエンコードは番号を使う。ProtoJSONとテキスト形式は名前を使う&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;フィールド番号を変える&lt;/td&gt;
&lt;td&gt;いいえ&lt;/td&gt;
&lt;td&gt;すべての既存メッセージが今や別のフィールドとして読まれる&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;新しい番号で新しいフィールドを追加する&lt;/td&gt;
&lt;td&gt;はい&lt;/td&gt;
&lt;td&gt;古いクライアントは知らないフィールドを無視する&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;フィールドを削除し、その古い番号を別の用途に再利用する&lt;/td&gt;
&lt;td&gt;いいえ&lt;/td&gt;
&lt;td&gt;古いデータが誤った新フィールドにデコードされる&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;フィールドの型を非互換に変える（例: &lt;code&gt;int32&lt;/code&gt;を&lt;code&gt;string&lt;/code&gt;へ）&lt;/td&gt;
&lt;td&gt;いいえ&lt;/td&gt;
&lt;td&gt;ワイヤーエンコーディングは型ごとに異なる&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;フィールドの削除がREST JSONの応答での同じことと違うのはなぜか&lt;/h2&gt;
&lt;p&gt;番号が放射性を帯びるからだ。&lt;a href=&quot;https://protobuf.dev/programming-guides/proto3/&quot;&gt;Protobuf自身のガイダンス&lt;/a&gt;は、削除されたフィールドの番号を
&lt;code&gt;reserved&lt;/code&gt;として印を付け、再利用を許さないことを推奨している。実際の被害が起きるのはまさに
そこだからだ。何ヶ月も前の生成コードで動き続けているクライアントが、古いフィールド番号を古い
値のために送信すると、その番号が今は別のものを意味すると期待しているサーバーは、データを直接
拒絶する代わりに静かに誤解釈してしまう。RESTにはこれに相当する罠がない。削除されたJSONキーは
単に届かなくなるだけであり、古いクライアントのリクエストが静かに別物として再解釈される方法は
存在しない。メッセージの冒頭に&lt;code&gt;reserved 4, 9, 12;&lt;/code&gt;を持つ&lt;code&gt;.proto&lt;/code&gt;ファイルは永続的な傷跡であり、
それこそがポイントだ。その番号が、履歴を知らない誰かによって新しいフィールドに渡されるのを
防ぐ。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-protobuf&quot;&gt;message Invoice {
  reserved 4; // かつて`legacy_customer_id`、2026-06-01に削除
  reserved &amp;quot;legacy_customer_id&amp;quot;; // JSON/テキスト形式のため名前も予約
  string customer_id = 5;
  string status = 6;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;フィールドの追加はそもそもチェンジログの項目を必要とするか&lt;/h2&gt;
&lt;p&gt;通常はbreaking changeの項目としてではないが、しばしば通常の項目として必要になる。「ワイヤー上
で安全」と「気にする読者にとって見える」は別の主張だからだ。応答メッセージへのフィールド追加は
構造的には無料であり、古いクライアントはメッセージをデコードして新しいフィールドを自動的に
無視する。しかしこのサービスに対して新しい統合を構築している人には、誰かが教えない限りその
フィールドの存在を知る方法がない。成功したビルドや通過したテストの中には、新しいオプション
フィールドを可視化するものは何もないからだ。&lt;a href=&quot;https://changeloop.dev/blog/ja/api-changelog/&quot;&gt;チェンジログAPI&lt;/a&gt;は追加
的な項目が読者に負っているものを一般に扱っている。それでもgRPC特有の理由でそれを書くべきなの
は、デバッガーでREST応答を眺めて新しいキーが現れたことに気づく、という相当物が存在しないから
だ。&lt;/p&gt;
&lt;h2&gt;GraphQLの呼び出し元が直面するものとどう違うのか&lt;/h2&gt;
&lt;p&gt;追加に関するルールは同じだが、影響の受け方が異なる。&lt;a href=&quot;https://changeloop.dev/blog/ja/graphql-schema-deprecation/&quot;&gt;GraphQLスキーマの非推奨化&lt;/a&gt;
は、クライアントが明示的にリクエストしたフィールドしか受け取らないモデルを扱っており、これは
追加的な変更を本質的にリスクフリーにし、削除だけが本当の危険にする。対照的にgRPCクライアント
はサーバーが送るものすべてを受け取り、自分自身のコンパイル済みスキーマのコピーに対してすべて
をデコードする。クライアントの露出は、リクエストしたものではなく、その生成コードが読める
ものだけに制限される。この違いはチェンジログを書く上で重要だ。GraphQLの項目は、クライアントが
リクエストしなかったフィールドから保護されていると合理的に仮定できるが、gRPCの項目はまったく
それを仮定できない。&lt;/p&gt;
&lt;h2&gt;gRPCサービスのバージョン管理はRESTの&lt;code&gt;/v1/&lt;/code&gt;、&lt;code&gt;/v2/&lt;/code&gt;と同じように機能するか&lt;/h2&gt;
&lt;p&gt;意図は同じでも仕組みは異なる。&lt;a href=&quot;https://changeloop.dev/blog/ja/api-versioning-best-practices/&quot;&gt;RESTのAPIにおけるv1とv2とは何か&lt;/a&gt;
は、バージョン管理を異なる契約を提供する並行URLパスとして扱っている。gRPCサービスは通常
&lt;code&gt;.proto&lt;/code&gt;ファイル自体の中のパッケージ名を通じてバージョン管理され、&lt;code&gt;payments.v1.InvoiceService&lt;/code&gt;
は&lt;code&gt;payments.v2.InvoiceService&lt;/code&gt;になる。これはクライアントがリクエストするURLのセグメントでは
なく、クライアントがダイヤルする完全修飾サービス名を変える。どちらのアプローチも同じ問題を
解決している。新しい契約が存在する間、古い契約を動かし続けることだ。しかしRESTの背景を持つ
チームはしばしば間違った場所にバージョン番号を探し、その仕事をパッケージ宣言がしていること
を見落とす。&lt;/p&gt;
&lt;h2&gt;gRPCのチェンジログ項目は実際には何を名指すべきか&lt;/h2&gt;
&lt;p&gt;メッセージ、フィールド番号、そしてその変更が追加的なのか移行を要する削除なのか、これが行動
するかどうかを決める読者にとっての重要度の順序だ。「&lt;code&gt;Order&lt;/code&gt;に&lt;code&gt;shipping_address&lt;/code&gt;（フィールド
8）を追加」は、統合者に生成コードを更新して使い始めるために必要なすべてを伝える。「&lt;code&gt;Invoice&lt;/code&gt;
のフィールド4を予約、&lt;code&gt;legacy_customer_id&lt;/code&gt;は消滅」は、自分のコードベースの何かがまだそのフィー
ルドを読んでいないか確認するよう伝える。これはRESTスタイルの「応答からフィールドを削除」という
注記が同じ緊急性で伝えないものだ。REST削除は単に少ないデータを返すだけだが、Protobufのフィー
ルド再利用はそれを積極的に壊すからだ。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;フィールドの型はワイヤーフォーマットを壊さずに変更できることがあるか?&lt;/strong&gt;
Protobufが文書化する特定の互換グループの範囲内でのみ、たとえば場合によっては&lt;code&gt;int32&lt;/code&gt;を
&lt;code&gt;int64&lt;/code&gt;に拡張することなどだ。Protobuf自身の互換性テーブルに照らして確認しない限り、どんな
型変更もbreakingとして扱うこと。言語の型システムとの類推で互換性を仮定することが、うまくいか
なくなる原因だ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Protobufのフィールド非推奨化はGraphQLの&lt;code&gt;@deprecated&lt;/code&gt;ディレクティブのように機能するか?&lt;/strong&gt;
似ている。Protobufはツールが表示できるフィールドオプション&lt;code&gt;[deprecated = true]&lt;/code&gt;をサポート
する。どちらも強制されない。GraphQLサーバーは非推奨のフィールドへのクエリにも応答し続け、
protobufクライアントもそれをエンコードし続ける。どちらも助言的であり、同じチェンジログの
サポートを必要とする。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;すべてのクライアントを制御していれば番号の振り直しは安全か?&lt;/strong&gt;
完全に閉じたシステムでは原則としてそうだが、それはフィールド番号が存在する理由である安全性
の特性全体を取り除いてしまう。「すべてのクライアントを制御している」は、ビルドがキャッシュ
されたり、デプロイが遅延したり、誰も覚えていなかったクライアントが追加されたりした瞬間に
真でなくなる主張だ。社内であっても、番号を再利用する代わりに予約すること。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;gRPCサービスは公開REST APIと同じようにチェンジログのページを必要とするか?&lt;/strong&gt;
&lt;code&gt;.proto&lt;/code&gt;のdiffを直接読まない外部チームがそれを利用する場合のみで、これは&lt;a href=&quot;https://changeloop.dev/blog/ja/internal-api-changelog/&quot;&gt;内部API
チェンジログ&lt;/a&gt;が一般に適用する「相手側は誰か」というテスト
と同じだ。同じチームの他のサービスだけが利用するgRPCサービスは、正式なチェンジログなしで
コミット履歴に頼ることがしばしば可能だ。それを読む人は誰でもすでにスキーマを開いているから
だ。&lt;/p&gt;
</content:encoded></item><item><title>チェンジログのファイル形式、JSONかYAMLか単なるMarkdownか</title><link>https://changeloop.dev/blog/ja/changelog-file-formats/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/changelog-file-formats/</guid><description>チェンジログの形式は、ページやウィジェットに使えるか人間にしか読まれないかを決める。Markdown、JSON、YAMLの代償と移行の判断基準を説明する。</description><pubDate>Thu, 17 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;ほとんどのチームはチェンジログをMarkdownファイルとして始める。それが最も抵抗の少ない道だからだ。プルリクエストのdiffで読め、何もレンダリングせずにGitHubで読め、READMEを書いたことのある誰にとっても馴染み深い。この選択は、人間以外の何か、ページ、ウィジェット、メールダイジェストがそのファイルを読む必要が出てくるまでうまく機能し、その時点で形式は無料でなくなる。&lt;a href=&quot;https://changeloop.dev/blog/ja/changelog-automation/&quot;&gt;チェンジログの自動化&lt;/a&gt;は構造的要件を一般的に扱う、タイプ、日付、本文、リンクだ。これはどのファイル形式が実際にその構造を提供し、それぞれにたどり着くのに何がかかるかについてのものだ。&lt;/p&gt;
&lt;h2&gt;単純なMarkdownチェンジログの何が問題なのか&lt;/h2&gt;
&lt;p&gt;何も問題ではない、何かがそれをフィールドに再度パースする必要が出てくるまでは。見出し、日付、その下の箇条書きリストは、人間にとっては読むのが取るに足らないことで、信頼性高くパースするのは本当に難しい。なぜならMarkdownにはスキーマがないからだ。日付は見出しにあるかもしれないし、最初の行に太字であるかもしれないし、古いエントリではまったく欠けているかもしれない。これらの変種のそれぞれが、人間は正しく読み、パーサーは読まない有効なMarkdownだ。Markdownチェンジログを自動化するチームは通常、エントリのフォーマットが少しでもずれた瞬間に壊れる、正規表現ベースの自作パーサーを書くことに終わる。これはよく起こる、書く時に一貫性を強制するものが何もないからだ。&lt;/p&gt;
&lt;h2&gt;構造化された形式が実際にもたらすものは何か&lt;/h2&gt;
&lt;p&gt;エントリが読まれる時に推測されるのではなく、書かれる時にチェックされる、すべてのエントリが同じ形を持つという保証だ。定義されたスキーマ、タイプ、日付、バージョン、対象読者、本文、リンクを持つJSONまたはYAMLファイルは、厳密なAPIレスポンスがそうするのとまったく同じように、必須フィールドが欠けていれば大声で失敗する。Markdownファイルは、正しいかどうかにかかわらず、そこにあるものを単にレンダリングするだけだ。この違いは、スクリプトがフィードをソートするために各エントリの日付を必要とし、エントリの半分がそれを異なる場所に保持している日まで見えない。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;# CHANGELOG.yml
- date: 2026-09-05
  type: breaking
  version: v2
  audience: api
  body: &amp;quot;POST /invoices now rejects a currency mismatch instead of silently converting.&amp;quot;
  link: /blog/api-changelog/
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;それは人間可読なファイルが消えなければならないという意味か&lt;/h2&gt;
&lt;p&gt;いいえ、そしてYAMLやJSONファイルに、人間がプルリクエストで読むものとしての二重の役割を果たさせようとすることは、通常逆方向の間違いだ。ネストされたJSONのdiffをレビューすることは、散文の一文をレビューすることより悪い。表現の誤りを捕まえるためにデータ構造を頭の中でパースしなければならないレビュアーは、やがて表現の誤りを捕まえるのをやめるレビュアーだ。二つの形式は共存できる。構造化データは自動化パイプラインが読む真実の源であり、生成されたMarkdownまたはHTMLのレンダリングは、手作業で横に維持されるのではなく、構造化ファイルから生成された、人間が実際にレビューし読むものだ。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;形式&lt;/th&gt;
&lt;th&gt;そのまま人間可読か&lt;/th&gt;
&lt;th&gt;カスタムコードなしで機械パース可能か&lt;/th&gt;
&lt;th&gt;よくある失敗モード&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Markdown&lt;/td&gt;
&lt;td&gt;はい&lt;/td&gt;
&lt;td&gt;いいえ&lt;/td&gt;
&lt;td&gt;一貫しないエントリ形式が単純なパーサーを壊す&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JSON&lt;/td&gt;
&lt;td&gt;悪い&lt;/td&gt;
&lt;td&gt;はい&lt;/td&gt;
&lt;td&gt;冗長；手動で無効なJSONに編集しやすい&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;YAML&lt;/td&gt;
&lt;td&gt;まあまあ&lt;/td&gt;
&lt;td&gt;はい&lt;/td&gt;
&lt;td&gt;空白に敏感；悪いインデントは大声ではなく静かなパースエラー&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;どちらの構造化形式が実際に手動編集しやすいか、JSONかYAMLか&lt;/h2&gt;
&lt;p&gt;YAMLだ、ジェネレーターを介さず手動でエントリを書く誰にとっても。なぜならJSONが各文字列とネストされたオブジェクトに要求する引用符付けと括弧のマッチングを取り除くからだ。トレードオフは、YAMLの空白への敏感さが、JSONの括弧の不一致が通常しないやり方で静かに失敗することだ。JSONパーサーは不正な形式の入力を即座に拒否するが、YAMLパーサーは悪くインデントされたファイルを受け入れ、それを単に間違った構造にパースしてしまうことがある。これはより悪い失敗だ、それが起きたことを何も教えてくれないからだ。エントリが常にスクリプトによってのみ書かれるなら、このトレードオフはほぼ消え、JSONのより厳格なパースがより安全なデフォルトの選択になる。&lt;/p&gt;
&lt;h2&gt;チェンジログページは、それを供給するファイルとは別の独自の構造化形式を必要とするか&lt;/h2&gt;
&lt;p&gt;別のものではなく、異なる形でレンダリングされた同じものだ。&lt;a href=&quot;https://changeloop.dev/blog/ja/changelog-page/&quot;&gt;チェンジログページ&lt;/a&gt;は、JSONフィードとschema.orgマークアップを通じて、ページ自体を機械可読にする方法を扱っている。そのフィードは生成された出力であり、基礎となるファイルと同期を保つべき二番目の真実の源ではない。ソースファイルとページのフィードという二か所で構造化データを手動で維持することが、その二つが最終的にずれる理由だ。だからここで下されるファイル形式の決定は、ページ、ウィジェット、メールなど、後続のすべてがそこから生成される唯一のものであるべきで、手動でコピーされるべきではない。&lt;/p&gt;
&lt;h2&gt;既存のMarkdownチェンジログを構造化形式に変換する移行コストは価値があるか&lt;/h2&gt;
&lt;p&gt;通常、自動化が実際の目標になった時だけで、それ以前ではない。GitHubのREADMEにMarkdownファイルを公開している一人プロジェクトには実際の自動化の必要性がなく、それをYAMLに変換しても儀式以外何も買わない。この変換は、ページ、ダイジェストメール、公開フィードといった複数の下流の消費者が同じデータを読む必要が出てきた瞬間に、自分自身の元を取る。なぜならそれこそが、Markdownパーサーの不整合が、維持するのに面倒なだけの存在から、目に見えて間違った出力を生成し始める、まさにその地点だからだ。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Markdownチェンジログは形式を完全に変えることなくパース可能にできるか?&lt;/strong&gt;
部分的に、フロントマターで。各エントリの先頭にある小さなYAMLブロック（日付、タイプ、バージョン）を、散文のためのMarkdown本文の隣に置く。これはエントリ全体をJSONやYAMLに強制することなく、パーサーが必要とする構造化フィールドを得る方法であり、完全な移行にまだ準備ができていないチームにとって合理的な中間点だ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ファイル形式はSEOやチェンジログページのランキングに影響するか?&lt;/strong&gt;
直接的には影響しない。検索エンジンはレンダリングされたページを読むのであってソースファイルを読むのではないので、ファイル形式は検索エンジンにとって見えない。ページ自体にとって重要なのは、それ自体の権利として機械可読であるかどうかであり、それは何がそれを生成するかとは別の問題だ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;すべてのチェンジログエントリは同じファイルを通るべきか、それともタイプごとに複数のファイルに分割できるか?&lt;/strong&gt;
一つのファイルの方が、エントリの量がdiffやレビューを不便にするまでは単純だ。年やカテゴリごとの分割は、一つのファイルのdiffが合理的にレビューするには大きすぎるようになった時点での合理的な安全弁だが、下流の何かが「すべてのエントリ」を一つのリストとして読める前に、マージのステップを追加する。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RSSに標準があるように、標準的なチェンジログファイル形式はあるか?&lt;/strong&gt;
広く採用されているものはない。Keep a ChangelogはMarkdownの慣習を提案しており、いくつかのツールは独自の形式を持っている。&lt;a href=&quot;https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md&quot;&gt;changeset&lt;/a&gt;は、パッケージとバージョンの上げ幅を指定するYAMLフロントマター付きのMarkdownファイルで、上で説明したフロントマターのパターンそのものだ。これらのどれも、RSSリーダーが普遍的にRSSを理解するように、他のツールがそのまま読める形式ではない。&lt;/p&gt;
</content:encoded></item><item><title>重複する機能リクエスト、声を失わずに統合する</title><link>https://changeloop.dev/blog/ja/duplicate-feature-requests/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/duplicate-feature-requests/</guid><description>重複する機能リクエストの統合は、不注意だと言い回しを失う。言い回しを残す統合手順、誤った一致の見分け方、提出者への通知と功績の扱いを説明する。</description><pubDate>Thu, 17 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;三人の顧客が三つの異なる週に、三つの異なる言い回しで同じ機能を求める。重複を捕まえるために構築されたトリアージプロセスは仕事をこなす。それらをグループ化し、三票を持つ一つのリクエストとしてカウントし、バックログはきれいなままだ。それが簡単な部分だ。&lt;a href=&quot;https://changeloop.dev/blog/ja/feature-request-tracking/&quot;&gt;どのラベルが役に立つのか&lt;/a&gt;は、言い回しでトリアージする前に根本的な能力でグループ化することを重複の機械的な修正として扱っている。それが扱っていないのは、三つのリクエストが一行になった瞬間に言葉そのものに何が起こるかであり、その損失は通常、それが解決した重複カウントの問題より大きい。&lt;/p&gt;
&lt;h2&gt;重複が統合される時、実際に何が失われるのか&lt;/h2&gt;
&lt;p&gt;各リクエスト提出者が使った具体的な言い回しで、それが崩れ込む投票数よりも情報量が多いことが多い。ある顧客は「フィルタリングされた結果をエクスポートする方法」を求め、別の顧客は「保存したフィルターを尊重するCSVエクスポート」を求め、三人目は「隠れた列を含まないエクスポート」を求めるかもしれない。三つとも同じ根本的なリクエストであり、正しくグループ化されているが、それぞれの言い回しはその人にとって何が重要かについてわずかに異なる強調を持ち、最初の提出の言い回しだけを保持する統合は他の二つを完全に捨ててしまう。カウントは生き残る。誰かが機能の正しいバージョンを構築するのを助けるであろう質感は、生き残らない。&lt;/p&gt;
&lt;h2&gt;投票数がすでに需要が存在すると言っているのに、なぜ質感が重要なのか&lt;/h2&gt;
&lt;p&gt;需要と設計は異なる質問であり、二番目の質問に答えるのは具体的な言い回しだけだからだ。「エクスポート」への十票はチームに機能を構築する価値があると伝える。それは「エクスポート」がCSVを意味するのか、PDFを意味するのか、予定されたメールを意味するのか、APIエンドポイントを意味するのかについて何も語らない。最初の言い回しを優先して十のうち九の元の提出を捨てる統合は、他の九人がわずかに異なる何かを望んでいたとしても、たまたま最初のリクエスト提出者が求めたものへと静かに仕様を狭めてしまう可能性がある。&lt;a href=&quot;https://changeloop.dev/blog/ja/feature-request-tracking/&quot;&gt;機能リクエストが実際何を記録すべきか&lt;/a&gt;は、まさにこのギャップを受付側から扱っている。重複を統合することは、それが受付後に再び現れる場所であり、チームが実際に求められたことの範囲を最も必要とするまさにその点だ。&lt;/p&gt;
&lt;h2&gt;言い回しを捨てるのではなく保持する統合プロセスはどのようなものか&lt;/h2&gt;
&lt;p&gt;置き換えるのではなく追加すること。正典的な項目はバックログビューのために一つのタイトルを保持するが、統合された各提出の元の言い回しは引用のリストとして、あるいはリンクされたソースチケットとして、それに付随したままになる。そうすれば後で項目をレビューする誰もが、チームメンバー一人の要約の代わりに、人々が求めたことの実際の範囲を見ることができる。これは構築するのにほとんど何もかからない。新しいシステムの代わりにチケット上の一つのフィールドであり、情報を圧縮する統合とその表示だけを圧縮する統合の違いだ。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;機能：フィルタリングされたCSVエクスポート
投票数：12
統合されたリクエスト：
  - &amp;quot;フィルタリングされた結果をエクスポートする方法&amp;quot; (acct_4421)
  - &amp;quot;保存したフィルターを尊重するCSVエクスポート&amp;quot; (acct_8832)
  - &amp;quot;隠れた列を含まないエクスポート&amp;quot; (acct_1097)
  ...
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;すべての重複が統合に値するのか、それとも誤った一致があるのか&lt;/h2&gt;
&lt;p&gt;一部は誤った一致であり、「似ているように聞こえる」を「同じリクエストである」として扱うことはそれ自体の失敗モードだ。「私のデータをエクスポートさせてほしい」と「フィルタリングされたビューだけをエクスポートさせてほしい」は、実際には同じ一般的な能力の二つの異なる範囲を説明しているにもかかわらず、「エクスポート」というキーワードの一致によってグループ化されるかもしれない。それらを統合すると、間違ったものの投票数を膨らませるか、もっと悪いことに、たまたま最初に到着したという理由で狭いバージョンを出荷してしまう。グループ化に対する人間による通過、素早いものであっても、それが積み重なる前にこれを捕まえる。自動的な類似度マッチングだけでは、語彙に基づいて過剰に統合し、意図に基づいて統合不足になる。&lt;/p&gt;
&lt;h2&gt;重複チェックは実際にはいつ実行すべきか、受付時か、それとも後からか&lt;/h2&gt;
&lt;p&gt;両方だ、理由はそれぞれ異なる。受付時のチェックは明白なケース、つまりすでに開いている何かを言い換えただけの新しいリクエストを、それが独自の未追跡の項目になる前に捕まえる。提出時点で公開中のリクエストに対する類似度検索は、人間を介さずにこれらのほとんどを処理する。後からの、より遅いペースでの二回目のチェックは、受付時に見逃されるケースを捕まえる。つまり、当時はキーワードや埋め込みの一致をすり抜けるほど異なる言葉を使っていた二つのリクエストが、チームが十数個のバリエーションを見た後になって、実は同じ根底の機能を説明していたと判明するケースだ。二回目のチェックを省くと、ほぼ重複するリクエストが別々のタイトルの下に無期限に散らばったままになり、それぞれが独自の小さな投票数を持ちながら、それが出荷につながるだけの数に決して積み上がらない。&lt;/p&gt;
&lt;h2&gt;リクエスト提出者は自分の提出が既存の項目に統合されたことを知るべきか&lt;/h2&gt;
&lt;p&gt;はい、そしてこれは&lt;a href=&quot;https://changeloop.dev/blog/ja/customer-feedback-loop/&quot;&gt;顧客フィードバックループを閉じる&lt;/a&gt;と同じ規律を通常より一歩早く適用したものだ。何かを提出して二度と何も聞かないリクエスト提出者は、それが最終的に出荷された他の十一票を持つ項目に正しく統合されたとしても、自分のリクエストがどこにも行かなかったと結論づける。「これを、他の人々も行った既存のリクエストと組み合わせました」という短い確認は一つのメッセージのコストで済み、顧客がそれが実際に追跡されたことがあるかどうかについての可視性を持たないために、数か月ごとに同じリクエストを再提出するのを防ぐ。&lt;/p&gt;
&lt;h2&gt;統合は機能が出荷される時に誰が功績を得るかを変えるのか&lt;/h2&gt;
&lt;p&gt;最初に提出した人だけでなく、全員を含めるべきだ。&lt;a href=&quot;https://changeloop.dev/blog/ja/customer-feedback-loop/&quot;&gt;フィードバックループを閉じる&lt;/a&gt;は、リクエストが出荷された時にリクエスト提出者に知らせることを扱っている。統合された項目にとって、それは正典的なタイトルになった言い回しの持ち主だけでなく、統合に付随するすべてのアカウントを意味する。なぜなら各リクエスト提出者の視点からは、彼女はこれを求め、それが出荷されたのであり、トリアージプロセスがたまたまどの言い回しを保持したかには関係ないからだ。Changeloopでは、それはpull requestがリンクされたすべてのissueを指定するということだ（&lt;code&gt;Fixes #142, fixes #187&lt;/code&gt;）。指定されていないissueにはコメントが付かない。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;統合されたリクエストごとに、引用か完全なチケットリンクか、どれだけの言い回しを保持する価値があるか?&lt;/strong&gt;
短い引用は通常、一般的なケースには十分だ。その目的はレビュアーが言い回しの範囲を一目で見られるようにすることだからだ。元のものにスクリーンショットや、一行の引用が平坦化してしまうであろう詳細なワークフローの説明のような重要な追加のコンテキストがあった場合は、完全なチケットリンクも保持せよ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;各重複の言い回しを保持することはバックログをスキャンしにくくするか?&lt;/strong&gt;
デフォルトで折りたたまれていればそうではない。正典的なタイトルはざっと目を通すレビュアーが見るものだ。統合された言い回しはクリック一つか展開一つ離れたところにあり、より深い調査をする人のために存在するが、投票を数えるだけの人のためのビューを散らかすことはない。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;二つのリクエストが同一に見えるが、構築されると異なるものを望んでいることが判明したらどうするか?&lt;/strong&gt;
それが明らかになった瞬間に再び分離し、元の統合を、繰り返しを避けるべき間違いとしてではなく、その時点で利用可能だった情報で下された合理的な決定として扱え。何も分割し直さないグループ化システムは、最終的にいくつかの間違った統合が永久に焼き付けられることになる。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;統合されたリクエストが根本的な言い回しの人間によるレビューを受けるべき投票の閾値はあるか?&lt;/strong&gt;
固定された数字はないが、構築の決定に近づいているどんなリクエストも、投票数にかかわらずそれに値する。なぜならそれが「エクスポート」と「保存されたフィルターを使ったCSVとしてのエクスポート」の違いがニュアンスであることをやめ、仕様になり始める点だからだ。&lt;/p&gt;
</content:encoded></item><item><title>バージョン番号のないGraphQLの非推奨化</title><link>https://changeloop.dev/blog/ja/graphql-schema-deprecation/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/graphql-schema-deprecation/</guid><description>GraphQLにはURLにv1やv2がなく、フィールドはディレクティブで一つずつ非推奨化される。破壊的変更の定義、受信者の把握、安全な削除時期を説明する。</description><pubDate>Thu, 17 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;REST APIは&lt;code&gt;/v1/&lt;/code&gt;の隣に&lt;code&gt;/v2/&lt;/code&gt;を公開し、呼び出し側に自分のペースで移行させることができる。GraphQLは一つのエンドポイントに一つのスキーマを持ち、去年のビルドのモバイルアプリと今朝デプロイされた内部ダッシュボードを含む、すべてのクライアントが同じグラフに問い合わせる。フォークするURLは存在しない。フィールドを非推奨化するとは、すでに全員が依存しているスキーマの中で、その場で非推奨としてマークすることを意味し、これによって規律はRESTとは異なるものになる。呼び出し側に何かがなくなると伝えるという根底の問題は、&lt;a href=&quot;https://changeloop.dev/blog/ja/api-deprecation/&quot;&gt;API非推奨化&lt;/a&gt;が一般的に扱う問題と同じであるにもかかわらずだ。&lt;/p&gt;
&lt;h2&gt;上げるべきバージョンがない場合、GraphQLはどうやってフィールドを非推奨としてマークするのか&lt;/h2&gt;
&lt;p&gt;フィールドに直接適用される&lt;a href=&quot;https://spec.graphql.org/October2021/#sec--deprecated&quot;&gt;&lt;code&gt;@deprecated&lt;/code&gt;ディレクティブ&lt;/a&gt;によってだ。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-graphql&quot;&gt;type Product {
  price: Float @deprecated(reason: &amp;quot;Use priceV2 for multi-currency support.&amp;quot;)
  priceV2: Money
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;フィールドは問い合わせ可能なままだ。消えることも、404を返すことも、動作を変えることもない。ただ、GraphiQL、Apollo Studio、スキーマリンターなど、ほとんどのGraphQLツールが、スキーマを閲覧したりそれに対してクエリを書いたりする誰にでも表示する、機械可読な注記を運ぶだけだ。これがメカニズムのすべてだ。別個の非推奨化エンドポイントも、ヘッダーも、仕様が要求する付随文書も存在しない。これがこのディレクティブの魅力であり、同時に罠でもある。ディレクティブを追加するのは簡単で、無視するのも簡単だ。クライアントにそれを見るよう強制するものが何もないからだ。&lt;/p&gt;
&lt;h2&gt;非推奨化の理由を実際に見る人はいるのか&lt;/h2&gt;
&lt;p&gt;スキーマを直接使う人、つまりイントロスペクションやスキーマを意識したエディタを通じて使う人だけであり、それはAPIチェンジログの通常の読者よりも小さな読者層だ。六か月前のクエリに対して構築されたモバイルアプリは、そのクエリをすでにバイナリに焼き込んでいる。誰かが新しいフィールドでアプリを再構築し、アップデートを公開するまで、非推奨であろうとなかろうと、&lt;code&gt;price&lt;/code&gt;を要求し続け、答えを受け取り続ける。ディレクティブは新しいコードを書く開発者に、古いフィールドを使わないように伝える。すでに公開され稼働しているクライアントには何もしない。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;メカニズム&lt;/th&gt;
&lt;th&gt;誰に届くか&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@deprecated&lt;/code&gt;ディレクティブ&lt;/td&gt;
&lt;td&gt;スキーマを閲覧したり新しいクエリを書いたりする開発者&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;スキーマリンターのCI失敗&lt;/td&gt;
&lt;td&gt;実行していれば、クライアントのコードベースを所有するチーム&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;チェンジログのエントリ&lt;/td&gt;
&lt;td&gt;リンターを持たないクライアントチームを含む、それを読む誰でも&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;何もなし（フィールドはただ動作する）&lt;/td&gt;
&lt;td&gt;古いフィールドを使う、すでに構築済みのクライアント&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;非推奨化されたフィールドはそれでもチェンジログのエントリを持つべきか&lt;/h2&gt;
&lt;p&gt;はい、そしてそれはディレクティブ単独より多くの仕事をする。なぜならチェンジログはディレクティブが届かない人々に届くからだ。スキーマを閲覧せずにグラフを消費するパートナーチーム、数か月前にキャッシュされたスキーマのコピーに対して構築されたクライアント、散文を読むことでしか気づかないであろう誰か。&lt;a href=&quot;https://changeloop.dev/blog/ja/api-changelog/&quot;&gt;APIチェンジログ&lt;/a&gt;は、エントリが呼び出し側に一般的に何を負っているかを扱う。GraphQLのエントリは、RESTがめったに明示する必要のない一つのことを負っている。なぜならRESTの呼び出し側はそれをバージョン番号から推測できるからだ。古いフィールドが今日もまだ機能しているのか、警告付きでまだ機能しているのか、あるいは実際にデータを返さなくなったのか。ディレクティブ単独では、スキーマを一度も開いたことのない読者にとって、これらのどれにも答えない。&lt;/p&gt;
&lt;h2&gt;フィールドをスキーマから削除するのが実際に安全なのはいつか&lt;/h2&gt;
&lt;p&gt;クエリログが誰もそれをもう求めていないことを示す時だけだ。これは使用状況の問題であり、カレンダーの問題ではない。フィールドは一年間&lt;code&gt;@deprecated&lt;/code&gt;を持ちながら、一度も再構築されていない一つのクライアントにとって依然として重要でありうる。RESTの&lt;code&gt;Sunset&lt;/code&gt;ヘッダーがよくやるように、固定されたスケジュールでそれを削除することは、対応できる警告なしにそのクライアントを壊す。なぜならGraphQLは、一度も読んだことのないディレクティブ以外に、対応できるものを何も与えないからだ。削除日にコミットする前にフィールドレベルの使用状況をログに記録し、ゼロでないクエリ数はカウントダウンではなく、保留として扱うべきだ。&lt;/p&gt;
&lt;h2&gt;フィールドを追加することはREST APIと同じリスクを伴うのか&lt;/h2&gt;
&lt;p&gt;構造的には、新しいフィールドについては少ない。なぜならGraphQLクライアントは明示的に要求したフィールドしか受け取らないからだ。&lt;code&gt;price&lt;/code&gt;の隣に&lt;code&gt;priceV2&lt;/code&gt;を追加しても、RESTのJSONレスポンスにフィールドを追加することが厳格なデシリアライザーを壊しうるのと同じ方法で、既存のクエリを壊すことはできない。クライアントに新しいフィールドを要求するよう強制するものが何もないからだ。既存のenumに新しい値を追加することは、同じ文脈で名指す価値のある例外だ。強く型付けされた言語が推奨するように、すべてのenum値を網羅的にswitchするクライアントは、どのクエリがそれを求めたかにかかわらず、新しい値が届いた瞬間に壊れる。この安全性は、クライアントが明示的に選び取るフィールドとユニオンメンバーにしか成り立たず、クライアントのコードが手作業で列挙する閉じた集合には成り立たない。&lt;/p&gt;
&lt;h2&gt;GraphQLのチェンジログエントリがREST のエントリには必要ないものは何か&lt;/h2&gt;
&lt;p&gt;フィールド名だけでなく、クエリの形だ。なぜなら「&lt;code&gt;price&lt;/code&gt;フィールドは非推奨」は、呼び出し側が本当に必要とする部分、つまりどの型とどのクエリがそれに触れているかを欠いているからだ。有用なエントリは、型、フィールド、代替フィールドを名指しし、生成できるなら、まだ古い形を要求している本番環境の実際のクエリを名指しする。その最後の部分、非推奨化の通知を実際の使用状況に結びつけることは、RESTの呼び出し側がURLに対するサーバーログから無料で得られるもので、GraphQLの呼び出し側は得られない。なぜなら、何を要求していようと、すべてのクエリが同じエンドポイントに当たるからだ。&lt;/p&gt;
&lt;h2&gt;フィールド以外のものが&lt;code&gt;@deprecated&lt;/code&gt;ディレクティブを持てることはあるか&lt;/h2&gt;
&lt;p&gt;enum値だ。フィールドの定義ではなく、その値自体の定義に同じディレクティブを使う。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-graphql&quot;&gt;enum ShippingMethod {
  STANDARD
  EXPRESS
  OVERNIGHT @deprecated(reason: &amp;quot;Use EXPRESS with priority: true instead.&amp;quot;)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;仕様が&lt;code&gt;@deprecated&lt;/code&gt;を定義しているのは正確に二つの場所、フィールド定義かenum値だけであり、安定版リリースの時点ではそれ以外にはない。引数レベルや入力フィールドレベルの非推奨化は、より後のドラフト言語にのみ存在し、今日ほとんどのサーバーが実装しているものには含まれない。このようにマークされたenum値は、サーバーがそれでもなお返したり受け付けたりできる正当な値であり続け、非推奨のフィールドが持つのと同じ「壊れない」約束を果たす。だからこそ、実際にその値を削除する前に安全に出荷できる。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;GraphQLはエンドポイント全体に対するSunsetヘッダーのようなものをサポートしているか?&lt;/strong&gt;
いいえ、通常エンドポイントは一つしかないからだ。非推奨化のタイミングはフィールドレベルで、&lt;code&gt;@deprecated&lt;/code&gt;ディレクティブの理由テキストと、チームがその隣に公開するチェンジログや移行ガイドの中に存在する。クライアントがプログラム的に読める応答ヘッダーの中にはない。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;非推奨化されたフィールドは削除された後、異なる型で再追加できるか?&lt;/strong&gt;
新しいフィールド名としてのみだ。型を変えて同じフィールド名を再導入することは、非推奨化サイクルがまさに避けるために存在する破壊的変更そのものだ。&lt;code&gt;priceV2&lt;/code&gt;がそうしているように、代替には独自の名前を与え、名前が再利用可能になる前に、古いものを完全に消滅させよ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;@deprecated&lt;/code&gt;の理由テキストはチェンジログのエントリにリンクすべきか?&lt;/strong&gt;
スキーマツールがそれをサポートしているなら、はい。理由フィールドは単純な文字列を受け入れ、その文字列内のURLは、イントロスペクションの出力を見つめる開発者から、チェンジログのエントリが与えられるより完全な説明への最短経路だ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GraphQLのスキーマ変更が、RESTがそうでない方法で後方互換になることはあるか?&lt;/strong&gt;
加算的なフィールドの変更は、上記の理由からある。クライアントは要求したものしか受け取らないからだ。新しいenum値は例外であり、閉じた集合を列挙するクライアントは、想定していなかった値によって壊れることがある。削除と型変更は、RESTの同等物とまったく同じように破壊的だ。&lt;/p&gt;
</content:encoded></item><item><title>API移行ガイドをどう書けばいいか、その方法</title><link>https://changeloop.dev/blog/ja/api-migration-guide/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/api-migration-guide/</guid><description>API移行ガイドは、互換性のない変更を障害ではなくチェックリストに変える。何を含め、誰がいつ書くか、チェンジログだけでは足りない理由を説明する。</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;API移行ガイドは、互換性のない変更を障害ではなくチェックリストに変える文書だ。何が変わったか、それについて何をすべきか、そしていつまでに。チェンジログのエントリは互換性のない変更を二文で名指しできるが、移行ガイドは、その二文が「これはあなたを壊す」と言っていて、正確に何を編集すべきか知る必要があるときに、呼び出し側が実際に開くものだ。ガイドなしでエントリを公開することは、呼び出し側がそれを防ぐために書かれた文書からではなく、サポートチケットから互換性のない変更を知る方法だ。&lt;/p&gt;
&lt;h2&gt;API移行ガイドとは何か&lt;/h2&gt;
&lt;p&gt;呼び出し側をAPIの古い形から新しい形へと導く、段階的な文書であり、まだAPIを採用するかどうか決めている人ではなく、変更すべきコードを持っている人のために書かれる。この区別は重要だ。移行ガイドは既存の統合と既存の本番トラフィックを前提とするため、ロールバック、部分的な移行、そして移行が成功したかどうかをどう知るかをカバーしなければならず、そのどれも最初の統合のためのガイドには必要ない。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;文書&lt;/th&gt;
&lt;th&gt;前提とするもの&lt;/th&gt;
&lt;th&gt;答える質問&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;移行ガイド&lt;/td&gt;
&lt;td&gt;既存の統合&lt;/td&gt;
&lt;td&gt;古い形から新しい形へどう移行するか?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;チェンジログのエントリ&lt;/td&gt;
&lt;td&gt;何もない、ただ読者が確認するだけ&lt;/td&gt;
&lt;td&gt;何が変わったか、いつか?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;APIリファレンス&lt;/td&gt;
&lt;td&gt;何もない、または最初の統合&lt;/td&gt;
&lt;td&gt;このエンドポイントは何をするか?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;非推奨化通知&lt;/td&gt;
&lt;td&gt;古いものを使っている統合&lt;/td&gt;
&lt;td&gt;これはいつ動かなくなるか?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;移行ガイドは通常、後者の二つの間に位置する。非推奨化通知は時計を作動させ、移行ガイドは呼び出し側がその時計が切れる前に従うものだ。&lt;/p&gt;
&lt;h2&gt;変更がチェンジログのエントリだけでなく移行ガイドを必要とするのはいつか&lt;/h2&gt;
&lt;p&gt;古い挙動と新しい挙動の間に複数のステップがあるとき、あるいは変更が十分多くの呼び出し箇所に触れていて、呼び出し側が説明よりも実例から利益を得るときだ。&lt;a href=&quot;https://changeloop.dev/blog/ja/breaking-changes/&quot;&gt;互換性のない変更とは何か、それをどうリリースするか&lt;/a&gt;がその変更が互換性のないものかどうかのテストを扱っている。答えがイエスなら、次の問いは修正が一行の編集なのか本物の移行なのかだ。名前が変わったフィールドなら、呼び出し側はチェンジログのエントリだけで対処できる。認証、ページネーション、エラー処理の変更はほとんど常にガイドに値する。なぜなら正しい代替コードが一文の説明からは明らかではないからだ。&lt;/p&gt;
&lt;h2&gt;移行ガイドは何を含まなければならないか&lt;/h2&gt;
&lt;p&gt;五つのことがあり、そのどれか一つを省くことが、呼び出し側が一度読んでその後は試行錯誤に戻ってしまうページにガイドを変えてしまう原因になる。古いコードを、実際にプロジェクトに現れる通りに示す。新しいコードを、同じように示す。違いの抽象的な説明としてではなく。何も変えなければ何が壊れるかを、はっきりと言う。なぜなら「何も」は妥当でよくある答えであり、それでも呼び出し側は明示的に聞く必要があるからだ。移行がうまくいったかを確認する方法、たとえば確認すべきレスポンスフィールドやステータスコード。そしてタイムライン。古い挙動がいつ動かなくなるか、そしてその間両方の形が利用可能かどうか。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;## 通貨フィールドをfloatからintegerへ移行 (v3.0.0)

前:
  { &amp;quot;amount&amp;quot;: 19.99 }

後:
  { &amp;quot;amount&amp;quot;: 1999 }  // 最小通貨単位(セント)

何が変わるか: `amount`は今やアカウント通貨の最小単位での整数だ。
`amount`をfloatとして読むコードは、2026年10月1日から100倍大きすぎる
値を読むことになる。

確認: 移行後、19.99ドルの請求は`amount: 1999`と読まれるべきで、
`amount: 19.99`ではない。

タイムライン: v2は2027年1月15日までfloatを返し続ける。v3は起動から
整数を返す。両方のバージョンが今アクティブだ。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;これら五つのそれぞれが、そうでなければ呼び出し側が推測するかサポートに尋ねなければならない質問に答えていて、それこそが移行ガイドが実際に節約するコストだ。&lt;/p&gt;
&lt;h2&gt;誰がそれを書くべきか、そしていつか&lt;/h2&gt;
&lt;p&gt;変更を設計した人が、それがリリースされるまさにその瞬間に。一週間後にチケットからそれを再構成するサポートチームではない。決定を下した人は、古い挙動のどの部分に誰も頼るべきでなかったか、どの部分が偶然の契約だったかを知っている。その文脈を持たない誰かが後から書いたガイドは、明白なことを過剰に説明するか、実際に人々を壊すたった一つのエッジケースを見逃す傾向がある。ガイドと、互換性のない変更を発表するチェンジログのエントリは一緒に出るべきで、エントリはそれを繰り返すのではなくガイドにリンクすべきだ。&lt;/p&gt;
&lt;h2&gt;これはバージョニングとAPIチェンジログにどう関係するか&lt;/h2&gt;
&lt;p&gt;直接的にだ。移行ガイドは、&lt;a href=&quot;https://changeloop.dev/blog/ja/semantic-versioning-changelog/&quot;&gt;セマンティックバージョニングとあなたのチェンジログ&lt;/a&gt;の中でMAJORのエントリが一文でしか要約しないものの詳細版だ。チェンジログのエントリは変更が互換性のないものであることと、大まかに何が変わったかを言う。移行ガイドは、そのエントリが運ぶべきリンクだ。&lt;a href=&quot;https://changeloop.dev/blog/ja/api-changelog/&quot;&gt;APIチェンジログ: 何を公開し、誰が読むのか&lt;/a&gt;は移行ガイドを、APIが維持する五つの文書の一つとして挙げていて、それぞれが異なる質問に答えている。これは「実際にAからBへどう移行するか」に答えるものであり、その答えが通常チェンジログのエントリには長すぎるからこそ、独自のページに値する。&lt;/p&gt;
&lt;h2&gt;移行ガイドはどれくらいの期間公開され続けるべきか&lt;/h2&gt;
&lt;p&gt;少なくとも古い挙動が到達可能である限り、そして理想的にはその後も。三つの非推奨化通知を無視した後、十八か月遅れて移行する呼び出し側も、それでもガイドを必要としていて、古い挙動が停止するその日にそれを削除することは、それを最も必要とする呼び出し側がそれを見つけられないことを保証するだけだ。安定したURLに保ち、ページを撤回する代わりにタイムラインのセクションを更新すること。Stripeの&lt;a href=&quot;https://docs.stripe.com/upgrades&quot;&gt;アップグレードガイド&lt;/a&gt;は、このパターンの公開されている実例だ。バージョンごとに新しい文書を作り、次のバージョンが出た瞬間に古びてしまうのではなく、一つのページをリリースのたびに最新の状態に保っている。自分のガイドも同じくらい見つけやすい場所に置くべきで、ブログのアーカイブに埋もれさせるのではなく、呼び出し側がすでに読んでいる&lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;ドキュメント&lt;/a&gt;のそばに置くのがよい。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;すべての互換性のない変更に移行ガイドが必要か?&lt;/strong&gt;
いいえ。呼び出し側がチェンジログのエントリだけで対処できる変更、たとえば明白な代替を持つ単一の名前変更フィールドは、別のガイドを必要としない。複数の呼び出し箇所に触れる変更や、実例を必要とする変更には必要だ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;移行ガイドはAPIのドキュメントと一緒にあるべきか、それともチェンジログにあるべきか?&lt;/strong&gt;
ドキュメントと一緒に、チェンジログのエントリからリンクされて。エントリは購読者が最初に見るものであり、ガイドは行動を起こすと決めた瞬間に必要とするものであり、呼び出し側がすでに使っている参照資料の隣に属する。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;移行ガイドと非推奨化通知の違いは何か?&lt;/strong&gt;
非推奨化通知は何かがなくなること、いつまでかを述べる。移行ガイドはそれについて何をすべきかの指示だ。リンクされた移行ガイドのない非推奨化通知は、呼び出し側に期限を与えながら、それをどう守るかを伝えていない。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;移行期間中、古い挙動と新しい挙動の両方を文書化すべきか?&lt;/strong&gt;
はい、可能なら同じページで。呼び出し側が何が変わったかを正確に見られるようにするためで、異なる時期に書かれた二つの別々の文書からそれを組み立てるよりも良い。&lt;/p&gt;
</content:encoded></item><item><title>GitHub Actionsのためのチェンジログチェック</title><link>https://changeloop.dev/blog/ja/changelog-ci-enforcement/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/changelog-ci-enforcement/</guid><description>GitHub Actionsのチェンジログチェックは、項目がなければマージを拒否する。記憶頼みの運用が続かない理由と、チェック自体が壊すものも解説する。</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;チェンジログを手作業で維持しているすべてのチームは、同じインシデントの後に同じ会話を経験している。項目なしでリリースが出て、誰かが理由を尋ね、正直な答えは、それを書くはずだった人が急いでいて、チェンジログの手順が記憶の中にしか存在していなかったというものだ。&lt;a href=&quot;https://changeloop.dev/blog/ja/changelog-automation/&quot;&gt;チェンジログの自動化&lt;/a&gt;は、パイプラインが安全に自動化できるものと、まだ人間を必要とするものを扱っている。CIでのチェンジログチェックはこの問題のもう半分だ。書くことを自動化しても、そもそも誰もそれを起動する義務を負っていなければ役に立たないからだ。GitHub Actionsは、ほとんどのチームがすでにプルリクエストのチェックを実行している場所であり、だからこそこのチェックもそこに置く。&lt;/p&gt;
&lt;h2&gt;なぜ「人々に項目を追加するよう頼む」は予測可能なパターンで失敗するのか&lt;/h2&gt;
&lt;p&gt;プルリクエスト内の他のすべてと注意を奪い合い、飛ばしても即座の結果がない唯一の部分だからだ。テストは大きな音を立てて失敗しマージをブロックする。欠けているチェンジログ項目は何もブロックしないので、誰かが急いでいる瞬間、実際にはほとんどの時間、負けてしまう。記憶によって強制されるポリシーは、まさに予想される速度で劣化する。全員が合意した最初の数週間はうまくいき、気にかけていた人が休暇に入るかチームを変わった瞬間、静かに放棄される。&lt;/p&gt;
&lt;h2&gt;チェンジログ項目のためのCIチェックは実際に何を検証するのか&lt;/h2&gt;
&lt;p&gt;文章の質ではなく、項目が存在し、かつ正しい形式であることだけであり、それは人の頭の中ではなくCIで動くチェンジログチェックにとって正しい範囲だ。よくある形は、チェックがPRのdiffを見て、changesetディレクトリの新しいファイル（&lt;a href=&quot;https://github.com/changesets/changesets&quot;&gt;Changesets&lt;/a&gt;や類似のツールが使うパターン）か、チェンジログファイルの変更された行のどちらかを要求し、どちらも存在しなければビルドを失敗させる。項目が実際に何を語っているかのレビューは、常にそうであった場所、つまりコードレビューで引き続き行われる。その判断はスクリプトの領分ではないからだ。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;CIチェックが検証すること&lt;/th&gt;
&lt;th&gt;検証しないこと&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;diffにchangesetかチェンジログの行が存在する&lt;/td&gt;
&lt;td&gt;文章が明確かどうか&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;項目がモノレポ内で正しいパッケージを参照しているか&lt;/td&gt;
&lt;td&gt;変更がそもそも項目に値するかどうか&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ファイルが構文的に有効か（フロントマター、JSON形式）&lt;/td&gt;
&lt;td&gt;項目が影響について正直かどうか&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;すべてのPRにこれが必要か、それとも一部の変更は免除されるのか&lt;/h2&gt;
&lt;p&gt;一部は免除され、その免除リストこそが、こうしたシステムが実際に構築されるか放棄されるかの分かれ目だ。目に見える影響のない依存関係の更新、テストだけの変更、振る舞いの変わらない内部リファクタリング。これらのどれも、チェンジログを読む誰も気にしないことのためにチェンジログ項目をでっち上げるよう貢献者に強制すべきではない。うまく機能するパターンは、貢献者が適用できる（&lt;code&gt;no-changelog-needed&lt;/code&gt;）ラベルかフラグで、ファイルなしでCIチェックを満たし、PRを承認する人によってレビューされる。そうすれば免除自体が、項目が通るのと同じ精査を通ることになる。&lt;/p&gt;
&lt;h2&gt;緊急のホットフィックスのような正当な例外はどうなるのか&lt;/h2&gt;
&lt;p&gt;ゲートはデプロイではなくマージに属する。本当の時間的プレッシャーの下にあるホットフィックスは、CIチェックが完成した段落ではなく意図によって満たされる限り、プレースホルダーの項目やフォローアップチケットでマージできる。一部のチームは、次のリリースカットの前にメンテナーが磨き上げる一行のスタブを受け入れる。ゲートが決して許すべきではないのは、その手順を静かに飛ばすことだ。忘れられたスタブは一度も存在しなかった項目より小さな失敗であり、スタブは少なくとも誰かが後で見つけられる痕跡を残すからだ。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;# .github/workflows/changelog-check.yml
on:
  pull_request:
    types: [opened, synchronize, reopened, labeled, unlabeled]
jobs:
  changelog:
    if: &amp;gt;-
      !contains(github.event.pull_request.labels.*.name,
      &amp;#39;no-changelog-needed&amp;#39;)
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0 # the diff needs the base branch
      - name: Require changelog entry
        run: |
          base=&amp;quot;origin/${{ github.base_ref }}&amp;quot;
          if ! git diff --name-only &amp;quot;$base&amp;quot;...HEAD \
              | grep -q &amp;#39;^\.changeset/&amp;#39;; then
            echo &amp;quot;No changeset. Add one, or have a maintainer&amp;quot;
            echo &amp;quot;apply the no-changelog-needed label.&amp;quot;
            exit 1
          fi
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;チェック自体が正しいことは、実際のPRをブロックし始める前にどう確認するのか&lt;/h2&gt;
&lt;p&gt;まず使い捨てのブランチに対してスクラッチのプルリクエストを開く。changesetがあるもの一つ、ないもの一つ、免除ラベルを付けたもの一つを作り、他の誰かの作業にチェックが適用される前に、三つとも期待どおりの結果になることを確認する。条件が逆向きに書かれていたために、あらゆるPRを通してしまうフェイルオープンなチェンジログチェックは、チェックが存在しないよりも悪い。存在しないはずのカバレッジがあるように見えてしまうからだ。同じファイルに対して&lt;code&gt;workflow_dispatch&lt;/code&gt;を使い、最近マージされたいくつかのPRに対して手動で実行すれば、生きたプルリクエストを一切必要とせずに、こうした間違いのほとんどを捕まえられる。&lt;/p&gt;
&lt;h2&gt;同じ考え方はGitHub Actions以外でも通用するのか&lt;/h2&gt;
&lt;p&gt;形は引き継がれ、構文だけが変わる。GitLab CIは同じルールを、GitHub Actionsの&lt;code&gt;if&lt;/code&gt;の代わりに&lt;code&gt;$CI_MERGE_REQUEST_LABELS&lt;/code&gt;をチェックするジョブの&lt;code&gt;rules&lt;/code&gt;ブロックとして表現でき、必須のマージリクエスト承認が免除レビューのステップの代わりになれる。この記事が説明しているチェックがGitHub Actionsなのは、読んでいるほとんどのチームがすでにそのプラットフォームにいるからにすぎず、根底にある要件、つまり頼み込む慣習ではなく機械がチェックするゲートという要件は、マージの前にCIが動くあらゆる場所で同じだ。&lt;/p&gt;
&lt;h2&gt;これはモノレポでも同じように機能するのか&lt;/h2&gt;
&lt;p&gt;もう一つの要素が必要だ。項目がどのパッケージ用のものかということだ。&lt;a href=&quot;https://changeloop.dev/blog/ja/monorepo-changelogs/&quot;&gt;モノレポのチェンジログ&lt;/a&gt;は、パッケージが独立してリリースされるようになった瞬間、リポジトリ全体で一つのファイルという方式が機能しなくなる理由を扱っている。CIチェックは同じ要件を引き継ぐ。パッケージを名指ししないchangesetは、正しいチェンジログが更新されることの有用な証拠ではなく、diffのどこかでファイルが変わったことを示すだけだ。これ専用に構築されたツール（JavaScriptエコシステムではChangesetsが一般的だ）は、changesetが作成されるまさにその瞬間に、貢献者に影響を受けるパッケージとsemverの引き上げを選ばせるので、CIチェックは後から推測するのではなく両方の情報を無料で得られる。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;CIチェックはマージをブロックすべきか、それとも警告だけにすべきか?&lt;/strong&gt;
ブロックすべきだ。警告は機能的には丁寧に頼むことと同じであり、それはすでに失敗している。免除ラベルは、正真正銘の警告だけのケースでも同じ厳格なゲートを通る正当な経路を持てるように、まさにそのために存在する。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;免除ラベルが正しく適用されたかを誰がレビューするのか?&lt;/strong&gt;
プルリクエストを承認する人が、いずれにせよすでに行っているレビューの一部として行う。ラベルは決して自己適用されレビューされないままであるべきではない。さもなければ、ゲートが閉じるはずだった同じ静かな抜け道になってしまう。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CIでこれを必須化することは、チェンジログ自動化パイプラインの必要性を置き換えるのか?&lt;/strong&gt;
いいや、それに餌を与えるものだ。&lt;a href=&quot;https://changeloop.dev/blog/ja/changelog-automation/&quot;&gt;チェンジログの自動化&lt;/a&gt;は、構造化された項目をページ、フィード、メールに変えることを扱っている。CIチェックは、そもそも自動化する対象としてそれらの構造化された項目が存在することを保証するものだ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;最初に構築する価値がある、これの最小バージョンは何か?&lt;/strong&gt;
指定されたチェンジログディレクトリの下でファイルが一つも変更されていなければ失敗する単一のチェックと、一つの免除ラベルだ。パッケージ単位のルーティングとモノレポ向けのsemver推論は後で来ればいい。核となる習慣、項目が存在するか誰かが明示的に不要だと言ったか、こそが初日から持つ価値のあるものだ。&lt;/p&gt;
</content:encoded></item><item><title>顧客を失わずに機能リクエストを断る方法とは</title><link>https://changeloop.dev/blog/ja/declining-feature-requests/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/declining-feature-requests/</guid><description>ループを閉じるとは、出荷を伝えることだけではない。難しいのは関係を損なわずに断ることだ。悪い拒否の原因と、そのまま使える文例を説明する。</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;ループを閉じるとは通常、誰かに彼らのリクエストが出荷されたと伝えることを意味する。ほとんどの追跡システムがまったくプロセスを持っていない難しい半分は、ノーと言うことだ。ほとんどの機能リクエストは決して出荷されず、それは製品が利用者に本当に負っているループの閉じ方のほとんどが、発表ではなく拒否であることを意味する。そして下手に扱われた拒否は、沈黙が費やしたであろうより多くの好意を費やす。うまく扱われれば、ほとんど何も費やさないかもしれない。なぜなら、リクエストした人がほとんどの場合最も望んでいるのは、自分が聞き届けられたと知ることであり、機能そのものではないからだ。&lt;/p&gt;
&lt;h2&gt;なぜうまく断ることは、うまく出荷することと同じくらい重要なのか&lt;/h2&gt;
&lt;p&gt;沈黙は説明のない拒否として読まれ、説明されたノーは配慮として読まれるからだ。何も聞かない人は、リクエストが無視されたか失われたかのどちらかだと想定し、どちらの結論も、彼女にわざわざ尋ねるのをやめるよう教えてしまう。それは製品が本物の拒否から得るのと同じ結果であり、ただより遅く、途中でより多くの恨みを伴って到達するだけだ。明確に、理由とともにノーと言う返答は、出荷された機能と同じくらい完全にループを閉じ、それをより速く行う。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;返答&lt;/th&gt;
&lt;th&gt;リクエストした人が学ぶこと&lt;/th&gt;
&lt;th&gt;関係へのコスト&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;沈黙&lt;/td&gt;
&lt;td&gt;誰も読まなかった、あるいは誰も気にしない&lt;/td&gt;
&lt;td&gt;高く、今後のリクエストごとに積み重なる&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;理由のない自動返信&lt;/td&gt;
&lt;td&gt;どこかのキューに無期限に入っている&lt;/td&gt;
&lt;td&gt;中程度、時間は稼ぐが信頼は稼がない&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;理由付きの拒否&lt;/td&gt;
&lt;td&gt;読まれ、検討され、返答された&lt;/td&gt;
&lt;td&gt;低い、理由が誠実であれば&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;代替案付きの拒否&lt;/td&gt;
&lt;td&gt;本当の必要が本当に聞き届けられた&lt;/td&gt;
&lt;td&gt;最も低い、しばしば信頼を築く&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;何が拒否を悪い着地にするのか&lt;/h2&gt;
&lt;p&gt;ほぼ常に三つのことが組み合わさっている。一般性。実際に何が求められたかに言及しない定型の「フィードバックをありがとう」は、実際には読まれていたとしても、まったく読まれなかったように読める。遅延。リクエストした人がすでに尋ねたことを忘れた頃、リクエストの六か月後に届く拒否は、迅速なノーよりも悪く感じられる。なぜなら、それは検討されて拒否されたのではなく、リクエストが手をつけられずに放置されていたことを示唆するからだ。そして持ちこたえない理由。「私たちのロードマップにはない」は何にも答えていないが、「それは今年触れる予定のない権限の仕組みの再設計を必要とする」は、リクエストした人に、実際に評価でき、十分重要ならエスカレートしたり回避したりできるものを与える。&lt;/p&gt;
&lt;h2&gt;良い拒否は実際に何を言うべきか&lt;/h2&gt;
&lt;p&gt;この順序で四つのこと。一般的な言い換えではなく、具体的なリクエストを名指しする承認。正直な理由。たとえ正直な理由が「これは製品の向かう方向に合わない」というより柔らかい言い訳であっても、正直に述べられたもの。ドアが閉じているのか、それとも今はただ開いていないだけなのか。これらは非常に異なるトーンを必要とするからだ。そして存在するなら、文字通り求められた機能ではなくても、根底にあるニーズに応える代替案。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;こんにちは、Jamie

チームの招待にCSV一括インポートを追加するリクエストをありがとう
ございます。検討しましたが、それは構築しません。私たちの招待フロー
はセキュリティ上の理由から各新メンバーの個別レビューを中心に構築
されており、一括インポートは見落としではなく設計上それに反する
ことになります。

もし本当の問題が大きなチームを素早く招待することなら、APIはスクリプト
化された個別招待をサポートしていて、レビューを回避することなく
ほぼすべての速度を提供します: [リンク]。設定のお手伝いが必要なら
お知らせください。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;これがテンプレートにできないことをしている点に注目してほしい。実際の機能を名指しし、あいまいな方針ではなく実際の設計判断に結びついた理由を与え、単にチケットを閉じるのではなく根底の問題を解決する道を提供している。&lt;/p&gt;
&lt;h2&gt;これは出荷された機能でループを閉じることとどう違うのか&lt;/h2&gt;
&lt;p&gt;仕組みは似ているが、トーンは違う。&lt;a href=&quot;https://changeloop.dev/blog/ja/customer-feedback-loop/&quot;&gt;顧客とのフィードバックループを閉じる&lt;/a&gt;は出荷されたケースを扱っていて、そこではメッセージは良い知らせであり、主なリスクは送るのを忘れることだ。拒否は悪い知らせ、あるいは少なくとも望まれない知らせであり、与えられる理由により多くの注意を、配信においてより少ない自動化を必要とする。出荷された機能の通知は、ステータス変更によってトリガーされる定型のコメントで構わないが、定型として読める拒否は、このアプローチ全体が避けようとしているまさにその失敗モードだ。それでも両者は一つの要件を共有している。元のリクエストはリクエストした人と結びついたままでなければならず、それは&lt;a href=&quot;https://changeloop.dev/blog/ja/feature-request-tracking/&quot;&gt;機能リクエストの追跡&lt;/a&gt;が扱っているのと同じ追跡の規律であり、そうでなければどちらのメッセージも個別に送る方法がない。&lt;/p&gt;
&lt;h2&gt;拒否は公開ロードマップ上のステータスのように公開されるべきか&lt;/h2&gt;
&lt;p&gt;通常は具体的な理由ではなく、ステータスはそうかもしれない。&lt;a href=&quot;https://changeloop.dev/blog/ja/public-roadmap/&quot;&gt;公開ロードマップ&lt;/a&gt;は、リクエストした人が再度尋ねることなく確認できるステータスラベルを扱っていて、「拒否済み」や「計画外」というステータスはそのシステムの一部になり得る。しかし詳細な理由は、特に内部の優先順位や好ましくない文脈に触れる場合、通常は公開のステータスページよりも個別の返答の方が価値がある。そこでは同じ言い回しが、実際に尋ねたただ一人ではなく、すべての読者に対して機能しなければならないからだ。&lt;/p&gt;
&lt;h2&gt;拒否されたすべてのリクエストは個別の返答に値するか&lt;/h2&gt;
&lt;p&gt;名前のある、連絡可能な人からのすべてのリクエストは、少なくとも短いものでも値する。大量、重複、匿名のリクエストは例外だ。類似のリクエストをグループ化してグループごとに一度返答すること、あるいは共有のステータスラベルを更新することは、個別の返答が本当にスケールしないときには理にかなっている。守るべき境界線は、「全員に個別に返答することはできません」が、実際の量に照らして確認された本物の運用上の制約であるべきで、二分で済んだはずの返答を飛ばすためのデフォルトの言い訳であってはならないということだ。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;弱い理由で素早く断るのと、良い理由のために時間をかけるのとではどちらが良いか?&lt;/strong&gt;
正直な理由で素早く、が両者を別々に上回る。たとえ短くても本物の理由を伴う素早い返答は、磨き上げられた理由を伴う遅い返答より優れている。遅延そのものが信頼を損なうものの一部だ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;拒否はリクエストを後で再検討すると約束すべきか?&lt;/strong&gt;
それが本当にありそうで、計画サイクルでそれを再浮上させるラベルのような、実際に再検討する仕組みがある場合に限る。そのような仕組みなしの曖昧な「心に留めておきます」は、機能的には沈黙と同じであり、より親切に言い換えられているだけだ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;正直な理由が競争上の懸念のような、会社が共有できないことである場合はどうか?&lt;/strong&gt;
より柔らかい理由をでっち上げるのではなく、それを直接言うこと。「ここでは具体的な理由をお伝えできませんが、これは私たちが構築を計画しているものではありません」は、フォローアップの質問で崩れるでっち上げの説明より、より正直で、より尊重される。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;リクエストを拒否することは、それを追跡から削除すべきことを意味するか?&lt;/strong&gt;
いいえ。理由とともに拒否済みとラベル付けして保持しておくこと。それが次の類似リクエストがグループ化されるパターンの一部になるようにし、後で変わった文脈(新しい統合、新しいチームの優先順位)が評価をゼロから始める代わりにそれを再浮上させられるようにするためだ。&lt;/p&gt;
</content:encoded></item><item><title>フィーチャーフラグのリリースノート：何を、いつ伝えるか</title><link>https://changeloop.dev/blog/ja/feature-flags-feature-requests/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/feature-flags-feature-requests/</guid><description>フィーチャーフラグでは、マージと出荷が同じ出来事ではない。ループを閉じる正しいタイミングと、緊急停止スイッチの場合の扱いを具体例とともに説明する。</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;機能リクエストでループを閉じるという発想は、そのものが出荷されたきれいな瞬間があることを前提にしている。フィーチャーフラグはその瞬間を消し去り、それがフィーチャーフラグのリリースノートのタイミングを難しくしている。コードはマージされ、フラグは存在するが、その後数日から数週間にわたって、その機能は本番環境で稼働していると同時に、それを使いたいであろうほぼ全員、しばしば最初にそれを頼んだ本人にとってさえも、見えない状態になる。早すぎる通知は、まだそこにない機能に相手を出会わせてしまう。遅すぎる通知は、信頼を築くはずだったループを、忘れられたかのように読ませてしまう。&lt;/p&gt;
&lt;h2&gt;なぜフラグは「出荷したら伝える」という通常の順序を壊すのか&lt;/h2&gt;
&lt;p&gt;一つの出来事を少なくとも二つに分割してしまうからだ。コードがライブになることと、フラグが特定のアカウントに対して有効になることだ。フィードバックループを閉じるあらゆるプロセスは、この二つが一緒に起こることを前提としている。それはほとんどのリリースでは正しいが、段階的な展開やターゲティング、あるいは緊急停止スイッチとして使われるフラグの裏にあるものすべてについては誤りだ。&lt;a href=&quot;https://changeloop.dev/blog/ja/customer-feedback-loop/&quot;&gt;顧客フィードバックループを閉じる&lt;/a&gt;は、changelogのエントリが承認され公開されたまさにその瞬間に依頼者へ伝えることを描いている。そのステップは、エントリの公開と機能が使えるようになることが同じ瞬間である場合のために書かれており、フラグはまさにそれらが同じでない場合なのだ。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;瞬間&lt;/th&gt;
&lt;th&gt;事実&lt;/th&gt;
&lt;th&gt;依頼者にすでに伝えるべきか&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;コードはマージ済み、フラグはどこでもオフ&lt;/td&gt;
&lt;td&gt;機能は存在するが、誰も使えない&lt;/td&gt;
&lt;td&gt;いいえ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;フラグは依頼者のアカウントで有効&lt;/td&gt;
&lt;td&gt;機能は存在し、その特定の人は使える&lt;/td&gt;
&lt;td&gt;はい&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;フラグはその人を除外する展開割合で有効&lt;/td&gt;
&lt;td&gt;機能は存在するが、その人はまだ使えない&lt;/td&gt;
&lt;td&gt;いいえ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;フラグは完全に削除され、機能は単に有効&lt;/td&gt;
&lt;td&gt;機能は全員に存在する&lt;/td&gt;
&lt;td&gt;はい、まだ伝えていなければ&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;誰かにいつ伝えるべきかの本当のルールは何か&lt;/h2&gt;
&lt;p&gt;フラグがその人のアカウントで有効になった時に伝える。コードがマージされた時でも、フラグが作成された時でもない。この一つのルールが上の表のすべての行をカバーする。なぜなら、依頼者にとって本当に重要な唯一の事実、つまり今この瞬間に行ってそれを使えるかどうかに通知を結びつけているからだ。マージやフラグの作成に結びついた通知は、実際にはエンジニアリングの進捗報告であり、機能を依頼した人が欲しいのは進捗報告ではなく、いつ確認しに行けばいいかを知ることだ。&lt;/p&gt;
&lt;h2&gt;それは依頼者が早期アクセスや特別なアクセスを必要とすることを意味するのか&lt;/h2&gt;
&lt;p&gt;必ずしもそうではなく、それを強制すると独自の問題が生まれる。負荷や安定性の理由でフラグが段階的に展開されている場合、単にループを早く閉じるためだけに一つのアカウントを列の先頭に移動させることは、そもそも展開が段階的である理由を損なう。正直な選択肢は、依頼者のアカウントが自然に展開に到達するのを待ってその時に伝えるか、緊急性がそれを正当化するなら、通知を送りたいという副作用としてではなく、展開を所有する誰かの本当の決定として、意図的に早くフラグを与えることだ。&lt;/p&gt;
&lt;h2&gt;フラグが展開の仕組みではなく緊急停止スイッチだったらどうか&lt;/h2&gt;
&lt;p&gt;その場合、安全な前提は逆転する。リリースを段階化するためではなく、機能をすばやく無効化できるようにするために作られたフラグは、通常、その機能が作成された時点で完全にライブになることを意図しており、フラグは順序のためではなく安全のために存在する。その場合、デプロイの時点で依頼者に伝えることは正しく、フラグのないどのリリースとも同じだ。フラグの存在は、ループがいつ閉じるかを変えるべきではない運用上の詳細である。重要な区別は、そのフラグが何のためにあるかであり、フラグが存在するかどうかではない。&lt;/p&gt;
&lt;h2&gt;フラグはフィーチャーフラグのリリースノートが言うべきことを変えるのか&lt;/h2&gt;
&lt;p&gt;エントリが公開されるタイミングを変えるのであって、内容を変えるのではない。フラグが100%のアカウントで有効になったまさにその瞬間に公開されたエントリは、まさに通常のchangelogエントリのように読める。それでいい。後でそれを見つける読者には、かつてフラグが関わっていたことを知る理由がまったくない。やってはいけないのは、フラグが小さな展開割合でしか有効になっていない間に公開することだ。なぜなら公開のchangelogエントリは、それを読む全員、フラグのないアカウントも含めて、見つけられない機能を探しに行かせてしまうからだ。これは同じ問題のより悪いバージョンであり、一人の依頼者の規模ではなく製品全体の規模で起こる。このタイミングのルールこそが、フィーチャーフラグのリリースノートと通常のエントリとの違いのすべてだ。内容は同じで、動くのは公開日だけだ。&lt;a href=&quot;https://changeloop.dev/blog/ja/how-to-write-release-notes/&quot;&gt;リリースノートの書き方&lt;/a&gt;は、ここにも当てはまる「何のアクションも不要」という規律を扱っている。読者はそれが自分に当てはまるかどうかを知る必要があり、単にどこかに存在するというだけでは足りない。&lt;/p&gt;
&lt;h2&gt;プロダクトアップデートメールはフラグ付きの機能を違う扱いにすべきか&lt;/h2&gt;
&lt;p&gt;そうすべきで、主に書き直すのではなく遅らせることによってだ。&lt;a href=&quot;https://changeloop.dev/blog/ja/product-update-email/&quot;&gt;プロダクトアップデートメールのテンプレート&lt;/a&gt;は、ターゲットを絞った通知と広範なダイジェストを扱っている。フラグ付きの機能は、ターゲットを絞った通知のタイミングを送信前に受信者自身のフラグの状態と照合しなければならないケースであり、それは広範なダイジェストがまったく簡単にはできないことだ。これは、まだ展開の途中にあるものすべてにとってダイジェストが間違ったチャネルである、もう一つの理由でもある。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;フラグが存在するがまだその人には有効になっていない時、依頼者に機能は「もうすぐです」と伝えるべきか?&lt;/strong&gt;
本当に近い、実際の日付が付いている場合に限り、それでも控えめに。日付のない「もうすぐ」は、十分な時間が経つと沈黙とまったく同じように読め、これもまた追跡し守らなければならない二つ目の約束を生む。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;フラグがループを閉じるのに十分進んでいるかを誰が決めるのか?&lt;/strong&gt;
通知を所有する人ではなく、展開を所有する誰かだ。展開を持つ人は「100%のアカウント」が目前なのか、まだ数週間先なのかを知っている。ループを閉じるステップを固定のカレンダー日付ではなくその人の状態に結びつけることが、通知を正直に保つ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;永続的なフラグ（決して完全には削除されない）の裏にある機能は、いつか公開のchangelogエントリを得るのか?&lt;/strong&gt;
得る。その製品にとって「一般提供」が意味するものに到達すればいい。たとえフラグ自体が運用上の理由で永遠にコードに残るとしてもだ。changelogのエントリは読者にとっての利用可能性についてのものであり、その利用可能性がどう実現されているかという実装の詳細についてではない。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;フラグが削除され、機能が出荷ではなく打ち切りになったらどうか?&lt;/strong&gt;
それは拒否であり、出荷の通知ではない。そして他のどんな拒否とも同じ配慮に値する。&lt;a href=&quot;https://changeloop.dev/blog/ja/declining-feature-requests/&quot;&gt;機能リクエストの断り方&lt;/a&gt;は、そのメッセージが何を言うべきかを扱っている。正直にループを閉じるということは、時には「ノー」でそれを閉じることを意味する。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;フィーチャーフラグのリリースノートは、通常のエントリとは別のテンプレートを必要とするか?&lt;/strong&gt;
テンプレートは変わらず、公開前にゲートとなるステップが一つ増えるだけだ。コードがマージされたことだけでなく、依頼したアカウントに対するフラグの状態を確認し、そのチェックが通るまでエントリを保留する。文言、長さ、FAQの規律など、エントリに関するそれ以外のすべては、他のどのリリースノートとも変わらない。&lt;/p&gt;
</content:encoded></item><item><title>機能リクエストを見失わずに追跡していく方法</title><link>https://changeloop.dev/blog/ja/feature-request-tracking/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/feature-request-tracking/</guid><description>機能リクエストの追跡は、届かないか、集めて放置されるかで失敗する。両方に耐える仕組み、自動トリアージ向けのラベル、次に作る物の決め方を説明する。</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;機能リクエストの追跡は、ほぼ常に二つの方法のどちらかで失敗する。リクエストが行き先を持たず、受信箱やSlackのスレッドに住み着いて一つずつ忘れられていくか、行き先はあるが誰もそこに戻ってこないため、まとめて忘れられていくかだ。機能する仕組みは両方の失敗に耐えなければならない。すべてのリクエストが着地する一つの場所と、来月その場所をもう一度開く理由が必要だ。&lt;/p&gt;
&lt;h2&gt;機能リクエストは実際どこから来るのか&lt;/h2&gt;
&lt;p&gt;ほとんどの追跡システムが想定するよりも多くのチャネルからだ。「あったらいいのに」を含むサポートチケット。公開ロードマップへのコメント。見込み客が取引を妨げているまさにその一点を名指しする営業電話。製品内のウィジェット。それぞれのチャネルには独自の担当者と独自のツールがあり、まさにそのためにリクエストは分散する。サポートのチケットキューと製品チームのバックログが同じシステムであることはめったになく、どちらか一方にしか届かないリクエストは、実質的に一つの部門にしか届いていない。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ソース&lt;/th&gt;
&lt;th&gt;典型的な担当者&lt;/th&gt;
&lt;th&gt;消えていきがちな場所&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;サポートチケット&lt;/td&gt;
&lt;td&gt;サポートチーム&lt;/td&gt;
&lt;td&gt;解決済みとしてクローズされ、二度と見返されない&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;営業電話&lt;/td&gt;
&lt;td&gt;営業 / アカウント管理&lt;/td&gt;
&lt;td&gt;製品側の誰も読まないCRMのフィールド&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;製品内のウィジェット&lt;/td&gt;
&lt;td&gt;製品&lt;/td&gt;
&lt;td&gt;フォローアップのないフォーム送信&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ロードマップへのコメント&lt;/td&gt;
&lt;td&gt;ロードマップを作った誰か&lt;/td&gt;
&lt;td&gt;コメントスレッドそのもの&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SNS / レビュー&lt;/td&gt;
&lt;td&gt;マーケティングか、誰でもない&lt;/td&gt;
&lt;td&gt;一度スクリーンショットが撮られ、その後消える&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;すべてのチャネル向けの単一の受付フォームはうまくいかない。誰も採用しないからだ。うまくいくのは、ルーティングが自動化されるまで一日五分のコピーアンドペーストで行う人力であっても、すべてのチャネルが流れ込む一つの行き先だ。&lt;/p&gt;
&lt;h2&gt;機能リクエストの追跡を実際に壊すものは何か&lt;/h2&gt;
&lt;p&gt;ほぼ常に二つのことだ。一つ目は行き先の欠如で、リクエストは届いたチャネルで返答され、どこにも永続的には記録されないため、三人の異なる顧客からの同じリクエストが、一つの信号ではなく三つの無関係な単発の返答のように見える。二つ目は、より多く見られるもので、いっぱいになって読まれなくなる行き先だ。フィルタリングされていない400行のスプレッドシートは、もはや追跡システムではない。たまたま編集可能なアーカイブだ。&lt;/p&gt;
&lt;p&gt;二つ目の失敗の方が危険だ。追跡が機能しているように見えるからだ。リクエストは記録される。誰かが「何人がXを求めたか」と尋ねるまで何も壊れているようには見えず、正直な答えは「知るには400行すべてを読まなければならない」だ。&lt;/p&gt;
&lt;h2&gt;機能リクエストは実際何を記録すべきか&lt;/h2&gt;
&lt;p&gt;元のメッセージを読み返さずに後で三つの質問に答えられるだけの内容だ。何が求められたか、可能であればリクエストした本人の言葉で。誰が求めたか、そして答えが結局「作った」になった場合にどう連絡を取るか。そしてこれが一般的なリクエストなのか単発の事例なのかを知るために何が必要か。逐語的な引用は言い換えより価値がある。なぜなら、リクエストをトリアージした人が書いた言い換えはすでにその人自身の読み方を含んでおり、まさにその読み方こそ、六か月後に二人目が確認できないものだからだ。&lt;/p&gt;
&lt;h2&gt;どのラベルが役に立つのか&lt;/h2&gt;
&lt;p&gt;二つあり、それぞれ異なる質問に答える。&lt;strong&gt;種類&lt;/strong&gt;のラベルは機能リクエストをバグレポートから分ける。両者には異なる担当者と異なるタイムラインが必要で、一つのキューに混ぜると最も声の大きい苦情がリクエストを追い越してしまうからだ。low、medium、highのような小さなセットに保たれた&lt;strong&gt;優先度&lt;/strong&gt;のラベルは、「誰かが製品を使うのを妨げている」を「あったら嬉しい」から分ける。両者は非常に異なる対応時間に値し、どちらも相手のペースを受け継ぐべきではないからだ。&lt;strong&gt;種類&lt;/strong&gt;のラベルを正しく付けることは、そのリクエストが名乗る通りのものであることを前提としている。&lt;a href=&quot;https://changeloop.dev/blog/ja/feature-request-vs-bug-report/&quot;&gt;機能リクエストが実はバグレポートである時&lt;/a&gt;は、顧客自身の言葉がそのラベルを間違った方向に向けてしまうケースを扱っている。&lt;/p&gt;
&lt;p&gt;自動トリアージはリクエストが届いた瞬間に両方を適用できる。changeloopでは、ウィジェットからの送信は同じステップで&lt;code&gt;feature-request&lt;/code&gt;か&lt;code&gt;bug&lt;/code&gt;のラベルと&lt;code&gt;priority:low|medium|high&lt;/code&gt;のラベルを受け取り、さらにアイテムを開かなくてもソースが分かるように&lt;code&gt;from-widget&lt;/code&gt;タグが付く。これだけで、午後をかけずに一分でバックログをフィルタリングできる。今月ウィジェットから来た優先度の高い機能リクエストをすべて見せて、というふうに。&lt;/p&gt;
&lt;p&gt;三つ目のラベルは、公開ロードマップができた時点で役に立つ。リクエストした本人が自分で確認できるステータスだ。&lt;a href=&quot;https://changeloop.dev/blog/ja/public-roadmap/&quot;&gt;公開ロードマップ&lt;/a&gt;がplanned、building、shippedの状態を完全に扱っている。簡単に言えば、このラベルは非公開のキューを、リクエストした本人が再度尋ねることなく確認できるものに変える。&lt;/p&gt;
&lt;h2&gt;次に何を作るかはどう決めるのか&lt;/h2&gt;
&lt;p&gt;数える前にグループ化する。同じ根本的な能力を異なる言い方で求めた十件のリクエストは、スプレッドシートに散らばった十行のように読める。しかしグループ化されれば強い信号になり、そのグループ化こそが通常欠けているステップであり、数えることではない。グループ化なしの生の数は、その背後にある実際の需要が最も大きい機能ではなく、最もキャッチーな名前を持つ機能に報いる傾向がある。&lt;/p&gt;
&lt;p&gt;何人が求めたかだけでなく、誰が求めたかで重み付けする。更新の近いアカウントからのリクエストは、トライアル登録からの同じリクエストとは異なる緊急性を持つ。この文脈を裸の数字のために捨てる追跡システムは、最も役立つ数字ではなく、最も計算しやすい数字を最適化している。&lt;/p&gt;
&lt;p&gt;ここでのすべての決定は、負けるリクエストも生み出し、それらも返答に値する。&lt;a href=&quot;https://changeloop.dev/blog/ja/declining-feature-requests/&quot;&gt;機能リクエストの断り方&lt;/a&gt;が、通らなかったリクエストをした人に何を伝えるべきかを扱っている。グループ化と重み付けは「次に何を作るか」の半分にすぎず、&lt;a href=&quot;https://changeloop.dev/blog/ja/prioritizing-feature-requests/&quot;&gt;機能リクエストの優先順位付け&lt;/a&gt;が実際のフレームワーク、RICE、収益による重み付け、そして生の数値と、それぞれがどこで破綻するかを扱っている。&lt;/p&gt;
&lt;h2&gt;何かがリリースされたとき、どうループを閉じるのか&lt;/h2&gt;
&lt;p&gt;これは追跡システムが最も見落としがちなステップであり、リクエストした人が実際に気づくステップだ。&lt;a href=&quot;https://changeloop.dev/blog/ja/customer-feedback-loop/&quot;&gt;顧客とのフィードバックループを閉じる&lt;/a&gt;がその仕組みを完全に扱っている。ここで当てはまるのは、ループを閉じることは元のリクエストがリクエストした本人と結びついたままである場合にのみ機能するということだ。GitHub issueから作られた機能リクエストのテンプレートで、リクエストした本人の身元がコメントに埋もれるのではなくissueに紐づいていることが、誰かが送るのを覚えていなければならない通知ではなく、自動の「リリース済み」通知を可能にするものだ。&lt;a href=&quot;https://changeloop.dev/blog/ja/feature-request-template/&quot;&gt;機能リクエストのテンプレート&lt;/a&gt;が具体的なテンプレートと各フィールドの役割を示している。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;機能リクエストの追跡にはどのツールを使うべきか?&lt;/strong&gt;
チームがすでに毎日確認しているものは、誰も開かない専用ツールに勝る。エンジニアリングがすでにそこに住んでいるならGitHub issueトラッカーがうまく機能し、製品がそこに住んでいるなら軽量なボードがうまく機能する。ツールそのものより、再び開かれるかどうかの方が重要だ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;機能リクエストの重複をどう防ぐか?&lt;/strong&gt;
言い回しでトリアージする前に、根本的な能力でグループ化する。新しいものを作る前に既存のリクエストを検索することで、ほとんどの重複を捕まえられる。月次のグループ化作業で残りを捕まえる。
&lt;a href=&quot;https://changeloop.dev/blog/ja/duplicate-feature-requests/&quot;&gt;元の声を失わずに重複を統合する&lt;/a&gt;は、グループ化そのものが終わった後で言い回しをどう扱うべきかを扱っている。そうすれば統合が最初に届いた提出物へとリクエストを静かに狭めてしまうことはない。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;すべての機能リクエストに返答すべきか?&lt;/strong&gt;
すべてに、短くても確認応答をすべきだが、すべてがすぐに決定を必要とするわけではない。リクエストした本人が自分で確認できるロードマップのラベルのような見える形のステータスは、チームが個別に負うはずだったほとんどの返答を置き換える。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;機能リクエストの追跡と公開ロードマップの違いは何か?&lt;/strong&gt;
追跡は、決してリリースされないものも含めた、すべてのリクエストの内部記録だ。公開ロードマップは、チームが公に約束するその部分集合であり、リクエストした本人が再度尋ねることなく見られるステータスを伴う。&lt;/p&gt;
</content:encoded></item><item><title>機能リクエストが実はバグレポートである時</title><link>https://changeloop.dev/blog/ja/feature-request-vs-bug-report/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/feature-request-vs-bug-report/</guid><description>新しい設定を求めるチケットは、隠れたバグの回避策かもしれない。誤ったラベルは優先順位を狂わせる。顧客の言葉から見分ける方法と判断者を説明する。</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;「エクスポートの上限を増やす設定を追加してもらえますか」は機能リクエストのように読める。そしてほとんどのトリアージシステムはその場でそう分類する。時にはそうだ。時にはエクスポートは文書化された上限より低い数値で失敗しており、コードを見ることができない顧客は、説明できる最も妥当な解決策をでっち上げている。もっと大きな数字をください、そうすれば動くかもしれない、というふうに。&lt;a href=&quot;https://changeloop.dev/blog/ja/feature-request-tracking/&quot;&gt;どのラベルが役に立つのか&lt;/a&gt;は、バックログを機能リクエストとバグに分ける種類のラベルを扱っている。これは、顧客自身の言葉がラベルを間違った方向に向けてしまうケースであり、間違いのコストは、下を覗いてみれば誰も本当は望んでいないリクエストで満たされたバックログへとゆっくり漂流していくことだ。&lt;/p&gt;
&lt;h2&gt;実はバグである機能リクエストはどう見えるか&lt;/h2&gt;
&lt;p&gt;問題ではなく回避策を挙げる。本物の機能リクエストは通常、製品がまったくサポートしていない結果を説明する。「これを後で予定できるようにしてほしい」「ダークモードを追加してほしい」というふうに。誤って分類されたバグは、欠けている設定のように聞こえるが実は症状である、具体的な数字、閾値、振る舞いを説明する。「タイムアウトを増やしてほしい」「再試行オプションを追加してほしい」「一度にもっと多くの行をエクスポートさせてほしい」というふうに。その兆候は、リクエストする側が目標を説明する代わりに実装、設定、切り替え、上書きを提案していることだ。すでに文書通りにその機能を試し、文書が言うべきだと述べていることをそれがしなかったからだ。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;シグナル&lt;/th&gt;
&lt;th&gt;機能リクエスト&lt;/th&gt;
&lt;th&gt;機能リクエストを装ったバグ&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;リクエストする側が説明すること&lt;/td&gt;
&lt;td&gt;製品にできない結果&lt;/td&gt;
&lt;td&gt;変更したいパラメータ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;文書化された振る舞いがすでにこれをカバーしているか&lt;/td&gt;
&lt;td&gt;いいえ、本当に欠けている&lt;/td&gt;
&lt;td&gt;はい、しかし文書通りに動作しない&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;努力を増やすとリクエストが消えるか&lt;/td&gt;
&lt;td&gt;いいえ&lt;/td&gt;
&lt;td&gt;時々、バグが閾値に依存している場合&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;どこにルーティングされるべきか&lt;/td&gt;
&lt;td&gt;製品バックログ&lt;/td&gt;
&lt;td&gt;バグキュー&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;なぜこれは思う以上に重要なのか&lt;/h2&gt;
&lt;p&gt;二つのキューは異なる担当者、タイムライン、成功基準を持ち、機能リクエストとして分類されたバグは機能リクエストに対して優先順位付けされ、バグが値する時間枠で修正される代わりに本物の製品の欠落と注目を奪い合うからだ。&lt;a href=&quot;https://changeloop.dev/blog/ja/feature-request-tracking/&quot;&gt;機能リクエストの追跡方法&lt;/a&gt;は、バグと機能を一つのキューに混ぜることが、最も声の大きい苦情を本物のリクエストより前に進ませてしまう理由を扱っている。密かにバグである機能リクエストは逆の害をなす。基礎となるバグが修正された瞬間に消えるはずの「機能」への投票を集めながら製品バックログに居座り続け、そのバックログを読む誰にとっても優先順位付けのシグナルを無駄にする。&lt;/p&gt;
&lt;h2&gt;顧客自身の言葉が間違った方向を指しているとき、どう見分けるか&lt;/h2&gt;
&lt;p&gt;何を追加してほしいかではなく、何が起こると期待していたかを尋ねよ。「エクスポートが500行で頭打ちになり、2,000行必要なので上限を上げてもらえますか」は、フォローアップの質問「500は文書化された上限ですか」が、文書化された数字は5,000でありエクスポートが早期に失敗していることを明らかにするまでは、上限引き上げの機能リクエストのように聞こえる。その一つの質問、何を期待していたかと何が起きたかだけで、分類作業の大部分が終わる。本物の機能リクエストには、それが満たしていない文書化された振る舞いなど存在しないからだ。まだ能力自体が存在しないので、期待すべきものが何もない。&lt;/p&gt;
&lt;h2&gt;サポート担当者かエンジニアか、どちらがこれを決めるべきか&lt;/h2&gt;
&lt;p&gt;サポート担当者はチケットを最初に見るので最初の判定を行うが、ラベルは変更しやすく間違えても安上がりであるべきで、その項目を永遠に間違ったキューに固定する一回限りの決定であってはならない。装われたバグの臭いがするものを毎週新しい「機能リクエスト」ラベルの中から見つけるエンジニアという軽量な二次チェックは、コードベースの文脈を持たないサポート担当者には認識できなかったものを捕まえる。これは正式である必要はなく、レビュープロセスというより五分間の一瞥に近い。&lt;/p&gt;
&lt;h2&gt;本物のバグが見つかった後、ループを閉じる方法は変わるのか&lt;/h2&gt;
&lt;p&gt;変わる。そして送れるメッセージが改善される。&lt;a href=&quot;https://changeloop.dev/blog/ja/customer-feedback-loop/&quot;&gt;顧客フィードバックループを閉じる&lt;/a&gt;は、リクエストがリリースされたときにリクエストした人へ知らせることを扱っている。再分類されたバグはそのメッセージのより良いバージョンを得る。「その背後にあるバグを見つけて修正しました」は能力の高さのように聞こえる一方、「あなたがリクエストした機能を作りました」は偶然にしか真実にならなかったはずだからだ。本物の機能リクエスト、本当により高いエクスポート上限は、バグが消えて元の5,000行の上限で十分になった瞬間、二度と作られないかもしれない。&lt;/p&gt;
&lt;h2&gt;誤分類が一度も見つからなかったらどうなるか&lt;/h2&gt;
&lt;p&gt;バックログは本物の需要のように見えて実はそうでないリクエストで満たされ、そのバックログに対して行われる優先順位付けの決定は歪みを引き継ぐ。四十票の「機能」は実際には同じバグに出くわした四十人かもしれず、字義通りのリクエストを構築すること、つまり実際には一度も制約ではなかった上限を上げる設定を作ることは、何も修正しない複雑さをもたらす一方で、基礎となるバグはまだこのスレッドを見つけていない顧客から新しい「機能リクエスト」を生み出し続ける。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;すべての機能リクエストを既知のバグと照合する正式な手順を追加する価値はあるか?&lt;/strong&gt;
正式な手順ではなく、むしろ習慣だ。新しい機能リクエストをトリアージする誰もが、ラベルを適用する前に「文書化された振る舞いはすでにこれを行うと主張しているか」を尋ねるべきだ。その一つの質問だけで、プロセスの負荷を増やすことなくほとんどの誤分類を捕まえられるからだ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;バグが見つかった後も顧客が機能リクエストだと主張し続けたらどうするか?&lt;/strong&gt;
何を見つけたか、そしてバグが修正されれば顧客が提案した設定がもう必要なくなる理由を説明せよ。ほとんどの顧客は、本物の修正が利用できないと思い込んだから回避策を求めているのであり、特にその設定を望んでいたわけではない。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;再分類された項目は、機能リクエストとして集めた投票やコメントを失うのか?&lt;/strong&gt;
可視のまま保持すべきだ。その投票はそもそもバグを見つけることにつながった証拠であり、その痕跡を隠すことは、次に別のチケットで同じ誤分類を捕まえることを難しくするからだ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;逆のことも起こりうるか、実は機能リクエストであるバグレポートは?&lt;/strong&gt;
頻度は低いが、ある。「これは壊れている」は時に「これは私が想定していた動作をしていない」を意味し、それは欠陥ではなく欠けている能力だ。何を期待していたかと何が文書化されているかという同じ質問が、この方向でも分類を行う。&lt;/p&gt;
</content:encoded></item><item><title>サポートチケット対機能リクエスト：どちらを信じるべきか</title><link>https://changeloop.dev/blog/ja/feedback-signal-quality/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/feedback-signal-quality/</guid><description>サポートチケットと機能リクエストボードは、異なるものを測っている。片方の急増をもう片方と同一視すると優先順位を誤る。どちらを信じるべきかを説明する。</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;機能リクエストボードは、ユーザーが座って何が欲しいかを説明する時間があるときに要求するものを
捉える。サポートチケットは、ユーザーが今まさに行き詰まっていること、しばしばイライラしながら、
しばしば根底にある要求をきれいに説明する語彙もなく、を捉える。どちらも本物のシグナルであり、
片方だけを見るチームは、それぞれのチャネルが異なるタイプのユーザーと異なるタイプのニーズを
体系的に過剰に代表しているため、最終的に自信を持って間違った問題を解決することになる。
&lt;a href=&quot;https://changeloop.dev/blog/ja/prioritizing-feature-requests/&quot;&gt;機能リクエストの優先順位付け&lt;/a&gt;は、すでにボードに
あるものをランク付けすることを扱っている。これは、そもそもボードに届くものと、サポート
チケットとしてしか決して現れないものとの間のギャップについてだ。&lt;/p&gt;
&lt;h2&gt;なぜ同じ根底にある問題が一方のチャネルには現れて、もう一方には現れないのか&lt;/h2&gt;
&lt;p&gt;二つのチャネルは異なる活性化コストを持ち、そのコストの大きさが誰がそれを乗り越えるかを
決めるからだ。機能リクエストを提出することは主体性を要求する。ユーザーはそのリクエストが
言葉にする価値があると信じ、ボードを見つけ、一貫した何かを書かなければならない。それは、
すでに製品に投資している、関与し忍耐強いユーザーを選別する。サポートチケットを提出すること
は、それに比べてほとんど主体性を要求しない。しばしばタスクの途中で「ヘルプ」をクリックする
だけであり、それはボードを決して使わないであろうユーザーも含めて、その瞬間にイライラして
いるユーザーを捉えることを意味する。製品の本物のギャップは、それに遭遇するユーザーが正式な
リクエストを提出する可能性が最も低い人々であるという理由だけで、機能ボードでは見えず、
サポートでは騒がしくなり得る。&lt;/p&gt;
&lt;h2&gt;欠けている機能のチケット量は、それに対する投票数と同じことを意味するのか&lt;/h2&gt;
&lt;p&gt;いいえ、異なる条件下で異なる母集団を測定しているからだ。百票の機能リクエストは、既存の
リクエストを見つけて支持する時間を取った百人を表しており、それは持続的で熟慮された需要の
強いシグナルだ。同じ期間に提出された、同じ根底にあるギャップに関する百件のサポートチケット
は、おそらくその瞬間に壁にぶつかっているユーザーを表しており、そのうちの何人かは、直接的な
摩擦が過ぎればすっかり忘れてしまうだろう。両方を「百人がこれを望んでいる」という同等の
シグナルとして扱うことは、チケット量を過大評価する。チケットは生成するのが安価で、投票は
そうではないからだ。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;機能リクエストボード&lt;/th&gt;
&lt;th&gt;サポートチケット&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;提出には主体性が必要&lt;/td&gt;
&lt;td&gt;ほとんど必要ない&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;熟慮された持続的な需要を捉える&lt;/td&gt;
&lt;td&gt;その瞬間のフラストレーションを捉える&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;関与し忍耐強いユーザーに偏る&lt;/td&gt;
&lt;td&gt;ボードを決して使わないであろうユーザーを捉える&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;投票数は本物のコミットメントシグナル&lt;/td&gt;
&lt;td&gt;チケット数は摩擦を反映するが、必ずしも欲求ではない&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;機能にサポートチケットはあるがボードにほとんど投票がない場合、それは何を意味するのか&lt;/h2&gt;
&lt;p&gt;多くの場合、リクエストは存在するが、それに遭遇するユーザーがボードの存在を知らない、投票が
何かを変えると信じていない、または問題にあまりに稀にしか遭遇しないため、正式に登録するために
チャネルを切り替える手間をかけないということだ。これはまさに機能リクエストボードが構造的に
見逃す母集団であり、ここでの低い投票数は測定ギャップの証拠であり、低い需要の証拠ではない。
欠けている機能を巡るサポートチケットのクラスターは、チケットを疑うのではなく、投票数だけから
優先順位をつける人にとって見えないままにならないよう、ユーザーに代わって自らボードに記録する
価値のある独自のシグナルとして扱おう。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ボードは低優先度として読める:
&amp;quot;Export to CSV&amp;quot;: 6か月で4票

サポートは違う話を伝える:
&amp;quot;Export to CSV&amp;quot;: 同じ期間に31件のチケット、それぞれ
異なるアカウントから、それぞれ「現在サポートされて
いません、フィードバックをお伝えします」で閉じられた
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;サポートチケットの急増は常に根底にある問題が欠けている機能であることを意味するのか&lt;/h2&gt;
&lt;p&gt;いいえ、そしてここで二つのチャネルは逆方向に誤解を招く可能性がある。チケットの急増は、すでに
存在する機能を巡る混乱したインターフェース、バグ、または十分な説明なしにリリースされた変更に
よって同じくらい頻繁に引き起こされ、そのどれも新しいものを構築することでは解決されない。
すべてのチケットの急増を「ユーザーは私たちが持っていない機能を望んでいる」と読むことは、
実際にはドキュメントのギャップや変装した使いやすさの問題だったもので満たされたロードマップを
生み出す。サポートチケットは摩擦がどこにあるかを教えてくれる。それ自体では、解決策が新しい
機能なのか、インターフェースの変更なのか、より良いヘルプ記事なのかは教えてくれず、それを
混同することはエンジニアリングの時間を間違った解決策に浪費する。&lt;/p&gt;
&lt;h2&gt;何を構築するかを決める際、二つのシグナルは実際にはどう組み合わせるべきか&lt;/h2&gt;
&lt;p&gt;チケットを使って摩擦がどこにあるかを見つけ、ボードが薄い場合は直接のアウトリーチと合わせて
機能リクエストボードを使って、望ましい結果が実際にどう見えるかを確認しよう。チケットの
クラスターは本物の、感じられた問題を特定する。それに対して構築できるほど正確に解決策を
特定することはめったにない。サポートの会話で苛立ったユーザーは症状を説明するのであって、
仕様を説明するのではないからだ。機能リクエストボードは、同じ根底にある問題に十分な投票が
あるとき、「実際に何がこれを満足させるか」という詳細をより多く運ぶ傾向がある。リクエストを
書くことは、何が間違っているかを報告するだけでなく、何が欲しいかを明確に特定する行為だから
だ。&lt;/p&gt;
&lt;h2&gt;サポートエージェントは自分自身でチケットを機能リクエストとして記録すべきか&lt;/h2&gt;
&lt;p&gt;はい、そしてこれは二つのチャネル間のギャップに対する単一で最もレバレッジの高い修正だ。
チケットを変装した機能リクエストとして認識するエージェントは、単にそれを解決して先に進む
のではなく、顧客に代わってそれをボードに記録することができ、それは顧客が二番目のチャネルを
発見して使用することを要求する代わりに、測定ギャップを直接埋める。これは、記録することが
エージェントにとって分単位ではなく秒単位で済む場合にのみ機能し、それによってそれを行う摩擦
が、単にチケットを閉じて次に進む摩擦よりも低くなる。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;機能リクエストの投票は、すべて一つのアカウントやチームから来ている場合、割り引かれるべきか?&lt;/strong&gt;
はい、生の投票数ではなく、別個のアカウントや組織で重み付けしよう。同じ会社の五人からの五票は、
一つの顧客の優先順位を表しているのであって、五つの独立した需要の確認ではないからだ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;チケットには多く現れるがほとんど投票のない機能を構築する価値はあるか?&lt;/strong&gt;
多くの場合はい、チケット量が本当に別個のアカウントから来ていて、根底にあるニーズが仮定では
なく確認されている限り。低い投票数を、需要が本物でない証拠としてではなく、ボードの活性化
コストの測定上の産物として扱おう。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UIの混乱チケットと本物の機能欠如チケットを一目でどう見分けるか?&lt;/strong&gt;
解決策が既存の機能を説明することにあるのか、欠けているものを謝罪することにあるのかを見よう。
「ああ、実際そこにありました」という解決のパターンはインターフェースまたは発見可能性の問題を
示し、「それはまだサポートしていません」というパターンは本物のギャップを示す。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;この区別は非常に小さなサポート量でも同じくらい重要か?&lt;/strong&gt;
機械的には重要性が低い。少数のチケットは集計分析を必要とせずに個別に読むのが簡単だからだ。
しかし、チケットはイライラしたユーザーを過剰に代表し忍耐強いユーザーを過小に代表するという
根底にある偏りは、どんな規模でも存在し、自分自身ですべてのチケットを読んでいるときでも
心に留めておく価値がある。&lt;/p&gt;
</content:encoded></item><item><title>Gitタグ、リリース、そしてあなたのチェンジログ</title><link>https://changeloop.dev/blog/ja/git-tags-releases-changelog/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/git-tags-releases-changelog/</guid><description>Gitタグ、リリース、チェンジログのエントリは、一つの出来事の三つの記録だ。混同するとずれる理由と、三つが噛み合うべき形を具体例とともに説明する。</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Gitタグ、リリース、チェンジログのエントリは、同じ出来事についての三つの異なる記録であり、それらを混同することはチェンジログを実際にリリースされたものから静かにずらしていく。タグはコミットに印をつける。リリースはそのタグをアーティファクトと説明でパッケージ化する。チェンジログのエントリは、リポジトリの外にいる読者が使える言葉で、何が変わったかを説明する。それらは通常時間的に近接して起こり、まさにそれゆえに三つのステップではなく一つのステップとして扱うのが簡単になり、まさにそれゆえに誰かが「v2.4では何がリリースされたのか」と尋ねて、正直な答えが本物の掘り起こしを必要とするまで、そのギャップは何か月も後になって初めて見えるようになる。&lt;/p&gt;
&lt;h2&gt;三つの間の実際の違いは何か&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;記録&lt;/th&gt;
&lt;th&gt;存在する場所&lt;/th&gt;
&lt;th&gt;対象読者&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Gitタグ&lt;/td&gt;
&lt;td&gt;リポジトリ、参照として&lt;/td&gt;
&lt;td&gt;まさにそのコミットをチェックアウトする誰でも&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;リリース&lt;/td&gt;
&lt;td&gt;コードホスト(GitHub、GitLab)&lt;/td&gt;
&lt;td&gt;ビルドをダウンロードする誰でも&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;チェンジログのエントリ&lt;/td&gt;
&lt;td&gt;製品自身のチェンジログ&lt;/td&gt;
&lt;td&gt;リポジトリだけでなく製品を使う誰でも&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;タグは三つのうち最も機械的なものだ。&lt;code&gt;git tag v2.4.0&lt;/code&gt;、それで終わりで、それが何を含むかを何かが説明する必要は一切ない。リリースは説明を追加し、通常はダウンロード可能なアーティファクトも追加するが、その対象読者は依然としてリリースページが何かを知っている開発者たちだ。チェンジログのエントリは三つのうち唯一、リポジトリを決して開かないかもしれない読者のために書かれたものであり、だからこそ最も編集上の注意を必要とし、締め切りの圧力のもとで最も飛ばされやすい。&lt;/p&gt;
&lt;h2&gt;すべてのGitタグはチェンジログのエントリを必要とするか&lt;/h2&gt;
&lt;p&gt;いいえ、そして両者を1対1で扱うのはよくある間違いだ。タグは内部のマイルストーンや、リリース候補や、ほとんどの利用者に決して届かないホットフィックスを示すことがある。それらのどれも必ずしも公開のエントリを必要としない。テストは、そもそも何かがチェンジログに属するかどうかを決めるのと同じものだ。利用者や呼び出し側がそれに気づくか、気にするだろうか。ほとんどのタグはこのテストに合格する。CIパイプラインを起動するためだけに作られたタグのようないくつかは、決して合格しない。&lt;/p&gt;
&lt;h2&gt;すべてのチェンジログのエントリは自分自身のタグを必要とするか&lt;/h2&gt;
&lt;p&gt;常にではなく、ここで継続的にデプロイするチームとバージョン管理されたパッケージをリリースするチームが分かれる。一日に何度もデプロイするSaaS製品は、デプロイごとに1対1のタグなしで、複数のデプロイを一つの日付付きチェンジログのエントリの下にグループ化できる。パッケージレジストリで公開されるライブラリは、通常公開されたバージョンごとに一つのタグを必要とする。GoモジュールとSwift Package Managerはタグそのものからバージョンを解決する。npmやPyPIではレジストリが公開されたバージョンを保持しており、タグは誰もがそのバージョンをソースに対応づけるための手段だ。独立してバージョン管理される複数のパッケージを持つリポジトリは、これをリポジトリ全体で一度ではなくパッケージごとに決める必要があり、&lt;a href=&quot;https://changeloop.dev/blog/ja/monorepo-changelogs/&quot;&gt;モノレポのチェンジログ&lt;/a&gt;がタグの接頭辞とチェンジログの範囲をフォルダの境界ではなくパッケージの境界に沿わせる方法を扱っている。&lt;a href=&quot;https://changeloop.dev/blog/ja/semantic-versioning-changelog/&quot;&gt;セマンティックバージョニングとあなたのチェンジログ&lt;/a&gt;は、バージョン番号自体がチェンジログのカテゴリにどうマッピングされるべきかを扱っている。タグは、バージョン番号を実際のコードに対して検証可能にする仕組みだ。&lt;/p&gt;
&lt;h2&gt;リリースの説明はチェンジログのエントリとどう関係すべきか&lt;/h2&gt;
&lt;p&gt;両者は同じテキストであり得るが、それは両者の対象読者が本当に同じ場合に限られ、それは見た目より稀だ。コードホスト上のリリースページはほとんど開発者だけに読まれる。製品にチェンジログを読む非技術的な利用者もいる場合、リリースの説明をそのまま複製することは、平易な言葉のバージョンを必要としていた読者に内部用語やコード中心の言い回しを送ることになる。最も綺麗なパターンは、チェンジログのエントリを主要な、読者志向のアーティファクトとして書き、リリースの説明はそれにリンクするか、すでにそこに慣れている読者向けに、より短く技術的な要約を保持することだ。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# リリース v2.4.0 (GitHub、開発者向け)
レポートのパイプラインを新しい集計エンジンに引き上げる。顧客向けの
要約はチェンジログを参照: https://example.com/changelog#v2.4.0

## 2026-09-07 (チェンジログ、顧客向け)
### Added
- レポートは今や100万行を超えるアカウントでも1秒未満で読み込まれる
  ようになった。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;同じリリース、二つの文書、それぞれ自分自身の読者のための自分自身の言い回しで。&lt;/p&gt;
&lt;h2&gt;チェンジログのエントリは実際どこから来るのか&lt;/h2&gt;
&lt;p&gt;二つの出発点からで、ほとんどの実際のパイプラインは両方の混合だ。タグの時点でコミットメッセージから生成することができ、これは速く、マージされたプルリクエストを決して見逃さない。&lt;a href=&quot;https://changeloop.dev/blog/ja/conventional-commits-changelog/&quot;&gt;Conventional Commitsからチェンジログへ&lt;/a&gt;がそのパイプラインを完全に扱っている。あるいはタグから完全に切り離されて手で書くこともでき、コードがマージされる瞬間ではなく、機能が完成したと見なされる瞬間に合わせて調整される。生成されたエントリは一貫しているが、あいまいなコミットメッセージをそれぞれ継承する。手で書かれたエントリはより明確だが、実際にそれを書く誰かが必要だ。自動化する多くのチームでも、生の出力をそのまま見せるのではなく、それが公開のエントリになる前に、生成されたテキストに軽い編集の段階を維持している。それは&lt;a href=&quot;https://changeloop.dev/blog/ja/keep-a-changelog-implemented/&quot;&gt;Keep a Changelog、実践編&lt;/a&gt;が推奨するのと同じ規律であり、生のテキストがもともとどこから来たかにかかわらずだ。&lt;/p&gt;
&lt;h2&gt;三つが同期しなくなると何が壊れるのか&lt;/h2&gt;
&lt;p&gt;読者が最初に確認したものへの信頼だ。対応するチェンジログのエントリなしで存在するタグは、チェンジログの読者の側から見ると、その週何も起こらなかったかのように見える。対応するタグやリリースのないチェンジログのエントリは、本番の問題をデバッグしている誰かが、エントリが公開されたときにライブだったまさにそのコードをチェックアウトすることを不可能にする。解決策は完璧な自動化ではなく、その対応関係のための単一の信頼できる情報源だ。たとえそれがリリースプロセス自身のチェックリストにすぎなくても、リリース可能な変更がそれを導入する同じコミットやプルリクエストで三つすべてを受け取ると言う一つの場所だ。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;チェンジログのエントリはGitタグから自動的に生成されるべきか?&lt;/strong&gt;
出発点にはなり得るが、タグだけでは読者向けの説明を一切運ばず、コミットの範囲だけを運ぶ。自動生成は、使えるものを生み出すために、タグの存在だけでなく、その範囲内のコミットメッセージを読まなければならない。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;すべてのリリースにタグを付けなかったらどうなるか?&lt;/strong&gt;
その場合、チェンジログのエントリが主要な記録になり、それでも日付を持つべきで、製品にバージョンがあるならバージョン番号も持つべきだ。対応するタグがなくても、読者が後で参照できるものとしてエントリが残るようにするためだ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;プレリリースのタグ(&lt;code&gt;v2.4.0-rc.1&lt;/code&gt;のような)はチェンジログのエントリを持つべきか?&lt;/strong&gt;
一般的には持つべきでない。リリース候補は内部テストやベータテストのためのものであり、それに対するチェンジログのエントリは、読者に、説明された通りには決してリリースされないかもしれないバージョンのエントリを期待するよう訓練してしまう。エントリは一般提供に達したタグのために取っておくこと。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一つのチェンジログのエントリが複数のGitタグをカバーできるか?&lt;/strong&gt;
できる、そして頻繁にタグを付けるチームにとっては、しばしばそうすべきだ。関連するタグを、機能を複数の読書にわたって断片化するタグごとの薄いエントリを公開する代わりに、正味の変更を説明する一つの日付付きエントリの下にグループ化すること。&lt;/p&gt;
</content:encoded></item><item><title>社内向けリリースノート：他に誰が知るべきか</title><link>https://changeloop.dev/blog/ja/internal-release-notes/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/internal-release-notes/</guid><description>サポートと営業は、混乱した顧客からローンチを知ることが多い。社内向けリリースノートは顧客向けと形が異なり、顧客より先にチームへ届くよう設計する。</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;このハブの他のすべての記事は、リリースノートの読者が顧客であることを前提としている。サポート、営業、カスタマーサクセスも読もうとしているが、そのほとんどは何がリリースされたかを、まず顧客に聞かれることで知る。この順序は逆であり、それはほとんどの企業でのデフォルトでもある。リリースのプロセスは顧客向けのノートが出た瞬間に終わり、一時間後にそれについての質問に答えなければならない人々のための、二番目の小さなステップを誰も作っていないからだ。&lt;/p&gt;
&lt;h2&gt;社内向けリリースノートとは何か、顧客向けとどう違うのか&lt;/h2&gt;
&lt;p&gt;それはより短い文書であり、すでに製品を深く知っている人々に向けて書かれ、何が変わったか、そして自分の具体的な仕事でそれについて何をすべきかを伝える。サポート担当者は顧客向けの発表が使うような磨き上げられた枠組みを必要としない。彼らが必要とするのは、その変更が今まさに製品の中でどう見えるか、それについて最も起こりやすい質問は何か、そして未解決のチケットに影響があるかどうかだ。顧客向けのノートは変更を売り込む。社内向けのノートは誰かがそれに対処できるよう装備する。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;読者&lt;/th&gt;
&lt;th&gt;知る必要があること&lt;/th&gt;
&lt;th&gt;どこで必要とするか&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;サポート&lt;/td&gt;
&lt;td&gt;UIで何が変わったか、起こりやすい質問、影響を受ける未解決チケット&lt;/td&gt;
&lt;td&gt;すでに答えを探している場所&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;営業&lt;/td&gt;
&lt;td&gt;商談にとって何が開けるか、まだできないこと&lt;/td&gt;
&lt;td&gt;通話の準備をしている場所&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;カスタマーサクセス&lt;/td&gt;
&lt;td&gt;既存顧客に何を伝えるべきか、誰が要望したか&lt;/td&gt;
&lt;td&gt;アウトリーチを計画している場所&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;経営陣&lt;/td&gt;
&lt;td&gt;約束に対して何がリリースされたか、いつ&lt;/td&gt;
&lt;td&gt;リリースごとではなく、短く繰り返される要約&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;なぜ社内チームはローンチを遅れて知るのか&lt;/h2&gt;
&lt;p&gt;リリースのプロセスは通常、一つの成果物、つまり顧客向けのノートかチェンジログのエントリを中心に組み立てられており、社内向けのすべてがその一つの文書を読むことから導かれると想定されているからだ。実際はそうではない。サポート担当者は目の前のチケットに追われており、文脈を求めてチェンジログを見て回っているわけではない。顧客向けに書かれたノートは、担当者が必要とするまさにその運用上の詳細、例えばその機能がどのプランに紐づいているか、失敗したときのエラーメッセージがどう見えるかを省いていることが多い。顧客が尋ねる頃には、担当者はその顧客がたった今読んだのと同じ公開のノートを、何の先行優位もなく読んでいる。&lt;/p&gt;
&lt;h2&gt;社内向けリリースノートは、顧客向けが言わないことの何を言うべきか&lt;/h2&gt;
&lt;p&gt;顧客向けのノートが意図的に省いている運用上の詳細だ。どのプランやアカウントがそれを持っているか。何かがうまくいかないときにどう見えるか、そしてそれに遭遇した顧客に何を言うべきか。未解決のリクエストやチケットを閉じるかどうか、そしてどれを閉じるか、関連するチケットに取り組んでいる担当者が確認すべきだと分かるように。質問がノートの範囲を超えたとき、チームの誰が責任を持つか。これらはどれも、社外の誰かに一度だけ読まれるために書かれた顧客向けバージョンには属さない。これらすべては、同じ質問に週に四十回答える人が本当に必要としているものだ。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;社内メモ：一括CSVエクスポート（2026年9月8日リリース）

- Team および Enterprise プランのみ。Free と Pro に変更なし。
- よくある失敗：5万行を超えるエクスポートはタイムアウトする。
  既知の問題で、修正は別途追跡中。顧客には日付範囲で絞り込む
  よう伝えること。
- `bulk-export` とラベル付けされた14件の未解決リクエストを
  閉じる。返信テンプレートは共有ドキュメントにあり。
- 担当：platformチーム、このメモの範囲を超えるものは
  #platform-eng へ。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;サポート担当者がすぐに使える四行であり、そのどれも同じ機能に関する公開のチェンジログのエントリには属さない。&lt;/p&gt;
&lt;h2&gt;誰がそれを書くべきか、いつ書くべきか&lt;/h2&gt;
&lt;p&gt;顧客向けのノートを書く人が、すでに全体の文脈を持っているという理由で、通常は適任だ。しかし一つの文書に両方の読者を対応させようとするのではなく、別個の短い工程であるべきだ。両者を統合すると、社内の詳細で重くなった顧客向けノートか、本当に役立つには磨き上げすぎた社内向けノートのどちらかが生まれる。実際には二つの短い文書を書くほうが、一つの文書に二つの読者を同時に対応させるよう調整するより速い。タイミングは執筆者が誰かより重要だ。社内向けのノートは、たとえ数時間だけでも、顧客向けより先に出なければならない。サポートが顧客と同じ場所から変更を知ることが決してないようにするためだ。&lt;/p&gt;
&lt;h2&gt;サポートがチケットの瞬間に本当に見つけられるよう、それはどこにあるべきか&lt;/h2&gt;
&lt;p&gt;チケットが来たときにチームがすでに探している場所であり、誰も自発的に開く理由のない別のチェンジログではない。共有のナレッジベースを使うサポートチームは、その部分の製品についてのチケットがすでにラベル付けされている場所からリンクされた形で、そこにメモを必要とする。共有のチャンネルで生活しているチームは、それが関連性を持つ瞬間に検索可能な形でそこに投稿されていることを必要とし、一度だけ目を通す日次のまとめに埋もれさせてはいけない。&lt;a href=&quot;https://changeloop.dev/blog/ja/product-update-email/&quot;&gt;ターゲットを絞った通知とダイジェスト&lt;/a&gt;の顧客向けのパターンはここにも当てはまる。特定の差し迫った変更についての社内向けメモは、最初のチケットがすでに存在した後に届く週次のまとめを待つのではなく、チームに直接届くべきだ。&lt;/p&gt;
&lt;h2&gt;外部のものと同じレビューの厳密さを必要とするのか&lt;/h2&gt;
&lt;p&gt;より少なくてよく、それは意図的なものだ。顧客向けのノートは会社を公に代表するものであり、注意深い編集の工程に値する。社内向けのノートは速く具体的であるために存在し、それを同じ磨き上げの基準に保つことこそ、たいていチームがそれを書くのを完全にやめてしまう原因になる。ローンチの一時間前に出る、速くていくらか粗削りな社内向けメモは、最初のサポートチケットがすでに混乱した状態で来た翌日に届く磨き上げられたものに勝る。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;社内向けリリースノートは、顧客向けと同じ承認プロセスを経るべきか?&lt;/strong&gt;
いいえ。より軽く速い工程こそがまさに目的だ。同じレビューを求めることは、その日のうちに出るはずの社内向けメモを、サポートがすでにそれなしで質問に答えてしまった翌週のメモに変えてしまう。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;専任の社内コミュニケーション担当がいない場合、社内向けリリースノートは誰が責任を持つのか?&lt;/strong&gt;
顧客向けのノートを書く人が、その直後の二番目の短い工程として担当する。別の担当者は必要なく、顧客向けのノートをリリースが生む唯一の成果物として扱わない習慣だけが必要だ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;社内向けリリースノートは独自のチェンジログやアーカイブを必要とするのか?&lt;/strong&gt;
検索可能な場所は、誰もスクロールしない時系列のアーカイブに勝る。サポートがすでにナレッジベースを持っているなら、メモはリリース日をすでに知っている人にしか役立たない別の社内チェンジログではなく、機能にラベル付けされた形でそこに属する。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;小さな変更で社内向けリリースノートを省略するリスクは何か?&lt;/strong&gt;
小さな変更こそ、サポートが前触れなく質問を受けるものだ。小さな変更は会社全体の告知を受けることがめったにないからだ。リリースノートの規模は変更の規模に合わせてスケールすべきであり、変更が小さかったという理由だけでゼロに落ちてはならない。&lt;/p&gt;
</content:encoded></item><item><title>社内向けAPIチェンジログ：他チームにとって何が変わるか</title><link>https://changeloop.dev/blog/ja/internal-api-changelog/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/internal-api-changelog/</guid><description>公開APIと違い、社内向けAPIチェンジログには二フロア先の読者がいる。この違いの由来、呼び出し側の台帳を誰が持つか、実務での対応を説明する。</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;このハブの他の記事はすべて、APIを呼び出す側が社外にいることを前提としている。顧客のエンジニア、パートナー、ドキュメントを自力で見つけた誰かだ。多くのAPIにはまったく異なる種類の呼び出し側がいる。隣の部屋にいる、あるいは二フロア先にいるチームだ。それはチェンジログが彼らに対して負う責任の計算を変える。Slackのメッセージなら彼らに届くし、サポートチケットが起票されることは通常まったくないからだ。多くのチームはここから、社内APIにはチェンジログが不要だという結論を導き出す。実際に必要なのは、異なるチェンジログだ。&lt;/p&gt;
&lt;h2&gt;社内APIのチェンジログが公開のものと何が違うのか&lt;/h2&gt;
&lt;p&gt;公開APIチェンジログには暗黙の読者がいる。そのAPIが構築する唯一のものを使う全員だ。社内APIの読者は直接連絡が取れる相手であり、それは公開APIチェンジログの大半が存在する主な理由、つまり個別に連絡できない呼び出し側への発信という理由を取り除く。社内APIを所有するチームは通常、どの他チームがそれを呼び出しているか、時には特定のサービスまで正確に把握している。それは公開フィードではなく的を絞ったメッセージを自然なデフォルトにし、だからこそ社内APIはチェンジログをまったく持たずに終わることがとても多い。所有チームは覚えている二、三のチームに知らせ、それで全員をカバーしていると思い込むのだ。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;公開APIチェンジログ&lt;/th&gt;
&lt;th&gt;社内APIチェンジログ&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;誰が読むか&lt;/td&gt;
&lt;td&gt;直接連絡できないことが多い、任意の外部呼び出し側&lt;/td&gt;
&lt;td&gt;通常は把握されている、小規模な社内チームの集合&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;デフォルトのチャネル&lt;/td&gt;
&lt;td&gt;ページとフィード&lt;/td&gt;
&lt;td&gt;呼び出し側チームへのメッセージ、理想的にはページも&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;最大のリスク&lt;/td&gt;
&lt;td&gt;呼び出し側が項目を完全に見逃す&lt;/td&gt;
&lt;td&gt;所有チームが存在を覚えていない呼び出し側を忘れる&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;「誰が呼んでいるか分からない」の代わりになるもの&lt;/td&gt;
&lt;td&gt;何もない。広く公開するだけ&lt;/td&gt;
&lt;td&gt;常に最新に保たれた、呼び出し側の本物の台帳&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;なぜ「呼び出しているチームにだけ知らせる」は崩壊するのか&lt;/h2&gt;
&lt;p&gt;呼び出し側の集合は、所有チームが記憶しているほど小さくも静的でもないからだ。一つの利用者のために構築されたサービスは、半年後に誰も発表しなかった統合を通じて二番目の呼び出し側を得て、所有チームの頭の中の「誰が我々を呼んでいるか」というリストは、誰も気づかないまま間違ったものになる。この失敗はありふれたもので珍しくない。記録の代わりに記憶に頼ることの当然の結果であり、誰かが不注意だった証ではない。&lt;a href=&quot;https://changeloop.dev/blog/ja/breaking-changes/&quot;&gt;breaking changeとは何か&lt;/a&gt;は、そもそもAPIの変更が破壊的とみなされるかどうかをどう判断するかを扱っている。社内のケースは、その上に誰に知らせるべきかを知るという、より難しい二つ目の問いを付け加える。&lt;/p&gt;
&lt;h2&gt;社内APIはそもそも公開スタイルのチェンジログページを必要とするのか&lt;/h2&gt;
&lt;p&gt;主要なチャネルが直接的であっても、たいていは必要だ。ページがあれば直接のメッセージにリンク先ができるので、通知は短く済む（「&lt;code&gt;/v2/accounts&lt;/code&gt;にbreaking change、詳細はこちら」）。スクロールで消えていくチャットメッセージに全説明を詰め込もうとする必要はない。それはまた、新しいチームや直接のメッセージを見逃したチームが、自分たちの統合が壊れて理由を突き止めようとするときに確認できるものにもなる。ページは磨き上げられている必要も公開である必要もない。リンク可能であり、それを発表したSlackスレッドより長く生き残る必要があるだけだ。&lt;/p&gt;
&lt;h2&gt;呼び出し側のリストを実際に維持するのは誰か&lt;/h2&gt;
&lt;p&gt;所有チームであり、これは部族知識ではなく本物の成果物として扱われなければならない。最も安価なバージョンは、API自体のリポジトリ内のファイルで、新しい統合が構築されるたびに更新される、エントリごとに担当者が付いた消費側サービスの短いリストだ。あらゆる依存関係宣言と同じ規律である。代替案である、breaking changeのたびに周囲に聞いて回るというやり方は、誰かが適切な人に聞くのを一度忘れるまでは機能する。あるチームのために静かに壊れる社内APIは、公開のものより小さなインシデントだが、それでもインシデントであり、通常はAPIの所有者ではなくそのチーム自身のオンコールによって発見される。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# consumers.yml
- service: billing-service
  owner: &amp;quot;#team-billing&amp;quot;
  since: 2026-03-01
- service: reporting-pipeline
  owner: &amp;quot;#team-analytics&amp;quot;
  since: 2026-06-14
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;このようなファイルは「誰に知らせなければならないか」を問いから検索に変える。まさにこの問題の
ために作られたツール、例えば&lt;a href=&quot;https://backstage.io/docs/features/software-catalog/system-model/&quot;&gt;Backstageのサービスカタログ&lt;/a&gt;
は、同じ理由からAPIを宣言された利用者を持つ第一級のエンティティとしてモデル化する。組織内の
サービスが十分に増えれば、誰が何を呼んでいるかについての記憶はもはや自然には正確であり続けず、
代わりに何かが記録を保持しなければならなくなるからだ。すでに社内で使っているツールの&lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;ドキュメント&lt;/a&gt;
を確認するのが、自前のものを一から作る前にたいてい正しい出発点になる。&lt;/p&gt;
&lt;h2&gt;社内向けチェンジログの項目に含まれ、公開のものには不要なものは何か&lt;/h2&gt;
&lt;p&gt;より多くの運用上の具体性だ。読者は同じインフラストラクチャの中でこれに基づいて行動する別のエンジニアであり、要約として読むわけではないからだ。変更がどの環境でいつライブになるか。社内サービスは公開の呼び出し側が決して目にしない段階を経て昇格することが多いからだ。変更が消費側での設定やクライアントライブラリの更新を必要とするかどうか、あればコマンドとして表現されたもの。そして、社内の呼び出し側はしばしば所有チームと直接修正を調整できるため、サポートチャネルの代わりに名前を挙げた連絡先。「これが何か壊したら@mariaに知らせて」は社内向けの項目では完全に理にかなった一行だが、公開APIチェンジログでは奇妙な一行だ。&lt;/p&gt;
&lt;h2&gt;これはモノレポ内のチェンジログにも同じように当てはまるのか&lt;/h2&gt;
&lt;p&gt;置き換えるのではなく、同じ問題を鋭くする。&lt;a href=&quot;https://changeloop.dev/blog/ja/monorepo-changelogs/&quot;&gt;モノレポのチェンジログ&lt;/a&gt;は、パッケージがいつ独自のチェンジログを必要とするかを扱っている。モノレポ内の複数パッケージの一つである社内APIも、その消費者が明示的に追跡される必要がある。呼び出し側と同じリポジトリを共有していても、何かが見るように指示しない限り、彼らが変更に気づくとは限らないからだ。リポジトリ内の近さは、注意における近さと同じではない。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;呼び出し側が一つしかない場合、純粋に社内向けのAPIにチェンジログは必要か?&lt;/strong&gt;
ほとんど必要ない。その一つのチームへの直接のメッセージで通常は十分だ。呼び出し側が一つより多くなった時点、あるいは呼び出し側のリストが所有チームを一度でも驚かせた時点で、チェンジログは元が取れるようになる。それは記憶だけではもう信頼できないという合図だからだ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;社内APIの変更は公開のものと同じレビューを経るべきか?&lt;/strong&gt;
読者が外部の呼び出し側ではなく同僚であるため、言葉遣いはより軽くてもよいが、変更が破壊的かどうかの判断はどちらの場合も同じ注意を払う価値がある。社内の呼び出し側にも、古い動作に依存する本番コードは存在する。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一度も追跡されていない場合、誰が社内APIを呼び出しているかをどう突き止めるか?&lt;/strong&gt;
消費者の台帳が一度も維持されていなかった場合、サーバーログやサービスメッシュのトラフィックデータが正直な答えだ。その発見を、一回限りの片付けとしてではなく、台帳を始める瞬間として扱おう。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Slackのメッセージで十分か、それとも社内の変更にも正式なチェンジログの項目が必要か?&lt;/strong&gt;
純粋に追加的でないものすべてについては、両方必要だ。メッセージは時間通りに読まれるものであり、項目は何週間も後に問題を調査していてメッセージを一度も見たことのないチームが、それでも見つけられるものだ。&lt;/p&gt;
</content:encoded></item><item><title>モバイルアプリのリリースノート：文字数制限が何を削るのか</title><link>https://changeloop.dev/blog/ja/mobile-app-release-notes/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/mobile-app-release-notes/</guid><description>App StoreとPlay Storeで見えるのは数行だけで、リンクも張れない。その狭い枠でどこを削るべきか、強制アップデートの場合はどうするかを説明する。</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;このハブでリリースノートの書き方について語られてきたことはすべて、完全にコントロールできるページを前提としている。任意の長さ、機能するリンク、レンダリングされる書式だ。モバイルアプリのリリースノートは他人の箱の中で生きている。Appleは約4,000文字を与えるが、「もっと見る」がタップされる前には最初の数行しか表示しない。Googleも同様のプレビュー問題を抱えた似た余白を与え、どちらのプラットフォームもテキスト内にクリック可能なリンクをレンダリングしない。&lt;a href=&quot;https://changeloop.dev/blog/ja/how-to-write-release-notes/&quot;&gt;実際に読まれるリリースノートの書き方&lt;/a&gt;にあるルール、何が変わったか、読者は何をすべきかを伝えるというルールは依然として当てはまるが、それをするための空間はchangelogのページが許すものの一部に過ぎず、削減は偶然ではなく意図的でなければならない。&lt;/p&gt;
&lt;h2&gt;目に見えるプレビューには実際に何が収まるのか&lt;/h2&gt;
&lt;p&gt;デバイスとフォントサイズによって異なるが、およそ80から170文字ほどの最初の1、2行だ。それは読者が展開のためにタップするより前の話だ。それがリリースノートの中で誰かが残りを読むかどうかを決める部分の全予算であり、つまり最も重要な一文が最初に来なければならないということだ。バージョン番号でも、挨拶でも、カテゴリの見出しでもない。「このバージョンの新機能:」で始まるリリースノートは、読者に何も伝えない四つの単語に、目に見える空間の三分の一をすでに使ってしまっている。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;プラットフォーム&lt;/th&gt;
&lt;th&gt;おおよその合計上限&lt;/th&gt;
&lt;th&gt;「もっと見る」前の実効プレビュー&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;App Store (iOS)&lt;/td&gt;
&lt;td&gt;約4,000文字&lt;/td&gt;
&lt;td&gt;2-3行、およそ80-170文字&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Play&lt;/td&gt;
&lt;td&gt;言語あたり約500文字、一部フィールドはさらに短い&lt;/td&gt;
&lt;td&gt;2-3行、iOSと同様&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;両方&lt;/td&gt;
&lt;td&gt;リリースノート欄にクリック可能なリンクはない&lt;/td&gt;
&lt;td&gt;該当なし&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;「今何ができるか、何が約束されているか」というルールはこの長さでもまだ機能するのか&lt;/h2&gt;
&lt;p&gt;機能する。そして異なる形にではなく、より厳格になる。項目ごとに一文、動詞を先に、前置きなしで。「設定からCSVとしてデータをエクスポートできます。」は、「ユーザーが今後CSV形式でデータをエクスポートできる機能を追加しました」に、単語数の三分の一を使って同じことを言うことで勝つ。changelogページの長さでは、少し冗長な一文は読者に半秒のコストを課す。モバイルのリリースノートの長さでは、その同じ冗長さが一文全体を目に見えるプレビューの外に押し出してしまい、読者は何が変わったかを伝える動詞を一度も目にしないことになる。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;悪い例、前置きにプレビューを浪費している:
「改善が詰まった新しいアップデートをお届けできて
嬉しいです！詳細は続きをお読みください。」

良い例、最初の行にすべての価値がある:
「データをCSVとしてエクスポートできます。ダーク
モードは今やシステム設定に従います。共有リンクを
開く際のクラッシュを修正しました。」
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Webのchangelogの項目なら普通は残すものの、何を削らなければならないのか&lt;/h2&gt;
&lt;p&gt;まずリンクだ。どちらのストアもそれをクリック可能にはレンダリングしないので、テキスト内のURLは読者が打ち直さなければならない死重になる。項目に行き先が必要なら、代わりにアプリ内で何をタップすべきかを伝えよう。「設定 &amp;gt; 検索の下にある新しいフィルターを確認」は機能するが、「詳しくはexample.com/blog/filtersをご覧ください」はこの面では機能しない。次に、条件付きや特定の読者にしか関係のないものすべて。Webのchangelogなら「APIを使っているなら、これはあなたに関係します」と言えるが、ストアの掲載情報はインストール済みの全ユーザーに同時に届くので、条件付きの一行はそれが当てはまらない95%にとって雑音として読まれる。条件付きの詳細は代わりにアプリ内メッセージに入れ、実際に関係するアカウントに対してのみトリガーしよう。&lt;/p&gt;
&lt;h2&gt;すべてのリリースが独自のノートを持つべきか、それとも「バグ修正とパフォーマンスの改善」を使い回してよいのか&lt;/h2&gt;
&lt;p&gt;本当にそうであるリリースについては使い回してよいが、それが本当にどれだけ頻繁に真実かを監査しよう。&lt;a href=&quot;https://changeloop.dev/blog/ja/how-to-write-release-notes/&quot;&gt;リリースノートの書き方&lt;/a&gt;は、その言い回しが読者のためではなく内側から書かれたノートを露呈させる理由をすでに扱っている。モバイルでは二重の害を及ぼす。ストアのリリースノートは、一部のユーザーがアップデート間で何かを目にする数少ない場所の一つだからだ。長く続く「バグ修正とパフォーマンスの改善」の連なりは、アプリが変わっていないかのように読め、その期間まったくノートがないことよりも悪い印象を与える。&lt;/p&gt;
&lt;h2&gt;リリースノートは人々がアプリを更新するかどうかに影響するのか&lt;/h2&gt;
&lt;p&gt;説得というより可視性を通じて、間接的に影響する。ほとんどのユーザーは自動的に更新し、更新前にノートを読むことは決してない。ノートが最も重要なのは、手動でアップデートを確認する少数派、そしてストアの掲載履歴を見るレビュアーやプレスにとってだ。その小さな読者層のために書くことはそれでも報われる。具体的で日付の入った項目の本物の履歴を持つ掲載情報は、活発にメンテナンスされているアプリのように読める。一方、「バグ修正とパフォーマンスの改善」が一年続く掲載情報はそうは読めない。その期間に実際にどれだけ多くのものが出荷されたとしてもだ。&lt;/p&gt;
&lt;h2&gt;ユーザーに選択肢がない理由をノートが説明しなければならない強制アップデートはどうなのか&lt;/h2&gt;
&lt;p&gt;理由と期限を、他の何よりも先に最初の行に述べよう。強制アップデートは、読者が読み始める前からすでに苛立っている唯一のケースだからだ。「データの同期を続けるにはこのアップデートが必要です。中断を避けるために[日付]までに更新してください。」は、何をすべきか、なぜなのかを一文で伝える。その理由を関係のない機能ノート三行の下に埋めてしまうと、アプリが不都合な部分を隠しているかのように読める。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;モバイルのリリースノートは同じリリースのWebのchangelogと一致すべきか?&lt;/strong&gt;
同じ根本的な変更をカバーすべきだが、一言一句同じである必要はない。Webのchangelogは完全な説明を許容できるが、モバイルのノートは動詞を先にした一文に圧縮された同じ事実を必要とする。それは通常、コピーではなく書き直しを意味する。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;サポートしている言語ごとにモバイルのリリースノートをローカライズする価値はあるか?&lt;/strong&gt;
ある。Webのchangelogよりもさらにだ。ストアの掲載情報は、一部のユーザーがセッションの間に見る唯一のローカライズされた面であることが多く、両プラットフォームとも翻訳自体を超える追加のエンジニアリング作業なしにロケールごとのリリースノートをサポートしている。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;簡潔さを強制する上限がない場合、モバイルのリリースノートはどれくらいの長さにすべきか?&lt;/strong&gt;
それでも短くすべきだ。iOSの4,000文字の上限が実際の制約になることはめったにない。制約になるのは2-3行のプレビューであり、そのプレビューが示すものを超えて書くことは、単に重要な部分を読む人が減ることを意味するだけだ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;リリースノートは目に見えるテキストにバージョン番号を必要とするか?&lt;/strong&gt;
必要ない。ストアはすでにノートの隣にバージョン番号を表示している。それをテキスト内で繰り返すことは、読者がすでに目の前にしている情報のために目に見える文字を浪費することになる。&lt;/p&gt;
</content:encoded></item><item><title>モノレポのチェンジログ：一つにまとめるか、パッケージごとか</title><link>https://changeloop.dev/blog/ja/monorepo-changelogs/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/monorepo-changelogs/</guid><description>モノレポのチェンジログは、全体で一つでもパッケージごとでもよい。正しい形を決めるのは構造ではなく、誰がログを読み、何を探しているかという点だ。</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;モノレポは一つのリポジトリの中に、別々にデプロイされる複数のものを収容しており、チェンジログはまず一つの問いに答えなければならない。読者が気にするのはリポジトリなのか、それともその中の特定のパッケージなのか。ほとんどのチームはこれを意図的に決めることがない。一つのリポジトリがあるという理由だけで一つのチェンジログから始め、時間とともにパッケージを追加し、最終的にCLIを使う人が自分の修正をリリースしたエントリを見つけるために、無関係なバックエンドのエントリを四十件も通り過ぎなければならないログに行き着く。正しい形を決めるのはリポジトリの構造ではなく、誰がログを読み、何をすでに探しているかだ。&lt;/p&gt;
&lt;h2&gt;モノレポのチェンジログは単一リポジトリのものと何が違うのか&lt;/h2&gt;
&lt;p&gt;単一リポジトリのチェンジログには暗黙の読者がいる。そのリポジトリが構築する唯一のものを使う全員だ。モノレポの読者はパッケージごとに分かれ、同じリポジトリ内のパッケージは、しばしば異なるスケジュールで、異なる利用者に向けて、異なる安定性のレベルで リリースされる。レジストリで公開されるライブラリと内部の管理ツールが同じモノレポに同居し、チェンジログを読む人にとってほとんど共通点がないこともある。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;リポジトリの形&lt;/th&gt;
&lt;th&gt;典型的な読者&lt;/th&gt;
&lt;th&gt;合うチェンジログ&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;デプロイ可能なアプリが一つ&lt;/td&gt;
&lt;td&gt;製品を使う全員&lt;/td&gt;
&lt;td&gt;リポジトリ全体で一つのログ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ライブラリのワークスペース（複数の公開パッケージ）&lt;/td&gt;
&lt;td&gt;特定のパッケージに依存する人&lt;/td&gt;
&lt;td&gt;パッケージごとに一つのログ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;アプリと内部ツール&lt;/td&gt;
&lt;td&gt;重ならない二つの読者層&lt;/td&gt;
&lt;td&gt;フォルダではなく読者層で分割&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;アプリと独自のSDK&lt;/td&gt;
&lt;td&gt;製品の利用者と、SDKの統合者&lt;/td&gt;
&lt;td&gt;二つのログ：製品向けとSDK向け&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;すべてのパッケージが独自のチェンジログを必要とするか&lt;/h2&gt;
&lt;p&gt;独立した読者を持つパッケージだけだ。レジストリで公開されるパッケージは独自のログを必要とする。それをインストールする人にはリポジトリの他の部分を読む理由がなく、&lt;a href=&quot;https://lerna.js.org/&quot;&gt;Lerna&lt;/a&gt;やChangesetsのようなモノレポのリリースツールは、パッケージごとの&lt;code&gt;CHANGELOG.md&lt;/code&gt;をその&lt;code&gt;package.json&lt;/code&gt;のそばに書き出すからだ。同じリポジトリにすでに存在するアプリという単一の利用者を持つ内部ユーティリティは、別のログを必要としない。その変更をそのアプリのエントリに組み込むほうが、チーム外の誰も開かない二つ目のファイルより有用だ。&lt;/p&gt;
&lt;p&gt;そのテストは、あるエントリがそもそもチェンジログに属するかどうかを決めるものと同じだ。読者はそれに気づくか、気にかけるか、そしてそれを知って行動できるか。フォルダごとではなくパッケージごとにこれを適用すれば、十二個のパッケージを持つリポジトリは、二つの本物のチェンジログと、それを全く必要としない十個のパッケージに落ち着くこともある。&lt;/p&gt;
&lt;h2&gt;どのパッケージがどのチェンジログのエントリを引き起こしたかはどうやって分かるのか&lt;/h2&gt;
&lt;p&gt;各エントリを、コミットがどのファイルに触れたかを後から調べるのではなく、エントリが書かれた瞬間にそのパッケージでラベル付けする。共有された内部ライブラリを修正するコミットは、それに依存するすべてのパッケージでチェンジログのエントリを生む可能性があり、ファイルパスだけではそれらの下流のエントリのどれを読者が本当に見る必要があるかを示せない。「これはパッケージAの利用者には見えて、パッケージBの利用者には見えない」と決められるのは人だけだ。&lt;a href=&quot;https://changeloop.dev/blog/ja/conventional-commits-changelog/&quot;&gt;Conventional Commits&lt;/a&gt;は各コミットでパッケージを名指しすることで機械的にここを助けるが、スコープはそれでも下書きしか生まない。あの記事と同じ二層のルールがパッケージごとに当てはまる。正しいスコープを持つ下書きも、そのパッケージの本当の読者に向けて言い換えられる前に、人の手による確認をやはり必要とする。&lt;/p&gt;
&lt;h2&gt;リポジトリ全体で共有するチェンジログが、単一リポジトリのものには必要ないものは何か&lt;/h2&gt;
&lt;p&gt;各エントリの一番先頭、説明の前にあるパッケージのラベルだ。それによってログを流し読みする読者は、一度の通過で自分に関係ないものをすべて飛ばせる。そのラベルがなければ共有ログはランダムなフィードのように読め、一つのパッケージに関心のある読者は、どの行が重要かを記憶する以外にそれを絞り込む方法がなく、それを最初の一週間を過ぎても続ける人はいない。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;## 2026-09-07

### [cli] 追加
- `acme push --dry-run` は実際に送信せずに、何が送信され
  るかを表示する。

### [core] 修正
- 空のボディを返す成功したリクエストで、再試行のバックオフが
  もうリセットされなくなった。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;二つのエントリ、二つの読者層、見分けるのに一目で済む。&lt;a href=&quot;https://github.com/changesets/changesets/blob/main/docs/intro-to-using-changesets.md&quot;&gt;Changesets&lt;/a&gt;
のようなワークフローは、このラベル付けをリリースプロセスに直接組み込む。貢献者は自分の変更のそばに、パッケージのスコープを持つ短いメモを書き、ツールはリリースの瞬間にそれらのメモからパッケージごとのチェンジログとバージョンの跳躍を組み立てる。統合されたコミット履歴から後付けでパッケージの境界を再構築しようとする代わりにだ。&lt;/p&gt;
&lt;h2&gt;バージョニングはモノレポのチェンジログとどう関わるのか&lt;/h2&gt;
&lt;p&gt;独立してバージョン管理されるパッケージは、独自のバージョン番号を持つため独自のチェンジログを必要とし、共有チェンジログは「パッケージAが2.1から2.2に上がった一方でパッケージBは1.4のままだった」を、一つのファイルの中の二つのログにならずに表現することはできない。&lt;a href=&quot;https://changeloop.dev/blog/ja/semantic-versioning-changelog/&quot;&gt;セマンティックバージョニングとあなたのチェンジログ&lt;/a&gt;は、バージョン番号自体がチェンジログのカテゴリにどうマッピングされるべきかを扱っている。モノレポではそのマッピングをパッケージごとに適用する必要がある。あるパッケージの破壊的変更は、それに依存しない姉妹パッケージにとっての破壊的変更ではないからだ。&lt;/p&gt;
&lt;p&gt;多くの内部パッケージから構築されていても、一つの製品を一つのデプロイ可能な単位としてリリースするリポジトリには、この問題はない。パッケージは常に一緒にリリースされるためバージョンを共有し、単一のチェンジログが正しい。&lt;/p&gt;
&lt;h2&gt;gitタグはモノレポにどう当てはまるのか&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://changeloop.dev/blog/ja/git-tags-releases-changelog/&quot;&gt;gitタグ、リリース、あなたのチェンジログ&lt;/a&gt;と同じルールが、パッケージごとに適用されて当てはまる。独自のバージョンを持つパッケージは独自のタグの接頭辞を必要とし、典型的には、どのパッケージに属するか言えない裸の&lt;code&gt;v1.4.0&lt;/code&gt;ではなく&lt;code&gt;パッケージ名@1.4.0&lt;/code&gt;となる。裸のバージョン番号だけでタグ付けされたモノレポは、後になって「&lt;code&gt;cli&lt;/code&gt;が2.2をリリースしたとき&lt;code&gt;core&lt;/code&gt;には何が入っていたか」に答えられない。そのタグが実際にどのパッケージに属していたかをディスク上の何も記録していないからだ。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;モノレポ内のすべてのパッケージに対して別々のチェンジログが必要か?&lt;/strong&gt;
独立した読者を持つパッケージだけだ。通常はレジストリで公開されるものすべてが該当する。同じリポジトリにすでに存在する一つの内部利用者しか持たないパッケージは、独自のログを維持する代わりに、その利用者のログに組み込むことができる。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;チェンジログのエントリを正しいパッケージでラベル付けするのは何か?&lt;/strong&gt;
変更されたファイルパスの自動スキャンではなく、エントリを書く人が、それを書く瞬間に行うことだ。共有ライブラリの変更は、それに依存する各パッケージで異なるエントリを生む可能性があり、それらの下流のエントリそれぞれが実際に何を言うべきかを決められるのは人だけだ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;モノレポはすべてに対して単一のバージョン番号を使うべきか?&lt;/strong&gt;
各パッケージが常に他と一緒にリリースされる場合に限る。パッケージがいつか独立して公開されるなら、独立したバージョンが必要になり、独立したバージョンには意味をなすために独立したチェンジログが必要になる。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;モノレポのチェンジログツールは人間による編集の工程を置き換えるのか?&lt;/strong&gt;
いいえ。Changesetsのようなツールはリリースの瞬間にパッケージごとのメモを集めて組み立てる作業を自動化する。メモそのものは、貢献者ではなく読者の言葉で書かれ、他のどのチェンジログのパイプラインとも同様に、依然として人の仕事だ。&lt;/p&gt;
</content:encoded></item><item><title>新機能をどう発表するか(沈黙にしないために)</title><link>https://changeloop.dev/blog/ja/new-feature-announcement/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/new-feature-announcement/</guid><description>新機能の発表の多くは、誰も読み返さないチャネルで静かに消える。どこで発表し、何を最初に言い、求めていた人へどう直接届けるかを説明する。</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;ほとんどの新機能の発表は、誰も二度と読まないチャネルで死んでいく。流れて消えていくツイート、その週に購読者が受け取った他の十二通の下に埋もれたリリース日のメール、チームの半分が数か月前にミュートしたチャネルのSlackメッセージ。機能はリリースされた。それを使ったであろう人のほとんどはそれを知らなかった。これを直すことは、より良い発表を書くこととはあまり関係がなく、むしろ正しい読者のために正しいチャネルを選ぶこと、そして一般的なメッセージに気づいてくれることに頼るのではなく、明示的に求めていた人々に直接届けることに関係している。&lt;/p&gt;
&lt;h2&gt;新機能は実際どこで発表されるべきか&lt;/h2&gt;
&lt;p&gt;一つ以上の場所でだ。なぜなら「みんな同じチャネルを読んでいる」は決して真実ではないからだ。チェンジログやフィードのエントリは、自分のペースで確認し、永続的で日付付きの記録を求める読者に応える。アプリ内通知は、すでに製品を使っていて、その存在を知れば今日にでもその機能を使うであろう読者に応える。メールは、現在製品にいないが、正しい更新のために戻ってくるであろう読者に応える。SNSは、既存の利用者を超えたリーチに、ほとんどターゲティングなしで応える。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;チャネル&lt;/th&gt;
&lt;th&gt;最も適している対象&lt;/th&gt;
&lt;th&gt;弱点&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;チェンジログ / フィード&lt;/td&gt;
&lt;td&gt;永続的な記録。自分のペースで確認する読者&lt;/td&gt;
&lt;td&gt;受動的で、決して確認しない人には何もしない&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;アプリ内通知&lt;/td&gt;
&lt;td&gt;すでにそこにいて、今日行動するであろう利用者&lt;/td&gt;
&lt;td&gt;現在ログインしていない誰にも届かない&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;メール&lt;/td&gt;
&lt;td&gt;現在非アクティブだが、これのために戻ってくるであろう利用者&lt;/td&gt;
&lt;td&gt;他のメールの下に簡単に埋もれる。本物の件名が必要&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SNS&lt;/td&gt;
&lt;td&gt;既存の利用者を超えたリーチ&lt;/td&gt;
&lt;td&gt;ほとんどターゲティングなし。寿命が短い&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;四つのどれも単独では十分ではない。&lt;a href=&quot;https://changeloop.dev/blog/ja/what-is-a-changelog/&quot;&gt;チェンジログ&lt;/a&gt;は、サイズにかかわらずすべてのリリースを運ぶべき唯一の文書だ。なぜなら、他のすべてがそこに立ち戻る記録だからだ。他の三つは、その機能が実際にどれだけ大きいかによって選ばれる、上に加えられた増幅にすぎない。&lt;/p&gt;
&lt;h2&gt;発表は最初に何を言うべきか&lt;/h2&gt;
&lt;p&gt;メカニズムではなく結果だ。「レポートのエンドポイントにキャッシュ層を追加した」はチームが作ったものを説明している。「レポートは1秒未満で読み込まれるようになった」は読者にとって何が変わったかを説明していて、これがクリックを獲得する文だ。なぜなら、三番目の節ではなく最初の節で「これで自分に何の得があるか」に答えているからだ。メカニズムはチェンジログのエントリか詳細ページに属し、見出しには属さない。&lt;/p&gt;
&lt;p&gt;形容詞より具体性を先に。「より速く、より強力なレポート体験」は読者に行動できる何も伝えない。「レポートは1秒未満で読み込まれ、ステータスでフィルタできるようになった」は何が変わり、何を試すべきかを正確に伝える。二番目のバージョンはより信頼できるようにも見える。なぜなら曖昧な主張は、具体的に言うことが何もないときのマーケティング文とまったく同じように聞こえるからだ。&lt;/p&gt;
&lt;h2&gt;製品アップデートのメールとどう違うのか&lt;/h2&gt;
&lt;p&gt;重なるが、同一ではない。&lt;a href=&quot;https://changeloop.dev/blog/ja/product-update-email/&quot;&gt;製品アップデートのメール&lt;/a&gt;は、頻度、件名、そしてダイジェストが単発の送信に勝るタイミングを含め、メールのチャネルを具体的に扱っている。新機能の発表は根底にある出来事であり、メールはそれを運びうる上記四つのチャネルの一つで、機能が次のダイジェストに乗るのではなく専用の送信を正当化するのに十分大きいときに選ばれる。小さな機能はチェンジログのエントリと、おそらくアプリ内通知に値する。重要な機能は、時間的に調整された四つのチャネルすべてに値する。&lt;/p&gt;
&lt;h2&gt;それを求めた具体的な人々にどう届けるか&lt;/h2&gt;
&lt;p&gt;これは労力対効果が最も良い発表であり、ほとんどすべてのチームがそれを飛ばしてしまう。十人の顧客が名指しで機能を求めたなら、その十人は、外に出るどんな広範な発表とも関係なく、リリースの瞬間に直接的で個人的なメモに値する。&lt;a href=&quot;https://changeloop.dev/blog/ja/customer-feedback-loop/&quot;&gt;顧客とのフィードバックループを閉じる&lt;/a&gt;がその仕組みを完全に扱っている。ここでの要約は、元のリクエストがリクエストした本人と結びついたままである場合にのみこれが機能するということで、それは発表の問題というより&lt;a href=&quot;https://changeloop.dev/blog/ja/feature-request-tracking/&quot;&gt;追跡の問題&lt;/a&gt;だ。changeloopでは、ウィジェットのフィードバックがGitHub issueになり、マージされたpull requestがそれをクローズする（&lt;code&gt;fixes #142&lt;/code&gt;）と、チェンジログのエントリを承認した時点でそのissueに「Shipped — &lt;title&gt;」というコメントが一度だけ投稿され、ライブのエントリに戻ってリンクする。フィードバックを送った本人は、ウィジェットで出荷済みのエントリを目にする。誰かが伝えるのを覚えている必要はない。手でファイルされたissue、そしてGitLabやBitbucketのリポジトリには、このコメントは付かない。&lt;/p&gt;
&lt;h2&gt;エントリ自体はどう書くのか&lt;/h2&gt;
&lt;p&gt;他のどのリリースノートのエントリとも同じ規律だ。読者が今できることから始め、必要な設定を続け、内部的な正当化を飛ばす。&lt;a href=&quot;https://changeloop.dev/blog/ja/how-to-write-release-notes/&quot;&gt;リリースノートの書き方&lt;/a&gt;が完全な方法を扱っている。新機能の発表は最も賭け金の高いケースだ。なぜなら、製品のチェンジログを一度も見たことがない誰かによってスクリーンショットされ、転送され、読まれる可能性が最も高いエントリだからだ。&lt;/p&gt;
&lt;h2&gt;いつ広く発表すべきではないのか&lt;/h2&gt;
&lt;p&gt;機能がまだアカウントの一部にロールアウト中であるとき、本当にベータであるとき、あるいは価格や制限のせいで、広範な発表の読者の十人中九人がまだそれを使えないときだ。十人中九人の読者が使えない機能の広範な発表は、餌のように読め、それが今回作る熱意よりも次回の発表への信頼を燃やしてしまう。解決策は沈黙ではなく、範囲だ。対象となるアカウントに直接知らせ、可用性が発表に追いつくまで広いチャネルを控える。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;すべての新機能は独自の発表に値するか?&lt;/strong&gt;
すべてがチェンジログのエントリに値する。誰かが製品を使う方法を変えるほど重要なもの、あるいは名指しで明示的に求められたものだけが、メールやSNSのようなより広いチャネルに値する。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;小さな機能に最適なチャネルは何か?&lt;/strong&gt;
チェンジログだけ、加えて、その機能が利用者がすでにいるフローの中で発見可能なら、アプリ内通知だ。メールとSNSは、注目を求めるに値する機能に対して価値がある。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;具体的にそれを求めた人々にどう機能を発表するか?&lt;/strong&gt;
登録された瞬間からリクエストをリクエストした本人と結びつけたままにし、リリース時に、より広い発表とは別に個別に通知する。リクエストした本人が自分で確認できる共有のステータスラベルも、そもそも必要な個別メッセージの数を減らす。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;機能の発表にスクリーンショットは必要か?&lt;/strong&gt;
視覚的なものすべてについて、必要だ。説明されたが見られていない機能は、読者がプレビューを見られる機能よりもはるかに頻繁に飛ばされる。APIやバックエンドの能力については、短いコード例がUIの変更に対するスクリーンショットと同じ仕事をする。&lt;/p&gt;
</content:encoded></item><item><title>積み上がる機能リクエストにどう優先順位をつけるか</title><link>https://changeloop.dev/blog/ja/prioritizing-feature-requests/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/prioritizing-feature-requests/</guid><description>追跡とグループ化とラベル付けをしても、どれを先に出すかという難問は残る。実際に機能するフレームワークと、生の投票数が隠してしまうものを説明する。</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;機能リクエストを追跡することは、それらがどこに存在するかを解決する。どれを先に出すかは解決せず、その二番目の問いこそがチームが本当に行き詰まるものだ。グループ化され、ラベル付けされた三百件のリクエストを抱えるバックログでも、決定のルールはやはり必要になる。「最も要望の多いものを作る」は、二つのリクエストが僅差で、三つ目に声の大きな支持者がいるまでしか機能せず、それはたいていの週で起きることだからだ。以下のフレームワークは同じ問いに対する競合する答えではない。それぞれが異なるタイプのリクエストに合っており、すべてに一つだけを使うことこそが実際の間違いであることが多い。&lt;/p&gt;
&lt;h2&gt;機能リクエストの優先順位付けはロードマップの優先順位付けと何が違うのか&lt;/h2&gt;
&lt;p&gt;ロードマップの決定は戦略から始まり、何を作るべきかを問う。機能リクエストの決定はすでに存在する需要から始まり、それに対応すべきかを問い、この二つは十分に頻繁に別方向へ引っ張るため、あるリクエストは高い需要を持ちながら作るべきではないこともあれば、低い需要を持ちながら戦略的なアカウントを開くという理由で価値があることもある。すべてのリクエストをロードマップの投票として扱うことは、この確認を飛ばしてしまう。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;フレームワーク&lt;/th&gt;
&lt;th&gt;何を重視するか&lt;/th&gt;
&lt;th&gt;どこで破綻するか&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;生のリクエスト数&lt;/td&gt;
&lt;td&gt;何人が要望したか&lt;/td&gt;
&lt;td&gt;実際の需要より覚えやすい名前を優遇する&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RICE&lt;/td&gt;
&lt;td&gt;リーチ、インパクト、確信度、労力&lt;/td&gt;
&lt;td&gt;新しいリクエストでは誰も持たない見積もりを必要とする&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;収益による重み付け&lt;/td&gt;
&lt;td&gt;アカウントの価値に応じて誰が要望したか&lt;/td&gt;
&lt;td&gt;まだ大きな価値を持たないアカウントからのリクエストを無視する&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;公開投票&lt;/td&gt;
&lt;td&gt;目に見える、低コストのシグナル&lt;/td&gt;
&lt;td&gt;どこを見ればよいかすでに知っている利用者にしか届かない&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;RICEとは何か、機能リクエストに機能するのか&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.intercom.com/blog/rice-simple-prioritization-for-product-managers/&quot;&gt;RICE&lt;/a&gt;はアイデアをリーチ、インパクト、確信度、労力で採点し、比較可能な数値を得るために最初の三つを四つ目で割る。これはチームがすでに信じているロードマップのアイデア向けに作られたもので、難しい部分は異なる賭けを互いに比較することにある。機能リクエストはすでにリーチの数値を伴っている。要望した人数であり、それは新しいロードマップのアイデアが通常持つリーチより具体的だ。RICEがリクエストに対して緊張するのは確信度とインパクトだ。チームはリクエストが本物であると確信していても、それがどれだけ指標を動かすかの根拠を持たないことがある。すでに名前と実際の利用者の痕跡を持つリクエストの「インパクト」は、部屋の外の誰もまだ見たことのないアイデアのインパクトとは異なる種類の見積もりだからだ。&lt;/p&gt;
&lt;p&gt;RICEは真剣に検討されていてまだ決まっていないリクエストに使う。入ってくるすべてのリクエストに適用してはならない。採点の手間は、決着をつけるものを必要とするほど僅差のものだけで元が取れる。&lt;/p&gt;
&lt;h2&gt;収益で重み付けすべきか、誰が要望したかで重み付けすべきか&lt;/h2&gt;
&lt;p&gt;誰が要望したかによるが、収益だけではない。更新が近いアカウント、すでにエスカレーションしたことのあるアカウント、そしてそのリクエストが進行中の商談を開くアカウントは、平坦な収益の数値だけでは捉えられない緊急性を帯びており、トライアル登録からのリクエストでも、まもなく収益になる決定をブロックしているなら依然として重要になり得る。収益による重み付けはこれらの中で最も計算しやすく、まさにそれゆえに過信しやすい。本当の利害のないアカウントからのノイズを正しく取り除く一方で、まだパイプラインにいるはるかに大きなアカウントをもたらすはずのリクエストを同じくらい簡単に格下げしてしまうこともある。&lt;/p&gt;
&lt;h2&gt;投票は実際どんな役割を果たすのか&lt;/h2&gt;
&lt;p&gt;すでに存在するリクエストにとっては安価で継続的なシグナルだが、そもそもどのリクエストが存在すべきかを発見するには不向きな方法だ。投票数は、すでにそのリクエストを見つけてクリックする価値があると判断した利用者にしか届かない。つまり公開ロードマップの投票合計は、需要と同じくらい可視性も反映しているということだ。リストの上位に近い古いリクエストは、見つけやすいという理由だけで投票を集め続け、同じくらい本物である新しいリクエストはゼロから始まる。&lt;a href=&quot;https://changeloop.dev/blog/ja/public-roadmap/&quot;&gt;公開ロードマップ&lt;/a&gt;の記事は、ロードマップから投票を完全に外すことを主張している。投票は順番通りに積み上げていくランキングとしてではなく、グループ化し新しさで重み付けする必要のあるシグナルとして扱おう。
&lt;a href=&quot;https://changeloop.dev/blog/ja/feedback-signal-quality/&quot;&gt;サポートチケット対機能リクエスト&lt;/a&gt;は、投票数における別の
盲点を扱っている。それに遭遇するユーザーがボードを決して見つけられない場合、本物のギャップが
ほとんど投票を生まないことがある一方で、サポートには騒がしく現れる。&lt;/p&gt;
&lt;h2&gt;最も声の大きな顧客が勝つのはいつであり、それは問題なのか&lt;/h2&gt;
&lt;p&gt;時にはそうであり、それが問題になるのは誰もそれに気づかないときだけだ。頻繁にエスカレーションし、詳細なチケットを書き、あるいはチームの誰かと直接のつながりを持つ顧客は、同じくらい正当なリクエストを持つより静かな顧客よりも早くリクエストを検討してもらえるだろう。それを一度も確認しない優先順位付けのプロセスは、最も主張が強い者を、最も根拠が強い者ではなく、体系的に優遇してしまう。声の大きな顧客は直すべき問題ではない。彼らのリクエストはしばしば本当に重要だ。直すべきは習慣のほうだ。定期的にソース別にバックログを見直し、同じひとつかみのアカウントが最近リリースされたものの大半を説明していないか確認し、それが実際の需要のある場所と一致しているかを自問することだ。&lt;/p&gt;
&lt;h2&gt;優先順位付けの決定はどうやって返答に変わるのか&lt;/h2&gt;
&lt;p&gt;ここでのすべての決定は勝者と敗者の両方を生み、両者とも説明のない状態変更ではなく、実際の理由づけを名指しする返答に値する。&lt;a href=&quot;https://changeloop.dev/blog/ja/declining-feature-requests/&quot;&gt;機能リクエストの断り方&lt;/a&gt;は、通らなかったリクエストに何を伝えるべきかを、通り一遍の拒絶のように聞こえさせずに関係を保つやり方で扱っている。これらすべてをそもそも可能にするグループ化とラベル付けの作業は&lt;a href=&quot;https://changeloop.dev/blog/ja/feature-request-tracking/&quot;&gt;機能リクエストの追跡&lt;/a&gt;で扱われている。優先順位付けは、すでに記録され、比較できるほどうまくグループ化されたリクエストに対してのみ機能する。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;機能リクエストの優先順位付けに最適なフレームワークは何か?&lt;/strong&gt;
単独で完結するものはない。最も声の大きなシグナルを見つけるには生の数値を使い、真剣な候補の短いリストを比較するにはRICEを使い、戦略的なアカウントからの静かな需要が、より声は大きいが重要度の低いグループを上回っている場合を捉えるには収益やアカウントの確認を使う。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;機能リクエストはロードマップのアイデアと同じように優先順位付けすべきか?&lt;/strong&gt;
いいえ。ロードマップのアイデアは戦略から始まり、機能リクエストはすでに存在する需要から始まる。両者を一緒に採点すると、既存の需要は少なくてもよく練られた戦略的な賭けが、単により多くの人が要望しただけのリクエストに一貫して負けてしまう。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;公開ロードマップの投票は需要を正確に反映しているのか?&lt;/strong&gt;
すでにそのリクエストを見つけた人々の間でのみだ。より古く、より目立つリクエストは、新しいリクエストの背後にどれだけ本物の需要があるかにかかわらず、より速く投票を集める。だから投票の合計は、順番通りに積み上げるランキングとしてではなく、グループ化され新しさで重み付けされたシグナルとして扱おう。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;機能リクエストの優先順位はどのくらいの頻度で再評価すべきか?&lt;/strong&gt;
誰かがエスカレーションしたときだけでなく、固定のサイクルでだ。リクエストを再グループ化し重み付けを再確認する月次または四半期ごとの見直しは、何がリリースされるかを支配するひとつかみのアカウントのようなずれを捉える。純粋に受動的なプロセスでは決して自ら明らかにならないものだ。&lt;/p&gt;
</content:encoded></item><item><title>エンタープライズ向けリリースノート：一つのアカウントで何が変わるか</title><link>https://changeloop.dev/blog/ja/private-release-notes-enterprise/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/private-release-notes-enterprise/</guid><description>エンタープライズ向けリリースノートは、プライベートビルド上の顧客に合わせて調整する。公開版をそのまま送ると、未提供の変更で混乱を招くおそれがある。</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;公開SaaS製品は全員に同じリリースノートを送る。全員が同じバージョンにいるからだ。固定された
バージョン、専用インスタンス、または機能フラグ付きの製品のサブセットにいるエンタープライズ
顧客は、その前提を崩す。彼女にとって何が変わったかを説明するリリースノートは、あなたの公開
ブログにあるものと同じではなく、それでも公開のものを送ることは、まだ持っていない変更で顧客を
混乱させるか、もっと悪いことに、別のエンタープライズ顧客のアカウントチームが、自分たちには
あと一か月伏せておいてほしいと明確に求めた機能について彼女に話してしまう。&lt;a href=&quot;https://changeloop.dev/blog/ja/release-notes-best-practices/&quot;&gt;リリースノートの
ベストプラクティス&lt;/a&gt;は一般的な技術を扱っている。これは、
顧客全員が同じビルドにいるわけではなくなった時に現れる調整の問題のために、エンタープライズ
向けリリースノートをどう書くかについてだ。&lt;/p&gt;
&lt;h2&gt;なぜエンタープライズ顧客は単に公開チェンジログを読むことができないのか&lt;/h2&gt;
&lt;p&gt;それは、彼女がまだ実行していないかもしれないバージョン、アクセスできないかもしれない機能、
そして彼女自身のものと一致しないスケジュールを記述しているからだ。四半期ごとのリリースサイクル
に固定され、先週公開層に出た機能について読んでいる顧客には、公開チェンジログだけからは、その
機能が来週彼女に届くのか来四半期に届くのかを知る方法がない。公開チェンジログは「製品で何が
変わったか」に答える。エンタープライズ顧客の実際の質問は「私が実行しているバージョンで何が
変わったのか、そしていつ残りを手に入れるのか」であり、公開チェンジログはそれに答えるために
書かれたことは一度もない。&lt;/p&gt;
&lt;h2&gt;非公開リリースノートは、公開のものが必要としない何を必要とするのか&lt;/h2&gt;
&lt;p&gt;顧客が実際に照合できるバージョンまたは環境の識別子と、まだ彼女に届いていないものの明示的な
記述だ。「このリリースには、私たちの公開4.3リリースからの一括エクスポートの改善が含まれて
いますが、あなたの次の予定されたアップデートで届く新しい権限モデルは含まれていません」は、
エンタープライズ管理者に、彼女のインスタンスが製品全体に対してどこに位置するのかを正確に
伝える。公開リリースノートは、相対的であるべきインスタンスが一つしかないので、この枠組みを
決して必要としない。非公開のものはそれなしでは無意味だ。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;公開リリースノート&lt;/th&gt;
&lt;th&gt;非公開（エンタープライズ）リリースノート&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;一つのバージョン、一つの読者層&lt;/td&gt;
&lt;td&gt;複数のバージョン、セグメント化された読者層&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;読者が記述されたすべての機能を持っていると仮定する&lt;/td&gt;
&lt;td&gt;読者が何を持っていて何を持っていないかを述べなければならない&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;公開リリースに合わせてタイミングを取る&lt;/td&gt;
&lt;td&gt;顧客自身のアップデートウィンドウに合わせてタイミングを取る&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;すぐに完全に公開できる&lt;/td&gt;
&lt;td&gt;他の顧客がまだ持っていない項目を保留する必要があるかもしれない&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;公開リリースノートをエンタープライズ顧客に送るのを別に書く代わりに単に遅らせることが許される場合はあるか&lt;/h2&gt;
&lt;p&gt;彼女のバージョンがその時点で本当に公開のものと一致している場合のみで、それは複数のリズムの
異なるエンタープライズアカウントを持つとすぐに、思うよりも稀なことだ。公開ノートを遅らせる
ことは、一つバージョンが遅れていて追いつこうとしている顧客にとっての一時しのぎとして機能する。
それは、二人のエンタープライズ顧客が互いに異なるバージョンにいる瞬間に崩壊する。なぜなら
その時点で遅らせるべき単一の「ノート」はもはや存在せず、それぞれが持っているものの行列だけが
あるからだ。その時点で、たとえ同じ基礎となる項目のフィルタリングされたビューにすぎなくても、
アカウントごとにノートを調整することは、オプションであることをやめる。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;まだその機能を持っていないエンタープライズアカウント
に送られた公開ノート:
&amp;quot;New: Bulk export now supports custom column ordering.&amp;quot;
(混乱：管理者が試すとそこにない。)

同じアカウント向けに調整されたエンタープライズノート:
&amp;quot;Available in your next update (scheduled for 2026-10-15):
bulk export with custom column ordering. Not yet available
on your current version (3.8).&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;顧客の組織内で実際にこれを読むのは誰であり、それは書き方を変えるか&lt;/h2&gt;
&lt;p&gt;通常はエンドユーザーではなくITアドミンかカスタマーサクセスの担当者であり、それは何が有用と
みなされるかを変える。エンドユーザーは自分の画面で何が違って見えるかを知りたい。エンタープ
ライズ管理者は、権限、データ処理、SSO設定、または自身のユーザーのためにデプロイメントを
どう管理するかに影響する何かで何が変わったかを知りたい。なぜなら内部の質問に答えるのは
彼女になるからだ。すべてが新しくて光る新機能ボタンで運用的な詳細が一切ない、消費者向け
チェンジログのように読める非公開リリースノートは、管理者に本当に必要だった情報を掘り出す
ことを強いる。&lt;/p&gt;
&lt;h2&gt;これは、同じ機能をすでに掲載している公開ロードマップや公開チェンジログとどう相互作用するか&lt;/h2&gt;
&lt;p&gt;慎重に。なぜなら両方を読む顧客はどんな矛盾にも気づくからだ。公開チェンジログがすでに特定の
エンタープライズアカウントがまだ持っていない機能を告知しているなら、その非公開リリースノート
は、公開項目が存在しないふりをするのではなく、そのギャップを認めなければならない。公開の
発表を見て、それを無視する非公開ノートを受け取る管理者は、あなたが彼女を忘れたか、何かが
壊れていると想定するだろう。&lt;a href=&quot;https://changeloop.dev/blog/ja/public-roadmap/&quot;&gt;公開ロードマップ&lt;/a&gt;は、何が出荷された
かと何が計画されているかについてロードマップを正直に保つ方法を扱っている。リリースノートに
おけるその正直さのエンタープライズ版は、公開されているものと彼女のものとの間のギャップを
直接名指しすることだ。&lt;/p&gt;
&lt;h2&gt;エンタープライズ顧客が一人か二人しかいない小さな会社は、これほど多くの構造を必要とするか&lt;/h2&gt;
&lt;p&gt;完全にセグメント化されたシステムではないが、顧客がどのバージョンにいて、何を持っていて何を
持っていないかを明確に述べる中核的な規律は、最新のビルドにいない顧客が一人でもいる瞬間から
どんな規模でも重要になる。これが防ぐ失敗モード、公開の発表が自分に適用されるのか混乱している
管理者は、エンタープライズアカウントが二つであろうと二百であろうと、サポートチケットと信頼へ
の打撃という代償を払う。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;非公開リリースノートは、他の顧客がすでに持っているがこの顧客が持っていない機能に言及すべきか?&lt;/strong&gt;
彼女自身のスケジュールに関連する場合のみで、他の顧客との比較としてではなく「あなたの次の
アップデートで届きます」として表現される。特定の他の顧客が何を持っているかを名指しすることは、
あなたが開示すべきではない領域に踏み込む。この顧客に特に何が届くかを名指しすることは、正確に
彼女が必要とする情報だ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;同じ基礎となるチェンジログの項目が、公開と非公開の両方のリリースノートを支えることができるか?&lt;/strong&gt;
できる、そしてそれは通常より保守しやすいアプローチだ。項目にどのバージョンや層に適用される
かのタグを付け、公開時に読者層でフィルタリングする方が、必然的にずれていく二つの完全に別々の
文書を書くよりも良い。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;エンタープライズ顧客が非公開フィードの代わりに公開リリースノートに載ることを明確に求めた場合はどうするか?&lt;/strong&gt;
それを尊重するが、公開ノートが公開バージョンを前提としていることを彼女が理解しているか確認し、
彼女のバージョンが記述と異なる場合は自分自身でそのギャップを書面で示そう。その書面での確認は、
実際には彼女のビルドに適用されなかった公開ノートに基づいて彼女が行動した場合、後であなたを
守るものだ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;エンタープライズ顧客は、次のリリースでアクセスできるようになる機能について、どれくらい前もって知らされるべきか?&lt;/strong&gt;
リリースの時点だけでなく、日付が確定次第すぐにだ。なぜならエンタープライズ管理者は、近づいて
くる機能をめぐって自分自身の内部コミュニケーションやトレーニングを計画する必要があることが
多く、当日の通知はそのための余地を彼女に残さないからだ。&lt;/p&gt;
</content:encoded></item><item><title>セマンティックバージョニングとあなたのチェンジログ</title><link>https://changeloop.dev/blog/ja/semantic-versioning-changelog/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/semantic-versioning-changelog/</guid><description>セマンティックバージョニングは、エントリを読む前に、リリースが呼び出し側をどれだけ痛めうるかを伝える。各番号の約束と対応するエントリの責任を説明する。</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;セマンティックバージョニングは、呼び出し側が一つのチェンジログのエントリを読む前に、リリースがどれだけ痛みを伴うかを伝える。&lt;code&gt;2.4.1&lt;/code&gt;から&lt;code&gt;2.5.0&lt;/code&gt;への移行はこう言っている。新しい機能、何も壊れない。&lt;code&gt;2.5.0&lt;/code&gt;から&lt;code&gt;3.0.0&lt;/code&gt;への移行はこう言っている。アップデートの前にこのエントリを読め。チェンジログとバージョン番号は二つの形式で同じことを主張するはずであり、両者の間の摩擦のほとんどは、まさに両者が一致しないときに現れる。それは仕様が示唆するよりも頻繁に起こる。&lt;/p&gt;
&lt;h2&gt;バージョンの各番号は実際には何を約束しているのか&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://semver.org/&quot;&gt;セマンティックバージョニング&lt;/a&gt;は三つの番号を定義する。&lt;code&gt;MAJOR.MINOR.PATCH&lt;/code&gt;、それぞれに何がそれを引き起こすかについての厳格な規則がある。MAJORの跳躍は互換性のない変更を意味する。正しい既存の統合が気づく可能性があり、そのために変更しなければならない何かだ。MINORの跳躍は新しい、後方互換性のある機能を意味する。既存のものは何も壊れず、新しい何かが利用可能になる。PATCHの跳躍は後方互換性のある修正を意味する。挙動は文書化されていたものに近づき、意図的に古い挙動に依存していた誰も何も気づくべきではない。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;跳躍&lt;/th&gt;
&lt;th&gt;意味&lt;/th&gt;
&lt;th&gt;エントリはこう読めるべき&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;MAJOR (&lt;code&gt;1.x.x&lt;/code&gt; -&amp;gt; &lt;code&gt;2.0.0&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;互換性のない変更&lt;/td&gt;
&lt;td&gt;「アップデート前に対応が必要」&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MINOR (&lt;code&gt;1.2.x&lt;/code&gt; -&amp;gt; &lt;code&gt;1.3.0&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;新しい互換性のある機能&lt;/td&gt;
&lt;td&gt;「今から利用可能、他は何も変わらない」&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PATCH (&lt;code&gt;1.2.3&lt;/code&gt; -&amp;gt; &lt;code&gt;1.2.4&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;互換性のある修正&lt;/td&gt;
&lt;td&gt;「文書化された通りに振る舞うようになった」&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;この表は逆方向のテストでもある。エントリがその行のように読めないなら、バージョン番号が間違っているか、エントリが実際に起きたことを過小または過大に売り込んでいるかのどちらかだ。&lt;/p&gt;
&lt;h2&gt;バージョニングの目的上、何が互換性のないものとして数えられるのか&lt;/h2&gt;
&lt;p&gt;何かがAPIチェンジログに属するかどうかを決めるのと同じテストだ。古い挙動に対して書かれ、それ以来触れられていない正しい呼び出し側が、この変更のせいで違う振る舞いをする可能性があるかどうか。&lt;a href=&quot;https://changeloop.dev/blog/ja/breaking-changes/&quot;&gt;互換性のない変更とは何か、それをどうリリースするか&lt;/a&gt;がその判断を完全に扱っており、互換性がないように見えてそうでない場合や、小さく見えてそうでない場合も含む。バージョニングの目的上、簡単に言えば、答えがイエスなら、変更が内部で実際にどれだけのコードに触れたかにかかわらず、跳躍はMAJORだ。バージョン番号は、チームの労力ではなく、呼び出し側にとっての結果を追跡する。&lt;/p&gt;
&lt;h2&gt;チェンジログのエントリはバージョンの跳躍にどう対応すべきか&lt;/h2&gt;
&lt;p&gt;一つのエントリ、一つの跳躍カテゴリを、最初にはっきりと述べる。表のパターンはそのまま続く。互換性のないエントリは、それを導入したバージョンの下に置かれ、まず警告として、次に説明として表現される。追加のエントリはそのMINORバージョンの下に置かれ、利用可能性として表現される。修正はそのPATCHバージョンの下に置かれ、訂正として表現される。一つのエントリの中でカテゴリを混ぜること、たとえば互換性のない変更を無関係な修正と同じ段落に折り込むことは、読者が本当に重要だったまさにその一点を見逃してしまう原因になる。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;## 3.0.0 (2026-09-07)

### Changed
- **BREAKING:** `GET /reports`は金額を小数ではなく、最小通貨単位(セン
  ト)の整数として返すようになった。`amount`を直接読むコードを更新する
  こと。

## 2.9.0 (2026-09-01)

### Added
- レポートは`status`でフィルタできるようになった。

## 2.8.4 (2026-08-28)

### Fixed
- `GET /reports?status=`は、未知のステータスに対して400ではなく空のペ
  ージを返していた。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上から下に読むと、バージョン番号とセクションラベルは同じことを二度言っている。まさにそれが目的だ。見出しだけをざっと見る読者でも、一行も開かないうちに正しいリスクの読み取りが得られる。&lt;/p&gt;
&lt;h2&gt;破壊的変更のルールは1.0.0より前でも同じように適用されるか&lt;/h2&gt;
&lt;p&gt;いいえ、そしてここにこそ「それは本当に破壊的変更だったのか」をめぐる混乱の大半の原因がある。SemVerは、メジャーバージョンゼロ、つまり&lt;code&gt;0.y.z&lt;/code&gt;が初期開発のためのものであり、いつでも何でも変わりうるし、公開APIは安定していると見なすべきではないと明言している。&lt;code&gt;0.4.0&lt;/code&gt;から&lt;code&gt;0.5.0&lt;/code&gt;への引き上げは、仕様に違反することなく破壊的変更を運ぶことができる。メジャーバージョンの保証はプロジェクトが&lt;code&gt;1.0.0&lt;/code&gt;を出荷して初めて始まるからだ。それでもチェンジログのエントリは、何が壊れたかについて読者に同じ正直さを負っている。変わるのは、1.0.0に達するまではバージョン番号自体が頼るべき信号ではないという点だけだ。&lt;/p&gt;
&lt;h2&gt;あなたの製品が個別のバージョンをリリースしない場合はどうか&lt;/h2&gt;
&lt;p&gt;ほとんどのSaaS製品は継続的にデプロイされ、呼び出し側にバージョン番号を見せることは決してない。これはこの規律の必要性をなくすわけではなく、通常それを運ぶ番号をなくすだけだ。チェンジログのエントリはすべての仕事を単独で行わなければならない。変更が互換性のないものか、追加的なものか、修正なのかを、セマンティックバージョニングが使うのと同じ三つの単語で、それを付けるバージョンフィールドがなくてもはっきりと述べる。一部のチームは、チェンジログのエントリをリンクできる何かに固定するためだけに、呼び出し側に直接見せることなく、純粋に内部的なバージョンを維持している。&lt;/p&gt;
&lt;h2&gt;これはAPIチェンジログに特にどう当てはまるのか&lt;/h2&gt;
&lt;p&gt;ほとんどどこよりも厳格に、なぜならAPIの呼び出し側はコードであり、予期しない変更に肩をすくめられる人間ではないからだ。&lt;a href=&quot;https://changeloop.dev/blog/ja/api-changelog/&quot;&gt;APIチェンジログ: 何を公開し、誰が読むのか&lt;/a&gt;がその文書の完全な形を扱っている。ここでのバージョニングの規律は、そのbreakingとadditiveのセクションを誠実に保つものだ。移行期間中に&lt;code&gt;v1&lt;/code&gt;と&lt;code&gt;v2&lt;/code&gt;を並行して提供するような、複数のバージョンを同時に提供するAPIは、事実上、一つのパッケージではなくインターフェース全体の規模でセマンティックバージョニングを適用している。そして同じ三語の語彙が依然としてすべてのエントリに当てはまる。&lt;/p&gt;
&lt;h2&gt;Keep a Changelogはバージョニングについて何と言っているか&lt;/h2&gt;
&lt;p&gt;それは名前によって直接セマンティックバージョニングと結びついており、この記事が使っているのと同じカテゴリの語彙を推奨している。Added、Changed、Deprecated、Removed、Fixed、Security。&lt;a href=&quot;https://changeloop.dev/blog/ja/keep-a-changelog-implemented/&quot;&gt;Keep a Changelog、実践編&lt;/a&gt;がその仕様をどう採用するかを、チームがそこからよく外れる箇所も含めて扱っている。この重なりは偶然ではない。両方の仕様は、対極から同じ問題を解決しようとしている。一方はバージョン番号を標準化し、もう一方はそれを説明するエントリを標準化する。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;すべてのチェンジログのエントリにバージョン番号が必要か?&lt;/strong&gt;
製品がバージョンをリリースするなら必要だ。番号によって読者はエントリを先に読まずに「これがどれだけ自分に影響するか」に直接ジャンプできるからだ。製品がバージョンフィールドなしで継続的にデプロイされるなら、エントリの表現がその信号を単独で運ばなければならない。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;MAJORの跳躍と互換性のない変更のエントリの違いは何か?&lt;/strong&gt;
それらは同じ出来事を二つの方法で説明すべきだ。バージョン番号は機械が読める信号であり(呼び出し側のツールがそれに反応できる)、チェンジログのエントリは具体的に何が変わったかについての人間が読める説明だ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PATCHリリースが互換性のないものになりうるか?&lt;/strong&gt;
定義上、なるべきではない。それでも出荷してしまった場合は、公開済みのバージョンを編集したり、タグを付け直したりしてはいけない。&lt;a href=&quot;https://semver.org/#what-do-i-do-if-i-accidentally-release-a-backward-incompatible-change-as-a-minor-version&quot;&gt;SemVerのFAQ&lt;/a&gt;は、互換性を回復する新しいバージョンをリリースするか、互換性のない変更を残すなら新しいMAJORをリリースし、問題のバージョンを文書化して利用者がそれを飛ばせるようにすることを求めている。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;純粋に内部的な変更にバージョンの跳躍が必要か?&lt;/strong&gt;
不要だ。セマンティックバージョニングは公開インターフェースを追跡する。呼び出し側にとって観測可能な効果のないリファクタリングは、たとえ内部的に重要なエンジニアリング作業であっても、跳躍もチェンジログのエントリも必要としない。&lt;/p&gt;
</content:encoded></item><item><title>APIのSunsetヘッダー、それを送るべきタイミング</title><link>https://changeloop.dev/blog/ja/sunsetting-api-version/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/sunsetting-api-version/</guid><description>APIのSunsetヘッダーは、バージョンがいつ応答を止めるかを機械可読な形でクライアントに伝える。RFC 8594の定めと、ブラウンアウトの利点を解説する。</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code&gt;Sunset&lt;/code&gt;は、&lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc8594&quot;&gt;RFC 8594&lt;/a&gt;で定義された単一のレスポンスヘッダーであり、
あるリソースがいつ応答を停止するかを呼び出し元に伝える。&lt;a href=&quot;https://changeloop.dev/blog/ja/api-deprecation/&quot;&gt;APIの非推奨化&lt;/a&gt;は
告知・再通知・ブラウンアウト・廃止という一連のタイムラインと、それに伴う通知全体を扱っている。この
記事は、そのタイムラインの中でも唯一の機械可読な信号であるこのヘッダーについて、それが実際に何を
意味するのか、そしてRFC自身が送るべきではないと述べている唯一のケースについて扱う。&lt;/p&gt;
&lt;h2&gt;&lt;code&gt;Sunset&lt;/code&gt;ヘッダーは何を伝え、何を伝えないのか&lt;/h2&gt;
&lt;p&gt;それは単一のHTTP日付、つまりそのリソースが応答しなくなると見込まれる時点を運ぶ:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Sunset: Sat, 31 Dec 2028 23:59:59 GMT
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;RFCはこれを保証ではなくヒントと呼んでいる。そのタイムスタンプまでリソースが動作し続けることを
約束するものではなく、その後どのような失敗になるかについても何も述べていない。呼び出し元は4xxを
受け取るかもしれないし、リダイレクトされるかもしれないし、あるいはまったく応答が返らないかも
しれない。ヘッダーはそれらを区別しない。すでに過去になっているタイムスタンプは、値の誤りではなく
「今、あるいはいつでも」を意味する。これらはいずれもプロトコルによって強制されるものではない。
ヘッダーを一度も読まないクライアントは、常にそうしてきたのと全く同じように振る舞い、リソースが
消えたことを、結局はどのみち気づいていたのと同じ方法で知ることになる。&lt;/p&gt;
&lt;h2&gt;実際にいつ送るべきか&lt;/h2&gt;
&lt;p&gt;そのリソースが本当に応答を停止することになった時点でのみで、単に推奨されなくなっただけの段階
では送らない。RFCは非推奨化が二段階で起きることを明示しており、&lt;code&gt;Sunset&lt;/code&gt;ヘッダーフィールドは
二段階目にのみ属する。最初の段階、つまりあるバージョンがもはや推奨されないという告知の段階
では、APIは完全に稼働し続けており、このヘッダーフィールドはそこには適用されない。バージョンが
実際に応答を停止する予定になった時点で初めて適用される。&lt;/p&gt;
&lt;p&gt;これは非推奨化のタイムラインに直接対応している。&lt;code&gt;Deprecation&lt;/code&gt;ヘッダーは告知の段階、つまり
初日から送出される。&lt;code&gt;Sunset&lt;/code&gt;は古い挙動が実際に停止する日付を示し、それは&lt;a href=&quot;https://changeloop.dev/blog/ja/api-deprecation/&quot;&gt;四段階のタイムライン&lt;/a&gt;
が廃止と呼んでいるのと同じ日付だ。初日に&lt;code&gt;Sunset&lt;/code&gt;を送ること自体は間違いではない。その時点で
すでに日付が確定しているならだが、非推奨化を告知してもいないのに送ったり、実際にはまだ廃止を
確約していないバージョンに設定したりすると、まだ決めてもいないことを呼び出し元に伝えてしまう
ことになる。&lt;/p&gt;
&lt;h2&gt;これはキャッシュと相互作用するか&lt;/h2&gt;
&lt;p&gt;しない。RFCはそれを直接述べている。&lt;code&gt;Sunset&lt;/code&gt;とHTTPキャッシュは無関係な問題を解決するもので
あり、重なり合うのではなく補完し合うものとして読むべきだとされている。キャッシュ用のヘッダー
は、キャッシュされたコピーをいつ再利用して安全かを伝える。&lt;code&gt;Sunset&lt;/code&gt;はリソースの現在の状態に
ついては何も述べておらず、リソースそのものがいずれ存在しなくなるということだけを述べている。
レスポンスは、実際に終了を迎える瞬間の直前まで完全にキャッシュ可能でありうる。片方でもう片方
を近似しようとしてはならず、長い&lt;code&gt;max-age&lt;/code&gt;が近づいてくる終了日を打ち消すとか、あるいはその逆
だとか考えてはならない。&lt;/p&gt;
&lt;h2&gt;一つのヘッダーで複数のエンドポイントを終了させることはできるか&lt;/h2&gt;
&lt;p&gt;ヘッダーはそれを返したリソースに適用されるが、RFCはサービスがより広い範囲を文書化することを
認めている。APIのホームリソースに設定された終了日を、そのURL一つだけでなくAPI全体が消える
ことを意味すると定義することができる。ただし、これはあなたのスコープ規則をすでに知っている
呼び出し元に対してしか機能しないという落とし穴がある。ヘッダーを額面通りに読む呼び出し元には、
要求した一つのリソースについての終了だけが見え、それ以外は何も見えない。したがって、より広い
範囲は暗黙のうちにではなく、呼び出し元が見つけられるどこかに明記しておく必要がある。&lt;/p&gt;
&lt;h2&gt;このヘッダーと一緒に何を用意すべきか&lt;/h2&gt;
&lt;p&gt;廃止について説明されている場所へのリンクだ。RFC 8594はまさにこのために独自の&lt;code&gt;sunset&lt;/code&gt;リンク
リレーションを登録している。廃止方針や今後の日付、あるいは移行方法を説明するリソースを指し
示すためのもので、ヘッダーの単なるタイムスタンプとは別物だ。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;HTTP/1.1 200 OK
Sunset: Sat, 31 Dec 2028 23:59:59 GMT
Link: &amp;lt;https://example.com/docs/sunset-policy&amp;gt;; rel=&amp;quot;sunset&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;そのリンクを自社の&lt;a href=&quot;https://changeloop.dev/changelog-examples&quot;&gt;チェンジログの例&lt;/a&gt;や専用の移行ページに向ければ、
ほとんど誰のクライアントコードも検査しないヘッダーが、実際に探しに来た人間がすぐに見つけら
れるものに変わる。&lt;a href=&quot;https://changeloop.dev/blog/ja/api-deprecation/#which-headers-should-a-deprecated-endpoint-send&quot;&gt;非推奨化のヘッダー&lt;/a&gt;
にある&lt;code&gt;successor-version&lt;/code&gt;リレーションと組み合わせれば、呼び出し元はレスポンスだけから、どこ
に行けばよいかと、これが何に置き換わるのかの両方を得られる。&lt;/p&gt;
&lt;h2&gt;これは最初から最後までどのように見えるか&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;v1&lt;/code&gt;が2027年3月1日に消えるとしよう。初日の非推奨化告知では、&lt;a href=&quot;https://changeloop.dev/blog/ja/api-deprecation/&quot;&gt;非推奨化のヘッダー&lt;/a&gt;
にしたがって、すべての&lt;code&gt;v1&lt;/code&gt;レスポンスに&lt;code&gt;Deprecation&lt;/code&gt;と&lt;code&gt;Link: rel=&amp;quot;successor-version&amp;quot;&lt;/code&gt;を追加
するが、廃止日が仮の値ではなく本当に確定するまでは&lt;code&gt;Sunset&lt;/code&gt;を保留する。確定した後は、すべての
&lt;code&gt;v1&lt;/code&gt;レスポンスが次を運ぶ:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;HTTP/1.1 200 OK
Deprecation: @1756425600
Sunset: Mon, 01 Mar 2027 00:00:00 GMT
Link: &amp;lt;https://api.example.com/v2/reports&amp;gt;; rel=&amp;quot;successor-version&amp;quot;
Link: &amp;lt;https://example.com/docs/sunset-policy&amp;gt;; rel=&amp;quot;sunset&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;呼び出し元のゲートウェイや監視は、どちらのヘッダーにも独立してアラートを設定できる。
&lt;code&gt;Deprecation&lt;/code&gt;は新しいバージョンが存在することを、&lt;code&gt;Sunset&lt;/code&gt;はこのバージョンに時計が付いている
ことを示す。どちらのヘッダーも3月1日より前に変わる必要はない。変わるのはレスポンス自体で
あり、それはその日、そしてその前に予定されたブラウンアウトの期間中に起きる。&lt;/p&gt;
&lt;h2&gt;ブラウンアウトはヘッダーの内容を変えるか&lt;/h2&gt;
&lt;p&gt;予定されたブラウンアウトのためにヘッダーの値そのものを動かす必要はない。終了日はその前に
リソースが断続的に失敗していようがいまいが、変わらず終了日のままだ。変わるのはヘッダーでは
なくレスポンスだ。&lt;a href=&quot;https://changeloop.dev/blog/ja/api-deprecation/&quot;&gt;APIの非推奨化&lt;/a&gt;が説明しているように、告知された
日付の前の数週間に短い&lt;code&gt;410 Gone&lt;/code&gt;の期間を設けておくことで、呼び出し元が失敗に初めて触れるの
が、ヘッダーの日付が到来する当日の本番ではなく、リハーサルになる。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;実際のHTTPクライアントやツールは&lt;code&gt;Sunset&lt;/code&gt;ヘッダーを本当に読んでいるのか?&lt;/strong&gt;
クライアント側ではめったにない。その価値は主に、あなたと呼び出し元の間のインフラを運用して
いる人にとってのものだ。ヘッダーを監視するよう設定したAPIゲートウェイや監視ツールは、呼び
出し元のコードが気づくよりもずっと前に、自社やパートナーのチームにアラートを出せる。相手側
がすでに対応していると想定できる信号ではなく、自分でツールを組み立てる対象の信号として扱おう。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;Sunset&lt;/code&gt;は&lt;code&gt;Cache-Control: max-age&lt;/code&gt;と同じものか?&lt;/strong&gt;
いいえ。&lt;code&gt;max-age&lt;/code&gt;はキャッシュされたコピーがどれだけ有効かについてのものであり、&lt;code&gt;Sunset&lt;/code&gt;は
リソースそのものがいつ存在しなくなるかについてのものだ。レスポンスは短い&lt;code&gt;max-age&lt;/code&gt;と何年も
先の&lt;code&gt;Sunset&lt;/code&gt;日付を同時に持つこともできるし、その逆もありうる。どちらのヘッダーも互いを制約
しない。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;エンドポイント全体ではなく、単一のフィールドが消える場合に&lt;code&gt;Sunset&lt;/code&gt;を送ってよいか?&lt;/strong&gt;
いいえ、このヘッダーはリソース、つまりURLに対してスコープされており、レスポンス本文の中の
フィールドに対してではない。エンドポイント自体は維持されたまま消えていくフィールドやパラ
メータ、あるいは列挙値については、代わりに&lt;code&gt;Deprecation&lt;/code&gt;ヘッダーとチェンジログの項目を使お
う。&lt;a href=&quot;https://changeloop.dev/blog/ja/api-deprecation/&quot;&gt;APIの非推奨化&lt;/a&gt;がまさにそのような変更の告知を扱っている。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;終了日を動かす必要が生じたらどうするか?&lt;/strong&gt;
ヘッダーの値を更新し、最初にそれを告知したチェンジログの項目にもその旨を記そう。公開済みの
日付を黙って変更することは、呼び出し元に「あなたの日付は一つも本物ではない」と判断させる
原因になる。RFCがこの値をあえて保証ではなくヒントとして位置づけているのは、日付が時に動く
ことがあるからだが、説明のない変更は次の日付への信頼も失わせる。&lt;/p&gt;
</content:encoded></item><item><title>Webhookチェンジログ、誰も求めなかった破壊的変更</title><link>https://changeloop.dev/blog/ja/webhook-changelog/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/webhook-changelog/</guid><description>Webhookのペイロード変更は、受信側が拒否できないため静かに壊れる。破壊的変更の定義、ペイロードのバージョニング、受信者の把握と安全な移行を扱う。</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;REST APIのチェンジログが存在するのは、呼び出し側が理解できないレスポンスを拒否できる、あるいは少なくとも誰かが気づく程度に大きな声でエラーをログに残せるからだ。Webhookの受信側はそのどちらもめったにしない。POSTを受け取り、期待するフィールドを読み、あるフィールドが移動したり型が変わったり消えたりすると、エンドポイントは誰も監視していないバックグラウンドジョブの中で静かにクラッシュするか、もっと悪いことに、一度も検証しなかった誤った値のまま動き続ける。&lt;a href=&quot;https://changeloop.dev/blog/ja/breaking-changes/&quot;&gt;破壊的変更とは何か&lt;/a&gt;は一般的な定義を扱っている。Webhookのペイロードには独自の答えが必要だ。誰かが意図的に呼び出すエンドポイントとは失敗の仕方が違うからだ。&lt;/p&gt;
&lt;h2&gt;なぜWebhookのペイロード変更はAPIレスポンスの変更と違う壊れ方をするのか&lt;/h2&gt;
&lt;p&gt;リクエストの向きが逆だからだ。RESTの呼び出し側は呼び出しを開始し、バージョンヘッダーを追加したり、4xxで再試行したり、レスポンス内の非推奨通知を読んだりできる。Webhookの受信側はそのどれも開始していない。あなたのサーバーが送ることを決め、いつ送るかを決め、本文がどんな形になるかを決めた。受信側の唯一の手段は、統合を構築したときに書いた検証だ。そしてほとんどの統合は一度構築されて動作し、壊れるまで誰も見直さない。この非対称性こそが、Webhookのペイロード変更が、呼び出し側が能動的に要求したレスポンス本文の同じ変更よりも慎重さに値する理由のすべてだ。&lt;/p&gt;
&lt;h2&gt;Webhookのペイロードで実際に破壊的変更とみなされるものは何か&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;変更&lt;/th&gt;
&lt;th&gt;ほとんどの受信側にとって破壊的か&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;新しいフィールドの追加&lt;/td&gt;
&lt;td&gt;受信側が未知のフィールドを無視するなら、いいえ（この前提を検証せよ、思い込むな）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;フィールドの削除&lt;/td&gt;
&lt;td&gt;何かがそれを読んでいるなら、はい&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;フィールドの名前変更&lt;/td&gt;
&lt;td&gt;古いものを削除するのと機能的に同一なので、はい&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;フィールドの型変更（文字列からオブジェクトへ）&lt;/td&gt;
&lt;td&gt;ほぼ常に、はい&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JSON本文のフィールドの並び替え&lt;/td&gt;
&lt;td&gt;キーでパースするすべての受信側にとって、いいえ（全員がそうであるべきだ）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;イベント名や種類の変更&lt;/td&gt;
&lt;td&gt;受信側がそれでフィルタやルーティングをしているなら、はい&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;「フィールドを追加するのは安全だ」という行は、チームが最も頼りにしていて、思い込むのではなく検証する価値が最もある行だ。寛容なJSONパーサーはデフォルトで未知のフィールドを無視するが、厳密なスキーマにデシリアライズする受信側、いくつかの型付き言語は追加設定なしにこれを行う、は予期しないフィールドが現れた瞬間にペイロード全体を拒否しうる。フィールドを追加するのがあなたのWebhookにとって安全なのは、受信側がどうパースするかを知っている場合だけであり、JSON自体が寛容だからではない。&lt;/p&gt;
&lt;h2&gt;Webhookのペイロードはどうバージョニングすべきか&lt;/h2&gt;
&lt;p&gt;APIレスポンスの場合とほぼ同じだが、一つ違いがある。受信側はリクエストを送らないので、バージョンを要求できず、送信側がそれを明示しなければならない。それは本文に入れることも、配信そのもののリクエストヘッダーに入れることもできる。&lt;a href=&quot;https://docs.github.com/en/webhooks/webhook-events-and-payloads&quot;&gt;GitHubの配信&lt;/a&gt;は&lt;code&gt;X-GitHub-Event&lt;/code&gt;と&lt;code&gt;X-GitHub-Hook-ID&lt;/code&gt;を持ち、&lt;a href=&quot;https://github.com/standard-webhooks/standard-webhooks/blob/main/spec/standard-webhooks.md&quot;&gt;Standard Webhooksの仕様&lt;/a&gt;はメタデータを&lt;code&gt;webhook-*&lt;/code&gt;ヘッダーに入れる。ペイロード内のバージョンフィールド（&lt;code&gt;&amp;quot;payload_version&amp;quot;: 2&lt;/code&gt;）は最も安価な選択肢で、受信側がそれで分岐する意思があれば機能する。バージョン付きイベントタイプ（&lt;code&gt;invoice.updated&lt;/code&gt;が、受信側が任意で購読する別のイベントとして&lt;code&gt;invoice.updated.v2&lt;/code&gt;になる）は構築により多くの手間がかかるが、古い形式が一度も移行していない相手に流れ続けることを意味し、これはRESTエンドポイントよりもここでは重要だ。すべての受信側に電話して更新を頼むことはできないからだ。Webhookエンドポイントの登録時に選択される購読ごとの設定は、決定を毎回の配信で分岐させる代わりに前倒しにする。すでに購読レコードがあってそこに付けられる場合は正しい選択だ。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;POST /receiver-endpoint
{
  &amp;quot;event&amp;quot;: &amp;quot;invoice.updated&amp;quot;,
  &amp;quot;payload_version&amp;quot;: 2,
  &amp;quot;data&amp;quot;: { &amp;quot;invoice_id&amp;quot;: &amp;quot;inv_123&amp;quot;, &amp;quot;status&amp;quot;: &amp;quot;paid&amp;quot; }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;そもそも誰が聞いているかをどう知るのか&lt;/h2&gt;
&lt;p&gt;APIチェンジログにおけるこの問題の同等版よりも悪い。Webhookには呼び出し側を特定するあなた側の受信リクエストログが存在しないからだ。あるのはエンドポイントが200を受け取ったことを示す、自分自身の送信配信ログだけであり、本文で何をしたかはわからない。少なくとも二つのことを追跡せよ。&lt;a href=&quot;https://changeloop.dev/blog/ja/internal-api-changelog/&quot;&gt;内部APIチェンジログ&lt;/a&gt;が内部の消費者に推奨するのと同じ規律で、所有者付きの登録済みエンドポイントすべてと、ペイロード変更後のエンドポイントごとの配信失敗率だ。変更直後のエンドポイントからの4xxや5xxレスポンスの急増は、手に入るスタックトレースに最も近いものであり、多くの場合、受信側が壊れたことを示す唯一のシグナルだ。運用しているチームがそれに何日も気づかないことがあるからだ。&lt;/p&gt;
&lt;h2&gt;Webhookチェンジログは APIチェンジログと分けるべきか&lt;/h2&gt;
&lt;p&gt;同じページの別セクションであり、別の公開物ではない。&lt;a href=&quot;https://changeloop.dev/blog/ja/api-changelog/&quot;&gt;APIチェンジログ&lt;/a&gt;はすでに誰が読み、どう購読するかを確立している。Webhookのペイロード変更は同じフィードに属し、「これは自分の統合に影響するか」を探す受信側の開発者がフィルタできるほど明確にラベル付けされるべきだ。Webhookの消費者は一般的なAPIチェンジログを確認する他の理由をほとんど持たず、誰かが直接そこへ導かない限り見つけられないからだ。&lt;/p&gt;
&lt;h2&gt;Webhookのペイロードに対する妥当な非推奨期間はどう見えるべきか&lt;/h2&gt;
&lt;p&gt;同等のREST非推奨よりも長くあるべきだ。受信側での移行は通常、直接のつながりがないかもしれない第二のチームが、独自の緊急性なしにそれに気づき、計画し、リリースする必要があることを意味するからだ。受信側がまだ寛容なライブラリでパースしている可能性が高いフィールドには、一か月が妥当な下限だ。厳密なスキーマなら完全に拒否するフィールド削除には、三か月以上が安全だ。可能な場合は期間中、古い形式と新しい形式を一緒に送れ（古い&lt;code&gt;status&lt;/code&gt;フィールドとそのバージョン2の置き換えが同じペイロードに入る）。古いフィールドを読む受信側はコードに触れずに動作し続け、すでに移行済みの受信側はもう必要のないフィールドを単に無視するからだ。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Webhookの消費者は公開前にペイロード変更を確認する必要があるか?&lt;/strong&gt;
デフォルトでは確認の仕組みは存在しない。まさにそれゆえに非推奨期間はRESTのAPIよりもここで重要になる。誰も準備完了を確認しないため、古い形式が消える前にほとんどの受信側が自分のペースで移行できるだけの長さが期間に必要だ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;未知のフィールドを通知なしに追加しても安全な場合はあるか?&lt;/strong&gt;
受信側が寛容にパースすることを、思い込むのではなく検証した後だけだ。チェンジログの一項目はほとんどコストがかからず推測を排除する。「JSONパーサーは余分なものを無視する」という思い込みで静かにフィールドを追加すると、厳密なデシリアライズを行うすべての受信側が壊れる。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ペイロード変更後に壊れたWebhookの受信側を検出する最速の方法は何か?&lt;/strong&gt;
変更直後の数時間で観察される、エンドポイントごとの配信失敗率だ。何が壊れたかは教えてくれず、何かが壊れたことしか教えないが、それが手に入る最も早く、多くの場合唯一のシグナルだ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;再試行ロジックは受信側がペイロード変更を生き延びる助けになるか?&lt;/strong&gt;
ならない。再試行は同じ新しいペイロードを再送するだけで、受信側がパースできる形式には戻らない。ペイロード変更は最初の配信でも、その後のすべての再試行でも同じように受信側を壊す。&lt;/p&gt;
</content:encoded></item><item><title>チェンジログとは何か、そして何が含まれるべきか</title><link>https://changeloop.dev/blog/ja/what-is-a-changelog/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/what-is-a-changelog/</guid><description>チェンジログとは、製品で何が変わったかを日付付きで記録したものだ。影響を受ける人々のために書く。含める内容、置き場所、配信方法を説明する。</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;チェンジログとは、製品で何が変わったかを日付付きで記録したもので、それをリリースしたチームのためではなく、変更によって影響を受ける人々のために書かれる。各エントリは一つの変更を名指しし、それがいつ有効になったかを述べ、読者がそれについて何をすべきかを述べる。ほとんどのエントリでは、それは何もしなくてよいということだ。この最後の部分こそが、チェンジログをコミットログから分けている。コミットログはコードを書いた人々のための記録であり、チェンジログはそれを使う人々のための記録だ。&lt;/p&gt;
&lt;h2&gt;チェンジログとは正確には何か&lt;/h2&gt;
&lt;p&gt;日付付きのエントリのリストで、最新のものが先頭にあり、それぞれが一つの変更を読者が確認できる言葉で説明する。チームが何を作ったかではなく、今何が違うかだ。「請求サービスをリファクタリングした」はコミットメッセージである。「請求書は税金を別の行として表示するようになった」はチェンジログのエントリだ。なぜなら、読者が自分のアカウントで確認できることを伝えているからだ。&lt;/p&gt;
&lt;p&gt;このフォーマットは古く、意図的にシンプルだ。リリースごとまたは日ごとの見出し、その下に短いリスト、時にはカテゴリのラベルが付く。&lt;a href=&quot;https://keepachangelog.com/en/1.1.0/&quot;&gt;Keep a Changelog&lt;/a&gt;はこの形式で最も引用される仕様であり、それが存在するのは、仕様を飛ばすほとんどのプロジェクトが代わりにコミット履歴をそのまま吐き出すことになり、それが読者の持ってきた質問とは違う質問に答えてしまうからだ。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;文書&lt;/th&gt;
&lt;th&gt;対象読者&lt;/th&gt;
&lt;th&gt;答える質問&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;チェンジログ&lt;/td&gt;
&lt;td&gt;製品を使う誰でも&lt;/td&gt;
&lt;td&gt;何が変わったか、いつか?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;コミットログ&lt;/td&gt;
&lt;td&gt;コードを書いたチーム&lt;/td&gt;
&lt;td&gt;何がどの順序で行われたか?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;リリースノート&lt;/td&gt;
&lt;td&gt;アップデートするか決める利用者&lt;/td&gt;
&lt;td&gt;以前できなかった何ができるようになったか?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;パッチノート&lt;/td&gt;
&lt;td&gt;特定の修正の利用者&lt;/td&gt;
&lt;td&gt;このリリースは具体的に何を修正したか?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ロードマップ&lt;/td&gt;
&lt;td&gt;次に何が来るか気になる誰でも&lt;/td&gt;
&lt;td&gt;何が計画されていて、どこまで進んでいるか?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;この五つは実際には重なり合うが、同じ文書ではなく、その違いは読むときに誰がそれを手にしているかにある。チェンジログは後で検索され、再びリンクされるために作られたものであり、そのためエントリは他のどれよりも日付と安定したURLを必要とする。&lt;/p&gt;
&lt;h2&gt;チェンジログのエントリには実際に何が含まれるのか&lt;/h2&gt;
&lt;p&gt;四つのこと、この順序で。何が変わったか、利用者や呼び出し側が気づくであろう言葉で表現されたもの。いつ有効になったか。どのカテゴリに属するか(added、fixed、changed、removedが一般的な四つ)。そして重要な場合、読者がそれについて何をすべきか。詳細へのリンクは歓迎される。内部的な正当化の段落はそうではない。読者はなぜかを聞いていない、何かを聞いているのだ。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;## 2026-09-07

### Added
- 請求書は顧客のアカウント通貨で、税金を別の行として表示するように
  なった。

### Fixed
- レポートをCSVとしてエクスポートする際、レポートが10,000行を超えても
  最後の行が失われなくなった。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;このフォーマットは二行の更新から一つのリリースにおける百のエントリまで、構造を変えずに拡張できる。そしてこれこそがフォーマットが機能しているかどうかの本当のテストだ。忙しい週も静かな週も同じように読めるかどうか。&lt;/p&gt;
&lt;h2&gt;誰がチェンジログを書くのか、そしていつか&lt;/h2&gt;
&lt;p&gt;変更を行った本人が、それがリリースされる瞬間に書く。一週間後にチケットから再構成する技術ライターではない。コードに触れた人は利用者にとって実際に何が変わったかを知っている。後から書かれた要約は、実際にリリースされたものではなくチケットを説明する傾向があり、それは通常、実際の範囲より広いか狭い。一部のチームは、エントリが公開される前にレビューのステップを追加する。主に紛れ込んだ内部の言葉遣いを捕まえるためだ。そのレビューは、エントリが同じ日に出るくらい十分速くなければならない。&lt;/p&gt;
&lt;h2&gt;チェンジログはどこに置かれるべきか&lt;/h2&gt;
&lt;p&gt;安定したURLの独自のページに、フィードとして配信される。設定メニューやコードホストのリリースタグに埋もれていると、どこを見ればいいかすでに知っている人にしか届かない。公開ページはサポートチケットからリンクされ、レビューで引用され、購読されることができる。フィードはページと同じくらい重要だ。ある製品のチェンジログを月に一度確認する読者は稀であり、それを購読する読者はそうではなく、フィードだけが後者に応えている。&lt;/p&gt;
&lt;h2&gt;リリースノートとどう違うのか&lt;/h2&gt;
&lt;p&gt;この二つは常に混同され、混ぜ合わせるとどちらの読者にもうまく機能しない文書になるほど異なっている。&lt;a href=&quot;https://changeloop.dev/blog/ja/changelog-vs-release-notes/&quot;&gt;チェンジログ対リリースノート&lt;/a&gt;がその違いを完全に扱っている。簡単に言えば、チェンジログは完全で年代順の記録であり、リリースノートは更新が持つ価値があるように聞こえるよう書かれた厳選された部分集合だ。製品は通常両方を必要とし、読者の一日の異なる瞬間に向けられている。&lt;/p&gt;
&lt;h2&gt;何がチェンジログを読む価値のあるものにするのか&lt;/h2&gt;
&lt;p&gt;自らの範囲についての具体性と誠実さだ。「様々なバグ修正」は、読者にページを開くのをやめさせる文だ。なぜなら確認できることを何も約束していないからだ。たとえ小さな修正であっても、変わった正確な挙動を名指ししたエントリこそが、購読を生かし続けるものだ。この規律は省略されるものにも当てはまる。成功だけを発表し、壊れていた何かの修正を決して発表しないチェンジログは、チェンジログの姿をしたマーケティングのように読め、読者はそれに気づく。&lt;/p&gt;
&lt;p&gt;バージョニングの規律も重要だ。&lt;a href=&quot;https://changeloop.dev/blog/ja/semantic-versioning-changelog/&quot;&gt;セマンティックバージョニングとあなたのチェンジログ&lt;/a&gt;は、バージョン番号とエントリがどう一致すべきかを示していて、バージョン履歴を眺める読者が二つの異なる信号ではなく同じ信号を二度受け取れるようにする。&lt;/p&gt;
&lt;h2&gt;チェンジログはどう生成されるのか&lt;/h2&gt;
&lt;p&gt;二つの方法があり、実際のほとんどの構成はその組み合わせだ。自動生成はコミットメッセージを読み、通常&lt;a href=&quot;https://www.conventionalcommits.org/en/v1.0.0/&quot;&gt;Conventional Commits&lt;/a&gt;形式で、誰も出力に触れずにそれをエントリに変換する。&lt;a href=&quot;https://changeloop.dev/blog/ja/conventional-commits-changelog/&quot;&gt;Conventional Commitsからチェンジログへ&lt;/a&gt;がそのパイプラインを扱っている。キュレーションされた生成とは、誰かが手作業で各エントリを書くか編集することを意味する。自動化された出力はより速く、マージされたプルリクエストを決して見逃さないが、あいまいなコミットメッセージをそのまま継承してしまう。だから自動化する多くのチームでも、生の出力をそのまま見せるのではなく、公開前に軽い編集の段階を維持している。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;すべての製品にチェンジログが必要か?&lt;/strong&gt;
変更によって影響を受ける利用者がいる製品なら、SaaSアプリでも、社内ツールでも、公開APIでも必要だ。形は適応する(APIチェンジログは消費者向けアプリのものとは違う読み方をする)が、必要性は変わらない。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ソフトウェア用語でチェンジログとは何か?&lt;/strong&gt;
上と同じ定義だ。ソフトウェアで何が変わったかの、日付付きで年代順のリストであり、それを作った人ではなく使う人のために書かれる。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;チェンジログはコミットから自動生成できるか?&lt;/strong&gt;
できる。多くのチームがまさにそれを行っていて、通常はConventional Commits形式のメッセージからだ。トレードオフは、生成されたエントリが元になったコミットメッセージと同じくらい明確でしかないことで、だから公開前のレビューの通過が言い換えが必要なものを捕まえる。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;チェンジログはバージョン履歴と同じものか?&lt;/strong&gt;
用語が互換的に使われるくらい近い。バージョン履歴は時に説明なしのバージョン番号と日付のリストにすぎないが、チェンジログは常に何が変わったかを含む。&lt;/p&gt;
</content:encoded></item><item><title>APIチェンジログ: 何を公開し、誰が読むのか</title><link>https://changeloop.dev/blog/ja/api-changelog/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/api-changelog/</guid><description>APIチェンジログの読者は、自分のコードが来月も動くかを知りたい人だ。各エントリが負うべき内容と置き場所、開発者が購読する方法を説明する。</description><pubDate>Wed, 02 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;APIチェンジログとは、呼び出し側が気づく可能性のあるすべての変更を日付付きで記録したもので、リリースするチームのためではなく、そのAPIと統合する人々のために書かれる。この読者層こそが、それを製品のチェンジログとは異なる文書にしている。読者は自分のコードが来月も動くかどうかを判断しているのだ。多くのAPIチェンジログは同じ理由で失敗する。内部のリリースフィードをフィルタしただけのコピーになっており、削除されたフィールドが文言修正と同じ重みで並び、どちらも読まれない。&lt;/p&gt;
&lt;h2&gt;APIチェンジログとは何か&lt;/h2&gt;
&lt;p&gt;これは、他人がそれに対してコードを書いたインターフェースへの変更を記録した、公開の日付付きログである。何かがそこに含まれるべきかどうかを判断する有用なテストは、その変更が内部でどれほど大きかったかとは無関係だ。テストが問うのは、去年書かれてそれ以来触れられていない正しい呼び出し側が、それによって振る舞いを変える可能性があるかどうかである。このテストは、非常に小さな変更のいくつかを受け入れ、非常に大きな変更のいくつかを除外する。&lt;/p&gt;
&lt;p&gt;以下のすべては、呼び出し側が社外にいて、この文書以外では実質的に連絡が取れないことを前提としている。呼び出し側が同じ会社の別のチームである場合、その計算は独自の扱いに値するほど変わる。&lt;a href=&quot;https://changeloop.dev/blog/ja/internal-api-changelog/&quot;&gt;社内向けAPIチェンジログ&lt;/a&gt;は、その読者が代わりに何を必要とするかを扱っている。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;文書&lt;/th&gt;
&lt;th&gt;対象読者&lt;/th&gt;
&lt;th&gt;答える質問&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;APIチェンジログ&lt;/td&gt;
&lt;td&gt;APIを呼び出す開発者&lt;/td&gt;
&lt;td&gt;自分の統合はまだ動くか?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;リリースノート&lt;/td&gt;
&lt;td&gt;製品のユーザー&lt;/td&gt;
&lt;td&gt;以前できなかった何ができるようになったか?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;非推奨化通知&lt;/td&gt;
&lt;td&gt;特定の一つを呼び出す人&lt;/td&gt;
&lt;td&gt;これはいつ動かなくなるか?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ステータスページ&lt;/td&gt;
&lt;td&gt;現在影響を受けている全員&lt;/td&gt;
&lt;td&gt;今落ちているか?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;移行ガイド&lt;/td&gt;
&lt;td&gt;アップグレードする呼び出し側&lt;/td&gt;
&lt;td&gt;AからBにどう移行するか?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;a href=&quot;https://changeloop.dev/blog/ja/api-migration-guide/&quot;&gt;API移行ガイドの書き方&lt;/a&gt;がこの最後の文書を完全に扱っている。短く言えば、これは互換性のない変更のエントリが、それを置き換えようとするのではなくリンクすべきものだ。&lt;/p&gt;
&lt;p&gt;この五つは、それぞれ別のライフサイクルを持つ別の文書である。非推奨化通知は日付付きの約束であり、チェンジログにも属するが、チェンジログのエントリは一度書かれるのに対し、非推奨化はそのサンセットまで追跡される。両者を混同することが、サンセットが見逃される原因になる。&lt;/p&gt;
&lt;h2&gt;一つのエントリに何を含めるべきか&lt;/h2&gt;
&lt;p&gt;六つのことがあり、最初の三つは通常欠けているものだ。変更内容を、内部コンポーネントではなくリクエストやレスポンスの言葉で述べること。正しい呼び出し側を壊すかどうか。呼び出し側が何をすべきか、「何もしない」を含めて。それが発効した日付。影響を受けるバージョンまたはバージョン群。存在するなら移行ガイドへのリンク。&lt;/p&gt;
&lt;p&gt;「accountsエンドポイントを改善」というエントリは、六つすべてに失敗する。「&lt;code&gt;accounts.type&lt;/code&gt;フィールドは、以前は&lt;code&gt;personal&lt;/code&gt;を返していたところで現在は&lt;code&gt;individual&lt;/code&gt;を返す。9月2日より前に作成されたアカウントでは既存の値は変わらない。文字列を比較しない限りアクションは不要」というエントリは、一文で六つすべてに答える。&lt;/p&gt;
&lt;p&gt;エントリは部署ではなく結果によって分類すること。ほぼすべての価値を三つのラベルが担う。breaking、additive、fixedだ。&lt;a href=&quot;https://semver.org/&quot;&gt;Semantic Versioning&lt;/a&gt;はすでに最初の二つを正確に定義しており、独自の定義を考案する代わりにその定義を借用することは、semverを知る読者があなたのラベルを理解することを意味する。&lt;a href=&quot;https://keepachangelog.com/en/1.1.0/&quot;&gt;Keep a Changelog&lt;/a&gt;は望むならより長いセットを提供しており、その中心的な規則はここで他のどこよりも強く当てはまる。ログは人間のためのものであり、コミットタイトルの羅列はそうではない。&lt;/p&gt;
&lt;h2&gt;APIチェンジログはリリースノートとどう違うのか&lt;/h2&gt;
&lt;p&gt;リリースノートは製品が今何をできるかを説明する。APIチェンジログは契約が今どうなっているかを説明する。同じリリース作業がしばしば両方にエントリを生み出し、異なる文言で書かれる。読者層が異なるものを必要とするからだ。新しいエクスポート形式は、ユーザーにとっては機能だが、そのフィールドで分岐する呼び出し側にとっては新しいenum値である。&lt;/p&gt;
&lt;p&gt;実際的な結果として、この二つは同じフィードにスタイルだけ変えたものにはできない。あなたが出荷するすべてに購読している呼び出し側は最終的に購読を解除し、そして破壊的変更を見逃すことになる。一つのフィードを公開するならフィルタすること。二つ公開するなら、APIのものを狭くし、マーケティングのエントリを決して入れないこと。両方の形を並べて&lt;a href=&quot;https://changeloop.dev/blog/ja/changelog-vs-release-notes/&quot;&gt;チェンジログ対リリースノート&lt;/a&gt;で比較している。&lt;/p&gt;
&lt;h2&gt;APIチェンジログはどこにあるべきか&lt;/h2&gt;
&lt;p&gt;リファレンスドキュメントの隣に、安定したURLで、各エントリがフラグメントか独自のパスで個別にアドレス可能な形で。呼び出し側はインシデントレビューや社内チケットでエントリにリンクする。リンクできないエントリは、代わりにスクリーンショットとして貼り付けられることになる。&lt;/p&gt;
&lt;p&gt;ページに加えて、機械可読な出力としても公開すること。&lt;a href=&quot;https://www.jsonfeed.org/version/1.1/&quot;&gt;JSON Feed仕様&lt;/a&gt;に従うJSONフィードや&lt;a href=&quot;https://www.rssboard.org/rss-specification&quot;&gt;RSSフィード&lt;/a&gt;は、エントリが構造化データになれば何のコストもかからず、それこそが顧客が自分たちのリリースプロセスにあなたの変更を組み込めるようにするものだ。これはまた、誰かがその上に何かを構築するかどうかを決める部分でもある。GitHubは同じ理由で&lt;a href=&quot;https://docs.github.com/en/rest/about-the-rest-api/api-versions&quot;&gt;REST APIのバージョン&lt;/a&gt;をリファレンスのすぐ隣に文書化している。バージョンポリシーはインターフェースの一部だからだ。&lt;/p&gt;
&lt;h2&gt;実際に良いエントリはどう見えるか&lt;/h2&gt;
&lt;p&gt;同じ週の三つのエントリを、上記の形式で示す。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;2026-09-02  Breaking  v2
  `POST /invoices` は、顧客のアカウント通貨と一致しない `currency` を
  拒否するようになり、暗黙に変換する代わりに422を返す。変換に依存し
  ていた呼び出し側は、アカウント通貨を送信する必要がある。v2のみに
  影響し、v1は2027-01-15のサンセットまで変わらない。

2026-09-02  Additive  v1, v2
  `Invoice` は、請求書が決済されるまでnullとなる `settled_at` タイム
  スタンプを得る。アクションは不要。未知のフィールドを拒否するクラ
  イアントは更新すべき。

2026-08-31  Fixed  v2
  `GET /invoices?status=` は、未知のステータスに対して400ではなく
  空のページを返していた。現在は許容される値とともに400を返す。タ
  イプミスをした呼び出し側は、以前はゼロ件の結果を見ていたが、現在
  はエラーを見る。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;三つ目は最もよく省略されるタイプだ。内部的にはバグ修正だからだ。その空のページを前提にリトライを組んでいた呼び出し側にとっては、これは振る舞いの変更であり、そのエントリこそがサポートチケットを防ぐものだ。ラベルはfixedと言い、本文は呼び出し側が気づくかもしれないことを述べている。これが、あらゆる修正を破壊的変更に膨らませることなくログを正直に保つ区別である。&lt;/p&gt;
&lt;h2&gt;呼び出し側はどう購読するのか&lt;/h2&gt;
&lt;p&gt;一つ以上のチャネルを与えること。彼らの仕事が異なるからだ。すべてを望む開発者向けのフィード。破壊的変更だけを望む人向けのメール。コード自体のためのレスポンスヘッダーは、確認を決して忘れない唯一の購読者だ。&lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc8594&quot;&gt;RFC 8594で定義された&lt;code&gt;Sunset&lt;/code&gt;ヘッダー&lt;/a&gt;は、廃止日をレスポンスに置き、クライアントライブラリがそれをログに記録できるようにする。&lt;/p&gt;
&lt;p&gt;多くのチームが省略するチャネルは直接のものだ。ある呼び出し側が先週、あなたが変更しようとしているフィールドを使っていたなら、それが誰かはわかっている。そのアカウントへのメールは、どんな一斉配信よりも価値がある。これは、誰も要求していない変更に適用された&lt;a href=&quot;https://changeloop.dev/blog/ja/customer-feedback-loop/&quot;&gt;顧客フィードバックループを閉じる&lt;/a&gt;ことと同じ規律だ。影響を受けた人々には個別に伝え、それ以外の全員にはフィードが届く。Webhookは、頼る前に知っておく価値のある独自の失敗の仕方を持つ第四のチャネルだ。&lt;a href=&quot;https://changeloop.dev/blog/ja/webhook-changelog/&quot;&gt;Webhookチェンジログ&lt;/a&gt;は、そこでのペイロード変更が、新しい形式を拒否できる呼び出し側なしに静かに壊れる理由を扱っている。&lt;/p&gt;
&lt;h2&gt;破壊的変更のエントリはどう書くべきか&lt;/h2&gt;
&lt;p&gt;理由からではなく、破壊そのものから始めること。十件のエントリをスキャンする呼び出し側は、最初の一文で、それが自分の作業を発生させるかどうかを知る必要がある。次に日付、影響を受けるバージョン、移行方法、そして古い振る舞いが変化するのではなく消える場合の期限。&lt;/p&gt;
&lt;p&gt;同じ内容を非推奨化通知、レスポンスヘッダー、直接のメールに、一貫した文言で入れ、四つすべてに同じ日付を与えること。それらの間のずれは、計画された変更をインシデントに変えてしまう失敗だ。一つしか読んでいない呼び出し側が、誤った日付に基づいて行動してしまうからである。&lt;a href=&quot;https://changeloop.dev/blog/ja/breaking-changes/&quot;&gt;破壊的変更とは何か&lt;/a&gt;はその決定自体を扱い、&lt;a href=&quot;https://changeloop.dev/blog/ja/api-deprecation/&quot;&gt;APIの非推奨化方法&lt;/a&gt;はその後に続くスケジュールを扱う。&lt;/p&gt;
&lt;p&gt;changeloopでは、プルリクエストがマージされ、誰かがドラフトを編集して承認し、&lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;フィードとウィジェット&lt;/a&gt;に公開されたとき、API変更がエントリになる。その同じ瞬間に、ウィジェットのフィードバックがGitHub issueになり、そのissueをプルリクエストがクローズする呼び出し側には、そのissue上で通知が届く。ここで重要なのはレビューのステップだ。APIチェンジログは契約文書であり、人間が読んでいないドラフトが呼び出し側に届くべきではない。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;すべてのAPI変更にチェンジログのエントリが必要か?&lt;/strong&gt;
正しい呼び出し側が気づく可能性のある変更はすべて必要だ。内部的だと考えているものも含む。リクエストやレスポンスに観測可能な効果がない変更は不要で、それを追加すると読者に流し読みを訓練してしまう。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;APIチェンジログはドキュメントとマーケティングサイトのどちらにあるべきか?&lt;/strong&gt;
ドキュメントの、リファレンスのすぐ隣。読者は通常すでにそこにいて、マーケティングサイト上のチェンジログは、それが書かれた対象ではない読者を獲得しがちだ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;どこまで過去に遡るべきか?&lt;/strong&gt;
無期限に。エントリは何年も後にインシデントレビューで引用され、切り詰められたログはそのリンクを壊してしまう。削除ではなくページ分割すること。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;APIバージョンごとに別のチェンジログが必要か?&lt;/strong&gt;
不要だ。エントリごとにバージョンフィールドを持つ一つのログの方が、読むのも検索するのも簡単だ。バージョンによるフィルタはページの機能であり、文書を分割する理由ではない。&lt;/p&gt;
</content:encoded></item><item><title>人々が追い続けるチェンジログページの作り方</title><link>https://changeloop.dev/blog/ja/changelog-page/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/changelog-page/</guid><description>チェンジログページを作る価値があるのは、誰かが戻ってくると期待できる場合だけだ。置き場所、各エントリの要件、フィード、ウィジェットを説明する。</description><pubDate>Wed, 02 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;チェンジログページを作る価値があるのは、誰かがそこに戻ってくるだろう場合だけだ。これは単に持っているだけよりも高いハードルであり、そして多くのページが躓くのもまさにこのハードルにおいてだ。ページは存在し、フッターにリンクがあり、断続的に更新され、インシデントの最中を除けば誰にも訪れられない。この二つを分ける決定は、何かが書かれる前に下されており、多くの場合、ページがどこに置かれるか、そして同じ内容から他に何が生成されるかに関するものである。&lt;/p&gt;
&lt;h2&gt;チェンジログページとは何か&lt;/h2&gt;
&lt;p&gt;これは、製品で何が変わったかを示す、公開された日付付きのリストであり、自分が所有するURLに置かれる。同じエントリが現れうる五つの表面の一つであり、有用な問いはどれを選ぶかではなく、どれが正典であり、どれがそこから生成されるかということだ。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;表面&lt;/th&gt;
&lt;th&gt;最適な用途&lt;/th&gt;
&lt;th&gt;コスト&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;ホストされたページ&lt;/td&gt;
&lt;td&gt;検索、リンク、長い記録&lt;/td&gt;
&lt;td&gt;URLとテンプレート&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;アプリ内ウィジェット&lt;/td&gt;
&lt;td&gt;ページを訪れないユーザーへのリーチ&lt;/td&gt;
&lt;td&gt;埋め込みと節度&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ドキュメントのセクション&lt;/td&gt;
&lt;td&gt;APIと開発者の読者層&lt;/td&gt;
&lt;td&gt;リファレンスの隣に置くこと&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JSONフィード&lt;/td&gt;
&lt;td&gt;変更の上に構築する顧客&lt;/td&gt;
&lt;td&gt;すでに持っている構造&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RSSフィード&lt;/td&gt;
&lt;td&gt;一度だけ購読する開発者&lt;/td&gt;
&lt;td&gt;ほぼゼロ&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;正典となる情報源を一つ選び、一度公開し、残りはそこから生成すること。ページとウィジェットを手作業で別々に維持するチームは、最終的に一致しない二つのテキストを抱えることになり、その食い違いは顧客によって発見される。&lt;/p&gt;
&lt;h2&gt;チェンジログページはどこに置かれるべきか&lt;/h2&gt;
&lt;p&gt;自分自身のドメイン上に、安定したパスで、各エントリがフラグメントか独自のパスによって個別にアドレス可能な形で。三つの一般的な配置は、メインサイト上のパス、サブドメイン、そしてドキュメントのセクションである。メインサイト上のパスは、それに反対する議論をすべき初期設定であり、賛成する議論をすべきものではない。サイトの権威を継承し、追加の証明書やDNSを必要とせず、ページを他のすべてと同じナビゲーションに保つ。&lt;/p&gt;
&lt;p&gt;サブドメインが正しい答えになるのは、ページがマーケティングサイトとは別のシステムによって提供されており、そうでなければプロキシをすることになる場合だ。そのコストは、権威が別々に蓄積されることである。チェンジログをドキュメントに置くのが正しいのは、読者層が開発者である場合であり、その理由は&lt;a href=&quot;https://changeloop.dev/blog/ja/api-changelog/&quot;&gt;APIチェンジログ&lt;/a&gt;で扱われている。読者はたいてい、すでにそこにいるからだ。&lt;/p&gt;
&lt;p&gt;選択そのものより重要なのは、エントリが個別にリンク可能であることだ。人々はインシデントレビューや社内チケットでエントリにリンクする。「チェンジログ、下にスクロール」としてしかリンクできないエントリは、代わりにスクリーンショットとして貼り付けられることになる。&lt;/p&gt;
&lt;h2&gt;チェンジログページには何が必要か&lt;/h2&gt;
&lt;p&gt;五つのことがあり、最初の二つで多くのページが失敗する。変更ごとの日付付きエントリで、最新のものが最初に来ること。興味のあるタイプでスキャンできるよう、エントリごとのカテゴリまたはラベル。エントリごとのパーマリンク。購読の経路。約五十件のエントリを超えたら検索またはフィルタ。&lt;/p&gt;
&lt;p&gt;残りは任意である。スクリーンショットは役に立つが、メンテナンスコストがかかる。著者名は、ある製品では信頼を築き、別の製品ではノイズになる。バージョン番号は、あるAPIの呼び出し側にとっては重要だが、それ以外のほとんど誰にとっても重要ではない。&lt;a href=&quot;https://keepachangelog.com/en/1.1.0/&quot;&gt;Keep a Changelog&lt;/a&gt;は、独自のラベルを考案する理由がなければ妥当な初期設定であり、その中心的な規則は、残りを捨てたとしても保持する価値がある。ログは人間のために書かれているという規則だ。&lt;/p&gt;
&lt;p&gt;製品が継続的にリリースされる場合は、バージョンではなく日付でグループ化すること。「これは9日のインシデントの前だったか後だったか」をスキャンする読者は日付を探しており、バージョン番号で整理されたページは彼に計算を強いる。&lt;/p&gt;
&lt;h2&gt;ページかアプリ内ウィジェットか&lt;/h2&gt;
&lt;p&gt;両方を、一つの情報源から。ページは検索、リンク、長い記録が置かれる場所だ。ウィジェットは、ページを決して訪れないであろう大多数のユーザーに届く方法であり、それが機能するのは、彼らがすでに使っている製品の中に現れるからだ。&lt;/p&gt;
&lt;p&gt;ウィジェットの失敗は中断である。すべてのエントリに注意を要求するバッジは一週間以内に恒久的に無視され、それは本当に重要だったエントリのためのチャネルを失わせる。読者が最後に見てからの未読数を数え、最初の訪問時には静かにカウンターを播種し、誰も一年分の履歴のバッジで迎えられないようにし、読者自身に開かせること。読者の代わりに開いてはならない。&lt;/p&gt;
&lt;h2&gt;チェンジログページを機械可読にするには&lt;/h2&gt;
&lt;p&gt;同じエントリをフィードとしても公開すること。&lt;a href=&quot;https://www.jsonfeed.org/version/1.1/&quot;&gt;JSON Feed&lt;/a&gt;は、コードでそれを消費するあらゆるものにとって最も摩擦の少ない選択肢であり、&lt;a href=&quot;https://www.rssboard.org/rss-specification&quot;&gt;RSSフィード&lt;/a&gt;は、リーダーで購読する開発者が期待するものだ。エントリが手書きのHTMLではなく構造化データになれば、両方ともほとんどコストがかからない。これこそが、正典となるコピーを構造化しておくべき本当の理由だ。&lt;/p&gt;
&lt;p&gt;ページにもマークアップを施すこと。エントリは日付とタイトルを持つ作品であり、&lt;a href=&quot;https://schema.org/CreativeWork&quot;&gt;schema.org&lt;/a&gt;がその語彙を提供する。これはパーマリンクと同じ理由で価値がある。ブラウザではないもの、顧客自身のリリースプロセスを含めて、ページを利用可能にするのだ。基礎となるエントリがそもそも構造化データでなかったなら、これらのどれも機能しない。&lt;a href=&quot;https://changeloop.dev/blog/ja/changelog-file-formats/&quot;&gt;チェンジログのファイル形式&lt;/a&gt;は、このフィードとこのマークアップが実際に生成される真実の源として、Markdown、JSON、YAMLのそれぞれが何を犠牲にするかを扱っている。&lt;/p&gt;
&lt;h2&gt;チェンジログページはSEOに役立つか&lt;/h2&gt;
&lt;p&gt;間接的に、そしてゆっくりと。個々のエントリは、誰かが入力する検索クエリを狙っていないため、めったにランクインしない。ページは、リンクを通じてその地位を得る。エントリはサポートの返信やフォーラム、インシデント分析で引用され、それらのリンクは自分が所有するURLに蓄積される。二年間毎週更新されるページは、それが属する製品にとって信頼できる新鮮さのシグナルでもある。&lt;/p&gt;
&lt;p&gt;機能しないのは、エントリをコンテンツマーケティングのように扱うことだ。長さのために三段落に膨らまされたエントリは、その本来の仕事、つまり自分が使っている何かが変わったかどうかを読者に一文で伝えることにおいて、より劣ったものになる。チェンジログに検索をサポートさせたいなら、パーマリンク、フィード、そこへの内部リンクに労力を注ぎ、エントリは短く保つこと。私たち自身の&lt;a href=&quot;https://changeloop.dev/changelog-examples&quot;&gt;チェンジログの例&lt;/a&gt;ページは、このバランスをうまく取っているページを集めている。&lt;/p&gt;
&lt;h2&gt;人々はどう購読するのか&lt;/h2&gt;
&lt;p&gt;すでに使っている経路を与えること。開発者向けのRSSまたはJSONフィード、重要なことだけを聞きたい人向けのメール、そしてそのどちらも決して行わないすべての人向けのアプリ内ウィジェットだ。仮定するのではなく、何を聞きたいか尋ねること。破壊的変更を望んで文言修正を受け取る読者は、両方から購読解除してしまうからだ。&lt;/p&gt;
&lt;p&gt;最後に追加すべき経路は、ループを閉じるものだ。あるエントリが特定の人が求めていたことを解決したとき、そのページを読んでくれることを期待するのではなく、直接それを伝えること。changeloopでは、エントリは&lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;ページ、フィード、ウィジェット&lt;/a&gt;に一度に公開され、ウィジェットのフィードバックがGitHub issueになり、そのissueをプルリクエストがクローズした人は、そのissue上でエントリへのリンクとともに通知され、ウィジェットでもそのエントリを目にする。仕組みはどんな購読とも同じだが、違いは受け手がすでに尋ねていたということだ。これは&lt;a href=&quot;https://changeloop.dev/blog/ja/customer-feedback-loop/&quot;&gt;チェンジログ側からフィードバックループを閉じる&lt;/a&gt;で展開されている議論である。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;チェンジログページはサブドメインとパスのどちらに置くべきか?&lt;/strong&gt;
初期設定ではメインサイト上のパスにすべきだ。サイトの権威を継承し、追加のインフラを必要としないからである。サブドメインが正当化されるのは、別のシステムがページを提供する場合だ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ページは一度にいくつのエントリを表示すべきか?&lt;/strong&gt;
画面を埋めるのに十分な数であり、それ以上ではなく、その後にページネーションを置くこと。二年分の履歴を一つの文書に読み込むのは遅く、最新のエントリを見つけにくくする。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;古いエントリはいつか削除すべきか?&lt;/strong&gt;
いいえ。それらは自分のサイトの外部から引用されており、リンクが壊れてしまう。エントリはその場でメモとともに修正し、URLは生かし続けること。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;すべての変更がページに現れる必要があるか?&lt;/strong&gt;
ユーザーが気づく可能性のあるものだけだ。内部のリファクタリングを記録するページは読者に流し読みを訓練してしまい、流し読みされるページは、緊急の何かを運ぶ日に失敗する。&lt;/p&gt;
</content:encoded></item><item><title>読まれるプロダクトアップデートメールのテンプレート</title><link>https://changeloop.dev/blog/ja/product-update-email/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/product-update-email/</guid><description>読まれるプロダクトアップデートメールとは、求めていた本人に届くものだ。テンプレートの構造、四つのメール種別、件名、セグメント、同意の要否を説明する。</description><pubDate>Wed, 02 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;読まれるプロダクトアップデートメールとは、それがまさに求めていたことを告げるものとして、それを求めた本人に送られたものである。それ以外のすべては受信箱の残り全体と関心を奪い合う競争をしており、リリースの告知はほとんどの週でその競争に負ける。この一つの事実こそが、どんな文言よりも先に、メールの形を決めるべきだ。誰がそれを受け取るのか、そしてその人物がリストに載るために何をしたのか。&lt;/p&gt;
&lt;h2&gt;プロダクトアップデートメールとは何か&lt;/h2&gt;
&lt;p&gt;これは、既存のユーザーに対して、すでに使っている製品で何が変わったかを伝えるメッセージだ。四つの異なる種類があり、それらを一つのリストとして扱うことが、開封率が低下する理由である。それぞれ異なるトリガー、異なる読者層、異なる許容される頻度を持つ。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;種類&lt;/th&gt;
&lt;th&gt;トリガー&lt;/th&gt;
&lt;th&gt;読者層&lt;/th&gt;
&lt;th&gt;頻度&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;ターゲット通知&lt;/td&gt;
&lt;td&gt;誰かの具体的な要求がリリースされた&lt;/td&gt;
&lt;td&gt;一人&lt;/td&gt;
&lt;td&gt;起きるたびに&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;破壊的変更の通知&lt;/td&gt;
&lt;td&gt;読者に作業を強いる変更&lt;/td&gt;
&lt;td&gt;影響を受けるアカウントのみ&lt;/td&gt;
&lt;td&gt;起きるたびに&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ダイジェスト&lt;/td&gt;
&lt;td&gt;時間の経過&lt;/td&gt;
&lt;td&gt;オプトインしたユーザー&lt;/td&gt;
&lt;td&gt;最大でも月一回&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ローンチの告知&lt;/td&gt;
&lt;td&gt;中断する価値のあるローンチ&lt;/td&gt;
&lt;td&gt;セグメントまたは全員&lt;/td&gt;
&lt;td&gt;稀であり、稀に感じられるべき&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;多くのチームは三番目だけを構築し、全員に送り、そしてプロダクトアップデートメールは機能しないと結論づける。最初の二つがほとんどすべての価値を運んでいる。読者にはすでに関心を持つ先行する理由があり、メッセージはその理由がまだ生きているうちに届くからだ。&lt;/p&gt;
&lt;p&gt;ここに並んだ四つの行はすべて顧客向けに書かれている。営業、サポート、カスタマーサクセスも何がリリースされたかを知る必要があり、それは通常この四つとは異なる形になる。&lt;a href=&quot;https://changeloop.dev/blog/ja/internal-release-notes/&quot;&gt;社内向けリリースノート&lt;/a&gt;が、その文書が何を言うべきか、そしてなぜ顧客向けのノートより先に出なければならないかを扱っている。&lt;/p&gt;
&lt;p&gt;メールは、ローンチの告知が使える複数のチャネルの一つに過ぎず、唯一のものではない。&lt;a href=&quot;https://changeloop.dev/blog/ja/new-feature-announcement/&quot;&gt;新機能の発表方法&lt;/a&gt;が他のチャネルと、機能の実際の大きさに応じてどう選ぶかを扱っている。&lt;/p&gt;
&lt;h2&gt;テンプレートには何が含まれるべきか&lt;/h2&gt;
&lt;p&gt;この順序で六つのブロックがある。最初のものは通常欠けているものであり、実際の仕事をこなすものだ。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;件名:  &amp;lt;何が変わったか、読者の言葉で&amp;gt;

1. なぜこれを受け取っているのか
   「あなたは3月にCSVエクスポートを要求しました。」または
   「あなたの統合は1月15日に変更される /v1/invoices を呼び出しています。」

2. 何が変わったか
   一文で。今何が可能になったか、あるいは今何が壊れるか。

3. あなたが何をすべきか
   多くの場合「何もない」。暗黙のままにせず、明示的に述べること。

4. どこで見られるか
   ホームページではなく、チェンジログのエントリへのリンク。

5. いつ
   リリースされた日付、あるいはいつから適用されるか。

6. どう配信停止するか
   ワンクリックで、即座に尊重される。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ブロック1は、メッセージと一斉配信の違いを分けるものだ。最初の一文で、これは自分が個人的に求めたことの解決であると告げられた読者は、残りを読む。それがなければ、ブロック2から5は、どれほどよく書かれていてもニュースレターにすぎない。&lt;/p&gt;
&lt;p&gt;全体を約150語以下に保つこと。メールはチェンジログのエントリへのポインタであり、詳細が属するのはそちらである。エントリ全体を再現するメールは、読者にクリックする理由を与えず、誰かが気にかけたかどうかのシグナルもあなたに与えない。&lt;/p&gt;
&lt;h2&gt;どんな件名が機能するか&lt;/h2&gt;
&lt;p&gt;リリースではなく変更を名指しすること。「CSVエクスポートがライブになりました」は「9月のアップデート」に勝る。前者は読者が評価できる事実であり、後者は入れ物にすぎないからだ。件名内のバージョン番号は、あるAPIの呼び出し側には有用だが、他のすべての人にとってはノイズであり、読者層を分ける別の理由である。&lt;/p&gt;
&lt;p&gt;読者が同意していない利益を主張することは避けること。「あなたのレポートは今より速くなりました」は読者の体験について何かを主張している。「10,000行を超えるレポートは今、1秒未満で読み込まれます」は変更を報告し、それが重要かどうかを読者に判断させる。&lt;/p&gt;
&lt;h2&gt;いつ、誰に送るべきか&lt;/h2&gt;
&lt;p&gt;その物がリリースされた瞬間に、それを求めた人々に、個別にターゲット通知を送ること。日付が確定次第、そして再びその直前に、リスト全体ではなく実際に影響を受けるアカウントに破壊的変更の通知を送ること。読者がそうでなければ何かを見逃すほど十分な変更がある場合にのみダイジェストを送り、人々が別々に登録できるようにすること。&lt;/p&gt;
&lt;p&gt;ほぼ絶対に使うべきでないリストは「全ユーザー」だ。それは具体的なメッセージを一般的なものに変え、配信停止を訓練してしまう。すでに保存している行動でセグメント化すること。誰がそれを求めたか、誰がこのエンドポイントを使っているか、誰がこのプランにいるか。&lt;/p&gt;
&lt;h2&gt;それを送るのに同意は必要か&lt;/h2&gt;
&lt;p&gt;既存の顧客にとって、すでに使っているサービスについてのアップデートは、通常、見込み客へのマーケティングとは異なる法的な問題であり、答えは彼らがどこにいるか、そして登録時に何を伝えたかに依存する。EUでは、関連する問いは&lt;a href=&quot;https://gdpr-info.eu/art-6-gdpr/&quot;&gt;GDPR第6条&lt;/a&gt;のどの法的根拠が適用されるかであり、米国では商業的メッセージは&lt;a href=&quot;https://www.ftc.gov/business-guidance/resources/can-spam-act-compliance-guide-business&quot;&gt;FTCのCAN-SPAMコンプライアンスガイド&lt;/a&gt;に定められた具体的な要件を伴う。どちらも実際には同じことを求めている。自分が誰であるかを述べ、目的を明確にし、人々が止められるようにすること。&lt;/p&gt;
&lt;p&gt;根拠が何であれ、トランザクションとマーケティングの流れは配信レベルで分離しておくこと。プロモーションダイジェストとリストを共有していたために顧客が配信停止した破壊的変更の通知は、その日付を待っているサポートインシデントだ。&lt;/p&gt;
&lt;h2&gt;実際に記入するとどう見えるか&lt;/h2&gt;
&lt;p&gt;ターゲット通知、最も価値の高いプロダクトアップデートメールであり、多くのチームが決して構築しないもの。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;件名: CSVエクスポートがライブになりました

Danaさん、

あなたは3月にCSVエクスポートを要求しました。

今朝ライブになりました。レポートには現在、フィルタを含む
現在のビューのCSVを生成するエクスポートボタンがあります。

あなたの側で何もする必要はありません。すでにあなたの
アカウントで有効になっています。

  詳細: example.com/changelog#csv-export
  リリース日: 2026年9月2日

これはあなたが要求したために届いています。要求の
アップデートから配信停止する: &amp;lt;リンク&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;90語で、読者は最初の一文でなぜこれが届いたのかを知る。これを、月次ダイジェストの中の九項目のうちの一つとして現れる同じ変更と比較してみてほしい。Danaには自分自身の要求が出たことに気づく理由がない。&lt;/p&gt;
&lt;h2&gt;何を測定すべきか&lt;/h2&gt;
&lt;p&gt;開封率だけではない。ターゲット通知については、問いは要求した本人が戻ってきてその物を使ったかどうかであり、したがって追跡すべき数字はエントリへのクリックと、そのアカウントが一週間以内にその機能を使うかどうかである。破壊的変更の通知については、カバレッジだ。影響を受けたアカウントのうち何パーセントが日付前に開いたか、そして誰と個別にフォローアップしたか。&lt;/p&gt;
&lt;p&gt;ダイジェストは、四つのうち開封率が多くを意味する唯一のものであり、そこでさえ業界のベンチマークに対してよりも、自分自身の履歴に対するトレンドとしての方が有用だ。プロダクトアップデートメールの異なる種類は異なる仕事を持っており、したがってすべてを平均した数字は、行動できる何も表していない。&lt;/p&gt;
&lt;h2&gt;リリースノートとどう違うのか&lt;/h2&gt;
&lt;p&gt;リリースノートは利用可能であり続ける文書だ。メールは一度だけ起きる配信の仕組みである。同じ変更が両方を生み出し、メールはそれが指し示すエントリよりも短くあるべきだ。&lt;a href=&quot;https://changeloop.dev/blog/ja/release-notes-best-practices/&quot;&gt;リリースノートのベストプラクティス&lt;/a&gt;は文書を扱い、&lt;a href=&quot;https://changeloop.dev/blog/ja/changelog-vs-release-notes/&quot;&gt;チェンジログ対リリースノート&lt;/a&gt;はどちらを書いているのかを扱う。&lt;/p&gt;
&lt;p&gt;正しく理解する価値のある関係とはこうだ。チェンジログのエントリが正典のテキストであり、メールはそれを引用する。この二つが乖離すると、クリックした読者は異なる変更の説明を見つけ、両方への信頼を失う。エントリを先に公開し、そこからメールを生成することは、構造によってそのずれを取り除く。changeloopも自分の側では同じように動く。エントリは一度レビューされ、&lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;ページ、フィード、ウィジェット&lt;/a&gt;に公開され、ウィジェットを通じてそれを求めた人物は、そのフィードバックから作られたGitHub issue上と、ウィジェットそのものの中で通知される。changeloopはメールを送らない。あなたのメールツールが公開されたエントリを引用する。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;プロダクトアップデートメールはどのくらいの頻度で送るべきか?&lt;/strong&gt;
受け手が知りたい具体的な何かがあるたびであり、ターゲット通知の場合はその要求がリリースされるたびを意味し、ダイジェストの場合は最大でも月一回を意味する。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;メールにはチェンジログのエントリ全体を含めるべきか?&lt;/strong&gt;
いいえ。一文とリンクだけでよい。エントリが正典バージョンであり、メール内の完全なコピーは、整合性を保つべき二つのテキストがあることを意味する。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;どのくらいの開封率を期待すべきか?&lt;/strong&gt;
それぞれの種類をベンチマークではなく、それ自体と比較すること。ターゲット通知と月次ダイジェストは異なる製品であり、それらを平均すると、追跡する価値のある唯一の数字が隠れてしまう。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;破壊的変更のために別のリストが必要か?&lt;/strong&gt;
必要だ。そしてそれは、結果を理解しないまま人々が不用意に配信停止できないリストであるべきだ。それが彼らに障害をもたらすリストだからである。&lt;/p&gt;
</content:encoded></item><item><title>開発者を失わずにAPIを非推奨化する方法</title><link>https://changeloop.dev/blog/ja/api-deprecation/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/api-deprecation/</guid><description>非推奨化は、日付の付いた一つの約束だ。具体的なスケジュール、通知テンプレート、レスポンスヘッダー、サンセットを事故にしないための決定的な一手を説明する。</description><pubDate>Sat, 29 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;APIを非推奨化するということは、あるものが今日はまだ動作しているが、宣言された日付までに動作しなくなると告知し、その約束の両方の半分を守ることを意味する。多くの非推奨化は後半の半分で失敗する。日付が静かにずれるか、それが到来して、通知を一度も見たことのない呼び出し元がエラーからそれを知ることになる。非推奨化が完了するのは、影響を受けたすべての呼び出し元が移行したか、あるいは個別にまだ移行していないと伝えられたときだ。&lt;/p&gt;
&lt;h2&gt;APIの非推奨化とは何か&lt;/h2&gt;
&lt;p&gt;非推奨化とは、エンドポイント、フィールド、バージョンがなくなると告知することと、それを実際に削除することの間の期間だ。その期間中、古い動作は動作し続け、ドキュメントはそれがなくなると述べ、すべての応答は機械可読な警告を運ぶ。削除は別の、より後の出来事であり、しばしばサンセットと呼ばれる。この二つは混同され、まさにその混同が害を生む場所だ。「deprecated」は「もうすでになくなっているかもしれない」を意味し始め、呼び出し元はどちらの言葉も信頼しなくなる。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;用語&lt;/th&gt;
&lt;th&gt;意味&lt;/th&gt;
&lt;th&gt;呼び出し元が頼れるもの&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Deprecated&lt;/td&gt;
&lt;td&gt;なくなると告知され、まだ動作している&lt;/td&gt;
&lt;td&gt;サンセット日までの完全な動作&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sunset&lt;/td&gt;
&lt;td&gt;動作しなくなる日付&lt;/td&gt;
&lt;td&gt;この日付以降は何もない&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retired / 削除済み&lt;/td&gt;
&lt;td&gt;なくなった。リクエストは失敗する&lt;/td&gt;
&lt;td&gt;エラー、理想的には代替を名指しするもの&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Legacy&lt;/td&gt;
&lt;td&gt;未定義。この言葉は避けよう&lt;/td&gt;
&lt;td&gt;何もない。それこそが問題だ&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;非推奨化の期間はどのくらいであるべきか&lt;/h2&gt;
&lt;p&gt;呼び出し元がそれを知り、作業をこなすのに十分な長さで、あなたがそれを書いた時点からではなく、通知が実際に届いた時点から測る。90日は公開ウェブAPIの一般的な下限だ。12か月は、エンドユーザーがインストールするソフトウェアに組み込まれたものには普通だ。修正が彼らのリリースプロセスも通過しなければならないからだ。Googleのバージョニングガイダンスである&lt;a href=&quot;https://google.aip.dev/185&quot;&gt;AIP-185&lt;/a&gt;は、妥当な移行期間を求め、ベータ機能を削除する場合でも180日を推奨しており、Kubernetesは自らの&lt;a href=&quot;https://kubernetes.io/docs/reference/using-api/deprecation-policy/&quot;&gt;非推奨化ポリシー&lt;/a&gt;を月数ではなくリリース数で文書化している。それは呼び出し元がバージョンごとにアップデートする場合に正しい単位だ。&lt;/p&gt;
&lt;p&gt;期間を選び、それをポリシーとして書き留め、変更ごとにそれを決め直すのをやめよう。公開されたポリシーは、すべての非推奨化を交渉からルールの適用へと変える。&lt;/p&gt;
&lt;p&gt;非推奨化ポリシーを書き留めることはウィンドウの開始をカバーする。&lt;a href=&quot;https://changeloop.dev/blog/ja/sunsetting-api-version/&quot;&gt;APIバージョンの終了&lt;/a&gt;
は、期間が実際に尽きてバージョンが動作を停止したときに最後に必要となる、別の通知を扱っている。&lt;/p&gt;
&lt;h2&gt;非推奨化のスケジュール&lt;/h2&gt;
&lt;p&gt;初日にまとめて告知される四つの日付。それぞれが到来したときに個別のチェンジログ項目になるため、チェンジログだけを読む人にはその物語が四回語られることになる。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;告知する。&lt;/strong&gt; 項目は何が非推奨化されるか、なぜか、それが何に置き換わるか、そしてサンセット日を述べる。古いものについてのドキュメントは、移行先へのリンクを持つバナーを得る。応答は下に説明されるヘッダーを得る。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;半分の時点でリマインドする。&lt;/strong&gt; 二つ目の項目、そして古い動作をまだ使っているすべての呼び出し元への直接のメッセージ。これは利用データを必要とするステップだ。非推奨化されたエンドポイントをまだ呼んでいるのが誰かをリストできないなら、これはできない。それは次の非推奨化までに解決する価値がある。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;日付の少し前にブラウンアウトする。&lt;/strong&gt; 短い期間、一時間または一日、古い動作にエラーを返し、それから復元する。すべての通知を見逃した呼び出し元は、まだ時間があるうちにそれを今知ることになる。GitHubは、&lt;a href=&quot;https://github.blog/2020-07-30-token-authentication-requirements-for-api-and-git-operations/&quot;&gt;APIのパスワード認証を廃止する前に&lt;/a&gt;、計画されたブラウンアウトを使った。このリストの中で最も効果的な単一のステップだ。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;サンセット。&lt;/strong&gt; それを削除する。それを置き換えるエラーは、代替先を名指しし、移行ガイドにリンクする。エラーを長く維持しよう。404は呼び出し元に何も伝えない。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;非推奨化の通知は何を述べるべきか&lt;/h2&gt;
&lt;p&gt;非推奨化の通知は、何がなくなるか、いつ止まるか、代わりに何を使うか、そして誰に影響するかを述べる。以下はその形式を埋めたものだ。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;GET /v1/reports/daily&lt;/code&gt;は非推奨化されており、2027年3月1日に動作しなくなります。&lt;/strong&gt;
&lt;code&gt;GET /v2/reports?granularity=day&lt;/code&gt;に置き換えられ、安定したスキーマとページネーションで同じデータを返します。過去30日間にv1エンドポイントを呼び出した214の連携に影響します。もしあなたのものがその一つなら、この通知はメールでも届きます。移行ガイド：[リンク]。2027年3月1日までは何も変わりません。その日付以降、v1エンドポイントはこの項目へのリンク付きで&lt;code&gt;410 Gone&lt;/code&gt;を返します。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;すべての文が、読者が必要とする何かを運んでいる。影響を受けた連携の数は、それぞれの読者に読み続けるべきかを伝える。「まで何も変わりません」は、影響を受けない人にタブを閉じさせる文だ。&lt;a href=&quot;https://changeloop.dev/changelog-examples&quot;&gt;チェンジログの例&lt;/a&gt;のページは、この形式を一貫して書いているチームの項目を集めており、自分の最初のものを書く前に三つ読む価値がある。&lt;/p&gt;
&lt;h2&gt;非推奨化されたエンドポイントはどんなヘッダーを送るべきか&lt;/h2&gt;
&lt;p&gt;告知の日から、非推奨化されたエンドポイントからのすべての応答で、後継への&lt;code&gt;Deprecation&lt;/code&gt;、&lt;code&gt;Sunset&lt;/code&gt;、&lt;code&gt;Link&lt;/code&gt;を送ろう。&lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc9745&quot;&gt;&lt;code&gt;Deprecation&lt;/code&gt;ヘッダー&lt;/a&gt;は非推奨化が発効した日付を運び、&lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc8594&quot;&gt;&lt;code&gt;Sunset&lt;/code&gt;ヘッダー&lt;/a&gt;はエンドポイントが応答しなくなる日付を運び、&lt;code&gt;Link: &amp;lt;url&amp;gt;; rel=&amp;quot;successor-version&amp;quot;&lt;/code&gt;は代わりに何を使うべきかを示す。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;HTTP/1.1 200 OK
Deprecation: @1756425600
Sunset: Mon, 01 Mar 2027 00:00:00 GMT
Link: &amp;lt;https://api.example.com/v2/reports&amp;gt;; rel=&amp;quot;successor-version&amp;quot;
Link: &amp;lt;https://example.com/changelog/daily-reports&amp;gt;; rel=&amp;quot;deprecation&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;多くの呼び出し元は、ヘッダー自体を読むことは決してないだろう。その価値は、呼び出し元のHTTPクライアント、ゲートウェイ、モニタリングがそれを読めることにあり、それがあなたの非推奨化を、あなたの側のページではなく彼らの側のアラートに変える。あなたが出荷するSDKは、それを見たときに警告をログに出すべきだ。&lt;/p&gt;
&lt;h2&gt;誰に知らされたか、そしてそれをどう知るか&lt;/h2&gt;
&lt;p&gt;これは、サンセットが静かに終わるか、サポートのインシデントになるかを決めるステップであり、チェンジログだけで行うのが最も難しいものだ。チェンジログの項目は、チェンジログを読むすべての人に知らせる。非推奨化は、コードが失敗する具体的な人々に届く必要があり、彼らを見つける通常の方法は、半分の時点でのリマインドが必要とするのと同じ利用データだ。最近非推奨化された動作を呼び出したAPIキー、アプリ、アカウントだ。&lt;/p&gt;
&lt;p&gt;私たちが実行しているループ。項目は非推奨化を追加するpull requestから作成され、人間が言い回しと日付をレビューし、公開されると項目自体が通知になる。その問題についての、あるいは代替を求めるウィジェットのフィードバックが、pull requestがクローズするGitHub issueになった人は誰でも、それが出荷されたことを伝える項目へのリンク付きのコメントをそのissueで受け取る。&lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;フィードとウィジェット&lt;/a&gt;は同じ項目を他のすべての人に提供する。それは&lt;a href=&quot;https://changeloop.dev/blog/ja/api-changelog/&quot;&gt;APIチェンジログ&lt;/a&gt;にある他のすべての項目と同様だ。私たちがしないことは、人間がそれを公開する前に非推奨化が「出荷された」ことにすることだ。間違った日付の通知は、通知がないよりも悪い。&lt;/p&gt;
&lt;p&gt;あなたのツールが何であれ、サンセットの日に答えられなければならない問いは、先週まだこれを使っていたのはどの呼び出し元で、そのうちどれに直接伝えたか、というものだ。答えが「それについて投稿した」であれば、サンセットはまだ準備ができていない。&lt;/p&gt;
&lt;h2&gt;非推奨化とバージョニングの違いは何か&lt;/h2&gt;
&lt;p&gt;バージョニングは、新しいものが存在する間、古い動作を利用可能に保つ方法だ。非推奨化は、古いものを引退させる方法だ。以前のバージョンのための非推奨化ポリシーのない新しいAPIバージョンは、両方を永遠に運用する約束にすぎない。バージョニングのない非推奨化は、遅延を伴った&lt;a href=&quot;https://changeloop.dev/blog/ja/breaking-changes/&quot;&gt;破壊的変更&lt;/a&gt;だ。両方が必要であり、バージョンは簡単な方の半分だ。GraphQLは名指しする価値のある例外だ。通常そこにはそもそも上げるべきバージョン番号が存在せず、&lt;a href=&quot;https://changeloop.dev/blog/ja/graphql-schema-deprecation/&quot;&gt;GraphQLスキーマの非推奨化&lt;/a&gt;は、一つの共有されたスキーマが代わりにディレクティブでフィールドを引退させる方法を扱っている。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;非推奨化されたエンドポイントは以前とまったく同じように動作し続けるべきか?&lt;/strong&gt;
サンセット日まではそうだ。許される変更は、追加されたヘッダーと、終わりに近い時期に事前に告知された計画的なブラウンアウトだけだ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;引退したエンドポイントはどんなステータスコードを返すべきか?&lt;/strong&gt;
&lt;code&gt;410 Gone&lt;/code&gt;。代替とチェンジログの項目を指す&lt;code&gt;Link&lt;/code&gt;ヘッダー付きの本文とともに。&lt;code&gt;404&lt;/code&gt;はそのURLが一度も存在しなかったと述べており、それは間違っていて役に立たない。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;非推奨化の期間を短縮できるか?&lt;/strong&gt;
セキュリティ上の理由でのみ。古い動作が悪用可能であれば、そう述べ、期間を短縮し、チェンジログに頼るのではなく、影響を受けたすべての呼び出し元に直接伝えよう。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;フィールドを非推奨化する必要があるのか、それともエンドポイント全体だけか?&lt;/strong&gt;
フィールド、パラメータ、enumの値、デフォルト値、ヘッダーはすべて同じ扱いを必要とする。それぞれが正しい呼び出し元を壊しうるからだ。削除されたフィールドは最も一般的な非推奨化であり、最もよく見過ごされるものでもある。&lt;/p&gt;
</content:encoded></item><item><title>呼び出し元のためのAPIバージョニングのベストプラクティス</title><link>https://changeloop.dev/blog/ja/api-versioning-best-practices/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/api-versioning-best-practices/</guid><description>壊れるものだけをバージョン管理し、呼び出し元に見える場所へ置き、古い版も期日まで動かし続けよう。代表的な四つのスキームを長所と短所で比較する。</description><pubDate>Sat, 29 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;APIバージョニングとは、契約を変更した後もその古い契約を動作させ続ける実践のことであり、それによって呼び出し元はあなたのスケジュールではなく自分自身のスケジュールで移行できるようになる。この一文には重要な二つの決定が含まれている。何を契約の変更とみなすか、そして古い契約をどれだけの期間動作させ続けるか、だ。バージョン番号がどこに存在するかは、多くのバージョニング論争の中心にあるものだが、三つのうち最も重要度が低く、最も正しくやりやすい部分でもある。&lt;/p&gt;
&lt;h2&gt;いつAPIをバージョン管理すべきか&lt;/h2&gt;
&lt;p&gt;変更が正しい呼び出し元を壊してしまう場合にのみ、APIをバージョン管理しよう。追加的な変更、新しいフィールド、新しいエンドポイント、新しいオプションのパラメータはバージョンを必要としない。古い契約に対して書かれた呼び出し元は動作し続け、新しい機能はただそこに存在するだけだからだ。&lt;a href=&quot;https://changeloop.dev/blog/ja/breaking-changes/&quot;&gt;破壊的変更&lt;/a&gt;はバージョンを必要とする。代替案は、呼び出し元がエラーからそれを知ることになるからだ。追加的なものも含めてすべてのリリースをバージョン管理することは、呼び出し元にバージョンがノイズであると教え込み、彼らは本当に重要な通知を読まなくなる。&lt;/p&gt;
&lt;p&gt;実用的なテストは破壊的変更の記事にあるものと同じだ。文書化された動作だけに依存していた呼び出し元が、動作し続けるために何かを変更しなければならないなら、その変更はバージョンを必要とする。そうでなければ、現行バージョンの下で出荷し、チェンジログの項目を書こう。&lt;/p&gt;
&lt;h2&gt;どのAPIバージョニングスキームを使うべきか&lt;/h2&gt;
&lt;p&gt;呼び出し元が最も容易に見て設定できるスキームを使おう。多くの公開APIにとってそれは、URLパス内のバージョンか、日付付きのバージョンヘッダーだ。四つの一般的なスキームは能力よりも、呼び出し元に何を求めるかで違いが出るのであり、それこそが選択の正しい根拠だ。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;スキーム&lt;/th&gt;
&lt;th&gt;例&lt;/th&gt;
&lt;th&gt;呼び出し元がすべきこと&lt;/th&gt;
&lt;th&gt;使っている例&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;URLパス&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/v2/invoices&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;移行時にURLを変更する&lt;/td&gt;
&lt;td&gt;ほとんどの公開RESTのAPI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;バージョンヘッダー&lt;/td&gt;
&lt;td&gt;&lt;code&gt;X-GitHub-Api-Version: 2022-11-28&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ヘッダーを送るか、デフォルトを受け入れる&lt;/td&gt;
&lt;td&gt;GitHub&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;日付付きアカウントバージョン&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Stripe-Version: 2026-08-26&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;リクエストごと、またはアカウントごとに日付を固定する&lt;/td&gt;
&lt;td&gt;Stripe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;クエリパラメータ&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/invoices?version=2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;パラメータを付加する&lt;/td&gt;
&lt;td&gt;古いAPI。今日ではめったに選ばれない&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;メディアタイプ&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Accept: application/vnd.example.v2+json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;コンテンツタイプをネゴシエートする&lt;/td&gt;
&lt;td&gt;原理主義者。管理できる呼び出し元は少ない&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;URLパス&lt;/strong&gt;は最も可視性が高く、最も柔軟性が低い。すべての呼び出し元はログの一行を読むだけでどのバージョンにいるかがわかり、バージョンの引き上げは検索置換で済む。コストは、サーフェス全体が一度に動くことだ。すべてのエンドポイントに新しいバージョンを発行せずに一つのエンドポイントの契約だけを変えることはできないため、パスバージョンはまれで、かつ大きなものになりがちだ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;バージョンヘッダー&lt;/strong&gt;はURLを安定させたまま、何も送ってこない呼び出し元にサーバー側でデフォルトを選ばせることができる。それが&lt;a href=&quot;https://docs.github.com/en/rest/about-the-rest-api/api-versions&quot;&gt;GitHubのREST APIバージョン&lt;/a&gt;の仕組みだ。&lt;code&gt;X-GitHub-Api-Version&lt;/code&gt;内の日付名のバージョンで、サポートされている最も古いバージョンがデフォルトになるため、バージョンを指定しない呼び出し元も壊れない。コストは、バージョンがURLの中では見えず、新しいクライアントで忘れられやすいことだ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;日付付きアカウントバージョン&lt;/strong&gt;は、ヘッダー方式に一つの追加を加えたものだ。バージョンはアカウントに紐づけて保存されるため、何も送らなくてもすべてのリクエストがそれを受け取る。&lt;a href=&quot;https://docs.stripe.com/api/versioning&quot;&gt;Stripeのバージョニング&lt;/a&gt;は、各アカウントを作成時のバージョンに固定し、リクエストは&lt;code&gt;Stripe-Version&lt;/code&gt;でそれを上書きできる。これは最も呼び出し元に優しいスキームであり、運用する側にとっては最も手間がかかる。サポートするすべてのバージョンと現行バージョンの間をサーバーが翻訳しなければならないからだ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;クエリパラメータ&lt;/strong&gt;と&lt;strong&gt;メディアタイプ&lt;/strong&gt;はどちらも機能するが、それぞれ違った形で可視性のテストに失敗する。クエリパラメータはURLを組み立てる際に落としやすく、メディアタイプのバージョンは呼び出し元がデバッグに使うほぼすべてのツールから見えない。Stripeの日付ベースのスキームは、日付方式の最もよく知られた例であり、その仕組みは&lt;a href=&quot;https://changeloop.dev/blog/ja/stripe-api-versioning/&quot;&gt;StripeのAPIバージョニング&lt;/a&gt;で順を追って説明している。&lt;/p&gt;
&lt;h2&gt;実際にはどのようにAPIバージョニングを行うか&lt;/h2&gt;
&lt;p&gt;実際には、バージョンとは名前の付いた振る舞いの集合であり、サーバーは各リクエストをそのうちの一つに対応させる。どのスキームが名前を運んでいても、手順は同じだ。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;バージョンはセマンティックバージョンではなく、日付か整数で名付ける。&lt;/strong&gt; ウェブAPIはパッケージではない。呼び出し元はURLのマイナーバージョンを固定できないため、&lt;code&gt;v2&lt;/code&gt;や&lt;code&gt;2026-08-26&lt;/code&gt;は呼び出し元が必要とするすべてを伝える一方、&lt;a href=&quot;https://semver.org/&quot;&gt;セマンティックバージョニング&lt;/a&gt;の番号は、このスキームが果たせない互換性の約束を暗示してしまう。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;気にする必要のないコードパスからバージョンを遠ざける。&lt;/strong&gt; バージョンは端で変換層を選ぶべきであり、ビジネスロジックを分岐させるべきではない。コードベースを丸ごと二つ持つことこそ、バージョンが保守されなくなる道筋だ。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;すべてのバージョンにデフォルトとドキュメントを与える。&lt;/strong&gt; バージョンを送らない呼び出し元は、最新版ではなく常にサポートされている最も古いバージョンを受け取るため、固定していないクライアントはリリース当日に壊れない。それぞれのバージョンには、前のバージョンから何が変わったかを述べたページがある。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;サポート期間を設定し、それを公開する。&lt;/strong&gt; Googleのバージョニングガイダンスである&lt;a href=&quot;https://google.aip.dev/185&quot;&gt;AIP-185&lt;/a&gt;は、十分に周知された妥当な移行期間を求め、ベータ機能であっても180日を推奨している。期間を選び、書き留め、バージョンごとに再交渉することなくそれを適用しよう。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;バージョンをエンドポイントと同じように引退させる。&lt;/strong&gt; 期間を過ぎたバージョンは、あらゆる&lt;a href=&quot;https://changeloop.dev/blog/ja/api-deprecation/&quot;&gt;非推奨化されたAPI&lt;/a&gt;と同じ扱いを受ける。告知、すべての応答に付く&lt;code&gt;Sunset&lt;/code&gt;ヘッダー（&lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc8594&quot;&gt;RFC 8594&lt;/a&gt;）、まだそこにいる呼び出し元への半分の時点でのリマインド、そして守られる削除日だ。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;RESTのAPIにおけるv1とv2とは何か&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;v1&lt;/code&gt;と&lt;code&gt;v2&lt;/code&gt;は、同じサーバーが同時にサポートしている二つの契約の名前だ。&lt;code&gt;v2&lt;/code&gt;が存在するのは、&lt;code&gt;v1&lt;/code&gt;の中の何かがその呼び出し元を壊さずには変更できなかったからであり、その変更は新しい契約の中に入り、古いものは動作し続けた。番号そのものは、&lt;code&gt;v2&lt;/code&gt;が完成しているとか&lt;code&gt;v1&lt;/code&gt;が死んでいるとかを何も意味しない。両方ともドキュメントがそう述べているときにのみ真になる。四半期ごとに&lt;code&gt;v3&lt;/code&gt;が現れるのは、追加的な変更がバージョン管理されているか、契約がそもそも変化を吸収するように設計されていなかった兆候だ。&lt;/p&gt;
&lt;p&gt;これはURLパスによるバージョン管理のモデルであり、バージョン番号は呼び出し元がダイヤルする
セグメントだ。gRPCサービスは通常、同じ問題を別の方法で解決する。バージョンは&lt;code&gt;.proto&lt;/code&gt;ファイル
自体の中のパッケージ名に宿る。&lt;a href=&quot;https://changeloop.dev/blog/ja/grpc-protobuf-api-changes/&quot;&gt;gRPCとProtobuf&lt;/a&gt;はこの違い
と、そこではワイヤー互換性がURLの形ではなくフィールド番号によって定義される理由を扱っている。&lt;/p&gt;
&lt;h2&gt;バージョンの変更は何を告知すべきか&lt;/h2&gt;
&lt;p&gt;バージョンの変更は、何が壊れるか、誰に影響するか、どう移行するか、そして前のバージョンがどれだけの期間動作し続けるかを告知すべきだ。この項目は、他の破壊的変更の項目と同じ形に、サポート期間を述べる一行を加えたものになる。以下はヘッダーでバージョン管理されたAPIのための例だ。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;APIバージョン2026-11-01が利用可能になりました。バージョン2025-06-15は2027年11月1日までサポートされます。&lt;/strong&gt;
2026-11-01での変更点：&lt;code&gt;GET /invoices&lt;/code&gt;は&lt;code&gt;amount&lt;/code&gt;を小数の文字列ではなく、最小単位の整数として返すようになりました。非推奨だった&lt;code&gt;customer_name&lt;/code&gt;フィールドは削除され、&lt;code&gt;customer&lt;/code&gt;オブジェクトに置き換わりました。2025-06-15を使っていて&lt;code&gt;amount&lt;/code&gt;を文字列としてパースしている呼び出し元に影響します。これは2025年6月より前に作成された、バージョンを固定していないクライアントのデフォルトです。移行方法：&lt;code&gt;amount&lt;/code&gt;を整数としてパースし、名前は&lt;code&gt;customer.name&lt;/code&gt;から読み取ってください。準備ができたら&lt;code&gt;X-Api-Version: 2026-11-01&lt;/code&gt;を固定してください。バージョンを固定していない呼び出し元には何も変わりません。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;最後の一文が、ほとんどの読者をそこで読み終えさせる文であり、すべてのバージョン告知に含まれるべきものだ。&lt;a href=&quot;https://changeloop.dev/changelog-examples&quot;&gt;チェンジログの例&lt;/a&gt;のページには、このようにバージョン管理しているAPIの項目が集められており、良いものとそれ以外の違いは、たいていこの最後の一行にある。&lt;/p&gt;
&lt;h2&gt;バージョンが変わったとき、誰に知らされるか&lt;/h2&gt;
&lt;p&gt;古いバージョンにいる全員に個別に、そしてそれ以外の全員にはチェンジログで。バージョンの変更は、「投稿しておいた」が確実に重要な呼び出し元を取りこぼすケースだ。つまり、二年前にバージョンを固定してから一度もリリースノートを読んでいない人たちだ。彼らが誰であるかは利用データが答えてくれる。通知は、彼らのコードがある場所、つまりレスポンスヘッダーとアカウント所有者へのメッセージに届かなければならない。&lt;/p&gt;
&lt;p&gt;私たちが実行しているループでは、バージョンを告知する項目はそれを出荷するpull requestから下書きされ、人間がレビューし、&lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;フィードとウィジェット&lt;/a&gt;に公開され、そこではバージョン管理されたクライアントがそれをJSONとして読める。その変更を求めた、あるいはそれが修正するバグを報告したウィジェットのフィードバックが、pull requestがクローズするGitHub issueになった人は誰でも、項目が公開されたときにそのissueで知らされる。仕組みはどの項目でも同じであり、バージョンの引き上げは単に最も影響の大きい項目にすぎない。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;すべてのAPIの変更は新しいバージョンを取得すべきか?&lt;/strong&gt;
いいえ。破壊的変更だけだ。追加的な変更は現行バージョンの下でチェンジログの項目とともに出荷される。追加的な変更をバージョン管理することは、呼び出し元にバージョンを無視するよう教え込む。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;URLバージョニングとヘッダーバージョニング、どちらが優れているか?&lt;/strong&gt;
URLバージョニングは呼び出し元にとって見やすく、あなたにとっては少しずつ進化させにくい。ヘッダーバージョニングはその逆だ。多くの小さなクライアントを持つ公開APIでは、URLバージョニングの方が失敗が少ない。変換層を持つ大規模なAPIでは、日付付きヘッダーの方がスケールする。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;同時にいくつのバージョンをサポートすべきか?&lt;/strong&gt;
サポート期間が許す限り少なく、決して無制限にはしない。二つか三つの並行バージョンが普通であり、それを超える場合は通常、バージョンが引退させられていないことを意味する。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;バージョンを指定しないリクエストは何を受け取るべきか?&lt;/strong&gt;
サポートされている最も古いバージョンだ。既存の固定していないクライアントが動作し続けるようにするためであり、どのバージョンを受け取ったかを伝えるレスポンスヘッダーとともに返される。&lt;/p&gt;
</content:encoded></item><item><title>破壊的変更に該当するものと、安全な出荷方法</title><link>https://changeloop.dev/blog/ja/breaking-changes/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/breaking-changes/</guid><description>破壊的変更とは、正しい呼び出し元が耐えられない変更のこと。何が該当し何が該当しないか、CIでの検出方法、安全な出荷の手順を解説する。</description><pubDate>Sat, 29 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;破壊的変更とは、正しく書かれた呼び出し元が生き残れなかったであろう変更のことだ。この定義は重要だ。何かが「該当する」かどうかについての多くの議論は、実際には誰が正しくない持ち方をしていたかについての議論だからだ。呼び出し元があなたのドキュメントに従い、あなたの変更がそのコードを動かなくしたなら、その変更は破壊的だった。あなたが何を意図していたかは、これとは何の関係もない。&lt;/p&gt;
&lt;p&gt;これがテストのすべてだ。この記事の残りは、そこから導かれるもの。何がテストに落ちるか、何が通るか、マージされる前に失敗をどう捕まえるか、そして自分が破壊的変更を出荷していると分かった時点で何をすべきかだ。&lt;/p&gt;
&lt;h2&gt;何が破壊的変更に該当するか&lt;/h2&gt;
&lt;p&gt;呼び出し元にテストを適用しよう。diffにではなく。文書化された動作だけに依存していた呼び出し元が、動作し続けるためにコード、設定、またはデータを変更しなければならないとき、その変更は破壊的だ。フィールドの削除、エンドポイントの改名、バリデーションの厳格化、デフォルト値の変更、値の型の変更、これらはすべて該当する。オプションのフィールドの追加は該当しない。バグの修正は通常該当しないが、下に一つ重要な例外がある。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;変更&lt;/th&gt;
&lt;th&gt;破壊的か&lt;/th&gt;
&lt;th&gt;理由&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;フィールド、エンドポイント、フラグ、オプションの削除または改名&lt;/td&gt;
&lt;td&gt;はい&lt;/td&gt;
&lt;td&gt;正しい呼び出し元はそれを参照している&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;オプションのフィールドや新しいエンドポイントの追加&lt;/td&gt;
&lt;td&gt;いいえ&lt;/td&gt;
&lt;td&gt;既存の呼び出しは変わらない&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;オプションの入力を必須に変更する&lt;/td&gt;
&lt;td&gt;はい&lt;/td&gt;
&lt;td&gt;それを省略していた呼び出しは今や失敗する&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;以前は受け入れていたバリデーションを厳格化する&lt;/td&gt;
&lt;td&gt;はい&lt;/td&gt;
&lt;td&gt;動作していた入力が今や拒否される&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;デフォルト値の変更&lt;/td&gt;
&lt;td&gt;はい&lt;/td&gt;
&lt;td&gt;それを設定していなかった呼び出し元は新しい動作を得る&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;型の変更（文字列から数値へ、単一値から配列へ）&lt;/td&gt;
&lt;td&gt;はい&lt;/td&gt;
&lt;td&gt;文書化された型のために書かれたパーサーが失敗する&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;オブジェクトのキーの順序を変更する&lt;/td&gt;
&lt;td&gt;いいえ&lt;/td&gt;
&lt;td&gt;順序を文書化していない限り&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;呼び出し元が依存していたバグを修正する&lt;/td&gt;
&lt;td&gt;実質的にはい&lt;/td&gt;
&lt;td&gt;偶発的な契約についてのセクションを参照&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;レートリミットやサイズの上限を引き上げる&lt;/td&gt;
&lt;td&gt;いいえ&lt;/td&gt;
&lt;td&gt;動作していたものは何も動かなくならない&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;レートリミットやサイズの上限を引き下げる&lt;/td&gt;
&lt;td&gt;はい&lt;/td&gt;
&lt;td&gt;問題なかったトラフィックが今や制限される&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;エラーメッセージの言い回しを変更する&lt;/td&gt;
&lt;td&gt;場合による&lt;/td&gt;
&lt;td&gt;それを文書化していたか、呼び出し元がそれに一致させている場合は破壊的&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;何が破壊的変更に該当しないか&lt;/h2&gt;
&lt;p&gt;以前動作していたすべての呼び出しが、変わらず動作し、同じ意味を持ち続けるなら、その変更は非破壊的だ。新しいエンドポイントの追加、オプションのリクエストパラメータの追加、レスポンスへのフィールドの追加、必須の入力をオプションにすること、上限の引き上げ、誰も照合していないエラーメッセージの改善は、いずれもテストを通過する。こうした追加的な変更は、通常のチェンジログ項目とともにマイナーリリースで出荷できる。&lt;/p&gt;
&lt;p&gt;それでも追加的な変更が呼び出し元を壊す場面が三つある。未知のフィールドを拒否するデシリアライザを持つクライアントは、レスポンスに新しいフィールドが加わった最初の時点で失敗する。だから、認識できないフィールドは無視するよう、早い段階で文書化しておこう。新しいenum値は、網羅的なswitch文を持つすべての呼び出し元を壊す（詳しくは下で述べる）。そして、大きくなったレスポンスは、呼び出し元が考えたこともなかったサイズ上限、タイムアウト、列の幅を超えさせることがある。&lt;/p&gt;
&lt;p&gt;表のうち四つの行は、より詳しく見る価値がある。意見の相違が生まれるのは、まさにそこだからだ。&lt;/p&gt;
&lt;h2&gt;チームが見過ごしがちな四つの破壊的変更&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;偶発的な契約。&lt;/strong&gt; あなたのAPIが三年間、同じ文書化されていないフィールドを返し続けているなら、呼び出し元はそれに依存して構築している。&lt;a href=&quot;https://www.hyrumslaw.com/&quot;&gt;ハイラムの法則&lt;/a&gt;は短いバージョンだ。十分な数のユーザーがいれば、あなたのシステムの観察可能なあらゆる動作に、誰かが依存することになる。だからこそ「それはバグ修正だった」は弁護にならない。修正は正しくても、それでもなお破壊的でありうる。それを破壊的変更として出荷しよう。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;スキーマの変更を伴わない動作の変更。&lt;/strong&gt; フィールドはまだそこにあり、型も同じだが、値が今や別の意味を持つようになる。以前は&lt;code&gt;active&lt;/code&gt;か&lt;code&gt;inactive&lt;/code&gt;だった&lt;code&gt;status&lt;/code&gt;が、今や&lt;code&gt;suspended&lt;/code&gt;も返すようになると、網羅的なswitch文を持つすべての呼び出し元を壊す。ローカルタイムからUTCに移行するタイムスタンプは、ドキュメントを二度読んでいないすべての人を壊す。OpenAPIファイルのdiffには、これらのどれも現れない。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;厳格化されたバリデーション。&lt;/strong&gt; TLDのないメール、末尾の空白、80文字を超える名前を拒否し始める。まさにそれを送っていたすべての呼び出し元は、先週まで動作していたリクエストで今や400を受け取る。バリデーションの変更は、「堅牢化」の修正として最もよく出荷されるものだ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;変更されたデフォルト値。&lt;/strong&gt; 値を明示的に設定した誰も何も気づかない。それをしなかったすべての人、つまりほとんどの呼び出し元が、一行も変更せずに新しい動作を受け取る。変更されたデフォルト値は、まさにその設定を一度も見たことがないという理由で、あなたのユーザーの大半を壊す。&lt;/p&gt;
&lt;h2&gt;出荷前に破壊的変更をどう検出するか&lt;/h2&gt;
&lt;p&gt;プルリクエスト上のコントラクトとメインブランチ上のコントラクトをCIで比較し、破壊的な差分があればビルドを失敗させる。ほとんどのインターフェース形式にスキーマ差分ツールがあり、それぞれが自分の形式の破壊的変更のルールを知っている。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;インターフェース&lt;/th&gt;
&lt;th&gt;ツール&lt;/th&gt;
&lt;th&gt;比較する対象&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;REST（OpenAPI）&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/oasdiff/oasdiff&quot;&gt;oasdiff&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;二つのOpenAPI仕様。破壊的変更のレポート付き&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gRPC（Protobuf）&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://buf.build/docs/breaking/&quot;&gt;buf breaking&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.proto&lt;/code&gt;ファイル。ワイヤレベルまたはソースレベル&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GraphQL&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/kamilkisiela/graphql-inspector&quot;&gt;GraphQL Inspector&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;二つのスキーマ。破壊的変更と危険な変更を指摘する&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rustクレート&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/obi1kenobi/cargo-semver-checks&quot;&gt;cargo-semver-checks&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;公開APIと最後に公開されたバージョンの比較&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TypeScriptパッケージ&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://api-extractor.com/&quot;&gt;API Extractor&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;パッケージの公開APIのコミット済みレポート&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;これらのツールは、削除されたフィールド、改名された操作、変更された型を確実に捕まえる。しかし、上の四種類のうち最初の二つ、偶発的な契約と動作の変更は見えない。どちらもスキーマには現れないからだ。明らかなものはツールで止め、残りは「正しい呼び出し元が気づくだろうか?」というレビューの問いで確かめよう。同じCIジョブは、&lt;a href=&quot;https://changeloop.dev/blog/ja/changelog-ci-enforcement/&quot;&gt;CIでチェンジログ項目を必須にする方法&lt;/a&gt;で説明しているように、チェンジログ項目を必須にする場所としても自然だ。また、&lt;a href=&quot;https://changeloop.dev/blog/ja/grpc-protobuf-api-changes/&quot;&gt;gRPCとProtobufのAPI変更&lt;/a&gt;では、ワイヤレベルのケースを取り上げている。&lt;/p&gt;
&lt;h2&gt;コミットで破壊的変更をどう示すか&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.conventionalcommits.org/en/v1.0.0/&quot;&gt;Conventional Commits&lt;/a&gt;では、破壊的変更はコロンの前の&lt;code&gt;!&lt;/code&gt;（&lt;code&gt;feat(api)!: remove the legacy export endpoint&lt;/code&gt;）か、&lt;code&gt;BREAKING CHANGE:&lt;/code&gt;で始まり説明が続くフッターで示す。どちらもメジャーバージョンに対応する。フッターは、誰が影響を受け、何をすべきかを明記した、チェンジログ項目の最初の下書きとして書こう。この規約でどこまで足りるかは、&lt;a href=&quot;https://changeloop.dev/blog/ja/conventional-commits-changelog/&quot;&gt;Conventional Commitsとチェンジログ&lt;/a&gt;で扱っている。&lt;/p&gt;
&lt;p&gt;同じルールはライブラリにも当てはまる。公開関数の削除、パラメータ型の狭め、戻り値の変更は、セマンティックバージョニングではメジャーバージョンだ。ライブラリは必ずしもそれに従うわけではない。&lt;a href=&quot;https://arxiv.org/abs/2110.07889&quot;&gt;Maven Centralの119,879件のアップグレードを調べた研究&lt;/a&gt;では、16.6%がセマンティックバージョニングに違反していたが、影響を受けたクライアントプロジェクトは7.9%にとどまった。そうした変更の大半が、どのクライアントも呼んでいないコードに触れていたからだ。破壊は、呼び出し元で測られる。&lt;/p&gt;
&lt;h2&gt;破壊的変更はどう出荷するか&lt;/h2&gt;
&lt;p&gt;日付とパスを添えて、公然と出荷する。以下のステップは順番通りであり、最後のものは多くのチームが飛ばすステップだ。影響を受けた人々に、彼らが待っていたことが今起きたと伝えることだ。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;それが該当するかどうかを決める。&lt;/strong&gt; diffではなく上記のテストを使おう。二人のエンジニアが同意しないなら、それは破壊的だ。その不一致こそが、呼び出し元が古い動作に合理的に依存していた可能性があるという証拠だ。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;バージョンを付ける。&lt;/strong&gt; &lt;a href=&quot;https://semver.org/&quot;&gt;セマンティックバージョニング&lt;/a&gt;の下では、破壊的変更はメジャーバージョンだ。日付付きまたはバージョン付きのAPIを運用しているなら、それは新しいバージョンに入り、古い方は宣言された日付まで動作し続ける。バージョンを付けられないなら、破壊的変更を出荷しているのではなく、チェンジログの項目付きの障害を出荷していることになる。どのスキームがバージョンを運ぶかは&lt;a href=&quot;https://changeloop.dev/blog/ja/api-versioning-best-practices/&quot;&gt;APIバージョニングのベストプラクティス&lt;/a&gt;のテーマだ。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;コードがマージされる前に項目を書く。&lt;/strong&gt; その項目には固定された形がある。何が変わるか、誰に影響するか、何をすべきか、いつまでか。この四つすべてを埋められないなら、その変更はまだ準備できていない。&lt;a href=&quot;https://changeloop.dev/release-notes-template&quot;&gt;リリースノートのテンプレート&lt;/a&gt;は、まさにこの理由から、こうした項目をバージョン番号ではなく日付付きで先頭に置く。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;リリース番号ではなく期限を伝える。&lt;/strong&gt; 「v5で削除」は、あなたのリリースを追っていない人には何の意味もない。「2026年11月1日に動作しなくなる」はすべての人にとって同じ意味を持つ。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;移行方法を提供する。&lt;/strong&gt; 古い呼び出しの例を、新しいものと並べて示す。変更が改名であれば、両方の名前を同じ文で述べる。削除されたフィールドであれば、そのデータがどこに行ったかを伝える。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;古い動作が文書化されていたすべての場所で告知する。&lt;/strong&gt; チェンジログ、エンドポイントを説明するドキュメントページ、SDKのリリースノート、そしてあるなら応答内の非推奨ヘッダー。一箇所だけで告知することは、たまたまそこを見た人にだけ告知することだ。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ループを閉じる。&lt;/strong&gt; 顧客がその変更を求めていたなら、あるいはそれにつながったバグを報告していたなら、それが出荷されたときに伝えよう。これは、それをユーザーに対して行われたことから、ユーザーとともに行われたことへと変えるステップだ。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;破壊的変更の良い項目とはどんなものか&lt;/h2&gt;
&lt;p&gt;良い項目は、最初の行で影響を受ける呼び出し元を名指しし、日付を宣言し、修正方法を含む。以下は、私たちが使う形式での、厳格化されたバリデーションのケースの例だ。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ドメインのないメールアドレスは2026年11月1日から拒否されます。&lt;/strong&gt;
&lt;code&gt;POST /users&lt;/code&gt;と&lt;code&gt;PATCH /users/:id&lt;/code&gt;は現在、&lt;code&gt;alice@localhost&lt;/code&gt;のような&lt;code&gt;email&lt;/code&gt;の値を受け付けています。11月1日以降、これらは&lt;code&gt;400 invalid_email&lt;/code&gt;を返します。社内ディレクトリからユーザーを作成するあらゆる連携が影響を受けます。移行方法：完全修飾されたアドレスを送るか、フィールドを省略して後で設定してください。すでにドメインを持つアドレスであれば、変更は不要です。これは今年作成されたアカウントの99.4%に当てはまります。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この種の通知がどこに置かれるべきか、そして他に何がその隣にあるべきかについては、&lt;a href=&quot;https://changeloop.dev/blog/ja/api-changelog/&quot;&gt;APIチェンジログ&lt;/a&gt;で扱っている。&lt;/p&gt;
&lt;p&gt;最後のパーセンテージは装飾ではない。それは読者に、心配すべきかどうかを伝える。それこそが、読者がその項目を開いたときの問いだったからだ。&lt;/p&gt;
&lt;h2&gt;なぜ単に避けないのか&lt;/h2&gt;
&lt;p&gt;代替案の方が悪いからだ。何も壊さないAPIは、これまでに犯したすべての間違いを蓄積していく。誤って名付けられたフィールド、間違ったデフォルト値、ローカルタイムのタイムスタンプ。それぞれが、午後の時間で移行できたであろう呼び出し元を守るために、あらゆる新しい呼び出し元に永遠に課される税金だ。安定性について最良の評判を持つチームは、めったに何かを壊さない。スケジュールに従い、移行パスと、対象となった人々に届いた警告とともに。&lt;/p&gt;
&lt;p&gt;その警告の仕組みは、&lt;a href=&quot;https://changeloop.dev/blog/ja/api-deprecation/&quot;&gt;APIの非推奨化&lt;/a&gt;についての姉妹記事のテーマだ。それを告知する項目は、&lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;チェンジログのフィード&lt;/a&gt;内の他のどの項目とも同じ方法で作成される。マージされたpull requestから、人間のために保留され、その後、影響を受ける呼び出し元がすでに読んでいる場所で公開される。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;破壊的変更と非破壊的変更の違いは何か?&lt;/strong&gt;
破壊的変更は、正しい呼び出し元に、動作し続けるためのコード、設定、またはデータの変更を強いる。非破壊的変更は、既存のすべての呼び出しを同じ意味のまま動作させ続ける。だから追加は通常安全で、削除、改名、厳格化されたルールは通常そうではない。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;必須フィールドの追加は該当するか?&lt;/strong&gt;
はい。既存のすべての呼び出しはそれを省略しているため、既存のすべての呼び出しが今や失敗する。妥当なデフォルト値とともにオプションとして追加するか、エンドポイントをバージョン管理しよう。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;バグ修正は該当するか?&lt;/strong&gt;
該当しうる。呼び出し元がバグのある動作に依存していたなら、それを修正することはドキュメントが何と言っていようと彼らを壊す。誰も依存していなかったことを示せない限り、観察可能な出力を変えるあらゆる修正を破壊的として扱おう。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;セマンティックバージョニングはウェブAPIに適用されるか?&lt;/strong&gt;
ルールは適用される。破壊的変更は新しいメジャーバージョンを取得し、古い方は宣言された期間動作し続ける。その番号は、パッケージバージョンではなく、URLや日付ヘッダーに存在することが多い。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;どのくらいの事前通知で十分か?&lt;/strong&gt;
呼び出し元が通知を見つけて作業をこなすのに十分な期間だ。公開APIでは90日が一般的な下限だ。エンドユーザーに出荷され、リモートで更新できないコードで使われるものについては、より長くすべきだ。&lt;/p&gt;
</content:encoded></item><item><title>チェンジログ側から顧客フィードバックループを閉じる方法</title><link>https://changeloop.dev/blog/ja/customer-feedback-loop/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/customer-feedback-loop/</guid><description>フィードバックループが閉じるのは、依頼した本人に出荷を伝えたときだけだ。四つのステップのどこで途切れるか、チェンジログが最適な理由を説明する。</description><pubDate>Sat, 29 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;顧客フィードバックループが閉じるのは、フィードバックを寄せた本人がそれがどうなったかを知らされたときだ。ファイルされたときでも、優先順位が付けられたときでも、出荷されたときですらない。伝えられたときだ。ほとんどのチームは最初の三つのステップをうまくこなすが、最後の一つはまったくこなさず、そしてなぜフィードバックを送ってくれる人々が送らなくなっていくのか不思議に思う。&lt;/p&gt;
&lt;p&gt;この記事はその最後のステップについてのものであり、一つの具体的な主張についてのものだ。チェンジログこそがループを閉じるのにふさわしい場所である。なぜならそれは、ループを閉じられる瞬間にすでに存在している唯一の成果物だからだ。&lt;/p&gt;
&lt;h2&gt;顧客フィードバックループとは何か&lt;/h2&gt;
&lt;p&gt;顧客フィードバックループとは、ユーザーがあなたに何かを伝えることから、そのユーザーがあなたがそれに対して何をしたかを知るまでの経路のことだ。四つのステップがある。フィードバックを集める、それをどうするか決める、結果を出荷する、そして依頼した人に伝える。四つ目のステップが起こるまでループは開いたままだ。フィードバックを集め、修正を出荷しても、誰にも伝えないチームが持っているのは、ループではなく受信箱だ。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ステップ&lt;/th&gt;
&lt;th&gt;何が起きるか&lt;/th&gt;
&lt;th&gt;どこで壊れがちか&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;収集&lt;/td&gt;
&lt;td&gt;フィードバックが届く：ウィジェット、サポート、営業、インタビュー&lt;/td&gt;
&lt;td&gt;何も壊れない。すべてのチームがこれを行う&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;決定&lt;/td&gt;
&lt;td&gt;トリアージされ、重複と統合され、受理または却下される&lt;/td&gt;
&lt;td&gt;却下が伝えられることは決してない&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;出荷&lt;/td&gt;
&lt;td&gt;誰かがそれを作り、公開される&lt;/td&gt;
&lt;td&gt;マージの時点で依頼へのリンクが失われる&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;伝達&lt;/td&gt;
&lt;td&gt;依頼者がそれが出荷されたことを知る&lt;/td&gt;
&lt;td&gt;省略されるか、声の大きい依頼者にだけ行われる&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;この記事が扱うのは四つ目の行だ。それが壊れるのは文化的な理由ではなく、構造的な理由による。機能が出荷される頃には、それを引き起こした依頼は、出荷されたものとは別のシステムの中にあり、両者を結びつけることを仕事としている人は誰もいない。ループはもっと前、そもそも依頼をどう聞くかから始まっており、その文面とタイミングは&lt;a href=&quot;https://changeloop.dev/blog/ja/how-to-ask-for-customer-feedback/&quot;&gt;顧客フィードバックの聞き方&lt;/a&gt;で扱っている。&lt;/p&gt;
&lt;h2&gt;なぜフィードバックループは開いたままになるのか&lt;/h2&gt;
&lt;p&gt;フィードバックループが開いたままになるのは、依頼と出荷された変更が別々の場所に存在し、その間のリンクが、あるとしても手作業で作られるからだ。依頼はフィードバックツール、サポートの受信箱、あるいはスプレッドシートの中にある。変更はpull requestの中にある。告知はチェンジログかメールの中にある。三つのシステム、三人の所有者、そして三つ目から一つ目へと戻るリンクは、誰かが数か月後に誰が依頼したかを思い出す、という形で作られる。&lt;/p&gt;
&lt;p&gt;もう一つの理由がある。伝達のステップは通常、サポートのタスク（「その人に返信する」）としてではなく、マーケティングのタスク（「機能を告知する」）として捉えられている。告知は全員に向けて送られ、特定の誰にも届かない。三月に機能を依頼した人が六月の告知を読んだとしても、それは返信としてではなく、ニュースとして読まれる。ループが閉じるのは、そのメッセージが本人に宛てられているときだけだ。&lt;/p&gt;
&lt;h2&gt;なぜチェンジログ側からループを閉じるのか&lt;/h2&gt;
&lt;p&gt;チェンジログの項目こそが、まさに正しい瞬間に存在し、まさに正しい言葉を含み、まさに正しい人によって書かれる唯一の成果物だからだ。それは変更が公開されたときに存在し、それ以前には存在しない。それは何が変わったかを読者の言葉で述べており、それこそが依頼者が必要としているメッセージだ。そしてそれは、たった今そのpull requestを読んだ人によって書かれる。それは元の依頼へのリンクがまだ見える唯一の瞬間だ。&lt;/p&gt;
&lt;p&gt;代替案と比較してみよう。フィードバックツール側からループを閉じるには、その機能がいつ出荷されたかをフィードバックツールが知る必要があり、それは誰かが手作業でステータスを更新することを意味する。pull request側から閉じるには、変更がまだ公開されていないマージの時点で顧客に伝えることになり、デプロイが遅れれば、それはタイムスタンプ付きの破られた約束になる。マーケティングの告知側から閉じるには、告知が出るのを待つことになるが、出荷された変更のほとんどには告知など出ない。&lt;/p&gt;
&lt;p&gt;チェンジログはその中間に位置する。マージの後、リリースの瞬間に、言い回しがすでに仕上がった状態で。&lt;/p&gt;
&lt;h2&gt;ループはどのように、一段階ずつ閉じるのか&lt;/h2&gt;
&lt;p&gt;これは私たちが実行している仕組みだ。ここでは製品ツアーとしてではなく仕様として説明する。どのステップも手作業や他のツールで行えるからであり、重要なのは順序だ。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;フィードバックは、それを修正するリポジトリのissueになる。&lt;/strong&gt; ウィジェットからの投稿は、ラベル付きのGitHub issueとしてファイルされる（&lt;code&gt;feature-request&lt;/code&gt;または&lt;code&gt;bug&lt;/code&gt;、優先度、そして&lt;code&gt;from-widget&lt;/code&gt;）。投稿者のメールアドレスはissue本文に入れない。issueはコードのすぐそばに存在するため、三つ目のステップがそれを見つけられる。手でファイルされたissue、たとえば&lt;a href=&quot;https://changeloop.dev/blog/ja/feature-request-template/&quot;&gt;機能要望のテンプレート&lt;/a&gt;から作られたものはこの経路の外にある。五つ目のステップはそこにコメントしないので、そのループは自分で閉じよう。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;修正がそのissueを参照する。&lt;/strong&gt; pull requestは&lt;code&gt;Fixes #142&lt;/code&gt;と記述する。GitHub自身のクローズキーワードだ。新しく学ぶことは何もなく、開発者がすでに書いているのと同じ文だ。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;チェンジログの項目はマージされたpull requestから下書きされ、リンクを運ぶ。&lt;/strong&gt; マージの時点で下書きが作成され、&lt;code&gt;#142&lt;/code&gt;がPR本文から読み取られ、下書きに紐づけられる。リンクはまだ安価なうちに、機械によって、すでにそこにあるデータから作られる。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;人間がその項目をレビューする。&lt;/strong&gt; 言い回し、対象読者、そもそも公開すべきかどうか。破棄された下書きは何も閉じない。それは正しいことだ。たまたまissueを参照していただけの内部リファクタリングはニュースではないからだ。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;承認されると、依頼者に伝えられる。&lt;/strong&gt; フィードバックから作られたissueにコメントが投稿される。「Shipped —」に続けて項目のタイトルと、公開された項目へのリンクだ。そしてウィジェットは投稿者に、同じ出荷済みの項目を表示する。一度だけ、二度と繰り返さず、そして人間がその項目を公開した後にだけ。同じ項目は依頼していなかったすべての人にも&lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;フィードとウィジェット&lt;/a&gt;を通じて配信される。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ステップ五の順序こそがこの設計のすべてだ。マージの時点で依頼者に伝えることの方が早く、簡単だっただろうが、それはデプロイが遅れる頻度とほぼ同じ頻度で間違ったものになっていたはずだ。フィーチャーフラグはこの順序さえも壊す。承認と公開が、機能が依頼者のアカウントにとってまだ見えない間に起こりうるからだ。&lt;a href=&quot;https://changeloop.dev/blog/ja/feature-flags-feature-requests/&quot;&gt;フィーチャーフラグと機能リクエスト&lt;/a&gt;は、フラグが絡んだときにこのステップが必要とする追加のチェックを扱っている。&lt;/p&gt;
&lt;h2&gt;顧客にとって、閉じたループはどう見えるか&lt;/h2&gt;
&lt;p&gt;それは返信のように見える。顧客はウィジェットを通じて依頼を送った。そしてある日、ウィジェットがそれを出荷済みとして表示し、彼らの言葉でそれを説明する項目へのリンクが添えられる。GitHub上では、issueにも同じ知らせがコメントとして付く。彼らはニュースレターを購読したわけでも、ロードマップを確認したわけでも、チェンジログを検索したわけでもない。伝えられたのだ。&lt;/p&gt;
&lt;p&gt;その体験こそが、二回目のフィードバックを引き起こす。人々は、答えてくれるプロダクトにフィードバックを送るものだ。&lt;a href=&quot;https://changeloop.dev/changelog-examples&quot;&gt;チェンジログの例&lt;/a&gt;のページには、ユーザーが目に見えて依頼を送り続けているチームの項目が集められており、その共通点はツールではない。項目が返信として読めることだ。&lt;/p&gt;
&lt;h2&gt;フィードバックループはどう測定するか&lt;/h2&gt;
&lt;p&gt;出荷された変更のうち、少なくとも一人の依頼者に伝えたものの割合と、出荷から伝達までの時間を測定しよう。二つの数字であり、リンクが存在すればどちらも簡単で、存在しなければどちらも不可能だ。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;クローズ率&lt;/strong&gt;：今月公開されたチェンジログの項目のうち、少なくとも一つの依頼にリンクしていたものはいくつあり、そのうち依頼者に通知したものはいくつあるか。二つ目の数字が一つ目よりずっと低いなら、通知が機能していない。一つ目が低いなら、依頼がpull requestから参照されておらず、その修正はPRテンプレートに一文を加えることだ。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;出荷から伝達までの時間&lt;/strong&gt;：項目が公開されてから依頼者に伝えられるまでの時間。上記の仕組みがあれば数秒だ。手作業では通常数週間か、あるいは永遠に来ない。そしてその「永遠に来ない」が重要な数字だ。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;集めたフィードバックの量でループを測ってはいけない。収集は簡単なステップであり、それを測定するチームはそれを最適化してしまい、より多くの開いたループを生み出すことになる。&lt;/p&gt;
&lt;h2&gt;ロードマップはどこに位置づけられるか&lt;/h2&gt;
&lt;p&gt;公開ロードマップは、ループを早い段階で閉じる一つの方法だ。依頼者に、彼らの依頼が出荷される前にすでに聞き届けられていたと伝える。有用ではあるが、最後のステップの代わりにはならない。「予定」は未来についての約束であり、「出荷済み」は現在についての事実だ。&lt;a href=&quot;https://changeloop.dev/blog/ja/public-roadmap/&quot;&gt;公開ロードマップ&lt;/a&gt;を同じissueから、列ごとに一つのラベルで運用しよう。そうすれば同じ依頼が、どこにも再入力されることなく予定から出荷済みへと移動する。出荷済みへの移動はラベルの変更（&lt;code&gt;roadmap:shipped&lt;/code&gt;）であり、項目が承認されても何かが代わりにやってくれるわけではないので、同じレビューの中で行おう。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;顧客フィードバックループの四つのステップとは何か?&lt;/strong&gt;
収集、決定、出荷、伝達だ。四つ目のステップが起こるまでループは開いている。多くのフレームワークは中間に分析や優先順位付けのステップを加えるが、それらは「決定」の精緻化にすぎず、どれも何かを閉じるものではない。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;依頼を却下する場合も顧客に伝えるべきか?&lt;/strong&gt;
そうすべきであり、それはループの中で最も見過ごされているメッセージだ。「これは行わない、その理由はこうだ」という明確な言葉は待ちを終わらせる。沈黙はループを永遠に開いたままにし、顧客に確認させ続けることになる。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ループを閉じることと機能を告知することはどう違うのか?&lt;/strong&gt;
告知は全員に向けて送られる。ループを閉じることは、依頼してきた人々に、彼らが依頼した経路で返信することだ。両方を行おう。それらは異なる読者への異なるメッセージだ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;依頼者がGitHubを使っていない場合はどうするか?&lt;/strong&gt;
ほとんどの依頼者は使っていないが、それで問題ない。ウィジェットは送ったものの状況を、出荷済みの項目とそのリンクも含めて表示し続けるので、彼らには書き込んだページ以外に何も必要ない。issueへのコメントは、リポジトリを見られる人のためのものだ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;このループはGitHubの代わりにGitLabやBitbucketでも機能するか?&lt;/strong&gt;
ウィジェットとチェンジログは機能するが、ステップ五の自動コメントは今のところ機能しない。GitLabやBitbucketを使うチームでも、すべての提出は受け取られ、issueとして記録され、依頼者にはウィジェットで状況が表示されるが、そのループをissue自体に閉じて戻す部分だけは、その連携が実現するまで手作業で行うステップになる。&lt;/p&gt;
</content:encoded></item><item><title>チェンジログの項目になる機能要望テンプレート</title><link>https://changeloop.dev/blog/ja/feature-request-template/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/feature-request-template/</guid><description>出荷された機能の依頼を見つけられなければ、機能要望は役に立たない。依頼を振り分けるラベルの付け方と、チェンジログが後で読む各項目の中身を説明する。</description><pubDate>Sat, 29 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;機能要望テンプレートとは、四つの質問からなるフォームだ。その人が何をしようとしているか、何がそれを阻んでいるか、代わりに何を試したか、そして完了したときにどう知らされたいか。それ以外によく見られるもの、つまり優先度の選択肢、工数の見積もり、ビジネス価値のスコアなどは、依頼を受け取るチームのためのものであり、送る側の人はそれを間違って埋めることになる。&lt;/p&gt;
&lt;p&gt;整った依頼はテンプレートの正しいテストではない。正しいテストはこうだ。六か月後、その機能が出荷されたとき、誰かがその依頼を見つけ、理解し、それを書いた人に伝えられるか。ほとんどのテンプレートは受付のために設計されている。これはループが閉じる日のために設計されている。&lt;/p&gt;
&lt;h2&gt;機能要望テンプレートには何を含めるべきか&lt;/h2&gt;
&lt;p&gt;目標、障害、回避策、そして依頼者へと戻る道を含めるべきだ。その順番で四つのフィールドがあり、それぞれが後でチームが尋ねることになる問いに答えている。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;フィールド&lt;/th&gt;
&lt;th&gt;後で答える問い&lt;/th&gt;
&lt;th&gt;フォームにある理由&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;何をしようとしているか？&lt;/td&gt;
&lt;td&gt;私たちが作った機能は彼らが必要としていたものか？&lt;/td&gt;
&lt;td&gt;目標は特定の提案よりも長く生き残る&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;今日、何がそれを阻んでいるか？&lt;/td&gt;
&lt;td&gt;「完了」とはどんな状態か？&lt;/td&gt;
&lt;td&gt;修正方法を規定せずにギャップだけを名指しする&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;代わりに何をしているか？&lt;/td&gt;
&lt;td&gt;実際どれほど緊急なのか？&lt;/td&gt;
&lt;td&gt;苦痛な回避策は優先度の選択肢よりも強いシグナルだ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;どう伝えればよいか？&lt;/td&gt;
&lt;td&gt;「出荷済み」のメッセージは誰に届くか？&lt;/td&gt;
&lt;td&gt;ほとんどのテンプレートが省いているフィールドだ&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;意図的に含まれていないもの：必須フィールドとしての提案された解決策（コメントとしては歓迎だが、枠組みとしては間違っている）、優先度の選択肢（すべての投稿者が「高」を選ぶ）、そして工数や価値の見積もり（それはトリアージ後のチームの仕事だ）。解決策を尋ねるテンプレートはボタンについての依頼を集め、目標を尋ねるテンプレートは成果についての依頼を集める。そして成果こそが、チェンジログの項目が書かれる対象だ。&lt;/p&gt;
&lt;h2&gt;テンプレート&lt;/h2&gt;
&lt;p&gt;これは私たちが使っているGitHub issueテンプレートをフォームとして示したものだ。&lt;code&gt;.github/ISSUE_TEMPLATE/feature_request.yml&lt;/code&gt;に貼り付ければ、New Issueページで構造化されたフォームとしてレンダリングされる。これを通じてファイルされた依頼は、フィードバックウィジェットからファイルされたものと同じフィールドを持つissueとして着地し、それが次のセクションで重要になる。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;name: Feature request
description: What you are trying to do, and what stops you.
labels: [&amp;quot;feature-request&amp;quot;]
body:
  - type: textarea
    id: goal
    attributes:
      label: What are you trying to do?
      description: &amp;gt;-
        The outcome, not the button. &amp;quot;Export a month of invoices as one
        PDF&amp;quot; beats &amp;quot;add a PDF export&amp;quot;.
    validations:
      required: true
  - type: textarea
    id: blocker
    attributes:
      label: What stops you today?
      description: &amp;gt;-
        Where the product runs out. An error, a missing option, a limit.
    validations:
      required: true
  - type: textarea
    id: workaround
    attributes:
      label: What do you do instead?
      description: &amp;gt;-
        The spreadsheet, the script, the manual step. &amp;quot;Nothing, I gave
        up&amp;quot; is a valid answer.
  - type: input
    id: contact
    attributes:
      label: How should we tell you when it ships?
      description: &amp;gt;-
        An email address, or leave blank to be notified only on this
        issue.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;二つの詳細が仕事をしている。&lt;code&gt;labels: [&amp;quot;feature-request&amp;quot;]&lt;/code&gt;は、誰かがトリアージするのを待つのではなく、作成時点で依頼が分類されることを意味する。そして最後のフィールドが存在するのは、「お知らせします」が約束であり、約束には宛先が必要だからだ。&lt;/p&gt;
&lt;h2&gt;機能要望はどんなラベルを持つべきか&lt;/h2&gt;
&lt;p&gt;機能要望は、それが何であるかを示すラベル、どれほど緊急かを示すラベル、そしてどこから来たかを示すラベルを一つずつ持つべきだ。三つのラベル、三つの軸、それぞれが異なる読み手によって読まれる。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ラベル&lt;/th&gt;
&lt;th&gt;値&lt;/th&gt;
&lt;th&gt;誰が読むか&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;種類&lt;/td&gt;
&lt;td&gt;&lt;code&gt;feature-request&lt;/code&gt;、&lt;code&gt;bug&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;どのキューに入るかを決める人&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;優先度&lt;/td&gt;
&lt;td&gt;&lt;code&gt;priority:low&lt;/code&gt;、&lt;code&gt;priority:medium&lt;/code&gt;、&lt;code&gt;priority:high&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;次のサイクルを計画する人&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;出所&lt;/td&gt;
&lt;td&gt;&lt;code&gt;from-widget&lt;/code&gt;、&lt;code&gt;from-form&lt;/code&gt;、&lt;code&gt;from-support&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;依頼がどこから来るかを測定する人&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;ウィジェットは投稿をissueとしてファイルする際に、最初の二つの軸と&lt;code&gt;from-widget&lt;/code&gt;を適用する。&lt;code&gt;from-form&lt;/code&gt;と&lt;code&gt;from-support&lt;/code&gt;は、それ以外の経路で届く依頼のための提案だ。ウィジェットのラベルは、種類（&lt;code&gt;bug&lt;/code&gt;か&lt;code&gt;feature-request&lt;/code&gt;かは、メッセージだけから分類器が判断する）、優先度（落ち着いた具体的なクラッシュレポートは高、すでに尋ねられたものの重複は低、セキュリティ問題を少しでも示唆するものは言い回しにかかわらず&lt;code&gt;bug&lt;/code&gt;かつ高)、そして&lt;code&gt;from-widget&lt;/code&gt;だ。同じ三つの軸は、上記のテンプレートを通じて手作業で届く依頼にも同様に機能する。それこそが要点だ。依頼はどこから入ってきても依頼であるということだ。&lt;/p&gt;
&lt;p&gt;もう一つの慣習がある。ウィジェットは、投稿者のメールアドレスをissue本文から取り除いてからファイルする。issueは公開されている可能性のあるリポジトリの中にあるからだ。代わりに投稿の参照番号が入る。アドレスはissueに入らず、投稿者は結果をウィジェットそのもので追う。あなたのトラッカーがチーム外から見える場合は、連絡先フィールドについても同じことをしよう。&lt;/p&gt;
&lt;h2&gt;機能要望はどのようにチェンジログの項目になるか&lt;/h2&gt;
&lt;p&gt;機能要望がチェンジログの項目になるのは、pull requestがそのissueをクローズし、そのpull requestから下書きされた項目がそこへリンクし返すときだ。仕組みはGitHub自身のクローズキーワードだ。説明に&lt;code&gt;Fixes #142&lt;/code&gt;と書かれたPRは、マージ時にissue 142をクローズする。チェンジログの項目がマージされたpull requestから下書きされているなら、その下書きはissue番号を一緒に運ぶことができ、項目は誰が依頼したかを知っている。&lt;/p&gt;
&lt;p&gt;それが、テンプレートが解決策ではなく目標を尋ねる理由だ。項目が書かれるとき、目標こそが書き手が必要とする文になる。「請求書を一か月分まとめて一つのPDFとしてエクスポートできるようになりました」はチェンジログの項目だ。「PDFエクスポートを追加」はコミットメッセージだ。pull requestから下書きする&lt;a href=&quot;https://changeloop.dev/changelog-tools&quot;&gt;チェンジログツール&lt;/a&gt;は収集とリンクを担えるが、言い回しには依然として人間が必要であり、その人間には目標が必要だ。&lt;/p&gt;
&lt;h2&gt;出荷されたとき何が起きるか&lt;/h2&gt;
&lt;p&gt;依頼者には、項目へのリンク付きで知らされる。私たちの仕組みでは、ウィジェットから届いた依頼についてはそれが自動で行われる。人間がその項目を承認した後にissueに投稿される「Shipped — &amp;lt;項目のタイトル&amp;gt;」というコメントであり、公開された項目へのリンクを持つ。同時に、ウィジェットは投稿者に同じ項目を表示する。このテンプレートから手でファイルされたissueには自動のコメントは付かないので、同じルールに従って自分でそのループを閉じよう。コメントがマージ時ではなく承認時に投稿されるのは意図的だ。何かがまだ公開されていないうちにそれが公開されていると述べるコメントは、タイムスタンプ付きの破られた約束になるからだ。それぞれの依頼は多くとも一度だけ通知される。同じ項目を二度承認しても、二つ目のコメントは生まれない。&lt;/p&gt;
&lt;p&gt;これを手作業で行うなら、ルールは同じだ。pull requestの時点でループを閉じてはいけない。公開された項目からループを閉じ、それを一度だけにしよう。&lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;フィードとウィジェット&lt;/a&gt;は同じ項目を、依頼していなかったほとんどの人々に運ぶ。コメントは依頼した本人のためのものだ。&lt;/p&gt;
&lt;h2&gt;なぜほとんどの機能要望テンプレートは失敗するのか&lt;/h2&gt;
&lt;p&gt;それらはトリアージを楽にするために設計されており、それには成功しているが、依頼者にとって唯一重要な瞬間を犠牲にしている。十二個のフィールドを持つテンプレートは依頼の数が減り、集まる依頼は十二個のフィールドを埋める忍耐を持つ人々からのものになる。それは機能を必要としている人々とは同じ集団ではない。四つのフィールドを持ち、そのうちの一つが「どう連絡すればよいか」であるテンプレートは、より多くの依頼を集め、そのすべてに応えることができる。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;機能要望テンプレートは優先度を尋ねるべきか?&lt;/strong&gt;
いいえ。代わりに回避策を尋ねよう。「毎週金曜日にスプレッドシートにエクスポートして手で入力し直しています」は、投稿者が「高」に設定したドロップダウンよりも優先度について多くを語る。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;依頼者は解決策を提案すべきか?&lt;/strong&gt;
自由記述の中でならできる。それを枠組みにしてはいけない。解決策として書かれた依頼は、互いにマージしにくく、それについてチェンジログの項目を書くのも難しくなる。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;機能要望は公開ロードマップに載るべきか?&lt;/strong&gt;
計画されたら、そうすべきだ。同じissueへのラベルがそれを「計画済み」の列に置き、依頼者はそれが動くのを見ることができる。&lt;a href=&quot;https://changeloop.dev/blog/ja/public-roadmap/&quot;&gt;公開ロードマップ&lt;/a&gt;の記事がその仕組みだ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;重複はどう扱えばよいか?&lt;/strong&gt;
新しい依頼を既存のissueにリンクし、低優先度のラベルを付けよう。クローズしてはいけない。それぞれの重複は、出荷されたときに伝えるべきもう一人だ。Changeloopの自動コメントでは、pull requestがその人のissueも指定している場合（&lt;code&gt;Fixes #142, fixes #187&lt;/code&gt;）にだけ、その人に伝わる。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;テンプレートはどこに置くべきか?&lt;/strong&gt;
pull requestを受け取ることになるリポジトリの中だ。そうすればクローズキーワードが機能する。別のトラッカーにある依頼はマージ時に手作業でリンクしなければならず、そのステップこそが省略されがちなものだ。&lt;/p&gt;
</content:encoded></item><item><title>issueトラッカーから作る三列の公開ロードマップ</title><link>https://changeloop.dev/blog/ja/public-roadmap/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/public-roadmap/</guid><description>公開ロードマップは未来の約束だから、小さく保ち、すでに追跡しているissueから組み立てる。各項目はラベル一つで列から列へ動かす形にしよう。</description><pubDate>Sat, 29 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;公開ロードマップとは、顧客が見られる場所に公開された、あなたが構築しようとしているものの一覧だ。仕事をしている言葉は&lt;em&gt;意図する&lt;/em&gt;だ。ロードマップとは未来についての一連の約束であり、そこにある項目のそれぞれは、守られるか、守られなかったと見なされるかのどちらかになる。それこそがロードマップを公開する理由であり、同時に、ほとんどの公開ロードマップが四半期のうちに古びてしまう理由でもある。生き残るバージョンは小さく、すでに維持しているデータから導出され、その先の端でチェンジログに接続されており、誰かがそれを再入力することなく約束が事実に変わっていく。&lt;/p&gt;
&lt;h2&gt;公開ロードマップは何のためにあるのか&lt;/h2&gt;
&lt;p&gt;公開ロードマップは、依頼を持つ顧客に、その依頼が出荷される前にすでに聞き届けられていたことを伝える。それはループを閉じることの前半にあたる。「計画済み」は「誰かがこれを読んだか」という問いに答え、「構築中」は「実際に起きているのか」という問いに答える。どちらも最後のステップ、つまり出荷されたときに依頼者に伝えることの代わりにはならないが、両方とも、その間に尋ねてくる人の数を減らしてくれる。&lt;/p&gt;
&lt;p&gt;それはチームのためにも一つのことをしてくれる。公開のコミットメントを強制することであり、それは誰も作らない四百個の項目を静かに抱え込んだバックログに対する、知られている中で最も安価な治療法だ。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;列&lt;/th&gt;
&lt;th&gt;それが行う約束&lt;/th&gt;
&lt;th&gt;何が項目をそこへ動かすか&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;計画済み&lt;/td&gt;
&lt;td&gt;これを構築するつもりだ&lt;/td&gt;
&lt;td&gt;決定が、issueへのラベルとして記録される&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;構築中&lt;/td&gt;
&lt;td&gt;誰かが今それに取り組んでいる&lt;/td&gt;
&lt;td&gt;issueへの&lt;code&gt;roadmap:building&lt;/code&gt;ラベル&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;出荷済み&lt;/td&gt;
&lt;td&gt;それは公開されている&lt;/td&gt;
&lt;td&gt;&lt;code&gt;roadmap:shipped&lt;/code&gt;ラベル、またはそのラベルが付いたままissueをクローズすること&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;固定された順序での三つの列で十分だ。四つ目の列（「検討中」「レビュー待ち」「バックログ」）は、善意が博物館になっていく場所であり、顧客が最初に無視することを学ぶ列でもある。&lt;/p&gt;
&lt;h2&gt;ロードマップを公開すべきか&lt;/h2&gt;
&lt;p&gt;小さく正直に保てるなら公開しよう。その代替が「かもしれない」の長いリストなら非公開にしておこう。公開ロードマップのコストは公開すること自体とは関係がない。そこにあるすべての項目は今や、サポート、営業の電話、更新の会話の中で誰かが尋ねてくる問いになる。あなたが構築する十個の項目は資産だ。あなたが構築するかもしれない六十個の項目は、なぜやらなかったのかについての六十回の未来の会話だ。&lt;/p&gt;
&lt;p&gt;公開しない正直な理由が二つある。あなたの計画が四半期より速く変わる場合、あるいは競合他社が顧客よりも注意深くあなたのロードマップを読んでいる場合だ。どちらも現実的であり、どちらにも、何も公開しないことではなく、より少なく公開することで答えられる。「構築中」だけを公開し、「計画済み」は社内に留めておいても、依頼者に自分のissueが動いていることは伝わる。&lt;/p&gt;
&lt;h2&gt;GitHubのissueからどうやって公開ロードマップを構築するか&lt;/h2&gt;
&lt;p&gt;すでに追跡しているissueに列ごとのラベルを付け、ラベル付きのissueをロードマップとしてレンダリングしよう。何も再入力する必要はなく、ロードマップが実際の作業からずれることはなく、顧客の依頼として始まった同じissueが、アイデンティティを変えることなく列を移動していく。&lt;/p&gt;
&lt;p&gt;私たちが実行している仕組みはこうだ。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;列ごとに一つのラベル、固定されたプレフィックス付き&lt;/strong&gt;：&lt;code&gt;roadmap:planned&lt;/code&gt;、&lt;code&gt;roadmap:building&lt;/code&gt;、&lt;code&gt;roadmap:shipped&lt;/code&gt;。接続されたリポジトリの中でこれらのいずれかを持つissueは、その列に現れる。どれも持たないissueはロードマップに載らない。それがほとんどのissueであり、それは正しい。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;列は常に同じ順序の配列だ。&lt;/strong&gt; 計画済み、構築中、出荷済み。名前をキーとするマップではないため、読み手（あるいはウィジェット)が順序を推測する必要は一度もない。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;issueが二つのラベルを持つ場合、最も進んでいる方が勝つ。&lt;/strong&gt; 誰かが&lt;code&gt;roadmap:planned&lt;/code&gt;を外す前に&lt;code&gt;roadmap:shipped&lt;/code&gt;を追加することもあるだろう。「最後に届いたウェブフックがどちらか」で動く状態機械は、イベントの到着順によって項目を異なる列に置いてしまう。ラベルの集合だけから決めることで、イベントがどんな順序で届いても答えは同じになる。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;出荷済みは、他と同じくラベルの状態だ。&lt;/strong&gt; issueに&lt;code&gt;roadmap:shipped&lt;/code&gt;が付いたとき、またはそのラベルが付いたままクローズされたときにカードが移動する。カード自体はチェンジログの項目にリンクしない。詳細が載るのは、issueをクローズしたpull requestから下書きされた項目のほうだ。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;データとして提供する。&lt;/strong&gt; ロードマップはこの三つの列を持つJSONドキュメントであり、チェンジログのフィードと同じキャッシュヘッダーとともに公開される。そうすればドキュメントサイト、ウィジェット、ステータスページは、二つ目の統合を作ることなくそれをレンダリングできる。&lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;フィードのドキュメント&lt;/a&gt;が正確な形を示している。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ラベル一つはメンテナーに求めるものとしては小さく、それが統合のすべてだ。同期を保つべきボードもなく、ログインすべき別のツールもなく、顧客がファイルした依頼こそがロードマップ上の項目であり、それが出荷されたときも、同じ項目のままだ。&lt;/p&gt;
&lt;h2&gt;公開ロードマップに含めるべきでないものは何か&lt;/h2&gt;
&lt;p&gt;日付、見積もり、そして九か月後に尋ねられて困るようなものは含めるべきではない。日付は典型的な間違いだ。ロードマップ上の四半期は営業資料の中でコミットメントになり、それは「あなたはQ3と言った」というタイトルのチケットになる。列で十分に伝わる。「構築中」はすでに「誰かが取り組んでいるくらい近い」を意味している。&lt;/p&gt;
&lt;p&gt;社内のバックログも含めるべきではない。三百個の項目を持つロードマップは約束ではなく検索の問題であり、自分の依頼が212番目にあるのを見つけた顧客は、あなたが伝えるつもりのなかったことを学んでしまう。&lt;/p&gt;
&lt;h2&gt;ロードマップはチェンジログとどうつながるか&lt;/h2&gt;
&lt;p&gt;ロードマップとチェンジログは、同じissueを二つの側から記述するものであり、一方は未来のため、もう一方は過去のためだ。別のボードでカードを動かす人はいない。メンテナーはすでに作業しているissueのラベルを変え、項目はpull requestから下書きされ、人間がその項目を承認すると、ウィジェットからのフィードバックがそのissueになった依頼者は、そこで知らされる。カードを出荷済みに動かすのは依然として独立したステップ、つまり&lt;code&gt;roadmap:shipped&lt;/code&gt;ラベルなので、同じレビューの一部にしよう。項目を承認しても、それは代わりに行われない。&lt;/p&gt;
&lt;p&gt;これは&lt;a href=&quot;https://changeloop.dev/blog/ja/customer-feedback-loop/&quot;&gt;フィードバックループの記事&lt;/a&gt;がチェンジログ側から説明しているのと同じループであり、ロードマップはその途中で顧客が目にするものだ。&lt;a href=&quot;https://changeloop.dev/changelog-tools&quot;&gt;チェンジログツール&lt;/a&gt;のまとめは、どの製品がロードマップビューを提供し、どれを別のボードとして扱っているかを取り上げている。それこそが、それが正確であり続けるかどうかを決める違いだ。&lt;/p&gt;
&lt;h2&gt;良い公開ロードマップとはどんなものか&lt;/h2&gt;
&lt;p&gt;短く見え、そこにあるすべての項目が誰かが開けるissueである。テストは、顧客がある項目からその背後にある議論へ、そして出荷済みの項目から実際に何が変わったかを説明する項目へと辿れるかどうかだ。入り口のない機能名の一覧であるロードマップはパンフレットにすぎない。&lt;/p&gt;
&lt;p&gt;ウィジェットが取得するJSONとしての具体例を挙げよう。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &amp;quot;columns&amp;quot;: [
    { &amp;quot;column&amp;quot;: &amp;quot;planned&amp;quot;, &amp;quot;hasMore&amp;quot;: false, &amp;quot;items&amp;quot;: [
      { &amp;quot;id&amp;quot;: &amp;quot;6b0c1f...&amp;quot;, &amp;quot;column&amp;quot;: &amp;quot;planned&amp;quot;,
        &amp;quot;publicTitle&amp;quot;: &amp;quot;Saved views on the inbox&amp;quot;,
        &amp;quot;publicDescription&amp;quot;: &amp;quot;Keep a filter you use often and come back to it.&amp;quot;,
        &amp;quot;publishedAt&amp;quot;: &amp;quot;2026-09-16T10:04:11.000Z&amp;quot; }
    ]},
    { &amp;quot;column&amp;quot;: &amp;quot;building&amp;quot;, &amp;quot;hasMore&amp;quot;: false, &amp;quot;items&amp;quot;: [
      { &amp;quot;id&amp;quot;: &amp;quot;71a4e2...&amp;quot;, &amp;quot;column&amp;quot;: &amp;quot;building&amp;quot;,
        &amp;quot;publicTitle&amp;quot;: &amp;quot;Roadmap column in the widget&amp;quot;,
        &amp;quot;publicDescription&amp;quot;: &amp;quot;See what is coming without leaving the page.&amp;quot;,
        &amp;quot;publishedAt&amp;quot;: &amp;quot;2026-09-12T08:20:02.000Z&amp;quot; }
    ]},
    { &amp;quot;column&amp;quot;: &amp;quot;shipped&amp;quot;, &amp;quot;hasMore&amp;quot;: false, &amp;quot;items&amp;quot;: [
      { &amp;quot;id&amp;quot;: &amp;quot;5c9d70...&amp;quot;, &amp;quot;column&amp;quot;: &amp;quot;shipped&amp;quot;,
        &amp;quot;publicTitle&amp;quot;: &amp;quot;Feedback filed as labelled issues&amp;quot;,
        &amp;quot;publicDescription&amp;quot;: &amp;quot;Widget submissions arrive as issues your triage already handles.&amp;quot;,
        &amp;quot;publishedAt&amp;quot;: &amp;quot;2026-09-02T15:41:37.000Z&amp;quot; }
    ]}
  ],
  &amp;quot;enabled&amp;quot;: true,
  &amp;quot;language&amp;quot;: &amp;quot;en&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;三つの列にわたる三つの項目は、それだけで十分に良い公開ロードマップだ。何が来るのか、何が起きているのか、何が起きたのかを述べており、そのすべての行が確認可能だ。ナウ・ネクスト・レイターから成果ベースまで、ほかの5つのレイアウトは、サンプルの項目とともに&lt;a href=&quot;https://changeloop.dev/blog/ja/product-roadmap-examples/&quot;&gt;プロダクトロードマップの例&lt;/a&gt;で示している。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;公開ロードマップにはいくつの項目があるべきか?&lt;/strong&gt;
擁護できる範囲でできるだけ少なく。小さな製品であれば全列合わせて十未満が普通であり、「計画済み」に三十以上あるのは、ロードマップの衣をまとったバックログだ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;公開ロードマップに日付を入れるべきか?&lt;/strong&gt;
いいえ。列は締め切りを作らずに順序を伝える。顧客が日付を必要としているなら、それはロードマップの項目ではなく会話の話題だ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;顧客はロードマップの項目に投票すべきか?&lt;/strong&gt;
投票は何が重要かではなく、誰が現れたかを測定してしまう。今日使っている回避策を説明するissueへのコメント一つの方が、五十票よりも価値があり、それは投票者に何かを費やさせるという点が重要だ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;キャンセルされたロードマップの項目はどうなるか?&lt;/strong&gt;
ラベルを外し、理由をissueで述べよう。公開の場での「これは行わない」はループの一部であり、それはほとんどのチームが決して送らないメッセージだ。&lt;/p&gt;
</content:encoded></item><item><title>チェンジログの自動化と、その限界について</title><link>https://changeloop.dev/blog/ja/changelog-automation/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/changelog-automation/</guid><description>収集、フォーマット、公開は自動化してよいが、選定と言い回しは自動化してはならない。チェンジログ実務での境界線と、それが動いたときの影響を見ていく。</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;チェンジログの自動化がうまく機能するのは、収集、分類、公開を自動化し、選定と言い回しで止まるときだ。すべてを自動化すればフォーマットされたgit logを出荷することになる。何も自動化しなければ、チェンジログはリリース前に記憶から一気に書かれることになる。有用な問いは、どれだけ自動化するかではなく、どの部分を自動化するかだ。&lt;/p&gt;
&lt;p&gt;チェンジログ自動化のプロジェクトは、二つの方向のどちらかで失敗し、どちらも最初の設計ミーティングの時点で予測可能だ。自動化しすぎないと、チェンジログは誰かが更新すべき文書になり、それは短い籤を引いた誰かによって断続的に更新されることを意味する。自動化しすぎると、フォーマットされたgit logになる。完全で正確だが、誰にも読まれない。&lt;/p&gt;
&lt;h2&gt;チェンジログのどの部分を自動化すべきか&lt;/h2&gt;
&lt;p&gt;四つのステップのうち三つ。収集と公開は完全に。分類は人間の上書きを伴う一次通過として。選定と言い回しは決して自動化しない。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ステップ&lt;/th&gt;
&lt;th&gt;自動化すべきか&lt;/th&gt;
&lt;th&gt;理由&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;収集：コミット、PR、チケットからの変更をリストへ&lt;/td&gt;
&lt;td&gt;完全に&lt;/td&gt;
&lt;td&gt;退屈で締め切りの下で飛ばされがちだが、機械は完璧にこなす&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;分類：Added、Fixed、Changed、Deprecated、Removed、Security&lt;/td&gt;
&lt;td&gt;一次通過、人間の上書き&lt;/td&gt;
&lt;td&gt;メタデータだけで約80%は正しいが、誤った20%こそ重要な項目だ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;選定と言い回し：読者に何を伝えるか、どう伝えるか&lt;/td&gt;
&lt;td&gt;決してしない&lt;/td&gt;
&lt;td&gt;これが成果物のすべての価値だ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;公開：ページ、フィード、メール、ウィジェット、Slack&lt;/td&gt;
&lt;td&gt;完全に、一つのソースから&lt;/td&gt;
&lt;td&gt;実際に手作業の大半が費やされる場所&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;収集。&lt;/strong&gt; 変更が起きる場所（コミット、PR、チケット）から取り出してリストにすること。これは完全に自動化しよう。人間はこれが苦手で、退屈で、締め切りの下で飛ばされがちなステップだ。&lt;a href=&quot;https://changeloop.dev/blog/ja/conventional-commits-changelog/&quot;&gt;Conventional commits&lt;/a&gt;やPRのラベルが通常の原材料になる。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;分類。&lt;/strong&gt; 何かがAdded、Fixed、Changed、Deprecated、Removed、Securityのどれかを決めること。コミットタイプやPRラベルから一次通過を自動化し、人間に上書きさせよう。精度はメタデータだけで約80パーセントであり、誤った20パーセントはまさに重要な項目に集中している。あいまいさが重要性と相関しているからだ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;選定と言い回し。&lt;/strong&gt; 読者に何を伝えるべきか、どう伝えるかの決定。&lt;strong&gt;これは自動化してはならない。&lt;/strong&gt; これが成果物のすべての価値だ。それ以外はすべてロジスティクスにすぎない。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;公開。&lt;/strong&gt; 完成した項目をページ、フィード、メール、アプリ内ウィジェット、Slackチャンネルへ届けること。完全に、一つのソースから自動化しよう。実際に手作業の大半が費やされるのはここであり、ほとんど誰もそれを数えていない。これはまた、変更を求めた人にそれが出荷されたと伝えられるステップでもあり、それが&lt;a href=&quot;https://changeloop.dev/blog/ja/customer-feedback-loop/&quot;&gt;チェンジログ側からのフィードバックループの完結&lt;/a&gt;のすべての内容だ。そのステップのメールに関する半分は、&lt;a href=&quot;https://changeloop.dev/blog/ja/product-update-email/&quot;&gt;プロダクトアップデートメールのテンプレート&lt;/a&gt;で扱っている独自の形を持つ。&lt;/p&gt;
&lt;p&gt;最後の点は考える価値がある。チームはチェンジログを執筆の問題と見なしがちで、その後ほとんどの時間を配布に費やす。項目をメールツールにコピーし、アプリ内用に再フォーマットし、Slackに貼り付け、ドキュメントページを更新する。執筆には一時間かかる。コピーは各リリースごとに一時間かかり、それが永遠に続く。それは機械が担うべき部分だ。&lt;/p&gt;
&lt;h2&gt;境界線が動くと何が起こるか&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;上に動かすとgitのダンプになる。&lt;/strong&gt; コミットからの完全な自動化は、顧客の前に&lt;code&gt;bump deps&lt;/code&gt;、&lt;code&gt;fix flaky test&lt;/code&gt;、&lt;code&gt;wip&lt;/code&gt;、&lt;code&gt;address review comments&lt;/code&gt;を出荷することになる。これをやったすべてのチームは、その後フィルターを追加し、そのフィルターは別の名前で再導入された選定のステップにすぎず、使い勝手はさらに悪化している。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;下に動かすと一気書きになる。&lt;/strong&gt; 完全に手動の収集は、項目がリリース時に記憶から書かれることを意味する。それは&lt;a href=&quot;https://changeloop.dev/blog/ja/keep-a-changelog-implemented/&quot;&gt;Keep a Changelog&lt;/a&gt;が冒頭から警告しているモードであり、静かに劣化していく。チェンジログは、誰も時間がなかったまさにその週まで、維持されているように見え続ける。&lt;/p&gt;
&lt;h2&gt;チェンジログ自動化のパイプラインはどんな形か&lt;/h2&gt;
&lt;p&gt;四つのステップと、下書きが公開される場所に置かれたちょうど一つの人間のゲート。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;マージ時にPRから下書きの項目を導出する。ラベルまたはコミットの接頭辞からタイプを、最初の下書きとしてタイトルを、PRへのリンクを、記録された著者を。それを未リリースのバケツに入れる。&lt;/li&gt;
&lt;li&gt;誰でもいつでもどの下書きも編集でき、編集は安価だ。ほとんどは一行が書き直される。&lt;/li&gt;
&lt;li&gt;リリースを切るには、バケツ内のすべての項目が編集されるか、明示的に内部向けとしてマークされている必要がある。このゲートが設計のすべてだ。これがなければ、忙しい週に下書きが未編集のまま出荷される。&lt;/li&gt;
&lt;li&gt;公開は、リリースされたセットからの分岐だ。公開ページ、フィード、メール、ウィジェット、Slackの投稿。一つのソース、複数のレンダリング、コピーなし。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ステップ3は人間が必要な唯一の場所であり、下書きがまともであればリリースあたり約十分かかる。顧客の要望が関わる場合、下書きはそれが閉じるissueも運び、それがステップ4に要望者へ知らせることを可能にする。&lt;a href=&quot;https://changeloop.dev/blog/ja/feature-request-template/&quot;&gt;機能要望のテンプレート&lt;/a&gt;は、そのリンクが生き残るように設計されている。このステップが、より広いリリースの流れの中でどこに位置するかは、&lt;a href=&quot;https://changeloop.dev/blog/ja/release-management-process/&quot;&gt;リリース管理プロセス&lt;/a&gt;で扱っている。&lt;/p&gt;
&lt;h2&gt;自動化はあなたのデータに何を求めるか&lt;/h2&gt;
&lt;p&gt;チェンジログがMarkdownファイルであれば、上記のどれも機能しない。ファイルは再パースなしに五つの表面にレンダリングできず、文章をパースすることが、見出しの半分だけを表示するウィジェットになってしまう理由だからだ。&lt;/p&gt;
&lt;p&gt;項目は構造化されている必要がある。タイプ、日付、バージョンまたはリリース識別子、対象読者、本文、リンク。それがあれば、ファイル、ページ、フィード、メールはすべてビューになる。この構造的な点こそが、ツールを選ぶ前に正しくやる価値のある唯一のことだ。後から安く追加できないものだからだ。必要とするすべての変更に対して実際に項目が作られない限り、これらのどれも機能しない。&lt;a href=&quot;https://changeloop.dev/blog/ja/changelog-ci-enforcement/&quot;&gt;CIでチェンジログ項目を必須化する&lt;/a&gt;は、その手順を記憶に任せる代わりに、項目のないマージをパイプラインに拒否させる方法を扱っている。&lt;/p&gt;
&lt;p&gt;私たちは&lt;a href=&quot;https://changeloop.dev/&quot;&gt;changeloop&lt;/a&gt;を構築している。そこではチェンジログはまずフィードであり、その後にページになる。だからこれを中立的な推奨ではなく利害関係として読んでほしい。&lt;a href=&quot;https://changeloop.dev/pricing&quot;&gt;料金&lt;/a&gt;はカード不要の無料リポジトリ一つ分であり、その形を見るには十分だ。&lt;a href=&quot;https://changeloop.dev/changelog-tools&quot;&gt;チェンジログツール&lt;/a&gt;は、私たちが競合する製品も含めて他に何があるかのまとめであり、&lt;a href=&quot;https://changeloop.dev/changelog-generator&quot;&gt;チェンジログジェネレーター&lt;/a&gt;は、パイプラインに踏み出す前に導出を見たい場合に、収集と分類のステップをブラウザで行ってくれる。&lt;/p&gt;
&lt;h2&gt;テスト&lt;/h2&gt;
&lt;p&gt;マージされた変更と、その変更があなたのリポジトリを読まない顧客に見えるようになるまでの分数を数えてみよう。その分数の大半が誰かがツール間でテキストをコピーしている時間であれば、必要な自動化は執筆ではなく公開の側にある。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;AIはチェンジログを書けるか?&lt;/strong&gt;
下書きを作ることはできる。マージされたpull requestを与えられたモデルは、たいていの場合タイトルと本文の使える最初の下書きを生成し、それは収集と分類がより良く行われたものだ。読者に何かを伝えるべきかどうかという選定、そして最終的な言い回しは、依然として対象読者を知る人間を必要とし、そのゲートなしに下書きを公開するパイプラインは、間違ったステップを自動化したことになる。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;チェンジログジェネレーターとチェンジログの自動化の違いは何か?&lt;/strong&gt;
ジェネレーターはコミットを一度、要求に応じてフォーマットされたリストに変換する。自動化はマージのたびに動き、未リリースのバケツを維持し、リリースを人間のレビューに条件付け、一つのソースからすべての表面に公開する。ジェネレーターは、手動で実行されるパイプラインの最初のステップだ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;チェンジログはコミットとpull requestのどちらから自動化すべきか?&lt;/strong&gt;
変更の単位がPRであるpull requestからだ。タイトルと説明は変更全体について一度書かれ、PRは自分が閉じるissueをリンクする。コミットベースの導出は、コミットが単位であり慣習に従っているときに機能する。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;自動化が内部の変更を公開してしまうのをどう防ぐか?&lt;/strong&gt;
&lt;code&gt;chore&lt;/code&gt;、&lt;code&gt;ci&lt;/code&gt;、&lt;code&gt;test&lt;/code&gt;、&lt;code&gt;refactor&lt;/code&gt;、依存関係の更新をデフォルトで内部向けとして分類し、公開への昇格を意識的な行為にしよう。逆のデフォルト、つまり誰かが隠さない限り公開、という状態が、&lt;code&gt;bump deps&lt;/code&gt;が顧客に届いてしまう仕組みだ。&lt;/p&gt;
</content:encoded></item><item><title>チェンジログとリリースノート、その違いはどこにあるのか</title><link>https://changeloop.dev/blog/ja/changelog-vs-release-notes/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/changelog-vs-release-notes/</guid><description>チェンジログは何が変わったかを残す継続的な記録、リリースノートは読み手のために選んだメッセージだ。両者の本質的な違いを分かりやすく整理する。</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;チェンジログとは、変わったことすべての継続的で累積的な記録であり、何かを探している人のために書かれる。リリースノートとは、一つのリリースについての選定されたメッセージであり、自分に関心があるかを判断しようとしている人のために書かれる。違いは書式ではなく読者にある。そしてほとんどのチームは両方を必要とする。一方は参照用に、もう一方は発表用に、同じ項目から導き出される。&lt;/p&gt;
&lt;p&gt;多くのチームは偶然どちらか一方を持ち、もう一方は求められて持つことになる。開発者が出荷したものの記録を欲しがるからチェンジログから始める。数か月後、サポートの誰かが、四月から公開されている機能について顧客が知らなかったのはなぜかと尋ね、そこで初めてリリースノートが必要になる。&lt;/p&gt;
&lt;h2&gt;チェンジログとリリースノート、並べて比較する&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;チェンジログ&lt;/th&gt;
&lt;th&gt;リリースノート&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;読者&lt;/td&gt;
&lt;td&gt;何かを探している人&lt;/td&gt;
&lt;td&gt;関心があるか判断しようとしている人&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;範囲&lt;/td&gt;
&lt;td&gt;変わったことすべて&lt;/td&gt;
&lt;td&gt;このリリースについて言う価値のあること&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;頻度&lt;/td&gt;
&lt;td&gt;継続的、マージやリリースごと&lt;/td&gt;
&lt;td&gt;リリースごと、発表する価値のあるものだけ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;トーン&lt;/td&gt;
&lt;td&gt;簡潔で事実的、しばしば命令形&lt;/td&gt;
&lt;td&gt;説明的で、時に説得的&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;寿命&lt;/td&gt;
&lt;td&gt;永続的、何年後でも読まれる&lt;/td&gt;
&lt;td&gt;最初の一週間だけ読まれ、その後アーカイブされる&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;存在場所&lt;/td&gt;
&lt;td&gt;リポジトリ、ドキュメントサイト、&lt;code&gt;/changelog&lt;/code&gt; ページ&lt;/td&gt;
&lt;td&gt;メール、アプリ内、ブログ記事、リリースページ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;失敗の原因&lt;/td&gt;
&lt;td&gt;不完全であること&lt;/td&gt;
&lt;td&gt;退屈であること、あるいは遅すぎること&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;チェンジログとは何か&lt;/h2&gt;
&lt;p&gt;チェンジログとは、変わったことの時系列的でほぼ完全な記録であり、最新のものが先頭にあり、各項目がタイプ分け（added、changed、deprecated、removed、fixed、security）され、日付が付いている。その読者はすでに関心があると決めている。彼らは何かを探している。いつ動作が変わったか、バグが修正されたか、どのバージョンでフラグが導入されたか。完全性がすべての価値であり、だからこそ&lt;a href=&quot;https://changeloop.dev/blog/ja/keep-a-changelog-implemented/&quot;&gt;Keep a Changelog&lt;/a&gt;の慣習は、たった一ページのほとんどを構造に費やし、文章にはほとんど費やさない。&lt;/p&gt;
&lt;h2&gt;リリースノートとは何か&lt;/h2&gt;
&lt;p&gt;リリースノートとは、一つのリリースについての選定された、文章で書かれたメッセージだ。その読者はまだ何も決めていない。このリリースが自分に関係あるか、そして何か対応が必要かを判断しようとしている。選定がすべての価値だ。すべてを列挙するリリースノートは、段落付きのチェンジログにすぎず、何かを省略するチェンジログが読者を裏切るのと同じ方法で、その読者を裏切る。&lt;a href=&quot;https://changeloop.dev/blog/ja/how-to-write-release-notes/&quot;&gt;リリースノートの書き方&lt;/a&gt;は、選定と表現の仕方についての記事だ。&lt;/p&gt;
&lt;h2&gt;チェンジログとリリースノートの両方が必要か&lt;/h2&gt;
&lt;p&gt;二つの読者層が異なるものを求め始めた時点で、両方が必要になる。それまでは、両方の役割を果たす一つの成果物で正しい。小さなチームは、各項目の先頭に短い段落を添えた一つの &lt;code&gt;/changelog&lt;/code&gt; ページを公開し、しばらくの間はそれが、修正を探す開発者と、ニュースを見出す顧客の両方に等しく役立つ。早すぎる分割は、維持すべきものを二つ与え、そのどちらか一方は腐っていく。&lt;/p&gt;
&lt;p&gt;分割の価値が出てくるのは、次のことが起き始めたときだ。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;チェンジログの項目が、開発者が読み飛ばす説明的な段落に膨れ上がっている。&lt;/li&gt;
&lt;li&gt;あるいはその逆。リリース発表が依存関係の更新を列挙し始めている。&lt;/li&gt;
&lt;li&gt;サポートが項目をメールにコピーし、途中で書き直している。&lt;/li&gt;
&lt;li&gt;誰かが「破壊的変更だけ」を求めるが、それをフィルタリングできない。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最後のものが本当のサインだ。すべてを読まなければ「自分に関係ある変更は何か」に誰も答えられないなら、二つの仕事を下手にこなす一つの成果物を持っているということだ。&lt;/p&gt;
&lt;h2&gt;一つのソース、二つのビュー&lt;/h2&gt;
&lt;p&gt;間違いは、それらを二つの文書として扱うことだ。それらは同じ変更の集合に対する二つのビューにすぎない。&lt;/p&gt;
&lt;p&gt;チェンジログは進行に合わせて書く。重要な変更ごとに一項目、それぞれ何であるかを示すラベルを付ける。fixed、added、changed、removed、deprecated、security。一つ書くことが決断にならないくらい、項目を短く保つ。そしてリリースの時点で、リリースノートは選定と書き直しになる。人にとって重要な項目を取り、それが可能にすることでグループ化し、理由を上に置く。&lt;/p&gt;
&lt;p&gt;これには実際的な帰結がある。チェンジログがソースであるなら、それは手動で維持されるページではなく、構造化されたデータである必要がある。項目にはタイプ、日付、バージョン、そして誰のためのものかを示す方法が必要だ。それさえあれば、公開ページ、アプリ内ウィジェット、RSSまたはJSONフィードはすべて一つのものの三つの表示にすぎず、顧客に届くまでの間に誰も何も書き直す必要がない。リリースノートのメールも、メールを送っているツールが何であれ、そこから同じ項目を引用できる。&lt;a href=&quot;https://changeloop.dev/blog/ja/changelog-automation/&quot;&gt;チェンジログの自動化&lt;/a&gt;は、これらのステップのどれを機械が所有すべきかについての記事だ。それがチェンジログをページではなくフィードとして扱うことの、まさにすべての論拠だ。これはまた、完全に透明に言えば、私たちが構築しているものでもある。だからこれを中立的な調査ではなく、利害関係として読んでほしい。&lt;/p&gt;
&lt;h2&gt;どちらか一方にしか時間がないなら&lt;/h2&gt;
&lt;p&gt;チェンジログを書く。項目あたりの費用が安く、書いたその日から役に立ち、リリースノートは後からそこから導出できる。逆は成り立たない。十二通の発表メールから一年分の変更を再構築することはできず、人々はそれをあなたに求めてくる。&lt;/p&gt;
&lt;p&gt;導出が可能であり続けるよう、固定された形式で保つ。私たちの&lt;a href=&quot;https://changeloop.dev/changelog-examples&quot;&gt;チェンジログの例&lt;/a&gt;のページは、それをうまくやっているチームの項目を集めており、&lt;a href=&quot;https://changeloop.dev/release-notes-template&quot;&gt;リリースノートのテンプレート&lt;/a&gt;は、項目の集合を送る価値のあるものへ変える際に使う形式だ。&lt;/p&gt;
&lt;h2&gt;命名についての注意&lt;/h2&gt;
&lt;p&gt;これらはどれも標準化されておらず、「リリースノート」が継続的なリストに使われ、「チェンジログ」が四半期ごとの発表に使われているのを見つけることになる。言葉について争うのは価値がない。あなたのそれぞれの成果物がどちらの役割を果たしているかを決め、あなたのチームがすでに呼んでいる名前で呼び、どちらも密かに両方をこなしていないことを確認する。&lt;/p&gt;
&lt;p&gt;結果がどの表面に着地するかは別の決定であり、&lt;a href=&quot;https://changeloop.dev/blog/ja/changelog-page/&quot;&gt;チェンジログページの作り方&lt;/a&gt;で扱っている。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;チェンジログとリリースノートは同じものか?&lt;/strong&gt;
違う。チェンジログは何かを探している人が読む完全な記録であり、リリースノートは関心があるか判断する人が読む選定された発表だ。同じ変更が両方に現れるが、それぞれの読者向けに異なる表現がされる。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;リリースノートはチェンジログから生成できるか?&lt;/strong&gt;
できる、そしてそれが正しい方向だ。人にとって重要な項目を選び、結果でグループ化し、見出しを書き直す。逆に発表からチェンジログを再構築することは、発表が省略したすべてを失う。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;チェンジログはどこに置くべきか?&lt;/strong&gt;
リポジトリなしで読者が到達できる、永続的でリンク可能などこかに。&lt;code&gt;/changelog&lt;/code&gt; ページ、ドキュメントサイト、あるいは複数の場所でレンダリングされるフィード。&lt;code&gt;CHANGELOG.md&lt;/code&gt; だけでは貢献者には届くが、顧客には届かない。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;チェンジログに内部の変更を含めるべきか?&lt;/strong&gt;
含めるべきだ。末尾に一行ずつ。チェンジログは完全な記録だ。リリースノートにも短い最後のセクションとして残してよいが、読者が気づく変更を先に置くことが条件だ。&lt;/p&gt;
</content:encoded></item><item><title>Conventional commitsからチェンジログへとつなげる方法</title><link>https://changeloop.dev/blog/ja/conventional-commits-changelog/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/conventional-commits-changelog/</guid><description>Conventional commitsはチェンジログを導出可能にするが、読みやすくはしない。この慣習が与えるもの、限界、人間が埋めるべき隙間を具体的に説明する。</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Conventional commitsはチェンジログに三つのことを無料で与えてくれる。各変更のタイプ、それが触れたシステムの部分、そして何かを壊すかどうか。それ以外は何も与えない。言い回し、グループ化、選定、つまりチェンジログそのものは、完全に未解決のままであり、そうではないふりをするパイプラインは、フォーマットされたgit logを出荷することになる。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;feat(exports): add CSV column selection
fix(auth): reject expired refresh tokens
chore(deps): bump node-pg to 8.11
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://www.conventionalcommits.org/&quot;&gt;Conventional Commits&lt;/a&gt;形式の三つのコミット。これらから、機械は一つが機能であり、一つが修正であり、一つが整理であり、それぞれがシステムのどの部分に触れたかを教えてくれる。それは本当に有用であり、この慣習の約束のすべてでもある。人間以外の何かが読めるコミット履歴。誤りは、それがチェンジログを与えてくれると考えることだ。それは原材料を与えてくれるにすぎない。&lt;/p&gt;
&lt;h2&gt;この慣習は何を規定しているか&lt;/h2&gt;
&lt;p&gt;タイプ、任意のスコープ、そして説明。&lt;code&gt;type(scope): description&lt;/code&gt;。タイプは慣習的に&lt;code&gt;feat&lt;/code&gt;、&lt;code&gt;fix&lt;/code&gt;、&lt;code&gt;chore&lt;/code&gt;、&lt;code&gt;docs&lt;/code&gt;、&lt;code&gt;refactor&lt;/code&gt;、&lt;code&gt;test&lt;/code&gt;、&lt;code&gt;perf&lt;/code&gt;、&lt;code&gt;build&lt;/code&gt;、&lt;code&gt;ci&lt;/code&gt;。二つのものが破壊的変更を示す。コロンの前の&lt;code&gt;!&lt;/code&gt;、または&lt;code&gt;BREAKING CHANGE:&lt;/code&gt;フッターだ。ツールはminorとpatchのバージョン更新のために&lt;code&gt;feat&lt;/code&gt;と&lt;code&gt;fix&lt;/code&gt;に依拠し、majorのために破壊的変更のマーカーに依拠する。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;コミットが与えてくれるもの&lt;/th&gt;
&lt;th&gt;チェンジログが必要とするもの&lt;/th&gt;
&lt;th&gt;誰が隙間を埋めるか&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;code&gt;feat&lt;/code&gt; / &lt;code&gt;fix&lt;/code&gt; / &lt;code&gt;chore&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added / Fixed / 内部向け&lt;/td&gt;
&lt;td&gt;マッピング、自動&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;(scope)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;読者が認識できるグループ化&lt;/td&gt;
&lt;td&gt;人間、スコープごとに一度&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;!&lt;/code&gt; または &lt;code&gt;BREAKING CHANGE:&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;誰が壊れるか、いつまでか、何をすべきか&lt;/td&gt;
&lt;td&gt;人間、毎回&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;レビュアー向けに書かれた説明&lt;/td&gt;
&lt;td&gt;顧客向けに書かれた結果&lt;/td&gt;
&lt;td&gt;人間、項目ごと&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;一つのコミット&lt;/td&gt;
&lt;td&gt;複数のコミットになりうる一つの変更&lt;/td&gt;
&lt;td&gt;squashのルール、または人間&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;このマーカーはツールに伝えるだけであり、呼び出し元には伝えない。それは&lt;a href=&quot;https://changeloop.dev/blog/ja/api-deprecation/&quot;&gt;APIの非推奨化&lt;/a&gt;と&lt;a href=&quot;https://changeloop.dev/blog/ja/breaking-changes/&quot;&gt;破壊的変更とは何か&lt;/a&gt;のテーマだ。これは小さな仕様であり、そこから何も生成しなくても従う価値がある。なぜならそれが、変更ごとに一つの決定を強制するからだ。それはユーザーが目にする変更かどうか、という決定だ。&lt;/p&gt;
&lt;h2&gt;Conventional commitsはどこで力尽きるか&lt;/h2&gt;
&lt;p&gt;文章のところで力尽きる。この慣習が捉えるすべては変更についてのメタデータであり、変更そのものはまだレビュアーの語彙で記述されている。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;コミットメッセージはレビュアーのために書かれている。&lt;/strong&gt; &lt;code&gt;fix(auth): reject expired refresh tokens&lt;/code&gt;は正しいが、顧客には何も伝えない。チェンジログの読者は「セッションが実際に期限切れになったときにログアウトされるようになりました。断続的な401を見ることはなくなります」を求めている。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;スコープは内部向けだ。&lt;/strong&gt; &lt;code&gt;exports&lt;/code&gt;、&lt;code&gt;auth&lt;/code&gt;、&lt;code&gt;ingest&lt;/code&gt;はモジュール名であり、安定しているのでグループ化には適しているが、コードベースの外にいる誰にとっても無意味だ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一つの変更はしばしば複数のコミットになる。&lt;/strong&gt; 十一のコミットにわたってマージされた機能は十一の項目を生み出し、そのうち十はノイズであり、それを隠すために圧縮すると、レビュー履歴が失われる。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;chore&lt;/code&gt;はカテゴリではなくゴミ箱だ。&lt;/strong&gt; 依存関係の更新、CIの変更、リネームはすべてそこに落ち、そのうちいくつかはユーザーに関係あるが、大半はそうではない。&lt;/p&gt;
&lt;p&gt;つまり、この慣習はタイプ、スコープ、破壊的かどうかの状態を無料で与えてくれ、言い回し、グループ化、選定を完全に未解決のままにする。この三つがチェンジログそのものだ。
&lt;a href=&quot;https://changeloop.dev/blog/ja/changelog-entry-ownership/&quot;&gt;チェンジログの項目は実際には誰が所有すべきか&lt;/a&gt;は、その
言い回し、グループ化、選定を誰が担うべきかを扱っている。慣習そのものはそれについて何の意見も
持っていないからだ。&lt;/p&gt;
&lt;h2&gt;Conventional commitsからどのようにチェンジログを生成するか&lt;/h2&gt;
&lt;p&gt;二つの層で行い、二つ目は必須でなければならない。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;層一、自動。&lt;/strong&gt; マージ時に、コミットから下書きの項目を導出する。タイプをチェンジログのタイプにマッピングし（&lt;code&gt;feat&lt;/code&gt;をAddedに、&lt;code&gt;fix&lt;/code&gt;をFixedに、破壊的変更のマーカーをフラグ付きのChangedに）、スコープはテキストではなくメタデータとして保持し、PRへのリンクを持たせる。それを&lt;a href=&quot;https://changeloop.dev/blog/ja/keep-a-changelog-implemented/&quot;&gt;Keep a Changelog&lt;/a&gt;が求めるUnreleasedセクションに置く。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;層二、人間、そして必須。&lt;/strong&gt; リリースが出る前に、それぞれの下書きの項目は、ユーザーの語彙での一行の書き直しを受けるか、内部向けとしてマークされて公開ビューから外される。これは人々が飛ばそうとするステップであり、それを飛ばすことがdiffのように読めるチェンジログを生み出す。&lt;/p&gt;
&lt;p&gt;重要な設計上の詳細は、層二がパイプライン内でオプションではないということだ。編集されていない下書きでリリースが切られてしまうなら、全員が忙しい週にそれが起こる。どのステップが機械のもので、どれが人間のものかが、&lt;a href=&quot;https://changeloop.dev/blog/ja/changelog-automation/&quot;&gt;チェンジログの自動化&lt;/a&gt;のすべての内容だ。&lt;/p&gt;
&lt;p&gt;リリースを切ることは、Gitタグ、リリース、このチェンジログのエントリが噛み合うか、それとも同期しなくなり始めるかの瞬間でもある。&lt;a href=&quot;https://changeloop.dev/blog/ja/git-tags-releases-changelog/&quot;&gt;Gitタグ、リリース、そしてあなたのチェンジログ&lt;/a&gt;が三つを同期させ続ける方法を扱っている。&lt;/p&gt;
&lt;h2&gt;三つの落とし穴&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;squash mergeはフッターを食べてしまう。&lt;/strong&gt; プラットフォームがPRのタイトルをメッセージとして圧縮する場合、そのブランチ内のコミットの&lt;code&gt;BREAKING CHANGE:&lt;/code&gt;フッターは消え、あなたのツールは静かに破壊的変更を見なくなる。squashテンプレートが実際に何を保持しているか確認しよう。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;revertコミットは幻の項目を生み出す。&lt;/strong&gt; 翌日にrevertされる&lt;code&gt;fix&lt;/code&gt;は、導出がrevertを調整しない限り、出荷されなかったものについての項目を生成する。多くのツールはそれをしない。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;バージョンの更新とチェンジログが同期しなくなる。&lt;/strong&gt; バージョンがコミットから計算され、チェンジログが後から手動で書かれる場合、それらは約二回のリリースで乖離する。両方を同じパスで計算するか、どちらか一方が間違っていることを受け入れよう。&lt;/p&gt;
&lt;h2&gt;パイプラインなしで機械的な部分だけが欲しい場合&lt;/h2&gt;
&lt;p&gt;私たちの&lt;a href=&quot;https://changeloop.dev/changelog-generator&quot;&gt;チェンジログジェネレーター&lt;/a&gt;は導出のステップをブラウザで行う。コミットを貼り付けると、グループ化されタイプ付けされた項目が得られる。意図的に決定論的で完全にクライアントサイドであり、貼り付けたコミットがあなたのマシンから外に出ることはない。これはメッセージが非公開のリポジトリからのものであるときに重要だ。収集の半分を正直に行い、層二を試みない。層二は判断であり、それを装うツールは、この記事が反論しているまさにそのチェンジログを生み出すことになるからだ。&lt;/p&gt;
&lt;p&gt;パイプライン版については、&lt;a href=&quot;https://changeloop.dev/changelog-tools&quot;&gt;チェンジログツール&lt;/a&gt;が何が存在するかをカバーしている。&lt;/p&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;Conventional commitsは「これはどんな種類の変更か」という問いに、信頼できて安価に答える。「人々に何を伝えるべきか」には答えず、コミットメッセージの上にどれだけツールを重ねてもそれは変わらない。なぜなら、その情報はコミットメッセージの中に一度も存在しなかったからだ。書き直しのための予算を確保しよう。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Conventional commitsは自動的にチェンジログを生成するか?&lt;/strong&gt;
自動的に下書きを生成する。タイプ付けされ、スコープを持ち、リンクされた項目だ。顧客向けの言い回し、グループ化、そして何を省くかの判断は、依然として人間を必要とし、そのステップを飛ばすパイプラインはコミットメッセージを公開することになる。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;どのConventional commitのタイプがチェンジログに現れるか?&lt;/strong&gt;
&lt;code&gt;feat&lt;/code&gt;と&lt;code&gt;fix&lt;/code&gt;は常にAddedとFixedとして現れる。&lt;code&gt;perf&lt;/code&gt;は通常Changedとして現れる。&lt;code&gt;chore&lt;/code&gt;、&lt;code&gt;docs&lt;/code&gt;、&lt;code&gt;refactor&lt;/code&gt;、&lt;code&gt;test&lt;/code&gt;、&lt;code&gt;build&lt;/code&gt;、&lt;code&gt;ci&lt;/code&gt;はデフォルトで内部向けであり、人間がそのうちの一つを昇格させたときだけ現れる。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conventional commitsは破壊的変更をどうマークするか?&lt;/strong&gt;
タイプまたはスコープの後の&lt;code&gt;!&lt;/code&gt;（&lt;code&gt;feat(api)!: ...&lt;/code&gt;）、あるいはコミット本文の&lt;code&gt;BREAKING CHANGE:&lt;/code&gt;フッター。squash mergeがPRのタイトルだけを保持する場合、両方とも失われる。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;チェンジログを自動化するのにConventional commitsは必要か?&lt;/strong&gt;
必要ない。PRのラベル、PRのテンプレート、issueへのリンクは、pull requestでマージするチームにとって同じメタデータを運ぶ。Conventional commitsは、変更の単位がコミットであるときに最も安価な選択肢だ。&lt;/p&gt;
</content:encoded></item><item><title>本当にユーザーに読まれるリリースノートを書くための実践的な方法</title><link>https://changeloop.dev/blog/ja/how-to-write-release-notes/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/how-to-write-release-notes/</guid><description>バグ修正と性能改善とだけ書いても、リリースノートにはならない。すべての項目が答えるべき一つの質問と、それに沿った書き直しの実例を紹介する。</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;読まれるリリースノートを書くには、各項目でたった一つの質問に答えればいい。読者が今できるようになったことは何か、そしてそのために何をする必要があるのか。期限があるものは必ず先頭に置き、対象者を明示し、本当に何もする必要がなければ「対応不要です」とはっきり書き、何も語ることのないリリースは省略する。このページの残りはすべて、この一つのルールを具体的に当てはめたものだ。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;バグ修正とパフォーマンスの改善。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;どの製品も一度はこれを公開したことがあるはずだ。原因はほとんどの場合、怠慢ではない。これは、二週間もdiffに没頭して、もう部外者がどこに関心を持つのか見えなくなった人が、内側からリリースノートを書いたときに起こることだ。もっと良い文体にしても解決しない。質問に答えることが解決する。&lt;/p&gt;
&lt;h2&gt;リリースノートに何を含めるべきか&lt;/h2&gt;
&lt;p&gt;言及に値する変更ごとに、リリースノートには次を含めるべきだ。読者が今できるようになったこと、誰に影響するか、何をする必要があるか（「何もない」を含む）、そして期限があるものはいつ発効するか。含めるべきではないのは、社内のチケット番号、チームだけが使うコンポーネント名、そして唯一の見出しとしてのバージョン番号だ。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;含めるもの&lt;/th&gt;
&lt;th&gt;省くもの&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;読者の言葉での結果&lt;/td&gt;
&lt;td&gt;チームの言葉での実装&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;プラン、役割、APIバージョンごとの対象者&lt;/td&gt;
&lt;td&gt;「一部のユーザー」&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;必要な対応、または「対応不要です」&lt;/td&gt;
&lt;td&gt;読者が最悪のシナリオで埋める沈黙&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;期限があるものすべてに対する日付&lt;/td&gt;
&lt;td&gt;日付の代わりのバージョン番号&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;説明するドキュメントへのリンク&lt;/td&gt;
&lt;td&gt;プルリクエストへのリンク&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;報告されたバグと引き上げられた制限&lt;/td&gt;
&lt;td&gt;社内のチケットID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;一行ずつの地味なセクション、末尾に&lt;/td&gt;
&lt;td&gt;ニュースと混ざった地味なセクション&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;リリースノートと&lt;a href=&quot;https://changeloop.dev/blog/ja/changelog-vs-release-notes/&quot;&gt;チェンジログのエントリ&lt;/a&gt;の分離が、このリストを可能にしている。チェンジログはすべてを保持するので、ノートは何かを省略してよい。変更の種類ごとの注釈付きのサンプルは&lt;a href=&quot;https://changeloop.dev/blog/ja/release-notes-examples/&quot;&gt;リリースノートの例&lt;/a&gt;にまとめている。&lt;/p&gt;
&lt;h2&gt;すべての項目が答える質問&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;読者が今できるようになったことは何か、そしてそのために何をする必要があるのか?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;これに答えられない項目は、リリースノートではなくチェンジログに属する。両方の半分が重要だ。前半は価値そのもの。後半はチームが忘れがちな部分であり、それが欠けたときにサポートチケットを生む部分でもある。&lt;/p&gt;
&lt;p&gt;実際に機能している後半の二つの例：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;「既存のWebhookは11月1日まで動作し続けます。それ以降は、署名のないペイロードは拒否されます。」&lt;/li&gt;
&lt;li&gt;「対応不要です。既存のエクスポートは、次回開いたときに自動的に再エンコードされます。」&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;二つ目は「対応不要です」と明示的に述べている。この一文は毎回書く価値がある。それを見つけられない読者は最悪の事態を想定するからだ。&lt;/p&gt;
&lt;h2&gt;リリースノートはどう並べるべきか&lt;/h2&gt;
&lt;p&gt;システムのどの部分が変わったかではなく、読者への影響順に並べる。API、ダッシュボード、モバイル、インフラで分類するのは自分たちの組織図であって、読者の問題ではない。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;破壊的変更と期限のあるものすべて。&lt;/strong&gt; どんなに小さくても常に最初に。読者が一行読んで読むのをやめるなら、それがまさに読んでおくべき一行であるべきだ。期限がサンセットなら、その項目は&lt;a href=&quot;https://changeloop.dev/blog/ja/api-deprecation/&quot;&gt;非推奨化の通知&lt;/a&gt;のように読めるべきだ。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;新しくて求められているもの。&lt;/strong&gt; 段落ごとに一つ、結果を最初の一文に。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;改善されたもの。&lt;/strong&gt; 報告されたバグ、引き上げられた制限、遅かったもの。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;その他すべて、リストとして。&lt;/strong&gt; 依存関係の更新、内部のリファクタリング、細かなコピー。それぞれ一行ずつ。このセクションは誰も読まないが、それでも存在すべきだ。探している人には本当に必要だからだ。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;書き直し&lt;/h2&gt;
&lt;p&gt;前：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;v4.2.0&lt;/strong&gt; 負荷時に &lt;code&gt;POST /exports&lt;/code&gt; エンドポイントが断続的に500を返す問題を修正。エクスポートワーカーをリファクタリング。&lt;code&gt;node-pg&lt;/code&gt; を8.11に更新。CSVシリアライザのエラー処理を改善。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;後：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;大規模アカウントでエクスポートが失敗しなくなりました。&lt;/strong&gt;
約50,000行を超えるアカウントは、特に月末にエクスポートを開始すると500エラーになることがありました。これは修正され、どのサイズのエクスポートも失敗せずに自動的に再試行するようになりました。対応不要です。先週失敗したエクスポートは、単に再実行するだけで大丈夫です。&lt;/p&gt;
&lt;p&gt;4.2.0ではさらに：&lt;code&gt;node-pg&lt;/code&gt; 8.11、CSVシリアライザのエラーがより明確に。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;同じリリース。二つ目は影響を受けたアカウント、最も悪化した時期、何が変わったか、何をすべきかを明示している。依存関係の更新は消えたわけではなく、見出しであることをやめただけだ。&lt;a href=&quot;https://changeloop.dev/blog/ja/release-notes-best-practices/&quot;&gt;リリースノートのベストプラクティス&lt;/a&gt;の記事には、この書き直しが従う残りのルールが、それぞれ省略した場合のコストとともに掲載されている。&lt;/p&gt;
&lt;h2&gt;削除する価値のあるもの&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;「発表できることを嬉しく思います。」&lt;/strong&gt; 読者はまだ嬉しくない。その気持ちは次の文で勝ち取るべきだ。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;社内のチケット番号。&lt;/strong&gt; &lt;code&gt;PROJ-4471&lt;/code&gt; はあなたのトラッカーの外では何の意味も持たない。参照が必要なら、ドキュメントページへリンクする。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自分のチームだけが使うコンポーネント名。&lt;/strong&gt; 「取り込みパイプライン」を改名したなら「インポート」と言う。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;唯一の見出しとしてのバージョン番号。&lt;/strong&gt; &lt;code&gt;v4.2.0&lt;/code&gt; はアーカイブ用のラベルであり、要約ではない。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;誰も訪れない設定ページのスクリーンショット。&lt;/strong&gt; 変わったものを、使われている状態で見せる。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;リリースノートはどのくらいの頻度で公開すべきか&lt;/h2&gt;
&lt;p&gt;スケジュールではなく、何かが起きたときに公開する。毎回のリリースで届くノートは、全員にそれを無視することを教え込む。何かが起きたときに届くノートは開かれる。ノートを一切付けずにリリースし、その項目を、読む価値のある見出しを持つ次のセットに転がしてしまうのは問題なく、たいてい正しい判断だ。&lt;/p&gt;
&lt;p&gt;チェンジログはすべてを記録し続ける。それが役割分担だ。チェンジログは完全であり、ノートは選択的である。チェンジログを常に構造化して維持していれば、ノートを書くことは考古学ではなく選定と書き直しになる。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://changeloop.dev/release-notes-template&quot;&gt;リリースノートのテンプレート&lt;/a&gt;は、選定の段階で使う形式であり、&lt;a href=&quot;https://changeloop.dev/changelog-examples&quot;&gt;チェンジログの例&lt;/a&gt;は、そこからノートを導き出せるほど質の高いチェンジログを持つチームの項目を集めている。&lt;/p&gt;
&lt;p&gt;ここまでの話はすべて、完全にコントロールできるページ、長さの制限がなくリンクが機能するページを前提としている。&lt;a href=&quot;https://changeloop.dev/blog/ja/mobile-app-release-notes/&quot;&gt;モバイルアプリのリリースノート&lt;/a&gt;は、面がApp StoreやPlay Storeの掲載情報になったときに何が変わるかを扱っている。
&lt;a href=&quot;https://changeloop.dev/blog/ja/emergency-release-notes/&quot;&gt;緊急リリースノート&lt;/a&gt;はもう一つの例外を扱っている。通常の
執筆プロセスにまったく従う時間が残っていないときに何が変わるかだ。&lt;/p&gt;
&lt;h2&gt;公開前の一つのテスト&lt;/h2&gt;
&lt;p&gt;二週間休暇を取っていて、40秒しかない人としてノートを読んでみる。その時間で、何かが自分に求められているかどうかを判断できないなら、そのノートはどれだけ正確であっても未完成だ。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;リリースノートはどのくらいの長さにすべきか?&lt;/strong&gt;
結果を伴う変更が必要とする長さだけ、それ以上は一行も書かない。破壊的変更一つと改善二つのリリースなら三段落だ。地味なリリースを重要そうに見せるために水増しするのは、読者がノートを読み飛ばすことを学ぶ原因になる。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;リリースノートは誰が書くべきか?&lt;/strong&gt;
変更を理解している人が書き、それを理解していない人が編集する。エンジニアは何が変わったかを知っている。編集者は部外者が何を誤解するかを知っている。エンジニアがまだ記憶しているうちに、マージのタイミングで項目を書くことが、これを安く済ませる実践方法だ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;リリースノートにバグ修正を含めるべきか?&lt;/strong&gt;
含めるべきだ、誰かが報告したり遭遇したりしたものは。原因ではなく、読者が見た症状を述べる。「50,000行を超えるエクスポートが失敗していた」は読者が認識できる修正だが、「エクスポートワーカーのレースコンディションを修正」はコミットメッセージだ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;リリースノートとチェンジログの違いは何か?&lt;/strong&gt;
チェンジログは完全で継続的な記録であり、リリースノートは一つのリリースについて選定されたメッセージで、関心があるかまだ決めていない人々に向けて書かれている。より長い答えは&lt;a href=&quot;https://changeloop.dev/blog/ja/changelog-vs-release-notes/&quot;&gt;チェンジログ対リリースノート&lt;/a&gt;にある。&lt;/p&gt;
</content:encoded></item><item><title>Keep a Changelog、実際に導入してみて分かったこと</title><link>https://changeloop.dev/blog/ja/keep-a-changelog-implemented/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/keep-a-changelog-implemented/</guid><description>Keep a Changelogの仕様は一ページで短いが、導入するとチームは逸れていく。仕様が語ること、意図的に残したこと、現実で破綻する点を検証する。</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Keep a Changelogは、&lt;code&gt;CHANGELOG.md&lt;/code&gt;のための一ページの慣習だ。最新バージョンを先頭に、バージョンごとに一つのセクション、番号とISO日付を持ち、項目は六つのタイプ（Added、Changed、Deprecated、Removed、Fixed、Security）の下にグループ化され、リリース間の項目のために先頭にUnreleasedセクションがある。それを引用する多くのチームは、その三分の二ほどを実装し、省略される三分の一こそが、ユーザーを守る三分の一だ。&lt;/p&gt;
&lt;p&gt;Olivier Lacanは2014年に&lt;a href=&quot;https://keepachangelog.com/&quot;&gt;Keep a Changelog&lt;/a&gt;を、多くのソフトウェア関連の文章よりも良く年を重ねた一文とともに公開した。&lt;em&gt;don&amp;#39;t let your friends dump git logs into changelogs&lt;/em&gt;。十年後の今、これはソフトウェアのこの片隅が持つ、標準に最も近いものだ。要約ではなく原文を読む価値がある。この記事は省略される部分についてのものだ。&lt;/p&gt;
&lt;h2&gt;Keep a Changelogは何を求めているか&lt;/h2&gt;
&lt;p&gt;リポジトリのルートにある&lt;code&gt;CHANGELOG.md&lt;/code&gt;、最新のものを先頭に、バージョンごとに一つのセクション。各バージョンは番号とISO日付を持ち、その項目を六つのタイプの下にグループ化する。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;タイプ&lt;/th&gt;
&lt;th&gt;何のためか&lt;/th&gt;
&lt;th&gt;省略したときのコスト&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;新機能&lt;/td&gt;
&lt;td&gt;何もない。誰もこれを省略しない&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Changed&lt;/td&gt;
&lt;td&gt;既存の動作の変更&lt;/td&gt;
&lt;td&gt;読者はエラーから動作の変更に気づく&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deprecated&lt;/td&gt;
&lt;td&gt;削除される予定の機能&lt;/td&gt;
&lt;td&gt;削除が計画されたイベントではなくインシデントになる&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Removed&lt;/td&gt;
&lt;td&gt;このリリースで削除された機能&lt;/td&gt;
&lt;td&gt;誰も削除とバグを区別できない&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed&lt;/td&gt;
&lt;td&gt;バグ修正&lt;/td&gt;
&lt;td&gt;何もない。これも誰も省略しない&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;脆弱性&lt;/td&gt;
&lt;td&gt;それを探していた唯一の読者が見つけられない&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;さらに先頭に&lt;code&gt;Unreleased&lt;/code&gt;セクションがあり、マージされた瞬間に項目を置く場所があり、誰でも次に来るものを見られる。&lt;/p&gt;
&lt;p&gt;これがほぼすべてだ。残りは根拠にすぎない。項目は人間のためであり、変更ごとに一つの項目であり、ファイルはログではなく文書である、というものだ。&lt;/p&gt;
&lt;h2&gt;Keep a Changelogのどの部分が省略されるか&lt;/h2&gt;
&lt;p&gt;Unreleasedセクション、次に六つのタイプのうち四つ（Securityもその一つ）、この順番で。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;Unreleased&lt;/code&gt;が最初に消える。&lt;/strong&gt; これは期限のないセクションなので、その維持が最初に止まるものであり、それが消えると項目はリリース時にコミット履歴から書かれるようになる。それはまさに、仕様が冒頭で警告しているgit logのダンプそのものであり、段階的に到達する結果だ。&lt;a href=&quot;https://changeloop.dev/blog/ja/changelog-automation/&quot;&gt;チェンジログの自動化&lt;/a&gt;は、大部分がこのセクションを、誰も覚えていなくても生かし続けることについてのものだ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;六つのタイプが二つに崩壊する。&lt;/strong&gt; 実際のチェンジログのほとんどはAddedとFixedに落ち着く。ChangedとDeprecatedは、誰が何に依存していたかについての判断を要求するからだ。その判断こそが価値ある部分だ。特にDeprecatedは、未来についての約束である唯一のタイプであり、それを省略することが、削除がインシデントに変わる仕組みだ。その約束を守るための仕組みは&lt;a href=&quot;https://changeloop.dev/blog/ja/api-deprecation/&quot;&gt;APIの非推奨化&lt;/a&gt;にある。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Securityが分離されなくなる。&lt;/strong&gt; Fixedの下にまとめられたセキュリティ修正は、それを探していた唯一の読者には見えない。修正が些細なものであっても、特に注目を集めたくないと思うときこそ、それを分離しておくべきだ。&lt;/p&gt;
&lt;h2&gt;仕様が答えていないことは何か&lt;/h2&gt;
&lt;p&gt;これはファイル形式だ。それを採用した直後に直面する疑問については何も語っていない。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;誰かがどうやってそれを知るのか?&lt;/strong&gt; リポジトリ内のファイルは貢献者に届く。GitHubを一度も開いたことのない顧客には届かない。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;バージョンのないプロダクトはどうか?&lt;/strong&gt; 継続的にデプロイされるサービスには、グループ化できるv4.2.0が存在しない。多くのチームはそれを日付で代替しており、それは機能するし、仕様はそれを容認も禁止もしていない。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;誰が項目を書くのか?&lt;/strong&gt; 仕様は人間がそれをすると想定している。いつ書くかは述べていない。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;複数の読者はどうか?&lt;/strong&gt; 一つのファイルは開発者に役立つ。同じ内容を非技術系の管理者に役立てることはできず、彼女のために手動で再フォーマットすることが重複の始まりになる。&lt;a href=&quot;https://changeloop.dev/blog/ja/changelog-vs-release-notes/&quot;&gt;チェンジログ対リリースノート&lt;/a&gt;は、仕様があなた自身に委ねている分割だ。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;このアイデアのより厳格な派生である&lt;a href=&quot;https://common-changelog.org/&quot;&gt;Common Changelog&lt;/a&gt;は、その一部を厳しくしている。特定の項目の言い回しを禁止し、変更へのリンクを要求し、読者が誰であるかについて明確な意見を持っている。Keep a Changelogの緩い部分こそが、あなたのチームが常に議論している内容なら、読む価値がある。&lt;/p&gt;
&lt;h2&gt;git logをダンプせずにKeep a Changelogを自動化できるか&lt;/h2&gt;
&lt;p&gt;できる。構造化されたコミットから下書きを導出し、タイプを事前入力した状態でUnreleasedに配置し、リリースが切られる前に人間が言い回しを編集することを要求する。仕様の警告は出力についてのものであり、ツールについてではない。コミットから下書きを導出することは問題ない。編集されていないその下書きを公開することが、それが反対しているものだ。&lt;/p&gt;
&lt;p&gt;機械は収集とフォーマットを担当し、それは得意な分野だ。人間は選定と言い回しを担当し、それは機械が得意でない分野だ。&lt;a href=&quot;https://changeloop.dev/blog/ja/conventional-commits-changelog/&quot;&gt;Conventional commits&lt;/a&gt;は、これが依拠する二層構造と、どのコミットタイプが上記の六つのカテゴリーのどれに対応するかを扱っている。私たちの&lt;a href=&quot;https://changeloop.dev/changelog-tools&quot;&gt;チェンジログツール&lt;/a&gt;のまとめは、収集の半分について何が存在するかをカバーしている。&lt;/p&gt;
&lt;h2&gt;Keep a Changelogはどこで十分でなくなるか&lt;/h2&gt;
&lt;p&gt;配布のところで止まる。Keep a Changelogは「このファイルはどう見えるべきか」への良い答えだ。「私たちのユーザーは何が変わったかをどうやって知るのか」への答えではない。リポジトリ内のMarkdownファイルは、ユーザーが貢献者である場合にのみ機能する配布戦略だからだ。&lt;/p&gt;
&lt;p&gt;これは多くのチームが二番目にぶつかる障害だ。ファイル自体は問題ないが、チーム外の誰もそれを読まない。これを解決するということは、項目が他の場所でレンダリングできるデータにならなければならないことを意味し、それはファイルをフォーマットするのとは異なる問題であり、&lt;a href=&quot;https://changeloop.dev/changelog-examples&quot;&gt;チェンジログの例&lt;/a&gt;がリポジトリのファイルではなく公開されたチェンジログのページを集めている理由でもある。それらの項目を人々が戻ってくるものへと変える方法は、&lt;a href=&quot;https://changeloop.dev/blog/ja/changelog-page/&quot;&gt;チェンジログページの作り方&lt;/a&gt;で扱っている。&lt;/p&gt;
&lt;p&gt;それでも仕様を採用しよう。一晩分の時間はかかるが、二つ目の問題を扱いやすくし、これについて書かれた中で今も最良の一ページであり続けている。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Keep a Changelogは標準か?&lt;/strong&gt;
広く採用されている慣習であり、標準化機関の仕様ではない。ツール（リリーススクリプト、リンター、パーサー）はその形式を十分な頻度で想定しているため、それに従うことで互換性を買うことができる。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Unreleasedセクションには何が入るか?&lt;/strong&gt;
マージされたが、まだ番号付きのリリースとして出荷されていない変更ごとの各項目。リリースが切られると、そのセクションはバージョンと日付に改名され、新しい空のUnreleasedセクションがその上に置かれる。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;チェンジログはセマンティックバージョニングを使うべきか?&lt;/strong&gt;
Keep a Changelogはそれを推奨しているが要求はしていない。ライブラリやAPIはそこから恩恵を受ける。継続的にデプロイされるサービスは通常、日付で代替しており、その形式はそれを許容している。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;セキュリティ修正は公開前にチェンジログに載せるべきか?&lt;/strong&gt;
修正が出荷されたときに項目を追加し、オペレーターが行動できる程度の詳細を含め、それ以上は含めない。協調された開示日まで項目を遅らせることは普通だが、それを省略することは違う。&lt;/p&gt;
</content:encoded></item><item><title>本当に価値のあるリリースノートのベストプラクティス集</title><link>https://changeloop.dev/blog/ja/release-notes-best-practices/</link><guid isPermaLink="true">https://changeloop.dev/blog/ja/release-notes-best-practices/</guid><description>多くのベストプラクティスは文体の助言にすぎない。ここでは読者の行動を変える実践と、人気だが実はカーゴカルトにすぎない三つの慣習を取り上げる。</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;重要なリリースノートのベストプラクティスとは、結果が伴うものだ。マージのタイミングで項目を書く、対象者を明示する、たとえ何もなくても必要な対応を明記する、破壊的変更に日付を付ける、変更ごとに一つの永続的な項目を維持する、結果ごとにグループ化する、そして地味なセクションを残す。それぞれが読者の行動を変える。このテーマに関する他のほとんどの助言は、ノートの見た目を変えるだけだ。&lt;/p&gt;
&lt;p&gt;リリースノートのベストプラクティスを検索すると、文体についての助言が出てくる。明確に、簡潔に、平易な言葉を使い、スクリーンショットを追加せよ、といった具合だ。それらのどれも間違ってはいないし、どれも何も変えない。なぜなら、不明瞭であろうと意図して座った作業をするチームなど存在しないからだ。以下の実践には、それを省略したときのコストが添えられている。失敗モードが添えられていない実践は、単なる好みにすぎない。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;実践&lt;/th&gt;
&lt;th&gt;省略したときのコスト&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;リリース時ではなくマージ時に項目を書く&lt;/td&gt;
&lt;td&gt;後から再構成された項目は「様々な改善」としか書かれない&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;対象者を明示する&lt;/td&gt;
&lt;td&gt;すべての読者が自分には関係ないと判断する&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;必要な対応を明記する（「なし」も含む）&lt;/td&gt;
&lt;td&gt;同じ質問に対する四十件のサポートチケットと、最悪を想定する読者&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;破壊的変更をバージョンではなく日付で示す&lt;/td&gt;
&lt;td&gt;期限は過ぎてから発覚する&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;変更ごとに一つの永続的でリンク可能な項目&lt;/td&gt;
&lt;td&gt;「いつ変わったのか」に誰も答えられない&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;システムではなく結果でグループ化する&lt;/td&gt;
&lt;td&gt;読者は自分に関係あるセクションを見つけるために組織構造を知る必要がある&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;地味なセクションを維持する&lt;/td&gt;
&lt;td&gt;セキュリティ担当、コンプライアンス確認者、バージョン不一致をデバッグする人が情報源を失う&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;リリースノートのベストプラクティスとは何か&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;マージするときに項目を書き、リリースするときには書かない。&lt;/strong&gt;
省略したときのコスト：コミット履歴からリリースを再構成する人は、変更を行った本人ではなく、意図を推測することになる。二週間後に書かれた項目こそが「様々な改善」と書くものだ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;対象者を名前で明示する。&lt;/strong&gt;
「Businessプランのチーム」「v1エクスポートAPIを使用しているすべての人」「Postgres 14上のセルフホスト環境」。省略したときのコスト：すべての読者が自分に関係あるか調べなければならず、大半は関係ないと判断する。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;必要な対応を明記する。何もない場合も含めて。&lt;/strong&gt;
省略したときのコスト：サポートが同じ質問に四十回答え、質問しなかった読者は何か対応が必要だと思い込んで先延ばしにする。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;破壊的変更にはリリース番号ではなく日付を付ける。&lt;/strong&gt;
「v5で削除」は、あなたのリリースを追っていない人には何の意味もない。「11月1日に動作しなくなる」はすべての人にとって同じ意味を持つ。省略したときのコスト：期限は過ぎてから発覚する。何が該当するか、そしてそれを出荷するためのチェックリストは、&lt;a href=&quot;https://changeloop.dev/blog/ja/breaking-changes/&quot;&gt;破壊的変更とは何か&lt;/a&gt;にある。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;変更ごとに一つの永続的でリンク可能な項目を維持する。&lt;/strong&gt;
メールはアーカイブではなく、Slackのメッセージは参照先ではない。省略したときのコスト：六か月後、誰も「いつ変わったのか」に答えられない。あなた自身も含めて。メールにはそれでも役割があり、&lt;a href=&quot;https://changeloop.dev/blog/ja/product-update-email/&quot;&gt;プロダクトアップデートメールのテンプレート&lt;/a&gt;で扱っている。それは項目を置き換えるのではなく、そこを指し示すものだ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;システムではなく結果でグループ化する。&lt;/strong&gt;
省略したときのコスト：読者は自分に関係あるセクションを知るために、あなたの組織構造を頭に入れておく必要がある。そこから導かれる順序は&lt;a href=&quot;https://changeloop.dev/blog/ja/how-to-write-release-notes/&quot;&gt;リリースノートの書き方&lt;/a&gt;にある。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;地味なセクションを維持する。&lt;/strong&gt;
依存関係の更新と内部の変更は、末尾に一行ずつ残す。省略したときのコスト：セキュリティチーム、コンプライアンスのレビュー担当、バージョン不一致をデバッグする人が、唯一の情報源を失う。これを最も間違えやすいのは修正の項目で、読者が行動すべきかどうかを判断できるように書く方法は&lt;a href=&quot;https://changeloop.dev/blog/ja/bug-fix-release-notes/&quot;&gt;バグ修正のリリースノート&lt;/a&gt;で示している。&lt;/p&gt;
&lt;h2&gt;チェンジログのベストプラクティスとは何か、そしてどう違うのか&lt;/h2&gt;
&lt;p&gt;チェンジログはリファレンスなので、その実践は説得ではなく完全性と構造に関するものだ。重要な四つ：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;一行につき一つの固定された項目タイプ。&lt;/strong&gt; Added、Changed、Deprecated、Removed、Fixed、Security。これは社内スタイルではなくフィルターだ。「破壊的変更だけ」を求めることを可能にするものだ。&lt;a href=&quot;https://changeloop.dev/blog/ja/keep-a-changelog-implemented/&quot;&gt;Keep a Changelog&lt;/a&gt;の慣習が通常の出典だ。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;未リリースのセクション。&lt;/strong&gt; マージとリリースの間で項目が生きる場所。それがないと、チームは項目を遅れて書くことになる。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ISO形式の日付。&lt;/strong&gt; &lt;code&gt;2026-08-28&lt;/code&gt; であって &lt;code&gt;28/08/26&lt;/code&gt; ではない。後者は読者によって二つの異なる日を意味してしまう。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;コミットごとではなく、変更ごとに一つの項目。&lt;/strong&gt; 一つのバグを修正する三つのコミットは一つの項目だ。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この二つの成果物は&lt;a href=&quot;https://changeloop.dev/blog/ja/changelog-vs-release-notes/&quot;&gt;チェンジログ対リリースノート&lt;/a&gt;で詳しく比較している。短く言えば、チェンジログの実践は完全性を守り、リリースノートの実践は注意を守る。
&lt;a href=&quot;https://changeloop.dev/blog/ja/private-release-notes-enterprise/&quot;&gt;エンタープライズ顧客向けの非公開リリースノート&lt;/a&gt;は、
顧客全員が同じビルドにいるわけではなくなったときにだけ現れるこのことのバージョンを扱っている。
同じ完全性と注意の目標だが、全員に一斉に配信するのではなくアカウントごとに調整される。&lt;/p&gt;
&lt;h2&gt;純粋なカーゴカルトである三つのもの&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;項目タイプとしての絵文字。&lt;/strong&gt; ロケットとレンチは分類法ではない。整理されているように見えるが、フィルタリングも、ソートも、スクリーンリーダーによる有用な読み上げもできない。言葉を使い、絵文字が欲しければ言葉の後に置く。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ホスト型プロダクトの見出しとしてのセマンティックバージョン番号。&lt;/strong&gt; semverはAPIの互換性についての約束だ。誰もバージョンを選ばないSaaSプロダクトでは、見出しのバージョン番号はニュースを装った社内の整理番号にすぎない。semverはチェンジログに留め、発表からは外す。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;内容に関係なくスケジュール通りに公開する。&lt;/strong&gt; 中身のない月次ノートは、あなたのノートがノイズであることを人々に教え込む。言うべきことがあるときに公開する。チェンジログが残りをカバーする。&lt;/p&gt;
&lt;h2&gt;本当に難しいもの&lt;/h2&gt;
&lt;p&gt;チェンジログと発表を、すべてを二度書くことなく整合させておくこと。&lt;/p&gt;
&lt;p&gt;多くのチームは一つのページから始め、読者層が分かれたときにそれを分割し、その後どちらか一方を静かに腐らせてしまう。たいていはチェンジログだ。期限が付いていない方だからだ。その脱出策は規律ではなく構造にある。項目をタイプ、日付、対象者を持つデータとして保持し、両方の表面をそのレンダリングとして扱うことだ。&lt;a href=&quot;https://changeloop.dev/changelog-tools&quot;&gt;チェンジログツール&lt;/a&gt;のまとめでは、競合するツールも含めて何が利用可能かを紹介しており、&lt;a href=&quot;https://changeloop.dev/beamer-alternative&quot;&gt;Beamerの代替&lt;/a&gt;ページは、多くのチームが出発点とするウィジェットとの正直な比較だ。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://changeloop.dev/release-notes-template&quot;&gt;リリースノートのテンプレート&lt;/a&gt;は、項目が存在するようになった時点で選定の段階が置かれる場所だ。&lt;/p&gt;
&lt;h2&gt;一つだけ採用するなら&lt;/h2&gt;
&lt;p&gt;マージのタイミングで、固定された形式で、タイプ付きの項目を書く。このページの他のすべての実践は、これが定着すればより簡単になり、これなしには何も生き残らない。&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;リリースノートにスクリーンショットは必要か?&lt;/strong&gt;
変わったものを実際に使われている状態で示す場合のみ。誰も訪れない設定ページのスクリーンショットはスクロール量を増やすだけで情報にはならない。結果と対象読者を名指しするテキストは、どちらも示さない画像に勝る。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;破壊的変更のリリースノートはどう書くか?&lt;/strong&gt;
まず日付、次に影響を受ける呼び出し元、次に必要な対応、次に移行方法。バージョン番号から始めてはいけない。完全な形は例とともに&lt;a href=&quot;https://changeloop.dev/blog/ja/breaking-changes/&quot;&gt;破壊的変更とは何か&lt;/a&gt;にある。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;リリースノートはエンジニアが書くべきかマーケティングが書くべきか?&lt;/strong&gt;
変更を行ったエンジニアがマージ時に下書きし、それを部外者として読む誰かが編集する。どちらか一方だけでは、顧客が行動できるノートにはならない。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;理想的なリリースノートの形式とは?&lt;/strong&gt;
まず期限のある項目、次に新しい機能、次に改善、そして残りは一行ずつのリスト。&lt;a href=&quot;https://changeloop.dev/release-notes-template&quot;&gt;リリースノートのテンプレート&lt;/a&gt;は、その形式を記入式のページにしたものだ。&lt;/p&gt;
</content:encoded></item></channel></rss>