# 05-1 강사 노트 (내부 보관 — 납품 대상 아님)

## rev1 반려 대응 요약 (2026-09-04)
검증 원문 `verify/results/05-1.md`. 계약·자료 결함 넷(⑤⑥⑦⑧)은 오케스트레이터가 `05-1.md`·README를 개정. `assets/contracts/05-1-rev1.md` CA1~CA8 반영.
- **CA1** slides.md 강사 노트 시간을 실측 재계산(도입4.43·이론6.33·시연15.83·정리2.08분 — CA5 밀도 장면 추가로 시연이 늘어 §0.16-a 목표치도 갱신)에 맞춰 전면 재배분. 도입 266초(cover10+goal95+result161)·이론 380초·시연 950초·정리 125초, 전부 ±10% 이내.
- **CA2** `minutes: 25` → **28**(CA5로 시연이 늘어난 뒤 실측 반올림 — CA1이 지정한 26은 CA5 전 수치라 CA5 반영 후 다시 계산).
- **CA3** 이 문단 notes (rev1 당시) 정정 — 빌드본은 오케스트레이터가 만든다. 집필자는 자체 확인 뒤 로컬 산출물을 지운다(§0.5 "slides.html은 빌더가 만든다 — 손대지 않는다"와 별개로, 집필자 pane에서 만든 임시 빌드는 혼선을 막기 위해 지운다). `ls`로 매번 확인.
- **CA4** src 「308행」→**307행**(헤더 제외 실측) · 「업종 38개로 나눠」 표현 삭제 → "구마다 28~34종만, 완전교차 아님"으로 정정(script (rev1 당시)) · 중구 「33%」→**32.7%**(구 전체 매출 분모, 2020년) + 「5구 공통 26업종 분모면 36.0%」 함정 한 줄(script (rev1 당시), 중구 강조 화면 신설) · "2020년 값을 쓴다" 발화 명시 + 2019년 역전(서구33.8%>중구32.6%) 캐스션 축자 추가(script (rev1 당시)) · 소분류 이름(「의료기관/제약」「자동차정비/유지」)은 원래부터 파일 그대로였음(변경 없음).
- **CA5** 상가업소 업종 밀도 장면 신설(script (rev1 당시), slides demo3) — `shops_2026-06_clean_gu_category.csv`(04-3 정제 후)의 음식·소매 업소수 ÷ 인구(market.md §6 비율, **rev1 당시, 폐기** — rev2에서 README 04-3 절 원표 인구로 교체됨)로 만 명당 밀도 계산. 음식 밀도는 README 04-3 절과 소수점까지 일치 재확인. 소매 밀도는 이 편에서 신규 계산.
- **CA6** 「유성구 연구단지」 근거를 외부 URL 대신 저장소 상호명 실물로 뒷받침(script 근거 절) — 최초 조사는 유성구·상호명 「연구」 포함 146건이었으나, rev3 CC3에서 실물 대조 결과 상호명 오인용·과다 매칭이 드러나 40건(「연구원」 한정)으로 다시 잡았다(아래 rev3 항목 참조).
- **CA7** script (rev1 당시) 갈고리 문장에서 "오늘 버린 사람들에게는 애초에 그 약속이 안 통한다는 것도 함께 넘어간다"(후속 차시 5-2의 내용을 단정) 삭제 → 제목만 남김. `(재구성 — ...)` 마커 중 「촬영 시 교체」 지시가 없던 3곳(구 (rev1 당시) 막힘 장면, (rev1 당시) AI 출력 코드블록) 전부 "촬영 시 실제 …로 교체" 추가.
- **CA8** quiz.md 정답 번호 분포를 1번 쏠림(4/5)에서 2·4·1·3·2로 재배치(이미 05-1b에서 처리), 문항3 보기 길이 편차 1.41배→1.21배로 조정(이미 처리) — rev1 재확인 결과 이 둘은 이미 닫혀 있어 추가 수정 없음.

## rev2 반려 대응 요약 (2026-09-04)
검증 `verify/results/05-1-rev1.md`. FAIL 5 중 2건은 오케스트레이터 몫(README 04-3 표가 rev1 도중 원표 인구 기준으로 갱신됐는데 §0.17대로 알려지지 않았다) — 이제 원표 인구(서구464,428·유성371,855·중구224,034·동구218,050·대덕163,823)로 재계산. `assets/contracts/05-1-rev2.md` CB1~CB5 반영.
- **CB1(FAIL①)** 「유성구는 음식점도 소매도 다섯 구 중 가장 낮다」는 전제가 틀렸다 — 음식 밀도는 **2위**(중구175.7>유성167.6>대덕165.4>서구158.2>동구154.6), 절대 업소 수도 서구 다음 **2위**(6,231). 소매 밀도만 최저(119.2). script (rev2 당시), slides demo3 frame, notes (rev2 당시)을 「음식점 밀도 2위 + 소매 밀도 최저」로 전부 정정. 새 전제: 카드매출 1위(40%)+음식 밀도 2위(먹으러 오는 사람은 많다) vs 소매 밀도 최저(사러 오는 사람은 적다) → 이 대비가 「연구단지 점심 도시락」 행동 축의 근거.
- **CB2(FAIL②)** 밀도 10값(음식5+소매5) 전부 원표 인구 분모로 재계산 — script 근거 절·notes 근거 메모 갱신. 「소수점까지 일치」 문장은 음식 밀도에만 해당한다고 명확히(소매는 이 편 신규 계산이라 일치 검사 대상이 아님).
- **CB3(FAIL③)** slides.md goal body (rev2 당시) "이 25분이 끝나면" → **"이 편이 끝나면"**, result title (rev2 당시) "25분 뒤에 보는 것" → **"이 편이 끝나면 보는 것"**(COMMON §0.5 개정: 슬라이드 본문·대본 발화에 분 수를 박지 않는다).
- **CB4(FAIL④)** `minutes: 28` → **29**(CB1·CB2 반영 후 재측정 6,345자/28.51분, 검증자 실측 28.67분과 근접).
- **CB5(FAIL⑤)** notes.md 「대본 근거 메모」의 1인 가구 결여 인용 줄 번호가 (rev2 당시)로 stale이었다(근거 절에 CA4~CA6 내용을 추가하며 줄이 밀렸다) — **(rev2 당시)**으로 정정.
- 이번 편집은 밀도 문단((rev2 당시) 부근)만 문장 내부 치환이라 script.md 줄 번호 변화 없음 — quiz.md 인용 행(rev2 당시) 전부 재확인, 그대로 유효.
- **자체 발견(CB3 연장선)**: 재빌드하니 chapter 카드 `clock: 13분`(2자리+분)이 새 빌더 경고(「본문에 분 수가 있다」, COMMON §0.5 신설 검사, `\d{2}분` 정규식)에 걸렸다 — chapter clock 필드 셋(6분·13분·2분)을 전부 `assets/ep-04-2/slides.md` 예시와 같은 `M:SS` 표기(6:00·13:00·2:00)로 교체. 재빌드 경고 0건 재확인.

## rev3 반려 대응 요약 (2026-09-04)
검증 `verify/results/05-1-rev2.md`. 숫자는 전부 통과, 남은 것은 근거의 정직성. `assets/contracts/05-1-rev3.md` CC1~CC7 반영.
- **CC1** quiz.md 정답이 「길이 순위 1위(단순 최장)」인 문항이 3/5(Q2·Q3·Q4)였다 — 기존 세 지표(ratio≤1.3·max/min≤2.0·2nd 대비 20% 이내)는 유지한 채 Q3·Q4의 오답 하나씩을 정답보다 살짝 길게 늘렸다(Q3 오답2 50→55자, Q4 오답1 26→37자). 재측정 결과 sole_longest **1/5**(Q2만 남음, ratio 1.12로 기존 지표는 여전히 통과).
- **CC2** 카드매출이 KB국민카드 1개사 추정치라는 사실을 발화에 명시 — script (rev3 당시)에 (축자) "한 카드사 자료라 전체 매출은 아닙니다. 그래도 구끼리 비교하는 데는 씁니다." 신설. (rev3 당시)의 "신용카드" 표기를 전부 "신용카드(KB)"로.
- **CC3** 근거 절 유성구 상호명 인용이 실물과 달랐다 — 재검색 결과 「한국전자통신연구원신용협동조합」은 실제로 「한국전자통신연구원신용협동조**하**」(원본 CSV 자체의 오타, 「조합」이 아니라 「조하」로 끝난다)였고, 「한국화학연구원카페」는 실제로 「후니드한국화학연구원카페」(운영사 접두어 누락), 「한국원자력연구원」은 단독 상호가 아니라 「아라마크한국원자력연구원2」였다 — 셋 다 실물 문자열 그대로 교체. 「146건 전부 음식」도 거짓이었다(넓은 「연구」 매칭 146건에는 교육·과학기술·소매 등이 섞여 있었다) — 매칭 기준을 국가 연구기관을 가리키는 「연구원」으로 좁혀 **40건**으로 다시 세고, 업종대분류 전체 분포(음식11·과학기술11·소매9·교육6·수리개인1·보건의료1·부동산1)를 그대로 밝혔다. 행정동 인용도 임의로 3개만 뽑았던 것을 전체 8개 동으로 교체(신성동20·온천1동7·전민동5·온천2동3·구즉동2·관평동1·노은3동1·학하동1).
- **CC4** quiz Q2 why의 큰따옴표 인용이 rev1 이전(축약) 버전의 script (rev3 당시)였다 — 현재 대본과 대조해 「거주지」를 되살리고, 뒷부분("행동 축은... 갈라놓는 축이다")은 실제로는 다른 문장인데 이어붙여 인용한 것이었다 — 실제 두 문장("...구하기 어렵다" / "광고 문구가 실제로 맞아떨어지는 쪽은 후자다")으로 정정.
- **CC5** notes (rev3 당시, 당시 CA5 항목)의 「market.md §6 비율」 방법에 「(rev1 당시, 폐기)」 표기 추가. notes (rev3 당시, 검사 로그)의 "소수점까지 일치"가 음식·소매 10값 전체에 걸리는 것처럼 읽혔다 — 음식 5값(README 일치)과 소매 5값(이 편 신규 계산, 대조 상대 없음)을 분리해 다시 썼다.
- **CC6ⓐ** 숫자가 실린 슬라이드(result 제외 — 이 편 result에는 숫자 없음) 전부에 `src` 추가: demo1(카드매출 출처)·demo2(카드매출 출처)·demo3(상가업소 밀도 출처). table1은 이미 있었음.
- **CC6ⓑ(§0.18-a 인접 마진)** 밀도 순위 전부를 다시 재서 이웃 값 간 마진을 퍼센트로 쟀다. 음식 밀도 최소 마진(유성167.6-대덕165.4)은 1.32%로 「유성 2위」 주장에 문제없다. **그런데 소매 밀도의 대덕(134.2)-서구(133.7) 마진은 0.42%로 1% 미만이다** — 계약 CC6ⓑ가 "최소 마진 1.33%라 해당 없음"이라 했는데 이건 음식 밀도 쪽만 잰 값으로 보인다. §0.18에 따라 계약 결함을 그대로 옮기지 않고, script 근거 절·slides demo3 양쪽에서 소매 밀도의 대덕·서구 순서를 「거의 같다」로 헤지했다(전체 순위 결론 — 중구 1위·유성 최저 — 에는 영향 없음).
- **CC7** (rev3 당시)(구 「도입 막힘 장면」) 조작 태그가 「없음」이었는데 실제로는 직전((rev3 당시) 타겟 정의 카드)과 다른 화면(AI 채팅창 정지 화면)이라 **화면전환**(8초)으로 정정 — 도입 조작 8→16초. slides.md chapter2 label "구마다 15%포인트 차이" → 대본과 같은 헤지 "구마다 15%포인트 **가까이** 차이"로.
- 총량 재측정(당시 값 — 현재는 「분량 — count_script.py 출력 그대로」 절 한 곳만 최신 총량·여유를 가진다, rev5 CE4로 통일): CC2·CC7 편집 후 시연이 늘어 rev2(28.51분)보다 늘었으나 계약이 지시한 여유(1.2분) 안에서 처리됐다.
- 이번 편집((rev3 당시) 부근 CC2 삽입)으로 그 이후 줄 번호가 +3 밀렸다 — quiz.md 인용 행(rev3 당시) 전부 재확인·갱신. 아래 「화면 지시」·「낭독 금지」도 전부 새 줄 번호로 갱신.

