Skip to content

harness: 정합성 게이트 도입 + 하네스 불일치 스왑 (BIOP02-100 / BIOP01-64·65·66·71·72·73) - #5

Merged
kakyungkim merged 9 commits into
kkkim-pipelinefrom
gglee
Jul 27, 2026
Merged

harness: 정합성 게이트 도입 + 하네스 불일치 스왑 (BIOP02-100 / BIOP01-64·65·66·71·72·73)#5
kakyungkim merged 9 commits into
kkkim-pipelinefrom
gglee

Conversation

@Geongyu

@Geongyu Geongyu commented Jul 26, 2026

Copy link
Copy Markdown
Collaborator

BIOP02-100(논문 생산 하네스 검토)의 산출물과, kkkim 공동리뷰(2026-07-26 18:53) 승인 후 권고 순서대로 반영한 라이브 스왑입니다. base를 main이 아니라 kkkim-pipeline으로 둔 이유는 아래 §5.

1. 무엇을 고쳤나

reviewer 팬텀 하나를 쫓다가, 같은 근본 원인의 사례가 3건이라는 걸 확인했습니다 — 파일을 지우거나 옮긴 커밋이 문서를 안 고쳤고, 그걸 잡을 게이트가 없었습니다. 그래서 개별 결함보다 게이트를 먼저 넣었습니다.

티켓 내용 상태
BIOP01-73 정합성 게이트 자체의 테스트 15종 완료
BIOP01-66 harness.yaml + scripts/harness_doctor.py + PR CI 완료
BIOP01-65 실행 전제 가드 scripts/start-paper-harness 완료
BIOP01-64 venue-reviewer 프로젝트 로컬 + 참조 개명 완료
BIOP01-72 검증 게이트 순서 정정 + 이중화 BIOP01 완료 / BIOP02 남음
BIOP01-71 핸드오프 계약 정정 / skills/ 라우터 부분 — 결정 필요(§4)

2. 검증 결과

게이트 자체 테스트 — 15/15 통과 (python harness_after/tests/test_harness_doctor.py, 표준 라이브러리만)

  • 오검 없는지: 정상통과 · 상대인용(p3_concordance.py) · ignore 규칙 · 산출물부재=WARN · 산문 'reviewer'=WARN · 스캔 토글 · local_only 부재
  • 놓침 없는지: 역할파일 부재 · 백틱 팬텀 · 표행 팬텀 · 경로 팬텀 · repo 루트 강제 · local_only가 .gitignore에 없으면 FAIL
  • 회귀: 스코프 갭 재현(AGENTS.md를 스캔에서 빼면 미검출, 넣으면 검출) · 실제 리포

실행 전제 가드 — 4케이스

케이스 결과
비-git 디렉터리 FATAL: git 저장소가 아님 exit 1
repo 하위 디렉터리 루트 자동 복귀 후 통과
다른 repo(BioProject02) MISSING: .claude/agents/hspc-velocity-analyst.md … → FATAL: 필수 구성요소 누락 → production run 중단 (범용 폴백 금지)
HARNESS_DOCTOR_ENFORCE=1 doctor FAIL → 중단

세 번째가 BIOP01-65의 핵심입니다 — 7/21에 재현된 "cwd가 달라 agent type not found → general-purpose 대체"가 진행 대신 중단이 됩니다.

doctor 검출 추이

14건  최초        (팬텀 에이전트 3 + 팬텀 경로 11)
11건  BIOP01-64 후 (팬텀 에이전트 3 → 0)
 8건  local_only 정정 후 (핸드오프 3건 오검 제거)

잔여 8건은 전부 skills/ 결정 대기분입니다(§4).

3. 리뷰 중 발견한 제 오진 (정정)

보고서 §6 M8(b)에서 HANDOFF.md·TODO.md·SESSION-LOG.md"재구조화 커밋으로 사라졌는데 계약은 여전히 필수로 지시한다" 고 적었는데 틀렸습니다.

.gitignore:115-117이 이들을 제외합니다 — 78a5a92(2026-07-01) "chore: 개인 작업기록(HANDOFF/TODO/SESSION-LOG) untrack". BIOP02도 동일(.gitignore:246-248). 삭제가 아니라 의도적 로컬 전용이고, 새 clone에 없는 게 정상입니다. 제 doctor가 이걸 팬텀으로 오검했습니다.

정정:

교훈: "문서가 가리키는데 파일이 없다"는 진짜 drift의도적 로컬 전용을 가립니다. 게이트가 둘을 구분 못 하면 팀은 빨간불을 무시하는 법을 배웁니다.

