<!-- Historical task spec used on 2026-10-24. Paths, product names, private filename patterns and the author identifier are anonymized; the instructions and embedded draft text are otherwise unchanged. This original includes superseded claims; read it together with review-sheet-example-article-2.md, not as current guidance. Korean original. -->
# Codex 작업 지시서 ARTICLE-2 (2026-10-24) — 글 2 「얼굴 유지 이미지 모델 4종 실측 비교」 EN/KO 작성

## 전제
- 작업 폴더 **`<site-repo>`** (글 1이 이미 발행된 Astro Starlight 사이트). 글 1 파일(`src/content/docs/cost-to-run-ai-image-app.md`, `ko/…`)의 frontmatter·섹션 구성·문체를 그대로 따른다.
- 원자료(읽기 전용, 수정·이동·삭제 금지): `<app-repo>\test-output\` 아래
  `20260922-1824\report.md`(Kontext 5장), `compare-20260922-1851\report.md`(4모델 비교), `styles-20260922-1902\report.md`, `faces-20260922-1909\report.md`, `gender-20260922-1956\report.md`, `idphoto-20260924-112049Z\report.md`, `synthetic-20260924-1202\report.md`, 그리고 `<app-repo>\_backup\CODEX_TASK_2.md.bak`~`CODEX_TASK_5.md.bak`(각 실행의 배경·판정 기록).
- 아래 본문의 숫자는 위 report.md들에서 이미 옮겨 적은 값이다. Codex는 **본문을 쓰기 전에 report.md 7개를 열어 숫자를 1:1 대조**하고, 다르면 본문을 고치지 말고 보고서의 `[불일치]`에 적는다.
- 이 글은 **Phase A(파일 작성·빌드, fal 호출 0회)** 만 지금 한다. **Phase B(가상 인물로 4모델 재실행)** 는 사용자가 채팅에 `실행`이라고 친 뒤에만 한다.

## 절대 규칙
1. git commit / push 금지(사용자가 GitHub Desktop으로 한다). `.env*` 값 출력 금지. 시크릿 하드코딩 금지.
2. **Phase A에서는 fal 호출 0회.** 테스트 스크립트 실행 금지.
3. **실제 얼굴 사진 복사 금지.** `<app-repo>\test-photos\selfie-*.jpg`, `test-photos\stock-*.jpg`, 그리고 `test-output\*\_compare.jpg`·`test-output\*\*.jpg` 중 위 사진으로 만든 결과는 사이트 저장소에 절대 넣지 않는다. 사이트에 넣을 수 있는 이미지는 **가상 인물**(`<app-repo>\public\samples\before-m.jpg`, `m-corporate.jpg`, `before-f.jpg`, `f-corporate.jpg` 4장)만. 복사만 하고 원본은 건드리지 않는다.
4. 회사명·거래처명·실명·the app URL·서비스명 금지. 글 1과 같이 "a resume-photo web app / 이력서 사진 웹앱"으로만 쓴다. 작성자 표기는 `Recibo Lab`.
5. 외부 스크립트·폰트·분석 도구 0. 본문을 지어내지 않는다 — 아래 본문을 **글자 그대로** 넣고, 괄호 표시 `[[…]]` 자리만 지시대로 채운다.
6. 모르면 공식 문서를 열어 확인하고, 확인 못 하면 그 문장을 **삭제**한다(추측으로 숫자 쓰지 않음). 특히 호스팅 플랫폼의 함수 시간 제한 숫자는 https://vercel.com/docs/functions/limitations 또는 https://vercel.com/docs/functions/configuring-functions/duration 에서 Hobby 플랜 최대 duration을 확인해 본문 `[[VERCEL_LIMIT]]`을 채우고, 확인 못 하면 그 괄호가 든 절 전체를 지운다(해당 자리에 "삭제 가능" 표시해 둠).

## Phase A — 할 일

### A-1. 파일 2개 생성
- `src/content/docs/face-preserving-model-benchmark.md` (EN, 아래 §EN 본문 그대로)
- `src/content/docs/ko/face-preserving-model-benchmark.md` (KO, 아래 §KO 본문 그대로)
- 공통 frontmatter 규칙: `verified: 'YYYY-MM-DD'` = **Codex 실행일(KST)**, `changelog` 첫 줄 날짜도 같은 날짜. `draft: true` 유지(발행은 사용자 검수 뒤 별도 지시). `kind: benchmark`, `sidebar: { order: 2 }`.
- `[[VERDICT_A]]`, `[[VERDICT_C]]`, `[[VERDICT_D]]`, `[[VERDICT_RUN4]]` 네 칸은 사용자가 비교 시트를 보고 판정하기 전이므로 EN `pending author review` / KO `작성자 판정 대기`로 채운다. `[[VERDICT_B]]`는 빈 문자열로 지운다(사용자 판정 뒤 핀셋 수정으로 채움). `[[RUN_DATE]]`는 실행일. 글이 draft인 동안만 허용되는 문구다.

### A-2. CSV 2개 (`public/downloads/`)
- `model-benchmark-2026-09-22.csv` — 열: `model_key,endpoint,price_per_image_usd_model_page_2026-09-22,billed_unit_usd_sep_usage_table,inputs,outputs,avg_ms_per_image,identity_same_person_author,note,source_url`
  행 4개(A~D)를 아래 §EN 표 1과 **같은 값**으로. `identity_same_person_author`는 B=`judged best of four`, A/C/D=`pending`. `avg_ms_per_image`: A `11765`, B `11110`, C `42387`(타임아웃 포함), D `18548`.
- `model-benchmark-template.csv` — 같은 열, 데이터 행 1개는 안내문(`Enter model key,Enter endpoint,Unverified,Unverified,0,0,0,Unverified,Enter what you checked,Enter URL`). 글 1 템플릿과 같은 방식(안내 행은 사용자가 지우고 쓴다).
- UTF-8, 쉼표 구분, 헤더 1줄, 줄바꿈 LF.

### A-3. 이미지 (가상 인물 2쌍만)
- `<app-repo>\public\samples\before-m.jpg`, `m-corporate.jpg`, `before-f.jpg`, `f-corporate.jpg` → `public/images/records/2026-09/` 에 **복사**(이름 그대로). 4장 합계 100KB 이하인지 확인. 이 4장은 2026-09-24 가상 인물(모델이 생성한 사람)로 만든 샘플이며 실제 인물이 아니다. 복사 전 각 파일을 열어 사람 얼굴 외 글자·로고·URL이 없는지 확인한다.

### A-4. 카탈로그
- `src/data/catalog.ts`의 `face-preserving-model-benchmark` 항목(EN·KO 모두) `title`·`description`을 아래 frontmatter 값과 **동일하게** 교체. 홈 카드가 draft일 때 "coming soon"으로 뜨는 기존 동작은 그대로.

### A-5. 검사
- `npm run check` → `npm run build` → `npm run geo` 통과. draft이므로 `dist/`에 두 페이지가 **생기지 않아야** 하고 `llms.txt`·사이트맵에도 없어야 한다(확인 결과 보고).
- 임시로 `draft: false`로 바꿔 `npm run build`를 한 번 더 돌려 두 페이지가 정상 생성되고 check-geo 표(canonical / hreflang en·ko·x-default / JSON-LD에 `Article`+`FAQPage` / Last verified / 외부 script 0)를 통과하는지 확인한 뒤 **반드시 `draft: true`로 되돌린다.** 되돌린 뒤 `git status`로 두 md 파일의 draft 줄이 `true`인지 다시 확인.
- 표의 숫자 합계 재계산: 표 1 예상 비용 `2×0.040 + 2×0.039 + 2×0.150 + 2×0.030 = 0.518`; 표 2 호출 합계 `5+8+5+6+4+1+12 = 41`; 9월 과금 `43×0.0398 + 2×0.0398 + 7×0.04 + 2×0.15 + 2×0.03 = 2.431`. 하나라도 다르면 멈추고 보고.

### A-6. 보고 형식
```
[생성] 파일 목록(md 2, csv 2, 이미지 4, catalog 수정)
[대조] report.md 7개 vs 본문 숫자 — 일치 / [불일치] 항목·원문 값
[검사] check / build / geo 결과, draft 상태에서 dist·llms.txt·sitemap 미포함 확인, draft:false 임시 빌드의 check-geo 표, 되돌림 확인(git status)
[VERCEL_LIMIT] 확인한 문서 URL과 값 / 확인 못 해 삭제함
[미확인] 추측 없이 "모름"으로
```

---

## §EN 본문 — `src/content/docs/face-preserving-model-benchmark.md` (글자 그대로)

```md
---
title: "Face-preserving AI image models compared (2026): cost per image, latency, identity retention"
description: "Four fal.ai image-edit models ran the same prompt on the same two selfies (Sep 22, 2026): $0.03–$0.15 per image, 11–42 s per image, one 50-second timeout that was still billed, and the one model the author chose. Prompt, timings, CSV."
verified: '[[RUN_DATE]]'
draft: true
kind: benchmark
sidebar:
  order: 2
