Skip to content
Back to skills

Preprep

ASecurity

한국식 발표대본과 장표에 특화된 준비 하네스. 레퍼런스를 먼저 묻고(공식 장표가이드 · 참고 덱), 대화로 주제·구성·전개를 세운 뒤, 기승전결 배치안을 «여러 개» 내고 사람이 고른다. 제작 후 바닥 검사 — 금지 인용이 어느 면에 남았나, 원고와 노트의 단위 참조가 갈렸나, 재생성이 사람 편집을 삼켰나, 장 사이 의존이 깨졌나, 조어가 낭독면 첫 등장에 풀이를 달았나, 장당 발화가 상한을 넘었나. Triggers "발표 준비", "발표 대본 만들어줘", "장표 점검해줘", "덱이랑 대본 어긋난 데 있나", "발표 자료 정합성", "리허설 대본 확인", "presentation prep".

  • 16 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added September 19, 2026
ai-agentspythongobashgit

Security analysis

A100/100

Pro scans all 20 files and shows the line behind each finding

Scanned September 24, 2026

npx -y skills add chrono-meta/forge-harness --skill preprep --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Preprep?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Preprep
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/chrono-meta-preprep/badge)](https://www.skillsdirectory.com/skills/chrono-meta-preprep)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
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` ⑥ 화면 밖 도형 · P1/P3 (넘길 때 튐 · 인접 어긋남) · **P4 algn/mirror**(같은 줄인데 정렬이 갈림 · 좌우 대칭인데 크기가 갈림) ⚠️ 그 검사에 붙은 사고 수치(`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]] 기준선 형태는 정해져 있다: **레퍼런스 덱을 실측해 장 유형별 화면 자수 기준선을 세우고 미달 장을 센다** — 값은 발표마다 다시 재야 한다. 🟥 **정정 2026-09-04 — 기준선을 실제로 쟀다, 다만 반대편(과밀)이다.** 121장 한국어 덱 실측: 화면 자수 중앙 118 · 평균 133 · P90 207 · 최대 808. 읽는 부담(신규 글자 ÷ 발화 초) 중앙 10.0 · P90 16.9(§레인 R4·R5). ⚠️ 값은 발표마다 다시 재야 한다 — 임계를 코드에 안 박고 **그 덱 자기 분포**에서 뽑는 이유가 이것이다. 그리고 이건 게이트가 아니라 **순위표**다 — 정의상 항상 약 10%가 뜬다, 「후보 0건」을 목표로 삼으면 오독이다(§정직한 한계 참조). **「비어 보인다」쪽(하한)은 여전히 기준선이 없다** — 잰 것은 과밀(상한) 뿐이라 이 행은 아직 🔴 미구축으로 남는다 |
| **원고와 화면이 갈린다** | 🟢 **덮인다** (2026-09-10 신설) | **L14 screen-parity**. 그 전까지는 이 하네스의 정체(「표면 사이」)에서 **가장 큰 쌍이 비어 있었다** |
| **흐름이 매끄럽지 않다** | 🟡 **절반 덮인다** | 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.
              🟥 **도해를 건드렸으면 렌더한다** — 연결선 잔해 · 도형 종류 이탈 · 빌드 프레임
              텍스트 소실 · 부연-본문 밝기 경쟁 넷 다 렌더 없이는 구조적으로 안 보였다(§방법론 ⓒ).
              🟥 **장을 뺄 때는 뒤 장의 전제인지 먼저 본다** — 지운 장이 다음 장 부제의
              접속사(「그러나」 류)가 받는 말이었던 실사고가 있다(§방법론 ⓔ)
              🔷 **도해는 타입 있는 JSON 에서 굽는다**(2026-09-05 신설, 5단계 안의 갈래이지 6단계가
              아니다). `python3 diagram_from_json.py <spec.json> --out <png> --css <덱 토큰.css>
              --no-legend` — 외부 렌더러 archify(MIT, 로컬 설치·소스 복사 0)의 showcase validate 를
              **못 통과하면 굽기를 거부**하고, 통과하면 deliver → 뷰어 크롬 없는 SVG 단독 PNG(≥3840px)
              → 굽기 영수증. 덱 자기 규약(배경·강조색·폰트)은 archify CSS 변수 override 로 꽂는다 —
              archify 색을 덱에 가져오는 게 아니라 **덱 규약을 렌더러에 꽂는다**(§방법론 ⓓ). 가이드 뷰
              인터랙션은 장표에 없으므로 `--focus id,…` 빌드 프레임으로 번역한다(§B3 좌표 고정).
              🟥 archify 는 글자 크기 토큰이 없어 **viewBox 폭이 글자 pt 를 정한다**(720 → 라벨 29pt·
              부제 19pt / 1137 → 12pt) — 그래서 폭 상한이 굽기 거부 조건이다. 대응표·차이·취향 판정
              항목: `tracks-meta/dispatch/2026-09-05_archify-preprep/DESIGN_TOKENS.md`(운영자 로컬)
