meta.discourse.org で、既存のトピックを表示しながらネイティブの c キーボードショートカットを使って2つの新規トピック下書きを作成すると、下書きの競合を再現できます。
再現手順
- 既存の公開トピックを開く。
cキーを押して新規トピックを作成する。- タイトルと本文を入力する。
- 下書きの保存を待ってから、コンポーザーの 保存して閉じる ボタン(X)をクリックする。
- 引き続き既存のトピックを表示したまま、
cキーをもう一度押して別の新規トピックを作成する。 - 異なるタイトルを入力する。
- タイトルフィールドからメッセージ本文へ移動するために Tab キーを押し、自動保存を待つ。
Meta で確認した再現には、両方の新規トピックコンポーザーを既存のトピックを表示している状態で開く必要があります。
実際の結果
下書きが別のウィンドウで編集中であるという警告が表示され、ページの再読み込みを求められる。
これは、別のウィンドウで下書きを編集していないにもかかわらず発生します。
自分のサイトでは、/drafts.json への失敗した自動保存リクエストが HTTP 409 を返します。
期待される結果
2つ目の新規トピックには独自の割り当てられ、最初の保存された下書きは競合せずに保持されるべきです。
再現場所
- meta.discourse.org で、上記の手順に従って再現。
- 自分自身のサイトで Safe Mode(テーマおよびすべてのクライアントサイドプラグインのカスタマイズを無効化)で再現。
- 自分のサイトは Discourse
2026.10.0-latest、コミットb28f2a44cを実行しています。
考えられる原因
コードの調査から、KeyboardShortcuts#createTopic のフォールバックが、依然として固定の Composer.NEW_TOPIC_KEY (new_topic) を使用しており、draftSequence を指定していないことが示唆されています:
比較すると、composer.openNewTopic() は一意の下書きキーを生成します。
自分のサイトでキャプチャされた再現では、1つ目の下書きは new_topic として保存され、シーケンス 1 に到達しました。2つ目のコンポーザーはシーケンスなしで同じキーで保存を試み、HTTP 409 と警告が発生しました。
このフォールバックが composer.openNewTopic() を使用するように変更し、各新規トピックに別々の下書きを割り当てることは可能でしょうか?
よろしくお願いいたします、
Prof. Caju