changelog:
  - "[[RUN_DATE]]: Published the 2026-09-22 four-model test and the follow-up runs on the chosen model."
faq:
  - q: "Is fal-ai/nano-banana/edit the best face-preserving model?"
    a: "It was judged best of four by one person on two photos, for resume-style clothing and background edits, on September 22, 2026. Different faces, prompts, or later model versions can change the result. The prompt, settings, and CSV are on this page so the test can be rerun."
  - q: "Why not the Pro model?"
    a: "Quality was not rated. nano-banana-pro/edit took 34.8 seconds on the one image it finished and hit the 50-second client timeout on the other; both requests were billed at $0.15. That latency and price did not fit a per-image web flow with a 50-second budget."
  - q: "Were the test faces real people?"
    a: "Yes. The September inputs were the author's own selfies and five licensed stock photos. None of those inputs or outputs are published. Every image on this page shows an AI-generated virtual person."
  - q: "Do these prices still apply?"
    a: "They are the model-page prices on September 22, 2026 and the billed units in that month's usage table. Check each model page before planning."
  - q: "How was 'same person' decided?"
    a: "By the author looking at a side-by-side sheet of original and output and making a yes/no call. No automated face-similarity score was used."
sources:
  - title: "fal.ai — FLUX.1 Kontext [pro] model page"
    url: "https://fal.ai/models/fal-ai/flux-pro/kontext"
  - title: "fal.ai — Nano Banana edit model page"
    url: "https://fal.ai/models/fal-ai/nano-banana/edit"
  - title: "fal.ai — Nano Banana Pro edit model page"
    url: "https://fal.ai/models/fal-ai/nano-banana-pro/edit"
  - title: "fal.ai — Seedream v4 edit model page"
    url: "https://fal.ai/models/fal-ai/bytedance/seedream/v4/edit"
  - title: "fal.ai pricing"
    url: "https://fal.ai/pricing"