─────────────────────────────────────────────────────────────────
바닥         `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-preprep/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** | **선언된 단계 중 하나가 화면에서 빠졌나** — 실사고: ①②③④ 중 ①이 화면에서 떨어져 리뷰어가 논지를 **정반대로** 읽었다. 개별 문장은 전부 옳았다 | 차단 (선언된 것만 본다) |
| **L12 diagram** | **타입 JSON 도해가 «지금 JSON» 에서 validate 를 거쳐 구워졌나** — `kind: diagram_source` 표면의 굽기 영수증(`*.receipt.json`)으로 JSON 지문 일치 · showcase validate ok · PNG 실제 폭(IHDR 직독) ≥ 3840 · viewBox 폭 ≤ 720 · 여백. 실사고 후보 셋: JSON 고치고 PNG 안 구움 · 미검증 JSON 손렌더 · 픽셀은 충분한데 글자 12pt | 차단 (선언된 표면만 · 영수증 없는 손그림은 **UNMEASURED**, 0 아님) |
| **L14 screen-parity** | **원고의 화면 블록(🖥)과 덱 화면이 갈렸나** — `surfaces.yaml` 이 원고를 「화면 문자열의 정본」이라 선언해 놓고 **그 선언을 집행하는 레인이 없었다**. 실사고: 운영자가 PowerPoint 에서 7곳을 직접 고쳤는데 `preprep` 이 `rc=0` 을 냈다 — 덱은 새 문장, 원고는 옛 문장을 든 채로 통과 | 🟥 advisory · known-pair(덱 한 벌 · 원고 두 벌) — 🟥 **「짝 없는 줄」과 「문구만 다른 줄」을 갈라서 낸다**. 이 덱 실측 53/38건이라 «후보 0» 이 목표가 아니다 |
| **L15 font** | **서체가 그 덱의 배포 템플릿이 정한 집합을 벗어났나** — `slides/` 안에서 «명시된» 서체만 판정하고, `slideLayouts`·`slideMasters`·`theme` 은 **템플릿과 해시가 같으면 상속분으로 보고 판정하지 않는다**. `fonts.allow` 미선언이면 **템플릿 자신의 `slides/` 분포에서 허용 집합을 유도**한다. 테마가 이탈이면 `+mn-*` 참조 전부가 거기서 오므로 **테마 한 곳만** 지적한다 | 차단 (🟥 `fonts.template` 미선언 = 상속과 저자 이탈을 **구분 불가** → 그 사실을 노트에 적는다 · 서체 토큰 0 = **UNMEASURED**, 「이탈 없음」 아님 · `fonts.intended` 로 선언한 것은 «면제됨»으로 출력 — 면제도 **가족 단위**다 · 🟥 렌더되지 않는 것은 안 센다: 빈 런 · `endParaRPr`(빈 문단 끝서식) · 테마의 `<a:font script=…>` 폴백) |
| **L15-b font-embed** | **쓰는 서체를 덱이 «들고 다니나»** — `presentation.xml` 의 `embeddedFont` 집합이 `slides/` 가 부르는 서체 집합(`a:latin`·`a:ea`, 테마 참조는 풀어서)을 덮나. 🟥 L15 와 **다른 실패**를 잡는다: L15 는 «템플릿 집합을 벗어났나», 여기는 «발표장 PC에 설치돼 있다고 가정하고 있나». 실사고 2026-09-21: 한 덱이 **안 쓰는 서체를 임베드하고 실제로 쓰는 둘(런 3,724회)을 안 넣은 채** 제출됐다 | 차단 (🟥 **임베드 0 = UNMEASURED 아니라 FAIL** — 이 축은 부재가 곧 결함이다. 면제는 `fonts.embed_exempt`(+`why`) · 임베드했지만 미사용은 노트로만 · `a:sym`/`a:cs` 전용 지정과 못 푼 테마 참조는 **UNMEASURED**) |
| **G ooxml** | pptx 구조 9종 — 관계 참조 무결성 · 죽은 Content_Types Override · **화면 밖 도형** · 열린 도형 채움 · 선 굵기 토큰 래칫 | 차단 (`python3 ooxml/gate.py <풀린 pptx 트리>`) |
| **R1 orphan-connective** | 선두 줄이 «그러나/그래서»로 뒤집는데 그 문장의 주어가 **직전 장 어디에도 없다** | 🟥 advisory · **실물 known-positive**(실제 백업에서 뜬 결함) |
| **R2 enum-dropped** | 앞 장이 ①②③ 으로 센 것을, 이 장이 «이 셋 중…» 이라 부르며 **번호 없이** 재편한다 — 1:1 대응이 안 보인다 | 🟥 advisory · **실물 known-positive** |
| **R3 lead-term-unbacked** | 선두 줄이 **강조색으로 선언한 낱말**이 그 장 다른 어디에도 없다 — 화면이 자기 부제를 못 받친다 | 🟥 advisory · **합성 뮤턴트 known-pair**(자연 발생본이 파일로 안 남아 실물 2장을 줄여 만든 픽스처로만 계량됨 — R1·R2·P1·P3 과 증거 등급이 다르다) |
| **R4 screen-heavy** | 화면 자수가 **이 덱 자기 분포**(P90)의 상위권 — 한 장에 너무 많이 얹었다 | 🟥 advisory · **순위표**(게이트가 아니다 — 늘 자기 덱의 상위 약 10%가 뜬다, 「후보 0」이 목표가 아니다) |
| **R5 read-load** | **직전 장 대비 새로 뜬 글자** ÷ 발화 초 — 화면은 늘었는데 말은 짧다. 무대 지시([간지]/[진행])는 발화로 안 센다 | 🟥 advisory · **순위표**(R4 와 같은 성질) |
| **P1 build-jitter** | 같은 이름 도형이 **연속한 두 장**에서 조금 다른 자리에 있다 — 넘길 때 튄다 | 🟥 advisory · **실물 known-positive** — 결박 내역을 **셋으로 갈라 낸다**(이름+글자 / 이름만(글자 없는 도형) / 글자 불일치=제외). 🟥 앞 둘이 다 0 이면 「튐 없음」이 아니라 **UNMEASURED**. 의도된 연출은 `geometry.intended` 로 **선언**해서 면제하고, 면제된 것은 «면제됨»으로 출력된다. 🟥 **뒤집힘(flipH/flipV)은 임계와 무관하게 낸다** — 상자가 한 EMU도 안 움직여도 화면에서는 화살표가 반대를 가리킨다(2026-09-10 실사고) |
| **P3 adjacency** | 한 도형의 **오른쪽 끝**과 다른 도형의 **왼쪽 끝**이 맞닿으려다 어긋났다 | 🟥 advisory · **실물 known-positive** · 🟥 절대 목록으로 읽지 마라(기저 오탐 76건 실측) — `surfaces.yaml` 의 `geometry.baseline`(이전 판 pptx)을 주면 **편집 전/후 델타**로 돈다. **P2(near-miss, 같은 종류 모서리만 대조)는 미채택** — 구조적으로 실제 결함(다른 종류 모서리의 인접)을 못 잡아서다 |
| **P4 attr-consistency** | **덱 자신의 분포가 판정 기준이다** — 같은 역할끼리 묶어 «혼자 다른 것»을 낸다. 축 넷: `dash`(같은 점선인데 굵기가 갈림) · `algn`(같은 줄인데 정렬이 갈림) · `mirror`(좌우 대칭인데 크기가 갈림) · `echo`(**장을 가로질러** — 같은 문장이 매번 다른 크기·자리) | 🟥 advisory · known-pair 8팔(축 넷 × 양팔, 컨트롤 살아 있음) — 🟥 이 레인은 «다르다»만 본다, «틀렸다»는 사람이 판정한다. 의도는 `attr_consistency.intended` 로 선언 |

🟥 **L15 의 본체는 검출이 아니라 «상속과 저작의 분리»다.** 순진하게 서체 이름만 세면 이 코퍼스에서
**오탐 85건**이 나온다 — 그 85건은 전부 `slideMasters/` 안에 있고, **배포 템플릿의 마스터에도 정확히
같은 85건이 있다**(해시 동일, 2026-09-11 실측). 저자는 그 글자를 찍은 적이 없다. 진짜 이탈은 3런
하나뿐이었고(코드 데모의 고정폭 서체) 그건 «의도»였다. ⇒ 판별자는 **영역 + 템플릿 해시 대조**이지
서체 이름이 아니다. 뒤집으면, 템플릿에서 **갈라진** 마스터·레이아웃은 반대로 **저자 책임**이라 그
사실을 따로 보고한다. 코드: `lane_font.py` · self-test: `test_lane_font.py`(**42항** — 5라운드에서 30→42) · 레인 래퍼 `scripts/test_preprep_font_lanes.sh`
(되돌림 프로브 `fixtures/font_revert_probe.py`). known-negative 가 «서체 하나뿐인 덱»이 아니라
**«마스터에 이질 서체가 있지만 템플릿과 동일한 덱»** 인 것이 핵심이다 — 그게 실제로 틀렸던 자리다.

🟥 **이 레인이 «안 읽는» 자리는 0 이 아니라 UNMEASURED 로 나간다** (5라운드 신설). 차트
(`ppt/charts/`)·SmartArt(`ppt/diagrams/`) 안의 글자는 화면에 렌더되지만 `slides/` 밖이라 스캔
범위가 아니고, DrawingML 을 `a` 가 아닌 접두사로 묶은 장도 이 정규식 스캐너가 못 읽는다. 둘 다
**그런 자리가 있으면 세어서 노트로 낸다** — 「안 읽었다」를 「이탈 없다」로 렌더하지 않는 것이
이 레인 전체의 규율이다([[feedback_not_found_is_not_zero_family]]).

🟥 **cross-family 2라운드가 판정을 한 번 뒤집었고, 그 되돌림 자체가 계약이다.** 1라운드는
«템플릿 자신의 마스터/레이아웃이 쓰는 서체는 오탐이니 노트로 강등하라»고 했고 그렇게 고쳤다.
2라운드가 그것을 **fail-open 으로 지목했다** — 배포 템플릿의 레이아웃은 쓰이지도 않는 자리에
Office 기본값(Arial·Calibri)을 흔히 들고 있어서, 강등하면 저자가 그 이름으로 본문을 찍어도
종료코드가 안 움직인다. ⇒ **억제는 걷고 맥락 주석만 남긴다**(finding 은 유지). 래퍼의
`annotation` 프로브가 이 되돌림이 다시 억제로 가지 않는지를 고정한다.
2라운드가 닫은 나머지 다섯: 자식 있는 `defRPr` 에서 비탐욕 정규식이 **서체를 조용히 버림** ·
`presentation.xml` 의 `r:id`/`id` **속성 순서**가 다르면 장 순서가 빈 리스트가 되어 0건 PASS ·
테마의 `<a:font script="...">` **보조 폴백**을 위반으로 셈 · 면제가 정확일치라 선언한 가족의
굵기 변형이 안 덮임 · 갈라진 부품에서 **원래 있던** 서체까지 이탈로 보고.
🟥 **구조적으로 못 보는 것 셋**: 이미지에 구워진 글자 · 그 서체가 **설치돼 있는지**(파일은 이름만 적고,
없으면 렌더러가 조용히 대체한다) · 굵기 변형의 실재. 셋 다 파일 밖의 사실이라 0 으로 세지 않는다.
🟥 **정정 2026-09-21 — 둘째의 «절반»은 파일 «안»의 사실이라 이제 잰다.** 설치 여부는 여전히 못 보지만
**«설치에 기대고 있나»(=임베드했나)는 잰다** — 그 자리가 **L15-b font-embed** 다. 즉 위 문장은
«못 본다»가 아니라 **«못 보는 쪽과 보는 쪽이 갈린다»**로 읽어야 한다. 이 구분 없이 인용하면
임베드 결함을 «구조적 한계»로 덮는다(실측: 한 덱이 실사용 서체 둘을 안 넣고 제출됐다).

🟥 **L8 이 advisory 인 이유**: 두 계기의 오탐을 **최저비용으로 무마하는 길이
「그 문장을 지우는 것」**이라, 종료코드에 태우면 원고를 나쁜 방향으로 미는 압력이 된다.
후보를 내고 판정은 사람이 한다. 오탐 다수가 정상이다.

🟥 **R1~R5·P1·P3 이 전부 advisory 인 이유**: L8·L11 과 같다 — 오탐의 최저비용 무마가 원고를
망가뜨리는 방향(문장 삭제·형식 왜곡)이라 종료코드에 태우지 않는다. `preprep.py` 배선도 findings 를
버리고 notes 로만 낸다(L8·L11 관례). `--lane R1,R2,R3,R4,R5,P1,P3`(또는 그룹 `R`·`P`)로 이 일곱만
골라 돌릴 수 있다 — 🟥 **L1~L11 은 아직 이 `--lane` 필터를 안 탄다**(늘 전부 돈다). 정본:
`tracks-meta/fh_signal_2026-09-04_preprep-evolution.md` §1·§2 · 코드: `lane_slide_relations.py` ·
`lane_geometry.py` · 픽스처: `fixtures/mk_slide_fixtures.py`(테스트 시 생성) +
`fixtures/fixture_R3_{positive,negative}.pptx`(실물 2장) · self-test: `test_preprep_lanes_rp.py`.

## 문체는 레인이 아니다 — 레퍼런스와 스킬이 한다

초판에는 `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 의 자리다.

