<!-- Historical review sheets: 57 edits comprising 54 exact text replacements (42 + 12) and 3 CSV-cell updates. Original instructions below are retained with anonymization only; they include superseded wording and are not current guidance. -->
# Article 2 — 검수 결과와 수정 지시 (2026-10-24, 검수자: Claude 세션)

Phase A 보고서(`docs/ARTICLE_2_PHASE_A_2026-10-24.md`)의 [불일치] 7개는 전부 타당하다. 숫자 재계산은 일치 확인했고, 아래 수정만 적용하면 사실 검증 통과. 수정은 **찾기 → 바꾸기**를 글자 그대로 적용한다(앞뒤 문장 건드리지 않음). EN·KO·catalog·CSV 4곳. 적용 뒤 `npm run check` → `npm run build` → `npm run geo`.

## 1. Run 0 평균 반올림 (원시 67,730 ms / 5 = 13.546 s → 13.5)
- EN `| 13.6 s (incl. upload) |` → `| 13.5 s (incl. upload) |`
- KO `| 13.6초 (업로드 포함) |` → `| 13.5초 (업로드 포함) |`

## 2. 타임아웃 과금 — "월별 내역표 기준 추론"으로 표현 (5곳 × EN/KO + catalog)
### 2-a. description (frontmatter) — catalog.ts의 같은 항목 description도 **동일하게** 교체
- EN: `one 50-second timeout that was still billed, and the one model the author chose.` → `one 50-second timeout that still shows up as a billed image, and the one model the author chose.`
- KO: `50초 타임아웃 1건도 과금, 그리고 작성자가 고른 모델.` → `50초 타임아웃 1건도 과금으로 남음, 그리고 작성자가 고른 모델.`
### 2-b. 직접 답 (첫 문단)
- EN: `and hit the 50-second client timeout on the other, and **both** requests were billed;` → `and hit the 50-second client timeout on the other, while the month's usage table lists **two** billed images for that endpoint — the only two requests sent to it;`
- KO: `나머지 1장은 50초 클라이언트 타임아웃에 걸렸는데 **두 요청 모두 과금**됐으며,` → `나머지 1장은 50초 클라이언트 타임아웃에 걸렸는데 그 달 사용 내역표에는 이 엔드포인트의 과금이 **2장**으로 남았으며(그 달 보낸 요청도 2건),`
### 2-c. 표 1 C행 비고
- EN: `| Both requests billed: $0.30 for one image |` → `| Usage table: 2 billed × $0.15 = $0.30 for one delivered image (monthly aggregate, not request-level proof) |`
- KO: `| 두 요청 모두 과금: 1장에 $0.30 |` → `| 사용 내역표: 과금 2장 × $0.15 = 받은 1장에 $0.30 (월 합계 기준, 요청별 증빙 아님) |`
### 2-d. FAQ 2
- EN: `hit the 50-second client timeout on the other; both requests were billed at $0.15.` → `hit the 50-second client timeout on the other; the month's usage table lists two billed images at $0.15 for that endpoint, the only two requests sent to it.`
- KO: `나머지 1장은 50초 클라이언트 타임아웃에 걸렸으며, 두 요청 모두 $0.15로 과금됐습니다.` → `나머지 1장은 50초 클라이언트 타임아웃에 걸렸으며, 그 달 사용 내역표에는 이 엔드포인트의 과금이 $0.15 × 2장으로 남았습니다(그 달 보낸 요청도 2건).`
### 2-e. 불릿 2
- EN: `**A client-side timeout does not stop billing.** The Pro request abandoned at 50 seconds still appears in the usage table as a billed image. Budget for failures, and read the provider's queue docs before relying on cancellation.` → `**A client-side timeout did not stop billing here.** Only two requests went to the Pro endpoint that month, one of them abandoned at 50 seconds, and the month's usage table lists two billed images for it. There is no request-level invoice to prove the link, but the budget should assume failures are billed; read the provider's queue docs before relying on cancellation.`
- KO: `**클라이언트 타임아웃은 과금을 멈추지 않습니다.** 50초에 포기한 Pro 요청도 사용 내역표에 과금 1장으로 남았습니다. 실패분까지 예산에 넣고, 취소에 의존하기 전에 제공자의 큐 문서를 읽으세요.` → `**여기서는 클라이언트 타임아웃이 과금을 멈추지 않았습니다.** 그 달 Pro 엔드포인트에 보낸 요청은 2건이고 그중 1건은 50초에 포기했는데, 사용 내역표에는 과금 2장으로 남았습니다. 요청별 청구서로 연결을 증명할 수는 없지만, 예산은 실패분도 과금된다고 보고 잡아야 합니다. 취소에 의존하기 전에 제공자의 큐 문서를 읽으세요.`