4. 머지 전 결정이 필요한 것 — skills/ 라우터

skills/bc7f824(2026-06-14, pipeline-only 재구조화)에서 삭제됐는데 AGENTS.md:52-56·README.md:12,27·CLAUDE.md:17-19가 여전히 그 라우터로 위임합니다. 잔여 팬텀 8건 전부가 여기서 나옵니다.

  • A. 라우터 복원skills/ROUTES.md + dataset×task 스킬 재생성
  • B. 문서를 실체에 맞게 정정 ← 권고. 삭제가 의도였고, 복원하면 Claude 쪽(.claude/agents+Skill)과 OpenClaw 쪽(AGENTS.md+skills/) 라우터가 둘로 갈라져 게이트가 지켜야 할 표면이 두 배가 됩니다. BIOP01-45는 실제 p0~p5 스크립트 위에 배선하는 편이 runner_manifest.yaml 계약과 맞습니다.

AGENTS.md는 OpenClaw 운영 문서라 이 PR에서 건드리지 않았습니다. 방향만 정해주시면 정정 + doctor 통과까지 처리하겠습니다. 이건 BIOP01-45 착수 전 선결이기도 합니다.

5. CI가 지금은 report-only입니다 (의도)

.github/workflows/harness-doctor.yml2단계로 도입했습니다.

  • 1단계(이 PR) — 게이트 자체 테스트는 blocking, 구성 검사(doctor 본체)는 continue-on-error
  • 2단계 — 팬텀 0(§4 결정 후) 달성 시 continue-on-error 한 줄 삭제로 blocking 승격

지금 전면 blocking으로 켜면 팬텀 8건 때문에 모든 PR이 빨간불이 되고, 그러면 팀이 게이트를 무시하는 법을 먼저 배웁니다. 실행 래퍼도 같은 원칙(구성요소 부재=항상 하드 실패 / 문서 drift=1단계 경고)입니다.

6. base가 kkkim-pipeline인 이유

mainkkkim-pipeline보다 8커밋 뒤처져 있습니다. main으로 열면 diff가 81 files / +6,824가 되는데 그중 5,000여 줄은 제 변경이 아니라 kkkim 님의 커밋(ee9d836, dd7a5f0, e95dc82 등)입니다. kkkim-pipeline 기준이면 29 files / +1,650 — 제 작업만 남습니다. PR #3과 같은 방식이고, main 반영은 다음 kkkim-pipelinemain 통합 PR(#4와 같은 형태)에 실려 갑니다.

7. 함께 진행한 상류 PR

원인이 원본 스캐폴드에 있었습니다 — agents/reviewer.md가 없는데 paper-orchestrator.md:13이 정식 멤버로 명시하고, SKILL.template.md:50-51이 스캐폴드 자신의 순서 규칙(:23)을 위반합니다. 두 인스턴스의 역전은 각자의 실수가 아니라 템플릿 상속이었습니다.

kakyungkim/paper-production-harness#2 (일반형 venue-reviewer.md 추가 + 참조 개명 + 전역 설치 안내 제거 + 템플릿 순서 교체)

8. 남은 일

  • skills/ 결정(§4) → 팬텀 0 → CI·래퍼 2단계 승격
  • BIOP02 반영 — 문서 참조 9곳 + agents/critic/auto_review_config.json:58"agents": ["paper-critic", "reviewer"] 배선. 해소 전까지 enabled=true 금지 권고
  • BIOP01-67(3계층 분리) · 68(RUN_STATE) · 69(CLAIMS) · 70(개명) — 후보본만, 검토 중

관련: BIOP02-100 / BIOP01-64 · 65 · 66 · 71 · 72 · 73

Geongyu added 7 commits July 26, 2026 16:59
reviewer 팬텀 에이전트(문서 6곳 참조·실체 없음), 프로젝트 에이전트 cwd 로딩,
검증게이트↔외부리뷰 순서를 정리. draft 경로(ff0ec25) 해소 및 검증게이트 3종
실재는 확인만. 과거 문서 미삭제 — 새 보고서 추가.
harness_after/ 신설 — 라이브 하네스 미수정, 승인 시 스왑용.
- harness.yaml (SSOT manifest), scripts/harness_doctor.py (정합성 게이트)
- docs/HARNESS.md(after), CLAUDE-routing.after.md
doctor가 현재 리포에서 reviewer 팬텀 3건 검출(FAIL) 확인.
BIOP01-64~70 대응. 과거 문서 미삭제.
- scripts/start-paper-harness (실행 전제 가드, BIOP01-65)
- RUN_STATE.template.yaml (BIOP01-68), CLAIMS.template.yaml (BIOP01-69)
- agents/venue-reviewer.md (프로젝트 로컬 후보, BIOP01-64)
- ci/harness-doctor.yml (정합성 게이트 CI, BIOP01-66)
라이브 미수정, 스왑 대기.
week1 논문분석 스킬+MultiVelo 샘플, week2 Insight(scope/papers.jsonl/
comparison/evidence/insight 4관점), week3 Validation(6기준). 근거=paper_analysis
velocity 9편. 원 마감 05~06월 경과분 기록 보존.
…/65/66)