---

On September 22, 2026, four image-edit models on fal.ai received the same two selfies (one frontal, one slightly turned) and the same short prompt — keep the face, change only the clothing and the background. The author judged **fal-ai/nano-banana/edit** (**$0.039 per image** on the model page that day, **11.1 s** average per image) the best at keeping the same person and made it the production model; **flux-pro/kontext** ($0.040, 11.8 s) had turned all five faces into different people in an earlier run with a longer prompt; **nano-banana-pro/edit** ($0.15, 42.4 s average) finished one image in 34.8 s and hit the 50-second client timeout on the other, and **both** requests were billed; **bytedance/seedream/v4/edit** ($0.030, 18.5 s) reproduced the original head angle, which the product could not use. The eight calls cost an estimated **$0.52**, and the whole September program — benchmark, five styles, five other faces, a tie fix, and sample generation — came to **56 billed images for $2.43**. This is a two-photo, one-judge test for one use (resume photos), not a general ranking.

## The four-model test (2026-09-22)

| Model (fal.ai endpoint) | Price per image (model page, 2026-09-22) | Billed unit (September usage table) | Outputs | Average time per image | Same person? (author's call) | Note |
| --- | ---: | ---: | ---: | ---: | --- | --- |
| A · fal-ai/flux-pro/kontext | $0.040 | $0.04 | 2 / 2 | **11.8 s** (13.1 / 10.4) | [[VERDICT_A]] | In the earlier five-photo run with a longer prompt, 0 of 5 outputs kept the face |
| B · fal-ai/nano-banana/edit | $0.039 | $0.0398 | 2 / 2 | **11.1 s** (10.8 / 11.4) | **Judged best of the four** [[VERDICT_B]] | Chosen for production |
| C · fal-ai/nano-banana-pro/edit | $0.150 | $0.15 | 1 / 2 (one 50 s timeout) | **42.4 s** including the timeout (34.8 / 50.0) | [[VERDICT_C]] (one output) | Both requests billed: $0.30 for one image |
| D · fal-ai/bytedance/seedream/v4/edit | $0.030 | $0.03 | 2 / 2 | **18.5 s** (15.0 / 22.1) | [[VERDICT_D]] | Kept the original head angle; the product needs a frontal pose, so it was dropped on fit, not on identity |

Estimated cost of the eight calls: $0.518. Time per image covers the model request, the download, and the JPEG save; the one-time upload of each selfie is excluded. Calls ran one after another with no retries and a 50-second client timeout. All models were asked for one image at a 3:4 ratio and JPEG output (A, B, C via `aspect_ratio: "3:4"` and `output_format: "jpeg"`; D via `image_size` 864×1152 and a local JPEG conversion, because that endpoint has no output-format field). C ran at `resolution: "1K"` with web search off; A used `guidance_scale: 3.5`.

The prompt, identical for all four:

> Edit this photo. Keep the person's face exactly as it is: same identity, same gender, same age, same facial features, same skin. Only change two things: replace the clothing with a dark navy business suit, white shirt and dark red tie, and replace the background with a plain light gray studio backdrop. Neatly tidy the hair without changing its length or style. Realistic photo, no beautification.

## Follow-up runs on the chosen model

All on fal-ai/nano-banana/edit unless noted, same client settings, each run a few minutes apart on September 22 or on September 24.

| Run | Calls | Success | Average time | Est. cost | What it checked — result (author's call) |
| --- | ---: | ---: | ---: | ---: | --- |
| 0 · Kontext, five selfies, longer prompt (pose, hair, clothing, background) | 5 | 5 / 5 | 13.6 s (incl. upload) | $0.20 | Identity gate failed: all five outputs were different people; gender was mixed |
| 1 · Four-model test (table above) | 8 | 7 / 8 | — | $0.52 | B chosen |
| 2 · Five resume styles, one selfie | 5 | 5 / 5 | 10.6 s | $0.195 | All five outputs same person; one style left the selfie's chair in the office background |
| 3 · Five other faces (licensed stock photos), one corporate style, plus one re-test of the chair style | 6 | 6 / 6 | 12.5 s (incl. upload) | $0.234 | All five judged same person; glasses were kept; the chair disappeared after one sentence was added to the prompt; women also received a tie, which led to run 4 |
| 4 · Tie rule by gender, two styles | 4 | 4 / 4 | 12.3 s (incl. upload) | $0.156 | Prompt rule tested — women: blouse, no tie; men: tie. 4 / 4 outputs returned; [[VERDICT_RUN4]] |
| 5 · ID-photo prompt check (Sep 24) | 1 | 1 / 1 | 13.7 s | $0.039 | Prompt variant for ID photos (frontal, white background, eyebrows visible); call succeeded, no separate verdict saved |
| 6 · Virtual-person sample set (Sep 24): two text-to-image selfies on fal-ai/nano-banana, then five styles each | 12 | 12 / 12 | about 10.4 s (124.8 s total incl. saves) | $0.468 | The public sample images; no real person involved |

Runs 0–6 are 41 calls. The September usage table shows **56 billed images for $2.43**: nano-banana/edit 43 × $0.0398, nano-banana 2 × $0.0398, flux-pro/kontext 7 × $0.04, nano-banana-pro/edit 2 × $0.15, seedream v4 edit 2 × $0.03. The other 15 billed images that month have no saved per-run report and are not itemized here.

## The May 2026 attempt that came first

Before the September test, a May attempt used identity-adapter and fine-tuning routes on the same provider: fal-ai/flux-pulid (67 megapixels billed, **$2.23**), a switch to a PhotoMaker-style model on May 13 after PuLID preserved the selfie's hairstyle too strongly, and a 100-step fal-ai/flux-lora-fast-training run on May 15 (**$2.00**) with a custom trigger word. May's usage total was $4.23 and the project then paused until September. For this one use — change clothing and background, keep the face — the instruction-following edit models in the table above removed the need for adapters or a trained LoRA.

## What this test does and does not show

- **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.
- **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.
- **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. [[VERCEL_LIMIT — 삭제 가능: The budget was set below the hosting platform's function limit of N seconds on its free plan.]]
- **Sample size.** Two input photos, one judge, one day. Other faces (five stock photos) were tested only on the winner. The chosen model was later run on 49 more images in October without a change of model.

## What the outputs look like

The September inputs were real people (the author and licensed stock photos) and are not published. The pair below is a virtual person generated by the model itself on September 24, then edited with the production "corporate" prompt.

![AI-generated virtual person, input selfie, September 24, 2026](/images/records/2026-09/before-m.jpg)
![Same virtual person after the corporate-style edit on fal-ai/nano-banana/edit: navy suit, white shirt, red tie, gray studio background](/images/records/2026-09/m-corporate.jpg)
![AI-generated virtual person, input selfie, September 24, 2026](/images/records/2026-09/before-f.jpg)
![Same virtual person after the corporate-style edit: navy jacket, white blouse, no tie, gray studio background](/images/records/2026-09/f-corporate.jpg)

## A benchmark sheet to copy

- <a href="/downloads/model-benchmark-2026-09-22.csv" download="model-benchmark-2026-09-22.csv">Download the four-model record (CSV)</a>
- <a href="/downloads/model-benchmark-template.csv" download="model-benchmark-template.csv">Download the blank benchmark template (CSV)</a>

Ten columns: model key, endpoint, model-page price on the test date, billed unit from the usage table, inputs, outputs, average milliseconds per image, same-person verdict, note, source URL. Record the price twice on purpose — the page price and the billed unit differed by $0.0008 here. Delete the template's instruction row before entering your own runs. Broader launch materials are being prepared on the [kit page](/kit/).
```

---

## §KO 본문 — `src/content/docs/ko/face-preserving-model-benchmark.md` (글자 그대로)

```md
---
title: "얼굴 유지 이미지 모델 4종 실측 비교(2026): 장당 비용·지연·동일인 유지"
description: "fal.ai 이미지 편집 모델 4종에 같은 셀카 2장과 같은 프롬프트를 넣었습니다(2026-09-22). 장당 $0.03–0.15, 1장 11–42초, 50초 타임아웃 1건도 과금, 그리고 작성자가 고른 모델. 프롬프트·시간·CSV."
verified: '[[RUN_DATE]]'
draft: true
kind: benchmark
sidebar:
  order: 2
changelog:
  - "[[RUN_DATE]]: 2026-09-22 4모델 테스트와 선택 모델 후속 실행 기록을 발행."
faq:
  - q: "fal-ai/nano-banana/edit가 얼굴 유지에 가장 좋은 모델인가요?"
    a: "2026년 9월 22일, 이력서용 의상·배경 편집이라는 한 용도로, 사진 2장을 한 사람이 판정해 4종 중 가장 좋다고 본 결과입니다. 다른 얼굴·프롬프트·이후 모델 버전에서는 결과가 달라질 수 있습니다. 같은 테스트를 다시 할 수 있도록 프롬프트·설정·CSV를 이 페이지에 두었습니다."
  - q: "왜 Pro 모델을 쓰지 않았나요?"
    a: "화질은 평가하지 않았습니다. nano-banana-pro/edit는 완료한 1장에 34.8초가 걸렸고 나머지 1장은 50초 클라이언트 타임아웃에 걸렸으며, 두 요청 모두 $0.15로 과금됐습니다. 이 지연과 가격은 요청당 50초 예산의 웹 흐름에 맞지 않았습니다."
  - q: "테스트에 쓴 얼굴은 실제 인물인가요?"
    a: "예. 9월 입력은 작성자 본인 셀카와 라이선스 스톡 사진 5장입니다. 그 입력·결과는 어디에도 공개하지 않습니다. 이 페이지의 이미지는 전부 AI가 생성한 가상 인물입니다."
  - q: "이 가격이 지금도 적용되나요?"
    a: "2026년 9월 22일 모델 페이지 가격과 그 달 사용 내역표의 과금 단위입니다. 계획을 세우기 전에 각 모델 페이지를 확인하세요."
  - q: "'동일인'은 어떻게 판정했나요?"
    a: "작성자가 원본과 결과를 나란히 놓은 비교 시트를 보고 예/아니오로 판단했습니다. 자동 얼굴 유사도 점수는 쓰지 않았습니다."
sources:
  - title: "fal.ai — FLUX.1 Kontext [pro] 모델 페이지"
    url: "https://fal.ai/models/fal-ai/flux-pro/kontext"
  - title: "fal.ai — Nano Banana edit 모델 페이지"
    url: "https://fal.ai/models/fal-ai/nano-banana/edit"
  - title: "fal.ai — Nano Banana Pro edit 모델 페이지"
    url: "https://fal.ai/models/fal-ai/nano-banana-pro/edit"
  - title: "fal.ai — Seedream v4 edit 모델 페이지"
    url: "https://fal.ai/models/fal-ai/bytedance/seedream/v4/edit"
  - title: "fal.ai 요금"
    url: "https://fal.ai/pricing"
---

2026년 9월 22일, fal.ai의 이미지 편집 모델 4종에 같은 셀카 2장(정면 1장, 약간 비스듬한 1장)과 같은 짧은 프롬프트 — 얼굴은 그대로, 의상과 배경만 바꿔라 — 를 넣었습니다. 작성자는 **fal-ai/nano-banana/edit**(당일 모델 페이지 기준 **장당 $0.039**, 1장 평균 **11.1초**)를 동일인 유지가 가장 좋다고 판정해 운영 모델로 정했습니다. **flux-pro/kontext**($0.040, 11.8초)는 그보다 앞선 긴 프롬프트 실행에서 5장 전부 다른 사람으로 바뀌었고, **nano-banana-pro/edit**($0.15, 평균 42.4초)는 1장을 34.8초에 끝내고 나머지 1장은 50초 클라이언트 타임아웃에 걸렸는데 **두 요청 모두 과금**됐으며, **bytedance/seedream/v4/edit**($0.030, 18.5초)는 원본의 고개 각도를 그대로 재현해 제품에 쓸 수 없었습니다. 8회 호출의 예상 비용은 **$0.52**, 벤치마크·스타일 5종·다른 얼굴 5명·넥타이 수정·샘플 생성까지 9월 전체는 **과금 56장, $2.43**이었습니다. 사진 2장을 한 사람이 한 용도(이력서 사진)로 판정한 테스트이며 일반 순위가 아닙니다.

## 4모델 테스트 (2026-09-22)

| 모델 (fal.ai 엔드포인트) | 장당 가격 (모델 페이지, 2026-09-22) | 과금 단위 (9월 사용 내역표) | 결과 | 1장 평균 시간 | 동일인 유지? (작성자 판정) | 비고 |
| --- | ---: | ---: | ---: | ---: | --- | --- |
| A · fal-ai/flux-pro/kontext | $0.040 | $0.04 | 2 / 2 | **11.8초** (13.1 / 10.4) | [[VERDICT_A]] | 앞선 5장 실행(긴 프롬프트)에서는 5장 중 0장이 얼굴을 유지 |
| B · fal-ai/nano-banana/edit | $0.039 | $0.0398 | 2 / 2 | **11.1초** (10.8 / 11.4) | **4종 중 가장 좋음으로 판정** [[VERDICT_B]] | 운영 모델로 선택 |
| C · fal-ai/nano-banana-pro/edit | $0.150 | $0.15 | 1 / 2 (50초 타임아웃 1건) | **42.4초** 타임아웃 포함 (34.8 / 50.0) | [[VERDICT_C]] (결과 1장) | 두 요청 모두 과금: 1장에 $0.30 |
| D · fal-ai/bytedance/seedream/v4/edit | $0.030 | $0.03 | 2 / 2 | **18.5초** (15.0 / 22.1) | [[VERDICT_D]] | 원본 고개 각도 유지. 제품은 정면이 필요해 적합성 때문에 제외, 동일인 여부 때문이 아님 |

8회 호출 예상 비용 $0.518. 1장 시간은 모델 요청·다운로드·JPEG 저장을 포함하고, 셀카 1회 업로드는 제외합니다. 호출은 순차 실행, 재시도 없음, 클라이언트 타임아웃 50초. 모든 모델에 1장, 3:4 비율, JPEG 출력을 요청했습니다(A·B·C는 `aspect_ratio: "3:4"`와 `output_format: "jpeg"`, D는 출력 형식 필드가 없어 `image_size` 864×1152 후 로컬 JPEG 변환). C는 `resolution: "1K"`, 웹 검색 꺼짐. A는 `guidance_scale: 3.5`.

4종 모두 동일하게 쓴 프롬프트:

> Edit this photo. Keep the person's face exactly as it is: same identity, same gender, same age, same facial features, same skin. Only change two things: replace the clothing with a dark navy business suit, white shirt and dark red tie, and replace the background with a plain light gray studio backdrop. Neatly tidy the hair without changing its length or style. Realistic photo, no beautification.

## 선택 모델 후속 실행

별도 표기가 없으면 fal-ai/nano-banana/edit, 같은 클라이언트 설정, 9월 22일 또는 9월 24일에 몇 분 간격으로 실행.

| 실행 | 호출 | 성공 | 평균 시간 | 예상 비용 | 확인 내용 — 결과(작성자 판정) |
| --- | ---: | ---: | ---: | ---: | --- |
| 0 · Kontext, 셀카 5장, 긴 프롬프트(자세·머리·의상·배경) | 5 | 5 / 5 | 13.6초 (업로드 포함) | $0.20 | 동일인 게이트 실패: 5장 전부 다른 사람, 성별도 섞임 |
| 1 · 4모델 테스트(위 표) | 8 | 7 / 8 | — | $0.52 | B 선택 |
| 2 · 이력서 스타일 5종, 셀카 1장 | 5 | 5 / 5 | 10.6초 | $0.195 | 5장 모두 동일인. 한 스타일에서 셀카의 의자가 사무실 배경에 남음 |
| 3 · 다른 얼굴 5명(라이선스 스톡 사진), 대기업 스타일 1종 + 의자 스타일 재검증 1장 | 6 | 6 / 6 | 12.5초 (업로드 포함) | $0.234 | 5명 모두 동일인으로 판정, 안경 유지. 프롬프트에 한 문장을 추가한 뒤 의자 사라짐. 여성에게도 넥타이가 들어가 실행 4로 이어짐 |
| 4 · 성별별 넥타이 규칙, 2스타일 | 4 | 4 / 4 | 12.3초 (업로드 포함) | $0.156 | 프롬프트 규칙 검증 — 여성: 블라우스·넥타이 없음, 남성: 넥타이. 4 / 4 결과 반환; [[VERDICT_RUN4]] |
| 5 · 증명사진 프롬프트 점검 (9/24) | 1 | 1 / 1 | 13.7초 | $0.039 | 증명사진용 프롬프트 변형(정면, 흰 배경, 눈썹 노출). 호출 성공, 별도 판정 기록 없음 |
| 6 · 가상 인물 샘플 세트 (9/24): fal-ai/nano-banana로 셀카 2장 생성 후 각 5스타일 | 12 | 12 / 12 | 약 10.4초 (저장 포함 총 124.8초) | $0.468 | 공개용 샘플 이미지. 실제 인물 없음 |

실행 0–6은 41회 호출입니다. 9월 사용 내역표는 **과금 56장, $2.43**: nano-banana/edit 43장 × $0.0398, nano-banana 2장 × $0.0398, flux-pro/kontext 7장 × $0.04, nano-banana-pro/edit 2장 × $0.15, seedream v4 edit 2장 × $0.03. 그 달의 나머지 과금 15장은 실행별 보고서가 남아 있지 않아 여기서 항목화하지 않습니다.

## 그보다 앞선 2026년 5월 시도

9월 테스트 전, 5월에는 같은 제공자에서 아이덴티티 어댑터와 미세조정 경로를 시도했습니다. fal-ai/flux-pulid(67메가픽셀 과금, **$2.23**), PuLID가 셀카 머리 모양을 너무 그대로 보존해 5월 13일 PhotoMaker 계열 모델로 전환, 5월 15일 fal-ai/flux-lora-fast-training 100스텝 학습(**$2.00**)과 전용 트리거 단어. 5월 사용액 합계는 $4.23이었고 프로젝트는 9월까지 멈췄습니다. 의상과 배경을 바꾸고 얼굴은 유지하는 이 한 용도에서는, 위 표의 지시 따르기형 편집 모델이 어댑터나 학습된 LoRA의 필요를 없앴습니다.

## 이 테스트가 보여주는 것과 보여주지 않는 것

- **모델 선택보다 프롬프트 범위가 결과를 더 크게 움직였습니다.** 실행 0은 한 모델에 새 자세·머리 정돈·새 의상·새 배경을 함께 요구했고 5장 중 0장이 얼굴을 유지했습니다. 실행 1은 모든 모델에 두 가지만 바꾸라고 했고 선택된 결과는 동일인으로 판정됐습니다. 사진 수가 다른(5장 vs 2장) 두 실행이므로 관찰이지 통제 실험은 아닙니다.
- **클라이언트 타임아웃은 과금을 멈추지 않습니다.** 50초에 포기한 Pro 요청도 사용 내역표에 과금 1장으로 남았습니다. 실패분까지 예산에 넣고, 취소에 의존하기 전에 제공자의 큐 문서를 읽으세요.
- **지연이 구조를 결정합니다.** 1장 11초면 업로드·생성·저장이 앱의 요청당 50초 예산 안에 들어가고, 42초면 들어가지 않습니다. [[VERCEL_LIMIT — 삭제 가능: 이 예산은 호스팅 플랫폼 무료 플랜의 함수 제한 N초보다 낮게 잡았습니다.]]
- **표본 크기.** 입력 사진 2장, 판정자 1명, 하루. 다른 얼굴(스톡 사진 5장)은 선택 모델에서만 검증했습니다. 선택 모델은 10월에 49장을 더 처리했고 모델 변경은 없었습니다.

## 결과물은 이렇게 보입니다

9월 입력은 실제 인물(작성자·라이선스 스톡 사진)이어서 공개하지 않습니다. 아래 쌍은 9월 24일 모델이 직접 생성한 가상 인물에 운영용 "대기업" 프롬프트를 적용한 결과입니다.

![AI가 생성한 가상 인물의 입력 셀카, 2026년 9월 24일](/images/records/2026-09/before-m.jpg)
![같은 가상 인물을 fal-ai/nano-banana/edit로 대기업 스타일 편집한 결과: 네이비 수트, 흰 셔츠, 붉은 넥타이, 회색 스튜디오 배경](/images/records/2026-09/m-corporate.jpg)
![AI가 생성한 가상 인물의 입력 셀카, 2026년 9월 24일](/images/records/2026-09/before-f.jpg)
![같은 가상 인물을 대기업 스타일로 편집한 결과: 네이비 재킷, 흰 블라우스, 넥타이 없음, 회색 스튜디오 배경](/images/records/2026-09/f-corporate.jpg)

## 복사해 쓰는 벤치마크 시트

- <a href="/downloads/model-benchmark-2026-09-22.csv" download="model-benchmark-2026-09-22.csv">4모델 기록 내려받기 (CSV)</a>
- <a href="/downloads/model-benchmark-template.csv" download="model-benchmark-template.csv">빈 벤치마크 템플릿 내려받기 (CSV)</a>

열 10개: 모델 키, 엔드포인트, 테스트일 모델 페이지 가격, 사용 내역표 과금 단위, 입력 수, 결과 수, 1장 평균 밀리초, 동일인 판정, 비고, 출처 URL. 가격을 두 번 적는 이유가 있습니다 — 여기서는 페이지 가격과 과금 단위가 $0.0008 달랐습니다. 템플릿의 안내 행은 지우고 직접 기록하세요. 더 넓은 런칭 자료는 [키트 페이지](/kit/)에서 준비 중입니다.
```

---

## Phase B (선택) — 가상 인물로 4모델 재실행 → 공개용 비교 시트
**사용자가 채팅에 `실행`이라고 친 뒤에만 시작한다. 그 전에는 스크립트 파일 작성까지만 하고 멈춘다.**

### B-1. 스크립트 `<app-repo>\scripts\test-compare-synthetic.mjs`
- `scripts/test-compare.mjs`를 복사해 만든다. 안전장치 전부 유지(FAL_KEY 마스킹, guardedFetch, 호출 카운터, 재시도 0, 50초 타임아웃, 402/403 즉시 중단). **모델 4개·프롬프트·입력 필드는 원본과 글자 그대로 동일**(2026-09-22와 같은 조건이어야 비교가 된다).
- 입력만 교체: `test-photos/synthetic/male.jpg`, `test-photos/synthetic/female.jpg` (가상 인물 2장, 이미 존재). 각 1회 업로드 후 URL 재사용.
- 호출 상한 **8회**, 예상 비용 상한 **$0.60**(현재 모델 페이지 단가로 사전 계산해 넘으면 실행 전 중단·보고). 사전 검사에서 4개 모델 페이지의 **현재 단가**를 확인해 report.md에 "2026-09-22 단가 / 오늘 단가" 두 열로 적는다.
- 출력: `test-output/compare-synthetic-<YYYYMMDD-HHmm>/`에 결과 jpg 8장, `report.md`(원본 형식 + 오늘 단가 열), `_compare.jpg`(행 = 입력 2장, 열 = [Original, A, B, C, D], 칸 높이 400px, 열 위 영문 라벨, 하단에 `fal.ai · 2026-10 · virtual persons` 한 줄).
- `package.json`에 `"test:compare-synthetic": "node scripts/test-compare-synthetic.mjs"` 추가. the app 저장소의 다른 파일은 수정하지 않는다. commit 금지.

### B-2. 실행 (사용자 `실행` 후)
- `npm run test:compare-synthetic` **1회만**. 402/403이면 즉시 중단·보고(충전은 사람이 한다).

### B-3. 사이트 반영 (실행 성공 시)
- `_compare.jpg`를 `<site-repo>\public\images\records\2026-10\model-compare-virtual-persons-2026-10.jpg`로 복사(400KB 넘으면 품질 80으로 재압축, 원본은 그대로). 복사 전 글자·URL·실명이 없는지 확인.
- EN/KO 두 md의 "What the outputs look like / 결과물은 이렇게 보입니다" 섹션 **맨 위**에 이미지 1줄 추가:
  EN `![Four-model comparison on two AI-generated virtual persons, October 2026: original, flux-pro/kontext, nano-banana/edit, nano-banana-pro/edit, seedream v4 edit](/images/records/2026-10/model-compare-virtual-persons-2026-10.jpg)`
  KO `![AI 생성 가상 인물 2명으로 2026년 10월에 재실행한 4모델 비교: 원본, flux-pro/kontext, nano-banana/edit, nano-banana-pro/edit, seedream v4 edit](/images/records/2026-10/model-compare-virtual-persons-2026-10.jpg)`
- "Follow-up runs / 선택 모델 후속 실행" 표 **아래**에 한 문단 추가(숫자는 새 report.md에서):
  EN `Re-run on [[DATE]] with two AI-generated virtual persons, same prompt and settings: A [[a_s]] s, B [[b_s]] s, C [[c_s]] s, D [[d_s]] s per image; [[n]] of 8 outputs succeeded; estimated cost $[[cost]]. Model-page prices that day: A $[[pa]], B $[[pb]], C $[[pc]], D $[[pd]]. The comparison sheet is published below because no real person appears in it; the identity verdicts for this re-run are in the changelog once the author has reviewed the sheet.`
  KO 같은 내용. `changelog`에 `"[[DATE]]: 가상 인물 2명으로 4모델 재실행, 비교 시트 공개."` 추가(최대 3줄 유지).
- `npm run check` → `npm run build` → `npm run geo` 재통과. draft 유지.

### B-4. 보고 형식
```
[스크립트] 생성 여부, 원본 대비 바뀐 줄(입력 2줄·상한·라벨만이어야 함)
[사전검사] 오늘 단가 4개와 출처 URL, 예상 비용 합계(≤ $0.60)
[실행] 성공 N/8, 모델별 평균 s, 예상 비용, 에러 원문
[결과 폴더] test-output/compare-synthetic-…
[사이트] 복사한 이미지 크기, 추가한 문단·changelog, check/build/geo 결과
```

---

## 사용자(사람) 할 일 — Codex가 아닌 <author>
1. **판정 5개** (3분):
   - `<app-repo>\test-output\compare-20260922-1851\_compare.jpg`를 열고 — A(kontext) 2장 / B(nano_banana) 2장 / C(pro) 결과 1장 / D(seedream) 2장 — 각각 원본과 같은 사람인지 `예 / 아니오 / 애매`.
   - `<app-repo>\test-output\gender-20260922-1956\_compare.jpg`를 열고 — 여성 2장에 넥타이가 없고 남성 2장에 넥타이가 있는지 `예 / 아니오`.
   채팅에 다섯 줄로 적어 주면 `[[VERDICT_*]]` 다섯 칸의 최종 문구를 핀셋 수정으로 보낸다.
2. Phase B를 할지 결정: fal 잔액 $1.39 중 약 $0.52 사용. 하면 `실행`이라고 치고, 끝나면 새 `_compare.jpg`를 보고 같은 판정 4개(A~D)를 적어 준다.
3. 검수 뒤 발행 순서(사용자 승인 후 별도 핀셋 지시): `draft: false` 2곳 → GitHub Desktop 커밋·푸시 → Cloudflare 자동 배포 → Bing Webmaster URL 제출 2건(EN·KO) → GSC URL 검사 → 색인 요청.