## 3. 42초/50초 구조 주장 — 사실만
- EN: `**Latency decides the architecture.** At 11 seconds per image, upload, generation, and storage fit inside the app's 50-second request budget; at 42 seconds they do not.` → `**Latency sets the margin.** The app gives one generation call 50 seconds. At about 11 seconds per image that leaves room for upload, storage, and a retry; the Pro endpoint used 34.8 seconds on the image it finished and was cut off at 50 seconds on the other, leaving no margin.`
- KO: `**지연이 구조를 결정합니다.** 1장 11초면 업로드·생성·저장이 앱의 요청당 50초 예산 안에 들어가고, 42초면 들어가지 않습니다.` → `**지연이 여유를 결정합니다.** 앱은 생성 호출 1건에 50초를 줍니다. 1장 약 11초면 업로드·저장·재시도 1회가 들어가고, Pro 엔드포인트는 끝낸 1장에 34.8초를 쓰고 나머지 1장은 50초에 끊겨 여유가 없었습니다.`

## 4. 프롬프트 효과 — 인과 단정 제거
### 4-a. 불릿 1
- EN: `**Prompt scope moved the result more than model choice did.** Run 0 asked one model for a new pose, tidied hair, new clothing and a new background, and 0 of 5 outputs kept the face. Run 1 asked all models to change only two things, and the chosen output was judged the same person. Two runs with different photo counts (5 vs 2) are an observation, not a controlled experiment.` → `**The prompt was cut down between the two runs, and the result changed with it.** Run 0 asked one model for a new pose, tidied hair, new clothing and a new background, and 0 of 5 outputs kept the face. Run 1 asked all models to change only two things, and the chosen output was judged the same person. Photos, prompt and models all changed between the runs, so this is an observation, not a controlled comparison.`
- KO: `**모델 선택보다 프롬프트 범위가 결과를 더 크게 움직였습니다.** 실행 0은 한 모델에 새 자세·머리 정돈·새 의상·새 배경을 함께 요구했고 5장 중 0장이 얼굴을 유지했습니다. 실행 1은 모든 모델에 두 가지만 바꾸라고 했고 선택된 결과는 동일인으로 판정됐습니다. 사진 수가 다른(5장 vs 2장) 두 실행이므로 관찰이지 통제 실험은 아닙니다.` → `**두 실행 사이에 프롬프트를 줄였고, 결과도 함께 달라졌습니다.** 실행 0은 한 모델에 새 자세·머리 정돈·새 의상·새 배경을 함께 요구했고 5장 중 0장이 얼굴을 유지했습니다. 실행 1은 모든 모델에 두 가지만 바꾸라고 했고 선택된 결과는 동일인으로 판정됐습니다. 사진·프롬프트·모델이 함께 바뀌었으므로 관찰이지 통제 비교는 아닙니다.`
### 4-b. 표 2 실행 3 (의자)
- EN: `the chair disappeared after one sentence was added to the prompt;` → `the chair disappeared after the prompt was revised (a sentence removing furniture, plus a reworded background line for that style);`
- KO: `프롬프트에 한 문장을 추가한 뒤 의자 사라짐.` → `프롬프트를 고친 뒤(가구 제거 문장 추가 + 그 스타일의 배경 문구 수정) 의자 사라짐.`

