Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

proposed lexicons for mod report routing #3521

Open
wants to merge 9 commits into
base: main
Choose a base branch
from
104 changes: 104 additions & 0 deletions lexicons/app/bsky/labeler/defs.json
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,110 @@
}
}
}
},
"reasonType": {
"type": "array",
"items": {
"type": "string",
"knownValues": [
"com.atproto.moderation.defs#reasonSpam",
"com.atproto.moderation.defs#reasonMisleading",
"com.atproto.moderation.defs#reasonSexual",
"com.atproto.moderation.defs#reasonOther",
"com.atproto.moderation.defs#reasonAppeal",
"com.atproto.moderation.defs#reasonAppeal",
bnewbold marked this conversation as resolved.
Show resolved Hide resolved
"app.bsky.labeler.defs#reasonHarassment",
"app.bsky.labeler.defs#reasonAnimalAbuse",
"app.bsky.labeler.defs#reasonGraphi",
bnewbold marked this conversation as resolved.
Show resolved Hide resolved
"app.bsky.labeler.defs#reasonScam",
"app.bsky.labeler.defs#reasonProhibitedCommerce",
"app.bsky.labeler.defs#reasonInauthentic",
"app.bsky.labeler.defs#reasonImpersonation",
"app.bsky.labeler.defs#reasonBanEvasion",
"app.bsky.labeler.defs#reasonChildSafety",
"app.bsky.labeler.defs#reasonSelfHarm",
"app.bsky.labeler.defs#reasonThreat",
"app.bsky.labeler.defs#reasonTntolerance",
bnewbold marked this conversation as resolved.
Show resolved Hide resolved
"app.bsky.labeler.defs#reasonPrivateInfo",
"app.bsky.labeler.defs#reasonSexualAbuse",
"app.bsky.labeler.defs#reasonSiteSecurity",
"app.bsky.labeler.defs#reasonTerrorViolentExtremist",
"app.bsky.labeler.defs#reasonSpoiler",
"app.bsky.labeler.defs#reasonGrowthHack"
]
}
},
"reasonHarassment": {
"type": "token",
"description": "Harassment"
},
"reasonAnimalAbuse": {
"type": "token",
"description": "Animal Abuse"
},
"reasonGraphic": {
"type": "token",
"description": "Graphic: violent or disturbing images"
},
"reasonScam": {
"type": "token",
"description": "Scams"
},
"reasonProhibitedCommerce": {
"type": "token",
"description": "Prohibited Commerce: trading in banned goods or services"
},
"reasonInauthentic": {
"type": "token",
"description": "Inauthentic: bots pretending to be human, fake accounts"
},
"reasonImpersonation": {
"type": "token",
"description": "Impersonation: of a specific person or organization"
},
"reasonBanEvasion": {
"type": "token",
"description": "Ban Evasion: new accounts from previously taken down users"
},
"reasonChildSafety": {
"type": "token",
"description": "Child Safety: CSAM/CSEM, grooming"
},
"reasonSelfHarm": {
"type": "token",
"description": "Self-Harm"
},
"reasonThreat": {
"type": "token",
"description": "Threat"
},
"reasonTntolerance": {
bnewbold marked this conversation as resolved.
Show resolved Hide resolved
"type": "token",
"description": "Intolerance: slurs, isms"
},
"reasonPrivateInfo": {
"type": "token",
"description": "Private Information: doxxing"
},
"reasonSexualAbuse": {
"type": "token",
"description": "Sexual Abuse: trafficing, non-consentual intimate images (NCII), deepfake porn"
bnewbold marked this conversation as resolved.
Show resolved Hide resolved
},
"reasonSiteSecurity": {
"type": "token",
"description": "Site Security: account security, hacking"
},
"reasonTerrorViolentExtremist": {
"type": "token",
"description": "Terrorist, Violence, and Extremist (TVEC)"
},
"reasonSpoiler": {
"type": "token",
"description": "Spoilers (example reason)"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm guessing (example reason) is coming later :)

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what is meant by that is the Bluesky Moderation Service won't declare or handle this reason. It is included as an example that such reasons can exist (eg, that the reason set isn't strictly 1-to-1 with bsky mod service policies, even if the "known" ones like up for the near future)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah that makes sense 👍

Sorry about the tone of my comment being a little weird btw, I shouldn't have been up so late.

I really appreciate all the work you and the rest of the team are putting in to make the moderation experience better 🙏

},
"reasonGrowthHack": {
"type": "token",
"description": "Growth Hack: engagement farming (example reason)"
}
}
}
31 changes: 30 additions & 1 deletion lexicons/app/bsky/labeler/service.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,36 @@
"type": "union",
"refs": ["com.atproto.label.defs#selfLabels"]
},
"createdAt": { "type": "string", "format": "datetime" }
"createdAt": { "type": "string", "format": "datetime" },
"reasonTypes": {
"description": "The set of report reason 'codes' which are in-scope for this service to review and action. These usually align to policy categories. If not defined (distinct from empty array), all reason types are allowed.",
"type": "array",
"items": {
"type": "ref",
"ref": "app.bsky.labeler.defs#reasonType"
}
},
"subjectTypes": {
"description": "The set of subject types (account, record, etc) this service accepts reports on.",
"type": "array",
"items": {
"type": "ref",
"ref": "com.atproto.moderation.defs#subjectType"
}
},
"reasonContexts": {
"description": "The set of report reason context tags which are in-scope of this service to review and action. If not defined (distinct from empty array), default is 'account' and 'record'.",
"type": "array",
"items": {
"type": "ref",
"ref": "com.atproto.moderation.defs#reasonContext"
}
},
"subjectCollections": {
"type": "array",
"description": "Set of record types (collection NSIDs) which can be reported to this service. If not defined (distinct from empty array), default is bsky post and profile records.",
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just a gut check— will this default be a breaking change for anyone? E.g. anyone labeling lists, feedgens, etc?

Copy link
Collaborator Author

@bnewbold bnewbold Feb 13, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't believe anybody is labeling those things other than us (bsky mod team). I will update to "[...] default is any record type" to be safe though.

"items": { "type": "string", "format": "nsid" }
}
}
}
}
Expand Down
8 changes: 8 additions & 0 deletions lexicons/com/atproto/moderation/createReport.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,14 @@
"com.atproto.repo.strongRef"
]
}
},
"reasonContexts": {
"description": "Set of context tags relevant to this report.",
"type": "array",
"items": {
"type": "ref",
"ref": "com.atproto.moderation.defs#reasonContext"
}
}
}
},
Expand Down
19 changes: 19 additions & 0 deletions lexicons/com/atproto/moderation/defs.json
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,25 @@
"reasonAppeal": {
"type": "token",
"description": "Appeal: appeal a previously taken moderation action"
},
"reasonContext": {
"type": "string",
"description": "Tag describing an aspect or context of a moderation subject relevant to a report.",
"knownValues": [
"image",
"video",
"link",
"interaction"
]
},
"subjectType": {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This doesn't seem to be used anywhere? I'm guessing the incoming report would set this or are we going to infer from the subject itself?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the client app would use this to decide which subscribed labelers are in-scope for any particular report. it is declared in app.bsky.labeler.service. same with subjectCollections (array of NSIDs).

neither need to be included in reports because the subject type (DID vs strongRef-with-ATURI) contains the same info.

"type": "string",
"description": "Tag describing a type of subject that might be reported.",
"knownValues": [
"account",
"record",
"chat"
]
}
}
}
Loading