Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
93 changes: 93 additions & 0 deletions .claude/agents/manuscript-condenser.md
Original file line number Diff line number Diff line change
@@ -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-<date>.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-<date>.md`

| 위치 | 처리 | 단어 | 간 곳 | 이유 |
|---|---|---|---|---|
| Results §경합설명 ¶2-3 | 압축 | 214 → 41 | 본문 유지 | 승격하지 않은 관찰이 두 문단 |
| 〃 5-시스템 표 | 강등 | 0 | Additional file 12 | 수치 보존, 본문만 축소 |

처리는 강등·병합·압축·삭제 넷 중 하나로 적는다. 대장 없이 줄인 원고만 내면 미완이다.
되돌릴 수 없고, 심사자 응답 때 "왜 뺐는가"에 답할 수 없다.

## 보고
줄이기 **전에** 계획을 먼저 낸다. 섹션별 현재 분량, 목표, 어디서 얼마를 뺄지, 강등 후보 목록.
승인 없이 바로 자르지 않는다. 계획 단계에서 목표가 무리라고 판단되면 그것도 보고 대상이다.
2 changes: 2 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ SKILL(지침)을 실제로 돌리는 코드:
| "가설·실험설계·분석계획 점검·감사" | `research-methodologist` |
| "제출 전 적대적 자체검토 / 그림 QA" | `paper-critic` |
| "정식 venue 리뷰 시뮬레이션" | `venue-reviewer` (프로젝트 로컬, 선택) |
| "원고 분량 줄여줘 / 투고 word limit 맞춰줘" | `manuscript-condenser` (내용 확정 후, 선택) |
| "발표자료/슬라이드/발제" | `presenter` |
| "로고·아이콘·브랜드·그림 미감" | `design` |
| "여러 단계를 어떤 순서로 엮을지 계획만" | `paper-orchestrator` (계획만; 실행은 메인 루프) |
Expand All @@ -87,6 +88,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-<venue>-<date>.md` | 집필(수정) |
| 분량 감축 | manuscript-condenser | `manuscript/CLAIM-EVIDENCE-MAP-<date>.md` + `CONDENSE-LEDGER-<date>.md` (+ 줄인 `draft_v2.md`·`draft_v2_ko.md`) | 공개 게이트 |
| 발표 | presenter | 슬라이드/발제 | 사람 |
| 상태 핸드오프 | (전원) | `HANDOFF.md`, `TODO.md`, `SESSION-LOG.md` — **로컬 전용(.gitignore, 78a5a92)**. 커밋하지 않으며 새 clone에는 없다 | 다음 세션 |

Expand Down
116 changes: 116 additions & 0 deletions docs/CONDENSING-PROMPTS.md
Original file line number Diff line number Diff line change
@@ -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-<date>.md`가 있고, 마지막 열(감축 후 한정어 보존)이 전부 O다
1. `CONDENSE-LEDGER-<date>.md`가 있고, 뺀 항목마다 처리·단어수·간 곳·이유가 적혀 있다
2. 결정론 재계산 게이트 3종 통과, 산출물 diff 0
3. 본문 수치와 결과파일이 일치 (`package_validation`의 `numbers_unchanged_through_review`)
4. EN/KO 파리티 유지
5. 불리한 사실·한계 문장이 삭제된 건이 있다면 사람 승인이 대장에 기록돼 있다

대장 없이 줄인 원고만 있으면 미완이다. 되돌릴 수 없고 심사자 응답 때 근거가 없다.
1 change: 1 addition & 0 deletions docs/HARNESS.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
| 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`)를 실행해 만든다. 단순 재생성은 메인 루프가 직접 돌려도 된다(결정론적).
Expand Down
1 change: 1 addition & 0 deletions harness.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
1 change: 1 addition & 0 deletions harness_after/harness.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
Loading
Loading