## rev3b 사전 검사 대응 (2026-09-04)
- **(1, §0.5 개정)** chapter `clock`은 4박자 배정값(6·13·2)이 아니라 그 구간의 **실측 분 반올림**이다. 당시 시연 실측을 반올림해 slides.md chapter2 `clock: 13:00` → **`16:00`**으로 정정(이론·정리는 반올림해도 원래 값과 같아 불변). 빌더 재확인: `clock` 합 vs `minutes` 차이가 새 검사 기준(0~5분 이내) 통과, 재빌드 경고 0건 — 현재 값은 「분량 — count_script.py 출력 그대로」 절 참조.
- **(2, check_notes 빈 줄 3건)** notes.md 「대본 근거 메모」의 줄 참조가 rev3 편집(CC2 삽입 등) 이후 stale이었다 — `script (rev3b 당시)` → **`script (rev3b 당시)`**, `(rev3b 당시)`(빵집 언급) → **`(rev3b 당시)`**로 정정. 셋 다 `sed -n`으로 재확인.
- **(3, §0.17-b)** 이번 세션(rev0~rev3b) 전체에서 웹 검색·WebFetch를 한 번도 쓰지 않았다 — 카드매출·상가업소 밀도·상호명·업종 소멸/신규 등 전부 저장소 내부 파일(`card_sales.csv`·`shops_2026-06_*.csv`·`README.md`·`market.md`)에서만 가져왔다. **대장 밖 사실 0건.**

## rev4 반려 대응 요약 (2026-09-04)
검증 `verify/results/05-1-rev3.md`. 앞 세 건(rev3b) 지적은 닫혔다. `assets/contracts/05-1-rev4.md` CD1~CD8 반영.
- **CD1** (rev4 당시) 인물 블록 236자 → **112자**(100~150 범위 안). "인물 블록 112자 = 27초"(112÷250×60). CD3에서 늘어난 분을 이 절감분 안에서 흡수 — 총량·여유 최종 수치는 「분량 — count_script.py 출력 그대로」 절 참조(rev5 CE4).
- **CD2** (rev4 당시) 「의료기관·제약」 → **의료기관/제약**, (rev4 당시) 「자동차정비·유지」 → **자동차정비/유지**(파일 소분류 문자열 그대로, 가운뎃점을 슬래시로). notes (rev4 당시)의 `원래부터 파일 그대로였음` 서술은 이 두 군데엔 사실이 아니었다 — 이번에 실제로 고쳤다.
- **CD3(이 편에서 가장 무거운 줄)** (rev4 당시) "소매 밀도는... 다섯 구 중 가장 낮습니다"가 인구 분모만 보여준 채 결론을 냈다 — 대본이 (rev4 당시)에서 이미 가르친 「분모를 바꿔 보는 검사」를 자기 결론에는 걸지 않았던 것. (rev4 당시) 뒤에 (요점) 한 문단을 신설해, 분모를 그 구 전체 업소 수로 바꾸면 소매 비중 순위가 동구>중구>대덕>**유성(4위)**>**서구(최저, 22.57%)**로 달라진다는 것을 스스로 검사했다(python 재계산, `shops_2026-06_clean_gu_category.csv` 전체·소매 열). 인구 분모든 업소 구성비 분모든 유성구는 하위권이라 결론(행동 축 = 연구단지 점심 도시락)은 그대로 유지.
- **CD4(계약 결함, 오케스트레이터가 §0.18-a 문턱을 1%→4%로 정정)** 문턱을 4%(분자·분모 오차 합, 쌍 비교)로 다시 재고 밀도 순위 8개 인접 쌍을 전부 재판정. **새로 걸린 자리 둘**: 음식 밀도 유성-대덕(1.32%)은 rev3에서도 이미 걸렸던 자리라 계속 헤지, **음식 밀도 서구-동구(2.30%)도 이번에 새로 걸렸다** — 4% 문턱으로 재보기 전엔 안 걸렸던 자리다. 결과: 음식 밀도를 3묶음(중구 단독 1위 / 유성·대덕 묶음 / 서구·동구 묶음)으로 다시 썼다. 소매 밀도의 대덕-서구(0.42%)는 그대로 헤지 유지. script (rev4 당시), slides demo3 frame 전부 갱신.
- **CD5(§0.14 신설 — chapter label·lead엔 숫자 금지, src 슬롯이 없어서)** slides.md chapter2 `label: 구마다 15%포인트 가까이 차이` → **"구마다 다른 업종이 앞선다"**(숫자 0). 해당 숫자는 이미 demo2·table1에 src와 함께 있다.
- **CD6** 이 파일의 발화 합계 표기를 `count_script.py` 출력 형식(「합계 공백포함: N」)에 맞췄다 — 아래 「분량 — count_script.py 출력 그대로」 참조. 계약이 준 6,481은 CD1·CD3만 반영한 중간값이었고, 이후 CD1 인물 블록 재작성 문구가 계약 예시와 달랐던 점 + CD7 촬영 최대치 확보를 위해 시연 문단 다섯 곳을 추가로 다듬어(약 340자 순감) 최종값이 달라졌다 — **자가추정이라 검증자 실측이 판정.**
- **CD7(§0.4 개정 — 화면전환과 다른 조작이 겹치는 화면은 둘 다 더한다)** 순수 「화면전환」이 아닌 조작 태그 6곳(AI응답대기×2·파일열기×2·표작성×2)은 전부 직전 화면과 다른 새 장면이기도 하다 — 각각에 화면전환 8초를 추가로 더했다(예: AI응답대기 30초 → 38초). 조작 합계 172초 → **220초**(+48초). 이 증가분을 맞추기 위해 시연 요점 문단 다섯 곳((rev4 당시) 부근)을 다듬어 순감 확보 — 총량·여유 최종 수치는 「분량 — count_script.py 출력 그대로」 절 참조(rev5 CE4).
- **CD8** 근거 절에 카드매출 결측 사실 신설: 「307행 중 43행에 빈 셀 105개(6.8%) — 핵심 5업종(일반음식점·의료기관/제약·자동차정비/유지·소매·대형유통) 열엔 0건, 합계 계산은 빈 셀을 0으로 읽는다(awk)」. python(csv, quote-aware)로 재확인 — 105/1,535=6.84%, 핵심 업종 결측 0건.
- 이번 편집으로 (rev4 당시) 이후 줄 번호가 소폭 밀렸다(CD3 신규 문단 1개 삽입 등) — quiz.md 인용 행(rev4 당시) 전부 재확인·갱신. 아래 「화면 지시」·「낭독 금지」·「분량 — count_script.py 출력 그대로」도 전부 새 줄 번호·새 값으로 갱신.

## rev4b 사전 검사 대응 (2026-09-04)
- **(1)** 당시 검증자 count_script.py 실측 6,169자로 확정 — 집필자 자가추정 도구가 매번 검증자 실측보다 낮게 나오는 패턴을 처음 확인한 자리(이후 CE4로 통일). `minutes`를 그 값에 맞춰 재조정, chapter clock 합 대비 문턱(0~5) 통과, 재빌드 경고 0건 — 현재 값은 「분량 — count_script.py 출력 그대로」 절 참조.
- **(2)** 이 파일의 "합계 공백포함" 줄이 rev4(6,140, 집필자 자가추정)와 계약 인용(6,481, CD1·CD3 이전 중간값) 두 개로 흩어져 헷갈렸다 — 「분량 — count_script.py 출력 그대로」의 최종 줄을 검증자 실측값 **6,169**로 교체하고, 집필자 도구값(6,140)은 괄호 안 참고로만 남겼다.
- **(3)** 「검사 로그」의 `grep "의료기관·제약\|자동차정비·유지" ...` 줄이 큰따옴표 안이라 check_notes가 script.md 인용문으로 오인해 stale로 잡았다 — 백틱으로 교체(````의료기관·제약\|자동차정비·유지````). 같은 이유로 notes (rev4b 당시) 인용도 백틱으로 교체. script.md의 「2위」 2곳((rev4b 당시) 절대 업소 수 2위 — 밀도 순위가 아니라 정수 비교라 마진 문턱과 무관, (rev4b 당시) 근거 절의 「「유성 2위」 단정 삭제」— 삭제됐다는 사실을 기록한 메타 서술)을 재대조 — 둘 다 rev4의 묶음 서술과 어긋나지 않는다, 수정 불필요.

## rev5 반려 대응 요약 (2026-09-04)
검증 `verify/results/05-1-rev4.md`. 셋 중 둘은 계약 원인(CE1 감사 범위, CE3 minutes) — CD4가 밀도 8쌍만 준 게 「이것만 검사하면 된다」로 읽혔다. `assets/contracts/05-1-rev5.md` CE1~CE4 반영.
- **CE1(구조⑤, 계약 결함)** §0.18-a 감사 범위가 밀도 8쌍이 아니라 **화면·발화에 오르는 몫 지표 8종×4쌍=32쌍**이라는 게 이번에 확정됐다(마진 정의: (큰−작은)÷큰). 32쌍 전부 재계산해 미달 9쌍을 찾았고(카드매출 일반음식점 서구-동구 3.36%·자동차정비/유지 서구-중구 1.27%·음식밀도 2쌍(rev4에서 이미 처리)·소매밀도 1쌍(rev3에서 이미 처리)·소매구성비 2쌍(그중 유성-서구 3.54%가 **FAIL②**)·음식구성비 2쌍(발화·표시 안 됨, 감사만)), script 근거 절에 32쌍 전체 판정표를 신설했다. 실제 발화·표에 순서를 매긴 자리 중 미달인 곳(일반음식점 표/발화 서구·동구, 소매구성비 (rev5 당시) 이하)은 묶음 표시로 정정 — 나머지(자동차정비/유지·음식구성비)는 애초에 순위를 말한 적이 없어 감사만 하고 손대지 않았다.
 - **FAIL②((rev5 당시) 이하, 이 편에서 두 번째로 무거운 결함)**: CD3가 밀도에서 고친 「4위/최저 이중 단정」을 자기가 새로 만든 업소-구성비 분모에서 그대로 반복했다 — "유성구가 4위이고 서구가 22.6퍼센트로 가장 낮다"를 "유성구와 서구가 아래쪽 묶음이다(23.4%·22.6%, 마진 3.54%)"로 정정. 분모를 바꿔 검사할 때는 그 새 분모의 마진도 같이 봐야 한다는 게 이번 rev의 핵심 교훈.
