← all weeks week of 2026‑07‑09 · v3 (latest) · 무누수 통합판 prev: 2026‑07‑03 (v2, fork‑시대)

research build log · ARC-AGI-3 · ft09 · 2026‑07‑09 통합판 · 무누수(leak-free) · fork=0

fork를 완전히 걷어낸 wake‑sleep 루프가 ft09에서 0 → 3 레벨을 오른다 — 검증은 전부 자기 세계모델 위의 predict‑verify.

과거의 “WIN”은 엔진 복제(fork) 브루트포스의 산물이었다. 이 페이지의 모든 숫자는 fork_dependence=0인 런에서 나왔고, 모든 인용은 실제 아티팩트에서 검증했다.

0 → 3levels · B1_on_s1 · 30라운드 79액션 21.3RHAE · B1_on_s1 (OFF arm 7.1) fork = 0fork_dependence · 완주 6런 전부 7 / 3confirmed / dropped · unseen 확정 게이트

sleep ON vs OFF (동일 모델·동일 wake·30라운드): seed0 RHAE 5.48 vs 1.27, seed1 21.3 vs 7.09 — 두 시드 모두 sleep arm 우위 (runs/stageB_v3/logs/B1_*.log final).

이전 판(2026-07-03)과 무엇이 다른가 — 한 문단 요약

v2 페이지의 “레벨 4 WIN”은 사후 포렌식에서 fork-브루트포스 아티팩트로 판정됐다: 13개 sleep 패스 중 12개가 엔진 복제본에 후보를 돌려보고 고르는 식이었다. 이번 판은 그 목발을 하드 펜스로 금지(Game.fork 호출 즉시 raise + 종료 시 assert fork_dep==0)하고, 스킬 검증을 전부 자기 세계모델 위의 predict-verify로 옮긴 뒤의 첫 통합 기록이다. 프롬프트의 게임 지식 유출 3개 표면도 같은 날 제거했다(커밋 859dc59 → 83ab400 → a921b9c). 숫자는 작아졌지만 전부 진짜다.

01

How it works — 오늘의 무누수 wake‑sleep 루프 (fork 어디에도 없음)

각 노드를 펼치면 이상 · 코드 · 실측

wake가 매 턴 메커니즘 가설을 세워 행동하고, 클릭이 바꾼 모든 셀이 OBSERVED로 돌아오고, 예측이 빗나가거나(surprise) 레벨이 안 오르면(stuck) sleep이 돈다. sleep은 채굴 → advantage 게이트 → 주차(park) → 생성기가 못 본 전이로 확정(confirm)까지, 게임 복제 없이 자기 세계모델만으로 채점한다. 아래 지도는 03의 위기 카드들이 재사용하는 그 지도다 — 여기서는 고장 없는 상태.

무누수 루프 전도 — 프롬프트 → wake 추론 → 행동·관측 → 트리거 → sleep(채굴→채점→수용) → 스킬 저장소 → 브리핑 ↩

fork_dependence = 0 (assert 강제) confirm은 unseen 전이로만 sleep 트리거 = surprise(τ=0.8) 또는 stuck(3턴) 후보 k=4 / sleep 모든 수치 출처: runs/stageB_v3 + ledger

WAKE — 4블록 프롬프트 → 메커니즘 가설 → 행동
이상 기대치

에이전트는 (A) 환경 (B) 액션 API (C) 플레이 방법 (D) 세계모델+스킬 사용법, 딱 네 블록만 안다. 매 턴 “무엇이 무엇과 관계 맺는가”로 2-3개 메커니즘 가설(HYPOTHESIS:)을 세우고 가장 판별력 있는 하나에만 행동한다. 절대좌표 목표 금지.

코드 위치

ttso/auto/thin_run.py:56 (PROMPT 상수, 4블록) · 가설 규율은 블록 C(thin_run.py:90-99) · 한 라운드 = python 블록 1개, 지속 샌드박스에서 exec.

실측 (B1, 30라운드)

on_s1: 79액션으로 3레벨, on_s0: 35액션으로 1레벨 (runs/stageB_v3/logs/B1_on_*.log final). 시뮬레이션 상한 SIM_CAP=3/라운드, 클릭 상한은 턴마다 피드백에 명시.

