Skip to content

Note

このドキュメントは2026-02-27 03:40PLaMo Translation Modelを使用して自動翻訳されました。

FEP-5624: オブジェクトごとの返信制御ポリシー

概要

ユーザーによっては、自分のサークル外や特定の個人からのコメントを許可せずに情報やストーリーを共有したい場合があります。特に、個人は「レスポンダー」と呼ばれる迷惑行為者を回避するため、あるいは明白な嫌がらせを防止するために、誰が自分に返信できるかを制限したいと考えることがあるでしょう。一方、組織は投稿に対する返信機能を無効化することで、モデレーション作業に負担をかけることなく情報を提供したいというニーズがあります。

この問題は、応答可能なアクターの範囲を示す勧告部分と、第三者が実際にその返信が許可されているかを確認する協調的な検証プロセスに分けられます。

要件

本仕様書における「MUST」「MUST NOT」「REQUIRED」「SHALL」「SHALL NOT」「SHOULD」「SHOULD NOT」「RECOMMENDED」「MAY」「OPTIONAL」という用語は、[RFC-2119]で定義された解釈に従うものとします。

本FEPにおいて、「配信権限」(または単に「権限」)とは、返信の配布範囲と対象者を制御するアクターを指します。この表現により、このFEPが「投稿と同等のコメントモデル」と、「投稿に付随する形でのみ存在するコメントモデル」(コメントは特定の投稿の文脈でのみ存在し、元の投稿者が誰がそのコメントを閲覧できるかを決定する場合)の両方に適用可能となります。拡張機能がない場合、この「権限」は返信対象となっている投稿の著者と定義されます。

返信ポリシーの宣言方法

オブジェクトに対して応答可能なユーザーを指定するために、作成者はそのオブジェクトに「canReply」(http://joinmastodon.org/ns#canReply)プロパティを設定できます。このプロパティが設定されている場合、その値は空の配列、または1つ以上のアクターもしくはコレクションでなければなりません。

実装を容易にするため、コレクションは以下のいずれかに制限することが推奨されます: - as:Public を指定することで、誰でも返信可能であることを示す - 権限者のフォロワー一覧(定義されている場合) - 権限者がフォローしているユーザー一覧(定義されている場合)

さらに、「canReply」プロパティには、元のオブジェクトで言及されているすべてのアクターを含める必要があります。

これらのいずれかのコレクションを使用する場合、受信側はそのユーザーが返信を許可されるかどうかを容易に判断できます。

具体例:応答可能なオブジェクト

{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    {
      "toot": "http://joinmastodon.org/ns#",
      "canReply": "toot:canReply"
    }
  ],
  "attributedTo": "https://example.com/users/1",
  "id": "https://example.com/users/1/statuses/1",
  "type": "Note",
  "content": "Hello world",
  "canReply": "https://www.w3.org/ns/activitystreams#Public"
}

ユーザーが返信可能かどうかの確認と権限者への返信送信

「canReply」プロパティが設定されたオブジェクトを受信した場合、可能な限り人間可読な形式でユーザーに通知することが推奨されます。例えば、「言及されているユーザーのみが返信可能です」や「権限者がフォローしているかつ言及されているユーザーのみが返信可能です」といった形で表示します。

ソフトウェアは、オブジェクトのtag属性に直接記載されている場合、または「canReply」(直接指定されているかコレクションを介して)に記載されている場合を除き、ユーザーが返信することを許可してはなりません。また、受信側が潜在的なリプライ投稿者のメンバーシップを効率的に確認できないコレクションが「canReply」に含まれている場合も、ユーザーに返信を許可すべきではありません。

ローカルでリプライ投稿者が返信を許可されるべきであることを確認した後、リプライ送信側は「Create」アクティビティを権限者のインボックスにPOSTし、当該返信は承認待ち状態として扱う必要があります。

返信の受信と承認処理

「canReply」プロパティを持つオブジェクトに対する返信を受信した場合、権限者はその返信を受け入れるかどうかを決定します。