## 방법론 — 실사용 하루치에서 역산 (2026-09-04)

121장 한국어 발표 덱 한 벌을 하루 동안 실사용하며 나온 판단 축이다. 코드가 된 것은 §레인의
신규 레인들이고, 아래는 코드만으로는 안 닫히는(또는 아직 코드가 아닌) 것들이다.

### ⓐ 장을 지워도 시간은 안 줄어든다
장 삭제만으로는 발화 시간이 0초 줄었다. 시간은 **대사**에 있고, 대사는 **화면 글자**에
묶여 있다(화면에 적혀 있으면 안 말할 수가 없다). 실제로 줄어든 것은 화면 자수를 깎았을 때뿐이다.
⇒ **분량 정리의 1순위 대상은 «장 수»가 아니라 «화면 글자»다.**

### ⓑ 전역 축은 한 장짜리 렌더로 판정하면 안 된다
색을 여러 면 바꾸고 한 장씩 렌더해서 「개선」이라 판정했는데, 전체를 이어서 넘겨 본 판정은
전달력 저하로 되돌렸다. 두 판정은 다른 것을 본다 — 한 장 안의 대비와, 여러 장을 흐르는 동안
「여기가 문제다」가 꽂히는 일관성은 같은 속성이 아니다. **후자는 한 장짜리 렌더에 구조적으로
안 나타난다.**
⇒ 색·타이포 같은 전역 축은 **연속 구간을 이어서** 보거나 사람이 넘겨 봐야 한다.
⇒ 반대 방향도 같이: 한 장에서 보인 것을 **전역으로 밀지도 마라** — 다른 장은 이미 다른
요소(예: 테두리 있는 카드)가 같은 문제를 막고 있을 수 있다.

