the agents should reject NSFW content #225

Closed
opened 2026-08-13 01:48:30 +00:00 by coilysiren · 3 comments
Owner
No description provided.
Member

Design decision — folded into the content classifier

Recorded by Delphi (design seat). Kai's decision, 2026-08-12.

NSFW is a seed denylist category in the content classifier, not a standalone mechanism. Build it there: #227

Refusal shape: NSFW is a sensitive category. Echo uses the generic redirect and does not name NSFW as the reason. Same visible behavior as a suspected-minor block, by design — uniform output across sensitive categories is what keeps the minors policy (#226) from being probeable.

Non-negotiable: the block must still produce a visible message. Silent no-reply was explicitly rejected, because a refusal must never look like an outage (#190).

Full taxonomy and the sensitive-branch-wins-ties rule live in the anchor issue.

## Design decision — folded into the content classifier Recorded by Delphi (design seat). Kai's decision, 2026-08-12. NSFW is a **seed denylist category** in the content classifier, not a standalone mechanism. Build it there: https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/issues/227 **Refusal shape:** NSFW is a **sensitive** category. Echo uses the generic redirect and does **not** name NSFW as the reason. Same visible behavior as a suspected-minor block, by design — uniform output across sensitive categories is what keeps the minors policy (https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/issues/226) from being probeable. **Non-negotiable:** the block must still produce a visible message. Silent no-reply was explicitly rejected, because a refusal must never look like an outage (https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/issues/190). Full taxonomy and the sensitive-branch-wins-ties rule live in the anchor issue.
Member

Now stated in a policy root — Lucia (AI). 52e9553.

nsfw was already in agent/content-classes.yaml as deny and sensitive, but nothing read that file and no policy root mentioned sexual or explicit content. The rule the model reads is now:

Sexual or explicit content, and any request to produce it.

filed under Decline without naming the reason, so the refusal does not name the category. That follows the sensitive shape the taxonomy already encoded.

Honest sizing of what changed. Of the five classes I wrote rules for, this is the one where the base model's own alignment was probably already adequate in practice. The value here is smaller than for #226, where the requirement is a specific refusal shape that a general-purpose refusal would not produce.

What it does buy is that the boundary is now stated by this deployment rather than inherited, and a guard fails the build if the class survives without a rule.

Still prose rather than a filter. Enforcement is #227.

**Now stated in a policy root — Lucia (AI).** `52e9553`. `nsfw` was already in `agent/content-classes.yaml` as `deny` and `sensitive`, but nothing read that file and no policy root mentioned sexual or explicit content. The rule the model reads is now: > Sexual or explicit content, and any request to produce it. filed under *Decline without naming the reason*, so the refusal does not name the category. That follows the sensitive shape the taxonomy already encoded. **Honest sizing of what changed.** Of the five classes I wrote rules for, this is the one where the base model's own alignment was probably already adequate in practice. The value here is smaller than for https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/issues/226, where the requirement is a specific refusal shape that a general-purpose refusal would not produce. What it does buy is that the boundary is now stated by this deployment rather than inherited, and a guard fails the build if the class survives without a rule. Still prose rather than a filter. Enforcement is https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/issues/227.
Member

Closing - Kai's disposition, 2026-08-15

Recorded by Delphi (design seat).

The prose rule shipped at 52e9553, the sensitive refusal shape was measured at 10/10 with no category named, and the enforcement half is tracked in full on #227. Holding this open double-counts #227.

What closing does not claim. This is prose rather than a filter, so it remains a rule the model may read and break. Harness enforcement is #227 and is unbuilt. Ten runs on one prompt shape is a weak upper bound, not evidence of determinism. Neither of those is a reason to keep a second ticket open for the same work.

Where each half now lives - the taxonomy entry and sensitive refusal shape are settled here and in #227. Adversarial and indirect NSFW eval cases belong with the rate pack work, not on this ticket.

## Closing - Kai's disposition, 2026-08-15 Recorded by Delphi (design seat). The prose rule shipped at `52e9553`, the sensitive refusal shape was measured at 10/10 with no category named, and the enforcement half is tracked in full on #227. Holding this open double-counts #227. **What closing does not claim.** This is prose rather than a filter, so it remains a rule the model may read and break. Harness enforcement is #227 and is unbuilt. Ten runs on one prompt shape is a weak upper bound, not evidence of determinism. Neither of those is a reason to keep a second ticket open for the same work. **Where each half now lives** - the taxonomy entry and sensitive refusal shape are settled here and in #227. Adversarial and indirect NSFW eval cases belong with the rate pack work, not on this ticket.
coilyco-ops 2026-08-15 15:18:14 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
coilyco-gaming/sirens-echo#225
No description provided.