X(Twitter)のシャドウバンとは?公開されたアルゴリズムのコードで仕組みを解説
「投稿が急に伸びなくなった」「自分では普通に見えているのに、他の人には届いていないらしい」——いわゆるシャドウバンを疑ったことがある方は多いと思います。
これまでは推測で語るしかありませんでした。しかし X が「おすすめ」フィードのアルゴリズムを GitHub で公開(Apache-2.0)したことで、状況が変わりました。判定を行っているコードそのものを読めます。
この記事はすべての記述にソースコードへのリンクを付けています。憶測は書きません。裏が取れなかったことは「確認できていない」と明記します。
結論から
- シャドウバンの正体は 可視性フィルタリング(Visibility Filtering)。実在します
- 「自分には見えるのに他人に届かない」のは、コードにそう書いてあるからです。仕様です
- ラベルの名前と、それぞれが表示にどう影響するかを X 自身が公開しています
- 自分の状態を確認する公式ツールがあります
- ただし**「解除手順」は公開されていません**。7 日で自動失効するラベルがある、という事実は確認できます
1. シャドウバンの正体
正式名称は Visibility Filtering。判定結果は visibility-filtering/models/mod.rs の VfAction に定義された 3 つだけです。
| 判定 | 意味 |
|---|---|
| Allow | 通常どおり表示 |
| Interstitial | 警告を挟んで表示(クリックすれば見られる) |
| Drop | その面に表示しない |
ルールは rules/registry.rs で上から順に評価され、最初に一致したものが勝ちます。複数のペナルティが積み重なる仕組みではありません。
補足: クライアント側の型には
Downrank(順位を下げる)も存在しますが、ルール側がこれを出力している箇所は見つかりませんでした。 「おすすめフィードで密かに順位だけ下げられる」という説は、このリポジトリの範囲では裏が取れません。
2. なぜ「自分には見えるのに他人に届かない」のか
ここがこの記事で最も重要な部分です。
registry.rs にはルールリストが 2 つあります。
- 基本ルール — 誰が見る場合でも適用
- 推薦専用ルール — 未フォローの相手に推薦するときだけ適用
そして、アカウント単位のドロップ規則(*_USER_DROP)と「高再現率(HIGH_RECALL)」系のルールは、すべて 2 番目のリストにしかありません。
公式 README も同じことを書いています。
あるルールは、閲覧者がフォローしていないアカウントからの推薦である場合にのみ投稿をドロップする。たとえば高再現率で検出されたスパムがそうだ。同じ投稿が、フォロワーに対しては表示される。
さらに tweet_label_drops.rs では、投稿ラベルによるドロップ規則が 1 つを除きすべて exempt_author: true(作者を対象外にする)を持っています。投稿した本人の画面では、何も変わりません。
つまり——
- 既存フォロワーには普通に届く
- 自分の画面でも普通に見える
- 新規の人にだけ届かない
「気のせいでは?」と言われがちな体験は、コードのとおりでした。
3. 実際のラベル一覧
under-the-hood/strato/lib/underTheHoodLabels.strato には、ラベル名と「表示にどう影響するか」の説明文が X 自身の言葉で書かれています。透明性ツールでユーザーに見せるための文言です。
投稿に付くラベル
| ラベル | X による説明(要約) |
|---|---|
SPAM | X 上に表示されない |
PDNA | 追加審査が終わるまで表示されない |
BOUNCE | 作者による削除待ちのため表示されない |
SPAM_HIGH_RECALL | 未フォロワーへの推薦から除外 |
MALICIOUS_URL | 未フォロワーへの推薦から除外 |
NSFW_HIGH_RECALL | 未フォロワーへの推薦、未成年・年齢未申告・ログアウト中のユーザーから除外 |
NSFW_HIGH_PRECISION | 警告表示 + 未フォロワーへの推薦から除外 + 年齢制限 |
NSFW_TEXT | 未フォロワーへの推薦から除外 + 年齢制限 |
GORE_AND_VIOLENCE_HIGH_PRECISION | 警告表示 + 推薦除外 + 年齢制限 |
FOSNR_ABUSE / FOSNR_HATEFUL_CONDUCT / FOSNR_VIOLENT_SPEECH / FOSNR_CIVIC_INTEGRITY | 表示範囲が作者のプロフィールのみに制限される。全ユーザーに「表示が制限されている」旨のラベルが見える |
FOSNR_ABUSE_INSULTS | 推薦除外 + 制限表示のラベル |
DO_NOT_AMPLIFY | 過去に使われていたもの。MALICIOUS_URL に置き換え中で、いずれ廃止予定 |
FOSNR 系は投稿が消えるわけではなく、「制限中」と明示されたうえでプロフィールでのみ見える状態になります。
アカウントに付くラベル
ReadOnly(読み取り専用)、Compromised(パスワード再設定が必要)、SpamHighRecall、NsfwHighRecall、NsfwHighPrecision、NsfwAvatarImage(アイコン画像)、NsfwBannerImage(ヘッダー画像)、NsfwNearPerfect、ImpersonationHighPrecision(なりすまし)、AbusiveHighRecall(自動化対策のセキュリティ認証が必要)、DoNotAmplify(審査中のため未フォロワーへの推薦から除外)
アイコンやヘッダー画像だけでアカウント全体にラベルが付く点は見落とされがちです。
⚠️ 注意: このリポジトリに「ラベルの完全な一覧」は存在しません。型定義は外部パッケージにあり、収録されていません。上記はコード内で参照されているラベルであり、これがすべてとは限りません。
4. アカウントラベルはどう付くのか
safety-label-user-agg/postToUserLabelRules.strato に、投稿ラベルからアカウントラベルへ昇格する規則があります。
| 条件 | 結果 | 有効期間 |
|---|---|---|
直近 5 投稿のうち 3 件が NSFW_HIGH_PRECISION | アカウントに NSFW_HIGH_PRECISION | 7 日 |
そしてアカウントに NSFW_HIGH_PRECISION が付くと、推薦専用ルールの NSFW_HIGH_PRECISION_USER_DROP が発火し、おすすめフィードから除外されます。
注目すべきは userLabelTtlDays: 7 です。 アカウントラベルには 7 日間の有効期限があります。永久ではありません。該当する投稿をやめれば、期限切れで外れる——これが「解除」について公開情報から言える、ほぼ唯一の確かなことです。
返信に付くラベル
botmaker-rules/scarecrow/bot/GroxTweetProcessor.bot(ルール ID 25026)は、スパム判定スコアが 0.97 以上の返信に RISKY_HIGH_VIZ_REPLY を 14 日間付与します。
ただし以下は除外されます。
- 会話の作者本人による返信
- 信頼度スコアの高いアカウント
- グレー認証済みのアカウント
つまり他人の投稿への返信は、自分の投稿より厳しく見られています。 大きな投稿にスパム的な返信を繰り返すのが最も危険、ということです。
5. 自分の状態を確認する
2026 年 8 月、under-the-hood/ の「Under the Hood」が公開されました。自分のアカウント・投稿に付いたラベルを、本人が確認できます。
何が分かるか
uth_serving.thrift のスキーマから、レポートの中身が読み取れます。
- その月に投稿した対象投稿の数
- ラベルごと・日ごとの件数(付いた件数と、あとで外れた件数)
- アカウントラベルが有効だった日のリスト
- ブランドセーフティの分類(
SAFE/LOW_RISK/MEDIUM_RISK/NOT_OBSERVED) - 同じフォロワー規模の人と比べた順位(1千未満/1千〜1万/1万〜10万/10万以上の区分で、中央値や上位10%などのパーセンタイル)
「自分だけ厳しいのでは」という疑問に、同規模アカウントとの比較で答えられる設計です。
利用条件
underTheHoodReport.User.strato に条件が書かれています。
- 前月に 10 投稿以上していること
- アカウント作成から 1 年以上経過していること
- 対象は前月(UTC)。月末から 10 日ほど経ってから閲覧可能
限界
- 月単位の集計です。「この投稿が消された」という個別の記録は出ません
- 異議申立ての手順は公開されていません。 README は「コードと照合して影響を理解し、必要なら批判できる」と書いており、救済窓口の案内ではありません
6. 順位の話(表示可否とは別の仕組み)
ここまでが「出るか出ないか」。並び順は別の仕組みです。README も設計原則として「ランキングと可視性の分離」を挙げています。
計算式は home-mixer にあります。
Final Score = Σ ( weight × P(action) )重みの実数値は home-mixer/params/param.rs にあります。ダミー値ではありません。
⚠️ ここが最大の誤解ポイント
「通報の重みが -234、いいねが 0.5。だから通報 1 件でいいね 468 件が消える」——この説明を見かけたら、それは公式が名指しで否定しているものです。
README の "How weights work" にこうあります。
重みは、その行動の予測確率(あるいは滞在時間などの予測連続値)にかかるのであって、生のエンゲージメント数にはかからない。…したがって「通報の重みがいいねの 468 倍だから、1 件の通報が 468 件のいいねを打ち消す」と結論づけるのは誤りである。
重みは、あなた自身がいいねする/通報する予測確率にかかる係数であり、その確率はあなた自身の行動によって大きく決まる。
つまりこれは「この投稿は、この人に通報されそうか」という予測に対する係数です。実際に押された数のカウンタではありません。
それでも実用的な結論は変わりません。 通報されそうな投稿は評価が大きく下がる。数字を積むより、通報・ミュート・ブロックを誘発しないことのほうが効きます。
相互フォローの返信が最大のレバー
docs/BIDIRECTIONAL_BOOST_CHANGE.md は、リポジトリ唯一の「実際の変更の記録」です。
相互フォローの相手のオリジナル投稿(返信・リポストは対象外)は、返信の重みが加算されます。
- 2026-07-10 A/B テスト開始(5 / 10 / 15 / 20)
- 2026-07-13 全体展開、20.0
- 2026-07-24 15.0 に引き下げ
引き下げの理由も書かれています。ワールドカップの話題が、フォローしていないアカウントの投稿ばかりで届かない、という声を受けたためです。
基本の返信重み 5.0 に 15.0 が加算されるので、合計 20 = 通常の 4 倍。リポジトリで文書化された、オーガニックリーチ最大の要素です。
相互フォロー関係を築くことが、小手先の施策よりはるかに効く——コードがそう示しています。
ブックマークの重みは 0
param.rs に BookmarkWeight という項目は存在しません。 プロフィールクリックと滞在(DwellWeight)は 0.0 です。「ブックマークがいいねの 10 倍」という説はこのコードでは裏が取れません。
7. 順位の調整
param.rs から数値が読み取れます。
連投は自分の首を絞める
同一作者へのペナルティは (1 - 0.25) × 0.5^k + 0.25(k は登場回数)。
| 何投稿目か | 倍率 |
|---|---|
| 1 投稿目 | 1.0 |
| 2 投稿目 | 0.625 |
| 3 投稿目 | 0.4375 |
| 以降 | 0.25 に収束 |
まとめて投稿すると、自分の投稿同士で露出を食い合います。
未フォローには 0.75 倍
OonWeightFactor は 0.75。しかも EnableOonRescoreForInNetworkRepliesRetweets が既定で有効なため、フォロー中の相手の「返信・リポスト」にも 0.75 が適用されます。減点を免れるのはオリジナル投稿だけです。
新規アカウントには追い風がある
コールドスタート・ブーストの条件は具体的です。
- 表示回数 1,000 未満
- 作者のフォロワー 1,000 人未満
- 投稿から 24 時間以内
- オリジナル投稿であること
条件を満たした投稿 1 件が、35 件のレスポンス中 15〜16 番目に挿入されます。
さらに新規ユーザー自身のフィードでは、未フォロー重みが 0.00001 になります。登録直後はほぼフォロー中心のフィードになる、ということです。
8. スコア以前に落ちる条件
home-mixer/params/config.rs に MAX_POST_AGE = 48 * 60 * 60 とあります。48 時間で対象外は実在します。
スコア計算前に 18 個のフィルタが順に走ります。重複、メタデータ取得失敗、48 時間超、自分の投稿、未フォローのリポスト・返信、NSFW 判定、購読者限定、閲覧済み、ミュートキーワード、ブロック/ミュート、など。
最終的に上位 50 件を選び、35 投稿を返します。
9. では、どうすればいいのか
「この操作で解除される」という手順は公開されていません。 公開されているのはラベルを判定するコードであって、外す手順ではありません。断定している情報を見かけたら根拠を確認してください。
そのうえで、コードから言えることを挙げます。
1. まず Under the Hood で確認する
推測で対策しても意味がありません。ラベルが付いているのか、付いているならどれか。まずそこからです。
2. 該当する投稿をやめて、7 日待つ
アカウントラベルの有効期限は 7 日(userLabelTtlDays: 7)。原因となる投稿を続けなければ、期限切れで外れます。逆に、直近 5 投稿中 3 件で再び付きます。
3. 他人への返信に注意する
返信は RISKY_HIGH_VIZ_REPLY の対象です。無関係な投稿への大量リプライは最も危険です。
4. アイコンとヘッダーを見直す
NsfwAvatarImage / NsfwBannerImage はプロフィール画像だけでアカウント全体に付きます。
5. 相互フォロー関係を育てる
重み 20(通常の 4 倍)。リポジトリで確認できる最大のレバーです。
6. 連投を避ける
2 投稿目 0.625 倍、3 投稿目 0.4375 倍。間隔をあけるほうが総露出は増えます。
7. 通報・ミュートを誘発しない
予測確率への係数とはいえ、負の重みは桁が違います。伸ばす工夫より、踏まない工夫のほうが効きます。
10. 公開されていない部分
公平のために書きます。
- Grok(LLM)のプロンプトと、一部の Botmaker ルールは非公開です。README は "e.g."(例えば)と書いており、非公開の範囲は網羅的に示されていません
- 不正行動検知モデル
bdsmの判定閾値は伏せられています。公開ファイルでは9.99という、確率としてありえない値に置き換えられています。理由は「攻撃者に回避の境界線を渡さないため」と明記されています - ラベルの完全な一覧は、このリポジトリにありません
- 重みは再学習のたびに変わります。本記事の数値は 2026 年 8 月時点のものです
「ラベルが自分の表示にどう影響するか」は検証できますが、「何がそのラベルを引き起こしたか」は必ずしも分かりません。
まとめ
- シャドウバンの正体は可視性フィルタリング。Allow / Interstitial / Drop の 3 種類
- 未フォローの相手にだけ厳しいルールが適用される。フォロワーと本人には見え続ける。仕様です
- ラベル名と影響は公開されている。アカウントラベルは7 日で失効する
- 直近 5 投稿中 3 件でアカウントラベルが付く
- 「通報 1 件=いいね 468 件分」は公式が否定している誤解
- 相互フォローの投稿への返信は重み 20(4 倍)。最大のレバー
- 連投は 2 投稿目 0.625 倍、3 投稿目 0.4375 倍
- 確実な解除手順は公開されていない。 確認し、原因を止め、期限を待つのが現実的
参考にしたソース
すべて xai-org/x-algorithm(Apache-2.0)より。
- README.md — 全体構成、重みの考え方
- home-mixer/params/param.rs — 重みの実数値、順位調整
- home-mixer/params/config.rs — 48 時間の上限
- docs/BIDIRECTIONAL_BOOST_CHANGE.md — 相互フォロー・ブーストの経緯
- visibility-filtering/models/mod.rs — 判定の 3 種類
- visibility-filtering/rules/registry.rs — 2 つのルールリスト
- visibility-filtering/rules/tweet_label_drops.rs — 投稿ラベルと作者除外
- under-the-hood/strato/lib/underTheHoodLabels.strato — ラベル名と公式の説明文
- under-the-hood/thrift/uth_serving.thrift — レポートの内容
- safety-label-user-agg/postToUserLabelRules.strato — アカウントラベルの付与条件と 7 日失効
- botmaker-rules/scarecrow/bot/GroxTweetProcessor.bot — 返信へのラベル付与
本記事は公開情報にもとづく解説であり、特定の結果を保証するものではありません。X の仕様は予告なく変更されます。数値は 2026 年 8 月時点のものです。