Skip to content

Give creators clearer reasons for restrictions and keep post-level restrictions post-level #216

Open

Description

@anon0016

Under the Hood already shows labels such as NSFW_HIGH_PRECISION, but the label alone often doesn’t tell creators what actually caused a restriction.

It would be useful to give creators a simple, high-level reason.

For example:

Label: NSFW_HIGH_PRECISION

Reason: Sexually suggestive pose

Affected media: Image 2

Restriction: Not recommended to non-followers

This doesn’t need to expose model thresholds, confidence scores, or internal classifier details.

It would also be useful to show whether a restriction came from the current post itself or from an account-level signal.

Keep post-level restrictions focused on the post

More generally, I think a restriction caused by one specific post should stay as focused on that post as possible.

This isn’t only about NSFW labels.

If a post receives a content-level label related to adult content, spam, sensitive content, or another policy, that specific post can have its recommendation eligibility reduced when appropriate.

But that shouldn’t automatically mean unrelated future posts from the same creator receive the same recommendation disadvantage.

For example:

Post A → receives a content-level label → Post A is restricted

should not automatically become:

Post A → receives a content-level label → account is broadly penalized → Posts B, C and D also receive less distribution

Otherwise, one false positive can have a much larger effect than the original classification decision.

Historical labels can still be useful as context for detecting repeated patterns, and genuinely account-level behavior such as platform manipulation, coordinated spam, ban evasion, or repeated abuse can still be handled at the account level.

The distinction I would like to see is simply:

Post-level problem → primarily post-level consequence

Account-level behavior → account-level consequence

This isn’t a request to change existing content policies or make moderation less strict.

The goal is to make restrictions more specific, understandable, and recoverable.

Creators should be able to understand:

what was restricted, why it was restricted, which part caused it, which recommendation surfaces are affected, and whether the restriction applies to the post or the account.

And whenever possible, a creator’s next compliant post should get a fresh chance to be evaluated on its own.

Activity

  1. Adityakk9031 commented on Sep 29, 2026

    @Adityakk9031

    This is a fantastic and well-timed RFC. Looking directly at the codebase, your observation hits the exact architectural boundary between post classification and account distribution suppression.

    Here is how the systems in this repository currently implement this cascade, where the transparency gaps exist in Under the Hood, and how the architecture could be evolved to keep post-level restrictions isolated:


    1. Where Post-Level Labels Turn Into Account-Level Penalties

    The mechanism you describe—where isolated post labels cascade into broad account penalties—is driven by safety-label-user-agg/:

    1. Event Trigger & Sliding Window Aggregation:

      • When a post receives a safety label (such as NSFW_HIGH_PRECISION or NSFW_HIGH_RECALL from media-model-proxy, pnsfwmedia, or grox), safetyLabelToUserLevelAggregationV2Processor.strato intercepts the TweetSafetyLabelEvent.
      • It executes rules defined in safety-label-user-agg/postToUserLabelRules.strato. These rules scan the creator's recent post timeline within a configurable window (e.g., windowSize, minimumMatchingPosts, maxPostAgeDays).
      • If the threshold is met (e.g., 2 matching posts in a window of 10), the rule automatically writes an account-level label—such as POSSIBLY_NSFW_ACCOUNT or NSFW_HIGH_PRECISION—with a time-to-live (userLabelTtlDays) into the account metadata service (Gizmoduck).
    2. Downstream Pipeline Cascade:
      Once applied at the account level, home-mixer/candidate_hydrators/gizmoduck_hydrator.rs hydrates these flags on every candidate post by that author:

    As you noted, a false positive on a single post (or a couple of edge-case posts) crosses the sliding-window threshold in safety-label-user-agg and suppresses the distribution of subsequent, completely compliant posts.


    2. The Visibility Gap in "Under the Hood"

    Looking at under-the-hood/strato/lib/underTheHoodLabels.strato and under-the-hood/jetfuel/routes/report.tsx:

    • The current schema only reports aggregate counts and generic descriptions (e.g., "The account's posts are hidden from recommendations to non-followers").
    • It does not disclose:
      • Provenance: Whether an account label was generated automatically via rolling post aggregation (safety-label-user-agg), model scoring (agatha/pnsfwmedia), or administrative review (NsfwAdmin).
      • Attribution: Which element in a post triggered the classification (e.g. Media Index 1 vs. text).
      • TTL & Recovery State: When the temporary aggregation TTL expires, or what the active count/window status is (userLabelTtlDays).

    3. Concrete Architectural Recommendations

    To address the points raised in this RFC:

    1. Context-Rich Diagnostics in Under the Hood:

      • Extend postLabels in underTheHoodReport to surface high-level reason categories (e.g. Media Visual Attribute, Text Language Flag, External Link) and affected media indices without revealing proprietary classifier weights or confidence scores.
      • For account-level restrictions, explicitly display provenance: e.g. "Applied due to 2 post-level labels within the last 30 days. Active TTL expires in 4 days."
    2. Decouple Post-Level Violations from Binary Account-Wide Drops:

      • Rather than binary out-of-network drops via oon_nsfw_author_drops() for automatically aggregated labels, shift towards graded candidate discounting in home-mixer/scorers/.
      • Provide a clean path for fresh compliant post evaluation: if a new post passes all post-level classifiers (grox, media-model-proxy, clip) with high confidence, it should not be unconditionally dropped in visibility-filtering simply because of an aggregated historical author label.
    3. Transparent Recovery Criteria:

      • Expose the sliding window progress and remaining TTL in the JetFuel UI so creators know exactly what is required to restore normal distribution status.
  2. Adityakk9031 commented on Sep 29, 2026

    @Adityakk9031

    I've submitted a pull request addressing this issue and RFC: #220

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions