@circledev Mastodonの内部実装としては、投稿はstatusというモデルに保存されています。
statusにはvisibilityパラメータがあり、投稿した際は指定した通りになります。
リモートからActivityPubで届いた場合は、toにpublicが指定されていれば公開、ccにpublicが指定されていれば未収載、toに投稿者のフォロワー(コレクション)が指定されていればフォロワー限定、それ以外をダイレクトと認識します。
また、本文からメンション表記を抽出し、これをmentionモデルに記録します。statusには、このmentionが複数紐付けられます。
ActivityPubでは、サーバの代表窓口となるshared_inboxと、アカウント毎の窓口である個別のinboxがあり、inboxに届いた場合は暗黙のmentionが行われている(そのユーザーを宛先にしている)と解釈するようになっています。
この時、visibilityがダイレクトの投稿をlimitedに変更します。
@circledev どのタイムラインに配送されるか、どんな投稿がタイムライン上で表示を抑制されるか、というのは、visibilityやmentionの有無、relpyやフォロー関係に基づいて判断されますが、ひとまず割愛します。
ActivityPubの表現としては、btoやbcc、audienceなども宛先として指定できますし、例えば投稿者以外のフォロワーコレクションを指定することもできますが、これをフルサポートしている実装は……あるのかな。少なくともMastodonでは、この一部だけにしか対応していません。
フォロワーのコレクションはurlになっていて、そこにアクセスすれば一覧を取得できますが、これは実際には見に行きません。また、先方が非公開にしている場合もあります。
実際に使われているのは、そのサーバに記録されている投稿者のアカウント情報と、それに紐付けられている、ローカルのフォロワー情報だけです。リモートのフォロワーについては関知していません。
このフォロワー情報は、フォローのやりとりで構築されるもので、先方がDBロールバックしたりすると不一致になることもあります。
@circledev あるユーザーが投稿を読むことができるかは、このvisibilityとフォローの有無、mentionに基づいて判断されます。
投稿した本人は、自分の投稿であればすべて読めます。
公開、未収載はだれでもOKです。
フォロワー限定は、フォロワー限定となりますが、メンションが含まれている場合は、メンションされたユーザーも読むことができます。
ダイレクトについては、メンションされたユーザーだけ読むことができます。