返信が適切であると判断された場合、権限者は「ApproveReply」(http://joinmastodon.org/ns#ApproveReply)アクティビティを返す必要があり、その際「object」プロパティには返信オブジェクトの「id」を、「inReplyTo」プロパティには元の応答対象オブジェクトのIDを設定する必要があります。

この「ApproveReply」アクティビティは公開参照可能であり、かつ元の投稿を閲覧できるすべての関係者が参照可能でなければなりません。また、情報漏洩を防ぐため、objectおよびinReplyToを直接埋め込むことは禁止されています。

さらに、権限者は独自のルールに従って承認された返信を転送することができます。

返信が不適当であると判断された場合、権限者は「RejectReply」(http://joinmastodon.org/ns#RejectReply)アクティビティを返す必要があります。このアクティビティは公開可能ですが、必須ではありません。

新しい活動タイプ「ApproveReply」と「RejectReply」を採用した理由は、承認の目的を明確にするためです。他の種類の承認も考えられるため、明示的に定義することで潜在的な拡張機能との曖昧さを回避できます。

具体例:「ApproveReply」アクティビティ

{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    {
      "toot": "http://joinmastodon.org/ns#",
      "ApproveReply": "toot:ApproveReply"
    }
  ],
  "actor": "https://example.com/users/1",
  "id": "https://example.com/reply_approvals/1",
  "type": "ApproveReply",
  "object": "https://example.org/users/bob/statuses/3",
  "inReplyTo": "https://example.com/users/1/statuses/1"
}

具体例:「RejectReply」アクティビティ

{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    {
      "toot": "http://joinmastodon.org/ns#",
      "RejectReply": "toot:RejectReply"
    }
  ],
  "actor": "https://example.com/users/1",
  "id": "https://example.com/reply_approvals/1",
  "type": "RejectReply",
  "object": "https://example.org/users/bob/statuses/3"
}

承認の受信と返信の配布処理

初期「Create」アクティビティを送信した後、リプライ投稿者は前述のような「ApproveReply」アクティビティを受け取るまで待機する必要があります。

「ApproveReply」を受信したら、リプライ投稿者は自分の返信オブジェクトに「replyApproval」(http://joinmastodon.org/ns#replyApproval)プロパティを追加し、受け取った「ApproveReply」アクティビティを参照します。その後、修正したオブジェクトを用いて「Create」アクティビティを適切な対象者に送信することができます。

代わりに「RejectReply」を受信した場合、当該返信は直ちに削除され、リプライ投稿者には通知が行われる可能性があります。

具体例:「replyApproval」付き返信オブジェクト

{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    {
      "toot": "http://joinmastodon.org/ns#",
      "canReply": "toot:canReply",
      "replyApproval": "toot:replyApproval"
    }
  ],
  "attributedTo": "https://example.com/users/1",
  "id": "https://example.org/users/bob/statuses/3",
  "type": "Note",
  "content": "@alice hello!",
  "inReplyTo": "https://example.com/users/1/statuses/1",
  "canReply": "https://www.w3.org/ns/activitystreams#Public",
  "replyApproval": "https://example.com/reply_approvals/1",
  "tag": {
    "type": "Mention",
    "href": "https://example.com/users/1"
  }
}

第三者による返信の検証処理

遠隔アクターから遠隔権限者への返信を処理する際、受信側は以下のいずれかの条件を満たさない返信は破棄する必要があります: - 元の応答対象オブジェクトが「canReply」プロパティを設定していないか - そのオブジェクトが遠隔権限者を経由して受信されたものでない場合 - 元の応答対象オブジェクトに「as:Public」コレクションを含む「canReply」が設定されている場合 - リプライ投稿者が、元の応答対象オブジェクトのtagプロパティ内の「Mention」オブジェクトに記載されている場合 - 元の応答対象オブジェクトが空ではない「canReply」を設定しており、かつ「replyApproval」が参照可能で有効な「ApproveReply」アクティビティである場合

「replyApproval」で参照される「ApproveReply」アクティビティが有効とみなされるためには以下のプロパティを満たす必要があります: - actorプロパティが権限者であること - その真正性を証明できること - objectプロパティが検討対象の返信オブジェクトであること - ApproveReplyアクティビティが公開参照可能な場合、個人情報が漏れる可能性がある

実装に関する考慮事項

現時点で該当する実装はありません。

参考文献

著作権

CC0 1.0 Universal(CC0 1.0)パブリックドメイン献呈

法律で許容される範囲において、本Fediverse Enhancement Proposalの著者らはこの著作物に関するすべての著作権および関連する権利を放棄しています。