From 3afd42972cacd4b5336a6c1ffc1539d9406e2792 Mon Sep 17 00:00:00 2001 From: braveji18 Date: Thu, 20 Aug 2026 05:10:29 +0000 Subject: [PATCH] =?UTF-8?q?BIOP02-113=20#in-progress=20docs:=20AI=20Scient?= =?UTF-8?q?ist=20=EC=84=A4=EA=B3=84=EC=84=9C=20=EC=8B=9C=EA=B0=81=ED=99=94?= =?UTF-8?q?=20v03=20(mermaid=2010=EC=A2=85)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit v02(08-03) 이후 설계서가 갱신됐고 리포 현실도 바뀌어 v03 신설. v01·v02는 시점 스냅샷으로 보존(덮지 않음). 핵심 이야기 — 검증기가 자기 자신을 검증하기 시작했다: CI blocking 검증기 3종 → 7종. 그중 둘(게이트 mutation 하네스 BIOP02-129, 게이트 공허통과 회귀 10케이스 BIOP02-130/131/136)은 의도적 결함을 심어 "우리 게이트가 실제로 잡는가"를 시험한다. 설계서가 반복 지적한 "문서에만 있는 보장은 보장이 아니다"가 기계로 강제되기 시작. 신규 다이어그램 3종: 그림2 닫힌 루프 — 발견→분리→결정→도구화→CI (스키마 갭이 실제로 닫힌 과정) 그림5 mock 분기 — 데모를 실 결과처럼 넘기지 않는 장치 그림7 검증기를 검증하는 층 — mutation / 공허통과(vacuous pass) 설계서 갱신분 반영: 품질 기준선(숫자는 결과파일에서만·그림 하드코딩 금지· weak≠zero) · 실행·보고 계약(재시도 1회·done/in-progress/blocked· 부분 재실행 시 안 건드린 단계 명시) · required_followups(노동≠판단) · 01 정정(원고 존재). ⚠️ 갭 6건을 전부 실물 재검증했다(문서를 믿지 않음): - 유효: 게이트① 실행명령 부재 / config-SKILL 불일치 / 수정 권한 / 판정 어휘 / 비판 검증 층 / SKILL.md 낡음 - 닫힘: hypothesis 스키마 결함 → 스키마에 3필드 정식 등재 + validate_hypothesis.py 신설. v02는 갭으로 적었으나 재검증 결과 닫혀 있어 "닫힌 루프" 절로 이동. 근거: SKILL.md L10/L18/L40 · auto_review_config.json · agents frontmatter · schemas/{hypothesis,critic_report} · .github/workflows/critic-validators.yml 검증: mermaid 10블록 구조 검사 전부 통과(헤더·따옴표·괄호·classDef 참조). mermaid.min.js(3.2MB) 미커밋 — 없으면 CDN 폴백. Co-Authored-By: Claude Opus 5 --- ai_scientist/output_v03/README.md | 74 ++++ ai_scientist/output_v03/index.html | 676 +++++++++++++++++++++++++++++ 2 files changed, 750 insertions(+) create mode 100644 ai_scientist/output_v03/README.md create mode 100644 ai_scientist/output_v03/index.html diff --git a/ai_scientist/output_v03/README.md b/ai_scientist/output_v03/README.md new file mode 100644 index 0000000..b5a8e00 --- /dev/null +++ b/ai_scientist/output_v03/README.md @@ -0,0 +1,74 @@ +# output_v03 — AI Scientist 설계서 시각화 (2026-08-20 기준) + +`ai_scientist/`의 설계서 7개(README + 01~06)를 **mermaid 10종 + HTML** 단일 페이지로 시각화한 결과물. + +| 파일 | 내용 | +|---|---| +| `index.html` | 본문 (46 KB) | +| `mermaid.min.js` | 로컬 mermaid 런타임 (3.2 MB) — **오프라인 렌더용** | + +```bash +xdg-open ai_scientist/output_v03/index.html # Linux +open ai_scientist/output_v03/index.html # macOS +``` + +## v03의 이야기 — 검증기가 자기 자신을 검증하기 시작했다 + +v02 이후 이 하네스의 가장 큰 변화는 기능 추가가 아니라 **검수의 성격**이다. +CI 검증기가 **3종 → 7종**으로 늘었고, 그중 둘(`게이트 mutation 하네스`·`게이트 공허통과 회귀`)은 +*"우리 게이트가 실제로 잡는가"* 를 **의도적 결함 주입으로 시험**한다. + +설계서가 반복해 지적해온 *"문서에만 있는 보장은 보장이 아니다"* 가 **기계로 강제**되기 시작했다. + +## v02 대비 + +| | v02 (08-03) | **v03 (08-20)** | +|---|---|---| +| CI 검증기 | 3종 | **7종** (게이트 mutation · 공허통과 회귀 · split 누수 · 국영문 정합 추가) | +| 검수의 성격 | 결과를 검증 | **검증기 자신을 검증** | +| 미해결 갭 | 5건 | **6건** + **1건 닫힘**(스키마) | +| 03 문서 반영 | 라우팅 + 계약 | + **품질 기준선** · **실행·보고 계약** · **mock 분기** | +| 04 문서 반영 | 티어 게이트 | + **`required_followups`**(노동 ≠ 판단) | +| 01 문서 | "원고 아직 없음" | 🔴 **정정** — 원고 존재 | +| 다이어그램 | 12종 | **10종**(재구성: 닫힌 루프·mock 분기·mutation 신규) | + +## 다이어그램 10종 + +| # | 그림 | 대응 | +|---|---|---| +| 1 | 전체 흐름 + **실행 모드 분기**(mock 포함) | README·03 | +| **2** | **⭐ 닫힌 루프** — 발견→분리→결정→도구화→CI | 신규 | +| 3 | 2-레이어 + 사람 게이트 3개 | 01 | +| 4 | **권한 강제 지도** — 도구로 막힌 곳 vs 말로만 | 02 (GAP 3) | +| 5 | **mock 분기** — 데모를 실 결과처럼 넘기지 않는 장치 | 03 | +| 6 | **검수 3층 — CI 7종 상세** | 04 | +| **7** | **⭐ 검증기를 검증하는 층**(mutation / 공허통과) | 04 · 신규 | +| 8 | 협업 흐름 | 05 | +| 9 | 교차검수 owner≠reviewer | 05 | +| 10 | 설계 계보 | 06 | + +## 갭 6건은 전부 실물 재검증했다 + +v03 작성 시점에 **문서를 믿지 않고 리포를 열어** 재확인했다. 그 결과 v02가 갭으로 적었던 **스키마 항목은 닫혀 있어** "닫힌 루프" 절로 옮겼다. + +| 근거 | 확인한 것 | +|---|---| +| `SKILL.md` L10·L18·L40 | 게이트 ① 실행 명령 부재 · 원고 "미존재" 문구 잔존 | +| `auto_review_config.json` | `ai_review.agents` = `["paper-critic","reviewer"]`, `enabled=false` | +| `.claude/agents/*.md` frontmatter | `manuscript-writer`는 `Write` 보유 · `venue-reviewer`는 `tools:` 미선언 | +| `schemas/critic_report.schema.json` | `critic_status` enum 3값 — "식별 불가" 없음 | +| `schemas/hypothesis.schema.json` | 3필드 **정식 등재됨** → 갭 아님(닫힘) | +| `.github/workflows/critic-validators.yml` | blocking 스텝 **7개** | + +## 특징 + +- **오프라인 렌더** — `mermaid.min.js`를 로컬에서 먼저 읽고, 없으면 CDN 폴백 +- **테마 대응** — 우상단 `◐ 테마` 버튼(다이어그램 동시 리렌더) · 시스템 테마 감지 · 선택 기억 +- **사이드바 + scrollspy**, 모바일 반응형, 표·다이어그램 가로 스크롤 + +## 주의 + +- **"열린 갭 6건"은 변경 이력에 없다.** 갭은 *관찰된 것*이지 *채택된 설계 변경*이 아니다. +- GAP 3·4·5 수정은 `.claude/agents/*`·`schemas/*`·config를 건드려야 하고, 그건 **Critic이 자기 검수 기준을 정하는 일**이라 `❌ anti-self-reference`에 걸린다 → **Leader 승인 사안.** +- `mermaid.min.js`(3.2 MB)는 vendored 파일이다. 커밋 여부는 팀 판단 — **커밋하지 않아도 CDN 폴백으로 동작**한다. +- `output_v01`(초판)·`output_v02`(08-03)는 **시점 스냅샷으로 보존**한다. 덮으면 "무엇이 바뀌었나"를 잃는다. diff --git a/ai_scientist/output_v03/index.html b/ai_scientist/output_v03/index.html new file mode 100644 index 0000000..119ee3a --- /dev/null +++ b/ai_scientist/output_v03/index.html @@ -0,0 +1,676 @@ + + + + + +AI Scientist 설계서 v03 — BioProject02 + + + + + + +
+ + +
+
+
연구 자동화 하네스 · 설계 회고 v03
+