### ⓒ 렌더 없이는 구조적으로 안 보이는 것들
같은 하루에 렌더 없이는 놓쳤던 것 넷 — 옛 도해의 연결선 잔해(도형만 지우고 선을 안 지움) ·
도형 종류가 덱 규약과 다름 · 빌드 프레임 전환에서 텍스트가 사라지는 자리 · 부연이 본문과
같은 밝기로 경쟁하는 자리. ⇒ **도해를 건드렸으면 렌더한다** — ⑤ 단계 규율.

### ⓓ 새 도형을 넣기 전에 «같은 역할의 기존 도형»을 세라
새로 넣을 도형이 덱 전체와 혼자 달랐던 사고는, 덱에 이미 그 역할의 규약이 백 회 넘게
있었기 때문이었다 — 색도 형태도. 희귀한 값(전체 중 여섯 번뿐)이라도 **그 여섯 번이 전부
같은 역할**이면 그게 답이다. ⇒ **덱 자기 규약을 먼저 추출**한다. 지어내는 것은 마지막 수단.

### ⓔ 장을 뺄 때 «그 장이 받는 말이었나»를 본다
한 장을 지우자 다음 장 부제의 「그러나」가 받을 말을 잃었다. 삭제 전 **뒤 장의 전제인지**
확인한다 — ⑤ 단계 규율.

