<!-- English translation of a historical task spec used on 2026-10-24. Paths, product names, private filename patterns and the author identifier are anonymized. Fenced code blocks, tables and figures are preserved. This original includes superseded claims; read it together with review-sheet-example-article-2.md, not as current guidance. -->
# Codex task spec ARTICLE-2 (2026-10-24) — Write article 2, “4 face-preserving image models measured,” in EN/KO

## Context
- Working folder: **`<site-repo>`** (an Astro Starlight site with article 1 already published). Follow the frontmatter, section structure, and style of article 1 (`src/content/docs/cost-to-run-ai-image-app.md`, `ko/…`) exactly.
- Source material (read only; do not edit, move, or delete): under `<app-repo>\test-output\`
  `20260922-1824\report.md` (5 Kontext images), `compare-20260922-1851\report.md` (4-model comparison), `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`, and `<app-repo>\_backup\CODEX_TASK_2.md.bak`–`CODEX_TASK_5.md.bak` (context and verdict records for each run).
- The numbers in the article text below were already transcribed from those report.md files. **Before writing the article, Codex must open all 7 report.md files and compare the numbers 1:1.** If they differ, do not change the article text; record the discrepancy under `[불일치]` in the report.
- Perform only **Phase A (write files and build; 0 fal calls)** now. Perform **Phase B (rerun 4 models with virtual people)** only after the user types `실행` in the chat.

## Hard rules
1. No git commit / push (the user handles these in GitHub Desktop). Never output `.env*` values. Never hard-code secrets.
2. **Phase A permits 0 fal calls.** Do not execute test scripts.
3. **Do not copy photos of real faces.** Never put `<app-repo>\test-photos\selfie-*.jpg`, `test-photos\stock-*.jpg`, or outputs made from those photos among `test-output\*\_compare.jpg` and `test-output\*\*.jpg` into the site repository. The only permitted images are **virtual people** (the 4 files `<app-repo>\public\samples\before-m.jpg`, `m-corporate.jpg`, `before-f.jpg`, and `f-corporate.jpg`). Copy only; do not alter the originals.
4. No company names, business-contact names, real names, the app URL, or service name. As in article 1, use only “a resume-photo web app / 이력서 사진 웹앱.” The author name is `Recibo Lab`.
5. Add 0 external scripts, fonts, or analytics tools. Do not invent article content: insert the text below **verbatim**, filling only the marked `[[…]]` slots as instructed.
6. If unsure, open the official documentation; if a statement cannot be verified, **delete** it (do not guess numbers). In particular, check the hosting platform's maximum Hobby-plan function duration at https://vercel.com/docs/functions/limitations or https://vercel.com/docs/functions/configuring-functions/duration to fill `[[VERCEL_LIMIT]]` in the article. If you cannot verify it, delete the entire clause containing that marker (marked “may be deleted” in place).

## Phase A — Tasks

### A-1. Create 2 files
- `src/content/docs/face-preserving-model-benchmark.md` (EN; use the §EN text below verbatim)
- `src/content/docs/ko/face-preserving-model-benchmark.md` (KO; use the §KO text below verbatim)
- Shared frontmatter rules: `verified: 'YYYY-MM-DD'` = **the Codex run date (KST)**, and the first `changelog` date must match. Keep `draft: true` (publication requires separate instructions after the user's review). Use `kind: benchmark` and `sidebar: { order: 2 }`.
- The user has not yet reviewed the comparison sheets, so fill the four slots `[[VERDICT_A]]`, `[[VERDICT_C]]`, `[[VERDICT_D]]`, and `[[VERDICT_RUN4]]` with EN `pending author review` / KO `작성자 판정 대기`. Remove `[[VERDICT_B]]` with an empty string (a targeted edit will fill it after the user's verdict). `[[RUN_DATE]]` is the run date. These phrases are permitted only while the article is a draft.

### A-2. Create 2 CSV files (`public/downloads/`)
- `model-benchmark-2026-09-22.csv` — columns: `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`
  Create 4 rows (A–D) with **the same values** as table 1 in §EN below. For `identity_same_person_author`, use B=`judged best of four` and A/C/D=`pending`. For `avg_ms_per_image`, use A `11765`, B `11110`, C `42387` (including the timeout), and D `18548`.
- `model-benchmark-template.csv` — the same columns, with 1 instructional data row (`Enter model key,Enter endpoint,Unverified,Unverified,0,0,0,Unverified,Enter what you checked,Enter URL`). Use the same approach as the article 1 template (the person using it deletes the instructional row before entering data).
- UTF-8, comma-separated, 1 header row, LF line endings.

### A-3. Images (only 2 pairs of virtual people)
- **Copy** `<app-repo>\public\samples\before-m.jpg`, `m-corporate.jpg`, `before-f.jpg`, and `f-corporate.jpg` to `public/images/records/2026-09/` (keep the filenames). Confirm that all 4 files together are at most 100KB. These 4 samples were made on 2026-09-24 using virtual people generated by a model; they are not real people. Before copying, open each file and check for text, logos, or URLs in addition to the face.

### A-4. Catalog
- In `src/data/catalog.ts`, replace `title` and `description` for the `face-preserving-model-benchmark` entries (both EN and KO) with values **identical to** the frontmatter below. Preserve the existing home-card behavior that shows “coming soon” while a page is a draft.

### A-5. Checks
- Pass `npm run check` → `npm run build` → `npm run geo`. Because the article is a draft, both pages **must not be generated** in `dist/`, and must also be absent from `llms.txt` and the sitemap (report what you checked).
- Temporarily set `draft: false` and run `npm run build` once more. Confirm that both pages are generated and pass the check-geo table (canonical / hreflang en·ko·x-default / JSON-LD `Article`+`FAQPage` / Last verified / 0 external scripts), then **restore `draft: true` without fail.** After restoring, use `git status` and check that the draft line is `true` in both md files.
- Recalculate the table totals: table 1 estimated cost `2×0.040 + 2×0.039 + 2×0.150 + 2×0.030 = 0.518`; table 2 call count `5+8+5+6+4+1+12 = 41`; September (month 9) billing `43×0.0398 + 2×0.0398 + 7×0.04 + 2×0.15 + 2×0.03 = 2.431`. If any value differs, stop and report it.

### A-6. Report format
```
[생성] 파일 목록(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 article text — `src/content/docs/face-preserving-model-benchmark.md` (verbatim)

```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 article text — `src/content/docs/ko/face-preserving-model-benchmark.md` (verbatim)

```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 (optional) — Rerun 4 models with virtual people → public comparison sheet
**Start only after the user types `실행` in the chat. Until then, write only the script file and stop.**

### B-1. Script `<app-repo>\scripts\test-compare-synthetic.mjs`
- Create it by copying `scripts/test-compare.mjs`. Preserve all safeguards (FAL_KEY masking, guardedFetch, call counter, 0 retries, 50-second timeout, immediate stop on 402/403). **The 4 models, prompt, and input fields must be identical to the original** so the comparison uses the same conditions as 2026-09-22.
- Replace only the inputs: `test-photos/synthetic/male.jpg`, `test-photos/synthetic/female.jpg` (2 virtual-person images that already exist). Upload each 1 time, then reuse the URLs.
- Cap calls at **8** and estimated cost at **$0.60** (calculate from current model-page prices beforehand; if the cap would be exceeded, stop and report before running). In the preflight check, verify the **current prices** on all 4 model pages and record “2026-09-22 price / today's price” in two columns in report.md.
- Output: 8 jpg results, `report.md` (original format plus today's price column), and `_compare.jpg` under `test-output/compare-synthetic-<YYYYMMDD-HHmm>/`. For the sheet, rows = 2 inputs; columns = [Original, A, B, C, D]; cell height = 400px; English labels above the columns; a single `fal.ai · 2026-10 · virtual persons` line at the bottom.
- Add `"test:compare-synthetic": "node scripts/test-compare-synthetic.mjs"` to `package.json`. Do not modify other files in the app repository. No commits.

### B-2. Execute (after the user types `실행`)
- Run `npm run test:compare-synthetic` **1 time only**. Stop and report immediately on 402/403 (a human handles top-ups).

### B-3. Update the site (if execution succeeds)
- Copy `_compare.jpg` to `<site-repo>\public\images\records\2026-10\model-compare-virtual-persons-2026-10.jpg` (if over 400KB, recompress at quality 80; preserve the original). Before copying, check that there is no text, URL, or real name.
- Add 1 image line at the **top** of the “What the outputs look like / 결과물은 이렇게 보입니다” section in both EN/KO md files:
  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)`
- Add one paragraph **below** the “Follow-up runs / 선택 모델 후속 실행” table (fill the figures from the new 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.`
  Use the same content in KO. Add `"[[DATE]]: 가상 인물 2명으로 4모델 재실행, 비교 시트 공개."` to `changelog` (keep at most 3 lines).
- Pass `npm run check` → `npm run build` → `npm run geo` again. Keep the article as a draft.

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

---

## Human tasks — <author>, not Codex
1. **5 verdicts** (3 minutes):
   - Open `<app-repo>\test-output\compare-20260922-1851\_compare.jpg`. For A(kontext) 2 images / B(nano_banana) 2 images / C(pro) 1 output / D(seedream) 2 images, judge whether each is the same person as the original: `예 / 아니오 / 애매`.
   - Open `<app-repo>\test-output\gender-20260922-1956\_compare.jpg` and judge `예 / 아니오`: do the 2 female images have no tie, and do the 2 male images have a tie?
   Enter five lines in the chat, and targeted edits will supply the final wording for the five `[[VERDICT_*]]` slots.
2. Decide whether to run Phase B: from the $1.39 fal balance, it uses about $0.52. To proceed, type `실행`; after it finishes, review the new `_compare.jpg` and give the same 4 A–D verdicts.
3. Publication sequence after review (separate targeted instructions after user approval): set `draft: false` in 2 places → commit/push in GitHub Desktop → automatic Cloudflare deployment → submit 2 URLs (EN·KO) to Bing Webmaster → GSC URL inspection → request indexing.