## 5. "licensed" 삭제 + "작성자 본인 셀카" 표현 제거 (EN 3곳·KO 3곳)
- EN FAQ 3: `Yes. The September inputs were the author's own selfies and five licensed stock photos. None of those inputs or outputs are published.` → `Yes. The September inputs were private selfies (two in the four-model test, five in the earlier run) and five stock photos. None of those inputs or outputs are published.`
- EN 표 2 실행 3: `Five other faces (licensed stock photos),` → `Five other faces (stock photos),`
- EN 결과물 섹션: `The September inputs were real people (the author and licensed stock photos) and are not published.` → `The September inputs were photos of real people (private selfies and stock photos) and are not published.`
- KO FAQ 3: `예. 9월 입력은 작성자 본인 셀카와 라이선스 스톡 사진 5장입니다.` → `예. 9월 입력은 비공개 셀카(4모델 테스트 2장, 앞선 실행 5장)와 스톡 사진 5장입니다.`
- KO 표 2 실행 3: `다른 얼굴 5명(라이선스 스톡 사진),` → `다른 얼굴 5명(스톡 사진),`
- KO 결과물 섹션: `9월 입력은 실제 인물(작성자·라이선스 스톡 사진)이어서 공개하지 않습니다.` → `9월 입력은 실제 인물 사진(비공개 셀카·스톡 사진)이어서 공개하지 않습니다.`

## 6. 5월 → 9월 "멈췄다" 단정 제거
- EN: `May's usage total was $4.23 and the project then paused until September.` → `May's usage total was $4.23, and no API usage was recorded from June to August.`
- KO: `5월 사용액 합계는 $4.23이었고 프로젝트는 9월까지 멈췄습니다.` → `5월 사용액 합계는 $4.23이었고 6–8월에는 API 사용 기록이 없습니다.`

## 7. 판정 대기 → "기록 없음" (본인 사진 재검수 안 함, 확정)
표 1 열 머리·셀 3개, 표 2 열 머리·실행 4, CSV 3행.
- EN 표 1 머리: `| Same person? (author's call) |` → `| Same person? (September record) |`
- EN A행: `| pending author review | In the earlier` → `| Not recorded | In the earlier`
- EN C행: `| pending author review (one output) |` → `| Not recorded (one output) |`
- EN D행: `| pending author review | Kept the original` → `| Not recorded | Kept the original`
- EN 표 2 머리: `| What it checked — result (author's call) |` → `| What it checked — result (September record) |`
- EN 실행 4: `4 / 4 outputs returned; pending author review |` → `4 / 4 outputs returned; no verdict saved |`
- KO 표 1 머리: `| 동일인 유지? (작성자 판정) |` → `| 동일인 유지? (9월 기록) |`
- KO A행: `| 작성자 판정 대기 | 앞선 5장` → `| 기록 없음 | 앞선 5장`
- KO C행: `| 작성자 판정 대기 (결과 1장) |` → `| 기록 없음 (결과 1장) |`
- KO D행: `| 작성자 판정 대기 | 원본 고개` → `| 기록 없음 | 원본 고개`
- KO 표 2 머리: `| 확인 내용 — 결과(작성자 판정) |` → `| 확인 내용 — 결과(9월 기록) |`
- KO 실행 4: `4 / 4 결과 반환; 작성자 판정 대기 |` → `4 / 4 결과 반환; 판정 기록 없음 |`
- CSV `model-benchmark-2026-09-22.csv`: A·C·D 세 행의 `identity_same_person_author` 값 `pending` → `not recorded` (B행 `judged best of four`는 유지). 다른 열은 건드리지 않는다.

## 8. changelog 문구 (발행 전까지)
- EN: `2026-10-24: Published the 2026-09-22 four-model test and the follow-up runs on the chosen model.` → `2026-10-24: Added the 2026-09-22 four-model test record and the follow-up runs on the chosen model.`
- KO: `2026-10-24: 2026-09-22 4모델 테스트와 선택 모델 후속 실행 기록을 발행.` → `2026-10-24: 2026-09-22 4모델 테스트와 선택 모델 후속 실행 기록을 추가.`

## 9. 검사·보고
- `npm run check` → `npm run build` → `npm run geo`. draft 유지(이 단계에서는 `true`).
- 보고: 적용한 항목 번호 목록(1~8, 각 EN/KO/catalog/CSV 적용 여부) + check-geo 표. 바꾸기 문자열이 **정확히 1번** 매칭되지 않은 항목은 적용하지 말고 원문 그대로 보고.

