experiment journal · 2026-07-09 · RQ 카드

RQ 저널 — 오늘의 질문, 판정, 진짜 숫자

카드 하나 = 질문 하나. 판정과 핵심 숫자는 전부 실제 아티팩트 (runs/stageB_v3/logs/*.ledger.jsonl, 런 final, M1 요약 JSON, 결정적 하네스 재실행)에서 검증한 것만 적었다. 파이프라인의 각 노드가 어디서 뛰는지는 pipeline 페이지 참조.

01

Stage A — 4축 결정적 게이트 (전부 GREEN)

실제 LLM도, 라이브 게임도, fork도, oracle도 없는 밀리초 단위 토이 하네스 (ttso/eval/stage_a_harness.py)로, 새로 구현한 루프 조각이 원리적으로 작동하는지 먼저 게이트한다. 아래 숫자는 하네스를 이 페이지 작성 시점에 재실행해 얻은 결정적 출력 그대로다.

RQ-A1 · creategreen

증거만 보는(타깃 룰을 결코 못 보는) 마이너가 부분적으로 옳은 mechanic을 만들어 store에 넣는가?

  • proposed 1 → in_store 1; miner_saw_target 0 (누수 부정 대조)
  • 제안된 mechanic의 partial_score 0.3333 — 완전하지 않아도 0이 아니게 진입

wandb ttso-A1-create

RQ-A2 · evalgreen

partial judge가 그 mechanic을 0보다 크게 채점하고, Beta credence가 replay에 더블카운트 없이 누적되는가?

  • partial_score 0.3333 > 0; accumulated 1
  • α 1.0 → 2.3333 (β 2.6667); 동일 트랜지션 replay 후 α 2.3333 그대로 — idempotent

wandb ttso-A2-eval

RQ-A3 · loopgreen

잔차가 0으로 내려가고, 경쟁 mechanic 집합은 붕괴하지 않으며, compress와 add 중 뭘 택해야 하는가?

  • residual_trajectory [0, 0, 0, 0] (refine 없는 대조군 잔차 16)
  • 집합 유지: breadth 1→2, union 정확도 0.5714 > 단일 0.3333; EIG 판별 probe 0.6931 vs 무의미 probe 0.0
  • 측정이 설계를 결정: add-not-replace 전이 1.0 vs compress 이식 0.0 → compress.py 삭제(커밋 a921b9c)

wandb ttso-A3-loop

RQ-A4 · usegreen

stub wake가 확정된 세계모델을 회수해 mismatch()로 오류를 국소화하고, 그 모델 위의 계획으로 토이를 실제로 깨는가?

  • mismatch(): 틀린 모델 f1 0.3333(놓친 셀 4개 지목) / 확정 모델 f1 1.0
  • GF(2) 계획 5클릭 → predicted_clear 1 → 실제 clear 1 (fork-free, ground-truth WIN)

wandb ttso-A4-use

02

B1-discovery — sleep 루프의 순기여 (완주)

RQ-B1 · discoveryon ≥ off (양 시드)

같은 예산(ft09, 30라운드, gpt-5.5)에서 sleep 루프를 켠 arm(on)이 끈 arm(off)보다 레벨을 더 깨는가 — fork 없이?

runlevels / 30RactionsRHAEforkledger: park / confirm / drop / reject / accept
B1_on_s01355.4802 / 1 / 0 / 7 / 3
B1_off_s01331.270— (sleep 없음)
B1_on_s137921.3003 / 2 / 0 / 11 / 6
B1_off_s12877.090— (sleep 없음)
  • 판정: on = {s0: 1, s1: 3} vs off = {s0: 1, s1: 2} — 두 시드 모두 on ≥ off, seed 1에서 엄격히 우위(3 > 2). 단 n=2 시드의 예비 신호이지 통계적 확증이 아니다.
  • on arm의 sleep 생애주기(ledger 집계): s0 — sleep 3회 발화, parked 2 · confirmed 1 · dropped 0; s1 — sleep 5회, parked 3 · confirmed 2 · dropped 0. reject는 advantage_on_union ≤ 0 후보.
  • 모든 final에서 fork_dependence = 0, plan_replay_dependence = 0 (하드 assert 통과).

wandb ttso-B1-discovery · data runs/stageB_v3/logs/B1_*.{log,ledger.jsonl}

03

B3-clear — 60라운드 클리어 시도 (진행 중)

RQ-B3 · clear진행 중 — 라운드 50/60 스냅숏

라운드 예산을 60으로 늘리면 sleep-on arm이 ft09를 얼마나 깊이 들어가는가?

runroundlevelsactionssleep 발화ledger: park / confirm / drop
B3_on_s050112894 / 3 / 1
B3_on_s15028264 / 1 / 2
  • 2026-07-09 22:05 UTC 시점, 두 런 모두 실행 중(NOT_FINISHED). 최종 판정은 완주 후.
  • 이 런에서 park→confirm 게이트의 대표 사례가 나왔다: s0 sleep#1의 adv 0.909 on 4 post-park unseen transitions 승격, 그리고 과적합 후보 3건의 사유 있는 드롭(“overfit the mine-time buffer”).

wandb ttso-B3-clear · data runs/stageB_v3/logs/B3_*.{log,ledger.jsonl} (라이브)

04

M1 reference-rate — wake는 브리핑을 진짜 쓰는가 (완료)

RQ-M1 · reference-ratewake-uses-briefing

package가 재주입한 브리핑을 wake 에이전트가 인용하고, 규칙으로 채택하고, 행동을 바꾸는가 — 아니면 장식인가?

  • 설계: 같은 보드 3개 × nonce 2 = 6쌍, A arm(브리핑 포함) vs B arm(브리핑 제거)의 2라운드 응답을 채점. 브리핑된 mechanic은 라이브 B3 런이 실제로 캐낸 것(credence 0.798).
  • 인용률: 브리핑 arm 6/6 vs 무브리핑 0/6 vs 브리핑 도착 전 1라운드 0/12(양 arm 0.0) — 인용은 브리핑이 만든 것이지 게임 화면이 만든 게 아니다.
  • 규칙 채택: 6개 중 5개가 브리핑된 매크로타일-repaint 규칙을 행동을 이끄는 가설로 그대로 채택; 나머지 1개(b1r3-n0)는 인용하되 수정 가설(“not a blind blue/red toggle”)로 대체했다.
  • 도구 사용은 불변: simulate/mismatch 호출 2/6 vs 2/6 — 브리핑은 내용을 바꾸지 도구 습관을 바꾸지 않는다. 행동 차이: 6/6 쌍에서 액션 집합이 달라짐(Jaccard 0.0).

브리핑 arm 응답 원문 발췌 (/tmp/m1_replies.jsonl):

b1r9-n1/A: "HYPOTHESIS: ACTION6 on a large colored macro-tile toggles/repaints
            the whole tile between the two main colors. ..."
b1r6-n1/A: "HYPOTHESIS: ACTION6 on a macro-tile cycles/toggles that whole tile
            between the two main colors; ..."
b1r9-n0/A: "EXPECT: ACTION6 on one target macro-tile will recolor that whole
            tile/component; ..."
  • 부수 수확 — EXPECT-파서 버그 발견: 액터는 EXPECT/HYPOTHESIS를 코드 블록 안 print()로 내보내는데 채점기는 reply 본문만 파싱해 expect-log가 비어 있었다. stdout까지 파싱하도록 수정(커밋 a9bd619).

data /tmp/m1_summary.json + /tmp/m1_replies.jsonl · harness ttso/eval/m1_reference_rate.py

05

실패 → 수정 서사 — 오늘 두 번 넘어지고 두 번 고쳤다

FAIL-1 · critic 게이트가 mechanic을 전멸시킴가이드-온리 전환

좌표 하드코딩을 잡으려고 넣은 generality critic을 거부 게이트로 배선했더니, sleep이 mechanic을 하나도 확보하지 못했다.

  • 원인: gpt-5.5는 “맞고 예측도 되는” 리터럴 패널 박스 룰을 자연스럽게 쓴다. 정적 플래그 = 즉시 거부로 만들자 모든 후보가 죽는 catch-22가 재발했다. 커밋 774e893 원문: “The veto starved sleep of every mechanic.”
  • 수정: critic은 가이드, 게이트 아님 — 플래그는 GENERALIZE 주석 + 1회 유도 refine으로만 쓰이고, 수용 결정은 advantage/held-out에 남는다 (ttso/sleep/sleep.py:692 _generality_critique: “GUIDANCE, NOT A GATE”).
  • 수정 직후 런(B3_on_s0)에서 첫 CONFIRM이 나왔다. ledger 원문 두 줄:
sleep#0  fp a882f2ec6f  "advantage_on_union=0.6216>0 at mine time
         -> PARKED for post-park confirm (not yet committed)"
sleep#1  fp a882f2ec6f  "CONFIRM advantage_on_union=0.9086>0 on 4
         post-park transition(s) the generator never saw -> promote"

commit 774e893 (2026-07-09 20:15) · ledger runs/stageB_v3/logs/B3_on_s0.ledger.jsonl

FAIL-2 · 3중 유출표면 셋을 순차 소거

“무누수”라 믿던 파이프라인에서 게임 동역학 어휘가 세 표면을 타고 새고 있었다.

  • ① 19:05 (83ab400) — scaffold PROMPT + PROMPT_ACI 삭제, 단일 4블록 프롬프트로 교체; sleep 프롬프트(miner.txt/refine.txt)에서 coupled·distant·neighbours·toggle-family 어휘 제거.
  • ② 같은 커밋 — WAKE_MODES divide/notes 문구와 BOARD DRIFT 라인 재서술; MDL 가이드는 메카닉 예시 없는 추상 문장으로.
  • ③ 19:25 (a921b9c) — 세 번째 표면은 store 시드 렌즈: LEARN_DYNAMICS_FIRST가 COUPLED/orthogonal-neighbours/distant 어휘를 매 런 브리핑에 실어 나르고 있었고, 라이브 skills_live 테이블에서 발견됐다. topology-agnostic으로 재서술.
  • 종결 확인: “Programmatic sweep over ALL agent-facing surfaces (prompts, seeds, PROMPT, WAKE_MODES) now CLEAN” (커밋 메시지 원문). 이 스윕 이후의 런만이 위 B1/B3 카드의 숫자다.

commits 859dc59 → 83ab400 → a921b9c (설계 → 표면 1·2 → 표면 3)

공통 교훈: 두 실패 모두 “코드가 통과한다”와 “시스템이 배운다”는 다른 명제라는 것. 게이트는 살아 있는 분포(실제 LLM이 쓰는 룰의 모양)에 대고 검증해야 하고, 누수는 프롬프트 상수만이 아니라 시드·모드 문자열·브리핑 렌더러까지 에이전트가 읽는 모든 표면을 스윕해야 잡힌다.