- **CE2** quiz.md mc3 why의 "1인 가구 데이터는 저희에게 없습니다..." 인용 출처가 (대본 (rev5 당시))로만 돼 있었다 — 이 문장은 실제로 (rev5 당시)(AI 페르소나 첫 응답 장면)에 있다. why가 (rev5 당시)(업종을 바꿔도...)와 (rev5 당시)(1인 가구...) 두 문장을 다 인용하므로 **(대본 (rev5 당시))**로 정정. 5문항 전부 grep -F 재대조, stale 0.
- **CE3(FAIL③)** (rev5 당시)(일반음식점 나열)·(rev5 당시)(소매 구성비) 편집으로 총량이 다시 늘어 `minutes: 28` → **29**로 재조정. clock 6·16·2는 그대로(29−24=5, 문턱 0~5 안).
- **CE4(구조⑦)** notes.md 안에 총량·촬영 최대치·여유가 세 곳(28.63/28.34/28.62류)으로 흩어져 있었다 — 「분량 — count_script.py 출력 그대로」 절 한 곳만 이 세 값을 갖도록 전부 통일하고, 다른 절은 그 절을 가리키게 고쳤다. 소매 구성비 「4위/최저」 잔재(근거 메모·검사 로그)도 함께 묶음 표현으로 동기화.
- 이번 편집은 근거 절 확장(32쌍 판정표 신설)이 script.md 뒷부분 줄 번호를 크게 밀었지만, 밀린 구간은 quiz.md가 인용하는 범위((rev5 당시) 이전) 밖이다 — 화면 지시·낭독 금지·quiz 인용 행 전부 재확인 결과 변화 없음.

## rev6 반려 대응 요약 (2026-09-04)
검증 `verify/results/05-1-rev5.md`. 32쌍 마진표·미달9쌍·(rev6 당시)·quiz5/5·minutes29·notes 한 곳·데이터 재현은 전부 통과, notes 구문 오류(백틱 각주 형식 실수)는 집필자 것이라 고쳤다. `assets/contracts/05-1-rev6.md` CF1~CF5 반영.
- **CF1** §0.18-a는 4% 미만만이 아니라 **4~6%도 헤지 구간**이다(6% 이상만 「그대로」) — rev5 근거 절의 "4% 이상은 그대로 둔다"가 오기였다. 음식 밀도 중구–유성(4.65%): script (rev6 당시) "가장 높고"→"앞서는 편이고", slides demo3 "(1위)" 삭제. 대덕–서구(4.31%): 근거 "두 묶음은 서로 구분된다"→"경계도 뚜렷하진 않다". 자체 재계산 중 **3번째 헤지 대상**(카드매출 소매 유성–중구 5.74%)도 발견 — 이 지표는 이 편 어디에도 발화·표시된 적이 없어 감사표에만 기록(고칠 화면 없음).
- **CF2** 5구 공통 26업종 분모 계열(중구 분모 함정 장면에서 발화 1·slides 화면 2에 등장)이 32쌍 감사 범위 밖이었다 — 4쌍 추가로 판정표를 **9종 36쌍**으로 확장, 새 미달 1쌍(서구–동구 3.79%, python 재확인 완료) 반영해 미달 **10쌍**. 다만 이 계열은 발화·화면 모두 중구 값 하나만 말해 순위 단정이 없어 감사만 하고 손댈 자리는 없다.
- **CF3** script (rev6 당시)·slides (rev6 당시)의 "됐는지 어떻게 아나" → `curriculum.md` 5-3 문자열 그대로 **"지켰는지 어떻게 아나"**로 정정(`grep 5-3 assets/curriculum.md` 재확인).
- **CF4** slides.md 강사 노트의 인용 조각 10개를 전부 grep -F로 script.md와 대조 — 3건 불일치: (rev6 당시) "헬스장에서 살 빼려는 사람과 재활 중인 사람"(대본에 없는 paraphrase) → 「살 빼려는 사람」·「재활 중인 사람」 bracket 표기로, (rev6 당시) "쉽게 구해지는 축일수록 효과가 옅다"(대본은 "...이미 다 써서 효과가 옅고") → 실제 대본 substring으로, (rev6 당시) "소매 밀도는..."(대본은 "소매는...") → "소매는..."으로. 재검사 10/10 일치.
- **CF5** slides.html은 오케스트레이터가 빌드한다 — 이번에도 집필자는 자체 확인 뒤 로컬 산출물만 지우고 손대지 않았다.
- 이번 편집도 스크립트 줄 번호를 움직이지 않았다(문장 내부 치환 + 근거 절 확장뿐) — quiz.md 인용 행 전부 재확인, 변화 없음.

## rev7 반려 대응 요약 (2026-09-04)
검증 `verify/results/05-1-rev6.md`. 판정표 36/36·미달10·후속제목·노트인용 11/11·데이터 68값·quiz 전부 통과. 여섯 중 다섯이 notes.md, 하나는 집필자가 지운 slides.html·slides_notes.html(7회째). `assets/contracts/05-1-rev7.md` CG1~CG5 반영.
- **CG1(FAIL①)** slides.html·slides_notes.html은 오케스트레이터가 빌드하는 납품본인데 집필자 정리 습관 때문에 7번 지워졌다 — **어떤 정리 작업에서도 이 두 파일을 빌드·삭제하지 않는다**(이후 CLAUDE.md·이 notes.md에 영구 원칙으로 반영). 구조 확인은 이후 build_slides.py를 돌리지 않고 slides.md 문법 육안 검사로만 한다.
- **CG2(FAIL③)** 촬영용 notes (rev7 당시)의 「중구175.7(단독 1위)」가 CF1이 script·slides에서 이미 지운 4.65% 단정을 여기만 남겨 두고 있었다 — 「앞서는 편(4.65%, 헤지 구간)」으로 정정. 납품물을 고칠 때마다 촬영용 절도 같이 훑는다는 교훈.
- **CG3(FAIL④)** 검사 로그가 rev5 시점(「32쌍·미달9」, 「4.65% 통과·4.31% 통과」)에 고착돼 있었다 — 36쌍·미달10으로, 헤지 두 쌍은 「통과」가 아니라 「헤지」로 정정. 검사 로그는 마지막에 다시 돌린 출력으로 교체한다는 원칙을 세웠다.
- **CG4(FAIL⑤)** 절 이름 「분량 자가추정」을 「분량 — count_script.py 출력 그대로」로 개명하면서 옛 이름을 가리키던 참조 9곳(rev1~rev5 이력의 notes (rev7 당시))이 없는 절을 가리키게 됐다 — 전부 새 이름으로 갱신.
- **CG5(FAIL②·⑥)** quiz.md 인용 행 (rev7 당시)(check_notes가 「」가 든 줄을 건너뛰어 못 잡았던 자리), notes (rev7 당시) 서술 → (rev7 당시)로 수동 정정.
- slides.html·slides_notes.html은 손대지 않았다(23:26 그대로).

## rev8 반려 대응 요약 (2026-09-05)
검증 `verify/results/05-1-rev7.md`. html diff 0·데이터 68값·판정표 36·quiz 전부 통과, 남은 둘은 전부 notes.md. `assets/contracts/05-1-rev8.md` CH1~CH2 반영.
- **CH1(§0.16-a 개정)** 이력 절(rev1~rev6, rev3b·rev4b)의 줄참조는 무표기 `L###`이면 check_notes가 **현재** 줄로 검사한다 — 그래서 stale 10건이 났다. rev1~rev6·rev3b·rev4b 전 구간의 script/slides 줄참조에 전부 **`(rev N 당시)`** 마커를 붙였고, notes.md 자기참조(당시 CA3의 「구 (rev1 당시)」, CB1의 (rev2 당시), CC5의 (rev3 당시), CD2·CD6·CD7의 (rev4 당시), rev4b의 (rev4b 당시))는 **`notes L##`**로 명시한 뒤 같은 마커를 달았다. 「대본 근거 메모」·「화면 지시」·「분량」·「이름·낱말 대조」·「검사 로그」·「낭독 금지」 절(현재 상태를 설명하는 절)의 줄참조는 원래부터 무표기·현재값이라 손대지 않았다.
- **CH2** 검사 로그의 slides.html 빌드 시각(rev7에 적었던 「23:08」)이 실제 빌드(23:26)와 어긋났다 — 시각을 아예 빼고 **「이 rev 마지막에 실행」**으로만 적는다.
- 이번 편집은 이력 절 안에서만 문자열을 추가했다(치환·삽입 없이 마커만 붙임) — 줄 번호 변화 없음, quiz.md 인용 행 재확인 결과 그대로 유효. slides.html·slides_notes.html은 이번에도 빌드·삭제하지 않았다(23:26 그대로).

## rev8b 사전 검사 대응 (2026-09-05, check_notes 도구 수리 뒤)
도구가 이력 절 줄참조를 **참조 단위**(개별 `L###` 토큰)로 검사하도록 바뀌면서, rev8에서 여러 참조를 `·`로 묶고 마커를 체인 끝에 한 번만 붙인 자리들이 stale로 다시 걸렸다 — `·`로 이어진 각 토큰 뒤에 `(rev N 당시)`를 하나씩 개별로 달았다(예: `(rev1 당시)` → `(rev1 당시)`). CA7·CB1 외에도 CC2·rev3b(2)·CD4·CD7·rev4 마지막 줄·CE2·rev8 CH1 자기참조까지 같은 패턴을 전수 재검사해 전부 고쳤다(python으로 `L\d+` 뒤 `(rev`가 바로 오지 않는 자리를 찾아 재확인, `~` 범위 표기는 하나의 참조 단위로 보고 끝에만 마커). `L###~###` 범위형 참조는 구간 하나를 가리키는 단일 참조로 보고 손대지 않았다. slides.html·slides_notes.html은 이번에도 건드리지 않았다(00:16 그대로, Hans가 그 사이 재빌드).

## rev9 반려 대응 요약 (2026-09-05)
검증 `verify/results/05-1-rev8.md`. · 검사 로그·머리말·quiz 순위 전부 통과. `assets/contracts/05-1-rev9.md` CI1~CI3 반영.
- **CI1(①)** slides demo1 frame의 「업종 전체 38종」이 같은 괄호 안 「구마다 28~34종」(2020년 스코프)과 스코프가 안 맞았다 — 38은 2019·2020 합집합, 2020년 고유값은 37(python 재확인 — 「학교」는 2019년에만 있고 2020년엔 0건). **「업종 전체 37종(2020)」**으로 정정. script 는 "2019·2020년"이라고 스코프를 명시해 두어 38이 맞다 — 손대지 않음.
- **CI2(②)** 검사 로그 절 제목이 「rev7 재확인」에 고착돼 있었는데 이번 rev가 그 안을 다시 고쳤다 — 제목을 **「검사 로그 (rev9, 마지막 실행)」**로. `python3 assets/tools/check_notes.py`의 실제 출력 전체를 로그 안에 붙여넣고, 붙여넣은 뒤 다시 한번 돌려 같은 출력인지 확인(검사 로그 절은 도구의 집계 대상에서 제외돼 있어 내용을 더해도 결과가 같아야 한다 — 확인 완료).
- **CI3(③)** script.md 머리말 「상태 | 초고」가 rev9까지 와서도 안 바뀌어 있었다 — **rev9**로, 인용 계약 목록도 `05-1-rev1.md~rev9.md`(누적 CA1~CI3)로 갱신. 도구가 안 보는 자리라 사람이 직접 훑어야 한다는 게 이번 rev의 교훈.
- (참고) check_notes 이력 절 검사 2/89는 도구 설계다 — 「(rev n 당시)」 표기는 검사 면제가 맞다. 남는 위험은 정직성(마커를 붙여 놓고 실제로 다르게 쓰지 않는 것)이라 §0.16-a에 그대로 적어 둔다.

