본문 바로가기
C.W.K.
Stream
Lesson 03 of 04 · published

가볍게 걷어내고 한계를 밝혀

~11 min · 걷어내기, 익명성, 위협-모형, 공개

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

가볍게 걷어내고 한계를 밝혀

Anvil의 봉인된 레일은 신비한 익명성이 아니라 전달의 경계를 약속해. 엔진은 진짜 가면-브레인 대응을 저장하지만, 회차가 확정되거나 중단될 때까지 아빠에게도 구경꾼에게도 Pippa Sidekick에게도 심사위원에게도 내주지 않아. 화면은 애초에 받지 못한 항목을 흘릴 수가 없어.

글이 자리 사이를 건너거나 가려진 화면에 올라가기 전에, 봉인된 걷개가 알려진 모델·업체·브레인 이름과 스스로를 밝히는 단서를 다른 말로 바꿔. 원본 바이트는 걷어낸 배포본 옆에 그대로 저장돼. 기록 줄기에는 단서의 내용이 아니라 어떤 부류가 걸렸는지만 남아.

이 장치는 일부러 범위를 좁혀 뒀어. 모르는 문체나 사실관계의 지문은 그냥 지나갈 수 있으니 추론이 불가능하다고 주장하면 안 돼. 결과물은 좁은 치환으로만 바꾸고, 걷개를 숨은 저자로 만드는 넓은 의역은 하지 않아.

Open Run은 다른 계약을 써. 아빠는 정직한 참가진을 실시간으로 보고 심사위원에게는 규범상의 가면이 남아. 글에는 눈에 띄는 단서만 가볍게 걷어내고 결과물 파일은 바이트 그대로 둬. 어느 레일인지 말하지 않고 ‘Anvil은 익명이야’라고만 하면 이 핵심 차이를 숨기게 돼.

전달의 경계는 강제하고 남는 위험은 밝혀. 봉인된 레일은 실시간 관람자를 모두 가리고, Open Run은 무엇이 보이는지를 솔직하게 다시 나눠.

Code

정직한 걷개 — 부류만 기록한다·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|저는 .{0,12}(모델|어시스턴트))", re.I),
}


def scrub(text):
    """원본은 보존하고, 배포본만 치환하고, 단서는 부류로만 남긴다."""
    out, hits = text, []
    for cls, pat in TELLS.items():
        out, n = pat.subn("[REDACTED]", out)
        if n:
            hits.append({"class": cls, "count": n})   # 내용은 남기지 않는다
    return {"raw": text, "scrubbed": out, "scrub_hits": hits}


rec = scrub("As an AI built on Claude, 이 패치를 제안해.")
print(rec["scrubbed"])
print(rec["scrub_hits"])

# 원본은 손대지 않는다 — 저자가 실제로 뭘 썼는지 증명해야 하니까.
assert "Claude" in rec["raw"] and "Claude" not in rec["scrubbed"]
# 기록에는 단서 문자열이 절대 들어가지 않는다.
assert all("Claude" not in str(h) for h in rec["scrub_hits"])

External links

Exercise

봉인된 회차와 Open Run에서, 종결 전후로 아빠·Pippa·구경꾼·참가자·심사위원이 각각 받는 정체 정보를 나열해.
Hint
레일에 따라 아빠가 실시간으로 보는 게 달라지고, 심사위원은 어느 쪽이든 가려진 채로 남아.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.