Skip to content

Commit 3f69746

Browse files
author
twitter-team
committed
[VF] updates includes addressing Ukraine labels
Closes twitter#1489 Closes twitter#1524 Closes twitter#1659 Closes twitter#1520
1 parent bb09560 commit 3f69746

14 files changed

+105
-106
lines changed

visibilitylib/src/main/resources/config/com/twitter/visibility/decider.yml

+4-1
Original file line numberDiff line numberDiff line change
@@ -494,6 +494,9 @@ visibility_library_enable_trends_representative_tweet_safety_level:
494494
visibility_library_enable_trusted_friends_user_list_safety_level:
495495
default_availability: 10000
496496

497+
visibility_library_enable_twitter_delegate_user_list_safety_level:
498+
default_availability: 10000
499+
497500
visibility_library_enable_tweet_detail_safety_level:
498501
default_availability: 10000
499502

@@ -758,7 +761,7 @@ visibility_library_enable_short_circuiting_from_blender_visibility_library:
758761
visibility_library_enable_short_circuiting_from_search_visibility_library:
759762
default_availability: 0
760763

761-
visibility_library_enable_nsfw_text_topics_drop_rule:
764+
visibility_library_enable_nsfw_text_high_precision_drop_rule:
762765
default_availability: 10000
763766

764767
visibility_library_enable_spammy_tweet_rule_verdict_logging:

visibilitylib/src/main/scala/com/twitter/visibility/configapi/configs/DeciderKey.scala

