Skip to content
C.W.K.
Stream
Lesson 03 of 04 · published

Scrub Lightly, Declare Boundaries

~11 min · scrubbing, anonymity, threat-model, disclosure

Level 0Cold Iron
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete

Scrub Lightly, Declare Boundaries

Anvil's sealed rail promises a serving boundary, not mystical anonymity. The engine stores the real mask-to-brain mapping but serves it to nobody—not Dad, spectators, Pippa's Sidekick, or judges—until the run is finalized or aborted. The UI cannot leak a field it never receives.

Before text crosses between seats or enters a live masked surface, the sealed scrubber substitutes known model, vendor, brain-name, and self-identification tells. Raw bytes remain stored beside the scrubbed distribution copy. The trail records hit classes rather than the tell tokens themselves.

This mechanism is deliberately bounded. Unknown stylistic or factual fingerprints can pass; the system must not claim that inference is impossible. The artifact is changed only by narrow substitutions, never by broad paraphrase that would install the scrubber as a hidden author.

Open Runs use another contract: Dad sees the truthful field live, judges are norm-masked, prose gets a light explicit-tell pass, and artifact files stay byte-faithful. Saying “Anvil is anonymous” without naming the rail hides this essential distinction.

Enforce the serving boundary and state the residual risk. Sealed rail masks every live viewer; Open Run restratifies visibility honestly.

Code

An honest scrubber records classes, never contents·python
import re

TELLS = {
    "model-name": re.compile(r"\b(gpt|claude|gemini|llama)\b", re.I),
    "self-id": re.compile(r"(as an ai|i am a .{0,12}(model|assistant))", re.I),
}


def scrub(text):
    """Keep the raw, substitute the distribution copy, log classes only."""
    out, hits = text, []
    for cls, pat in TELLS.items():
        out, n = pat.subn("[REDACTED]", out)
        if n:
            hits.append({"class": cls, "count": n})   # never the string itself
    return {"raw": text, "scrubbed": out, "scrub_hits": hits}


rec = scrub("As an AI built on Claude, here is the patch.")
print(rec["scrubbed"])
print(rec["scrub_hits"])

# The raw is untouched — we still have to prove what the author wrote.
assert "Claude" in rec["raw"] and "Claude" not in rec["scrubbed"]
# And the trail never carries the tell string.
assert all("Claude" not in str(h) for h in rec["scrub_hits"])

External links

Exercise

For a sealed run and an Open Run, list what identity information Dad, Pippa, spectators, contestants, and judges receive before and after terminal state.
Hint
The rail changes Dad's live view; judges remain identity-masked.

Progress

Progress is local-only — sign in to sync across devices.
Spotted a bug or have feedback on this page?Report an Issue

Comments 0

🔔 Reply notifications (sign in)
Sign inPlease sign in to comment.

No comments yet — be the first.