### ⓘ 이름이 겹치는 도형을 «순번»으로 집지 마라 — 자리로 결박해라
2026-09-10 실사고. 한 장에 `a-a1` 이라는 **같은 이름의 화살표가 셋** 있었고, 그것들을 대칭으로
맞추려고 `occurrence=0/1/2` 로 집어 자리를 배정했다. **순번을 잘못 짚어 `flipH` 가 엉뚱한 도형에
남았고, 바깥 화살표 둘이 상자 «바깥쪽»을 가리켰다** — 모이는 그림이 벌어지는 그림이 됐다.

🟥 **그리고 아무 계기도 안 잡았다.** 기하 레인은 그때 flip 을 안 읽었고(지금은 읽는다), 편집
전/후 델타는 「새 어긋남 0건」을 냈으며, **렌더도 봤는데 내가 잘못 읽었다.** 운영자가 눈으로 잡아
손으로 고쳤다. 계기와 눈이 같이 놓친 자리다.

⇒ **규율**: 편집 대상을 이름으로 못 특정하면 **지금 자리(x, y)로 결박**한다. 순번은 XML 문서
순서라는 «저자가 모르는 사실»에 기대고, 틀려도 값이 다 들어가므로 **집합으로는 옳아 보인다**.
그리고 편집 뒤에는 **바꾸려던 그 도형이 바뀌었는지**를 이름이 아니라 자리로 되읽어 확인한다.
(P1 이 「이름은 필요조건이지 충분조건이 아니다」로 배운 것과 같은 교훈의 **편집 쪽** 얼굴이다.)

