검증기가 자기 자신을 검증하기 시작했다
+v02 이후 이 하네스에서 벌어진 가장 큰 변화는 기능 추가가 아니라 검수의 성격이다. + CI 검증기가 3종 → 7종으로 늘었고, 그중 둘은 "우리 게이트가 실제로 잡는가"를 mutation으로 시험한다. + 이 설계서가 반복해 지적해온 "문서에만 있는 보장은 보장이 아니다"가 **기계로 강제**되기 시작했다.
+분석 + 논문 생산
도메인 슬롯 1 + 재사용 9
◆ 개요 — 4개 기둥과 전체 흐름
+자동화의 목표는 사람을 빼는 것이 아니라, 사람이 판단해야 할 지점만 남기고 나머지 노동을 에이전트가 대신하는 것.
+ +(Skill · 메인 루프)"]:::orch + ORCH --> MODE{"실행 모드 분기
① 산출물 유무 ② 전체·부분·하류
③ mock 이면 '데모' 명시"}:::mode + MODE --> P1["기획 · 근거"]:::plan + P1 --> P2["분석 · eval"]:::ana + P2 --> P3["집필 · 그림"]:::wr + P3 --> P4["내부 적대검수
paper-critic"]:::qa + P4 -->|"수정"| P3 + P4 --> G1["🔒 검증 게이트 ①
결과 검증 · 커밋 전"]:::gate + G1 --> P5["외부 리뷰 (선택)
venue-reviewer · 격리"]:::qa + P5 -->|"수정"| P3 + P5 --> G2["🔒 검증 게이트 ②
패키지 검증 · 공개 직전"]:::gate + G2 --> P6["발표"]:::wr + + classDef user fill:#0f62fe,stroke:#0f62fe,color:#fff + classDef route fill:#f2ecff,stroke:#7b3fe4,color:#3a2a5e + classDef orch fill:#7b3fe4,stroke:#7b3fe4,color:#fff + classDef mode fill:#fff6e3,stroke:#b06f00,color:#5a3800 + classDef plain fill:#f7f8fa,stroke:#c3ccd8,color:#14181f + classDef plan fill:#e8f0ff,stroke:#0f62fe,color:#0a2f6b + classDef ana fill:#f2ecff,stroke:#7b3fe4,color:#3a2a5e + classDef wr fill:#e5f5ec,stroke:#0e7a3d,color:#0b3a1f + classDef qa fill:#fff6e3,stroke:#b06f00,color:#5a3800 + classDef gate fill:#ffecec,stroke:#c62828,color:#7a1616 +
그림 1. 검증 게이트 ①이 외부 리뷰보다 앞에 있다 — "검증되지 않은 숫자를 리뷰에 보내지 않는다." + v03에서 실행 모드 분기가 명시됐다 — 특히 ③ mock으로 돌았으면 "데모"임을 산출물에 적는다.
+ +2-레이어 아키텍처
+도메인 분석 파이프라인 위에 재사용 논문 생산 하네스. 도메인 지식은 슬롯 하나에 격리.
다중 에이전트 명부
+벤치별 역할 분리. 내부 검수와 외부 리뷰는 격리.
라우팅 · 계약 · 품질 기준선
+무엇을 넘기나(계약) + 어떤 상태로 넘기나(기준선) + 실패·보고 계약.
검수 3층 + 거버넌스
+CI 결정론 → AI 적대 → 사람. 사람에겐 노동이 아니라 판단만.
✅ 닫힌 루프 — 하네스가 실제로 작동한 증거
+v03에서 가장 중요한 소식. 이 설계서가 갭으로 기록했던 결함 하나가 실제로 닫혔고, 닫히는 과정이 곧 이 하네스가 설계대로 돈다는 증거다.
+ +#5 독립 재계산 중
스키마 위반 5건 실측"]:::a + B["② 분리
수치 판정과 섞지 않고
별건 티켓으로"]:::b + C["③ 결정
Leader: 필드 삭제가 아니라
스키마 확장"]:::c + D["④ 도구화
validate_hypothesis.py
신설 — 이제 실제로 검증"]:::d + E["⑤ CI 편입
blocking 으로 상시 실행"]:::e + A --> B --> C --> D --> E + E -.->|"같은 결함이
다시 들어오면 즉시 적발"| A + + classDef a fill:#ffecec,stroke:#c62828,color:#7a1616 + classDef b fill:#fff6e3,stroke:#b06f00,color:#5a3800 + classDef c fill:#f2ecff,stroke:#7b3fe4,color:#3a2a5e + classDef d fill:#e8f0ff,stroke:#0f62fe,color:#0a2f6b + classDef e fill:#e5f5ec,stroke:#0e7a3d,color:#0b3a1f +
그림 2. 발견 → 분리 → 결정 → 도구화 → CI. 규율이 사람의 기억에서 기계로 옮겨간 전형이다.
+ +-
+
schemas/hypothesis.schema.json에confidence_source·generated_by·critic_5_biological_plausibility·embedding이 정식 등재(삭제가 아니라 확장으로 결정)
+ agents/critic/scripts/validate_hypothesis.py신설 — docstring이 이 설계서의 지적을 그대로 인용한다: "산출 스크립트 docstring은 '형식'이라 말할 뿐 검증하지 않았다 … 스키마 위반이 최소 4주간 미탐지됐다"
+
⚠️ 아직 열린 갭 6건
+v03 작성 시점에 전부 실물로 재검증했다. 닫힌 것은 위로 옮겼고, 아래는 지금도 열려 있다.
+ +검증 게이트 ①의 실행 명령이 여전히 없다
헤드라인 수치를 모델 eval 출력에서 결정론적으로 재계산하는 명령이 아직 없다. + 주변은 크게 메워졌다 — 숫자 드리프트·초록 수치·국영문 정합 검사가 CI에 들어왔다. + 그러나 그것들은 문서 ↔ 문서, 문서 ↔ JSON 대조이지 원자료 재계산이 아니다. 게이트 ①은 계속 사람이 수동 대조한다.
+config가 SKILL.md를 아직 따라오지 않았다
SKILL.md는 5단계 자동 리뷰를 paper-critic 단독으로 고쳤는데
+ auto_review_config.json의 ai_review.agents는 여전히 ["paper-critic", "reviewer"]다.
+ enabled=false(dry-run)라 실害는 없으나 활성화 전 정리 필요.
게이트 ① 이후의 "수정"에 권한 제약이 없다
manuscript-writer가 Write를 보유해 리뷰 반영 중 검증된 숫자를 다시 써도 에러가 나지 않는다.
+ 같은 규율이 paper-critic에는 도구 수준으로 걸려 있다(쓰기 권한 없음) —
+ 하네스 안에 "권한으로 막은 곳"과 "말로만 막은 곳"이 섞여 있다.
+ 부수로 venue-reviewer는 tools: 미선언 → 전체 상속(로스터 10종 중 유일).
판정 어휘에 "더 해도 pass가 안 됨"을 적을 칸이 없다
critic_status = pass · caution · reject에 "현재 데이터로는 식별 불가"가 없어
+ 그런 항목이 caution으로 뭉뚱그려지고, caution은 "더 하면 pass될 수도" 로 읽힌다.
+ BIOP02-75가 이 빈칸 때문에 티켓 성공 기준 자체를 재정의해 우회했다.
비판 자체를 검증하는 층이 없다
루프가 비판을 생산(③)한 뒤 곧바로 확인 주체 배정(④)으로 넘어간다 — + Critic의 산출물만은 Critic을 거치지 않는다. + ⚠️ 새로 들어온 게이트 mutation 하네스는 게이트가 잡는가를 시험하지 비판이 옳은가를 판정하지 않는다. 다른 층이다.
+SKILL.md 자체가 현실보다 뒤처져 있다
L10 "집필 이전 단계 산출물이 아직 없다" · L18 <FILL: docs/manuscript/preprint.md (미존재)>.
+ 실제로는 manuscript/sections/에 5개 섹션이 있고 Discussion 한계까지 작성됐다.
+ "없는 것을 없다고 표시하는 장치"가 "생긴 뒤에도 없다고 말하는" 상태가 되면 보호가 아니라 오정보다.
.claude/agents/*·schemas/*·auto_review_config.json을 건드려야 하고,
+ 그건 Critic이 자기 검수 기준을 스스로 정하는 일이라 ❌ anti-self-reference에 걸린다 → Leader 승인 사안.01 2-레이어 아키텍처
+책임이 다른 두 레이어를 분리하고, 위 레이어가 아래 레이어의 산출물을 파일로 소비한다.
+ +도메인 슬롯"]:::slot + G1["🔒 게이트 ① 결과 검증"]:::gate + G2["🔒 게이트 ② 패키지 검증"]:::gate + G3["🔒 공개 게이트
저자 · 소속 · IP · GPU 제공처"]:::gate + A --> SLOT --> B --> G1 --> G2 --> G3 + classDef a fill:#e5f5ec,stroke:#0e7a3d,color:#0b3a1f + classDef b fill:#e8f0ff,stroke:#0f62fe,color:#0a2f6b + classDef slot fill:#7b3fe4,stroke:#7b3fe4,color:#fff + classDef gate fill:#ffecec,stroke:#c62828,color:#7a1616 +
그림 3. 도메인 특수성은 슬롯 하나에 격리되고, 레이어 B는 어느 논문에도 옮겨 붙는다. 경계에 사람 게이트 3개.
+ +manuscript/sections/에 5개 섹션이 존재하고 Discussion 한계 절까지 실물로 작성돼 있다(Critic 승인조건 1 충족 판정 완료).
+ 다만 SKILL.md는 아직 이를 반영하지 못했다 → GAP 6.02 에이전트 명부와 권한 지도
+각 에이전트는 시스템 프롬프트·도구 권한·산출물 계약을 파일로 갖는다. 도메인 고유는 spatialpatho-analyst 하나뿐.
Read · Grep · Glob · Bash · Web
원고를 못 고침"]:::lock + end + subgraph OPEN["⚠️ 프롬프트로만 강제 — Write 보유"] + MW["manuscript-writer
Read · Write · Edit · Bash · Grep · Glob"]:::open + VR["venue-reviewer
tools 미선언 → 전체 상속
로스터 10종 중 유일"]:::open + end + G["🔒 게이트 ① — 여기서 숫자가 확정"]:::gate + D["게이트 ② 사후 재대조
+ CI 숫자 드리프트"]:::detect + G --> MW + MW -->|"숫자가 조용히 바뀌어도
에러 없음"| D + D -.->|"발견은 하되
발생은 못 막음"| MW + classDef lock fill:#e5f5ec,stroke:#0e7a3d,color:#0b3a1f + classDef open fill:#ffecec,stroke:#c62828,color:#7a1616 + classDef gate fill:#fff6e3,stroke:#b06f00,color:#5a3800 + classDef detect fill:#f7f8fa,stroke:#5a6472,color:#28303a +
그림 4 (GAP 3). 같은 규율이 한쪽은 도구로, 다른 쪽은 말로만 걸려 있다. + 외부 참조: "LLM에게 '조금만 고쳐'라고 하면 통째로 다시 쓰고, 검증이 끝난 인용과 수치가 조용히 바뀐다"(hyperresearch).
+ +계획 ≠ 실행 입구
+paper-orchestrator는 계획만. 실행은 Skill을 메인 루프가 돌린다.
도메인 격리
+도메인 지식은 슬롯 하나에. 새면 레이어 B의 재사용성이 사라진다.
내부 검수 ≠ 외부 리뷰
+venue-reviewer는 게이트 ① 통과 후 원고 패키지만. 내부 맥락을 알면 심사자의 정보 부족을 재현 못 한다.
03 라우팅 · 산출물 계약 · 품질 기준선
+v03에서 보강된 절. 계약이 무엇을 넘기나라면, 품질 기준선은 어떤 상태로 넘기나이고, 실행·보고 계약은 실패했을 때와 끝났을 때를 규정한다.
+ +풀 파이프라인 · 제출 준비"| F["전체 실행"]:::f + M -->|"있음 + 부분요청
'그림만' · '리뷰만'"| P["해당 단계만"]:::p + M -->|"'지적 반영'
'최신 결과로 갱신'"| DN["하류 단계만"]:::p + M --> MK{"offline mock 으로
돌았는가"}:::mode + MK -->|"예"| DEMO["산출물에
'실 결과 아님 / 데모' 명시"]:::demo + MK -->|"아니오"| OK2["그대로 진행"]:::f + classDef q fill:#f7f8fa,stroke:#c3ccd8,color:#14181f + classDef mode fill:#fff6e3,stroke:#b06f00,color:#5a3800 + classDef f fill:#e8f0ff,stroke:#0f62fe,color:#0a2f6b + classDef p fill:#f2ecff,stroke:#7b3fe4,color:#3a2a5e + classDef demo fill:#ffecec,stroke:#c62828,color:#7a1616 +
그림 5. mock 분기가 이 하네스의 성격을 보여준다 — 데모로 돌린 것을 실 결과처럼 넘기지 않는 장치이고, + "없는 것을 없다고 표시한다"의 실행 시점 버전이다.
+ +품질 기준선 — 계약 위에 얹히는 공통 규율
+| 규율 | 내용 |
|---|---|
| 스코프 | NOT drug-response prediction. 통계 뒷받침 없는 우월 주장 금지, 단 weak ≠ zero(약한 신호를 없는 것으로 만들지도 않는다) |
| 숫자 출처 | 결과 파일에서만. 메모리에서 재유도 금지 |
| 지표 | class imbalance → AUPRC + AUC 병기 |
| 분할 | leakage-controlled(환자 단위) split 명시 |
| 그림 | 결과 파일에서 생성(하드코딩 금지) · 95% CI + paired test · 번호는 첫 언급 순 |
실행·보고 계약 — 실패했을 때와 끝났을 때
+멈춤 조건
+게이트 실패 → 멈추고 보고, 커밋·발행 금지 · mock이면 "데모" 명시 · + 산출 파일 미생성 → 재시도 1회 후 보고(무한 재시도로 시간을 태우지 않는다)
마무리 보고
+무엇을 어떤 순서로 · 어떤 파일이 갱신됐나 · verify 통과 여부 · + done / in-progress / blocked 구분 · 부분 재실행이면 안 건드린 단계도 명시
04 검수 3층 CI 3종 → 7종
+핵심 질문: "AI가 몇 주간 검수·수정을 도는 동안 사람이 매번 병목이 되지 않게 하려면?" + 답: AI가 리뷰 노동을 대신하고, 사람은 판단만 한다.
+ +검수기가 무조건 통과시키는 회귀"]:::ci + c2["citation_verifier mutation
DOI 실패 시 약한 검색 통과 버그"]:::ci + c3["숫자 드리프트 --strict
JSON 정본 ↔ markdown 표"]:::ci + c4["게이트 mutation 하네스
실수를 심으면 게이트가 잡는가"]:::hi + c5["split 누수 검사 계약"]:::ci + c6["게이트 공허통과 회귀 10케이스
통과만 하는 게이트 적발"]:::hi + c7["국·영문 정합"]:::ci + end + subgraph L2["② 자동 리뷰 루프 (AI 적대)"] + g["결정론 게이트"]:::ai --> q["큐 → drain
owner→reviewer 자동 배정"]:::ai --> r["AI 적대 리뷰
paper-critic · 다중 패스"]:::ai + end + subgraph L3["③ 사람 게이트"] + h1["Tier B → provisional
진행·커밋 허용, 공유만 확인"]:::okc + h2["Tier C → needs_human
headline · publish"]:::humc + end + SRC --> L1 --> L2 --> L3 + L2 -->|"하드룰 위반"| BLK["🚫 blocked — 즉시 정지"]:::blk + classDef src fill:#f7f8fa,stroke:#c3ccd8,color:#14181f + classDef ci fill:#e5f5ec,stroke:#0e7a3d,color:#0b3a1f + classDef hi fill:#0e7a3d,stroke:#0e7a3d,color:#fff + classDef ai fill:#f2ecff,stroke:#7b3fe4,color:#3a2a5e + classDef okc fill:#e5f5ec,stroke:#0e7a3d,color:#0b3a1f + classDef humc fill:#fff6e3,stroke:#b06f00,color:#5a3800 + classDef blk fill:#ffecec,stroke:#c62828,color:#7a1616 +
그림 6. v02의 3종에서 7종으로. 진한 두 칸(게이트 mutation·공허통과 회귀)이 v03의 새 이야기 — + 검증기가 자기 자신을 시험한다. 실측: .github/workflows/critic-validators.yml
+ +⭐ 검증기를 검증하는 층 — "통과만 하는 게이트는 게이트가 아니다"
+실무자가 저지를 법한 실수를 심는다"]:::m + G["게이트 실행"]:::g + R1["✅ 적발
게이트가 살아 있다"]:::ok + R2["🚫 통과
= 공허통과(vacuous pass)
게이트가 죽어 있다"]:::bad + M --> G + G --> R1 + G --> R2 + R2 --> FAIL["CI 실패 → 병합 차단"]:::fail + classDef m fill:#fff6e3,stroke:#b06f00,color:#5a3800 + classDef g fill:#e8f0ff,stroke:#0f62fe,color:#0a2f6b + classDef ok fill:#e5f5ec,stroke:#0e7a3d,color:#0b3a1f + classDef bad fill:#ffecec,stroke:#c62828,color:#7a1616 + classDef fail fill:#c62828,stroke:#c62828,color:#fff +
그림 7. 하네스가 재는 것은 하나다 — "실무자가 저지를 법한 실수를 심었을 때, 우리 게이트가 실제로 잡는가?" + 검증을 만드는 것과 검증이 실제로 잡는 것은 다른 일이라는 인식이 코드가 됐다.
+ +티어 게이트와 required_followups
+ | 티어 | 무엇 | 처리 | 사람 개입 |
|---|---|---|---|
| 하드룰 | 금지 프레이밍 · 필수필드 누락 · claim_level 위반 | blocked | 정지 |
| Tier C | manuscript · preprint · publish · main figure | needs_human | 사람 판정 |
| Tier B | 그 외 실험·분석 결과 | provisional | 진행·커밋 허용 |
| Tier A | guide · docs · setup · manifest | 가벼운 경로 | 대부분 자동 |
required_followups로 surface된 판단항목만 올린다.
+ 사람이 리뷰 노동을 하면 몇 주, 판단만 하면 분 단위다. 자동화가 줄이는 것은 판단의 수가 아니라 판단에 도달하기까지의 노동이다.거버넌스 — 넘지 못하는 선
+| 금지 | 이유 |
|---|---|
| ❌ 약물 구조 모델 입력 | DRP가 아님 — hypothesis-only |
| ❌ Critic이 자기 임계값·control을 스스로 결정 | anti-self-reference — GAP 3·4·5 수정이 여기 걸린다 |
| ❌ 발표자료 숫자를 합격 기준으로 사용 | 기준은 봉인 문서 + 실물 코드뿐, 파일:줄로 인용 |
| ❌ 도구의 "못 찾겠다"를 통과로 처리 | 가짜 DOI가 약한 제목검색으로 뚫림 |
| ❌ 티켓·파일을 열지 않고 상태 단정 | "없다"는 실물을 연 뒤에만. 기억은 근거가 아니다 |
05 다연구자 협업 구조
+하네스는 진공에서 돌지 않는다. 연구자들이 각자의 역할·검수 짝·작업 환경을 갖고 그 위에서 협업한다.
+ +할당"]:::j --> OC["알림 봇
자동 모니터링"]:::oc + OC -->|"채널 알림"| DEV["연구자"]:::dev + DEV -->|"실제 구현"| CC["CLI 도구"]:::cc + CC -->|"커밋(이슈번호)"| PR["PR"]:::pr + PR -->|"스마트 커밋"| JIRA + classDef j fill:#e8f0ff,stroke:#0f62fe,color:#0a2f6b + classDef oc fill:#f2ecff,stroke:#7b3fe4,color:#3a2a5e + classDef dev fill:#e5f5ec,stroke:#0e7a3d,color:#0b3a1f + classDef cc fill:#f7f8fa,stroke:#c3ccd8,color:#14181f + classDef pr fill:#fff6e3,stroke:#b06f00,color:#5a3800 +
그림 8. 알림 봇은 코드를 쓰지 않는다. 구현은 사람이 CLI로 한다. 커밋이 트래커 상태를 자동 갱신한다.
+ ++ 도메인 sub-check는
owner가 아닌 사람"]:::r + classDef w fill:#e5f5ec,stroke:#0e7a3d,color:#0b3a1f + classDef r fill:#fff6e3,stroke:#b06f00,color:#5a3800 +
그림 9. 자기 결과를 자기가 검수하지 않는다. 이 매핑은 자동 리뷰 루프의 cross_review_map에 그대로 주입된다.
06 설계 계보 — 왜 "완전 자율"이 아닌가
+이 방향은 즉흥이 아니라 AI Scientist / multi-agent science 선행연구를 읽고 의도적으로 내린 포지셔닝이다.
+ +완전 자율 파이프라인"]:::p + CO["Google co-scientist
전문 에이전트 + in-the-loop"]:::p + VS["VirSci
멀티에이전트 아이디어"]:::p + JUDGE["LLM-judge 서베이
자기선호 편향"]:::p + end + subgraph DESIGN["설계 선택"] + D1["자율성 제한 + 사람 거버넌스"]:::d + D2["delta = system / evaluation / governance"]:::d + D3["hypothesis-only + claim_level 강제"]:::d + D4["Critic 자기참조 금지 · owner≠reviewer"]:::d + D5["티어 게이트로 사람 병목 최소화"]:::d + end + SAK -->|"대조군"| D1 + SAK -->|"자율은 검증이 약함"| D5 + VS -->|"멀티에이전트는 crowded"| D2 + CO -->|"Reflection = 우리 Critic"| D2 + JUDGE -->|"자기선호 편향 경고"| D4 + JUDGE -.->|"⚠️ 그런데 독립 패스가
같은 모델 반복이라
이 편향은 못 막는다"| GAPX["미반영 — 모델 다양성"]:::gapn + classDef p fill:#e8f0ff,stroke:#0f62fe,color:#0a2f6b + classDef d fill:#f2ecff,stroke:#7b3fe4,color:#3a2a5e + classDef gapn fill:#fff5f5,stroke:#c62828,color:#7a1616 +
그림 10. 두 교훈 — ① 완전 자율은 검증이 약하다 ② 멀티에이전트·가설 생성은 이미 붐빈다 — 이 곧 설계 원칙이 됐다. + 다만 인용한 문헌 하나가 현재 구현을 반박한다(점선).
+ +↻ 변경 이력 · v02 대비
+ +v03에서 달라진 것
+| v02 (08-03) | v03 (08-20) | |
|---|---|---|
| CI 검증기 | 3종 | 7종 — 게이트 mutation · 공허통과 회귀 · split 누수 · 국영문 정합 추가 |
| 검수의 성격 | 결과를 검증 | 검증기 자신을 검증(mutation) |
| 미해결 갭 | 5건 | 6건(SKILL.md 낡음 추가) · 1건 닫힘(스키마) |
| 03 문서 | 라우팅 + 계약 | + 품질 기준선 · 실행·보고 계약 · mock 분기 |
| 04 문서 | 티어 게이트 | + required_followups(노동 ≠ 판단) |
| 01 문서 | "원고 아직 없음" | 🔴 정정 — 원고 존재(5섹션 + Discussion 한계) |
| 다이어그램 | 12종 | 10종(재구성 — 닫힌 루프·mock 분기·mutation 신규) |
설계가 실제로 바뀐 지점 (누적)
+| 일자 | 변경 |
|---|---|
| 07-27 | 검증 게이트 ↔ 리뷰 순서 스왑 + 게이트 1 → 2개 |
| 07-27 | reviewer → venue-reviewer 실체화 + 내부/외부 리뷰 격리 |
| 07-27 | 도메인 sub-check = "owner 아닌 사람" 케이스별 |
| 08-03 | CI 검증 레이어 신설 — 검수가 3층이 됨 |
| 08-04~08-11 | 스키마 확장 + validate_hypothesis.py(갭 1건 닫힘) · 게이트 mutation·공허통과 회귀 CI 편입 |