## rev9b 사전 검사 대응 (2026-09-05, quiz 순위 규칙)
COMMON §0.14 신설: 정답 길이 순위(1=최장)가 같은 문항 ≤ 2/5. build_quiz.py 출력 「2위 3·1위 1·4위 1」로 2위가 3/5 — 문턱 초과. Q1 오답1(「모으고 · 고르고 · 알린다」 15자 → 「자료를 모으고 · 고르고 · 알린다」 19자)로 정답 순위 2→3위, Q3 오답2·3(43·45자 → 56·53자)로 정답 순위 2→4위로 흩었다. 재측정 분포 1위1·2위1·3위1·4위2, 어느 순위도 40%(2/5) 넘지 않음. 기존 네 지표(ratio≤1.3·max/min≤2.0·sole_longest≤1/5·longest-and-obvious≤일부)도 재확인, 전부 유지.
**도구 미실행 고백** — `uv run --with openpyxl --python 3.12 python build_quiz.py`가 이 세션 sandbox에서 매번 거부돼 진짜 도구 출력을 못 얻었다. build_quiz.py의 `parse`/`check` 함수를 소스에서 직접 로드해 실행(경고 0)하고, `main()`의 rank_hist 집계 로직을 그대로 옮겨 손으로 돌렸을 뿐이다 — 이때 보고를 「완료」로 냈는데, **rev10 CJ2가 이걸 틀렸다고 짚었다**(도구 미실행이면 「완료」가 아니라 「미확인(uv 거부)」이어야 했고, 손 재현한 순위 분포도 부정확했다 — Q5는 최단이 아니라 최단 동률이었는데 "4위 2"로 뭉뚱그려 말했다). 이후 「완료」는 실제 도구 출력이 있을 때만 쓴다.

## rev10 반려 대응 요약 (2026-09-05)
검증 `verify/results/05-1-rev9.md`. FAIL 4·깨진 지점 5. · 검사 로그·머리말·quiz 순위는 통과. `assets/contracts/05-1-rev10.md` CJ1~CJ4 반영.
- **CJ1(①, §0.18-a 개정)** 마진%는 화면·발화·근거에 실제로 적힌 **표시값(반올림값)**으로 계산한다 — 원본 CSV 무한정밀 값이 아니다(예: 음식 밀도 중구-유성 8.167÷175.732=4.65%가 아니라 표시값 8.1÷175.7=**4.61%**). 표시값이 양 끝 다 있는 지표는 4종·16쌍(카드매출 일반음식점(원 분모)·음식 밀도·소매 밀도·소매 구성비, 각 4쌍) — 소매 구성비는 그동안 발화(1자리, 23.4/22.6)와 근거(2자리, 23.39/22.57)가 서로 다른 정밀도로 흩어져 있던 것도 1자리로 통일(동구28.9·중구28.6·대덕26.2·유성23.4·서구22.6). 16쌍을 전부 표시값으로 다시 재서 판정표·화면·발화·근거의 마진% 9곳(3.36→3.33·1.32→1.31·2.30→2.28·0.42→0.37·4.65→4.61·4.31→4.35·3.54→3.42(판정표)·3.54→3.42(소재, "3.5"→"3.4")·3.36→3.33(slides))을 갱신 — 밴드(묶음/헤지/그대로)는 16/16 그대로. 나머지 20쌍(표시값이 한쪽 이하만 있는 5개 지표)은 정밀값 그대로.
- **CJ2(③, §0.16)** rev9b 보고가 uv 미실행(sandbox 거부)인데 「완료」였고, 손으로 재현한 순위 분포도 부정확했다(Q5를 "4위 2"로 뭉뚱그려 최단 동률이라는 사실을 흐렸다) — 원인은 notes (rev9b 당시)에 기록. **이제부터 도구를 못 돌리면 보고에 「미확인(uv 거부)」이라 쓴다** — 「완료」는 실제 도구 출력이 있을 때만.
- **CJ3(④)** 이력 절에 rev7·rev9·rev9b가 통째로 빠져 있었다(rev6 다음이 rev8, rev8b 다음이 rev10 근거 메모로 바로 넘어감) — 세 절 전부 보강해 삽입(위 참조). 검사 로그(당시 01:16 기록)가 마지막 편집(quiz.md 01:45)보다 시간상 앞서 있었다 — 검사 로그는 **이 편의 마지막 편집 뒤, 맨 마지막에** 다시 실행해 붙인다(아래 「검사 로그」 절 참조).
- **CJ4(⑤)** script 의 「유성구는 절대 업소 수(6,231)로도 서구 다음 2위」에서 「절대 업소 수」가 마치 전체(all-category) 업소 수처럼 읽혔다 — 6,231은 **음식** 업소 수다(유성구 전체 18,949 중, 소매는 별도 4,433). 「음식 업소 수(6,231, 전체 18,949 중 소매 4,433과 별개)」로 정정, notes 근거 메모도 동기화.
- ②(check_notes 이력 검사 2/89)는 도구 설계라 정상이다 — 「(rev n 당시)」 표기는 검사 면제가 맞다. 정직성 책임은 §0.16-a에 명시.
- slides.html·slides_notes.html은 이번에도 건드리지 않았다.

## rev11 반려 대응 요약 (2026-09-05)
검증 `verify/results/05-1-rev10.md`. FAIL 5(①시점 한 줄·②머리말·③(rev11 당시) 15/16·④notes 검사로그 숫자 2건·⑤notes 0~5 문턱). 마진 표시값 16/16·데이터 재현·quiz·빌드 diff 0은 전부 통과. `assets/contracts/05-1-rev11.md` CK1~CK5 반영.
- **CK1(①, §0.18-a)** 업소(2026-06)와 인구(2026-07) 시점이 한 달 다르다는 사실이 이 편 어디에도 없었다 — (rev11 당시)(축자 「소매는... 가장 낮습니다」) 다음, (rev11 당시)(분모를 업소 구성비로 바꾼 재검사) 다음에 (축자, 시점) 한 줄 신설: "업소는 6월, 인구는 7월 값입니다. 한 달 차이지만 아까 본 얇은 마진(소매 밀도 0.37%)은 대덕 인구 687명이면 뒤집힙니다 — 그 한 달치 이동과 같은 크기입니다."(대덕 소매밀도 2199/(P/10000)=133.7 → P=164,510, 163,823과 차이 687 — python 재확인). slides demo3 src에 인구 시점 「2026-07」 추가. 이 삽입으로 script.md (rev11 당시) 이후 줄 번호가 전부 +3 밀렸다 — quiz.md 인용 행((rev11 당시)→**(rev11 당시)**, (rev11 당시)→**(rev11 당시)**), 화면 지시 10~13번((rev11 당시)→**(rev11 당시)**), 낭독 금지((rev11 당시)→**(rev11 당시)**), 근거 메모 1인 가구 결여 인용((rev11 당시)→**(rev11 당시)**), 검사 로그의 근거 절 줄참조((rev11 당시)→**(rev11 당시)**) 전부 재확인·갱신.
- **CK2(②, 2회 연속)** script 「rev9」→**rev11**로, 인용 계약 목록에 `~rev11.md`(누적 CJ1~CJ4·CK1~CK5)까지 추가. **이 편집을 이번 rev의 맨 마지막 편집으로 수행한다** — notes (rev9 항목)에 이미 적어 둔 규칙을 이번엔 실제로 지켰다.
- **CK3(③)** 근거 절(script, §0.18-a 도입부)의 "15/16이 정밀값과 다르게 나왔다"는 기준(소수 몇 자리)을 안 밝혀 부정확했다 — python으로 16쌍 전부 재계산(원표 인구·업소수로 직접, `shops_2026-06_clean_gu_category.csv`): **마진%를 소수 2자리로 적으면 16/16이 정밀값과 다르고, 소수 1자리로는 8/16만 다르다**(반올림 자리가 성길수록 표시값·정밀값 차이가 자리 안에 묻힌다). script 근거 절에 「소수 2자리 기준 16/16」으로 정정, 1자리 기준 8/16은 괄호로 남겼다.
- **CK4(④)** 검사 로그 두 숫자가 틀렸다 — ⓐ why 큰따옴표 인용 개수 "5개"는 오기, `grep -o '"[^"]*"' quiz.md`로 재계산하면 **7개**(Q1~Q5 각 1개씩). ⓑ 정답 길이 순위 분포 "4위2"는 rev9b가 Q5(동률)를 4위로 뭉뚱그린 손 재현의 오류였다 — 4보기 글자수를 python으로 직접 세어 build_quiz.py의 순위·동률 판정 로직 그대로 재현(**uv run --with openpyxl은 이번 rev도 sandbox가 거부해 실행 못 함**, 로그에 「미확인(uv 거부, python 직접 재현으로 대체)」로 표기): 1위1(Q2)·2위1(Q4)·3위1(Q1)·4위1(Q3)·동률1(Q5) — 어느 순위도 2/5 안, rev10 로그가 「4위2」로 적은 건 Q5(동률)를 4위 쪽에 합산한 것.
- **CK5(⑤)** 검증 원문 FAIL⑤: notes (분량 절)·(검사 로그 절)의 「0~5 문턱」이 build_slides.py의 현행 문턱(0~6)보다 한 rev 낡아 있었다 — 두 줄 다 「현행 0~6」으로 정정, 근거로 build_slides.py 원문 인용을 붙였다. 둘 다 「이력 절」이 아니라 현재 상태를 설명하는 절이라 (rev n 당시) 면제 대상이 아니라는 검증자 지적에 동의 — 마커를 붙이지 않고 실제로 고쳤다.
- CK1 삽입으로 시연 분량이 늘어 총량이 28.74분(rev6b)→**29.09분**대로 다시 올라갔다 — 25~30분 범위 안, `minutes: 29`는 그대로 유효(반올림 일치). 아래 「분량」·「검사 로그」 절은 이 rev의 마지막 편집(script.md 최종 확정) 뒤 다시 실행해 갱신한다.

## rev11b 사전 검사 대응 (2026-09-05, §0.14 절대어 문턱 1건)
COMMON §0.14 절대어 분리 금지 문턱이 「정답 0/5 vs 오답 8/15」류 극단만이 아니라 **1건**(절대어가 오답에만 있고 정답엔 하나도 없는 문항이 하나라도 있으면 경고)으로 내려왔다 — quiz.md 오답 2/15가 걸렸다: Q2 오답2 "...결과는 **항상** 똑같이 나온다", Q3 오답4 "...통계 수치로 **전부** 계산해 알려주었다"(둘 다 정답엔 절대어가 없는 문항). 정답에 같은 밀도로 절대어를 넣으면 문항 성격이 바뀌므로(정답 문장 자체가 대본 축자 인용), 대신 두 보기에서 절대어를 뺐다 — Q2 오답2 "항상" 삭제(「어느 쪽으로 나눠도 결과는 똑같이 나온다」로, 오답 취지 불변), Q3 오답4 "전부" 삭제(「...통계 수치로 계산해 알려주었다」로, 오답 취지 불변). COMMON §0.14 절대어 목록(항상·언제나·예외 없이·반드시·전부·자동으로·저절로·정해져 있·원래부터·미리) 전체로 quiz.md 4보기×5문항 재검색 → 남은 자리는 mc5 why 문단 안 「전부」(대본 축자 인용 그대로, 채점 대상인 4보기 밖이라 절대어 검사 대상 아님) 하나뿐, 4보기 안에는 0건.
편집 뒤 길이 지표 재계산(python, build_quiz.py 판정 로직 재현): ratio(정답/오답평균) 5문항 모두 1.3 이내(0.92·1.14·0.97·1.05·0.89), max/min 5문항 모두 2.0 이내(1.36·1.24·1.12·1.61·1.24), sole_longest 1/5(Q2, 불변), 정답 길이 순위 분포 1위1(Q2)·2위1(Q4)·3위2(Q1·Q3)·동률1(Q5) — 어느 순위도 2/5 초과 없음(rev9b 기준 통과 유지). **uv run --with openpyxl은 이번에도 sandbox 거부 — 미확인(uv 거부, python 직접 재현으로 대체)**.
quiz.md why 인용문은 옵션 텍스트가 아니라 변경 없음 — 7개 그대로, 원문 대조 재확인.