↓ 매 행동은 진짜 엔진에 제출되고, 엔진의 다음 그리드만 관측으로 돌아온다
LEAK BOUNDARY — 프롬프트는 환경+API만 노출 (3개 표면 소거 완료)
이상 기대치

에이전트-대면 텍스트 어디에도 이 게임의 메카닉/승리조건 어휘가 없어야 한다. 프롬프트 주석 원문: “It exposes the ARC environment and the action API but NEVER this game's mechanics/win-condition — the agent DISCOVERS what an action does.”

코드 위치

ttso/auto/thin_run.py:52-55 (PROMPT 경계 주석) · ttso/eval/g2_run.py:60 (_MINER_CTX: 마이너에게도 인터페이스+“(hidden) win condition”만) · sleep 프롬프트 ttso/prompts/miner.txt·refine.txt.

실측 (커밋 타임라인)

표면 3개를 순차 제거: ① miner.txt Lights-Out 어휘 일반화(859dc59, 18:00) → ② scaffold PROMPT/PROMPT_ACI 삭제 + coupled·distant·neighbours·toggle-family 제거(83ab400, 19:05) → ③ store 시드 렌즈의 COUPLED/orthogonal-neighbours/distant 어휘(a921b9c, 19:25). 이후 전 표면 프로그램 스윕 CLEAN(커밋 메시지 원문). 상세는 03의 위기 카드 ④.

OBSERVED full-diff — 클릭이 바꾼 모든 셀을 에코
이상 기대치

클릭 셀만이 아니라 그 클릭이 실제로 바꾼 모든 셀(결합 이웃, 원거리 토글 포함)을 관측 라인으로 돌려준다 — 승리조건 읽기 없음, fork 없음. 결합/간접 동역학은 이 라인 없이는 학습 불가능했다.

코드 위치

ttso/auto/thin_run.py:188 (_diff_entry: 클릭셀 before→after 선두 + 나머지 변화셀을 맨해튼 거리순, DIFF_CAP=20) · 피드백 부착 thin_run.py:557 (“OBSERVED: …”, 라운드당 OBS_CAP=12 클릭).

실측 (sleep가 소비한 관측)

sleep 리포트의 observed 트랜지션: B1_on_s0 sleep#1에서 14개, B1_on_s1 sleep#4에서 21개. predict-verify 행 누계: B1_on_s0 16, B1_on_s1 22 (final의 2_eval_predict_verify_rows).

↓ 로깅된 실제 전이는 매번 MAP 메커닉으로 즉시 예측-검증된다
TRIGGER — surprise(예측 빗나감) 또는 stuck(레벨 무진행)
이상 기대치

둘 중 하나면 sleep: (a) 최고-credence 메커닉의 부분점수 예측 정확도가 실제 전이에서 τ=0.8 미만(surprise — 세계가 모델과 다르다) → 즉시, (b) 레벨 무진행 3턴 연속(stuck) + 새 증거 8개 이상 축적(ripe) → 발화. 그리드 novelty가 아니라 레벨 진행만이 stuck의 기준.

코드 위치

ttso/core/control.py:69 (control; stuck_k=3은 :42) · control.py:119 (force_sleep_on_mismatch, tau=0.8) · 평가 지점 ttso/eval/g2_run.py:282 (_check_transition; 임계 0.8은 :296) · 런 파라미터 g2_run.py:215 (cooldown 4, min_evidence 8).

실측 (sleep 발화 횟수, 완주 final)

30라운드 B1: on_s0 3회, on_s1 5회. 60라운드 B3(완주): s0 12회, s1 8회 (각 final의 sleep_reports 길이).

↓ sleep 진입 — 진짜 게임에는 아무것도 적용되지 않는 오프라인 구간
MINE — 잔차(residual)를 겨냥한 후보 k=4 제안
이상 기대치

마이너는 현재 룰셋이 커버하지 못한 잔차 셀(관측됐지만 예측 안 되는 변화)을 명시적으로 겨냥해 mechanic 후보를 쓴다. 스텝 크기 ∝ 잔차: 잔차가 크면 구조적으로 다른 룰, 작으면 국소 수정.