### ⓕ 「알고도 남긴 것」과 「몰라서 남은 것」을 갈라 적어라
팔레트 밖 색을 정해서 남긴 자리가 있었다. 그렇게 적지 않으면 다음 감사자가 다시 «발견»한다
(실측: 지운 색이 다른 색번호로 되살아나 있었다). 체크리스트 항목: `presentation_checklist.md` C6.

🟥 **2026-09-10 — 이게 산문 규율만으로는 안 지켜졌고, 그래서 채널이 생겼다.** 그날 49p→50p 의
격리 막대가 두꺼워지는 것을 P1 이 «튐»으로 냈고, 나는 그것을 «고쳤다». 운영자가 *"49~50으로
격리 선이 두꺼워지는 거였는데 지금 그게 발생하지 않음"* 이라고 지적해서 되돌렸다.
**ⓕ 는 그때 이미 이 문서에 적혀 있었다** — 읽고도 안 걸렸다. 규율이 사람 기억에 얹혀 있으면
다음 세션에서 또 새어 나간다([[feedback_half_fix_propagation_boundary]]).

⇒ **선언은 이제 `surfaces.yaml` 이 받는다** — `geometry.intended` · `attr_consistency.intended`.
세 가지가 규율이다:

    ① 면제는 «도형»이 아니라 «그 변화»에 걸린다  선언한 속성 말고 다른 게 바뀌면 그대로 뜬다
    ② `why` 가 비면 «면제»가 아니라 «오류»다      사유 없는 면제는 이 채널의 존재 이유를 지운다
    ③ 면제된 것은 «면제됨»으로 출력된다           조용히 사라지면 다음 감사자가 다시 «발견»한다

🟥 기계는 **«선언되었나»만 보고 «옳은가»는 안 본다**(CLAUDE.md §Mechanization Boundary —
채널은 굳히고 판단은 안 굳힌다). 그러니 이건 «연출을 자동으로 알아본다»가 아니다. 못 알아본다.
알아보는 것은 사람이고, 기계는 그 판단이 **다음 세션까지 살아 있게** 할 뿐이다.