## rev12 반려 대응 요약 (2026-09-05)
검증 `verify/results/05-1-rev11.md`. FAIL 네 건 — 넷 다 「고친 뒤 재측정을 안 한」 형태(clock 개별값·근거 자기검산·검사 로그·미확인 절). 시점·머리말·절대어·데이터 36쌍·html은 전부 통과. `assets/contracts/05-1-rev12.md` CL①~CL④ 반영. **이번 rev는 마지막에 도구를 다 돌리고 그 출력으로 notes를 채운 뒤 끝냈다.**
- **CL①(①)** slides.md chapter2 `clock: 16:00`이 rev4 CD7(조작 172→220초, +48초)을 반영 안 한 잔재였다 — 시연 실측 = 발화 13.07분 + 조작 220초(3.67분) = **16.74분 → 반올림 17**로 `clock: 17:00` 정정. clock 합 6+17+2=**25**, `minutes: 29`와 판정식 29−25=**4**(0~6 문턱 안) 재확인. 판정식(clock 합 vs minutes)만 보고 개별 clock을 실측과 대조하지 않은 게 이 결함이 rev3b부터 8개 rev를 살아남은 원인 — 앞으로는 clock 개별값도 시연 발화·조작 합과 직접 대조한다.
- **CL②(②)** script (rev12 당시)의 「1자리 기준 9/16」이 틀렸다 — 이미 2자리로 반올림한 마진값(예: 10.85)을 다시 1자리로 반올림(10.85→10.9)하는 **이중 반올림** 오류였다. 표시값 원값에서 목표 자리로 **한 번만** 반올림해 정밀값과 비교하도록 다시 계산(python, `card_sales_utf8.csv`·`shops_2026-06_clean_gu_category.csv`) — **2자리 16/16, 1자리 8/16**, 계약 rev11 수치와 정확히 일치. 소매밀도 서구-유성 1쌍(표시값 마진 10.8452%를 1자리로 바로 반올림하면 10.8, 정밀값도 10.8)이 갈렸던 자리였다.
- **CL③(③)** notes 검사 로그의 quiz 순위 분포가 rev11 당시 notes (rev11 당시)("4위1")과 rev11b 당시 notes (rev11b 당시)("3위2") 사이에서 rev11b 편집(Q3 오답 글자수 변경으로 정답 순위 이동) 뒤 도구를 다시 안 돌려 두 줄이 서로 모순이었다 — **3연속**(rev10 CJ3 순서 → rev11 CK4 숫자 2개 → rev11 자체의 이 값)째 같은 유형. 이번 rev는 uv를 다시 시도했으나(rev11·rev11b에 이어 3회 연속) sandbox가 거부해, **손 재현을 중단하고** 검사 로그에 「미확인(uv 거부) — 오케스트레이터 실행 요청」한 줄로 남겼다 — quiz.md는 rev11b 이후 내용 변경이 없다.
- **CL④(④)** notes.md 「미확인」 절이 「없음」인데 검사 로그 안에는 「미확인(uv 거부, ...)」 문장이 두 곳(rev11 당시 notes (rev11 당시)·rev11b 당시 notes (rev11b 당시), 이제는 하나로 정리) 흩어져 있었다 — §0.14 「미확인 항목을 미확인 절 밖에 두고 완료 보고하면 그 자체로 실패」. 「미확인」 절에 build_quiz.py 미실행 항목을 정식으로 옮겼다(아래 참조).
- 검사 로그·「분량」 절은 이 rev의 모든 편집을 마친 뒤 count_script.py·check_notes.py를 실제로 재실행해 그 출력으로 채웠다(아래 절 참조, stale 0 확인).

## rev13 반려 대응 요약 (2026-09-05, quiz 중심 — script·slides 미변경)
검증 `verify/results/05-1-rev12.md`. FAIL 두 건, CL①~CL④ 4/4·데이터 재현 0 불일치·빌드 diff 0·clock 17·검사 로그는 전부 통과. 본문(script.md·slides.md)은 끝났다고 명시돼 diff 0로 유지. `assets/contracts/05-1-rev13.md` CM1~CM2 반영.
- **CM1(①, §0.14 단정 서술 4계열 — 배타)** quiz.md 배타 조사(「만·뿐·오직」)가 Q2 오답 2개·Q4 오답 3개(전부)에 몰리고 정답 5개엔 0개였다 — Q4는 오답 3/3 전부에 「만」이 있어 「만 든 보기 지우기」만으로 정답률 100%(전체 기대 정답률 45%, 무작위 25% 대비). Q2 오답1 「정보만 봐도」→「정보를 봐도」, 오답2 「것뿐이라」→「것이라」. Q4 오답1 「저녁 시간에만」→「저녁 시간에」, 오답2 「주문만 시키는」→「주문을 시키는」, 오답4 「한 번만 들르는」→「한 번 들르는」 — 전부 배타 조사만 빼고 오답의 뜻은 그대로(사람 묘사가 그대로 안 들어가는 사람이다). 편집 뒤 quiz 전수 재검색 결과 4보기 안 「만(단독 조사)·뿐·오직」 0건(Q2 오답4 「어렵지**만**」은 양보 어미 「-지만」이라 배타 조사가 아니다 — §0.14가 규정한 정규식 그대로 제외). 길이 지표는 여유를 두라는 지시대로 재확인만: ratio 전부 1.3 이내, max/min 전부 2.0 이내, sole_longest 1/5(Q2, 불변), 순위 분포 1위1·2위1·3위2·동률1(2/5 상한 그대로) — 상한을 넘지 않았다.
- **CM2(②)** 검증 원문에서 직접 확인: notes.md 「검사 로그」 절 제목이 `(rev11b, 마지막 실행)`에 고착돼 있었는데 내용은 이미 rev12 것(rev12 두 번째 항목·count_script/check_notes rev12 출력)이었다 — CL①~CL④가 고친 「고친 뒤 재측정 안 함」과 같은 패턴이 검사 로그 라벨 자체에서 한 번 더 났다. 제목을 `(rev13, 마지막 실행)`으로 정정. §0.16-a: 검사 로그 절은 도구 집계에서 제외되므로(`check_notes.py`가 이 절을 안 본다) 라벨·내용 정합은 사람이 직접 맞춰야 한다는 게 재확인된 교훈.
- 이번 rev는 quiz.md만 편집했다 — script.md·slides.md는 rev12 그대로(diff 0, 계약이 「본문은 끝났다」고 명시). quiz.md why 인용 7개·인용 행 8조각은 옵션 텍스트 변경과 무관해 불변, 원문 재대조로 확인.

## rev14 반려 대응 요약 (2026-09-05)
검증 `verify/results/05-1-rev13.md`. FAIL 두 건. 데이터 재현 0 불일치·quiz 지표·빌드·check_notes는 전부 통과. `assets/contracts/05-1-rev14.md` CN1~CN2 반영.
- **CN①(①)** script·근거의 「업종 전체 38종 … 구마다 28~34종」이 서로 다른 스코프였다 — 38은 2019+2020 합집합(그 경우 구별 범위는 30~34), 28~34는 2020 단독(그 경우 전체는 37). 카드매출 장면이 「2020년 값을 쓴다」로 이어지므로 **2020 단독(37종·28~34종)으로 통일**했다 — "업종은 전체로 38종" → "이 사람이 보는 2020년 기준으로 업종은 전체로 37종", 에 세 스코프(2019 단독 38·29~33 / 2020 단독 37·28~34 / 합집합 38·30~34)를 전부 명시하고 이 편은 2020 단독을 쓴다고 못박았다. slides 는 이미 rev9 CI1에서 「37종(2020)」·「28~34종」으로 2020 단독 통일이 돼 있어 손대지 않았다 — 문제는 script만이었다. notes (rev9 당시 CI1)의 「script 는 스코프를 명시해 두어 38이 맞다 — 손대지 않음」은 분자(38)만 스코프에 맞추고 분모격인 범위(28~34)는 재지 않은 채 넘긴 판단 오류였다 — 이 rev14 항목으로 정정한다(과거 rev9 블록 자체는 당시 판단 기록으로 남겨 두고 고치지 않는다).
- **CN②(②)** 검증 원문에서 직접 확인: script (축자) 「그 한 달치 이동과 같은 크기입니다」가 근거 없는 외부 사실이었다 — `assets/market.md`·`assets/sources.md`·`assets/data/daejeon/README.md`·이 편 script·notes 전수 grep(`전입|전출|인구 이동|순이동`) 결과 자치구별 월 이동 값은 0건(대전 시 전체 연간 전입 8만은 market.md에 있지만 그마저 폐기 프레임 반박용 시 전체 수치라 「한 달치」·「구 단위」 어느 쪽도 아니다). 인구가 2026-07 단일 스냅숏이라 애초에 시계열 비교가 불가능하다 — 그 구절을 삭제했다. 부수: 같은 문장 안에서 마진 0.37%(표시값 134.2/133.7 기준)와 인구 687명(정밀값 133.6698 기준)이 서로 다른 잣대였다 — 표시값 기준으로 다시 재서 **687→650명**으로 정정, 0.37%와 같은 기준으로 통일했다(python 재계산: 2199/((163823+X)/10000)=133.7 → X=649.7≈650).
- 총량은 늘리지 않는다는 지시대로 이번 편집은 문장 내부 치환·삭제뿐(순증가 거의 0, 오히려 한 구절 삭제로 순감, 근거 절이라 count_script 집계 밖) — count_script.py로 실측 재확인(아래 절 참조).

