这一页回答什么
- Under the Hood 报告是什么,谁能看到,覆盖哪个时间段。
- 每日任务收集哪些帖子标签、账号标签和下架记录,怎样计数。
- 服务层怎样把每日数据聚合成月度报告,页面与 JSON 展示哪些字段。
- 上游在 9 月 18 日加入的“法律合规导致的限流”信息怎样进入报告。
- 报告不展示哪些标签。
核心结论
- 报告按月生成,只覆盖上一个完整的 UTC 月。 月末之后至少 10 天才生成该月报告;该月观察期未完成时,退回再上一个月(
under-the-hood/strato/columns/underTheHoodReport.User.strato:20、:172-191、:626-631)。 - 资格:账号注册满 365 天,且报告月内至少发了 10 条帖子。 被封禁的账号查不到报告(
underTheHoodReport.User.strato:18-19、:597-600、:680-689)。 - 报告只展示白名单内的标签。 白名单含帖子标签 19 种、账号标签 12 种。每种标签都附“含义”和“对可见性的影响”两段说明(
under-the-hood/strato/lib/underTheHoodLabels.strato:3-184)。 - 帖子标签按“带标签的帖子数 / 当月帖子数”展示;账号标签按“生效天数 / 当月天数”展示(
underTheHoodReport.User.strato:369-461)。 - 9 月 18 日起,报告可以展示下架记录。 下架记录包括第三方举报确认违法、法律请求和 DMCA,并写明涉及的国家(
underTheHoodLabels.strato:186-260)。开关under_the_hood_report_takedowns_enabled控制是否展示,开源默认关闭(under-the-hood/strato/lib/params.strato:21-22)。 - 整个报告也由开关控制,开源默认关闭(
params.strato:15-16、under-the-hood/jetfuel/routes/download.tsx:7-8)。源码未包含线上的开关值。
数据流
flowchart LR
subgraph DAILY["每日任务 scalding"]
P["UthDailyPostsJob: 帖子标签"]
A["UthDailyAccountLabelsJob: 账号标签"]
TP["UthDailyPostTakedownLabelsJob: 帖子下架"]
TA["UthPctdAccountTakedownEventsJob: 账号下架"]
end
P --> M["UthUserMonthMhPublisherJob: 按用户按月聚合"]
A --> M
TP --> M
TA --> M
M --> MH["Manhattan: userMonthAggregates"]
MH --> S["Strato 列 underTheHoodReport.User"]
S --> G["GraphQL user_under_the_hood_report"]
G --> W["jetfuel 页面"]
G --> J["JSON 下载"]
依据:任务文件见 under-the-hood/scalding/;存储列见 under-the-hood/strato/columns/mh/userMonthAggregates.strato;GraphQL 查询见 under-the-hood/jetfuel/gql/underTheHoodReport.gql:1-28。
每日任务收集的数据
帖子标签(UthDailyPostsJob)
- 输入:帖子表、帖子安全标签事件流、帖子安全标签快照(
under-the-hood/scalding/UthDailyPostsJob.scala:51-94)。 - 观察窗:任务在每条帖子发出后观察 7 天(开源默认值,
UthDailyPostsJob.scala:438)。 - 计数口径如下(
UthDailyPostsJob.scala:347-421):carried:观察窗内曾被加上该标签的帖子数。removed:上述帖子中,在观察窗结束前标签被移除或到期的帖子数(UthDailyPostsJob.scala:335-345)。
- 任务同时统计每个用户每天的“合格帖子”数,作为分母(
UthDailyPostsJob.scala:96)。 - 输出行包含:用户、发帖日、标签、
carried、removed、观察天数、是否已定稿、部分帖子 id(under-the-hood/thrift/uth_serving.thrift:124-135)。
账号标签(UthDailyAccountLabelsJob)
- 输入:账号标签记录快照、Gizmoduck 用户修改日志、用户快照(
under-the-hood/scalding/UthDailyAccountLabelsJob.scala:16-20、:64、:85、:122)。 - 任务把
nsfw_admin安全标记也当作账号标签NsfwAdmin收集(under-the-hood/scalding/GizmoduckSafetyFlags.scala:5-10)。 - 判定口径:某天 UTC 0 点时标签处于生效且未过期,这一天就算生效(
UthDailyAccountLabelsJob.scala:166-193)。依此推断:同一天内加上又移除、没有跨过 UTC 0 点的标签,不会被计入。
下架(9 月 18 日起)
- 帖子下架:任务读取审计服务的 PCTD 动作日志与 DMCA 下架日志,并结合帖子事件(
under-the-hood/scalding/UthDailyPostTakedownLabelsJob.scala:49-53、:76)。 - 账号下架:任务读取审计服务的 PCTD 动作日志、用户快照与 Gizmoduck 修改日志(
under-the-hood/scalding/UthPctdAccountTakedownEventsJob.scala:57-70)。 - 下架行的标签名是下架原因名,并附国家码列表(
uth_serving.thrift:52-63)。
服务层的聚合流程
underTheHoodReport.User 列按用户 id 查询,步骤如下(underTheHoodReport.User.strato:595-718):
- 账号被封禁时,返回空(
:597-600)。 - 选择月份:取上一个 UTC 月;月末后不足 10 天时,再往前取一个月。开关
under_the_hood_report_max_month_bucket可以设置月份上限(:172-191)。 - 该月观察未完成时,再退一个月(
:620-645)。 - 检查资格:注册满 365 天,且当月合格帖子 ≥ 10 条。不满足时,只返回资格检查结果,不返回报告正文(
:680-702)。 - 生成 JSON:包含时间段、生成时间、帖子数、帖子标签行、账号标签行(
:463-523)。
帖子 id 的展示规则如下。这些规则在开关 under_the_hood_report_post_ids_enabled 打开时生效(params.strato:30-37、underTheHoodReport.User.strato:340-367):
- 带该标签的帖子 ≤ 3 条:全部列出。
- 带该标签的帖子占当月帖子 > 5%:不列出,改为附说明。
- 其余情况:列出最新的至多 50 条。
- 下架行:总是列出最新的至多 50 条。
页面与 JSON 展示的字段
| 字段 | 含义 | 锚点 |
|---|---|---|
| 时间段 | 报告月的起止日期,UTC | underTheHoodReport.User.strato:475-479 |
| Posts in period | 当月合格帖子数 | under-the-hood/jetfuel/routes/report.tsx:23 |
| Post labels | 每个标签:含义、对可见性的影响、3 of 40 posts · 7.50% 形式的占比、可选的帖子列表、申诉方式 |
report.tsx:28-78、underTheHoodReport.User.strato:369-422 |
| Account labels | 每个标签:含义、影响、5 of 31 days · 16.12% 形式的生效天数 |
report.tsx:34-50、underTheHoodReport.User.strato:424-461 |
| How to appeal | 开关 under_the_hood_report_appeals_enabled 打开时显示 |
params.strato:24-25、underTheHoodLabels.strato:437-520 |
| JSON 下载 | 文件名 x-under-the-hood-<期间>.json |
under-the-hood/jetfuel/routes/download.tsx:6-24 |
页面说明文字写明:报告按“尽力而为”提供,并附开源代码链接(underTheHoodReport.User.strato:67-85)。
白名单:报告展示的标签
帖子标签如下(underTheHoodLabels.strato:3-111):
| 标签 | 报告中写明的影响(摘要) |
|---|---|
| NSFW_HIGH_RECALL、NSFW_TEXT | 不推荐给非关注者;对未成年、未填年龄、未登录者隐藏 |
| NSFW_HIGH_PRECISION、NSFW_CARD_IMAGE、GORE_AND_VIOLENCE_HIGH_PRECISION、NSFW_ADMIN | 加内容警告;不推荐给非关注者;对未成年、未填年龄、未登录者隐藏 |
| SPAM_HIGH_RECALL、MALICIOUS_URL、DO_NOT_AMPLIFY | 不推荐给非关注者 |
| SPAM | 在 X 上不展示 |
| PDNA、BOUNCE | 待审核或待作者删除期间不展示 |
| FOR_EMERGENCY_USE_ONLY | 显示提示,不进主页时间线 |
| FOSNR_ABUSE、FOSNR_HATEFUL_CONDUCT、FOSNR_VIOLENT_SPEECH、FOSNR_CIVIC_INTEGRITY | 可发现性仅限作者主页,所有人可见受限说明 |
| FOSNR_ABUSE_INSULTS | 不推荐给非关注者,所有人可见受限说明 |
| BRAZIL_ELECTION_LEGAL | 在巴西不进推荐 |
账号标签(underTheHoodLabels.strato:119-184):ReadOnly、Compromised、SpamHighRecall、NsfwHighRecall、NsfwHighPrecision、NsfwAvatarImage、NsfwNearPerfect、NsfwBannerImage、NsfwAdmin、ImpersonationHighPrecision、AbusiveHighRecall、DoNotAmplify。除 NsfwAdmin 外,报告对其余标签的影响都写为“帖子不推荐给非关注者”。
报告不展示的标签
以下标签存在于 VF 规则中,但不在白名单中(对比 visibility-filtering/rules/levels.rs 与 underTheHoodLabels.strato:3-184):
| 标签 | 在 VF 中的作用 | 是否影响 For You |
|---|---|---|
| 账号:NotGraduated、AgathaSpamTopUser、EngagementSpammer、BlinkWorst、DownrankSpamReply | 通知中对非关注者丢弃(levels.rs:89-100) |
否 |
| 帖子:RISKY_HIGH_VIZ_REPLY、DUPLICATE_CONTENT、SMYTE_SPAM_TWEET、ABUSIVE、UNTRUSTED_URL、DUPLICATE_MENTION、DOWNRANK_SPAM_REPLY | 通知中丢弃(levels.rs:208-218) |
否 |
| 帖子:SOFT_NSFW | 请求开启开关时,对新账号查看者在站外推荐中丢弃(visibility-filtering/rules/tweet_rules.rs:919-928) |
是(条件触发) |
| 帖子:LOW_QUALITY、MISINFO_*(公共利益标签) | TimelineHomeHydration 级别的标签遮罩(tweet_rules.rs:70-87) |
不在 For You 两个级别中 |
账号状态:作者自标 nsfw_user |
站外推荐丢弃(visibility-filtering/rules/author_rules.rs:155-160) |
是 |
AGATHA_SPAM、COPYPASTA_SPAM 等帖子标签由打标签规则写入(见 打标签规则)。它们不在 For You 两个级别的规则中,也不在白名单中。
设计决策
| 决策 | 理由 |
|---|---|
| 公开标签结果,不公开部分规则 | 用户能核对自己受到了什么影响,对手拿不到规则阈值(上游 README “What’s not in this repo?”) |
| 帖子观察 7 天后才定稿 | 标签常在发帖后数小时到数天内被加上或撤销;过早统计会失真 |
| 月末后 10 天才生成报告 | 等待最后几天发出的帖子结束观察期 |
| 设资格门槛 | 新账号和低频账号样本太少,比例没有意义(推测) |
| 标签占比超过 5% 时不列帖子 | 推测:避免大量列出帖子 id,同时用占比说明影响面 |
| 下架附国家码 | 下架只在特定国家生效;写明国家才能解释可见性 |
源码锚点
under-the-hood/strato/columns/underTheHoodReport.User.strato:18-20、:595-718—— 资格、选月、查询流程under-the-hood/strato/lib/underTheHoodLabels.strato:3-260—— 标签与下架白名单及说明文字under-the-hood/strato/lib/params.strato:15-37—— 功能开关under-the-hood/scalding/UthDailyPostsJob.scala:335-438—— 帖子标签计数口径under-the-hood/scalding/UthDailyAccountLabelsJob.scala:166-193—— 账号标签按天判定under-the-hood/scalding/UthDailyPostTakedownLabelsJob.scala:49-53—— 帖子下架数据源under-the-hood/thrift/uth_serving.thrift:52-80—— 月度聚合结构under-the-hood/jetfuel/routes/download.tsx:6-24—— JSON 下载
相关页面
- 可见性过滤 —— 标签在推荐中的实际效果
- 打标签规则、处置与标签聚合 —— 标签的来源
- 限流与 shadowban —— 白话版
- 你的数据