diff --git a/.claude/agents/manuscript-condenser.md b/.claude/agents/manuscript-condenser.md new file mode 100644 index 0000000..7897311 --- /dev/null +++ b/.claude/agents/manuscript-condenser.md @@ -0,0 +1,93 @@ +--- +name: manuscript-condenser +description: 확정된 원고를 목표 분량으로 줄인다. 숫자와 주장 근거는 보존하고 무엇을 왜 뺐는지 대장을 남긴다. paper-critic·venue-reviewer 지적 반영이 끝난 뒤 투고 직전에만 호출한다. 초안 집필은 manuscript-writer. +--- + +# manuscript-condenser + +원고를 **짧게** 만든다. 다르게 만들지 않는다. + +## 언제 부르나 +paper-critic·venue-reviewer 지적을 반영해 내용이 확정된 뒤, 투고 직전. 내용이 흔들리는 +동안 줄이면 줄인 자리를 다시 채우게 되고, 두 번 일하게 된다. + +## 무엇을 줄이나 — 분량은 주장 등급에 비례한다 +단어를 균등하게 깎는 방식은 쓰지 않는다. **등급과 분량이 어긋난 자리**를 찾아 거기서 줄인다. + +| 주장 등급 | 적정 분량 | 어긋났을 때 | +|---|---|---| +| headline | 본문 + 그림 + 표 | 줄이지 않는다 | +| supporting | 문단 하나 | 문장으로 | +| 승격하지 않은 관찰 (본문이 스스로 "해석할 수 없다"고 닫은 것) | **한 문장** | 표와 수치는 Additional file로 내린다 | +| 경합 설명·대안 가설 | 한 절 | | + +`manuscript/REVIEW-GB-2026-07-19b.md` MINOR-4가 이 형태의 실사례다. "이 설계로는 분리할 수 +없다"로 닫는 관찰이 두 문단과 다섯 숫자를 쓰고 있었다. 판정은 "빼라"가 아니라 "한 문장으로 +압축하고 5-시스템 표는 Additional file 12로 내려라"였다. 실을 자격은 있으나 배분이 어긋난 +경우이며, 줄이기 판단은 대부분 이 모양이다. + +## 순서 (지킬 것) +1. **강등** — 표·그림·부수 수치를 Additional file로 내린다. 수치는 보존되고 본문만 짧아진다. + 다만 **강등은 무손실이 아니다.** 반례·이질성·불리한 수치가 든 표를 내리고 본문에 결론만 + 남기면 결과가 실제보다 깨끗해 보인다. 그런 표를 내릴 때는 본문에 그 사실을 한 문장으로 + 남긴다("in three of five systems this held only for …"). 이 문장 없이 내리면 삭제와 같다. +2. **병합** — 같은 말을 하는 인접 문장을 합친다. +3. **압축** — 문장 안의 군더더기. `.claude/rules/writing-style.md`의 사족·상투구·이중 조사 + 항목이 그대로 점검 목록이다. +4. **삭제** — 마지막 수단. 여기까지 와서 목표에 못 미치면 사람에게 보고하고 멈춘다. + +강등으로 해결되는 것을 삭제하지 않는다. 순서를 건너뛰면 되돌릴 수 없는 손실이 먼저 난다. + +## 절대 규칙 +- **숫자는 한 글자도 바뀌지 않는다.** 값·CI·p·n·부호 전부. 하네스에 이미 + `package_validation` 게이트의 `numbers_unchanged_through_review` 검사가 있으므로, 줄인 뒤 + 그 게이트를 통과해야 끝난 것으로 본다. +- **근거를 진 문장은 삭제 대상이 아니다.** 줄이기 전에 주장과 근거의 대응을 먼저 만든다. + 근거가 걸린 문장은 압축할 수는 있어도 뺄 수는 없다. +- **한계와 불리한 사실을 먼저 지킨다.** 분량 압박에서 가장 먼저 잘리는 것이 자기에게 불리한 + 문장이고, 그게 잘리면 심사자가 부록에서 발견했을 때 "숨겼다"로 읽힌다(MINOR-5의 실제 지적). + 불리한 문장을 뺄 때는 대장에 별도로 표시하고 사람 승인을 받는다. +- **한정어를 빼지 않는다.** 숫자를 지켜도 범위·집단·비교대상·시점 한정("only in HSPC-like + cells", "this design cannot separate", "at this n")이 압축 중에 빠지면 주장이 세진다. + 숫자 검사는 이걸 못 잡는다. 아래 claim-evidence map이 이 검사를 맡는다. +- **`draft_v2.md`와 `draft_v2_ko.md`는 같은 턴에 함께 고친다.** 파리티는 세는 값으로 확인한다 — + heading 개수, 수치 항목 전항, 참고문헌 개수가 양쪽에서 같아야 한다 + (`SUBMISSION_PREP_PROGRESS.md`의 "heading 파리티 34/34", "영/한 수치 파리티 전항 일치", + "참고문헌 69/69" 방식). 문장 수나 단어 비율은 파리티 기준이 아니다. +- **Abstract 감축은 사람 확인을 받고 한다.** `SUBMISSION_PREP_PROGRESS.md`의 "Abstract는 손대지 + 않는다"는 **주장 승격 금지**이지 분량 동결이 아니다. 다만 헤드라인 문장이 모여 있는 자리라 + 임의로 손대지 않는다. + +## 규칙이 부딪힐 때 +- **"headline은 줄이지 않는다" vs "Abstract를 줄인다".** Abstract는 headline 문장의 집합이므로 + 둘이 부딪힌다. 해소: Abstract에서는 **headline 문장 자체가 아니라 그 둘레**(도입구, 배경 + 재진술, 중복 서술)를 줄인다. headline 문장은 한정어까지 그대로 둔다. 그래도 목표에 못 미치면 + 사람에게 보고한다. +- **"근거를 진 문장은 못 뺀다" vs "승격하지 않은 관찰은 한 문장".** MINOR-4가 정확히 이 경우다 — + 다섯 숫자가 전부 근거인데 분량은 한 문장이어야 한다. 해소: **삭제가 아니라 강등**이다. + 수치는 Additional file로 옮겨 살리고 본문에는 결론 한 문장과 상호참조만 둔다. 이 충돌에서 + 삭제를 고르면 규칙 위반이다. + +## 산출 (셋 다 있어야 완료) +1. **claim-evidence map** — `manuscript/CLAIM-EVIDENCE-MAP-.md`. **줄이기 전에 먼저 만든다.** + + | claim | 등급 | 한정어(범위·집단·비교·시점) | 근거파일 | 본문 위치 | 감축 후 한정어 보존 | + |---|---|---|---|---|---| + | α는 재현되고 lag는 안 된다 | headline | cross-method, HSPC n=102 | `concordance.md` | Results §1 | O | + + 머릿속으로만 대응시키지 않는다. 파일로 남겨야 감축 뒤에 한정어가 살아 있는지 한 줄씩 + 대조할 수 있고, 심사자 응답 때 근거가 된다. 마지막 열이 하나라도 X면 감축은 실패다. +2. 줄인 원고 — `manuscript/draft_v2.md` + `manuscript/draft_v2_ko.md` +3. **감축 대장** — `manuscript/CONDENSE-LEDGER-.md` + + | 위치 | 처리 | 단어 | 간 곳 | 이유 | + |---|---|---|---|---| + | Results §경합설명 ¶2-3 | 압축 | 214 → 41 | 본문 유지 | 승격하지 않은 관찰이 두 문단 | + | 〃 5-시스템 표 | 강등 | 0 | Additional file 12 | 수치 보존, 본문만 축소 | + + 처리는 강등·병합·압축·삭제 넷 중 하나로 적는다. 대장 없이 줄인 원고만 내면 미완이다. + 되돌릴 수 없고, 심사자 응답 때 "왜 뺐는가"에 답할 수 없다. + +## 보고 +줄이기 **전에** 계획을 먼저 낸다. 섹션별 현재 분량, 목표, 어디서 얼마를 뺄지, 강등 후보 목록. +승인 없이 바로 자르지 않는다. 계획 단계에서 목표가 무리라고 판단되면 그것도 보고 대상이다. diff --git a/CLAIMS.yaml b/CLAIMS.yaml new file mode 100644 index 0000000..c6eb20c --- /dev/null +++ b/CLAIMS.yaml @@ -0,0 +1,131 @@ +# CLAIMS.yaml — claim provenance ledger (BIOP01-69) +# --------------------------------------------------------------------------- +# 왜: "숫자는 결과 파일에서만" 규칙(package_validation)만으로는 다음 4가지를 +# 못 막는다. +# (1) headline claim ↔ 근거 파일의 연결이 문서화되지 않음 +# (2) 본문이 근거보다 세게 주장(과장) +# (3) 결과가 바뀐 뒤에도 남아 있는 낡은 문장 +# (4) reviewer 반영으로 claim 강도가 바뀌는 것 +# +# 무엇: 각 headline claim 을 원문 근거·검증 스크립트·한계·원고 위치와 함께 +# 한 곳에 등록한다. claim_defensibility 게이트와 package_validation 이 +# 이 ledger 를 참조해, 등록된 claim 만 원고에 남고 강도가 근거를 넘지 +# 않는지 대조한다. +# +# 계층: project profile 계층의 산출물이다(도메인 claim). core harness 는 +# 이 파일의 "스키마"만 안다. → docs/HARNESS-LAYERS.md +# +# 필드: +# id : C1, C2 … 안정 식별자(원고·리뷰에서 참조) +# text : claim 한 문장. 원고 표현과 같은 강도로 적는다 +# status : supported | provisional | withdrawn | hypothesis_only +# claim_level : 주장 강도. 원고 claim_level 정책과 일치해야 한다 +# evidence : 근거 결과 파일(경로). 여기 없는 숫자는 원고 금지 +# validation : 이 claim 을 재계산하는 결정론적 스크립트(게이트) +# limitations : 이 claim 을 세게 못 쓰게 막는 한정. 원문 표현 보존 +# manuscript_locations : 이 claim 이 등장하는 원고 위치(abstract/results/…) +# =========================================================================== + +schema_version: 1 +project: biop01 +findings_source: pipeline/hspc-velocity-benchmark/results/FINDINGS.md # canonical 종합본 +updated: 2026-08-04 + +claims: + - id: C1 + text: >- + chromatin→transcription lag 은 gene 수준에서 method-robust 한 양이 아니다 + (크기·방향 모두 method 간 일치도가 낮다). + status: supported + claim_level: primary_negative + evidence: + - pipeline/hspc-velocity-benchmark/results/clean_concordance_gate.md # CRAK-비의존 clean headline + - pipeline/hspc-velocity-benchmark/results/concordance.md + validation: + - "pipeline/hspc-velocity-benchmark/scripts/p3_concordance.py" + key_numbers: + magnitude_concordance: "|rho|<=0.08 (mv×moflow -0.04, mv×mvvae -0.01, moflow×mvvae +0.08)" + sign_agreement: "54.6% ~= chance (방향 미정 lag=0 76개 제외 기준)" + limitations: + - "permutation-FDR agreement-set 0/598 은 부호 가변 method 3개(=CRAK 포함)에서만 정의 → 대표 결과에서 제외, CRAK 민감도 분석(보조)으로만." + - "sign-agreement 수치는 lag=0(방향 미정) 76개 제외 규약에 의존(미제외 np.sign 규약이면 48%)." + manuscript_locations: [abstract, results, discussion] + + - id: C2 + text: >- + lag 과 달리 (a) 전사율 alpha, (b) 집단 수준 방향 균형, (c) canonical priming + marker 방향 — 이 셋만 method 간 robust 하다. + status: supported + claim_level: primary_positive + evidence: + - pipeline/hspc-velocity-benchmark/results/clean_concordance_gate.md + - pipeline/hspc-velocity-benchmark/results/concordance.md + key_numbers: + alpha_concordance: "method 간 rho=0.88" + population_direction: "~50/50 (두 method 수렴)" + limitations: + - "robust 한 것은 alpha·집단방향·priming marker 방향에 한정. gene별 lag 값 자체는 아니다." + manuscript_locations: [abstract, results] + + - id: C3 + text: >- + 음성대조(scrambled-chromatin)는 MultiVelo 의 lag 가 chromatin 신호가 아니라 + 모델 구조에서 나옴을 입증했다. + status: supported + claim_level: supporting + evidence: + - pipeline/hspc-velocity-benchmark/results/scrambled_null.md + validation: + - "pipeline/hspc-velocity-benchmark/scripts/p3_scrambled_null.py" + limitations: + - "한 method(MultiVelo)에 대한 구조 기인 입증. 다른 method로의 일반화는 별도 근거로." + manuscript_locations: [results] + + - id: C4 + text: >- + 'alpha > lag' 식별성 순서는 다섯 외부 데이터셋에서 보존되며, 다섯 번째 + (mouse gastrulation)는 fit 도착 전 봉인한 6개 예측을 사후구제 없이 6/0 통과했다. + status: supported + claim_level: primary_generalization + evidence: + - pipeline/hspc-velocity-benchmark/results/prereg_gse205117_scorecard.md # 사전등록 6/0 + - pipeline/hspc-velocity-benchmark/results/concordance_human_brain.md + - pipeline/hspc-velocity-benchmark/results/concordance_e18_mouse_brain.md + - pipeline/hspc-velocity-benchmark/results/concordance_GSE194122_bmmc.md + - pipeline/hspc-velocity-benchmark/results/concordance_macrophage.md + validation: + - "pipeline/hspc-velocity-benchmark/scripts/p3_crossdataset_concordance.py" + key_numbers: + alpha_monotone: "macrophage +0.643 > BMMC +0.55 > human_brain +0.475 > gastrulation +0.415 > E18 +0.32" + lag_signal: "어디서도 무신호 (+0.03~+0.19)" + limitations: + - "cross-dataset alpha 는 조직이 멀수록 단조 감소 — 보존되는 것은 'alpha>lag 순서'이지 alpha 절대값이 아니다." + manuscript_locations: [results, discussion] + + - id: C5 + text: >- + lag 이 method 간 재현되지 않는 것은 잡음이 아니라 MultiVelo 목적함수가 lag 을 + 데이터로 잘 결정하지 못하기 때문이다(관찰이 메커니즘으로 설명됨). + status: supported + claim_level: mechanism + evidence: + - pipeline/hspc-velocity-benchmark/results/profile_likelihood_identifiability.md # §8 + key_numbers: + alpha_vs_lag_sensitivity: "유전자별 alpha쪽 민감도가 lag쪽보다 중앙값 3.53x" + genes_alpha_more_sensitive: "94.57%" + limitations: + - "MultiVelo 목적함수에 대한 실질(practical) 비식별성. 완전(structural) 비식별성으로 과장 금지." + manuscript_locations: [results, discussion] + + - id: C6 + text: >- + 따라서 drug-timing 모델은 lag 을 단일 method 값으로 쓰면 안 되고 method + 불확실성을 명시적으로 반영해야 한다. + status: provisional + claim_level: downstream_implication + evidence: + - pipeline/hspc-velocity-benchmark/results/lag_model.md # prototype + - pipeline/hspc-velocity-benchmark/results/lag_model_atac.md + limitations: + - "P5 baseline→timing 모델은 prototype(held-out lineage, Mc proxy). drug perturbation arm 은 데이터 대기." + manuscript_locations: [discussion] diff --git a/CLAUDE.md b/CLAUDE.md index 630206f..4573350 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -63,7 +63,7 @@ SKILL(지침)을 실제로 돌리는 코드: ## Agent routing & artifact contract (논문 생산 하네스) -> 논문 집필·발표 단계용. 재사용 스캐폴드(Designed by Ka-Kyung Kim, CC BY 4.0) 설치본. 전체 랩 지도·멤버 JD = **`docs/HARNESS.md`**. 도메인 분석 슬롯 = **`hspc-velocity-analyst`**(팀이 채운 유일한 슬롯). 이 브랜치(`kkkim-pipeline`)에 project-scope로 설치. +> 논문 집필·발표 단계용. 재사용 스캐폴드(Designed by Ka-Kyung Kim, CC BY 4.0) 설치본. 전체 랩 지도·멤버 JD = **`docs/HARNESS.md`**. 도메인 분석 슬롯 = **`hspc-velocity-analyst`**(project profile 의 analyst 슬롯 — 이식 시 검증 게이트 스크립트·paper direction·CLAIMS 도 함께 교체해야 한다. 경계: **`docs/HARNESS-LAYERS.md`**, BIOP01-67). 이 브랜치(`kkkim-pipeline`)에 project-scope로 설치. ### 자연어 라우팅 요청에 agent 이름이 없어도 아래 표로 배정한다. 프로젝트 agent는 `.claude/agents/`. 그림 작업은 `manuscript-writer`가 `pipeline/hspc-velocity-benchmark/figures/figNN_*.py`를 실행해 소유. @@ -82,6 +82,7 @@ SKILL(지침)을 실제로 돌리는 코드: | "가설·실험설계·분석계획 점검·감사" | `research-methodologist` | | "제출 전 적대적 자체검토 / 그림 QA" | `paper-critic` | | "정식 venue 리뷰 시뮬레이션" | `venue-reviewer` (프로젝트 로컬, 선택) | +| "원고 분량 줄여줘 / 투고 word limit 맞춰줘" | `manuscript-condenser` (내용 확정 후, 선택) | | "발표자료/슬라이드/발제" | `presenter` | | "로고·아이콘·브랜드·그림 미감" | `design` | | "여러 단계를 어떤 순서로 엮을지 계획만" | `paper-orchestrator` (계획만; 실행은 메인 루프) | @@ -95,6 +96,7 @@ SKILL(지침)을 실제로 돌리는 코드: | 집필+그림 | manuscript-writer (그림=`figures/figNN_*.py`) | `pipeline/hspc-velocity-benchmark/manuscript/draft_v2.md` + `draft_v2_ko.md`(영/한 동시), `figures/*.png` | 검수·리뷰·발표 | | 검증 게이트 | (커밋/공개 전) | `p3_concordance.py` + `p3_crossdataset_concordance.py` + `p3_scrambled_null.py` 재계산 → FINDINGS.md 대조 | 사람 | | 리뷰 | paper-critic / venue-reviewer | `manuscript/REVIEW--.md` | 집필(수정) | +| 분량 감축 | manuscript-condenser | `manuscript/CLAIM-EVIDENCE-MAP-.md` + `CONDENSE-LEDGER-.md` (+ 줄인 `draft_v2.md`·`draft_v2_ko.md`) | 공개 게이트 | | 발표 | presenter | 슬라이드/발제 | 사람 | | 상태 핸드오프 | (전원) | `HANDOFF.md`, `TODO.md`, `SESSION-LOG.md` — **로컬 전용(.gitignore, 78a5a92)**. 커밋하지 않으며 새 clone에는 없다 | 다음 세션 | diff --git a/RUN_STATE.yaml b/RUN_STATE.yaml new file mode 100644 index 0000000..d4fabda --- /dev/null +++ b/RUN_STATE.yaml @@ -0,0 +1,74 @@ +# RUN_STATE.yaml — 논문 생산 하네스 실행 상태 (BIOP01-68) +# --------------------------------------------------------------------------- +# 목적: orchestrator(→ runner)를 "프롬프트 묶음"이 아니라 "상태를 가진 생산 +# 시스템"으로 만든다. 세션이 끊기거나 사람이 개입해도 다음에 무엇을 +# 해야 하는지를 대화 기록이 아니라 이 파일에서 판단한다. +# +# 계층: 이 파일은 harness 3계층(BIOP01-67) 중 "run instance" 계층이다. +# core harness / project profile 는 코드·문서로 고정, run instance 만 +# 실행마다 바뀐다. → docs/HARNESS-LAYERS.md +# +# 읽는 주체: paper_planner(계획) 는 읽기만, paper_runner(실행) 만 갱신한다 +# (BIOP01-70 권한 분리). runner 는 매 단계 시작 전 이 파일을 읽어 +# 이미 통과한 게이트를 건너뛰고, 실패·재시작 이력을 남긴다. +# +# 갱신 규칙: +# - 한 stage 를 끝내면 stages[].status 와 관련 gate 를 함께 갱신한다. +# - artifact 를 새로 쓰면 sha256 을 다시 계산해 넣는다(내용 변경 감지용). +# - source_commit 이 바뀌면(코드/데이터 수정) 어떤 게이트를 다시 통과해야 +# 하는지는 gates[].source_commit 과 현재 커밋을 비교해 판단한다: +# 현재 커밋 != 통과 당시 커밋이면 그 게이트는 stale → 재실행 대상. +# =========================================================================== + +schema_version: 1 + +# --- 실행 식별 --- +run_id: null # 예: "20260804-hspc-v2" — runner 가 새 실행 시작 시 채운다 +source_commit: null # 이 실행이 근거한 리포 커밋(HEAD). 게이트 stale 판정 기준 +source_data_pin: null # 데이터셋 버전/체크섬 핀(있으면). 재현성 기준 +started_at: null # ISO8601. runner 가 채운다 +updated_at: null # ISO8601. 갱신마다 runner 가 채운다 + +# --- 현재 위치 --- +# stage 는 아래 stages[] 의 name 중 하나. runner 는 이 값 다음 단계만 진행한다. +stage: not_started + +# --- 파이프라인 단계 --- +# status: pending | running | done | failed | skipped +# gate: 이 단계 완료가 통과시켜야 하는 게이트(gates[] 의 key). 없으면 null. +stages: + - { name: analysis, status: pending, gate: null } + - { name: result_validation, status: pending, gate: result_validation } # 자동 무결성(분석 직후) + - { name: writing, status: pending, gate: null } + - { name: figures, status: pending, gate: null } + - { name: review, status: pending, gate: null } # (선택) venue-reviewer. 게이트 앞에 온다 + - { name: package_validation, status: pending, gate: package_validation } # 자동 무결성(공개 직전) + - { name: claim_defensibility, status: pending, gate: claim_defensibility } # 과학 판단(사람) + - { name: release, status: pending, gate: release } # 거버넌스(사람) + +# --- 게이트 통과 기록 --- +# harness.yaml 의 gates 와 key 가 일치해야 한다(doctor 대조 대상). +# status: not_run | pass | fail | approved | rejected +# commit: 이 게이트를 통과시킨 시점의 source_commit. 현재 커밋과 다르면 stale. +# approved_by: 사람 승인 게이트(claim_defensibility/release)만. 자동 게이트는 null. +gates: + result_validation: { status: not_run, commit: null, approved_by: null } + package_validation: { status: not_run, commit: null, approved_by: null } + claim_defensibility: { status: not_run, commit: null, approved_by: null } # advisor 판단 필요 + release: { status: not_run, commit: null, approved_by: null } # 저자·소속·IP·corresponding·data_release + +# --- 산출물 상태 --- +# path 는 harness.yaml 의 artifacts 와 일치. sha256 은 내용 변경 감지용. +# runner 가 산출물을 쓸 때마다 sha256 을 재계산해 넣는다. null = 아직 없음. +artifacts: + findings: { path: pipeline/hspc-velocity-benchmark/results/FINDINGS.md, sha256: null } + manuscript: { path: pipeline/hspc-velocity-benchmark/manuscript/draft_v2.md, sha256: null } + manuscript_ko: { path: pipeline/hspc-velocity-benchmark/manuscript/draft_v2_ko.md, sha256: null } + paper_direction: { path: pipeline/hspc-velocity-benchmark/manuscript/PAPER_DIRECTION.md, sha256: null } + claims_ledger: { path: CLAIMS.yaml, sha256: null } # BIOP01-69 + +# --- 실패·재시작 이력 (append-only) --- +# runner 가 게이트 실패나 세션 재개마다 한 줄씩 append 한다. 지우지 않는다. +# 예: { at: "2026-08-04T10:00:00+09:00", event: gate_fail, gate: result_validation, +# detail: "p3_concordance diff !=0", commit: abc1234 } +history: [] diff --git a/docs/CONDENSING-PROMPTS.md b/docs/CONDENSING-PROMPTS.md new file mode 100644 index 0000000..9a77a13 --- /dev/null +++ b/docs/CONDENSING-PROMPTS.md @@ -0,0 +1,116 @@ +# 원고 간결화 프롬프트 모음 + +`manuscript-condenser` 에이전트에 주는 예시 프롬프트. 그대로 복사해 쓰거나 목표 수치만 +바꿔 쓴다. 순서대로 쓰는 것을 권한다 — 진단 없이 자르면 어디를 얼마나 잘라야 하는지 모른 채 +자르게 되고, 초록부터 손대면 가장 위험한 데를 가장 먼저 건드리는 셈이다. + +## 왜 프롬프트를 굳혀 두는가 +"줄여줘"라고만 하면 모델은 균등하게 깎는다. 그러면 근거 문장과 한계 문장이 헤드라인과 같은 +비율로 사라진다. 실제로 필요한 판단은 "어디가 등급에 비해 분량을 많이 쓰고 있는가"이고, +이건 물어봐야 나온다. `manuscript/REVIEW-GB-2026-07-19b.md` MINOR-4가 사람이 손으로 내렸던 +바로 그 판단이다. + +## 현재 분량 (2026-07-26 실측, `draft_v2.md` 13,313 단어) + +| 섹션 | 단어 | 비고 | +|---|---|---| +| Abstract | 422 | 헤드라인 문장 집중. 마지막에 손댄다 | +| Background | 826 | | +| **Results** | **5,857** | 소절 11개. 감축 여지가 여기 대부분 | +| Discussion | 1,607 | | +| Conclusions | 190 | | +| Methods | 1,767 | 투고 규정상 별도 취급인 경우가 많음 | +| Additional files | 331 | 강등의 목적지 | + +재실측: + +```bash +cd pipeline/hspc-velocity-benchmark/manuscript +python3 - <<'EOF' +import re, io +s = io.open("draft_v2.md", encoding="utf-8").read() +for p in re.split(r"\n(?=#{1,2} )", s): + print("%6d %s" % (len(p.split()), p.split("\n")[0][:60])) +EOF +``` + +--- + +## 1. 진단 — 등급과 분량이 어긋난 자리 찾기 + +> 아직 아무것도 고치지 말고 진단만 해줘. +> +> `pipeline/hspc-velocity-benchmark/manuscript/draft_v2.md`를 읽고, 각 Results 소절이 어떤 +> 등급의 주장을 하고 있는지 먼저 판정해줘. 등급은 headline / supporting / 승격하지 않은 관찰 +> (본문이 스스로 "해석할 수 없다", "이 설계로는 분리할 수 없다" 식으로 닫은 것) / 경합 설명 +> 넷 중 하나다. 판정 근거가 되는 원문 문장을 같이 인용해줘. +> +> 그 다음 등급별 분량을 재서, **등급에 비해 분량을 많이 쓰는 자리**를 많이 쓰는 순으로 나열해줘. +> `manuscript/REVIEW-GB-2026-07-19b.md`의 MINOR-4가 이 판단의 실사례다 — 참고하되 이미 지적된 +> 자리 말고 아직 안 잡힌 자리를 찾는 게 목적이다. +> +> 각 자리마다 강등·병합·압축·삭제 중 무엇이 맞는지와 예상 감축 단어수를 적어줘. 원고는 고치지 마. +> +> 마지막으로 `manuscript/CLAIM-EVIDENCE-MAP-<오늘날짜>.md`를 만들어줘. claim / 등급 / +> 한정어(범위·집단·비교대상·시점) / 근거파일 / 본문 위치 열로. 한정어 열은 원문 표현 +> 그대로 옮겨 적어라 — 감축 뒤에 이 열을 한 줄씩 대조할 거라서 요약하면 못 쓴다. + +목적은 목록을 얻는 것이지 줄이는 게 아니다. 이 목록을 사람이 보고 승인한 뒤 2·3으로 넘어간다. +claim-evidence map은 감축 **전에** 있어야 한다. 줄인 뒤에 만들면 이미 빠진 한정어를 원문으로 +착각하게 된다. + +## 2. 강등 — 본문에서 Additional file로 내리기 + +> 1번 진단에서 승인된 강등 후보만 처리해줘. 대상: {진단 결과에서 고른 항목들} +> +> 규칙: +> - 표·그림·부수 수치를 Additional file로 옮긴다. **수치는 한 글자도 바뀌지 않는다** — 옮기는 +> 것이지 다시 쓰는 게 아니다. +> - 본문에는 결론 문장과 Additional file 상호참조만 남긴다. +> - Additional file 번호는 기존 목록 뒤에 이어 붙이고, `manuscript/SUPPLEMENTARY.md`와 본문 +> `## Additional files` 목록을 함께 갱신한다. +> - `draft_v2.md`와 `draft_v2_ko.md`를 같은 턴에 고친다. +> - `manuscript/CONDENSE-LEDGER-<오늘날짜>.md`에 처리 내역을 표로 남긴다. +> +> 끝나면 `p3_concordance` · `p3_crossdataset_concordance` · `p3_scrambled_null`을 재실행해 +> 산출물 diff가 0인지, 본문 숫자가 결과파일과 여전히 일치하는지 확인해줘. + +강등은 손실이 없으므로 가장 먼저, 가장 많이 한다. 목표 분량의 대부분을 여기서 확보한다. + +## 3. 초록 — 목표 단어수 맞추기 + +> `draft_v2.md`의 Abstract를 현재 422단어에서 {목표}단어로 줄여줘. 다음을 지켜야 한다. +> +> - **수치는 전부 보존한다.** ρ·p·n·CI·부호 어느 것도 빼거나 반올림하지 않는다. +> - **헤드라인 주장의 범위 한정어를 빼지 않는다.** "이 방법으로는", "이 n에서는" 같은 한정이 +> 빠지면 초록이 본문보다 센 주장을 하게 된다. 분량 때문에 주장이 세지는 것은 실패다. +> - 약한 종결·군더더기 도입구부터 뺀다. `.claude/rules/writing-style.md`의 상투구 목록을 쓴다. +> - 한국어판도 같은 턴에 같은 비율로 줄인다. +> +> 줄인 뒤 원본과 나란히 놓고, **주장의 세기가 달라진 문장이 있는지** 스스로 점검해서 보고해줘. +> 하나라도 있으면 되돌리고 다른 데서 줄여. + +Abstract는 마지막에 손댄다. `SUBMISSION_PREP_PROGRESS.md` §2의 "Abstract는 손대지 않는다"는 +**주장 승격 금지**를 뜻하지 분량 동결이 아니지만, 헤드라인이 모여 있는 자리라 사람 확인을 +받고 진행한다. + +--- + +## 쓰면 안 되는 프롬프트 + +| 프롬프트 | 왜 안 되나 | +|---|---| +| "원고 30% 줄여줘" | 균등 감축. 근거 문장과 한계 문장이 헤드라인과 같은 비율로 사라진다 | +| "더 간결하게 다시 써줘" | 다시 쓰면 숫자가 재생성된다. `numbers_unchanged_through_review` 게이트에서 걸린다 | +| "덜 중요한 부분 정리해줘" | "덜 중요"의 기준이 모델에게 있다. 대개 불리한 사실이 먼저 잘린다 | +| "영문판 먼저 줄이고 한국어는 나중에" | EN/KO 파리티가 어긋난다. 같은 턴에 해야 한다 | + +## 완료 판정 +0. `CLAIM-EVIDENCE-MAP-.md`가 있고, 마지막 열(감축 후 한정어 보존)이 전부 O다 +1. `CONDENSE-LEDGER-.md`가 있고, 뺀 항목마다 처리·단어수·간 곳·이유가 적혀 있다 +2. 결정론 재계산 게이트 3종 통과, 산출물 diff 0 +3. 본문 수치와 결과파일이 일치 (`package_validation`의 `numbers_unchanged_through_review`) +4. EN/KO 파리티 유지 +5. 불리한 사실·한계 문장이 삭제된 건이 있다면 사람 승인이 대장에 기록돼 있다 + +대장 없이 줄인 원고만 있으면 미완이다. 되돌릴 수 없고 심사자 응답 때 근거가 없다. diff --git a/docs/HARNESS-LAYERS.md b/docs/HARNESS-LAYERS.md new file mode 100644 index 0000000..fd8e1ea --- /dev/null +++ b/docs/HARNESS-LAYERS.md @@ -0,0 +1,94 @@ +# 하네스 3계층 — core / project profile / run instance (BIOP01-67) + +> 이 문서는 "재사용 하네스"라는 주장을 실제 구조와 일치시킨다. 결론부터: +> **"도메인 슬롯 하나만 바꾸면 된다"는 과소진술이다.** core harness 는 재사용 +> 가능하되, 각 프로젝트는 domain agent·검증 명령·paper direction·산출물 경로· +> claim별 과학 정책을 담은 **project profile** 을 제공해야 한다. + +관련: `harness.yaml`(SSST manifest) · [HARNESS.md](HARNESS.md) · BIOP01-68(RUN_STATE.yaml) · BIOP01-69(CLAIMS.yaml). + +--- + +## 왜 이 문서가 필요한가 + +`harness.yaml` 의 `roles` 는 재사용 코어 멤버와 도메인 슬롯을 한 파일에 섞어 +둔다. 게이트도 마찬가지로 도메인 무관한 것(무결성 재계산)과 도메인 특화한 것 +(`p3_concordance.py` 같은 HSPC velocity 전용 재계산)이 섞여 있다. 이 때문에 +"도메인 슬롯 하나만 교체"라는 문장이 실제보다 이식을 쉬워 보이게 만든다. +새 분야로 옮기려면 아래 **project profile** 전체를 새로 써야 한다. + +--- + +## 세 계층 + +### 1. Core harness — 도메인 무관 (리포·문서로 고정, 프로젝트 간 재사용) + +바꾸지 않고 그대로 가져가는 부분: + +- **agent 호출 규약** — 자연어 요청 → 역할 라우팅, 전문 agent 실패를 general + 로 대체 금지(`execution.forbid_generic_fallback`). +- **artifact contract** — 각 단계 산출물을 파일로 남긴다는 계약. +- **stage transition** — analysis → result_validation → writing → figures → + review → package_validation → claim_defensibility → release 순서. +- **실패 정책** — 자동 게이트 실패 시 `stop_and_report`, 커밋·발행 금지. +- **run state** — RUN_STATE.yaml 스키마(BIOP01-68). 값은 run instance. +- **reviewer 격리 규칙** — venue-reviewer 는 검증 통과 원고만 입력받는다. +- **release gate** — 저자·소속·IP·corresponding·data_release 사람 승인. +- **self-check** — harness_doctor 정합성 게이트(BIOP01-66). + +코어 멤버(재사용 agent): literature_scout · novelty_strategist · +research_methodologist · manuscript_writer · presenter · paper_critic · +design · manuscript_condenser · paper_planner · venue_reviewer · +production_runner. + +### 2. Project profile — 프로젝트별 (프로젝트마다 새로 제공) + +`harness.yaml` 의 `project_profile:` 가 가리키는 도메인 특화 묶음. **여기가 +이식 비용의 대부분이다.** + +| 구성요소 | BIOP01(현재) 실체 | 새 프로젝트가 제공해야 하는 것 | +|---|---|---| +| domain analyst | `hspc-velocity-analyst` | 그 분야 분석 실행 agent | +| 검증 명령(result_validation) | `p3_concordance.py` · `p3_crossdataset_concordance.py` · `p3_scrambled_null.py` | headline 숫자를 결정론적으로 재계산하는 스크립트 | +| 데이터셋/결과 경로 | `pipeline/hspc-velocity-benchmark/{results,manuscript,figures}` | 그 프로젝트의 artifact 경로 | +| paper direction | `manuscript/PAPER_DIRECTION.md` | 연구 질문·서사·차별화 | +| claim별 과학 정책 | CLAIMS.yaml 의 limitations(예: "실질 비식별성을 완전 비식별성으로 과장 금지") | claim별 금지·한정 규칙 | +| 필수 그림/표 | figures 스크립트 | 그 논문의 필수 도표 | +| 평가 지표 | concordance ρ · sign-agreement · profile-likelihood 민감도 | 그 분야 지표 | + +### 3. Run instance — 실행마다 (RUN_STATE.yaml 한 파일) + +한 번의 생산 실행 상태. run_id · source_commit · stage · 게이트별 통과 기록 · +산출물 sha256 · 실패·재시작 이력. 코드가 아니라 상태다. → `RUN_STATE.yaml` +(BIOP01-68). runner 만 갱신, planner 는 읽기만(BIOP01-70). + +--- + +## 경계 판정 규칙 (어디에 넣을지) + +새 구성요소를 추가할 때: + +1. **분야가 바뀌어도 그대로 쓰는가?** → core harness. +2. **분야가 바뀌면 새로 써야 하는가?** → project profile. +3. **실행마다 값이 바뀌는가?** → run instance(RUN_STATE.yaml). + +`p3_*` 스크립트가 core 처럼 보이지만 HSPC velocity 지표를 재계산하므로 +project profile 이다. 반대로 "숫자는 결과 파일에서만"이라는 규칙은 분야와 +무관하므로 core 다. + +--- + +## project profile 스펙 (새 프로젝트 체크리스트) + +새 분야로 하네스를 이식할 때 아래를 모두 채워야 "이식 완료"다. 하나라도 +비면 harness_doctor 가 팬텀으로 잡거나(경로/역할) 게이트가 도메인 숫자를 +재계산하지 못한다. + +- [ ] `harness.yaml` 의 `project_profile:` 값을 새 프로젝트 키로 교체 +- [ ] domain analyst agent 1개(`roles.domain_analyst.path`) +- [ ] `gates.result_validation.commands` — headline 숫자 재계산 스크립트 +- [ ] `artifacts.*` — findings·manuscript·figures_dir·paper_direction 경로 +- [ ] `PAPER_DIRECTION.md` — 연구 질문·차별화 +- [ ] `CLAIMS.yaml` — headline claim + claim별 limitations(BIOP01-69) +- [ ] 필수 그림/표 생성 스크립트 +- [ ] harness_doctor PASS(팬텀 0)로 정합 확인 diff --git a/docs/HARNESS.md b/docs/HARNESS.md index 2c4f6d7..603d4a6 100644 --- a/docs/HARNESS.md +++ b/docs/HARNESS.md @@ -10,19 +10,25 @@ | # | 멤버 | 벤치 | 한 줄 역할 | 상태 | | --- | --- | --- | --- | --- | -| D | `spatialpatho-analyst` | 분석실 | **(도메인 슬롯)** WSI→embedding→phenotype→therapeutic 파이프라인 대표·eval·통계, result 파일 유지 | ✅ 채움(경로 배선) | -| 1 | `literature-scout` | 문헌·기획 | 선행연구·포지셔닝·related work | 재사용 | -| 2 | `novelty-strategist` | 문헌·기획 | 차별화 각도 + 가장 싼 입증 실험 | 재사용 | -| 3 | `research-methodologist` | 문헌·기획 | 가설·기여문·설계, 누수/통계 감사 | 재사용 | -| 4 | `manuscript-writer` | 집필실 | 프리프린트/저널/블로그 본문·초안 + 그림 연계 | ✅ 채움(집필-단계 FILL 대기) | -| 5 | `presenter` | 집필실 | 슬라이드·발표(청중 맞춤) | ✅ 채움(경로 FILL 대기) | -| 6 | `paper-critic` | 심사·QA | 제출 전 적대적 자체검토 + 그림 QA (기존 `agents/critic/` 체크리스트와 병행) | 재사용 | -| 7 | `paper-orchestrator` | 코디네이션 | 멀티-agent 작업 **계획**(실행은 PI) | 재사용 | -| 8 | `design` | 엔지니어링 | 로고·아이콘·브랜드·그림 미감 | 재사용 | -| 9 | `venue-reviewer` (**프로젝트 로컬**, 선택) | 심사·QA | 정식 venue 스타일 리뷰 문서. 검증 게이트 ① 통과 후에만 호출 | ✅ 채움 (BIOP02-103) | -| S | 그림 생성 (스크립트) | 엔지니어링 | 결과 파일에서 그림 생성·번호 정합 | FILL(스크립트 지정) | - -## 2. 관계도 (일이 흐르는 표준 경로) +| D | `hspc-velocity-analyst` | 분석실 | **(도메인 슬롯)** HSPC velocity-lag 파이프라인(P0–P5)·eval·통계·cross-dataset 실행/확장, result 파일 유지 | ✅ 채움 | +| 1 | `literature-scout` | 문헌·기획 | 선행연구 탐색·정직한 포지셔닝·related work | 재사용 | +| 2 | `novelty-strategist` | 문헌·기획 | 차별화 각도 + 가장 싼 입증 실험 제안 | 재사용 | +| 3 | `research-methodologist` | 문헌·기획 | 가설·기여문·실험설계, 누수/통계 감사 | 재사용 | +| 4 | `manuscript-writer` | 집필실 | 프리프린트/저널/블로그 본문·초안 + 그림 연계 | ✅ 채움(저자/소속 FILL 잔여) | +| 5 | `presenter` | 집필실 | 슬라이드·발표·발제(청중 맞춤) | ✅ 채움(경로) | +| 6 | `paper-critic` | 심사·QA | 제출 전 적대적 자체검토 + 그림 시각 QA | 재사용 | +| 7 | `paper-orchestrator` | 코디네이션 | 멀티-agent 작업 **계획** 수립(실행은 PI) | 재사용 | +| 8 | `design` | 엔지니어링 | 로고·아이콘·브랜드·그림 미감(SVG/PNG) | 재사용 | +| 9 | `venue-reviewer` (프로젝트 로컬, 선택) | 심사·QA | 정식 venue 스타일 공식 리뷰 문서 | 선택 | +| 10 | `manuscript-condenser` (선택) | 심사·QA | 확정 원고를 목표 분량으로 감축 + 감축 대장 | 선택 (BIOP01-74) | +| S | 그림 생성 (스크립트) | 엔지니어링 | `figures/figNN_*.py` — 결과 파일에서 그림 생성·번호 정합 | ✅ (스크립트) | + +> ⚠️ 그림 생성은 스크립트로 둔다. `manuscript-writer`가 `pipeline/hspc-velocity-benchmark/figures/figNN_*.py`(예: `fig01_p2_concordance.py`)를 실행해 만든다. 단순 재생성은 메인 루프가 직접 돌려도 된다(결정론적). + +--- + +## 2. 관계도 (Org / collaboration chart) + ``` research-methodologist / literature-scout / novelty-strategist (기획·근거) └─▶ spatialpatho-analyst ──▶ (분석·검증) @@ -44,9 +50,10 @@ research-methodologist / literature-scout / novelty-strategist (기 | --- | --- | | 멤버(agent) 정의 | ✅ 재사용 7 + 도메인 슬롯(spatialpatho-analyst) | | 자연어 라우팅 | ✅ CLAUDE.md 라우팅표 적용 | -| 산출물 계약 | ⚠️ 경로 일부 FILL — 집필-단계 산출물(FINDINGS/manuscript/figures) 미존재(분석 진행 중) | -| 입구(Orchestrator Skill) | ✅ 설치 | -| 검증 게이트 | ⚠️ FILL — 헤드라인 AUC/AUPRC 재계산 스크립트 팀 확정 필요 | -| 미결(팀·사람 확정) | 결과요약 파일·verify-gate·headline 주장·manuscript 경로·저자순서·소속·corresponding email·GPU 제공처 | +| 산출물 계약 | ✅ 경로 검증(results/, manuscript/, figures/) | +| 입구(Orchestrator **Skill**) | ✅ `.claude/skills/paper-production-orchestrator/SKILL.md` | +| 검증 게이트 | ✅ `p3_concordance.py` + `p3_crossdataset_concordance.py` + `p3_scrambled_null.py` 재계산 | +| 재사용 경계(3계층) | ✅ core / project profile / run instance 분리 — 타 분야 이식은 "슬롯 1개"가 아니라 project profile 전체(analyst·게이트 스크립트·paper direction·CLAIMS) 교체. → [`docs/HARNESS-LAYERS.md`](HARNESS-LAYERS.md) (BIOP01-67) | +| 개선 루프 | `SESSION-LOG.md`(세션별 회고 누적) | +| 미결(사람 확정) | 저자·소속·corresponding email·공개 정책 — manuscript-writer의 `` | -> **이유**: BioProject02는 분석 진행 단계(sprint 0/1). 연결 조직은 지금 설치했고, 집필-단계 FILL은 **첫 write-up-ready 결과가 나오면** 팀이 채운다. 과학적 주장·숫자는 지어내지 않는다(가정 금지). diff --git a/harness.yaml b/harness.yaml index 77d1c7d..4308e1d 100644 --- a/harness.yaml +++ b/harness.yaml @@ -2,7 +2,7 @@ # 문서(HARNESS.md/CLAUDE.md/SKILL.md)와 코드는 이 manifest를 따른다. # harness_doctor.py가 이 파일을 기준으로 실제 파일·문서 참조를 대조한다. harness_version: 1 -project_profile: biop01 # 도메인 특화분은 project profile로 분리 (BIOP01-67) +project_profile: biop01 # 도메인 특화 묶음(analyst·검증 게이트 스크립트·paper direction·CLAIMS). 스펙: docs/HARNESS-LAYERS.md (BIOP01-67) roles: # --- 도메인 슬롯 (project profile에서 교체) --- @@ -20,6 +20,7 @@ roles: presenter: { type: agent, path: .claude/agents/presenter.md, required: true, implemented: true } paper_critic: { type: agent, path: .claude/agents/paper-critic.md, required: true, implemented: true } design: { type: agent, path: .claude/agents/design.md, required: false, implemented: true } + manuscript_condenser: { type: agent, path: .claude/agents/manuscript-condenser.md, required: false, implemented: true } # 투고 직전 분량 감축. 예시 프롬프트는 docs/CONDENSING-PROMPTS.md paper_planner: { type: agent, path: .claude/agents/paper-orchestrator.md, required: true, implemented: true } # 개명 예정: paper-planner (BIOP01-70) # --- 미구현 (문서에는 참조되나 실체 없음) — BIOP01-64 --- venue_reviewer: @@ -65,8 +66,8 @@ artifacts: execution: require_repo_root: true # 상위 디렉터리 실행 금지 (BIOP01-65) forbid_generic_fallback: true # 전문 agent 실패를 general-purpose로 대체 금지 - run_state: RUN_STATE.yaml # BIOP01-68 (예정) - claim_ledger: CLAIMS.yaml # BIOP01-69 (예정) + run_state: RUN_STATE.yaml # BIOP01-68 — run instance 계층(runner만 갱신). 스키마 헤더는 파일 참조 + claim_ledger: CLAIMS.yaml # BIOP01-69 — claim provenance ledger(headline claim 등록) # 문서가 참조하지만 manifest에 없거나 implemented=false인 agent 이름은 doctor가 FAIL 처리한다. # 2026-07-26 2차 조사: README.md·AGENTS.md 가 스캔 대상에서 빠져 skills/ROUTES.md 팬텀을 놓쳤다 → 확대. diff --git a/harness_after/harness.yaml b/harness_after/harness.yaml index 77d1c7d..92a5a5d 100644 --- a/harness_after/harness.yaml +++ b/harness_after/harness.yaml @@ -20,6 +20,7 @@ roles: presenter: { type: agent, path: .claude/agents/presenter.md, required: true, implemented: true } paper_critic: { type: agent, path: .claude/agents/paper-critic.md, required: true, implemented: true } design: { type: agent, path: .claude/agents/design.md, required: false, implemented: true } + manuscript_condenser: { type: agent, path: .claude/agents/manuscript-condenser.md, required: false, implemented: true } # 투고 직전 분량 감축. 예시 프롬프트는 docs/CONDENSING-PROMPTS.md paper_planner: { type: agent, path: .claude/agents/paper-orchestrator.md, required: true, implemented: true } # 개명 예정: paper-planner (BIOP01-70) # --- 미구현 (문서에는 참조되나 실체 없음) — BIOP01-64 --- venue_reviewer: diff --git a/pipeline/hspc-velocity-benchmark/manuscript/CONDENSE-PLAN-2026-07-26.md b/pipeline/hspc-velocity-benchmark/manuscript/CONDENSE-PLAN-2026-07-26.md new file mode 100644 index 0000000..dd8524a --- /dev/null +++ b/pipeline/hspc-velocity-benchmark/manuscript/CONDENSE-PLAN-2026-07-26.md @@ -0,0 +1,161 @@ +# 원고 간결화 계획 — draft_v2.md (2026-07-26) + +`manuscript-condenser` 명세의 1단계(진단)를 실제 원고에 적용한 결과다. **아직 아무것도 고치지 +않았다.** 이 문서는 어디를 얼마나 줄일지에 대한 계획이며, 승인 후 강등 → 병합 → 압축 순으로 +실행한다. + +> **출처.** 패턴 진단은 codex CLI(ChatGPT 계열)에 Results/Discussion/Conclusions 구간 +> 7,654단어를 인라인으로 넘겨 받은 것이고, 각 지적은 원고에서 직접 대조해 확인했다(아래 +> "확인" 열). §2.7은 이 대조 과정에서 추가로 나온 것이다. 다른 모델 계열을 쓴 이유는 +> `.claude/agents/venue-reviewer.md`의 격리 규칙과 같다 — 같은 계열이 자기 글을 검수하면 +> 모의 검수다. + +## 1. 실측 기준선 + +전체 `draft_v2.md` 13,313단어. + +| 섹션 | 단어 | +|---|---| +| Abstract | 422 | +| Background | 826 | +| **Results** | **5,857** | +| Discussion | 1,607 | +| Conclusions | 190 | +| Methods | 1,767 | + +Results 소절별 (200단어 초과분, 괄호는 산문 속 ρ·p·CI·n 등장 횟수): + +| 단어 | 수치 | 소절 | +|---|---|---| +| **2,147** | 17 | Table 2. Velocity-output reliability decision map | +| **1,632** | 1 | The cell×gene velocity matrix does not reproduce across methods either | +| 776 | 15 | Only the transcription rate α … reproduces across methods | +| 626 | 7 | The dissociation is a property of the objective function | +| 597 | 9 | The fitted transcription rate α, but not γ, recovers an external rate | +| 502 | 19 | The α-robust, lag-fragile ordering replicates across five external systems | +| 375 | 9 | Table 1. Cross-method reproducibility | +| 300 | 8 | Chromatin does not drive the lag | +| 238 | 2 | The reliability map | +| 232 | 3 | A synthetic positive control | +| 229 | 5 | The lag is unpredictable from baseline features | + +재실측: + +```bash +cd pipeline/hspc-velocity-benchmark/manuscript +python3 - <<'EOF' +import re, io +s = io.open("draft_v2.md", encoding="utf-8").read() +for p in re.split(r"\n(?=### )", s)[1:]: + w = len(p.split()) + if w > 200: + print("%5d w / %2d nums %s" % (w, len(re.findall(r"[ρp]=|95% CI|n=", p)), p.split("\n")[0][4:70])) +EOF +``` + +## 2. 장황 패턴 + +감축량이 큰 순서다. "확인" 열은 원고에서 실제로 대조한 결과다. + +### 2.1 수정 이력·감사 로그의 본문화 — 800~1,200단어 +- 위치: `The cell×gene velocity matrix …` L117, L119 +- 확인: **사실.** "Our first version of this second comparison was not like-for-like, and we correct + it here …", "Against the archived fits the only departure is a single gene (*LRIG1*): a 4×10⁻¹⁶ + rounding difference …" 방법 수정 내역과 rerun null 상세가 Results 본문에 그대로 들어 있다. +- 왜: 신뢰성을 높이는 기록이지만 Results가 논증이 아니라 로그처럼 읽힌다. +- 처방: **강등**. 본문에는 결론을 바꾸는 문장만 남기고 상세는 Supplementary audit note로. + 단 "we therefore withdraw our earlier statement…"는 §3에 따라 본문 유지. + +### 2.2 산문 속 수치 덤핑 — 700~1,000단어 +- 위치: `The α-robust, lag-fragile ordering …`(502단어에 수치 19회), `Only the transcription + rate α …`(776단어에 15회), `The fitted transcription rate α …` +- 확인: **사실이고 측정된다.** 502단어 소절에 ρ·p·CI·n이 19번 나온다. Table 1·2와 중복이다. +- 왜: 독자가 확인할 방향은 하나인데 모든 값을 산문에 푼다. +- 처방: **압축**. 본문은 범위·패턴·예외만. 개별 수치는 Table 1/2 또는 Supplementary Table로. + +### 2.3 방어적 caveat 과적재 — 600~900단어 +- 위치: `The α-robust …`의 "Caveats (Table 1 footnotes). (i) The…", Discussion "Three further + limits are load-bearing…", `The cell×gene velocity matrix …`의 "Three limits keep the + statement small…" +- 확인: **사실.** 번호식 한계 열거가 세 군데에서 반복된다. +- 처방: **강등**. 주장 해석을 바꾸는 caveat만 본문에, 나머지는 표 footnote·Supplementary·Methods로. + +### 2.4 같은 판정의 3회 반복 — 500~800단어 +- 위치: L127(Results 말미 reliability map), L169(Discussion 첫 문단), L183(Conclusions) +- 확인: **사실이고 수치까지 겹친다.** 세 곳 모두 ρ=0.88, +0.163, |ρ|≤0.08, +0.24~+0.29를 + 다시 적는다. 판정문("α만 신뢰, lag·γ 불신뢰")이 거의 같은 문장으로 세 번 나온다. +- 처방: **병합**. Results 말미는 Table 2 참조 + 4~5문장, Discussion 첫 문단은 해석·한계 중심, + Conclusions는 수치 최소화. + +### 2.5 선행연구 positioning의 Results 침투 — 300~600단어 +- 위치: `Chromatin does not drive the lag …`의 "We promote this negative control to a main…", + `The dissociation is a property …`, Discussion의 "Positioning against prior work" +- 확인: **사실.** novelty·우선권 서술이 Results와 Discussion 양쪽에 있다. +- 처방: **강등**. Results는 "Fig. 2/5 shows…"만, 선행연구 대비는 Discussion 한 절로. + +### 2.6 부정 주장 과잉 한정 — 300~500단어 +- 위치: `Chromatin does not drive the lag …`, Discussion "It is a statement about the methods + and…", "Read together, these results bound our negative…" +- 확인: **사실.** "크로마틴 생물학을 부정하는 게 아니다"라는 안전장치가 여러 절에서 다른 말로 + 반복된다. +- 처방: **병합**. Discussion에 한 번만. Results에서는 "correlational, not causal" 정도의 짧은 태그. + +### 2.7 소절 하나가 Results의 28%를 쓴다 (대조 중 추가 발견) +- `The cell×gene velocity matrix does not reproduce across methods either` 혼자 **1,632단어**로 + Results 5,857단어의 28%다. 그런데 산문 속 수치는 1회뿐이다 — 즉 **수치가 아니라 서술이 + 분량을 쓰고 있다.** 2.1·2.3이 이 소절에 겹쳐 있다. +- 이 소절 하나를 처리하면 위 여섯 패턴의 감축량 상당 부분이 여기서 나온다. **1순위.** +- 참고로 `Table 2. Velocity-output reliability decision map`은 2,147단어인데 표 소절이 + 이 분량이면 표 주변 산문이 표를 다시 설명하고 있다는 뜻이다. 2순위. + +## 3. 절대 줄이면 안 되는 자리 + +분량이 많아 보이지만 근거·한정어·불리한 사실을 지고 있다. 여기를 건드리면 주장이 세진다. + +| 위치 | 원문 실마리 | 이유 | +|---|---|---| +| Only the transcription rate α … | "MultiVelo's apparent 100% chromatin-leads is…" | 구조적 sign bias 설명. 빼면 lag sign 비판이 과도해진다 | +| The fitted transcription rate α … | "The measured synthesis rate carries steady-state transcript…" | α 외부검증의 abundance confound를 진다 | +| The dissociation is a property … | "This is a relative (practical) non-identifiability…" | likelihood 주장이 "완전 비식별성"으로 과장되는 걸 막는다 | +| The cell×gene velocity matrix … | "We therefore withdraw our earlier statement that chromatin…" | 자기에게 불리한 정정. 투명성의 핵심 (REVIEW-GB MINOR-5) | +| Discussion | "we did not audit the low-dimensional embedding…" | velocity 전체를 부정한다는 오독을 막는 scope 제한 | + +## 4. 이 원고 전용 체크리스트 + +1. Results에서 이미 판정한 숫자를 Discussion·Conclusions에서 다시 열거하지 않는다. 방향과 해석만. +2. 산문에 ρ·CI·p·n이 세 개 이상 연속되면 표로 보내고 본문에는 패턴만 남긴다. +3. caveat가 주장을 바꾸지 않으면 footnote 또는 Supplementary Note로 강등한다. +4. "not causal", "not biology", "not trajectory inference" 방어문은 논점당 한 번만 둔다. +5. correction history와 rerun audit는 결론을 바꾸는 한 문장만 남기고 상세는 보조자료로. +6. 선행연구 대비 문장은 Results에서 빼고 `Positioning against prior work` 한 절로 모은다. +7. 소절 끝 "therefore" 문장이 다음 소절이나 Discussion에서 반복되면 하나만 남긴다. + +## 5. 실행 순서 + +`manuscript-condenser` 규칙대로 강등 → 병합 → 압축 순이며, 삭제는 쓰지 않는다. + +| 단계 | 대상 | 예상 | +|---|---|---| +| 0 | `CLAIM-EVIDENCE-MAP-.md` 작성 (감축 전 필수) | — | +| 1 | 2.1 강등 — 감사 로그를 Supplementary audit note로 | −800~1,200 | +| 2 | 2.3 강등 — caveat를 footnote·Supplementary로 | −600~900 | +| 3 | 2.5 강등 — positioning을 Discussion 한 절로 | −300~600 | +| 4 | 2.4 병합 — 판정 3회를 1회 + 참조로 | −500~800 | +| 5 | 2.6 병합 — 방어문 논점당 1회 | −300~500 | +| 6 | 2.2 압축 — 산문 수치를 표로 | −700~1,000 | + +합계 추정 −3,200~5,000단어. 7,654 → 2,700~4,500. **이 추정은 codex의 것이고 실측이 아니다.** +1단계를 실제로 해 본 뒤 나머지 추정을 다시 잡는다. + +각 단계 끝에 반드시: +- 결정론 재계산 게이트 3종 (`p3_concordance`, `p3_crossdataset_concordance`, `p3_scrambled_null`) diff 0 +- `CLAIM-EVIDENCE-MAP`의 한정어 보존 열 전부 O +- EN/KO 파리티 (heading 개수·수치 전항·참고문헌 개수) +- `CONDENSE-LEDGER-.md` 갱신 + +## 6. 미결 + +- **Abstract(422단어)는 이 계획에 없다.** 본문을 줄인 뒤 마지막에, 사람 확인을 받고 따로 한다. +- **Methods(1,767단어)도 제외**했다. 투고 규정상 별도 취급인 경우가 많아 목표 분량이 정해진 + 뒤에 판단한다. +- 목표 분량이 아직 없다. 투고처의 실제 제한을 확인한 뒤 위 추정과 맞춰야 한다.