+5-2
Original file line numberDiff line numberDiff line change
@@ -535,6 +535,9 @@ private[visibility] object DeciderKey extends DeciderKeyEnum {
535535
val EnableTrustedFriendsUserListSafetyLevel: Value = Value(
536536
"visibility_library_enable_trusted_friends_user_list_safety_level"
537537
)
538+
val EnableTwitterDelegateUserListSafetyLevel: Value = Value(
539+
"visibility_library_enable_twitter_delegate_user_list_safety_level"
540+
)
538541
val EnableTweetDetailSafetyLevel: Value = Value(
539542
"visibility_library_enable_tweet_detail_safety_level"
540543
)
@@ -869,8 +872,8 @@ private[visibility] object DeciderKey extends DeciderKeyEnum {
869872
"visibility_library_enable_short_circuiting_from_search_visibility_library"
870873
)
871874

872-
val EnableNsfwTextTopicsDropRule: Value = Value(
873-
"visibility_library_enable_nsfw_text_topics_drop_rule"
875+
val EnableNsfwTextHighPrecisionDropRule: Value = Value(
876+
"visibility_library_enable_nsfw_text_high_precision_drop_rule"
874877
)
875878

876879
val EnableSpammyTweetRuleVerdictLogging: Value = Value(

visibilitylib/src/main/scala/com/twitter/visibility/configapi/configs/VisibilityDeciders.scala

+2-1
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,7 @@ private[visibility] object VisibilityDeciders {
198198
TopicRecommendations -> DeciderKey.EnableTopicRecommendationsSafetyLevel,
199199
TrendsRepresentativeTweet -> DeciderKey.EnableTrendsRepresentativeTweetSafetyLevel,
200200
TrustedFriendsUserList -> DeciderKey.EnableTrustedFriendsUserListSafetyLevel,
201+
TwitterDelegateUserList -> DeciderKey.EnableTwitterDelegateUserListSafetyLevel,
201202
TweetDetail -> DeciderKey.EnableTweetDetailSafetyLevel,
202203
TweetDetailNonToo -> DeciderKey.EnableTweetDetailNonTooSafetyLevel,
203204
TweetEngagers -> DeciderKey.EnableTweetEngagersSafetyLevel,
@@ -287,7 +288,7 @@ private[visibility] object VisibilityDeciders {
287288
RuleParams.EnableDropAllTrustedFriendsTweetsRuleParam -> DeciderKey.EnableDropAllTrustedFriendsTweetsRule,
288289
RuleParams.EnableDropTrustedFriendsTweetContentRuleParam -> DeciderKey.EnableDropTrustedFriendsTweetContentRule,
289290
RuleParams.EnableDropAllCollabInvitationTweetsRuleParam -> DeciderKey.EnableDropCollabInvitationTweetsRule,
290-
RuleParams.EnableNsfwTextTopicsDropRuleParam -> DeciderKey.EnableNsfwTextTopicsDropRule,
291+
RuleParams.EnableNsfwTextHighPrecisionDropRuleParam -> DeciderKey.EnableNsfwTextHighPrecisionDropRule,
291292
RuleParams.EnableLikelyIvsUserLabelDropRule -> DeciderKey.EnableLikelyIvsUserLabelDropRule,
292293
RuleParams.EnableCardUriRootDomainCardDenylistRule -> DeciderKey.EnableCardUriRootDomainDenylistRule,
293294
RuleParams.EnableCommunityNonMemberPollCardRule -> DeciderKey.EnableCommunityNonMemberPollCardRule,

visibilitylib/src/main/scala/com/twitter/visibility/configapi/params/RuleParams.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ private[visibility] object RuleParams {
8585

8686
object EnableDropAllCollabInvitationTweetsRuleParam extends RuleParam(false)
8787

88-
object EnableNsfwTextTopicsDropRuleParam extends RuleParam(false)
88+
object EnableNsfwTextHighPrecisionDropRuleParam extends RuleParam(false)
8989

9090
object EnableLikelyIvsUserLabelDropRule extends RuleParam(false)
9191

visibilitylib/src/main/scala/com/twitter/visibility/configapi/params/SafetyLevelParams.scala

+1
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ private[visibility] object SafetyLevelParams {
186186
object EnableTopicRecommendationsSafetyLevelParam extends SafetyLevelParam(false)
187187
object EnableTrendsRepresentativeTweetSafetyLevelParam extends SafetyLevelParam(false)
188188
object EnableTrustedFriendsUserListSafetyLevelParam extends SafetyLevelParam(false)
189+
object EnableTwitterDelegateUserListSafetyLevelParam extends SafetyLevelParam(false)
189190
object EnableTweetDetailSafetyLevelParam extends SafetyLevelParam(false)
190191
object EnableTweetDetailNonTooSafetyLevelParam extends SafetyLevelParam(false)
191192
object EnableTweetDetailWithInjectionsHydrationSafetyLevelParam extends SafetyLevelParam(false)

visibilitylib/src/main/scala/com/twitter/visibility/engine/VisibilityRuleEngine.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ class VisibilityRuleEngine private[VisibilityRuleEngine] (
143143
builder.withRuleResult(rule, RuleResult(builder.verdict, ShortCircuited))
144144
} else {
145145

146-
if (rule.fallbackActionBuilder.nonEmpty) {
146+
if (failedFeatureDependencies.nonEmpty && rule.fallbackActionBuilder.nonEmpty) {
147147
metricsRecorder.recordRuleFallbackAction(rule.name)
148148
}
149149

visibilitylib/src/main/scala/com/twitter/visibility/models/SafetyLevel.scala

+4
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ object SafetyLevel {
194194
ThriftSafetyLevel.TopicsLandingPageTopicRecommendations -> TopicsLandingPageTopicRecommendations,
195195
ThriftSafetyLevel.TrendsRepresentativeTweet -> TrendsRepresentativeTweet,
196196
ThriftSafetyLevel.TrustedFriendsUserList -> TrustedFriendsUserList,
197+
ThriftSafetyLevel.TwitterDelegateUserList -> TwitterDelegateUserList,
197198
ThriftSafetyLevel.GryphonDecksAndColumns -> GryphonDecksAndColumns,
198199
ThriftSafetyLevel.TweetDetail -> TweetDetail,
199200
ThriftSafetyLevel.TweetDetailNonToo -> TweetDetailNonToo,
@@ -772,6 +773,9 @@ object SafetyLevel {
772773
case object TrustedFriendsUserList extends SafetyLevel {
773774
override val enabledParam: SafetyLevelParam = EnableTrustedFriendsUserListSafetyLevelParam
774775
}
776+
case object TwitterDelegateUserList extends SafetyLevel {
777+
override val enabledParam: SafetyLevelParam = EnableTwitterDelegateUserListSafetyLevelParam
778+
}
775779
case object TweetDetail extends SafetyLevel {
776780
override val enabledParam: SafetyLevelParam = EnableTweetDetailSafetyLevelParam
777781
}

visibilitylib/src/main/scala/com/twitter/visibility/models/SafetyLevelGroup.scala

+4-7
Original file line numberDiff line numberDiff line change
@@ -379,13 +379,6 @@ object SafetyLevelGroup {
379379
)
380380
}
381381

382-
case object ProfileMixer extends SafetyLevelGroup {
383-
override val levels: Set[SafetyLevel] = Set(
384-
ProfileMixerMedia,
385-
ProfileMixerFavorites,
386-
)
387-
}
388-
389382
case object Reactions extends SafetyLevelGroup {
390383
override val levels: Set[SafetyLevel] = Set(
391384
SignalsReactions,
@@ -516,6 +509,10 @@ object SafetyLevelGroup {
516509
SafetyLevel.TimelineProfile,
517510
TimelineProfileAll,
518511
TimelineProfileSpaces,
512+
TimelineMedia,
513+
ProfileMixerMedia,
514+
TimelineFavorites,
515+
ProfileMixerFavorites
519516
)
520517
}
521518

visibilitylib/src/main/scala/com/twitter/visibility/models/SpaceSafetyLabelType.scala

+2-6
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ object SpaceSafetyLabelType extends SafetyLabelType {
3636
s.SpaceSafetyLabelType.HatefulHighRecall -> HatefulHighRecall,
3737
s.SpaceSafetyLabelType.ViolenceHighRecall -> ViolenceHighRecall,
3838
s.SpaceSafetyLabelType.HighToxicityModelScore -> HighToxicityModelScore,
39-
s.SpaceSafetyLabelType.UkraineCrisisTopic -> UkraineCrisisTopic,
40-
s.SpaceSafetyLabelType.DoNotPublicPublish -> DoNotPublicPublish,
39+
s.SpaceSafetyLabelType.DeprecatedSpaceSafetyLabel14 -> Deprecated,
40+
s.SpaceSafetyLabelType.DeprecatedSpaceSafetyLabel15 -> Deprecated,
4141
s.SpaceSafetyLabelType.Reserved16 -> Deprecated,
4242
s.SpaceSafetyLabelType.Reserved17 -> Deprecated,
4343
s.SpaceSafetyLabelType.Reserved18 -> Deprecated,
@@ -69,10 +69,6 @@ object SpaceSafetyLabelType extends SafetyLabelType {
6969
case object ViolenceHighRecall extends SpaceSafetyLabelType
7070
case object HighToxicityModelScore extends SpaceSafetyLabelType
7171

72-
case object UkraineCrisisTopic extends SpaceSafetyLabelType
73-
74-
case object DoNotPublicPublish extends SpaceSafetyLabelType
75-
7672
case object Deprecated extends SpaceSafetyLabelType
7773
case object Unknown extends SpaceSafetyLabelType
7874

visibilitylib/src/main/scala/com/twitter/visibility/rules/FreedomOfSpeechNotReach.scala

+10-30
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.twitter.visibility.rules
33
import com.twitter.spam.rtf.thriftscala.SafetyResultReason
44
import com.twitter.util.Memoize
55
import com.twitter.visibility.common.actions.AppealableReason
6+
import com.twitter.visibility.common.actions.AvoidReason.MightNotBeSuitableForAds
67
import com.twitter.visibility.common.actions.LimitedEngagementReason
78
import com.twitter.visibility.common.actions.SoftInterventionDisplayType
89
import com.twitter.visibility.common.actions.SoftInterventionReason
@@ -440,36 +441,6 @@ object FreedomOfSpeechNotReachActions {
440441
}
441442
}
442443

443-
case class ConversationSectionAbusiveQualityAction(
444-
violationLevel: ViolationLevel = DefaultViolationLevel)
445-
extends FreedomOfSpeechNotReachActionBuilder[ConversationSectionAbusiveQuality.type] {
446-
447-
override def actionType: Class[_] = ConversationSectionAbusiveQuality.getClass
448-
449-
override val actionSeverity = 5
450-
private def toRuleResult: Reason => RuleResult = Memoize { r =>
451-
RuleResult(ConversationSectionAbusiveQuality, Evaluated)
452-
}
453-
454-
def build(evaluationContext: EvaluationContext, featureMap: Map[Feature[_], _]): RuleResult = {
455-
val appealableReason =
456-
FreedomOfSpeechNotReach.extractTweetSafetyLabel(featureMap).map(_.labelType) match {
457-
case Some(label) =>
458-
FreedomOfSpeechNotReach.eligibleTweetSafetyLabelTypesToAppealableReason(
459-
label,
460-
violationLevel)
461-
case _ =>
462-
AppealableReason.Unspecified(violationLevel.level)
463-
}
464-
465-
toRuleResult(Reason.fromAppealableReason(appealableReason))
466-
}
467-
468-
override def withViolationLevel(violationLevel: ViolationLevel) = {
469-
copy(violationLevel = violationLevel)
470-
}
471-
}
472-
473444
case class SoftInterventionAvoidAction(violationLevel: ViolationLevel = DefaultViolationLevel)
474445
extends FreedomOfSpeechNotReachActionBuilder[TweetInterstitial] {
475446

@@ -662,6 +633,9 @@ object FreedomOfSpeechNotReachRules {
662633

663634
override def enabled: Seq[RuleParam[Boolean]] =
664635
Seq(EnableFosnrRuleParam, FosnrRulesEnabledParam)
636+
637+
override val fallbackActionBuilder: Option[ActionBuilder[_ <: Action]] = Some(
638+
new ConstantActionBuilder(Avoid(Some(MightNotBeSuitableForAds))))
665639
}
666640

667641
case class ViewerIsNonFollowerNonAuthorAndTweetHasViolationOfLevel(
@@ -678,6 +652,9 @@ object FreedomOfSpeechNotReachRules {
678652

679653
override def enabled: Seq[RuleParam[Boolean]] =
680654
Seq(EnableFosnrRuleParam, FosnrRulesEnabledParam)
655+
656+
override val fallbackActionBuilder: Option[ActionBuilder[_ <: Action]] = Some(
657+
new ConstantActionBuilder(Avoid(Some(MightNotBeSuitableForAds))))
681658
}
682659

683660
case class ViewerIsNonAuthorAndTweetHasViolationOfLevel(
@@ -692,6 +669,9 @@ object FreedomOfSpeechNotReachRules {
692669

693670
override def enabled: Seq[RuleParam[Boolean]] =
694671
Seq(EnableFosnrRuleParam, FosnrRulesEnabledParam)
672+
673+
override val fallbackActionBuilder: Option[ActionBuilder[_ <: Action]] = Some(
674+
new ConstantActionBuilder(Avoid(Some(MightNotBeSuitableForAds))))
695675
}
696676

697677
case object TweetHasViolationOfAnyLevelFallbackDropRule

visibilitylib/src/main/scala/com/twitter/visibility/rules/RuleBase.scala

+1
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ object RuleBase {
188188
TopicRecommendations -> TopicRecommendationsPolicy,
189189
TrendsRepresentativeTweet -> TrendsRepresentativeTweetPolicy,
190190
TrustedFriendsUserList -> TrustedFriendsUserListPolicy,
191+
TwitterDelegateUserList -> TwitterDelegateUserListPolicy,
191192
TweetDetail -> TweetDetailPolicy,
192193
TweetDetailNonToo -> TweetDetailNonTooPolicy,
193194
TweetDetailWithInjectionsHydration -> TweetDetailWithInjectionsHydrationPolicy,

visibilitylib/src/main/scala/com/twitter/visibility/rules/TweetLabelRules.scala

+24-3
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,9 @@ object NsfwCardImageAvoidAllUsersTweetLabelRule
144144
action = Avoid(Some(AvoidReason.ContainsNsfwMedia)),
145145
) {
146146
override def enabled: Seq[RuleParam[Boolean]] = Seq(EnableAvoidNsfwRulesParam)
147+
148+
override val fallbackActionBuilder: Option[ActionBuilder[_ <: Action]] = Some(
149+
new ConstantActionBuilder(Avoid(Some(MightNotBeSuitableForAds))))
147150
}
148151

149152
object NsfwCardImageAvoidAdPlacementAllUsersTweetLabelRule
@@ -247,6 +250,9 @@ object GoreAndViolenceHighPrecisionAvoidAllUsersTweetLabelRule
247250
TweetSafetyLabelType.GoreAndViolenceHighPrecision
248251
) {
249252
override def enabled: Seq[RuleParam[Boolean]] = Seq(EnableAvoidNsfwRulesParam)
253+
254+
override val fallbackActionBuilder: Option[ActionBuilder[_ <: Action]] = Some(
255+
new ConstantActionBuilder(Avoid(Some(MightNotBeSuitableForAds))))
250256
}
251257

252258
object GoreAndViolenceHighPrecisionAllUsersTweetLabelRule
@@ -266,6 +272,9 @@ object NsfwReportedHeuristicsAvoidAllUsersTweetLabelRule
266272
TweetSafetyLabelType.NsfwReportedHeuristics
267273
) {
268274
override def enabled: Seq[RuleParam[Boolean]] = Seq(EnableAvoidNsfwRulesParam)
275+
276+
override val fallbackActionBuilder: Option[ActionBuilder[_ <: Action]] = Some(
277+
new ConstantActionBuilder(Avoid(Some(MightNotBeSuitableForAds))))
269278
}
270279

271280
object NsfwReportedHeuristicsAvoidAdPlacementAllUsersTweetLabelRule
@@ -274,6 +283,9 @@ object NsfwReportedHeuristicsAvoidAdPlacementAllUsersTweetLabelRule
274283
TweetSafetyLabelType.NsfwReportedHeuristics
275284
) {
276285
override def enabled: Seq[RuleParam[Boolean]] = Seq(EnableAvoidNsfwRulesParam)
286+
287+
override val fallbackActionBuilder: Option[ActionBuilder[_ <: Action]] = Some(
288+
new ConstantActionBuilder(Avoid(Some(MightNotBeSuitableForAds))))
277289
}
278290

279291
object NsfwReportedHeuristicsAllUsersTweetLabelRule
@@ -294,6 +306,9 @@ object GoreAndViolenceReportedHeuristicsAvoidAllUsersTweetLabelRule
294306
TweetSafetyLabelType.GoreAndViolenceReportedHeuristics
295307
) {
296308
override def enabled: Seq[RuleParam[Boolean]] = Seq(EnableAvoidNsfwRulesParam)
309+
310+
override val fallbackActionBuilder: Option[ActionBuilder[_ <: Action]] = Some(
311+
new ConstantActionBuilder(Avoid(Some(MightNotBeSuitableForAds))))
297312
}
298313

299314
object GoreAndViolenceReportedHeuristicsAvoidAdPlacementAllUsersTweetLabelRule
@@ -302,6 +317,9 @@ object GoreAndViolenceReportedHeuristicsAvoidAdPlacementAllUsersTweetLabelRule
302317
TweetSafetyLabelType.GoreAndViolenceReportedHeuristics
303318
) {
304319
override def enabled: Seq[RuleParam[Boolean]] = Seq(EnableAvoidNsfwRulesParam)
320+
321+
override val fallbackActionBuilder: Option[ActionBuilder[_ <: Action]] = Some(
322+
new ConstantActionBuilder(Avoid(Some(MightNotBeSuitableForAds))))
305323
}
306324

307325
object GoreAndViolenceHighPrecisionAllUsersTweetLabelDropRule
@@ -791,7 +809,7 @@ object SkipTweetDetailLimitedEngagementTweetLabelRule
791809
object DynamicProductAdDropTweetLabelRule
792810
extends TweetHasLabelRule(Drop(Unspecified), TweetSafetyLabelType.DynamicProductAd)
793811

794-
object NsfwTextTweetLabelTopicsDropRule
812+
object NsfwTextHighPrecisionTweetLabelDropRule
795813
extends RuleWithConstantAction(
796814
Drop(Reason.Nsfw),
797815
And(
@@ -803,7 +821,7 @@ object NsfwTextTweetLabelTopicsDropRule
803821
)
804822
)
805823
with DoesLogVerdict {
806-
override def enabled: Seq[RuleParam[Boolean]] = Seq(EnableNsfwTextTopicsDropRuleParam)
824+
override def enabled: Seq[RuleParam[Boolean]] = Seq(EnableNsfwTextHighPrecisionDropRuleParam)
807825
override def actionSourceBuilder: Option[RuleActionSourceBuilder] = Some(
808826
TweetSafetyLabelSourceBuilder(TweetSafetyLabelType.NsfwTextHighPrecision))
809827
}
@@ -832,7 +850,10 @@ object DoNotAmplifyTweetLabelAvoidRule
832850
extends TweetHasLabelRule(
833851
Avoid(),
834852
TweetSafetyLabelType.DoNotAmplify
835-
)
853+
) {
854+
override val fallbackActionBuilder: Option[ActionBuilder[_ <: Action]] = Some(
855+
new ConstantActionBuilder(Avoid(Some(MightNotBeSuitableForAds))))
856+
}
836857

837858
object NsfaHighPrecisionTweetLabelAvoidRule
838859
extends TweetHasLabelRule(

0 commit comments

Comments
 (0)