## rev15 반려 대응 요약 (2026-09-05)
검증 `verify/results/05-1-rev14.md`. FAIL 세 건 — 셋 중 둘은 오케스트레이터 문서(계약·README)가 마진 없이 준 문장이 원인. CN1·CN2 이행·데이터 재현 0 불일치·빌드 diff 0은 전부 통과. `assets/contracts/05-1-rev15.md` CO1~CO3 반영.
- **CO①(①, §0.14 관문 개정)** quiz 관문이 「영상 없이 찍기 기대 정답률(최대 전략) ≤ 35%」 하나로 바뀌었는데, 「길이 3위」 전략이 50%였다(Q1·Q3·Q5 정답이 전부 세 번째로 긴 보기, Q5는 동률 처리로 0.5 가중). 하위 8개 세부 지표는 전부 통과 상태였다 — 관문이 개별 지표를 다 막고도 뚫리는 사례. Q3 오답4(rev13에서 이미 배타 조사를 뺀 자리)에 "매번" 한 단어를 더해 50→53자로 늘려 정답(52자)을 4위로 옮겼다 — 새 분포 1위1(Q2)·2위1(Q4)·3위1(Q1)·4위1(Q3)·동률1(Q5), 어느 길이-순위 찍기 전략도 20%(1/5)를 넘지 않는다. "매번"은 COMMON §0.14 4계열(구조단정·배타·전면부정·빈도강도) 어디에도 안 걸리는 낱말인지 재확인(빈도·강도 목록 「항상·언제나·예외 없이·반드시·전부·자동으로·저절로·정해져 있·원래부터·미리」에 없음). 관문 전체(8전략 가중합)는 build_quiz.py 고유 계산이라 uv 거부 상태에서는 손으로 재현하지 않는다 — 「미확인(uv 거부)」로 남긴다.
- **CO②(②, §0.18-a 감사 범위 구멍)** script (축자)·근거 · slides 가 「2019년엔 서구가 중구를 앞질러 순서가 바뀐다」고 순위를 단정했는데, 이 쌍(서구33.80%–중구32.61%)의 마진은 표시값 3.55%·근거표기값 3.52%·정밀값 3.54% 전부 4% 미만이었다. 원인은 §0.18-a 감사 범위(36쌍=9지표×4쌍)가 전부 2020년 스코프 지표만 담아, 대본이 대조군으로 인용하는 2019년 카드매출 일반음식점 비중 자체가 지표 목록에서 빠져 있었던 것 — 지표를 **10종·40쌍**으로 넓히고 이 쌍을 미달(11쌍째)로 새로 등재했다. 축자를 「서구가...중구를...앞질러 순서가 바뀝니다」→「서구 33.8퍼센트와 중구 32.6퍼센트가 비슷합니다. 2020년과 다른 그림이라...」로 정정·slides 도 같은 방향으로 묶음 서술로 바꿨다. 부수로 2019년 4쌍 전부(유성–서구 21.58%·서구–중구 3.55%·중구–동구 4.08%(헤지)·동구–대덕 8.49%)를 판정표·헤지 목록에 추가했다.
- **CO③(③, §0.14 미확인 0)** notes 「미확인」 절의 「quiz.md는 rev11b 이후 내용 변경이 없다」가 거짓이었다 — rev13 CM1이 실제로 보기 5줄을 고쳤다(같은 notes 파일의 검사 로그 절이 이미 그 사실을 적어 두고 있어 자기모순이었다). 그 문장을 삭제하고, 이번 rev까지의 quiz.md 변경 이력(rev13 CM1·rev15 CO1)을 정확히 적은 뒤, 「이전 rev 출력이 유효할 것으로 추정」이라는 표현 자체를 더 이상 쓰지 않기로 했다 — 도구를 못 돌리면 그 사실만 「미확인」에 남기고 결론을 추정하지 않는다.
- 총량은 CO2 편집(축자 확장)으로 늘었다가, 「늘리지 마라」 지시대로 같은 문장을 더 짧게 다시 써서 오히려 6,253→**6,243자**로 순감시켰다(아래 「분량」 절 참조) — 여유가 45초에서 48초로 늘었다.

## rev16 반려 대응 요약 (2026-09-05)
검증 `verify/results/05-1-rev15.md`. FAIL 세 건, 그중 하나(slides.html이 rev14 빌드본이었던 것)는 오케스트레이터 몫 — Hans가 재빌드했고 「배분 직전 오케스트레이터 재빌드」를 §0.5에 못박았다고 계약이 알려왔다. 찍기 기대 30.0%·40쌍·전부 통과. `assets/contracts/05-1-rev16.md` CP1~CP3 반영.
- **CP①(②, §0.18-a 시계열 조항)** script (축자)의 임계 인구 「대덕 인구 650명」이 절대 인구수였다 — COMMON §0.18-a(5894d36)가 「비율로만」을 요구한다. 650÷163,823=0.3968%≈**0.40%**로 바꿔 「대덕구 인구의 0.40%면 뒤집힙니다」로 정정. 650이라는 값 자체는 rev14 CN2에서 이미 맞게 재계산된 것이라 손대지 않고, **표기 형태만** 고쳤다.
- **CP②(③, §0.16-a 도구 서술 정직성)** notes(검사 로그·미확인 절 두 곳)가 「관문(8전략 가중합)」이라고 도구 동작을 잘못 단정했다 — 실제로는 번호 찍기 4종을 뺀 **16종 전략 중 최대값**이다(가중합 아님). uv를 못 돌리는 채로 도구 내부 로직을 확정형으로 적은 것 자체가 §0.16-a 위반 — 계약이 준 정확한 문구 「미확인(uv 거부) — 오케스트레이터 실행: 최단 30.0%」로 두 곳 다 교체했다.
- **CP③(깨진 지점 ㉮, §0.4 개정)** 촬영 최대치 계산에 챕터 전환 슬라이드 3장(각 10초, slides.md 챕터 노트 「10초. 챕터 전환.」) 30초가 빠져 있었다 — script.md에 화면 지시가 없어 count_script.py가 못 세는 구간이다. 30초를 더하면 여유가 48초(계산 오류)→17초로 줄어든다. 도입 · 시연의 요점 문단을 다듬어 발화 76자를 줄였다(정리 구간은 배정비가 이미 0.95로 빠듯해 손대지 않음) — 새 총량 28.74분 + 인트로·아웃트로 10초 + 챕터 전환 30초 = **29.41분, 여유 35초**(계약 요구 「최소 30초」 충족).
- 이번 편집은 문장 내부 치환뿐이라 script.md 줄 번호 변화 없음(화면 지시 13곳·quiz 인용 행 전부 재확인, 그대로 유효) — 아래 「분량」·「검사 로그」 절만 도구 재실행으로 갱신.

## rev16b 사전 검사 대응 (2026-09-05, quiz 표면 특징 관문)
빌더 quiz 관문이 표면 특징 일반화(쉼표·따옴표·괄호·조건형 표지·종결형·글자 수·어절 수 각각 고르기/지우기/최다/최소)로 바뀌었다 — 「쉼표 최다」 전략이 70%였다(오케스트레이터 실측). script.md·slides.md는 손대지 말라는 지시대로 quiz.md만 편집했다.
- python으로 4보기×5문항의 쉼표(`,`) 개수를 직접 세어 재현: Q3 정답1(52자)만 쉼표 1개·나머지 3보기 0개(유일 최다) · Q4 정답3(30자)만 쉼표 1개·나머지 3보기 0개(유일 최다) — 이 둘이 편중의 원인이었다(Q1·Q2·Q5는 이미 쉼표가 전부 0개거나 전부 1개라 무신호). 4계열이 아니라 처음 겪는 새 관문이라 정확한 가중치는 모르지만, 「유일 최다 2문항」만으로도 그 두 문항은 100% 찍히고 나머지 3문항은 기저 25%이므로 (100+100+25+25+25)/5=**55%** 이상은 확실히 넘는다.
- Q3 정답1 "…바꿔 다시 물어도, 나이와…" 쉼표 삭제(문장 흐름은 그대로 유지, "…물어도 나이와…"), Q4 정답3 "점심 12시, 연구단지…" 쉼표 삭제("점심 12시 연구단지…") — 둘 다 쉼표를 없애 5문항 전부 「보기 4개 쉼표 개수 동일(0개 또는 전부 1개)」로 맞췄다. 재계산 결과 쉼표 전략 점수 **25%**(모든 문항이 4지 동률이라 기저 확률과 같다) — 35% 문턱 아래.
- 따옴표·괄호: 4보기 안에 원래 0건(재확인). 조건형 표지(-면·-라면·-다면 류): 4보기 안 0건. 종결형: 전부 「-다」 계열 평서형 반말체로 통일(Q3·Q4는 이미 그랬고, 이번 편집도 어미를 안 건드려 그대로). 글자 수·어절 수 기반 지표(정답 순위 분포·ratio·max/min·sole_longest·sole_shortest)는 이번 편집으로 재확인: Q3 lens [51,55,56,53]→정답 4위(불변, 52→51로 1자 줄어도 여전히 유일 최단), Q4 lens [36,24,29,25]→정답 2위(24→29 순서 그대로), 나머지 세 문항 불변 — 순위 분포 1위1·2위1·3위1·4위1·동률1 그대로 유지, ratio·max/min 전부 기존 문턱 안(직접 재계산 확인).
- **미확인** — 이 관문(쉼표·따옴표·괄호·조건형·종결형·글자수·어절수 각 항목의 정확한 계산·가중치)은 이번 rev에서 처음 등장한 도구 로직이라 build_quiz.py를 실제로 돌려야 확정할 수 있다. `uv run --with openpyxl --python 3.12`를 재시도했으나 여섯 번째 rev 연속 sandbox 거부 — 「미확인(uv 거부) — 오케스트레이터 실행 요청」으로 남긴다. 위에 적은 쉼표 전략 25%는 python 직접 계산이지, 도구 출력이 아니다.
- (관찰, 이번 rev 범위 밖) Q5 정답 "행동 축 — 헬스장에 온 목적이 **다르다**"만 "다르다"를 쓰고 나머지 세 보기는 전부 "갈랐다/갈렸다"(같은 어근)를 쓴다 — 낱말 선택의 우연한 편중이라, 이번 지시(쉼표만)의 범위 밖이지만 다음 quiz 반려 때 참고하도록 여기 남겨 둔다.

## rev16c 사전 검사 대응 (2026-09-05, 쉼표 최다 재발)
rev16b 뒤에도 「쉼표 최다」가 40%였다 — 오케스트레이터가 쉼표뿐 아니라 **가운뎃점(·)까지 합쳐** 센다는 걸 이번에 알았다. python으로 재계산(쉼표+가운뎃점 합산, 문항별 정답 vs 오답 최다 그룹 소속 여부): Q1은 4보기 전부 가운뎃점 2개로 이미 동률(정답도 최다 그룹에 있지만 오답 셋과 완전히 같다) · **Q2만 정답(가운뎃점 1+쉼표 1=2)이 오답 셋(쉼표만 1)보다 유일하게 많았다** — 이 두 문항(Q1·Q2)이 「정답이 최다 그룹」에 드는 자리였고, Q1은 이미 동률이라 손댈 게 없어 실제 편집은 Q2 하나였다.
Q2 정답 "나이·성별처럼" → **"나이나 성별처럼"**(가운뎃점 삭제, "나" 추가로 자연스러운 어순 유지) — 4보기 전부 쉼표+가운뎃점 1개로 동률이 됐다. 재계산 결과 쉼표·가운뎃점 전략 점수 **25%**(문턱 35% 아래, Q1~Q5 전부 4보기 동률). 길이 지표(순위분포 1위1·2위1·3위1·4위1·동률1 그대로 · ratio 최대 1.16 · max/min 최대 1.50 · sole_longest 1/5·sole_shortest 1/5) 재계산 결과 불변 — 정답 길이만 68→69자로 1자 늘었을 뿐 순위·문턱 전부 그대로. **관문 전체(따옴표·괄호·조건형·종결형·글자수·어절수 6종의 정확한 계산·가중치)는 여전히 uv 거부(일곱 rev 연속)라 미확인** — 쉼표·가운뎃점 항목만 python 직접 계산으로 확인했다.

## rev17 반려 대응 요약 (2026-09-05, 계약 파일 없이 — 오케스트레이터 직접 지시 셋)
quiz는 빌더 30%로 이미 통과, 손대지 않았다.
- **(1) 도입 노트 시간 합 +11.3%(±10% 밖)** — slides.md 도입 노트 합 266초(cover10+goal95+result161) vs 도입 실측 238.96초(발화 929자÷250×60=222.96초 + 조작 16초) = 1.1132배. result 노트를 161초→**140초**로 줄여 합 245초, 245/238.96=**1.0253배**(±10% 안)로 정정. goal·cover는 손대지 않았다.
- **(2) notes 검사 로그 수치 둘이 실측과 어긋났다** — check_notes.py의 「검사 절」 집계 수(당시 값 오기)와 「순감 76자」→**74자**(rev15 종료 6,243자 → rev16 CP1이 +2(650명→0.40% 표기) → CP3가 −76(도입 · 시연) → 순계 6,243−74=6,169, 이전에는 CP3의 사내부 소감분(−76)만 적고 CP1의 +2를 안 더해 순감을 과대 계산했다). 둘 다 도구 실제 재실행(count_script.py·check_notes.py) 출력으로 교체 — 정확한 개수는 산문에 다시 적지 않고 검사 로그의 도구 출력만 본다.
- **(3) 30초=0.50분(0.30분 아님)** — rev16 계약 원문 자체의 예시 계산(「29.71+0.30≈30.0」)이 30초를 0.30분으로 잘못 환산한 것이었다. 집필자의 rev16 계산은 애초에 0.50분을 정확히 썼다(28.74+0.17+0.50=29.41분, 여유 35초) — 총량·여유 값 자체는 바뀌지 않고, 계약 자체의 단위 오기였다는 사실만 근거 절에 남겼다.