### ⓗ 「만들기」와 「설치」를 한 호출에 묶지 마라 — `safe_install.py`
2026-09-10 실사고: 편집 스크립트가 assert 로 죽었는데 **뒤따르는 `cp` 가 그대로 돌아** 120장
정본을 **102장으로 잘린 파일**이 덮었다(git 에서 복구). 근본 원인은 assert 가 아니라 **앞이
실패해도 뒤가 도는 형태**다 — 셸에서 `;` 로 이은 줄은 전부 그 형태다.

    python3 safe_install.py <후보> <정본>    # zip 무결성 · 필수 부품 · 장 수 · 파일↔목록 일치
                                             # · 복사 후 해시 재확인. 통과해야만 복사한다
    ... --dry-run          검사만        ... --expect N        장 수를 못 박는다
    ... --allow-shrink --why "<사유>"    의도한 축소(기본은 거부 — 비가역 표면은 fail-closed)

⚠️ **구조만 본다.** 120장이 그대로 120장이면서 전부 빈 장이 된 경우는 통과한다 — 좁아진 것이지
닫힌 게 아니고, 그 자리는 레인과 렌더가 본다.

### ⓖ 외부 가이드를 인용할 때 — «정의»는 «금지문»이 아니다
같은 레퍼런스를 두고 두 판정이 갈렸다: 폰트 크기 「위반」을 유보했는데 원문에 **숫자가 한
개도 없어서** 위반이 아닌 것으로 확정됐고, 색 「위반」은 스와치(정의)를 근거로 올렸다가
**철회**했다 — 색에 대한 유일한 **문장**은 「같은 위계에 같은 색으로 통일」이라 오히려 만족하고
있었다. ⇒ 레퍼런스에서 «위반»을 낼 때는 **원문 문장을 인용**하고, 스와치·템플릿 실측값은
«차이»로만 낸다 — ② 단계 규율.

## 정직한 한계 (2026-09-04 실측분, 인용 전에 읽어라)

§레인의 신규 텍스트 레인(orphan-connective · enum-dropped · lead-term-unbacked · screen-heavy ·
read-load)과 신규 기하 레인(build-jitter · adjacency)에 대한 캘리브레이션 잔여다. **이 절
없이 그 레인들의 수치를 인용하면 과계상이다.**

- **reps=1.** 텍스트·기하 신규 레인은 모두 known-positive 한 팔씩이다. 이 저장소 자기 바(≥3)
  미달.
- **lead-term-unbacked 의 known-positive 는 합성 뮤턴트다**(자연 발생본이 파일로 안 남았다).
  나머지는 실제 백업에서 떴으니 **증거 등급이 다르다 — 묶어 말하지 마라.**
- **오탐 0 은 n=1 코퍼스에서의 수치다.** 다른 덱에 옮기면 임계(선두 줄 판별 · 강조색 비교 ·
  활용 어미 제외 · 자기분포 P90)를 다시 재야 한다.
- **enum-dropped 는 표에서 한 칸 어긋난 프레임에서 뜬다** — 같은 표의 이웃 프레임이라 부류는
  맞지만 쪽수가 어긋난다.
- **adjacency 기저 오탐이 76건.** 절대 목록으로 쓰면 안 된다 — 편집 전/후 델타 용법이 전제다.
- **L8 오탐 진단(«저희»·«그대로»)은 이 한 덱에서 나왔다.** 다른 한국어 코퍼스에서 같은 비율인지는
  미측정.

### 2026-09-10 추가분 (P1 결박 정정 · P4 신설)

- 🟥 **RETRACTED — 「P1 결박을 «이름 AND 글자»로 좁혀라」는 처방은 틀렸다.** 2026-09-10 인계 노트가
  그렇게 적었고 그대로 구현했는데, **원적 사건 재현 프로브가 그 자리에서 빨개졌다**: 35p→36p 의
  게이트 막대 `s5017` 은 **글자 없는 도형**이라 좁힌 결박이 P1 의 존재 이유였던 그 결함을 통째로
  잘라냈다. 오탐을 없애면서 자기 known-positive 를 같이 죽인 형태다.
  **살아남은 처방은 좁히기가 아니라 «신뢰도로 가르기»**다 — 버리는 것은 «글자가 서로 다른 쌍»
  하나뿐이고, 글자 없는 도형은 **[이름만 결박] 이름표를 달고 후보로 남는다.**
  ⇒ 인계 노트나 요약에서 「이름 AND 글자로 좁혔다」를 보면 **그건 낡은 줄이다.**