---

## 발행 단계 (사용자가 채팅에 `발행`이라고 친 뒤에만)
1. EN·KO 두 파일: `draft: true` → `draft: false`. `verified`와 changelog 첫 줄의 날짜를 **발행 당일(KST)** 로 바꾼다. changelog 문구는 EN `Published …` / KO `… 발행.`으로 되돌린다.
2. `npm run check` → `npm run build` → `npm run geo` 통과. `dist/face-preserving-model-benchmark/index.html`·`dist/ko/…` 생성, `dist/llms.txt`와 `dist/sitemap-0.xml`(또는 빌드가 만든 사이트맵 파일)에 두 URL 포함 확인.
3. 커밋·푸시는 **사용자가 GitHub Desktop**으로 한다(메시지 예: `Publish article 2: face-preserving model benchmark`). Cloudflare Pages 자동 배포 뒤 https://recibolab.com/face-preserving-model-benchmark/ 와 /ko/ 가 200인지 확인(Codex는 확인만).
4. 그 뒤 사용자: Bing Webmaster URL 제출 2건(EN·KO) → Google Search Console URL 검사 → 색인 요청.

# Article 2 — 2차 수정 12건 + 발행 (2026-10-24)

`ARTICLE_2_EDITS_APPLIED_2026-10-24.md`의 "발행 전 남은 문장 2유형"에 동의. 아래 12건을 글자 그대로 찾기→바꾸기(EN·KO 각 6건, catalog.ts는 description 2건 동일 적용). 그 뒤 **발행 단계까지 바로 진행**한다(사용자 승인 완료).

## A. 과금 — 월별 집계 사실로만 (요청별 연결·"그 달 요청 2건뿐" 단정 제거)
1. EN description(frontmatter) + catalog.ts EN description:
   `one 50-second timeout that still shows up as a billed image,` → `two billed Pro images for one delivered output,`
2. KO description(frontmatter) + catalog.ts KO description:
   `50초 타임아웃 1건도 과금으로 남음,` → `Pro는 받은 1장에 과금 2장,`
3. EN 직접 답:
   `while the month's usage table lists **two** billed images for that endpoint — the only two requests sent to it;` → `while the month's usage table lists **two** billed images for that endpoint — the only two Pro requests in the saved run reports;`
4. KO 직접 답:
   `그 달 사용 내역표에는 이 엔드포인트의 과금이 **2장**으로 남았으며(그 달 보낸 요청도 2건),` → `그 달 사용 내역표에는 이 엔드포인트의 과금이 **2장**으로 남았으며(남아 있는 실행 보고서의 Pro 요청도 이 2건뿐),`
5. EN FAQ 2:
   `the month's usage table lists two billed images at $0.15 for that endpoint, the only two requests sent to it. That latency and price did not fit a per-image web flow with a 50-second budget.` → `the month's usage table lists two billed images at $0.15 for that endpoint, and the saved run reports contain no other Pro requests. One of two images did not finish inside the test's 50-second client timeout, and the price was about 3.8 times the chosen model's.`
6. KO FAQ 2:
   `그 달 사용 내역표에는 이 엔드포인트의 과금이 $0.15 × 2장으로 남았습니다(그 달 보낸 요청도 2건). 이 지연과 가격은 요청당 50초 예산의 웹 흐름에 맞지 않았습니다.` → `그 달 사용 내역표에는 이 엔드포인트의 과금이 $0.15 × 2장으로 남았고, 남아 있는 실행 보고서에 다른 Pro 요청은 없습니다. 2장 중 1장이 테스트의 50초 클라이언트 타임아웃 안에 끝나지 않았고, 가격은 선택 모델의 약 3.8배였습니다.`
7. EN 불릿 2 전체:
   `**A client-side timeout did not stop billing here.** Only two requests went to the Pro endpoint that month, one of them abandoned at 50 seconds, and the month's usage table lists two billed images for it. There is no request-level invoice to prove the link, but the budget should assume failures are billed; read the provider's queue docs before relying on cancellation.` → `**Two billed Pro images, one delivered.** The saved run reports contain two Pro requests, one abandoned at the 50-second client timeout, and the month's usage table lists two billed images for that endpoint. There is no request-level invoice to prove the link, so plan as if a client-side timeout does not stop billing, and read the provider's queue docs before relying on cancellation.`
