From 594ef6bd3e3fd147fa191ff3bd28fa8e3f296502 Mon Sep 17 00:00:00 2001 From: braveji18 Date: Thu, 27 Aug 2026 13:19:00 +0000 Subject: [PATCH] =?UTF-8?q?BIOP02-75=20#done=20Critic=207-point=20?= =?UTF-8?q?=EC=B5=9C=EC=A2=85=20=EC=84=9C=EB=AA=85=20=E2=80=94=20critic=5F?= =?UTF-8?q?status:=20pass=20(=EA=B3=BC=ED=95=99=20=EA=B2=8C=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8=20=ED=95=9C=EC=A0=95)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 재정의된 성공 기준("7항목 전부 판정 완료 + caution 은 Limitation 명시", kkkim 승인 11402·11512)을 충족해 2단 최종 서명한다. ## 서명 범위 — 한정한다 covers: Critic 7-point 과학 게이트 × 4 엔드포인트 does NOT cover: 외부 공개(preprint·투고). 저자·소속·순서·corresponding· Funding 확정은 별도 공개 게이트이며 여전히 닫혀 있다(BIOP02-114). 게이트 분리 결정(braveji, #12051): 저자 메타데이터는 어떤 과학적 주장의 타당성에도 영향을 주지 않는다. 두 게이트를 한 조건에 묶은 것은 braveji 자신의 2단 정의(#11515)였고, 그 때문에 Critic 게이트가 과학과 무관한 사유로 닫히지 못했다. 범위를 과학 게이트로 한정해 서명하되 공개 차단은 유지한다. kkkim 이의 시 되돌릴 수 있다. ## 서명 직전 실물 재확인 (기억·SESSION_LOG 아님, origin/main 6390f9b) 7항목 × 4엔드포인트 매트릭스 28칸 · 미판정 0 #2 baseline(ER/PR 비가산) 04_discussion.md:19 #3 counterfactual(proba-level) 04_discussion.md:21 #2/#4 HER2 정직한 음성(reject) 04_discussion.md:23 #5 bio_plausibility 04_discussion.md:25 DRP 금지표현 스캔 전 섹션 + 전체초안 실히트 0 Fig 1/2/3 pass / pass(19/19) / pass(25/25) 자기정정: 1차 스캔에서 caution 3종이 0히트로 나왔으나 원인은 원고가 아니라 내 grep 문법 오류였다(-E 에서 \| 는 리터럴 파이프 → 검색어 자체가 존재하지 않는 문자열). 도구가 "못 찾겠다"고 한 것을 사실로 처리하지 않고 조사해 확인했다 — CLAUDE.md 금지항목 그대로. ## 부수 — FIGURES_INDEX 정합 main 의 FIGURES_INDEX 가 Fig3 를 caution 으로 두고 있어 GATE_STATUS(pass)와 어긋나 있었다. 08-19 서명 내용으로 동기화하고, stale 해진 "Fig 3 잔여 1건" 절과 남은작업 항목도 해소 서술로 교체했다. 비블로커 잔여 2건: PAM50 발현 study_id 미커밋(원고 한계에 서술, kkkim #11967 비블로커 확인) · 04_discussion.md:10 의 stale (Yale 0.533 은 전체 초안 R6 에 실재 — 집필 담당 정리 대상). 산출물: critic_report.json + 재현물 4종(BIOP02-59/75-fig3/91/56). claim_level: hypothesis_only Co-Authored-By: Claude Opus 5 --- .../BIOP02-75_critic_gate/GATE_STATUS.md | 28 ++++++++ .../BIOP02-75_critic_gate/critic_report.json | 69 +++++++++++++++++++ research/paperA-positioning/FIGURES_INDEX.md | 24 ++++--- 3 files changed, 111 insertions(+), 10 deletions(-) create mode 100644 experiments/braveji/BIOP02-75_critic_gate/critic_report.json diff --git a/experiments/braveji/BIOP02-75_critic_gate/GATE_STATUS.md b/experiments/braveji/BIOP02-75_critic_gate/GATE_STATUS.md index 6a8e6dd..2ba5538 100644 --- a/experiments/braveji/BIOP02-75_critic_gate/GATE_STATUS.md +++ b/experiments/braveji/BIOP02-75_critic_gate/GATE_STATUS.md @@ -77,6 +77,34 @@ kkkim이 근거 수치를 원자료에서 독립 확인한 뒤 승인. **승인 --- +### ✅✅ 2단 최종 서명 완료 — 2026-08-27 (`critic_status: pass`, JIRA 12053) + +**확정:** Critic 7-point **과학 게이트 통과**. 재정의된 성공 기준(*"7항목 전부 판정 완료 + caution은 Limitation 명시"*, kkkim 승인 11402·11512)을 충족. + +**⚠️ 이 서명이 열지 않는 것:** **외부 공개(preprint·투고)는 그대로 닫혀 있다.** 저자·소속·순서·corresponding·Funding 확정은 **별도 공개 게이트**이며 미해소다(BIOP02-114). + +**게이트 분리 결정 (braveji, #12051 → 승인 A안):** 저자 메타데이터는 어떤 과학적 주장의 타당성에도 영향을 주지 않는다. 7-point는 과학 게이트, 저자정보는 공개 게이트다. 두 게이트를 한 조건에 묶은 것은 **braveji 자신의 2단 정의(#11515)**였고 그 때문에 Critic 게이트가 과학과 무관한 사유로 닫히지 못했다. 범위를 과학 게이트로 한정해 서명하되 **공개 차단은 유지**한다. kkkim 이의 시 되돌릴 수 있다. + +**서명 직전 실물 재확인**(기억·SESSION_LOG 아님, origin/main `6390f9b`): + +| 조건 | 근거 | +|---|---| +| 7항목 × 4엔드포인트 판정 완료 | §1 매트릭스 28칸, **미판정 0** | +| #2 baseline (ER/PR 비가산) | `04_discussion.md:19` | +| #3 counterfactual (proba-level 한정) | `04_discussion.md:21` | +| #2/#4 HER2 정직한 음성(reject) | `04_discussion.md:23` | +| #5 bio_plausibility | `04_discussion.md:25` | +| DRP 금지표현 스캔 | 전 섹션 + 전체초안 **실히트 0** | +| Fig 1 / 2 / 3 | pass(07-21) / pass(07-27, 19/19) / **pass(08-19, 25/25)** | + +> 🔎 **자기정정:** 1차 스캔에서 caution 3종이 **0히트**로 나왔으나 원인은 원고가 아니라 **내 grep 문법 오류**였다(`-E`에서 `\|`는 리터럴 파이프 → 검색어 자체가 존재하지 않는 문자열). **도구가 "못 찾겠다"고 한 것을 사실로 처리하지 않고 조사해 확인**했다 — CLAUDE.md 금지항목 그대로. + +**비블로커 잔여 2건(판정에 영향 없음):** PAM50 발현 study_id·계산 스크립트 미커밋(원고 한계에 서술, kkkim #11967 확인) · `04_discussion.md:10`의 stale ``(Yale 0.533은 전체 초안 R6에 실재 — 집필 담당 정리 대상). + +**산출물:** `critic_report.json`(이 폴더) + 재현물 4종(`BIOP02-59_bioplausibility_recompute` · `BIOP02-75_fig3_pam50_verification` · `BIOP02-91_cost_verification` · `BIOP02-56_counterfactual_recompute`). + +--- + ## 3. 최종 서명(-75) 잔여 블로커 **갱신 2026-08-19 (Fig 3 PAM50 CI 25/25 검증·서명 완료).** 잔여 = **저자·소속·순서·corresponding 확정(팀 게이트) · PAM50 발현 study_id 커밋(kkkim)** — **braveji 몫의 기술 잔여는 없다.** diff --git a/experiments/braveji/BIOP02-75_critic_gate/critic_report.json b/experiments/braveji/BIOP02-75_critic_gate/critic_report.json new file mode 100644 index 0000000..db5efd2 --- /dev/null +++ b/experiments/braveji/BIOP02-75_critic_gate/critic_report.json @@ -0,0 +1,69 @@ +{ + "schema": "critic_report/7point", + "issue": "BIOP02-75", + "signer": "braveji (Scientific Critic 총괄)", + "date": "2026-08-27", + "critic_status": "pass", + "claim_level": "hypothesis_only", + "scope": { + "covers": "Critic 7-point 과학 게이트 (데이터 누수·기준선·반사실·교차데이터·생물학적 타당성·DRP 프레이밍·claim 수준) × 4 엔드포인트", + "does_not_cover": "외부 공개(preprint/투고). 저자·소속·순서·corresponding·Funding 확정은 별도 공개 게이트이며 여전히 닫혀 있다.", + "gate_decoupling": { + "decided_by": "braveji (critic_status owner)", + "rationale": "저자 메타데이터는 어떤 과학적 주장의 타당성에도 영향을 주지 않는다. 7-point는 과학 게이트이고 저자정보는 공개 게이트다. 두 게이트를 한 조건에 묶어 둔 것은 braveji 자신의 2단 정의(#11515)였고, 그로 인해 Critic 게이트가 과학과 무관한 사유로 닫히지 못하고 있었다.", + "safeguard": "공개 차단은 그대로 유지된다. 이 서명은 공개를 열지 않는다.", + "open_to_objection": "kkkim(Leader)이 이 범위 결정에 이의가 있으면 되돌릴 수 있다. 제안·근거 = JIRA #12051." + } + }, + "success_criterion": { + "text": "7항목 전부 판정 완료 + caution은 Limitation으로 명시 서술", + "approved_by": "kkkim", + "approval": "JIRA 11402 (2026-07-24) · 재확인 11512" + }, + "verification_at_signature": { + "note": "기억·SESSION_LOG가 아니라 서명 직전 origin/main 실물에서 재확인", + "matrix_cells": 28, + "unjudged": 0, + "caution_in_limitations": { + "#2 baseline (ER/PR 비가산)": "manuscript/sections/04_discussion.md:19", + "#3 counterfactual (proba-level 한정)": "manuscript/sections/04_discussion.md:21", + "#2/#4 HER2 정직한 음성(reject)": "manuscript/sections/04_discussion.md:23", + "#5 bio_plausibility": "manuscript/sections/04_discussion.md:25" + }, + "drp_forbidden_scan": { + "실히트": 0, + "대상": "manuscript/sections/ + DRAFT_paperC_full_ko.md" + }, + "figures": { + "Fig1": "pass 2026-07-21", + "Fig2": "pass 2026-07-27 (19/19)", + "Fig3": "pass 2026-08-19 (25/25)" + }, + "reproduction_artifacts": [ + "experiments/braveji/BIOP02-59_bioplausibility_recompute/ (#5, 3/3 일치)", + "experiments/braveji/BIOP02-75_fig3_pam50_verification/ (Fig3, 25/25 일치)", + "experiments/braveji/BIOP02-91_cost_verification/ (Fig2, 19/19 일치)", + "experiments/braveji/BIOP02-56_counterfactual_recompute/ (#3, diff 0)" + ], + "self_correction": "서명 직전 1차 스캔에서 caution 3종이 0히트로 나왔으나, 원인은 원고가 아니라 내 grep 문법 오류였다(-E 에서 \\| 는 리터럴 파이프라 검색어 자체가 존재하지 않는 문자열이 됐다). 도구가 '못 찾겠다'고 한 것을 사실로 처리하지 않고 조사해 확인함 — CLAUDE.md 금지항목 그대로." + }, + "residual_not_blocking": { + "PAM50 발현 study_id·계산 스크립트 미커밋": "원고 한계에 서술됨(04_discussion.md:25). kkkim #11967 비블로커 확인", + "manuscript/sections/04_discussion.md:10 ": "Yale 결과는 전체 초안 R6에 실재(0.533). 섹션 파일의 stale placeholder — 집필 담당 정리 대상, 과학 판정에 영향 없음" + }, + "endpoints": { + "ER": "SIGNAL, NOT ADDITIVE", + "PR": "SIGNAL, NOT ADDITIVE", + "HER2": "REJECT (정직한 음성)", + "PAM50-4class": "caution (pass 후보 1순위)" + }, + "jira": [ + "11402", + "11512", + "11560", + "11586", + "11965", + "11967", + "12051" + ] +} \ No newline at end of file diff --git a/research/paperA-positioning/FIGURES_INDEX.md b/research/paperA-positioning/FIGURES_INDEX.md index 2a3f254..380f256 100644 --- a/research/paperA-positioning/FIGURES_INDEX.md +++ b/research/paperA-positioning/FIGURES_INDEX.md @@ -4,7 +4,7 @@ **목적:** Paper A(cost-of-substitution) figure의 **단일 출처·버전 규칙**과 현재 상태를 한 곳에 정리. Confluence(VC) 공유의 근거 문서. **관리자:** braveji(Orchestrator). **정본 figure 계획:** `research/paperA-positioning/2026-07-10_research-plan.md` §9. -**최종 갱신:** 2026-07-15 · 근거 = origin/main + 진행 중 PR. +**최종 갱신:** 2026-08-27 · 근거 = origin/main 실물 + 재계산 검증. --- @@ -27,7 +27,7 @@ Paper A가 **표현형 예측 → cost-of-substitution**으로 재정립되면 |---|---|---|---|---|---| | **Fig 1** | Pipeline + governance schematic (개념도) | ✅ **critic_status: pass** (braveji 서명 2026-07-21) — DRP framing·claim-level·사실정합·시각 QA 통과. 수치 주장 없는 도식 | `agents/modeling/scripts/make_fig1_pipeline.py` → `experiments/braveji/fig1_pipeline/fig1_pipeline.{png,pdf}` | braveji | BIOP02-62 | | **Fig 2** ⭐ | label↔therapy 해리 2-panel (**최결정 그림**) | ✅ **critic_status: pass** (braveji 서명 2026-07-27) — 근거 JSON 4건 수정 완료분을 원자료에서 **19/19 재계산 일치**. Fig 2는 CI 주장이 없고 행정규화 confusion·cost overlay가 검증된 confusion(171·9/33·2/58·21)과 손검산 일치(`0.9429×0.395=0.3724` 등) | `experiments/kkkim/20260710_cost_of_substitution/make_fig2_confusion_distance.py` → `fig2_confusion_distance.{png,pdf,json}` | kkkim/sjpark | BIOP02-91 | -| **Fig 3** | 축별 cost + headline 대비 (cost bar + CI) | ⚠️ **critic_status: caution** (braveji 재검증 2026-07-27) — **receptor 축은 조건 충족**(환자단위 CI `[0.3309, 0.4266]` 재계산 일치, PNG 재생성 `39c3bed`). **잔여 1건: 같은 그림의 PAM50 라우팅 CI `[0.276, 0.402]`가 여전히 슬라이드 단위**(`patient_routing_cost.json` — `ci95_method`·리샘플 단위·B·seed 전부 미기재) = receptor에서 고친 pseudo-replication이 PAM50 칸에 남음 | `experiments/kkkim/20260710_cost_of_substitution/make_fig3_axis_cost.py` → `fig3_axis_cost.{png,pdf,json}` | kkkim/sjpark | BIOP02-91 | +| **Fig 3** | 축별 cost + headline 대비 (cost bar + CI) | ✅ **critic_status: pass** (braveji 서명 2026-08-19) — receptor 축 19/19(07-27)에 이어 **PAM50 라우팅 CI를 환자 클러스터 부트스트랩으로 교체한 `83da89d`를 원자료에서 25/25 재계산 일치** 확인(`[0.2508, 0.4254]`, 0 배제). 비용 컬럼도 규칙에서 재생성(최대차 0.00e+00) | `experiments/kkkim/20260710_cost_of_substitution/make_fig3_axis_cost.py` → `fig3_axis_cost.{png,pdf,json}` | kkkim/sjpark | BIOP02-91 | | **Fig 4** | C2 positive-control recall + miss-rate | ⏳ 미착수 (fig4_external_sanity_lock는 구 프레이밍) | `experiments/sjpark/fig4_external_sanity_lock.png`(구), 재작성 필요 | sjpark | — | | **Fig 5** (선택) | Dawood baseline 대조 | ⏳ 미착수 | — | — | — | @@ -53,13 +53,13 @@ Paper A가 **표현형 예측 → cost-of-substitution**으로 재정립되면 - VC 스페이스 figure 페이지에 canonical 표 + 최신 PNG 게시. 상태: **이 레지스트리 페이지 게시** → 이미지 첨부는 후속(REST attachment). - 블로그 6편은 이미 Confluence 게시됨(별건). -## Critic 서명 현황 (2026-07-27 갱신) +## Critic 서명 현황 (2026-08-19 갱신 — Fig 1·2·3 전부 pass) | Fig | critic_status | 서명/검증 | 잔여 | |---|---|---|---| | Fig 1 | **pass** | braveji 2026-07-21 | — | | **Fig 2** | **pass** | **braveji 2026-07-27** (근거 4건 수정분 19/19 재계산 일치) | — | -| **Fig 3** | **caution** | braveji 2026-07-27 (receptor 축 충족) | **PAM50 라우팅 CI 환자단위 교체 1건** | +| **Fig 3** | **pass** | **braveji 2026-08-19** (receptor 19/19 + PAM50 25/25 독립 재계산 일치) | — | | Fig 4·5 | — | 미착수 | 산출 자체 | ### ✅ Fig 2·3 pass 승격 조건 4건 — 전부 해소 확인 (2026-07-27, braveji 독립 재계산) @@ -72,18 +72,22 @@ Paper A가 **표현형 예측 → cost-of-substitution**으로 재정립되면 4. ✅ `ci_method`: resample_unit=patient(cluster bootstrap) · n_bootstrap=5000 · seed=42 · n_slides=294 · n_patients=95 + note - **추가 반영(권고 이상):** per-axis `mean_cost_ci95_patient`도 환자 단위로 신설 — 제가 계산한 적 없는 값인데 재계산과 **비트 단위 일치**(endocrine `[0.0, 0.0793]` · antiHER2 `[0.395, 0.446]` · chemo `[0.417, 0.5957]`). -### ⚠️ Fig 3 잔여 1건 — PAM50 라우팅 CI (신규 발견) +### ✅ Fig 3 PAM50 라우팅 CI — 해소·서명 (2026-08-19) -Fig 3은 receptor·PAM50 **두 라우팅을 같은 그림에 표시**한다. receptor 축은 환자 단위로 고쳤으나, **PAM50 축(`patient_routing_cost.json`)의 `ci95: [0.276, 0.402]`는 여전히 슬라이드 단위**이고 `ci95_method`·리샘플 단위·B·seed가 **전부 미기재**다 — receptor에서 고친 pseudo-replication이 같은 그림의 다른 칸에 남아 있다. +Fig 3은 receptor·PAM50 **두 라우팅을 같은 그림에 표시**한다. receptor 축은 2026-07-27에 환자 단위로 고쳤으나 **PAM50 축이 슬라이드 단위로 남아 있었다**(pseudo-replication이 같은 그림의 다른 칸에 잔존). -- **블로커 해소됨:** kkkim이 이 항목을 "BIOP02-90(sjpark) 도착 후 후속"으로 잡았으나(11402), **BIOP02-90은 커밋 `e0c32b0`으로 완료**되어 예측 CSV에 `case_id`가 들어왔다 → **환자 단위 재계산이 지금 가능**하다. -- **예상:** 폭 ~1.3× 확대 시에도 0을 배제할 가능성이 높으나(receptor 사례), **braveji가 계산한 값이 아니므로 단정하지 않는다.** 실제 재계산 후 대조 필요. -- PAM50 예측 확률은 커밋 CSV에 없어(er/pr/her2만) braveji가 독립 재계산 불가 → **kkkim 산출 후 재검증.** +kkkim이 `83da89d`로 PAM50 축을 **환자 클러스터 부트스트랩**으로 교체하고 **독립검증용 인덱스 CSV를 함께 커밋**했다. braveji가 생산 스크립트를 호출하지 않고 라우팅·비용 규칙을 재구현해 대조 → **25/25 완전일치**. + +- headline `0.3396` · 환자단위 CI `[0.2508, 0.4254]` · **0 배제 유지**(슬라이드 단위 `[0.2765, 0.4004]`는 `_deprecated` 보존) +- per-axis CI 3종 · `mean_cost` · `misroute_rate` · `dropped_rate` · n_slides 382 · n_patients 115 · B=5000 · seed=42 전부 일치 +- **`cost` 컬럼도 읽지 않고 규칙에서 재생성**해 대조(순환 검증 방지, 최대차 `0.00e+00`) + +⚠️ **재현 함정 2건**(둘 다 검증자가 실제로 밟음) — 예측 파일이 `pam50_clam_mb_uni_v1`(5-class)과 `_4class` 둘이라 후자로 계산하면 per-axis n은 맞고 cost만 어긋난다 · 무치료 페널티는 **전역 최대 0.765**(true 축 기준 최대 아님). 상세 = `experiments/braveji/BIOP02-75_fig3_pam50_verification/`. kkkim이 JSON note에 페널티 정의를 명시해 해소(`f5bd15c`). 근거·재현 스크립트: `experiments/braveji/BIOP02-91_cost_verification/` ## 남은 작업 - ~~Fig 2(최결정) 2-panel 확정~~ → ✅ 초안·main 병합(PR #63). ~~Fig 3 분리 산출~~ → ✅ 초안(2026-07-17). ~~Critic 검증~~ → ✅ 완료. ~~pass 승격 4건~~ → ✅ 해소·재계산 검증(2026-07-27) → **Fig 2 pass 서명 완료.** -- **Fig 3 pass 잔여 1건** — PAM50 라우팅 CI 환자 단위 교체(kkkim). BIOP02-90 완료로 블로커 해소, 산출 후 braveji 재검증. +- ~~Fig 3 pass 잔여 1건~~ → ✅ **해소·서명 완료(2026-08-19)** — PAM50 라우팅 CI 환자 단위 교체(kkkim `83da89d`) 후 braveji 25/25 재계산 일치. **Fig 1·2·3 전부 pass.** - Fig 4 positive-control 재작성 — sjpark. - ~~Confluence PNG 첨부~~ → **Leader 결정(2026-07-27, BIOP02-66 #11513): PNG 첨부는 선택 항목.** REST attachment 403은 인증 환경 제약이지 이 작업의 미완이 아님 → 버전 고정 Git 링크로 접근 보장. **최종 제출 패키지 시점에 웹 UI 수동 업로드** — BIOP02-76/79 제출 체크리스트로 이관.