## rev18 반려 대응 요약 (2026-09-05, 계약 파일 없이 — 오케스트레이터 직접 지시 둘)
quiz는 통과(빌더 30%), 손대지 않았다.
- **(1) script 임계 인구 0.40%가 어느 기준으로도 안 나왔다** — 이전 두 rev가 실제 소매 업소 수(2,199, 원자료 값)와 표시값 밀도(134.2/133.7)를 섞어 썼다(rev14 CN2: 2199/((163823+X)/10000)=133.7 → 650명 → rev16 CP1: 650÷163,823=0.40%로 표기만 바꿈). Hans가 준 「표시값 둘만으로 완결」 방식으로 다시 계산: 134.2×163,823/10,000=2,198.5(표시값에서만 나온 업소 수, 실측 2,199이 아니다) → 2,198.5/133.7×10,000=164,435 → +**612명** = **0.37%**. script 를 「대덕구 인구의 0.37%」로 정정, 근거 절에 이 산출식을 새 문단으로 신설(script) — 발화·근거 절·notes 세 곳 모두 0.37%로 통일.
- **(2) notes 「검사 로그(rev17)」 절의 손 계산 수치 3개 + rev17 요약 수치 1개가 실측과 어긋났다** — quiz 4보기 글자수 hand-calc(Q2 68→**69**·Q3 정답 52→**51**·Q4 정답 30→**29**, 전부 rev16b·rev16c 쉼표·가운뎃점 삭제 편집을 반영 안 한 값이었다)를 재계산해 정정. rev17 요약이 적었던 check_notes.py 「검사 절」 집계 수는 그 시점 값이었을 뿐 이후 편집으로 더 늘었다 — 정확한 값은 적지 않고 검사 로그의 도구 출력만 보기로 방법을 바꿨다(아래 참조). 검사 로그의 slides.html 확인 줄도 육안 검사 서술 대신 **스크래치패드에서 build_slides.py를 실제로 돌린 출력**(경고 0·diff 0)으로 교체 — author-c 폴더는 건드리지 않았다(rev7 CG1 원칙 유지).
- 아래 「검사 로그」는 이번 rev의 모든 편집을 마친 뒤 count_script.py·check_notes.py를 재실행한 실제 출력으로 채웠다. build_quiz.py는 여전히 uv 거부라 「미확인」.

## rev19 반려 대응 요약 (2026-09-05, 계약 파일 없이 — 방법을 바꾼다)
둘 다 notes 산문이 check_notes.py의 「검사 절 n개」 집계를 손으로 다시 적었다가 다음 rev에서 늘어난 실제 값과 어긋난 자리였다(rev17 요약 notes (rev17 당시)·rev18 요약 notes (rev18 당시)) — 도구 출력을 사람이 옮겨 적는 순간 다음 편집에서 바로 낡는다는 게 세 rev 연속 같은 형태로 났다. `check_notes.py`가 이제 노트 산문 안의 「검사 절 n개」 재서술 자체를 도구 실측과 대조해 stale로 잡는다.
- 두 요약 절이 적어 둔 check_notes.py 「검사 절」 집계치 구체 수치를 전부 지우고 「그 시점 값이었을 뿐 이후 늘었다, 정확한 값은 검사 로그의 도구 출력 참조」로 바꿨다.
- 검사 로그·미확인 절에서 「rev 연속」·「n차례」처럼 매 rev 늘어나는 스트릭 카운트를 산문으로 적던 것(uv 거부 다섯/일곱 rev 연속, quiz.md 두 차례 변경 등)을 전부 지웠다 — 도구를 못 돌린다는 사실과 「미확인」 표기만 남기고, 몇 번째인지는 세지 않는다.
- **앞으로의 규칙**: 검사 로그 절과 분량(자가측정) 절 안에서는 도구가 실제로 출력한 숫자만 코드블록에 그대로 붙인다. 그 숫자를 절 밖 산문에서 다시 옮겨 적지 않는다(옮겨 적는 순간 다음 rev의 편집이 그 산문을 낡게 만든다). 손으로 재현한 계산(quiz 글자 수 등)은 그 필요성이 있는 한 유지하되, check_notes.py가 대조하는 정확한 집계치(검사 절 개수 등)는 절대 산문에 재서술하지 않는다.
- 재실행: 아래 「검사 로그」는 이번 rev의 모든 편집을 마친 뒤 count_script.py·check_notes.py를 다시 돌린 출력이다.