8. KO 불릿 2 전체:
   `**여기서는 클라이언트 타임아웃이 과금을 멈추지 않았습니다.** 그 달 Pro 엔드포인트에 보낸 요청은 2건이고 그중 1건은 50초에 포기했는데, 사용 내역표에는 과금 2장으로 남았습니다. 요청별 청구서로 연결을 증명할 수는 없지만, 예산은 실패분도 과금된다고 보고 잡아야 합니다. 취소에 의존하기 전에 제공자의 큐 문서를 읽으세요.` → `**Pro 과금 2장, 받은 결과 1장.** 남아 있는 실행 보고서의 Pro 요청은 2건이고 그중 1건은 50초 클라이언트 타임아웃에 포기했는데, 그 달 사용 내역표에는 이 엔드포인트의 과금이 2장으로 남았습니다. 요청별 청구서로 연결을 증명할 수는 없으므로, 클라이언트 타임아웃이 과금을 멈추지 않는다고 보고 예산을 잡고, 취소에 의존하기 전에 제공자의 큐 문서를 읽으세요.`

## B. 지연 — 측정한 것만 (업로드·저장·재시도 여유 주장 삭제, "앱" → "테스트")
9. EN 불릿 3 전체:
   `**Latency sets the margin.** The app gives one generation call 50 seconds. At about 11 seconds per image that leaves room for upload, storage, and a retry; the Pro endpoint used 34.8 seconds on the image it finished and was cut off at 50 seconds on the other, leaving no margin.` → `**Latency against a 50-second timeout.** The test gave each call 50 seconds. The chosen model averaged 11.1 seconds per image, under a quarter of that; the Pro endpoint used 34.8 seconds on the image it finished and was cut off at 50 seconds on the other. Upload, storage, and retries were not measured here.`
10. KO 불릿 3 전체:
   `**지연이 여유를 결정합니다.** 앱은 생성 호출 1건에 50초를 줍니다. 1장 약 11초면 업로드·저장·재시도 1회가 들어가고, Pro 엔드포인트는 끝낸 1장에 34.8초를 쓰고 나머지 1장은 50초에 끊겨 여유가 없었습니다.` → `**50초 타임아웃 대비 지연.** 테스트는 호출 1건에 50초를 줬습니다. 선택 모델은 1장 평균 11.1초로 그 4분의 1 이하였고, Pro 엔드포인트는 끝낸 1장에 34.8초를 쓰고 나머지 1장은 50초에 끊겼습니다. 업로드·저장·재시도는 여기서 측정하지 않았습니다.`

## C. 발행 (바로 이어서)
11. EN·KO 두 파일 `draft: true` → `draft: false`. `verified: '2026-10-24'` 유지(오늘 발행). changelog 첫 줄: EN `2026-10-24: Added the 2026-09-22 four-model test record and the follow-up runs on the chosen model.` → `2026-10-24: Published the 2026-09-22 four-model test record and the follow-up runs on the chosen model.` / KO `2026-10-24: 2026-09-22 4모델 테스트와 선택 모델 후속 실행 기록을 추가.` → `2026-10-24: 2026-09-22 4모델 테스트와 선택 모델 후속 실행 기록을 발행.`
12. `npm run check` → `npm run build` → `npm run geo` 통과. 확인: `dist/face-preserving-model-benchmark/index.html`과 `dist/ko/face-preserving-model-benchmark/index.html` 생성, `dist/llms.txt`에 두 URL, 사이트맵 파일에 두 URL, 홈 카드 2개(EN/KO)가 "coming soon"에서 링크로 바뀌었는지. 커밋·푸시는 하지 않는다(사용자가 GitHub Desktop).

## 보고 형식
```
[적용] 1~10 각 항목 매칭 1회 여부(EN/KO/catalog)
[발행] draft false 2곳, changelog 문구, check/build/geo 표(글 2 EN/KO 행), llms.txt·sitemap 포함 여부, 홈 카드 상태
[미적용] 매칭이 정확히 1회가 아닌 항목은 원문 그대로 보고
```