검증기가 자기 자신을 검증하기 시작했다

+

v02 이후 이 하네스에서 벌어진 가장 큰 변화는 기능 추가가 아니라 검수의 성격이다. + CI 검증기가 3종 → 7종으로 늘었고, 그중 둘은 "우리 게이트가 실제로 잡는가"를 mutation으로 시험한다. + 이 설계서가 반복해 지적해온 "문서에만 있는 보장은 보장이 아니다"가 **기계로 강제**되기 시작했다.

+
+
2
레이어
분석 + 논문 생산
+
10
에이전트
도메인 슬롯 1 + 재사용 9
+
7
CI blocking 검증기
▲ v02 대비 +4
+
6
아직 열린 갭
1건은 닫힘
+
+
+ + +
+

개요 — 4개 기둥과 전체 흐름

+

자동화의 목표는 사람을 빼는 것이 아니라, 사람이 판단해야 할 지점만 남기고 나머지 노동을 에이전트가 대신하는 것.

+ +
+flowchart TB + U["연구자 요청 (자연어)"]:::user + U --> R{"자연어 라우팅"}:::route + R -->|"단일 단계"| D["해당 에이전트 직행"]:::plain + R -->|"여러 단계"| ORCH["paper-production-orchestrator
(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으로 돌았으면 "데모"임을 산출물에 적는다.

+ +
+
기둥 1

2-레이어 아키텍처

+

도메인 분석 파이프라인 위에 재사용 논문 생산 하네스. 도메인 지식은 슬롯 하나에 격리.

+
기둥 2

다중 에이전트 명부

+

벤치별 역할 분리. 내부 검수와 외부 리뷰는 격리.

+
기둥 3

라우팅 · 계약 · 품질 기준선

+

무엇을 넘기나(계약) + 어떤 상태로 넘기나(기준선) + 실패·보고 계약.

+
기둥 4

검수 3층 + 거버넌스

+

CI 결정론 → AI 적대 → 사람. 사람에겐 노동이 아니라 판단만.

+
+
+ + +
+

닫힌 루프 — 하네스가 실제로 작동한 증거

+

v03에서 가장 중요한 소식. 이 설계서가 갭으로 기록했던 결함 하나가 실제로 닫혔고, 닫히는 과정이 곧 이 하네스가 설계대로 돈다는 증거다.

+ +
+flowchart LR + A["① 발견
#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. 규율이 사람의 기억에서 기계로 옮겨간 전형이다.

+ +
무엇이 닫혔나 — hypothesis 산출물 스키마 결함. + v02는 "이 스키마를 검증하는 코드가 리포에 없다 — docstring에서 '스키마 형식'이라 말할 뿐" 이라고 기록했다. 지금은: +
    +
  • schemas/hypothesis.schema.jsonconfidence_source·generated_by·critic_5_biological_plausibility·embedding정식 등재(삭제가 아니라 확장으로 결정)
  • +
  • agents/critic/scripts/validate_hypothesis.py 신설 — docstring이 이 설계서의 지적을 그대로 인용한다: "산출 스크립트 docstring은 '형식'이라 말할 뿐 검증하지 않았다 … 스키마 위반이 최소 4주간 미탐지됐다"
  • +
+
+ +
규율을 문서에 쓰면 잊히고, 사람에게 맡기면 지치고, 기계에 넣으면 남는다.
+
+ + +
+

⚠️ 아직 열린 갭 6건

+

v03 작성 시점에 전부 실물로 재검증했다. 닫힌 것은 위로 옮겼고, 아래는 지금도 열려 있다.

+ +
+
GAP 1

검증 게이트 ①의 실행 명령이 여전히 없다

+

헤드라인 수치를 모델 eval 출력에서 결정론적으로 재계산하는 명령이 아직 없다. + 주변은 크게 메워졌다 — 숫자 드리프트·초록 수치·국영문 정합 검사가 CI에 들어왔다. + 그러나 그것들은 문서 ↔ 문서, 문서 ↔ JSON 대조이지 원자료 재계산이 아니다. 게이트 ①은 계속 사람이 수동 대조한다.

+
SKILL.md:40 "이 게이트의 실행 명령이 아직 없다" — 2026-08-20 현재 문구 유지
+
+ +
+
GAP 2

config가 SKILL.md를 아직 따라오지 않았다

+

SKILL.md는 5단계 자동 리뷰를 paper-critic 단독으로 고쳤는데 + auto_review_config.jsonai_review.agents는 여전히 ["paper-critic", "reviewer"]다. + enabled=false(dry-run)라 실害는 없으나 활성화 전 정리 필요.

+
실측 2026-08-20: agents = ['paper-critic', 'reviewer'] · enabled = False
+
+ +
+
GAP 3

게이트 ① 이후의 "수정"에 권한 제약이 없다

+

manuscript-writerWrite를 보유해 리뷰 반영 중 검증된 숫자를 다시 써도 에러가 나지 않는다. + 같은 규율이 paper-critic에는 도구 수준으로 걸려 있다(쓰기 권한 없음) — + 하네스 안에 "권한으로 막은 곳"과 "말로만 막은 곳"이 섞여 있다. + 부수로 venue-reviewertools: 미선언 → 전체 상속(로스터 10종 중 유일).

+
실측: manuscript-writer = Read, Write, Edit, Bash, Grep, Glob · venue-reviewer = (미선언)
+
+ +
+
GAP 4

판정 어휘에 "더 해도 pass가 안 됨"을 적을 칸이 없다

+

critic_status = pass · caution · reject"현재 데이터로는 식별 불가"가 없어 + 그런 항목이 caution으로 뭉뚱그려지고, caution"더 하면 pass될 수도" 로 읽힌다. + BIOP02-75가 이 빈칸 때문에 티켓 성공 기준 자체를 재정의해 우회했다.

+
실측: critic_report.schema.json → enum ['pass', 'caution', 'reject']
+
+ +
+
GAP 5

비판 자체를 검증하는 층이 없다

+

루프가 비판을 생산(③)한 뒤 곧바로 확인 주체 배정(④)으로 넘어간다 — + Critic의 산출물만은 Critic을 거치지 않는다. + ⚠️ 새로 들어온 게이트 mutation 하네스게이트가 잡는가를 시험하지 비판이 옳은가를 판정하지 않는다. 다른 층이다.

+
비용: 2026-07-27 하루에 Critic 코멘트 4건이 작성자 본인에게 사후 정정
+
+ +
+
GAP 6

SKILL.md 자체가 현실보다 뒤처져 있다

+

L10 "집필 이전 단계 산출물이 아직 없다" · L18 <FILL: docs/manuscript/preprint.md (미존재)>. + 실제로는 manuscript/sections/에 5개 섹션이 있고 Discussion 한계까지 작성됐다. + "없는 것을 없다고 표시하는 장치"가 "생긴 뒤에도 없다고 말하는" 상태가 되면 보호가 아니라 오정보다.

+
실측 2026-08-20: SKILL.md L10·L18 문구 그대로
+
+ +
이 갭들은 "변경 이력"에 넣지 않았다. 관찰된 갭이지 채택된 설계 변경이 아니다. + GAP 3·4·5를 고치려면 .claude/agents/*·schemas/*·auto_review_config.json을 건드려야 하고, + 그건 Critic이 자기 검수 기준을 스스로 정하는 일이라 ❌ anti-self-reference에 걸린다 → Leader 승인 사안.
+
+ + +
+

01 2-레이어 아키텍처

+

책임이 다른 두 레이어를 분리하고, 위 레이어가 아래 레이어의 산출물을 파일로 소비한다.

+ +
+flowchart TB + subgraph B["레이어 B — 논문 생산 하네스 (재사용)"] + direction LR + b1["literature-scout"]:::b + b2["novelty-strategist"]:::b + b3["research-methodologist"]:::b + b4["manuscript-writer"]:::b + b5["paper-critic"]:::b + b6["venue-reviewer"]:::b + b7["presenter"]:::b + end + subgraph A["레이어 A — 도메인 분석 파이프라인"] + direction LR + a1["data"]:::a + a2["embedding"]:::a + a3["modeling"]:::a + a4["therapeutic_evidence"]:::a + a5["critic"]:::a + end + SLOT["spatialpatho-analyst
도메인 슬롯"]:::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개.

+ +
🔴 v03 정정 — "집필-단계 산출물이 아직 없다"는 더 이상 사실이 아니다. + 초판은 "분석 진행 단계라 manuscript/figures가 아직 없다"고 적었으나, + 현재 manuscript/sections/5개 섹션이 존재하고 Discussion 한계 절까지 실물로 작성돼 있다(Critic 승인조건 1 충족 판정 완료). + 다만 SKILL.md는 아직 이를 반영하지 못했다 → GAP 6.
+
+ + +
+

02 에이전트 명부와 권한 지도

+

각 에이전트는 시스템 프롬프트·도구 권한·산출물 계약을 파일로 갖는다. 도메인 고유는 spatialpatho-analyst 하나뿐.

+ +
+flowchart TB + subgraph LOCK["🔒 도구 수준으로 강제 — 쓰기 권한 없음"] + PC["paper-critic
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).

+ +
+
구분 1

계획 ≠ 실행 입구

+

paper-orchestrator계획만. 실행은 Skill을 메인 루프가 돌린다.

+
구분 2

도메인 격리

+

도메인 지식은 슬롯 하나에. 새면 레이어 B의 재사용성이 사라진다.

+
구분 3

내부 검수 ≠ 외부 리뷰

+

venue-reviewer는 게이트 ① 통과 후 원고 패키지만. 내부 맥락을 알면 심사자의 정보 부족을 재현 못 한다.

+
+
+ + +
+

03 라우팅 · 산출물 계약 · 품질 기준선

+

v03에서 보강된 절. 계약이 무엇을 넘기나라면, 품질 기준선은 어떤 상태로 넘기나이고, 실행·보고 계약은 실패했을 때와 끝났을 때를 규정한다.

+ +
+flowchart LR + Q["요청"]:::q --> M{"실행 모드 분기"}:::mode + M -->|"산출물 없음
풀 파이프라인 · 제출 준비"| 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가 리뷰 노동을 대신하고, 사람은 판단만 한다.

+ +
+flowchart TB + SRC["커밋 / PR"]:::src + subgraph L1["① CI 결정론 검증기 (기계) — blocking 7종"] + direction TB + c1["critic_pilot mutation
검수기가 무조건 통과시키는 회귀"]:::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

+ +

⭐ 검증기를 검증하는 층 — "통과만 하는 게이트는 게이트가 아니다"

+
+flowchart LR + M["의도적 결함 주입
실무자가 저지를 법한 실수를 심는다"]:::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 Cmanuscript · preprint · publish · main figureneeds_human사람 판정
Tier B그 외 실험·분석 결과provisional진행·커밋 허용
Tier Aguide · docs · setup · manifest가벼운 경로대부분 자동
+
사람에게 넘기는 것은 "판단"뿐. AI가 리뷰 노동(7-point 대조 · 적대적 다중패스 · 헤드라인 수치 재계산)을 전부 수행하고, + required_followupssurface된 판단항목만 올린다. + 사람이 리뷰 노동을 하면 몇 주, 판단만 하면 분 단위다. 자동화가 줄이는 것은 판단의 수가 아니라 판단에 도달하기까지의 노동이다.
+ +

거버넌스 — 넘지 못하는 선

+ + + + + + + +
금지이유
❌ 약물 구조 모델 입력DRP가 아님 — hypothesis-only
Critic이 자기 임계값·control을 스스로 결정anti-self-reference — GAP 3·4·5 수정이 여기 걸린다
❌ 발표자료 숫자를 합격 기준으로 사용기준은 봉인 문서 + 실물 코드뿐, 파일:줄로 인용
❌ 도구의 "못 찾겠다"를 통과로 처리가짜 DOI가 약한 제목검색으로 뚫림
❌ 티켓·파일을 열지 않고 상태 단정"없다"는 실물을 연 뒤에만. 기억은 근거가 아니다
+
뒤 네 항목은 뿌리가 같다 — 근거 없이 상태를 주장하는 것. + 그래서 규칙도 같은 모양이다: 근거는 실물뿐이고, 인용할 땐 출처를 밝힌다.
+
+ + +
+

05 다연구자 협업 구조

+

하네스는 진공에서 돌지 않는다. 연구자들이 각자의 역할·검수 짝·작업 환경을 갖고 그 위에서 협업한다.

+ +
+flowchart LR + JIRA["이슈 트래커
할당"]:::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로 한다. 커밋이 트래커 상태를 자동 갱신한다.

+ +
+flowchart LR + sj["모델링"]:::w --> kk["리뷰어 A"]:::r + kk2["임베딩"]:::w --> jm["리뷰어 B"]:::r + jm2["데이터 · split"]:::w --> bv["Critic 총괄"]:::r + jh["치료근거"]:::w --> bv2["Critic 총괄
+ 도메인 sub-check는
owner가 아닌 사람"]:::r + classDef w fill:#e5f5ec,stroke:#0e7a3d,color:#0b3a1f + classDef r fill:#fff6e3,stroke:#b06f00,color:#5a3800 +
+

그림 9. 자기 결과를 자기가 검수하지 않는다. 이 매핑은 자동 리뷰 루프의 cross_review_map그대로 주입된다.

+ +
sub-check는 고정 배정이 아니다. + ① 산출물·검증 대상 코드의 owner가 아닌 사람(제약) → ② 도메인 기본 후보(후보 목록일 뿐) → ③ 후보가 전부 owner면 Leader가 타 멤버 지정. + 실사례에서 기본 후보 둘 다 owner여서, 구 문구를 문자대로 따르면 Owner≠Reviewer를 위반했다. + 담당이 헷갈리면 역할표가 아니라 "이 산출물을 누가 만들었나"를 먼저 본다.
+
+ + +
+

06 설계 계보 — 왜 "완전 자율"이 아닌가

+

이 방향은 즉흥이 아니라 AI Scientist / multi-agent science 선행연구를 읽고 의도적으로 내린 포지셔닝이다.

+ +
+flowchart TB + subgraph PRIOR["선행연구"] + SAK["Sakana AI Scientist
완전 자율 파이프라인"]:::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. 두 교훈 — ① 완전 자율은 검증이 약하다 ② 멀티에이전트·가설 생성은 이미 붐빈다 — 이 곧 설계 원칙이 됐다. + 다만 인용한 문헌 하나가 현재 구현을 반박한다(점선).

+ +
Sakana의 AI Scientist가 "얼마나 자율적으로 갈 수 있나"를 물었다면, + 이 프로젝트는 "얼마나 정직하고 검증 가능하게, 그리고 여러 사람이 함께 굴릴 수 있게 만들 수 있나"를 물었다.
+
+ + +
+

변경 이력 · 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-27reviewervenue-reviewer 실체화 + 내부/외부 리뷰 격리
07-27도메인 sub-check = "owner 아닌 사람" 케이스별
08-03CI 검증 레이어 신설 — 검수가 3층이 됨
08-04~08-11스키마 확장 + validate_hypothesis.py(갭 1건 닫힘) · 게이트 mutation·공허통과 회귀 CI 편입
+ +
"아직 열린 갭 6건"은 위 표에 없다. 갭은 관찰된 것이지 채택된 설계 변경이 아니다. + 갭을 변경 이력에 넣으면 "설계가 이렇게 바뀌었다"로 잘못 읽힌다.
+ + +
+
+
+ + + +