불일치 보고 §6 추가 — 원본(kakyungkim/paper-production-harness)과 BIOP02를 추가
클론해 3자 대조. 1차 결론 2건 정정, 신규 결함 3건.

- M5 reviewer 팬텀의 출처는 원본(agents/에 reviewer.md 없는데 paper-orchestrator.md:13이
  정식 멤버로 명시) → BIOP01-64 반영 대상 2곳 → 3곳
- M6 게이트 순서는 관찰이 아니라 원본 규칙 위반 — 원본 paper-orchestrator.md:23이
  "paper-critic + gate FIRST, then reviewer"를 명문화했으나 BIOP01·BIOP02 SKILL.md 둘 다
  step7(리뷰) → step8(게이트)로 역전
- M7 BIOP02는 팬텀이 실행 설정에 배선 — auto_review_config.json:58
  "agents": ["paper-critic","reviewer"], independent_passes 2 (enabled=false 상태)
- M8 skills/ 라우터 팬텀(bc7f824에서 삭제, AGENTS.md:52-56이 여전히 위임) +
  HANDOFF/TODO/SESSION-LOG 핸드오프 계약 팬텀 → BIOP01-45 선결 조건
- M9 1차 doctor가 M8을 못 잡음 → 이번 커밋에서 보완

doctor 보완:
- harness.yaml: path_reference_scan 신설(백틱 인용 경로 실재 검사, resolve_by_basename,
  외부 repo/IP ignore), doc_reference_scan에 README.md·AGENTS.md 추가
- harness_doctor.py: 팬텀 경로 검사 추가 + 팬텀 에이전트 맥락 필터
  (백틱/표=FAIL, 산문=WARN) — kkkim 공동리뷰 지적 반영
- 실측: RESULT: FAIL (14 문제, 3 경고) — 팬텀 에이전트 3 + 팬텀 경로 11

라이브 하네스는 여전히 미수정(7/21 합의). 스왑 시 ci/harness-doctor.yml →
.github/workflows/ 활성화 필요(kkkim 권고).
kkkim 공동리뷰 승인(2026-07-26) 후 권고 순서대로 라이브 반영. 각 단계 검증 결과 포함.

BIOP01-73 게이트 자체 테스트 (신규, 선행):
- harness_after/tests/test_harness_doctor.py — 합성 리포 13종
  정상통과 / 역할파일부재 FAIL / 백틱 팬텀 FAIL / 표행 팬텀 FAIL /
  산문언급 WARN(오검방지) / 팬텀경로 FAIL / 상대인용 해석 / ignore 규칙 /
  산출물부재 WARN / repo루트 강제 / 스코프갭 재현 / path_scan 토글 /
  실제 리포 회귀
- 결과: 13/13 통과

BIOP01-66 정합성 게이트 라이브:
- harness.yaml, scripts/harness_doctor.py, .github/workflows/harness-doctor.yml
- CI 2단계 도입 — 게이트 자체 테스트는 blocking, 구성 검사는 report-only
  (팬텀 잔존 상태에서 전면 blocking이면 모든 PR이 빨간불)

BIOP01-65 실행 전제 가드 라이브:
- scripts/start-paper-harness. 검증 4케이스:
  비-git → FATAL / repo 하위 → 루트 자동복귀 통과 / 타 repo → 구성요소 누락 차단 /
  HARNESS_DOCTOR_ENFORCE=1 → 중단
- python 미존재 환경 대비 인터프리터 해석 추가

BIOP01-64 venue-reviewer 라이브:
- .claude/agents/venue-reviewer.md 프로젝트 로컬 설치(전역 금지)
- 문서 참조 10건 개명: CLAUDE.md 3 / docs/HARNESS.md 3 / SKILL.md 4
- 결과: 팬텀 에이전트 3 → 0

BIOP01-72 게이트 순서 정정:
- SKILL.md 실행순서를 게이트①(결과검증) → 리뷰 → 게이트②(패키지검증)로 교체
- 원본 paper-orchestrator.md:23 규칙 인용을 근거로 명시. BIOP02는 별도