코드 위치

ttso/sleep/mine.py:320 (mine) · 잔차 프롬프트 ttso/sleep/sleep.py:796 (_residual_prompt) · 스텝 크기 sleep.py:842 (_step_size) · 오케스트레이션 sleep.py:865 (sleep).

실측

sleep당 proposed=4 (k=4). 잔차 하강의 실례: B3_on_s0 L0 잔차 306셀 → 0셀 (sleep#0의 residual_before 306 → sleep#1의 residual_before 0); B1_on_s0은 residual 1.0 → 0.403 (ledger/sleep 리포트).

↓ 후보마다
GATE — advantage_on_union > 0 (fail-closed)
이상 기대치

후보가 라이브 룰셋 union의 predict-accuracy를 올릴 때만(ΔIG > 0) 통과. 잔차를 덮되 기존을 후퇴시키지 않으면 >0, 허위 셀만 발명하면 <0. fork도 oracle도 ground-truth 손실도 없다.

코드 위치

ttso/sleep/judge.py:384 (advantage_on_union = predict_accuracy(ruleset+[cand]) − predict_accuracy(ruleset)).

실측 (v3 완주 4런 합산)

mechanic 후보 판정: rejected 64 / parked 13; diff-검증 불가한 strategy 레코드는 별도로 accepted 31 (4개 ledger 완주 합산; GENERALIZE 주석이 붙은 채 흐른 후보 21).

↓ 통과해도 커밋 아님
PARK — mine ≠ commit: 라이브러리 바깥에 주차
이상 기대치

mine 시점 buffer로 뽑힌 후보는 그 buffer에 과적합일 수 있다. 즉시 커밋하지 않고, 마이너가 본 트랜지션 키(mine_keys)를 스탬프해서 주차한다. 주차 스펙은 확정 전까지 세계모델에 보이지 않는다.

코드 위치

ttso/sleep/store.py:249 (park) · 주차 결정 지점 ttso/sleep/sleep.py:1014-1025.

실측 (ledger 원문)

B3_on_s0 sleep#0, fp a882f2ec6f: advantage 0.6216>0 → “PARKED for post-park confirm (not yet committed)”. v3 전 런 parked 13.

↓ 다음 sleep은 mining보다 먼저 CONFIRM 패스를 돈다
CONFIRM — 생성기가 못 본(post-park unseen) 트랜지션으로 재채점
이상 기대치

주차 이후 게임이 쌓은 트랜지션 중 mine_keys에 없는 것(strictly held-out)으로 advantage_on_union을 다시 잰다. >0이면 승격, ≤0이면 과적합으로 드롭 — 일반화한 룰만 라이브러리에 들어간다.

코드 위치

ttso/sleep/commit.py:49 (confirm) · CONFIRM-first 순서 ttso/sleep/sleep.py:904 · 승격/격리 store.py:271 (resolve).

실측 (ledger 원문)

B3_on_s0 sleep#1: adv 0.9086 > 0 on 4 post-park transition(s) the generator never saw → promote. v3 합산 confirmed 7 / dropped 3 (드롭 사유 원문: “overfit the mine-time buffer, does not generalize”).

↓ 승격된 레코드의 신념은 이후 실제 전이마다 갱신
BETA CREDENCE — 신념 = Beta 사후평균, 재적용은 idempotent
이상 기대치

credence = α/(α+β). 로깅된 실제 전이 하나당 부분점수(F1)로 α+=hit, β+=1−hit — 반쯤 맞으면 반만 인정. 같은 트랜지션 키는 두 번 세지 않는다(replay가 사후분포를 더블카운트하지 않음).

코드 위치

ttso/sleep/store.py:105-111 (alpha/beta 필드, credence 프로퍼티) · 갱신 store.py:289 (observe_transition; α+=credit은 :307).

실측

Stage-A A2 게이트(결정적 하네스): α 1.0 → 2.33, 동일 트랜지션 replay 후에도 2.33 (idempotent). 라이브 예: M1이 브리핑에 쓴 B3 mechanic의 credence 0.798 (/tmp/m1_summary.json).

↻ package — sleep의 산출물이 wake로 돌아간다
PACKAGE — 브리핑 렌더 → 매 라운드 피드백에 재주입
이상 기대치

확정 스킬을 credence 순으로, 지금 보드에서 when이 성립하는 것만 골라 브리핑으로 렌더(cap 8000자). 판별 probe는 VoI 게이트(EIG×가치 > RHAE 한계비용)를 통과할 때만 노출; 못 넘으면 “합의된 것에 커밋하라”로 바뀐다. wake가 이 브리핑을 실제로 읽고 써야 루프가 닫힌다.

코드 위치

ttso/sleep/package.py:107 (render) · 라운드마다 재렌더 ttso/eval/g2_run.py:202 (_package; 라이브 보드로 when-검색) · thin_run이 피드백 메시지에 부착.

실측 (M1 측정)

동일 보드·동일 프롬프트 쌍대 비교: 브리핑 arm 인용률 6/6 vs 무브리핑 0/6 vs 브리핑 전 라운드 0/12 — 재주입된 브리핑을 wake가 진짜로 사용한다 (/tmp/m1_summary.json).

↓ 무결성 펜스
FORK-BAN — Game.fork는 raise하도록 몽키패치, 종료 시 assert
이상 기대치

파이프라인 어느 경로도 진짜 엔진을 복제해 미리 돌려볼 수 없다. 스킬 검증은 전부 자기 세계모델 위의 predict-verify. 과거의 “WIN”이 fork-브루트포스 아티팩트였던 전력이 있으므로, 소프트 규약이 아니라 하드 펜스로 강제한다.

코드 위치

ttso/eval/g2_run.py:226-234 (_banned_fork: 호출 즉시 RuntimeError + 카운트) · g2_run.py:430 (assert fork_dep["n"] == 0) · 결과 필드 fork_dependence.

실측

완주한 모든 final에서 fork_dependence = 0: B1 on/off × seed 0/1 네 런 + B3 on × seed 0/1 두 런, 여섯 final 전부 (runs/stageB_v3/logs/*.log 마지막 줄). 시도 자체가 0회 — raise가 아니라 카운터가 0.

경계 요약: 에이전트가 아는 것 = 4블록 프롬프트(환경+API) + 자기 관측 + 자기 브리핑. 에이전트가 못 하는 것 = 엔진 fork, 승리조건 읽기, 게임별 어휘가 실린 힌트 수신. 노드별 전체 서술은 파이프라인 저널, 실험 카드는 RQ 저널.

02

Prior works — 같은 다섯 단계, 네 개의 시스템

프롬프트 → 추론 → 행동 → 검증 → 기억 · 가로 스크롤

네 시스템을 같은 다섯 위상에 정렬했다 — 셀마다 실제 함수/프롬프트 이름. 각 레인 머리의 딥다이브 링크는 소스 원문 해부 페이지로 간다. 우리 레인이 다른 셋에서 무엇을 흡수했는지 열 단위로 비교해서 읽으면 된다.

시스템 프롬프트 추론 행동 검증 기억 실플레이
SkillOpt Microsoft · arXiv:2605.23904 · 스킬 문서 = 파라미터 ▸ 딥다이브 skill.md (+ LEARNED 보호 영역)

스킬 문서 자체가 태스크 프롬프트에 주입되는 유일한 학습 대상.

run_minibatch_reflect(…)

성공/실패 궤적 미니배치를 분리 분석해 textual gradient(패치)를 뽑는다.

rollout

현재 skill.md를 쥔 에이전트가 태스크를 실행, 채점된 궤적 수집.

evaluate_gate(…) → GateResult

held-out 태스크에서 엄격히 개선될 때만 편집 수용.

merge_patches · best_skill.md + runtime_state.json

패치를 모멘텀처럼 누적·병합, rejected-edit buffer로 재범 방지.

스킬 문서 최적화 프레임워크
(ARC 플레이 영상 없음)
baseline1 astroseger · 파일-편집 실행형 세계모델 ▸ 딥다이브 prompts/*.txt (21개 상태머신)

normal/stuck/reset/trouble 상황별 프롬프트를 상태머신이 선택.

initial_state_reconstruction → world_model_engine(state, action)

프레임을 내부 상태로 재구성하고, 세계모델을 실행 가능한 파이썬 파일로 쓴다.

plan_executor.py · planner(state)

예측-실행-대조 루프: 계획을 내고 실제 프레임과 맞춰본다.

verify_world_model.py::_replay_attempt · save_mismatch_region_png_v1

과거 attempt 전체를 리플레이, 불일치 시 VerificationMismatchError + 불일치 영역 PNG.

world_model_engine.py · world_model.md · read_all_attempts_for_level

세계모델 파일 4종 + attempt 로그가 기억; 매 세션 재읽기.

Codex 단일 에이전트
(로컬 클론 소스 해부는 딥다이브)
symbolica agentica · 다중에이전트 NL 스킬 DB · 우리 엔진의 모체 ▸ 딥다이브 GAME_REFERENCE

환경+API만 노출, 메카닉/승리조건은 절대 금지 — 우리 무누수 경계의 원형.

THEORIST premise

가설은 메커니즘으로 서술, 좌표 금지; explorer가 포킹·디프로 증거 수집.

spawn_agent(solver/tester) · REPL submit_action

오케스트레이터가 서브에이전트를 띄워 공용 REPL에서 행동.

compute_judge (fail-closed)

모드-조건 채점 블록; 통과 못 하면 커밋 자체가 안 된다.

스킬 DB 레코드 (posterior 필드)

모든 지식 조각에 사후확률; 의심스러우면 삭제가 아니라 격리.

symbolica가 ft09 6레벨 전부를 106스텝에 클리어하는 실제 리플레이 ft09 6/6 클리어 · 106스텝
recordings/ft09.arcgentica.fdd0c334…
ours (v3) 무누수 wake-sleep · fork=0 · 확률층이 차별점 ▸ 파이프라인 딥다이브 thin_run.py PROMPT (4블록)

환경/API/플레이법/WM 사용법만; 게임 어휘 3개 표면 제거 후 스윕 CLEAN.

HYPOTHESIS: 규율 + simulate(plan) · mismatch()

매 턴 메커니즘 가설 2-3개, 자기 세계모델 위 시뮬레이션과 불일치 국소화.

submit_action → OBSERVED full-diff (_diff_entry)

클릭이 바꾼 모든 셀(DIFF_CAP=20)이 피드백으로 에코된다.

judge.advantage_on_union → park → commit.confirm

Δ정보이득>0 + 생성기가 못 본 unseen 전이 재채점으로만 확정. fork 금지.

store.Record (Beta α/β) + package.render 브리핑

스킬마다 Beta credence, 매 라운드 브리핑 재주입(M1: 인용률 6/6).

우리 v3 런 B1_on_s1이 30라운드 동안 0에서 3레벨로 오르는 실제 리플레이 — L1은 라운드 14, L2는 18, L3는 22 B1_on_s1 0→3 클라임 · L1@r14 L2@r18 L3@r22
runs/stageB_v3/traces/B1_on_s1.jsonl

우리가 셋 위에 더한 것(어느 레인에도 없는 열): 확률층(Beta posterior·경쟁 가설 SET·EIG/VoI 프로브), 그리고 mine≠commit의 park→unseen-confirm 2단 게이트. 대응표 원문은 docs/superpowers/specs/2026-07-09-ttso-intent-ideal-trace.md §6.

03

연구 서사 — 여섯 번의 위기, 하나의 지도

fault map · 고장은 빨강, 수리는 초록

이 기록은 무누수 재설계 이후의 것이다 — 검증은 fork 없이 이뤄졌고, 아래 모든 카드의 인용은 실제 커밋·스펙·ledger·trace에서 그대로 가져왔다. 카드마다 01의 지도를 다시 그린다: 고장난 부분이 빨갛게, 해결 뒤에는 고쳐진 부분이 초록으로. 처음 읽는 사람은 지도의 빨간 자리만 따라가도 여섯 위기의 위치를 안다.

1

만점 아니면 0점 — all-or-nothing 채점이 세계모델을 텅 비게 했다

만점이 아니면 무조건 0점만 주는 선생님 밑에서는, 아무도 성장 기록을 쌓지 못한다.

np.array_equal 전부-일치 채점이 불완전한 첫 세계모델을 전부 기각 — 아무것도 축적되지 않고 surprise 트리거는 죽은 채였다.

fault: 채점 노드가 전부-아니면-0 → 저장소가 빈 채로 남는다
실사례 원문
“the all-or-nothing (np.array_equal) judge could never accept an imperfect first world model, so nothing accumulated and the surprise trigger stayed dead.” git log 4c7da76 — docs: consolidated TTSO design (3개 선행 수정이 L0에서 정체한 원인 진단)

부분점수 F1 채점으로 교체 — 변화 셀에 대한 F1로 채점하고, 부분 점수가 Beta로 축적되게 했다. a76ea3a

fixed: 채점 = 변화 셀 F1 부분점수, 0.33도 축적된다

토이 4축 하네스 8/8 (0.57s): partial_score 0.33이 Beta로 축적·idempotent, keep-if-better가 full-over-partial 수용 (커밋 a76ea3a 검증 절). Stage-A A2 게이트: α 1.0 → 2.33, 동일 전이 replay 후에도 2.33.

2

catch-22 게이트 — 서로 먼저 열리길 기다리는 두 문

문 A는 “문 B가 열리면 열림”, 문 B는 “문 A가 열리면 열림” — 아무도 못 지나간다.

residual>0.3이면 “구조적으로 다른 룰만 제안”을 강제하는데, 부분 모델의 residual은 0.75–0.83에 영구 고정 — EXPLOIT/REFINE 브랜치는 도달 불가능한 데드 코드였다.

fault: sleep 내부, 채굴과 수용 사이에 맞물린 자물쇠 두 개
실사례 원문 (오프라인 재현, reproduced=true)
residual = [0.5, 0.5833, 0.6, 0.6, 0.6, 0.5875] — 콜드스타트 하강 뒤 부분-F1 점근선에서 포화, 비단조, res_hi=0.3 EXPLOIT 게이트를 영원히 못 넘는다. breadth = [1,1,1,1,1,1] — dedup이 재제안을 붕괴시켜 단일 모놀리스 mechanic만 존재. docs/superpowers/specs/2026-07-08-ttso-wm-repl-residual-cover.md §1.2 (합성 Lights-Out 픽스처, LLM 없음)
“A gate unit-sweep over residual ∈ {0.31,0.4,0.5,0.58,0.7,0.83,1.0} returns MINE-NEW for every value; only residual=0.20 returns REFINE — a residual the coupled loop provably never produces.” 같은 스펙 — Axis 3, EXPLOIT/REFINE branch is dead code

임계값 게이트 삭제 → advantage_on_union 하강 — 수용은 Δ정보이득>0 하나로, magnitude는 게이트가 아니라 스텝 크기로. 4807091 (U1)

fixed: 자물쇠 대신 advantage_on_union>0 단일 통로

커밋 검증 절 원문: “residual 20→0, breadth 1→5, reaches exploit (baseline 0x)”. 라이브 v3: B1_on_s0 residual 1.0 → 0.403, B3_on_s0 L0 잔차 셀 306 → 0 (sleep#0→#1 ledger). 낡은 게이트 삭제는 test_wm_convergence_baseline.py가 assert.

3

하드코딩된 세계모델 — 틀린 지도를 믿고 성실하게 길을 잃다

지도가 틀렸는데 지도를 의심하지 않으면, 성실할수록 더 정확하게 길을 잃는다.

라이브 r7에서 커밋된 세계모델이 절대좌표 표 xs=[36,44,52]와 고정 색 순환을 하드코딩 — fit 버퍼는 잘 맞히지만 반대 방향·새 상황에서 무너졌고, 아무 장치도 그걸 라이브에서 잡지 못했다.

fault: 저장소 속 금 간 스킬 + wake가 그 지도를 다시 참조해 도는 화살표
실사례 원문
“Catches the r7 xs=[36,44,52] failure class that nothing caught live.” docs/superpowers/specs/2026-07-09-ttso-baseline1-parity-leakfree-design.md:93 · 커밋 83ab400에도 “the live r7 xs=[36,44,52] failure class”
“The committed incumbent (fp 3eb1d93107 = bundle r7) is a 5-cycle [4,8,9,0,2]: it reproduces 8→9 (F1≈0.97) but predicts 9→8 as value 0 (F1=0.0, all wrong_value); predict_accuracy([r7])=0.407” E1 포렌식 분석 출력(2026-07-09 세션 아티팩트) — 방향 미결정(under-determination) 진단; 커밋 ae4db70 본문이 같은 진단을 요약

generality critic(정적 AST) + 상태 재구성층 — 좌표/상수 하드코딩을 플래그하고, 동역학이 raw 그리드 좌표로 쓰이지 않게 재구성층을 깔았다. 83ab400 · ae4db70 (E5)

fixed: 수용 앞에 AST 돋보기 — 하드코딩이 라이브에서 플래그된다

E5 (ae4db70, 실제 unseen ft09 전이·무누수): DIRECTION split 0/7 → 7/9 valid generalize, TIME split 6/10 → 10/10. 라이브 v3에서 실제 포착된 예 — B3_on_s0 ledger sleep#2, fp 6d732219bb: “GENERALIZE: hardcoded coordinate table (≥2 literal cells); hardcoded absolute board position 36; …44; …52” — r7과 같은 failure class가 이제 이름 붙어 잡힌다.

4

3중 프롬프트 유출 — 시험지에 답이 비쳐 보였다

시험지 뒷장에 정답이 비쳐 보이면, 그 시험 점수는 실력이 아니다.

에이전트-대면 텍스트 세 곳에 이 게임의 메카닉 어휘(coupled·distant·neighbours·toggle-family, Lights-Out, COUPLED 시드)가 스며 있었다 — 발견의 일부가 사실은 힌트였다.

fault: 게임 내부 지식이 프롬프트로 새는 빨간 점선 3가닥
실사례 원문 (커밋 3연타, 같은 날 85분)
① 18:00:55 — “Also lands the miner.txt Lights-Out genericization (2nd prompt leak removed).” git 859dc59
② 19:05:29 — “Sleep prompts fully de-leaked per the adversarial review: removed coupled/distant/neighbours/toggle-family vocabulary from miner.txt/refine.txt” (+ scaffold PROMPT/PROMPT_ACI 삭제, WAKE_MODES 중립화) git 83ab400
③ 19:25:31 — “store.py LEARN_DYNAMICS_FIRST seed carried COUPLED/orthogonal-neighbours/distant vocabulary into every run's briefing (found in the live skills_live table) — reworded to topology-agnostic.” git a921b9c

표면 셋 순차 소거 + 프로그램 스윕 — “Programmatic sweep over ALL agent-facing surfaces (prompts, seeds, PROMPT, WAKE_MODES) now CLEAN.” 859dc59 → 83ab400 → a921b9c

fixed: 프롬프트 경계에 방패 — 스윕 CLEAN

스윕 CLEAN(a921b9c 원문) + 스위트 224 passed, 0 failed. 이 페이지의 모든 v3 숫자(0→3 클라임 포함)는 이 무누수 표면 위에서 나온 결과다.

5

critic 거부권 — 맞춤법 검사기가 글을 통째로 삭제했다

맞춤법 검사기가 “고치라”가 아니라 “지우라”를 하면, 글은 영원히 완성되지 않는다.

③의 generality critic을 거부권(veto)으로 달았더니 — gpt-5.5는 자연히 literal panel box를 쓰므로 — 모든 mechanic 후보가 수용 직전에 학살됐다. catch-22 bug class A의 재림.

fault: 채점과 수용 사이 빨간 차단벽 + 그 뒤에 쌓인 후보들
실사례 원문 (코드 주석 + 커밋; veto 시대 런은 중단되어 ledger 자체가 없다)
“The gate-shaped v1 of this function starved the loop of every mechanic: gpt-5.5 naturally writes literal panel boxes, which fit the buffer and are predictive — rejecting them re-created the catch-22 bug class A.” ttso/sleep/sleep.py:705-708 (독스트링 원문)
“generality critic is GUIDANCE, not a gate — flags annotate (GENERALIZE note) + one guided refine; accept stays with advantage/held-out.” git 774e893 (2026-07-09 20:15)
전환 후 ledger 실물 — 플래그는 사유 뒤에 주석으로만 붙는다: "outcome": "rejected", "reason": "advantage_on_union=0.0000<=0: adds no predictive information to the model union | GENERALIZE: hardcoded coordinate table (≥2 literal cells); …" runs/stageB_v3/logs/B3_on_s0.ledger.jsonl, sleep#2, fp 6d732219bb — 거부의 근거는 advantage, critic은 메모

critic을 게이트에서 가이드로 — 플래그는 GENERALIZE 주석 + 가이드 refine 1회, 수용 판정은 advantage/held-out이 유지. 774e893

fixed: 차단벽 대신 메모지 — 후보는 흐르고, 주석이 다음 정련을 겨눈다

전환 직후의 v3 완주 ledger: GENERALIZE 주석이 붙은 후보 21개가 ‘메모’로 흘렀고, 같은 런들에서 mechanic이 parked 13 / confirmed 7 — sleep은 더 이상 굶지 않는다. 스위트 224 green. 이 원칙은 헌법에 성문화: “게이트 금지: critic·검사류는 가이드로만” (2026-07-09-ttso-intent-ideal-trace.md §3, 재범 이력 2회 명기).

6

L3 가설 churn — 메모 없이 매번 처음부터 시험 보는 학생

지난 시험에서 뭘 틀렸는지 적어두지 않는 학생은, 같은 문제를 몇 번이고 처음처럼 푼다.

B1_on_s1이 L3에 도달한 뒤 9라운드(r22–30) 동안 가설 27개를 세웠지만, 앞 라운드 가설을 명시적으로 참조한 것은 0건 — 같은 셀 세 곳을 각각 3번씩 재클릭하며 제자리를 돌았다.

fault: wake 추론이 제자리 순환 + 있어야 할 기억 노드 자리가 점선 빈 칸
실사례 원문 (trace 정량 + 가설 원문 대조)
정량 (runs/stageB_v3/traces/B1_on_s1.jsonl, r22–30): HYPOTHESIS 행 27개 (9라운드 × 3), 이전-가설 명시 참조 0건, 재클릭 ×3: (23,17)·(23,33)·(23,49) 각 3회. trace 파싱으로 재검증 (2026-07-10)
같은 아이디어가 라운드를 건너 처음처럼 다시 태어난다 — r24: “A 6x6 nonuniform block is a 3x3 recipe: symbol 0 means the recipe centre colour.” → r30: “Clue symbols are absolute palette indices: low symbol maps to the first palette colour…” — r27이 “The earlier target rule is incomplete”라고 말하면서도, 어떤 장부도 가리키지 못한다. B1_on_s1.jsonl reasoning 원문 (HYPOTHESIS 라인 발췌)

가설 장부(hypothesis ledger) — C-v3 설계, 구현 진행중 — 하네스가 가설→운명을 자동 기록하고 TRIED&REFUTED를 매 라운드 재주입 (헌법 §3 기억 4층의 ②). b0b8d35 (설계)

planned: 같은 지도에 점선 초록 ‘가설 장부’ 노드가 추가된다 (진행중)
진행중 검증은 아직 없다 — 더미 숫자를 적지 않는다. 예정 지표:
  • REFUTED 참조율 / 재제안률(↓) / stuck 후 top-VoI 행동 선택률 (헌법 §2 루브릭 3)
  • L3 재도전에서 재클릭 ×3 패턴 소멸 여부, 가설 수 대비 신규-정보 비율
  • wandb: ttso-C-L3rematch · ttso-C-fullgame
04

Explorer — 원자료로 직접 걷기

리플레이 · wandb · C-run 슬롯

이 페이지의 모든 주장 뒤에는 걸어 들어갈 수 있는 원자료가 있다. 숫자가 의심되면 아래에서 직접 확인하면 된다.

원자료 경로: 트레이스 runs/stageB_v3/traces/*.jsonl · ledger runs/stageB_v3/logs/*.ledger.jsonl · final은 각 *.log 마지막 줄 · GIF 소스는 각 캡션에 명기.