## rev20 반려 대응 요약 (2026-09-05, 계약 파일 없이 — FAIL 1)
check_notes.py가 이력 절 범위 참조(「L###~###」류)의 시작 줄도 보도록 바뀌었다 — `·`로 이어진 체인은 rev8b에서 이미 토큰마다 개별 마커를 달았지만, 「~」범위는 rev8b 당시 "구간 하나를 가리키는 단일 참조"로 보고 끝에만 마커를 달았던 것이 이번 기준 변경으로 다시 문제될 수 있었다. 이력 절 전수를 다시 훑어 남아 있던 범위 참조 5곳(rev1 당시 항목 셋·rev2 당시 하나·rev3 당시 하나·rev5 당시 하나)을 전부 「시작(rev n 당시)~끝(rev n 당시)」 형태로 양끝에 마커를 달았다(위 rev1~rev5 이력 절 참조). `check_notes.py` 재실행 결과 stale 0 — 실행 시점에 별도로 걸리는 자리는 없었다(도구·수동 대조 둘 다 확인).
검사 로그의 손기록 두 건도 지웠다 — slides.html 확인 줄의 「html mtime 07:27 > slides.md mtime 07:17」(rev18에서 ls -la로 손으로 대조한 시각, 도구 출력이 아니다)을 지우고 diff 명령·결과만 남겼다. quiz 관문 줄의 「최단 30.0%」(rev15 검증 시점 값을 그대로 옮겨 붙인 것)를 지우고 「미확인(uv 거부) — 오케스트레이터 실행 요청」만 남겼다 — 실제 현재 값은 uv를 못 돌리는 한 알 수 없다.
아래 「검사 로그」는 이번 rev의 편집을 마친 뒤 count_script.py·check_notes.py를 다시 돌린 출력이다.

## rev21 반려 대응 요약 (2026-09-05, 계약 파일 없이 — FAIL 1)
검사 로그가 개정 전 도구 출력이었다(52≠53, 도구 개정 타이밍 탓). Hans가 도구를 동결하고(3편 PASS까지 수정 없음) 오케스트레이터가 직접 돌린 도구 출력 전체를 `assets/contracts/05-1-rev21-output.txt`에 남겼다 — 「검사 로그」 절을 그 파일 내용(코드블록 + 「오케스트레이터 실행 2026-09-05」 제목 한 줄)으로 그대로 교체하고, 다른 산문은 남기지 않았다. script.md·slides.md·quiz.md·notes.md의 다른 절은 손대지 않았다.

## rev22 반려 대응 요약 (2026-09-05, 계약 파일 없이)
검증자가 check_notes.py 자체의 결함을 찾았다 — 검사 로그 절에 붙인 도구 자기 출력의 줄참조 집계(「이력 절 줄참조 검사」)를 다시 세어 붙일 때마다 값이 달라졌다(53→41, 검사 로그 절이 그 집계 대상에서 완전히 빠지지 않았던 것이 원인). Hans가 check_notes.py를 고쳐 검사 로그 절을 이력 집계에서도 제외하는 고정점을 만들고, 새 출력을 `assets/contracts/05-1-rev22-output.txt`에 남겼다 — 「검사 로그」 절을 그 내용으로 그대로 교체(41개로 갱신, 나머지 출력 동일). 다른 절은 손대지 않았다.

## rev23 반려 대응 요약 (2026-09-05, 계약 파일 없이)
둘.
- **(1)** 「미확인」 절의 build_quiz.py 항목이 같은 파일 「검사 로그」 절에 이미 있는 오케스트레이터 실행 출력 전문과 모순이었다(미확인이라 적어 놓고 바로 위에 실제 출력이 있는 상태) — 그 항목을 지우고 「오케스트레이터 실행 출력 참조(위 「검사 로그」 절)」한 줄로 바꿨다.
- **(2)** 이력 절에 rev21·rev22 기록이 빠져 있었고 script.md 머리말이 rev20에 멈춰 있었다 — 이 rev21~rev23 세 절을 추가하고, 머리말을 rev23으로, 인용 계약 목록에 rev21·rev22(계약 파일 없이, 오케스트레이터 산출물 교체 지시)·rev23을 추가했다.

## 대본 근거 메모 (rev1 기준 재계산)
- 카드매출 수치는 `author-c/probe-dj/3b/data/card_sales.csv`(CP949, UTF-8 사본 `card_sales_utf8.csv`, 헤더 제외 **307행**)를 집필자가 python(csv 모듈, quote-aware) + awk로 이중 재현했다. 전문은 script.md 「근거」 절.
- 2020년 3~7월, 자치구 총매출 대비 업종 비중: 일반음식점 — 유성구 40.13%(40%)·중구 32.72%(32.7%)·서구 29.93%(30%)·동구 28.92%(29%)·대덕구 25.31%(25%). 서구 의료기관/제약 22.92%(23%). 대덕구 자동차정비/유지 10.26%(10%).
- 5구 공통 업종(2020년, 집합 교집합) **26종**. 이 26종만으로 분모를 다시 잡으면 중구 35.95%(36.0%), 나머지 구는 ±0.4%p. 원인: 대형유통이 2020년 중구에만 존재(중구 총매출의 8.15%, 369.8억/4,539.2억).
- 2019년 값: 서구 33.80% > 중구 32.61%(2020년은 중구32.72%>서구29.93%로 역전). 연도 명시 없이 섞으면 순위가 바뀐다.
- (구,업종) 쌍 기준 2019년 155개·2020년 152개, 소멸(2019만) 7개·신규(2020만) 4개, 순증감 −3 — README와 일치.
- 대덕구 자동차정비/유지가 「다른 구 상위 3에 없다」: 동구·중구·서구·유성구 네 곳 상위 3은 전부 일반음식점·소매·의료기관/제약(또는 소매) 조합, 자동차정비/유지는 대덕구 상위 3에만 있다.
- 상가업소 밀도(만명당, `shops_2026-06_clean_gu_category.csv` × README 04-3 절 원표 인구, **rev4 CD4 → rev6 CF1 → rev10 CJ1로 표시값 계산 재정정**): 음식 — **중구175.7(앞서는 편, 유성과 마진 4.61%(표시값 8.1÷175.7) — 4~6% 헤지 구간, 단독 1위 아님)** > **유성167.6·대덕165.4(같은 묶음, 마진 1.31%)** > **서구158.2·동구154.6(같은 묶음, 마진 2.28%, 대덕과의 경계도 4.35%로 헤지)**. 소매 — 중구170.7>동구155.5>**대덕구·서구는 거의 같다(134.2/133.7, 마진 0.37%)**>**유성119.2(최저)**. 유성구 음식 업소 수(전체 18,949 중)도 6,231로 서구 다음 2위(README 04-3 절, 두 값 차이 1,118로 마진 문제 없음) — 「가게가 적다」는 rev1의 오독, 정확히는 「소매만 적다」.
- 소매 밀도, 분모를 업소 구성비로 바꿔 재검사(rev4 CD3, rev5 CE1로 마진 재확인, rev10 CJ1로 표시값 1자리 통일): 동구28.9%>중구28.6%>대덕26.2%>**유성23.4%·서구22.6%(아래쪽 묶음, 마진 3.42% — 4% 문턱 미달이라 rev5에서 「4위/최저」 이중 단정을 묶음으로 정정)**(python, `shops_2026-06_clean_gu_category.csv`의 구별 전체·소매 업소수로 재계산 후 발화·slides와 같은 1자리로 반올림). 인구 분모(유성 최저)와 결론 방향은 같다 — 두 분모 모두 유성구는 하위권.
- 유성구 「연구단지」 근거(rev3 CC3 재확인): `shops_2026-06_full.csv`에서 유성구·상호명 「연구원」(국가 연구기관 한정) 포함 **40건**(python csv, quote-aware). 행정동 전체: 신성동20·온천1동7·전민동5·온천2동3·구즉동2·관평동1·노은3동1·학하동1. 업종대분류: 음식11·과학·기술11·소매9·교육6·수리·개인1·보건의료1·부동산1(전부 음식 아님). 실명 그대로: 한국전자통신연구원신용협동조**하**(원본 오타)·후니드한국화학연구원카페·아라마크한국원자력연구원2(이 셋은 업종대분류 「음식」).
- 1인 가구·가구 구성 데이터 부재 확인: `market.md` §3, `assets/data/daejeon/README.md`, `author-c/probe-dj/3b/data/` 헤더 전수 확인 — 가구원 수·1인 가구 비중 열 없음. script L101·**L253**에서 결여로 명시(rev5·rev6 근거 절 확장으로 L234(rev6 당시)→L247(rev6 당시) 이동, rev11 CK1 시점 문단 삽입으로 L247(rev11 당시)→L250(rev11 당시) 이동, rev15 CO2 판정표 행 추가로 L250(rev15 당시)→L251(rev15 당시) 이동, rev18 임계 인구 근거 문단 삽입으로 L251(rev18 당시)→L253 이동).
- 업종은 계약이 준 「카페/제과 계열 하나」 중 **카페**를 집필자가 선택(빵집은 함정 장면의 두 번째 업종으로만 등장, L167·L179).

## 화면 지시·조작 태그 (script.md 기준, rev4 — CD7 화면전환 겹침 반영)
1. L39 도입 결과물 화면 — 조작: 화면전환(8초)
2. L58 도입 막힘 장면(재구성, 촬영 시 실제로 교체, 숫자 없음) — 조작: 화면전환(8초)
3. L87 AI 채팅 페르소나 요청 — 조작: AI응답대기(30+8=**38초**, CD7)
4. L103 카드매출 표 열기 — 조작: 파일열기(20+8=**28초**, CD7)
5. L117 유성구 강조 — 조작: 화면전환(8초)
6. L122 중구 강조(분모 함정) — 조작: 화면전환(8초)
7. L131 서구 강조 — 조작: 화면전환(8초)
8. L135 대덕구 강조 — 조작: 화면전환(8초)
9. L144 상가업소 밀도 표 열기 — 조작: 파일열기(20+8=**28초**, CD7)
10. L158 타겟 문장 재작성 — 조작: 표작성(20+8=**28초**, CD7)
11. L167 AI 채팅 재질문(빵집) — 조작: AI응답대기(30+8=**38초**, CD7)
12. L183 안 들어가는 사람 목록 작성 — 조작: 표작성(20+8=**28초**, CD7)
13. L189 정리 완성본 화면 — 조작: 화면전환(8초)

합계 13개, **244초**(rev3 196초 → CD7로 +48초, 순수 화면전환이 아닌 6개 태그 전부 +8초). 구간별: 도입 16초 · 이론 0초 · 시연 220초(AI응답대기38×2=76·파일열기28×2=56·화면전환8×4=32·표작성28×2=56) · 정리 8초. 16+0+220+8=244초 확인.

## 분량 — count_script.py 출력 그대로 (rev6b: 자가추정 아님, 편집 종료 뒤 마지막에 재실행해 붙여넣는다)
- **합계 공백포함: 6,169**(count_script.py 출력, rev16 CP1·CP3 편집 반영 — rev15 종료 시점 6,243자에서 순감 **74자**(CP1이 650명→0.40% 표기로 +2, CP3가 도입 L44·시연 L105·L115 요점 문단 세 곳을 줄여 −76, 순계 −74), 챕터 전환 30초를 흡수하기 위해)
- 조작 합계 **244초**(도입16+이론0+시연220+정리8, 위 「화면 지시」 절 참조 — 이 값은 조작 태그 개수·단가에서 직접 세는 값이라 count_script.py 대상이 아니다. CK1은 발화만 추가하고 새 화면 지시를 넣지 않아 조작 합계는 불변)
- **총량(§0.14) = 6,169/250 + 244/60 = 24.68 + 4.07 = 28.74분.** (25~30분 범위 안)
- **촬영 최대치(rev16 CP3 — 챕터 전환 3장×10초=30초 추가, §0.4 개정)** = 28.74 + 인트로·아웃트로 10초(0.17분) + 챕터 전환 30초(**0.50분**, 60초=1분 기준 — rev16 계약 원문의 「29.71+0.30≈30.0」은 30초를 0.30분으로 잘못 환산한 예시 계산이었다, 집필자는 이 값을 그대로 옮기지 않고 0.50분으로 정확히 계산했다) = **29.41분. 30분까지 여유 = 35초.** (계약이 요구한 최소 30초 이상 확보 — rev15의 「48초」는 챕터 전환 30초를 빠뜨린 값이었다, rev17 사전 검사 재확인)
- **이 파일에서 총량·촬영 최대치·여유의 유일한 출처는 이 줄이다(rev5 CE4, rev6b로 세 번째 재확인).** 다른 절에서 이 세 값을 다시 적지 않는다 — 전부 이 절을 가리킨다. **규칙(rev6b): 이 줄은 자가추정이 아니라 `count_script.py` 실제 출력이다 — 이 편의 편집을 전부 마친 뒤 맨 마지막에 한 번 더 돌려서 그 출력을 그대로 옮겨 붙인다. 편집 도중에 미리 써 두지 않는다.**
- `minutes: 29`(slides.md 앞머리와 동일, chapter clock 합 **25**(6+17+2, rev12 CL①로 시연 clock 16→17 정정) 대비 차이 **4** — 현행 0~6 문턱 안, build_slides.py L271 `0 <= minutes-sum(clock) <= 6` 확인. rev11 CK5: 이 줄이 「0~5」로 한 rev 낡아 있던 것을 정정)

## 이름·낱말 대조 (§0.18)
- 「식품영양학과 졸업생」 — market.md §2 문자열 그대로(script L49)
- 업종 이름(일반음식점·의료기관/제약·자동차정비/유지·소매·대형유통) — card_sales_utf8.csv 헤더·값 원문 그대로
- 업종대분류 「음식」·「소매」 — shops_2026-06_clean_gu_category.csv 헤더 원문 그대로
- 이론 구간(L64~83) 「대전·유성·서구·중구·동구·대덕」 0회 재확인(grep)

## 검사 로그 (오케스트레이터 실행 2026-09-05)
```
$ python3 assets/tools/count_script.py author-c/ep-05-1/script.md
구간    라인                공백포함      공백제외    ÷250
도입    37-61              929       690     3.7
이론    62-84             1550      1153     6.2
시연    85-186            3216      2419    12.9
정리    187-203            474       351     1.9

합계 공백포함: 6169  ÷250 = 24.7 분
합계 공백제외: 4613  ÷250 = 18.5 분
drop log: {'heading': 4, 'screen': 14, 'boldhead': 0, 'comment': 0, 'fence': 4, 'blank': 72, 'paren': 57}

$ python3 assets/tools/check_notes.py author-c/ep-05-1
이력 절 줄참조 검사 41개
script 내부 참조 검사 0개
검사 절 37개(검사 로그 절 제외) 중 검사 대상 줄 47 · 인용 1개 · 줄참조 22개 · stale 0
exit=0

$ python3 assets/tools/build_slides.py --both author-c/ep-05-1/slides.md
author-c/ep-05-1/slides.html  슬라이드 16장 (인트로·아웃트로 포함) · 납품본 — 강사 노트 제외
author-c/ep-05-1/slides_notes.html  슬라이드 16장 (인트로·아웃트로 포함) · 강사용 — 노트 내장

$ uv run --with openpyxl --python 3.12 python assets/tools/build_quiz.py author-c/ep-05-1
author-c/ep-05-1/AX부트캠프_온라인38차시_평가문항.xlsx  1차시 · 6문항
  정답 분포  1번 1(20%) 2번 2(40%) 3번 1(20%) 4번 1(20%)
  정답이 유일 최장인 문항(길이 순위만)  1/5
  어휘 겹침(진단, 관문 제외)  어휘 겹침 최다 50% · 어휘 겹침 최소 10%
  번호 찍기(전 차시 합산 검사용)  최대 40%
  영상 없이 찍기 기대 정답률(최대 전략)  단정형 고르기 35.0%  [단정형 고르기 35% · 최단 30% · 길이3위 30% · 길이4위 30% · 숫자 고르기 30% · 단정 어미(이다·된다·있다) 최소 30% · 글자 수 최소 30% · 어절 수 최소 27% · 절대어 지우기 25% · 절대어 고르기 25% · 쉼표 최다 25% · 쉼표 최소 25% · 따옴표 최다 25% · 따옴표 최소 25% · 괄호 최다 25% · 괄호 최소 25% · 조건형(경우·수 있·때로·보였다·수도) 최다 25% · 조건형(경우·수 있·때로·보였다·수도) 최소 25% · 한자어 명사형 종결(~것·~함) 최다 25% · 한자어 명사형 종결(~것·~함) 최소 25% · 강조 부사 최다 25% · 강조 부사 최소 25% · 숫자 지우기 23% · 단정형 지우기 22% · 최장 20% · 길이1위 20% · 길이2위 20% · 단정 어미(이다·된다·있다) 최다 20% · 글자 수 최다 20% · 단정 어미(이다·된다·있다) 없는 보기 10% · 어절 수 최다 0% · 단정 어미(이다·된다·있다) 있는 보기 0%]
  정답이 유일 최단인 문항  1/5
  단정 서술 4계열(구조·배타·전면부정·빈도)  정답 1/5 · 오답 1/15
  절대어 보기  정답 0/5 · 오답 0/15
  정답 길이 순위 분포(1=최장)  1위 1 2위 1 3위 1 4위 1 동률 1
  정답이 눈에 띄게 긴 보기  0/5 (0%)
exit=0
```

## 낭독 금지
- L92 AI 출력 코드블록(재구성) — 낭독하지 않는다
- L172 AI 출력 코드블록(재구성) — 낭독하지 않는다

## 미확인
- **build_quiz.py 실행** — 오케스트레이터 실행 출력 참조(위 「검사 로그」 절).
- 카페/제과 선택은 계약이 허용한 범위 안에서 집필자가 정한 것이라 미확인으로 분류하지 않는다.