BIOP01-71 핸드오프 3파일 신설:
- HANDOFF.md / TODO.md / SESSION-LOG.md — 계약이 지시하던 실물 생성
- skills/ROUTES.md 라우터는 결정 대기(복원 vs 문서정정)

doctor 추이: 14 → 11(64 반영) → 8(핸드오프 신설). 잔여 8건은 전부 skills/ 결정 대기분.
스왑 중 발견: HANDOFF/TODO/SESSION-LOG 는 삭제된 게 아니라 78a5a92(2026-07-01)
"개인 작업기록 untrack"으로 .gitignore:115-117 에 등재된 로컬 전용 파일이다
(BIOP02 .gitignore:246-248 도 동일). 보고서 §6 M8(b) 진단이 틀렸고,
doctor 의 팬텀 경로 검사가 이를 오검했다.

정정:
- harness.yaml: path_reference_scan.local_only 선언 추가
- harness_doctor.py: local_only 는 부재해도 FAIL 하지 않음. 대신 .gitignore
  등재 여부를 확인 — 계약상 "필수 산출물"인데 ignore 에서 빠지면 실수로
  커밋되므로 그때는 FAIL
- 테스트 #13(부재+ignore → PASS)·#14(ignore 누락 → FAIL) 추가 → 15/15 통과
- 계약 문구에 "로컬 전용(.gitignore)" 표기 — CLAUDE.md:32,91 / SKILL.md:76
- 보고서 §8 정정 절 추가 (원문 §6 M8(b) 는 기록으로 보존)

교훈: "문서가 가리키는데 파일이 없다"는 진짜 drift 와 의도적 로컬 전용을 가린다.
의도는 manifest 에 선언되고, 게이트는 선언되지 않은 것만 문제 삼아야 한다.

doctor 추이: 14 → 11(64) → 8(local_only 정정). 잔여 8건은 전부 skills/ 결정 대기.
@Geongyu
Geongyu requested a review from kakyungkim July 26, 2026 10:28
Geongyu added 2 commits July 26, 2026 19:39
skills/ 유실 경위가 앞선 보고와 다르다. 재조사 결과:

- bc7f824(6/14)는 skills/ 를 삭제한 게 아니라 추가한 커밋이다
  (import 박상준 Harness_Baseline, 4 datasets x download/preprocess/model/viz).
  이때 지운 것은 옛 논문분석 스킬 33개이고 kkkim-paper-agent 브랜치에 보존돼 있다.
