preprep · git:20260901.7ba7198 · 2026-09-01 · sha256 5eec2e3e2435c0db
preprep git:20260901.7ba7198A
Immutable. This exact content is served forever at /api/v1/blob/5eec2e3e2435c0db.
---
name: preprep
description: '한국식 발표대본과 장표에 특화된 준비 하네스. 레퍼런스를 먼저 묻고(공식 장표가이드 · 참고 덱), 대화로 주제·구성·전개를 세운 뒤, 기승전결 배치안을 «여러 개» 내고 사람이 고른다. 제작 후 바닥 검사 — 금지 인용이 어느 면에 남았나, 원고와 노트의 단위 참조가 갈렸나, 재생성이 사람 편집을 삼켰나, 장 사이 의존이 깨졌나, 조어가 낭독면 첫 등장에 풀이를 달았나, 장당 발화가 상한을 넘었나. Triggers "발표 준비", "발표 대본 만들어줘", "장표 점검해줘", "덱이랑 대본 어긋난 데 있나", "발표 자료 정합성", "리허설 대본 확인", "presentation prep".'
user-invocable: true
allowed-tools: ["Read", "Bash", "Grep", "Glob"]
model: sonnet
---
# preprep — 한국식 발표대본·장표 준비 하네스
**특화가 한국식인 이유는 장식이 아니다.** 낭독 대본의 존댓말 레지스터, 조어를 첫 등장에
풀어주는 관습, 어절 중간에서 끊기지 않는 줄바꿈, 영어 직역이 남긴 번역투 — 이것들은
한국어 발표에서만 하중을 지고, 영어권 디자인 렌즈가 구조적으로 못 잡는다.
## 🟥 왜 «별도 하네스»여야 하나 — 스킬 하나로는 안 되는 자리
운영자 정의(2026-08-29): *「발표자료를 짓고 대본도 동기화하고 관련된 기술문서도 싱크하여
**출하할 수 있게 하는** 능력이 하네스를 별도로 두어야 하는 이유의 정체다.」*
기존 스킬은 전부 **표면 하나**를 본다 — `deep-clarify` 는 요구를, `ko-tech-writer` 는 산문 한 편을,
`corpus-grounding-expander` 는 코퍼스를. 🟥 **셋이 같이 움직이는 것과 «출하 가능 상태»를
아무도 소유하지 않는다.** 그 자리가 이 하네스다.
```
장표 ── 대본 ── 기술문서 셋은 «같은 것의 세 면»이지 세 문서가 아니다
└──────┴──────┘
동기화 + 출하 가능 상태 ← 여기를 소유하는 것이 이 하네스의 정체
```
그래서 레인 중 셋(L2 unit-ref · L7 regen · L8 interslide)이 **표면 사이**를 본다. 한 면만 보는
도구로는 구조적으로 못 잡는 자리이고, 실측이 그것을 세 번 보여줬다 — 재생성이 발표자 노트
20곳을 삼켰는데 빌드는 성공했고, S8 을 빼자 S9 가 성립 불가가 됐는데 렌더를 한 장씩 다 봐도 **구조적으로** 안 잡혔고 운영자가 잡았으며, 도해에 구워진 텍스트는 XML 을 읽는 눈에 구조적으로 안 보였다.
발표는 **자산군**이다. 덱 하나가 아니라 덱 + 원고 + 발표자 노트 + 기술문서 + Q&A prep +
초록 + 리허설 대본이고, 그것들이 **서로 어긋나는 자리**에서 사고가 난다. 한 장씩 봐서는
안 잡힌다 — 눈은 표면 하나를 보고 결함은 표면 사이에 있다.
## 🟥 이 하네스는 «검사기»가 아니다 — 레인은 마지막에 오는 바닥이다
운영자 정의(2026-08-29): *「위치 틀어짐, 일관성 없음, 번역투 등의 문제가 없고 구성을 잘
만들어내면 되겠지. 기승전결에 맞게끔 구성도 도와주고. 결국 많이 물어봐서 기초를 세우고
그것 기반으로 만들어서 퇴고를 하는 식일 거야. … 결국에는 취향이 중요하니까.」*
그래서 **무게중심은 만들기 전과 만드는 중**에 있고, 레인 아홉은 산출물이 아니라 **floor** 다.
레인이 초록이라고 좋은 발표가 아니다. 레인이 빨가면 나갈 수 없을 뿐이다.
| 층 | 무엇 | 누가 정하나 |
|---|---|---|
| **기계가 알아서** | 번역투 · 위치 틀어짐 · **논지 안 맞음** · **내용 순서** | 🟥 **묻지 않고 최적화한다.** 여긴 사람 시간을 쓸 자리가 아니다 |
| **사람과 대화로** | 알맹이 — 아이콘 하나, 대본을 취향에 맞춰 고치기, 주제 · 구성 · 전개 · 디자인 | 🟥 **절대 피할 수 없다.** 자동으로 정하면 그게 틀린 것이다 |
운영자 정의(2026-08-29): *「사람의 손이 번역투나 위치 틀어짐, 논지 안 맞음, 내용 순서에 맞는지를
최적화 **알아서** 시켜주고, 그 안의 디테일한 알맹이들을 … 사람과의 소통으로 맞춰나가는 것.
**이건 절대 피할 수 없지.**」*
🟥 **두 층은 실패 방향이 반대다.** 위는 «물어보면 마이너스»다 — 번역투를 고칠까 묻는 것 자체가
사람 시간을 쓰는 것이고 기계가 그냥 해야 한다. 아래는 «안 물으면 마이너스»다 — 아이콘 하나,
대본 한 줄의 말맛은 물어봐야만 맞는다. **어느 쪽을 반대로 하면 하네스가 방해물이 된다.**
### «알아서 커버» 가 지금 어디까지 되나 — 정직하게
운영자가 든 예시로 그대로 대조한다. **일일이 지적 안 해도 커버되어야 하는 것들**이다.
| 운영자 예시 | 지금 | 무엇이 보나 |
|---|---|---|
| **위치가 어긋나 있다** | 🟢 덮인다 | `ooxml/gate.py` ⑥ 화면 밖 도형 ⚠️ 그 검사에 붙은 사고 수치(`26p · 1,854,400 EMU`)는 **`gate.py` 자신의 인라인 주석 말고 대조할 기록이 없다** — 거짓이라는 뜻이 아니라 독립 출처가 없다는 뜻이다 |
| **번역투** | 🟢 덮인다 | ⑤에서 `ko-tech-writer` Step 2 |
| **주어가 빠져 있다** | 🔴 **미구현** (판별자는 있다) | 🟥 «패턴만으로는 못 한다»고 적었던 것을 정정한다 — 판별자가 이미 실재한다: **주어 생략의 가부는 문장이 아니라 화면이 정한다.** 그 문장이 뜨는 화면에 참조 대상이 있으면 생략이 맞고, **참조 대상이 사라지는 장에서 복원**한다. 화면 텍스트는 이미 추출되므로 이건 judged 가 아니라 **measured 후보**다. 다만 복원/유지는 4등급으로 갈린다 (목적어=복원 · 주어+신정보=복원 · **주어+구정보=그대로 둔다** · SOV 재배열) — 전부 복원하면 번역투를 **새로 만든다**. 미구현 상태다 |
| **화면이 너무 비어 보인다** | 🔴 **미구축** | gate.py 는 «밖으로 나갔나»를 보지 «안이 비었나»를 안 본다. 🟥 **정정 2026-09-01 — 「pptx→PDF 가 끊긴다」는 거짓이었고, 그 오진이 이 항목을 막고 있었다.** known-pair: `soffice` 부재는 **참**(`which soffice` → not found · LibreOffice.app 없음) · `pdftoppm` 실재는 **참**(`/opt/homebrew/bin/pdftoppm`) — **그런데 PowerPoint AppleScript `save as PDF` 로 120장 덱이 실제로 12회 렌더됐다**(`/tmp/v11*.pdf` 12개, 최신본 120페이지 `%PDF-1.3`, 2026-09-01 실측). ⇒ 끊긴 것은 **「LibreOffice 경로」**지 **「pptx→PDF」**가 아니다. 🟥 **미구축 사유가 바뀐다**: 「렌더가 안 된다」(장애물 실재) → **「기준선을 아직 안 쟀다」**(장애물 없음). 두 상태는 다르고, 전자는 «못 한다»로 후자는 «안 했다»로 읽힌다. [[feedback_rule_misdescribes_its_own_machine]] 기준선 형태는 정해져 있다: **레퍼런스 덱을 실측해 장 유형별 화면 자수 기준선을 세우고 미달 장을 센다** — 값은 발표마다 다시 재야 한다 |
| **흐름이 매끄럽지 않다** | 🟡 **절반 덮인다** | L8 은 «지시 대상이 해소되나»를 볼 뿐 «논지가 서나»를 못 본다. 🟢 그 부분집합 하나는 이제 덮인다 — **L9 progression** 이 «선언된 단계가 화면에서 빠졌나»를 본다(압축에서 첫 칸이 떨어지는 실사고). ⚠️ «논지가 서나» 자체는 여전히 미해결이고, 되읊음 대조(리뷰어가 요약한 뜻이 저자 의도와 반대인가)는 **사람이 한다** |
🟥 **미구축 셋을 「advisory 라서 괜찮다」로 덮지 않는다.** 지금은 ④·⑤ 단계에서 **사람이** 하고
있고, 그건 운영자 정의상 **기계가 해야 할 일이 사람에게 남아 있다**는 뜻이다. 다음 개선의 과녁은
여기다 — 특히 「흐름」과 「주어」는 공통화될 수 있는 시행착오라 성공 정의에 직접 걸린다.
⚠️ **「논지 안 맞음 · 내용 순서」에는 아직 레인이 없다.** L8(장 사이 의존)이 가장 가깝지만 그것은
«지시 대상이 해소되나»를 볼 뿐 «논지가 서나»를 못 본다. 지금은 ④ 구성 단계에서 사람이 하고 있고,
**미구축이라고 여기 적어 둔다** — 없는 것을 있는 것처럼 두지 않는다.
## 이 하네스의 본체 — 그리고 성공을 무엇으로 재나
운영자 정의(2026-08-29, 이 하네스의 정본): *「**초기 영혼 심기를 질의응답을 통해서 같이 하고**,
하네스를 통해서 발표 자료 짓는 것 자체를 가속화시키고, 말미에는 페르소나나 스킬들로 커버 못 한
**취향의 영역을 사람과의 소통으로 깎아내는 것.** 그게 하네스의 본체다. 사람 손이 필연적으로 갈
수밖에 없는 하네스이지만, 적어도 우리가 겪어왔던 **구성과 형식, 그리기 등 공통화될 수 있는
시행착오만 단축시킬 수 있다면 그걸로 성공인 거다.」*
🟥 **성공 정의가 「사람 손을 없앤다」가 아니다.** 사람 손은 필연이고, 그것을 없애려는 하네스는
취향의 자리를 기계가 뺏어 결과를 나쁘게 만든다. 재는 것은 하나다 — **공통화될 수 있는
시행착오가 줄었나.** 구성 배치를 처음부터 더듬는 것, 형식을 매번 다시 정하는 것, 도해를
영점부터 그리는 것. 그것들만 줄면 성공이다.
🟥 **그리고 이 완료조건은 도달 가능하다.** 「다음에 이만한 발표가 오면 재자」 같은 조건은 영영
안 오므로 검증이 아니라 미루기가 된다(FH: 도달불가 Done-When 은 회피를 훈련시킨다).
반면 «이번에 겪은 시행착오 중 무엇이 공통화되나»는 **지금 이 자리에서 셀 수 있다.**
이것은 FH 교리의 이 도메인 사례다 — 하네스의 payoff 는 *「시행착오를 사람에게서 하네스로
옮겨, 사람 시간을 줄이고 주의를 비가역 지점으로 보내는 것」*. ①단계를 «영혼 심기»라 부르는
이유도 같다: FH 실측에서 **방향층(판단 회로)이 있으면 같은 토큰이 크게 효율적**이었다.
🟥 **다만 «정체성 선언»과 «심지(판단 회로)»는 다르고, 그 구분이 여기서 하중을 진다** — 선언만
떼어낸 12런에서는 **약한 모델이 오히려 올랐다**(Haiku 1.67 → 2.33). 원출처는 그 팔을
*"정체성 선언이 순손실"* 이라고 못박는다. 그러므로 ①이 심는 것은 «우리는 이런 하네스다» 라는
**선언문이 아니라**, 뒤 단계가 근거로 삼을 **판단의 축**이다 — 그래서 요구사항 수집이 아니라
**같이 세우는 것**이다.
⚠️ 초판은 이 자리에 «105런에서 영혼 선행이 결정적, 선언을 빼면 약한 모델 성능이 갈렸다» 고
적었다. **표본(105는 전체 합계, 해당 팔은 12런)과 방향이 둘 다 틀렸고**, 격리 그라운딩 감사가
잡았다.
## 제작 흐름 — 다섯 단계, 레인은 마지막
🟥 **새로 짓지 않는다.** 아래 네 단계는 FH 에 **이미 있는 능력**을 이 도메인 순서로 합주하는
것이다(no-reinvention). 각 단계는 **사람의 선택으로 끝난다** — 자동 결정이 있으면 그 단계는 틀렸다.
```
① 영혼 심기 /deep-clarify — 주제 · 내용 · 구성 · 전개 · 청중 · 시간 · «성공은 무엇인가».
🟥 «많이» 묻고 **같이 세운다**. 받아적기가 아니다 — 답이 스펙이 되고 그 스펙이
뒤 단계 전부의 근거다. 여기가 비면 뒤가 전부 기본값으로 채워진다
② 레퍼런스 「참고하려는 것이 있나」를 **먼저 묻는다**(ko-tech-writer §Step 1 과 같은 규율:
표본 없이 톤을 단정하지 않는다). 행사 공식 장표가이드 · 좋다고 본 남의 덱 ·
조직 템플릿. 있으면 /corpus-grounding-expander 로 그 실물을 근거로 세운다
③ 프런티어 ②가 비었거나 더 넓히고 싶을 때만. persona-innovator(Mode F) · /frontier-digest
로 세련된 방법을 찾아온다. 🟥 찾아온 것은 **후보**지 결정이 아니다
④ 구성 기승전결. 하네스는 배치안을 «몇 개» 내고 사람이 고른다.
🟥 하나만 내면 그건 제안이 아니라 결정이다
⑤ 제작·퇴고 마이크로매니징. 문체는 /ko-tech-writer 로 — 레지스터 · 실물 캘리브레이션 ·
번역투 제거 · 수치 게이트 · 지각 QA
─────────────────────────────────────────────────────────────────
바닥 `python3 preprep.py` — 아래 레인. 걸리면 ⑤ 로 되돌아간다
```
**②를 건너뛰지 마라.** 「레퍼런스 있나」를 안 묻고 만든 것은 취향이 아니라 **기본값**이다.
> 출처: 챔버 런 #14 EMIT(2026-08-20). 실사용 검증 = 2026-08-29, **여러 차례 리뷰를 반영해
> 운영자가 정본으로 확정한 덱**(`ifkakao26_slides_v1.0`)에 돌려 벼려졌다.
> 🟥 **이 하네스가 그 덱을 통과시킨 것이 아니다** — 이미 확정된 뒤에 스캔했고, 발표 자체는
> 2026-10-14 로 아직 하지 않았다. 「이견 없이 통과」는 운영자 구두 보고(2026-08-29)이고
> 기록으로 대조할 문서가 없다 — 반대로 그 덱에 대한 리뷰 지적은 최소 3회차가 기록에 있다. 「다표면 읽기」는 이 하네스의 **한 렌즈(L2)** 이지 전체 이름이 아니다.
## 쓰는 법
```bash
SKILL=plugins/fh-commons/skills/preprep # 이 스킬의 위치
cd "$ASSET_ROOT" # 발표 자산군의 루트
cp "$SKILL/surfaces.example.yaml" surfaces.yaml # 표면 목록은 사람이 적는다
python3 "$SKILL/preprep.py"
# exit 0 통과 · 1 발견 · 2 판정불가(계기오류/미측정 — PASS 아님)
```
🟥 **표면 목록은 코드가 아니라 `surfaces.yaml` 에 있다.** 챔버 런 실측: 목록을 코드에 박아서
같은 물건이 세 번 따로 지어졌다. 무엇을 표면으로 볼지는 발표마다 다르고, 그건 판단이다.
## 레인
| 레인 | 무엇을 재나 | 성격 |
|---|---|---|
| L1 canon | 인용금지·조건필수·**폐어**가 **전 표면**에 걸리나. USE 와 MENTION 을 **갈라서** 낸다 — 🟥 폐어를 «걷어냈다»고 적은 원장 자신이 그 낱말을 담으므로, 이 구분이 없으면 원장이 자기를 신고한다 | 차단 |
| L2 unit-ref | 표면 쌍의 단위 참조 정합(원고 ↔ 노트) | 차단 |
| L3 inventory | 선언된 표면이 실물로 있나 · 기계로 읽히나 | 차단 |
| L4 getput | 왕복 no-op 컨트롤 — 사람이 안 고쳤는데 왕복이 안 닫히면 그 차이는 **왕복기 손실**이다 | 차단 |
| L5 jargon | 선언된 조어가 **낭독면 첫 등장에 풀이**를 달았나 | 차단 |
| L6 pacing | 장당 발화 상한·평균·분포. 상한은 사람이 `surfaces.yaml` 에 적는다 | 차단 |
| L7 regen | **재생성이 사람 편집을 삼켰나** | 차단 |
| L8 interslide | 장 사이 의존이 깨졌나 (OK/BROKEN/**UNRESOLVED**) | 🟥 advisory |
| **L11 promise** | **앞에서 예고한 것이 뒤에서 상환되나** — 후보를 나열하고 «예고 N 회 vs 뒤에서 M 회»를 센다. 실사고: 「세 번」 예고에 상환 1건 | 🟥 advisory · **판정은 사람** |
| **L10 adjacent-dup** | **인접 장이 같은 문장을 다시 읽나** — 쪼갤 때 뒤 프레임에 원본을 통째로 남기면 앞 장에서 읽은 문장을 또 읽는다. 실측 117자 중 82자(70%) | 차단 (임계는 사람이 적는다. 미기재면 측정만) |
| **L9 progression** | **선언된 단계 중 하나가 화면에서 빠졌나** — 실사고: ①②③④ 중 ①이 화면에서 떨어져 리뷰어가 논지를 **정반대로** 읽었다. 개별 문장은 전부 옳았다 | 차단 (선언된 것만 본다) |
| **G ooxml** | pptx 구조 9종 — 관계 참조 무결성 · 죽은 Content_Types Override · **화면 밖 도형** · 열린 도형 채움 · 선 굵기 토큰 래칫 | 차단 (`python3 ooxml/gate.py <풀린 pptx 트리>`) |
🟥 **L8 이 advisory 인 이유**: 두 계기의 오탐을 **최저비용으로 무마하는 길이
「그 문장을 지우는 것」**이라, 종료코드에 태우면 원고를 나쁜 방향으로 미는 압력이 된다.
후보를 내고 판정은 사람이 한다. 오탐 다수가 정상이다.
## 문체는 레인이 아니다 — 레퍼런스와 스킬이 한다
초판에는 `ko-tech-writer` Step 2 를 레인으로 복제한 **L9** 가 있었다. **뺐다.** 이유가 둘이다.
🟥 **① 예측보다 레퍼런스다.** 패턴으로 «나쁜 문장을 미리 맞히는» 것보다 **참고할 실물을 묻고
받는 것**이 확실하다. 회고 검증을 세 문서쌍에 돌렸는데 **전부 판별 불가**였다 — 고편집 쌍은
소음(base 52%·43%)이 신호를 덮고, 저편집 쌍은 사건 자체가 없었다(base 1.6%, 짚힌 8줄 중 1건,
기대값 0.13). 그리고 이 급의 산출물은 다시 오지 않으므로 **앞으로도 측정 불가다.**
반면 레퍼런스는 물어보면 그냥 받는다.
🟥 **② 그것은 중복이었다.** L9 의 다섯 클래스는 `ko-tech-writer` Step 2·4-b 를 옮긴 것이고,
이 스킬은 ⑤에서 그 스킬을 부른다. 즉 **빼도 능력은 정본 자리에 그대로 있다** — 제거는 손실이
아니라 중복 해소이고, 이 하네스가 이원화에서 지키는 단일-소스 원칙과 같은 자리다.
⇒ **번역투·레지스터·수치 게이트·지각 QA 는 `ko-tech-writer` 로 간다.** 여기 레인으로 두지 마라.
## 갈라 적는 것 (합치면 계기가 거짓말한다)
- **USE ↔ MENTION** — 금지어를 «쓴 줄»과 «쓰지 말라고 적은 줄»은 다르다. 거르지 않고 두 부류로
낸다. 죽은 필터는 진짜를 죽인다. ⚠️ 이 구분은 **패턴 매칭으로는 못 가른다** — 제거된 L9 의
known-negative 픽스처 초판이 자기 헤더의 «언급»에 걸렸던 것이 그 실측이다. `ko-tech-writer`
로 넘길 때도 같은 한계가 따라가므로, 후보 목록을 사람이 볼 때 이 축을 먼저 갈라라.
- **부재 ↔ 0** — 선언된 표면이 없으면 UNMEASURED 다. Keynote 는 사람만 읽는 면이라 영구 UNMEASURED.
- **텍스트 레이어 ↔ 화면** — pptx 는 XML 만 본다. **이미지에 구워진 텍스트는 구조적으로 안 보인다.**
생성기를 `kind: figure_source` 표면으로 세우면 사각이 **좁아지지만 닫히지는 않는다**.
- **생성면 ↔ 사람 편집면** — 재생성은 사람 손질을 전량 덮어쓴다. 실측: 발표자 노트 **20곳**이
소리 없이 사라졌고 빌드는 성공했으며 원고↔빌드 대조는 «원고대로»였다. L7 의 자리다.
## Done When
| 조건 | check-class |
|---|---|
| `python3 preprep.py` 가 선언된 전 표면에 대해 돌고 종료코드가 0/1/2 중 하나로 확정된다 | mandatory-pass |
| **공통화된 시행착오가 줄었다** — 이번 제작에서 «지난번에도 겪었고 이번엔 안 겪은» 것을 이름으로 적을 수 있다(구성 배치 · 형식 결정 · 도해 영점 그리기). 0건이면 이 하네스는 이번에 값을 안 냈다 | judged — 적대 짝: 그 목록을 저자가 아닌 사람이 읽고 «그건 원래 안 겪는 것 아닌가»를 되묻는다 |
| **레퍼런스를 물었다** — 참고할 실물이 있나를 묻고, 있으면 그것을 근거로 세웠다. 없으면 «없다»고 기록했다(안 물은 것과 구분) | mandatory-pass |
| 단일 소스 드리프트 앵커가 통과한다 (`scripts/test_preprep_drift_anchor.sh`) | measured |
| 발견 목록을 사람이 판정했고, advisory 후보 중 **남긴 것에는 남긴 이유**가 적혔다 | judged — 적대 짝: 그 판정을 저자가 아닌 사람이 다시 읽는다(격리 그라운딩). 자기 판정으로 대체 금지 |
## 이 하네스가 못 하는 것
발표를 **잘 만들어 주지 않는다.** 어긋난 자리를 찾을 뿐이고, 무엇을 말할지·어떤 순서로
놓을지는 판단이다. 그리고 위 「갈라 적는 것」의 네 사각은 **좁아진 것이지 닫힌 게 아니다**.