- **P1 결박 분포는 이 덱 한 벌 수치다** — 824쌍 중 이름+글자 425 · 이름만 334 · 불일치 65.
  다른 덱은 도형 이름 규약이 달라 비율이 통째로 달라진다. **인용하려면 자기 덱에서 다시 재라.**
- **P4 의 known-pair 는 reps=1 이고 생성 픽스처다.** 축 넷 × 양팔이 각각 한 번씩이고, 이 저장소
  자기 바(≥3) 미달이다. 다만 컨트롤이 죽지 않았음은 확인했다 — 두 팔의 도형 수·이름·자리가 같고
  **갈리는 값 하나씩만** 다르다(negative 가 «볼 게 없어서» 조용한 것이 아니다).
- **P4 가 실물에서 잡은 것은 손검증 1건뿐이다.** 완성 덱에서 후보 16건이 떴고 그중
  `71p [mirror]`(나란한 두 카드가 28pt ↔ 22/28pt)를 XML 로 직접 열어 **실재 확인**했다. 나머지
  15건은 미검증이다 — 「16건 잡았다」로 인용하지 마라.
- **`algn`·`mirror` 축은 키가 엄격하다**(정확히 같은 폭·같은 y / 허용 오차 안의 거울 자리).
  한 픽셀 어긋난 «같은 줄»은 구조적으로 안 잡힌다. 실측에서 이 덱은 `dash 0 · algn 0` 이었는데,
  그건 **「그런 결함이 없다」가 아니라 「이 키로는 못 본다」일 수도 있다.**
- **크기 축은 명시 `sz` 만 읽는다.** 플레이스홀더·테마 상속 크기는 XML 에 없어 **UNMEASURED** 다.
  실측: 도형 1,901개 중 명시 크기가 있는 것은 **990개(52%)** — 나머지 절반은 이 축의 사각이다.
- **`echo` 축의 오탐률은 높은 쪽이다.** 같은 문장이 요약 장에서 작게 다시 나오는 것은 정상이고,
  이 레인은 그것과 «실수로 갈린 것»을 **못 가른다**. 순위표로 읽고 선언으로 걷어내라.

## 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 — 적대 짝: 그 판정을 저자가 아닌 사람이 다시 읽는다(격리 그라운딩). 자기 판정으로 대체 금지 |
| **도해를 건드렸으면 렌더 결과를 첨부했다**(§방법론 ⓒ) | judged — 적대 짝: 렌더 파일이 실제로 존재하는지(경로·확장자·이번 편집 이후의 mtime)는 별도로 measured 로 확인한다. 「첨부했다」는 자기신고만으론 인정하지 않는다 |

## 이 하네스가 못 하는 것

발표를 **잘 만들어 주지 않는다.** 어긋난 자리를 찾을 뿐이고, 무엇을 말할지·어떤 순서로
놓을지는 판단이다. 그리고 위 「갈라 적는 것」의 네 사각은 **좁아진 것이지 닫힌 게 아니다**.

Files in this skill

  • README.md3.1 KB
  • SKILL.md43.9 KB
  • canon_terms.example.yaml2.6 KB
  • diagram_from_json.py11.8 KB
  • fixtures/adjdup_known_negative.md274 B
  • fixtures/adjdup_known_positive.md389 B
  • fixtures/fixture_R3_negative.pptx24.6 KB
  • fixtures/fixture_R3_positive.pptx24.5 KB
  • fixtures/font_revert_probe.py4.8 KB
  • fixtures/mk_slide_fixtures.py17.4 KB
  • fixtures/progression_known_negative.md220 B
  • fixtures/progression_known_positive.md402 B
  • fixtures/promise_known_negative.md320 B
  • fixtures/promise_known_positive.md186 B
  • interslide_deps.py18.4 KB
  • jargon_terms.example.yaml3.2 KB
  • lane_adjacent_dup.py5 KB
  • lane_attr_consistency.py24.9 KB
  • lane_diagram.py6.3 KB
  • lane_font.py31.7 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.