- 이후 7f38b23(7/15 braveji env 정정) 등으로 계속 관리됐고 그 시점 41파일이었다.
- 275def2(7/20, Merge origin/main into kkkim-pipeline PR #4 충돌 해소)에서 41파일
  전부가 D 로 사라졌다. main 에는 이 skills/ 가 없었으므로 충돌 해소가 main 쪽을
  택하면서 통째로 날아간 것이다. 삭제 범위는 skills/ 안으로 한정(부수 피해 없음).

즉 문서가 낡은 게 아니라 파일이 유실됐다. AGENTS.md 라우팅은 지금도 옳은 말을 한다.

변경:
- skills/ 복원 — git checkout 7039bc4 -- skills/ (41파일, 유실 직전 상태 그대로)
- harness.yaml: path_reference_scan.conventions 선언. AGENTS.md Repository Conventions
  의 data/ metadata/ work/ outputs/ 는 산출물을 둘 위치 안내이지 사전 존재를 요구하는
  경로가 아니다. 부재해도 FAIL 아님
- 테스트 +2 (규약경로 통과 / 미선언 경로는 여전히 FAIL) -> 17/17 통과
- live 회귀 테스트 방향 전환: 알려진 결함이 잡히는가 -> 깨끗한 상태를 지키는가
- 2단계 승격: CI continue-on-error 제거, 래퍼 HARNESS_DOCTOR_ENFORCE 기본값 1

doctor: 8 -> 0. RESULT: PASS.

주의: skills/ 복원 여부는 07-27 미팅 결정 사항(BIOP01-71). 이 커밋은 PR #5 안에 있고
머지 전이므로 결정에 따라 되돌릴 수 있다. B(문서 정정)로 확정되면 skills/ 를 다시 빼고
AGENTS.md README CLAUDE.md 참조를 정정해야 doctor 가 0 을 유지한다.
CI(GitHub runner)에서만 FAIL 이 났다. 로컬(우리 서버 컨테이너)에서는 PASS.
원인: CLAUDE.md:27 이 팀 공유 conda env 위치로 /opt/envs 를 인용하는데,
runner 에는 그 경로가 없어 doctor 가 팬텀 경로로 판정했다.

이건 게이트의 오검이자, 동시에 게이트가 제 값을 한 사례다 — 문서에 박힌
환경 의존 절대경로는 우리 서버에서만 성립하고 다른 곳에서는 깨진다.
(같은 종류를 3a86f6f "remove hardcoded absolute paths from agent/skill prompts"
에서 한번 정리한 적이 있고, 이건 그 뒤에 남은 잔여물이다.)

- ignore 규칙 ^/dev/ → ^/ 로 일반화. 절대 호스트 경로는 리포 경로가 아니므로
  팬텀 판정 대상이 아니다. 환경마다 결과가 달라지면 게이트를 신뢰할 수 없다.
- 테스트 #17 추가 — 절대 호스트 경로가 팬텀으로 잡히지 않는지 고정. 18/18 통과.

doctor: PASS (0 문제, 0 경고).

남는 판단(별건): CLAUDE.md:27 의 /opt/envs 인용 자체를 유지할지. 사실 기술이라
당장 틀린 문장은 아니지만, 문서가 특정 서버 레이아웃을 전제하는 것은 이식성
위험이다. conda run -n <env> 안내로 충분한지 팀 확인 필요.
kakyungkim added a commit that referenced this pull request Jul 27, 2026
…(DoD)

여러 세션째 미커밋으로 끌고 오던 활성 프로젝트 지침을 추적 상태로 정합. 내용:
- 인프라·접속·환경 포인터(docs/SHARED-INFRA-GUIDE.md 정본)
- 방법론 주의 6: 합격 기준의 근거는 봉인 문서뿐(2026-07-17 α 0.88 관측값≠임계 ρ≥0.50 실사고)
- 완료의 정의(DoD) 커밋/공개 전 체크리스트
PR #5(gglee)의 CLAUDE.md 변경(venue-reviewer 개명·로컬전용 표기)과 3-way 병합 clean 확인(git merge-file rc=0). 미커밋은 CLAUDE.md 하나뿐이라 PR #5 mergeable 불변.
@kakyungkim
kakyungkim merged commit cb886ee into kkkim-pipeline Jul 27, 2026
2 checks passed
Geongyu added a commit that referenced this pull request Jul 27, 2026
기존 README는 2026-06-14(6792aa4)에서 멈춰 있었다. 그동안 바뀐 것이 README에 하나도
반영되지 않아, 리포의 첫 화면이 실제 상태와 어긋나 있었다.

정정한 것
- 제목이 "BioProject01 — kkkim-pipeline"이었다. 이 파일은 이제 main에 있다.
- 하네스 정합성 게이트(harness.yaml + harness_doctor.py + 테스트 18종 + PR CI)가
  통째로 빠져 있었다. PR #5→#7로 main에 들어간 것이 README에 없다.
- "이 하네스는 OpenClaw로 실행한다"고 단언했다. 2026-07-27 실측 결과 팀 컨테이너
  6개 중 openclaw CLI 설치는 0개다. 도입 미결 + 현재 실행수단(Claude Code/codex)으로 정정.
- HANDOFF/TODO/SESSION-LOG를 "작업 기록"으로만 적어 새 clone에도 있는 것처럼 읽혔다.
  .gitignore 로컬 전용임을 명시.
- 누락돼 있던 디렉터리 반영: .claude/, harness.yaml, scripts/, harness_after/, evals/,
  docs/, guide/, onboarding_gglee/, ai_scientist/, artifacts/, manuscript(심볼릭 링크).
- paper_analysis 편수: dual-lens 14편 + 스쿱 점검 1편(todorovski)으로 구분.
  _index/papers.csv의 14는 dual-lens 기준이라 정합하다.

추가한 것
- 브랜치 지도 12개. main과의 차이는 git rev-list 실측(진행/archive/병합완료/미병합).
- 연구 결론 한 문단. 단 수치는 싣지 않고 FINDINGS.md를 정본으로 가리킨다
  (CLAUDE.md 방법론 주의 6 — 요약본의 숫자를 임계로 쓰지 않는다).
- 담당표의 정본이 Confluence와 JIRA임을 명시. 개인별 배정 내역은 리포에 적지 않는다.

검증
- python scripts/harness_doctor.py --repo . --manifest harness.yaml → PASS, phantom_paths=0
- python harness_after/tests/test_harness_doctor.py → 18/18 OK
- 작성 중 게이트가 이 README의 팬텀 경로 6건을 실제로 잡았다(브랜치 이름 3, 확장자 3).
  게이트가 슬래시 든 백틱 토큰을 경로로 읽는 한계는 본문에 명시.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants