---
title: C5 — Action segment / still-moment prompt hygiene (시간 연결어 + locomotion + visible-human-action closed list 추상화) v1 (fix-critical-1 Tier β #8)
date: 2026-05-20+
status: closed (C5 v1 — W1-W4 4-wave 실행 완료, Codex per-wave APPROVED. W1 `cfb9184` / W2 `086ab0a` / W3 `2f41467` + W3 fix-up 1 `3d901cc`. §10 Closure 참조.)
roadmap_ref: docs/superpowers/specs/2026-05-16-track-b-semantic-debt-roadmap-design.md §5.9 (Area #9 — Action segment SOT)
fix_critical_doc_ref: docs/fix-critical-1/index.html C5 section (lines 1109-1176)
audit_ref: backend/tests/_audit_outputs/semantic_string_debt/full_20260516_0105/triage_report.md — A042 (line 201, semantic_string_judgment) + A064 (line 223) + A068 (line 227) + A082 (line 241) + A083 (line 242) (llm_closed_list_instruction) + roadmap §5.9
prerequisites:
  - C1 perception_mode enum SOT v1 / C2 owned_object_usage[] echo v1 / C3 detail_steps focus rewrite v1 / C7 shot_dependency_t2i subject_kind v1 / C6 detail_steps 색감-감정 closed-list v1 / C9 scene_detail body-light verb v1 / C4 background classifier v1 — 모두 closed + pushed (origin/main HEAD `5f6b68b`). HEAD anchor. 변경 0.
non_supersedes:
  - C8 #7 잔여 sub-area split / C10 future structured carries — 별도 area.
  - A069 (`shot_extract` system.md:42-50 / user.md 외모·연령 변화) — C5 scope 제외, C8 Area #7 sub-area (c) carry (§1.3, §3.4).
---

# C5 — Action segment / still-moment prompt hygiene v1

## 1. Purpose + Scope

### 1.1 Purpose

**roadmap §5.9 Area #9 (G6 신규 영역)**: shot 추출/검증 + scene_detail re-frame 파이프라인이 "한 shot = 한 찰나" 원칙을 **한국어/영어 grammar pattern 닫힌 목록** + **이동·접촉 동사 닫힌 lexicon** + **신체 부위/동작 동사 닫힌 lexicon** 으로 LLM 에게 가르친다.

audit (triage_report.md, full_20260516_0105) 5 row (C5 in-scope) + 1 row (A069, C8 carry):

| row | grade | site (audit 시점) | category | 본질 |
|-----|-------|------|----------|------|
| A064 | P1 | `shot_extract/11.../user.md:18-19` | llm_closed_list_instruction | 시간 연결어 닫힌 목록 — 한국어 7종 (`~하자/~하면서/~하며/~하고/~한 뒤/~한 후/~하고 나서`) + 영어 5종 (`and then/while ~ing/after ~ing/as ~/before ~`) |
| A068 | P1 | `shot_extract/11.../system.md:15-18` | llm_closed_list_instruction | 동일 시간 연결어 닫힌 목록 |
| A082 | P1 | `shot_validator/5.../system.md:12-116` | llm_closed_list_instruction | 시간 연결어 닫힌 목록 + locomotion/riding/water/jumping/chasing 동작 카테고리 lexicon + active contact freeze rule 카테고리 lexicon |
| A083 | P1 | `shot_validator/5.../system.md:157-161` | llm_closed_list_instruction | visible-human-action 판정 기준 — 신체 부위 + 동작 동사 닫힌 lexicon (`얼굴/손/다리/팔/face/hand/leg/arm` + `잡기/보기/말하기/hold/look/talk` 등, 3 중 1 이상 만족) |
| A042 | P1 | `scene_detail/24.../system.md:369` | semantic_string_judgment | dynamic verb 닫힌 목록 (`running/riding/walking/moving/chasing/pedaling/rowing`) 으로 motion-freeze re-frame trigger 정의 |
| ~~A069~~ | P1 | `shot_extract/11.../system.md:42-50` | llm_closed_list_instruction | **C5 scope 제외** — 외모·연령 변화 (나이/부상/얼룩/창백/멍/화상) → C8 Area #7 sub-area (c) carry |

**핵심 진단 (Codex C5 entry sanity 흡수)**: 위 row 전부 **prompt-side closed-list** 위반이다. shot description 의 시간 segment / 이동성 / visible-human-action 을 **소비하는 code 측 regex/closed-list 는 0** (live grep — `shot_validator_step.py`/`visual_context_helper.py` 의 매칭은 docstring 만, production routing code 0). 즉 doctrine 위반 = **Prompt Closed-List Ban** 단독 — C9/C6/C4 와 동일 패턴.

**index.html 원안 (신규 `action_segment[]` structured schema 필드 + shot_extract v13 schema.json 신설 + validator segment count 검증 + scene_detail cascade) = 채택 안 함**. Codex C5 entry sanity (OQ-C5-1) NO-GO 판정: (a) `action_segment[]` 를 소비하는 code/consumer 가 0 → write-only dead schema 가 된다, (b) [[feedback_llm_based_judgment]] 의 "Structured SOT Required" gate 는 **code 가 semantic 속성에 routing** 할 때 적용 — 여기 code routing 0, (c) roadmap §5.9 "본질" = "한 shot 안 두 시간 segment 금지" = **producer writing constraint** 이지 routing signal 이 아님, (d) C4 가 동일 논리로 신규 producer NO-GO + index.html 9-step 원안 superseded 한 직전 선례. **C5 v1 = 5 row 해소** — 3개 prompt-pack stem 의 닫힌 enumeration 을 generic semantic principle 로 추상화 (narrow, C9/C6/C4 pattern). 신규 schema 필드 0.

### 1.2 In-scope

- **W1 — `shot_extract` v13 prompt-pack**: `13.<W1_UTC>/` 신규 디렉토리 — `system.md` (A068 시간 연결어 닫힌 목록 추상화) + `user.md` (A064 시간 연결어 닫힌 목록 추상화). `shot_schema.json` 은 v13 에 **미통합** — v10 per-stem fallback 유지 (W1 OQ blocker, Codex `OPTION_1_APPROVED`; §3.7). `version_registry` `shot_extractor` provenance sync. C5 regression test 신설. (§5.1)
- **W2 — `shot_validator` v6 prompt-pack**: `6.<W2_UTC>/` 신규 디렉토리 — `system.md` (A082 시간 연결어 + locomotion 카테고리 + active contact 카테고리 lexicon 추상화 / A083 visible-human-action 닫힌 lexicon 추상화) + `validator_schema.json` (**byte-identical sibling**). `characters`/`character_ids` fail-fast/repair contract + active contact freeze contract 보존. `version_registry` `shot_validator` provenance sync. C5 test append. (§5.2)
- **W3 — `scene_detail` v32 prompt-pack**: `32.<W3_UTC>/` 신규 디렉토리 — `system.md` (A042 dynamic verb 닫힌 목록 추상화 `:373` + `:543`) + 그 외 stem (`detail_schema.json` 등) **byte-identical sibling**. `SCENE_DETAIL_PROMPT_VERSION` `31.*`→`32.*` bump, `SCENE_DETAIL_SCHEMA_VERSION=12` 보존. `version_registry` `scene_detail_composer` 4-point cascade + alignment/pinned test 전수 동기. C5 test append. (§5.3)
- **W4 — integrated gate + closure docs atomic**: cross-cutting static/residue/compat gate re-run + closure docs (본 spec + plan status / roadmap §5.9 / index.html C5 marker). 신규 test 미포함 (W1-W3 에 흡수). (§5.4)

### 1.3 Out-of-scope (Codex C5 entry sanity scope guard 흡수)

- **신규 `action_segment[]` structured schema 필드 / `segment_kind` / `start_anchor` / `end_anchor` 신규 필드·문구 — 미도입** (OQ-C5-1). index.html "수정 방법" 9-step 원안 폐기 — closure docs 에 superseded 명시.
- **A069 `shot_extract` system.md:42-50 + user.md 외모·연령 변화 닫힌 목록 (나이 변화/부상/얼룩/창백/멍/화상 + 인종/국적) — C5 scope 제외** (OQ-C5-4, §3.4). index.html C5 step 5 + C8 sub-area (c) 가 명시한 boundary — Area #7 sub-area (c) carry. C5 W1 은 `shot_extract` 의 시간 연결어 site (`user.md:18-19` + `system.md:14-18`) 만 다루고, 변형 기준 / 인물 규칙 / demographic 섹션은 byte-for-byte 불변.
- **`shot_validator` active contact freeze contract — 보존** (§3.3). active contact 섹션의 **닫힌 lexical 카테고리 bullet (`:113-116`) 만** generic principle 로 추상화 — force direction / contact point / imbalance / 원문-없는-단서-발명-금지 / `character_ids` 양쪽-포함 contract 는 변경 0.
- **`shot_validator` `characters`/`character_ids` fail-fast + repair contract — 보존**. A083 은 visible-human-action **판정 기준 닫힌 lexicon** 만 추상화 — fail-fast 조건 / repair 절차 / `character_ids=[] + characters=[]` 처리 contract 는 변경 0.
- **schema 구조 변경 (field / enum / required / type) — 0**. `validator_schema.json` (v6) / `detail_schema.json` (v32) 은 byte-identical sibling (sha256 동일). `shot_schema.json` 은 v13 에 미통합 — v10 에서 per-stem fallback (파일 자체 변경 0). `additionalProperties:false` shape 불변.
- **`shot_schema.json` OpenAI strict 위반 (`characters` 가 properties 에 있으나 required 부재) — C5 scope 제외, 별도 carry** (§3.7). W1 OQ blocker — schema-strict compliance fix 는 closed-list 추상화와 무관 + byte-identical invariant 위반 → C8/C10 또는 dedicated schema-strict cleanup 으로.
- **`SCHEMA_VERSION` / `step_manifest` 변경 — 0**. `SCENE_DETAIL_SCHEMA_VERSION=12` 보존. `shot_extract`/`shot_validator` step_manifest entry 불변.
- **`shot_extract`/`shot_validator` config_hash 무효화 mechanism 신설 — 0** (§3.5). 두 step 은 `_config_hash()` / `PROMPT_VERSION` code 상수 부재 — prompt-pack bump 가 cp resume 를 무효화하지 않음. pre-existing 조건, C5 는 신규 mechanism 도입 안 함 (narrow / new-mechanism ban). `version_registry` sync = provenance/test contract 동기 only.
- **VLM / live LLM / semantic regex**: 모두 ban ([[feedback_no_vlm_dependency]] / [[feedback_llm_based_judgment]]).
- **C1·C2·C3·C4·C6·C7·C9 변경 사항 / C8·C10**: 별도 area, 변경 0.

## 2. W0 Evidence Inventory (live, HEAD `5f6b68b`)

### 2.1 `shot_extract` — active pack v12, schema stem v10 (W1 대상)

- 활성 pack: `prompts/_base/shot_extract/12.202605181937/` — `system.md` + `user.md` 만 보유. `shot_schema.json` 은 `10.202604151200/` 에만 존재 → `prompt_loader` per-stem latest 가 `system.md`/`user.md`=v12, `shot_schema.json`=v10 으로 분리 로드 (loader docstring 명시 동작).
- **A064** — `12.../user.md:18-19`: `[절대 규칙 — 단일 정지 순간]` 블록 내 `- 시간 연결어 절대 금지: "~하자" / "~하면서" / "~하며" / "~하고" / "~한 뒤" / "~한 후" / "~하고 나서"` + `- 영어 금지: "and then", "while ~ing", "after ~ing", "as ~", "before ~"`. 같은 블록 `:16-21` 에 generic principle (`한 Shot의 description에는 하나의 동사 또는 하나의 상태만`) 이미 병존.
- **A068** — `12.../system.md:14-18`: `## 시간 연결어 절대 금지` 섹션 — `:16-18` 에 동일 닫힌 목록 (한국어 7 + 영어 4 + `~하려는 찰나` 등). 같은 파일 `:8-12` `## 핵심 원칙` 에 generic principle 이미 병존.
- `shot_schema.json` (v10): `shots[].items` = `{shot_index, description, characters, based_on_beat}`, `additionalProperties:false`. `action_segment` 부재.
- `ShotExtractStep` (`beat_shot_steps.py:297`) — `_config_hash()` 없음, `PROMPT_VERSION` code 상수 없음.

### 2.2 `shot_validator` — active pack v5 (W2 대상)

- 활성 pack: `prompts/_base/shot_validator/5.202605081700/` — `system.md` + `validator_schema.json`.
- **A082** (audit 범위 `:12-116`):
  - `:12-17` `## 시간 연결어 절대 금지 (순차 동작 연결)` — 닫힌 목록 (한국어 7 + 영어 4). `:18-30` `## 결과 상태 묘사는 허용` 에 generic 판단기준 (`두 동사 사이 시간 간격`) 이미 병존.
  - `:32-41` `## 동적 동사 freeze 규칙` — `:36` `대상 동작 카테고리 (어휘는 다양 …)` disclaimer + `:37-41` locomotion/riding-driving/water-swim/jumping-leaping/chasing-fleeing 5 카테고리 lexicon bullet.
  - `:99-145` `## Active contact freeze rule` — `:111` `### 카테고리 (가이드일 뿐, 어휘 매트릭스에 hardcode 의존하지 말고 의미 기반으로 판정)` disclaimer + `:113-116` 찌르기·타격·제압 lexical bullet 3 + generic 4번째 bullet. 나머지 contract (`:99-110`, `:117-145`).
- **A083** — `:155-161` `## characters / character_ids 검출` 섹션 — `:157` `### visible-human-action 판정 기준 (3 중 1 이상 만족)` + `:159-161` 신체 부위 lexicon + 동작 동사 lexicon + type descriptor 3종 bullet. `:163-175` repair 절차 + fail-fast contract.
- `validator_schema.json`: `{scene_index, shots}` — `shots[].items` = `{changed, revised_description, reason, characters, character_ids}`. `action_segment` 부재.
- `ShotValidatorStep` (`shot_validator_step.py:135`) — `_config_hash()` 없음, `PROMPT_VERSION` code 상수 없음.

### 2.3 `scene_detail` — active pack v31 (W3 대상)

- 활성 pack: `prompts/_base/scene_detail/31.202605200805/` (C9 v1 closure 산물).
- **A042** — `31.../system.md`:
  - `:373` `**회피 원칙**` — `입력 description이 인물의 이동·추진 동작 (running / riding / walking / swimming 류) …` ("류" softened 이나 lexical 4종 enumerate).
  - `:543` `## 동작 동사 freeze — motion direction 보존` — `shot description이 동적 동사 (`running`, `riding`, `walking`, `moving`, `chasing`, `pedaling`, `rowing`)를 명시한 …` (backtick-quoted 7종 닫힌 목록).
  - `:545-561` 금지/권장 예시 + 핵심 원칙 — illustrative freeze 예시 (mid-stride / mid-pedal / mid-row), 닫힌 분류 목록 아님.
- index.html C5 site table 의 `scene_detail/28.../system.md:381,551` 은 **stale ref** — C9 v1 이 이미 v28→v31 bump (line shift). 현 active = v31, line = `:373`/`:543`.
- `detail_steps.py:107` `SCENE_DETAIL_PROMPT_VERSION = "31.202605200805"` / `:106` `SCENE_DETAIL_SCHEMA_VERSION = 12`.

### 2.4 Version cascade surface

- **W1/W2 (`shot_extract`/`shot_validator`)**: alignment test 부재 (`test_prompt_versions.py` 에 shot_extract/shot_validator pin 0). version cascade = `version_registry.py` 2-point — (a) `MODULE_VERSIONS["shot_extractor"]` `2.1.0`→`2.2.0` / `MODULE_VERSIONS["shot_validator"]` `1.4.0`→`1.5.0` + comment, (b) `_MODULE_INFO["shot_extractor"]["prompt_dependency"]` `shot_extract/v11`→`shot_extract/v13` / `_MODULE_INFO["shot_validator"]["prompt_dependency"]` `shot_validator/v4`→`shot_validator/v6` + `updated_at=2026-05-20`. **현 registry 는 file latest 대비 이미 stale (v11/v4 vs v12/v5)** — C5 가 새 버전 신설하며 실제 최신 major 로 정정 (Codex Q3, §3.2).
- **W3 (`scene_detail`)**: C9 v1 와 동일 4-point cascade — (a) `SCENE_DETAIL_PROMPT_VERSION` `detail_steps.py:107`, (b) `MODULE_VERSIONS["scene_detail_composer"]` `1.31.0`→`1.32.0`, (c) `_MODULE_INFO["scene_detail_composer"]["prompt_dependency"]` `scene_detail/v31`→`scene_detail/v32`, (d) alignment/pinned test 전수 — `test_prompt_versions.py` + `test_scene_detail_id_policy_alignment.py` + `test_scene_detail_spatial_alignment.py` + `test_scene_detail_continuity_alignment.py` + integration test (`test_g4_5a_spatial_integration.py` / `test_c1_*` / `test_c2_*` / `test_c9_*`). plan W0 에서 `rg -n "31\.202605200805|scene_detail/v31|1\.31\.0|latest_major.*31"` 로 occurrence enumerate (C9 trap N-1 재발 방지 SSOT).

## 3. OQ Resolution

### 3.1 OQ-C5-1 — 신규 `action_segment[]` schema vs narrow prompt hygiene → **narrow 확정** (Codex entry sanity)

옵션 B (C9/C6/C4 narrow pattern). 신규 schema 필드 0. §1.1 핵심 진단 참조.

### 3.2 OQ-C5-2 — `version_registry` stale provenance → **C5 가 sync** (Codex Q3)

`shot_extractor`/`shot_validator` 의 `MODULE_VERSIONS` + `_MODULE_INFO.prompt_dependency` 가 file latest (v12/v5) 대비 v11/v4 로 stale. C5 가 v13/v6 신설하며 실제 최신 major 로 정정. 단독 stale-cleanup 으로 범위 확대 아님 — C5 가 신설하는 버전 entry 의 provenance 정합성 확보. `prompt_loader` 활성화는 file-fallback latest-pick 이라 registry 와 무관하나, registry 는 provenance/test contract 동기 대상.

### 3.3 OQ-C5-3 — `shot_validator` active contact 카테고리 → **`:113-116` lexical bullet 만 추상화, contract 보존**

A082 audit 범위 `:12-116` 가 active contact freeze rule 을 명시 포함 (triage description: `Active contact freeze rule (stabbing, punching, pinning)`). Codex narrow guard #3 의 "A082 원문이 명시 → closed examples 만 generic guide 로, contract 보존" 분기 적용. `:111` disclaimer 문장 + `:99-110`/`:117-145` contract (force direction / contact point / imbalance / 단서-발명-금지 / `character_ids` 양쪽) 변경 0. `:113-115` 의 찌르기/타격/제압 lexical bullet 을 generic principle (이미 `:116` 4번째 bullet 에 존재 — `능동 동사 + 신체 접촉 + 영향받은 자세가 함께 등장하는 표현`) 로 collapse.

### 3.4 OQ-C5-4 — A069 외모·연령 변화 → **C5 scope 제외, C8 carry**

`shot_extract` 의 변형 기준 (`system.md:40-50`, `user.md:47-61`) + 인물 규칙 (인종/국적) 닫힌 목록은 demographic/appearance transformation 영역 — Area #9 (action segment) 와 본질이 다름. index.html C5 step 5 + C8 sub-area (c) 가 명시한 boundary. C5 W1 은 시간 연결어 site (`user.md:18-19` + `system.md:14-18`) 만 편집하고 변형/인물 섹션 byte-for-byte 불변. 중복 closure claim 금지.

### 3.5 OQ-C5-5 — `shot_extract`/`shot_validator` config_hash 무효화 → **신규 mechanism 미도입** (spec 결정, Codex spec review 확인 요청)

두 step 은 `_config_hash()` / `PROMPT_VERSION` code 상수가 없어 prompt-pack bump 가 cp resume 를 무효화하지 않는다 (config_hash = `compute_config_hash(project_config)` fallback). 이는 pre-existing 조건. C5 narrow 는 신규 config_hash mechanism 을 도입하지 않는다 (new-mechanism ban — C4 가 신규 producer NO-GO 한 것과 동일 결). prompt 추상화는 의미 보존 (intent-preserve) 이므로 기존 cp 재사용도 출력 shape/consumer contract 관점에서 안전 (닫힌 목록 제거가 출력 shape 변경 0). 단 prompt-pack bump 가 cp resume 를 자동 stale 처리하지 않으므로, 기존 episode 에 C5 prompt 적용은 operator force/rerun 필요. `version_registry` sync 는 provenance only. **Codex spec review 가 이 결정을 확인 (APPROVED WITH PLAN NOTE).**

### 3.6 wave 구조 → **4-wave** (Codex Q2)

W1 `shot_extract` / W2 `shot_validator` / W3 `scene_detail` / W4 closure docs. 신규 regression test 는 각 prompt change commit (W1-W3) 에 동승 — W4 는 docs atomic + gate re-run only.

### 3.7 OQ-C5-6 — W1 execution-time blocker: `shot_schema.json` v13 통합 vs OpenAI strict 위반 노출 → **schema 미통합** (Codex `OPTION_1_APPROVED`)

W1 실행 중 `test_prompt_schema_openai_strict.py::test_latest_prompt_schemas_openai_strict_compatible` 신규 fail. root cause — `shot_schema.json` (v9/v10) 은 `characters` 를 properties 에 두되 required 에서 제외 (pre-existing OpenAI strict 위반). strict linter 는 각 module 의 **latest version dir** schema 만 검사 — C5 전 `shot_extract` latest dir (v12) 는 schema 부재 → 위반 dormant (C4 closure 회귀에서도 green). v13 에 schema 통합 시 v13 가 schema 보유 latest dir → linter 가 처음 검사 → pre-existing 위반 노출 → gate red. **결정 (Codex `OPTION_1_APPROVED`)**: W1 은 `shot_schema.json` 을 v13 에 통합하지 않는다 — v13 = `system.md` + `user.md` only, `shot_schema.json` 은 v10 에서 per-stem fallback 로드 (pre-existing stem drift 상태 유지 — `prompt_loader` documented per-stem 동작, benign). 옵션 2 (`characters` 를 required 에 추가) NO-GO — schema structural change + §4.4 byte-identical invariant 위반 + C5 scope (closed-list 추상화) 밖 schema-strict compliance fix. schema-strict 위반 자체 = 별도 carry (C8/C10 또는 dedicated schema-strict cleanup, §1.3).

## 4. Invariants

### 4.1 No closed-list / closed-enumeration invariant
추상화된 prompt stem 에 시간 연결어 토큰 목록 / locomotion·active-contact lexicon / 신체 부위·동작 동사 lexicon / dynamic verb backtick 목록의 닫힌 enumeration 0. 의미 기반 generic principle 로만 표현.

### 4.2 Intent-preserve invariant
"한 shot = 한 찰나, 두 시간 segment 금지" / "이동·추진 동작이면 motion direction 보존" / "visible-human-action 인데 characters 비면 repair" — 세 routing intent 전부 generic principle 로 보존. 추상화 = 토큰 목록 제거이지 규칙 폐기 아님.

### 4.3 No new field/wording invariant
`action_segment` / `segment_kind` / `start_anchor` / `end_anchor` 신규 필드·문구 도입 0 (Codex guard).

### 4.4 Schema byte-identical / no-change invariant
`validator_schema.json` (v6 = v5 sha256 동일) / `detail_schema.json` (v32 = v31 sha256 동일) byte-identical sibling. `shot_schema.json` — v13 에 미통합, v10 per-stem fallback (파일 자체 변경 0). 구조/enum/required/type 변경 0.

### 4.5 Version artifact invariant
`SCENE_DETAIL_SCHEMA_VERSION=12` 보존. `shot_extract`/`shot_validator`/`scene_detail` step_manifest entry 불변. `SCENE_DETAIL_PROMPT_VERSION` 만 31→32 bump (cp config_hash 무효화 — scene_detail 만 해당).

### 4.6 Contract preserve invariant
`shot_validator` active contact freeze contract (force/contact-point/imbalance/단서-발명-금지/`character_ids` 양쪽) + `characters`/`character_ids` fail-fast·repair contract — 변경 0. `:113-116` lexical bullet + 판정 기준 lexicon 만 추상화.

### 4.7 Boundary preserve invariant
A069 (외모·연령 변화) 닫힌 목록 + `shot_extract` 변형 기준/인물 규칙 섹션 byte-for-byte 불변. scene_detail mid-action freeze 예시 (`:545-561` mid-stride/mid-pedal/mid-row) — illustrative 예시, 변경 0.

### 4.8 NO VLM / no live LLM invariant
모든 gate 는 static (파일 read / sha256 / `load_prompt` smoke / version_registry 정합). live LLM 호출 / VLM 0.

## 5. W1-W4 Implementation Plan

### 5.1 W1 — `shot_extract` v13 prompt-pack + version_registry sync + C5 test (atomic commit)

1. `cp -r prompts/_base/shot_extract/12.202605181937 prompts/_base/shot_extract/13.<W1_UTC>` (UTC = runtime `date -u +%Y%m%d%H%M`). `shot_schema.json` 은 v13 에 복사하지 않음 — v13 = `system.md` + `user.md` only, schema 는 v10 per-stem fallback 유지 (W1 OQ blocker, §3.7).
2. `13.../user.md` — 시간 연결어 닫힌 목록 2줄 → generic principle 1줄. 같은 블록의 generic 원칙 + 진행형 금지 줄 보존.
3. `13.../system.md` — `## 시간 연결어 절대 금지` 섹션의 닫힌 목록 → generic principle. 섹션 header + `두 개 이상의 순간이 섞인 것` 진술 보존.
4. `version_registry.py` — `MODULE_VERSIONS["shot_extractor"]` `2.1.0`→`2.2.0` + C5 comment, `_MODULE_INFO["shot_extractor"]` `prompt_dependency` `shot_extract/v13` + `updated_at` `2026-05-20`.
5. `backend/tests/prompts/test_c5_action_segment_sot.py` 신설 — W1 gate (§7 G1-G3, G_reg, G_loader). `test_area_7b_no_drift.py` `NEW_DIR_EXPECTED` shot_extract `12.`→`13.` (plan-gap absorb).
6. atomic commit `W1(c5-action-segment-sot-v1): shot_extract v13 prompt-pack — 시간 연결어 닫힌 목록 추상화 (A064/A068, generic still-moment principle) + version_registry sync + C5 test + area_7b no-drift canary sync (5 file)`.

### 5.2 W2 — `shot_validator` v6 prompt-pack + version_registry sync + C5 test (atomic commit)

1. `cp -r prompts/_base/shot_validator/5.202605081700 prompts/_base/shot_validator/6.<W2_UTC>`.
2. `6.../system.md` 추상화 4개 site:
   - `:12-17` 시간 연결어 닫힌 목록 → generic principle. `## 결과 상태 묘사는 허용` 섹션 (`:18-30`, `~한 채` OK/NG 판단기준) 보존.
   - `:36-41` locomotion 5 카테고리 lexicon → generic principle (`인물의 이동·추진 동작 일반`). `:34` disclaimer 취지 흡수, freeze 예시 (`:43-59`) 보존.
   - `:113-116` active contact lexical bullet 3 → `:116` 의 generic 4번째 bullet 로 collapse (§3.3). `:111` disclaimer 문장 + contract 보존.
   - `:159-161` visible-human-action 판정 lexicon 3 bullet → generic principle. `:157` `(3 중 1 이상 만족)` → 의미 기반 판정 wording, `:163-175` repair/fail-fast contract 보존.
3. `cp` 시 동봉된 `validator_schema.json` byte-identical 확인 (sha256 == v5).
4. `version_registry.py` — `MODULE_VERSIONS["shot_validator"]` `1.4.0`→`1.5.0` + C5 comment, `_MODULE_INFO["shot_validator"]` `prompt_dependency` `shot_validator/v6` + `updated_at`.
5. `test_c5_action_segment_sot.py` — W2 gate append (§7 G4-G8).
6. atomic commit `W2(c5-action-segment-sot-v1): shot_validator v6 prompt-pack — 시간 연결어·locomotion·active-contact·visible-human-action 닫힌 lexicon 추상화 (A082/A083) + version_registry sync + C5 test`.

### 5.3 W3 — `scene_detail` v32 prompt-pack + 4-point cascade + C5 test (atomic commit)

1. `cp -r prompts/_base/scene_detail/31.202605200805 prompts/_base/scene_detail/32.<W3_UTC>`.
2. `32.../system.md` 추상화 2개 site:
   - `:373` `**회피 원칙**` — `(running / riding / walking / swimming 류)` lexical enumerate → `(인물의 이동·추진 동작)`. 문장 나머지 보존.
   - `:543` `## 동작 동사 freeze` — `동적 동사 (`running`, `riding`, ...)` backtick 7종 목록 → generic `인물의 이동·추진 동작`. `:545-561` 예시/원칙 보존.
3. `detail_schema.json` 등 그 외 stem byte-identical 확인 (sha256 == v31).
4. 4-point cascade — `detail_steps.py:107` `SCENE_DETAIL_PROMPT_VERSION` `31.*`→`32.<W3_UTC>` + `:106` `SCENE_DETAIL_SCHEMA_VERSION=12` 불변 확인 / `version_registry` `MODULE_VERSIONS["scene_detail_composer"]` `1.31.0`→`1.32.0` + comment / `_MODULE_INFO` `prompt_dependency` `scene_detail/v32` / alignment·pinned test 전수 동기 (plan W0 SSOT enumerate).
5. `test_c5_action_segment_sot.py` — W3 gate append (§7 G9-G10).
6. atomic commit `W3(c5-action-segment-sot-v1): scene_detail v32 prompt-pack — dynamic verb 닫힌 목록 추상화 (A042) + 4-point version cascade + C5 test`.

### 5.4 W4 — integrated gate + closure docs atomic (path-limited)

1. cross-cutting gate re-run (§7 integrated) — 백엔드 전체 회귀 + clean HEAD baseline 대조.
2. closure docs atomic — 본 spec status `closed` + §10 / plan status / roadmap §5.9 closed entry / index.html C5 marker (원안 `action_segment[]` superseded 명시).
3. atomic commit `W4(c5-action-segment-sot-v1): closure docs atomic — spec/plan status + roadmap §5.9 + fix-critical-1 C5 marker`.

## 6. Boundary Preserve

| 보존 대상 | 이유 |
|-----------|------|
| `shot_extract` 변형 기준 / 인물 규칙 / A069 외모·연령 닫힌 목록 (`system.md:40-61`, `user.md:42-71`) | C8 Area #7 sub-area (c) carry — C5 scope 외 (§3.4) |
| `shot_validator` active contact freeze contract (`:99-110`, `:117-145`) | contract — `:113-116` lexical bullet 만 추상화 (§3.3) |
| `shot_validator` `characters`/`character_ids` fail-fast·repair contract (`:163-175`) | A083 = 판정 lexicon 만 추상화, contract 불변 |
| `shot_validator` `## 결과 상태 묘사는 허용` 섹션 (`:18-30`) | generic 판단기준 — 추상화 대상 아님, 보존 |
| scene_detail mid-action freeze 예시 (`:545-561`) | illustrative 예시 — 닫힌 분류 목록 아님 |
| `validator_schema.json`/`detail_schema.json` byte-identical + `shot_schema.json` v13 미통합 | 구조 변경 0 (§4.4) |
| C1·C2·C3·C4·C6·C7·C9 산물 | 별도 area |

## 7. Test Gates

신규 `backend/tests/.../test_c5_action_segment_sot.py` — W1-W3 commit 에 분산 동승. 전부 static (NO VLM, no live LLM).

**W1 (shot_extract v13)**
- **G1** — `13.../user.md` 시간 연결어 닫힌 목록 부재 (`"~하면서"` quoted-comma 패턴 + `while ~ing` 영어 목록 absent), generic principle present.
- **G2** — `13.../system.md` 동일 (시간 연결어 닫힌 목록 absent, generic principle present).
- **G3** — `13.../` = `system.md` + `user.md` only (`shot_schema.json` 미통합 — W1 OQ blocker 옵션 1).
- **G_reg(W1)** — `version_registry` `shot_extractor` `2.2.0` + `prompt_dependency=shot_extract/v13`.
- **G_loader(W1)** — `system`/`user` stem v13 resolve + `shot_schema` stem v10 per-stem fallback resolve (`_resolve_stem_in_pack`); `load_prompt`/`load_schema` RuntimeError 0; latest major == 13.

**W2 (shot_validator v6)**
- **G4** — `6.../system.md` 시간 연결어 닫힌 목록 absent, generic principle present.
- **G5** — locomotion 5 카테고리 lexicon (`running / sprinting / striding` 류) absent, generic `이동·추진 동작` principle present.
- **G6** — active contact `:113-116` lexical bullet (`stabbing, slashing` / `punching, striking` / `pinning, choking`) absent; `:111` disclaimer + force/contact-point/imbalance contract present (canary).
- **G7** — visible-human-action 신체 부위·동작 동사 lexicon absent; fail-fast/repair contract wording present (canary).
- **G8** — `6.../validator_schema.json` sha256 == v5; `version_registry` `shot_validator` `1.5.0` + `prompt_dependency=shot_validator/v6`; `load_prompt` v6 resolve.

**W3 (scene_detail v32)**
- **G9** — `32.../system.md` dynamic verb backtick 닫힌 목록 (`running`, `riding`, … 7종) absent (path-scoped — bare `running` global grep 금지); `:373` lexical enumerate absent; generic `이동·추진 동작` principle present; mid-action freeze 예시 (canary) present.
- **G10** — `32.../detail_schema.json` sha256 == v31; `SCENE_DETAIL_PROMPT_VERSION` `32.*` + `SCENE_DETAIL_SCHEMA_VERSION=12`; `version_registry` `scene_detail_composer` `1.32.0` + `prompt_dependency=scene_detail/v32`; alignment/pinned test 전수 v32; `load_prompt`/`load_schema` v32 resolve.

**Integrated (W4)**
- 백엔드 전체 회귀 — C5 신규 failure 0. pre-existing failure 는 clean HEAD `5f6b68b` git stash baseline 대조 확정.
- residue gate latest active pack path-scoped — 예문/history/docs false hit 분리.

## 8. Risk + Open Issues

- **R1 — 닫힌 lexicon 제거 후 LLM 분류 정확도**: roadmap §5.9 Risk 명시 — 한국어 grammar pattern → generic principle 전환 시 production verify 의무. mitigation: generic principle 이 의미를 명확히 진술 (토큰 제거 ≠ 규칙 폐기), 기존 병존 generic 원칙 (shot_extract `:16-21`, shot_validator `:18-30`) 이 이미 backstop.
- **R2 — scene_detail W3 pinned occurrence 누락** (C9 trap N-1 재발 위험): plan W0 에서 `rg` occurrence enumerate 를 SSOT 로 삼아 전수 동기.
- **R3 — config_hash 무효화 부재** (`shot_extract`/`shot_validator`): §3.5 — pre-existing, C5 신규 mechanism 미도입. **OQ-C5-5 → Codex spec review 확인 대상.**
- **OQ-C5-A** (Codex spec review) — active contact `:113-116` 추상화 범위 (§3.3) 가 narrow guard #3 에 부합하는지 확인.
- **OQ-C5-B** (Codex spec review) — §3.5 config_hash 신규 mechanism 미도입 결정 확인.

## 9. Doctrine references

- [[feedback_llm_based_judgment]] — Prompt Closed-List Ban (4 강제 gate). C5 = closed-list-in-prompt 단독 위반.
- [[feedback_no_vlm_dependency]] — VLM 의존 0. 모든 gate static.
- [[project_fix_critical_1_persistent]] — fix-critical-1 C5 = Tier β #8, index.html C5 section.
- C9/C6/C4 v1 closure — closed list → generic semantic principle 추상화 직전 선례 패턴.

## 10. Closure (2026-05-20+)

**Status: closed** — C5 v1 W1-W4 4-wave 실행 완료. fix-critical-1 Tier β #8, roadmap §5.9 Area #9. 5 audit row (A042 + A064 + A068 + A082 + A083) 해소. **옵션 B narrow** — 신규 `action_segment[]` schema 0, closed lexicon → generic semantic principle 추상화. A069 = C8 carry.

### 10.1 Commit chain
- W1 `cfb9184` — `shot_extract` v13 prompt-pack (`13.202605201049/`) — 시간 연결어 닫힌 목록 추상화 (A064 user.md / A068 system.md, generic still-moment principle) + `version_registry` `shot_extractor` 2.1.0→2.2.0 sync + `test_c5_action_segment_sot.py` 신설 (W1 gate) + `test_area_7b_no_drift.py` `NEW_DIR_EXPECTED` shot_extract `12.`→`13.` (plan-gap absorb). v13 = `system.md` + `user.md` only (shot_schema 미통합 — W1 OQ blocker §3.7). 5 file, 257+/4-.
- W2 `086ab0a` — `shot_validator` v6 prompt-pack (`6.202605201118/`) — 시간 연결어·locomotion·active-contact·visible-human-action 닫힌 lexicon 추상화 (A082/A083, generic semantic principle) + `version_registry` `shot_validator` 1.4.0→1.5.0 sync + C5 test G4-G8 append. active contact freeze / characters-character_ids fail-fast contract 변경 0. `validator_schema.json` byte-identical. 4 file, 298+/3-.
- W3 `2f41467` — `scene_detail` v32 prompt-pack (`32.202605201133/`) — dynamic verb 닫힌 목록 추상화 (A042 system.md `:373`/`:543`, generic motion principle) + 4-point version cascade (`SCENE_DETAIL_PROMPT_VERSION` 31→32 / `MODULE_VERSIONS` 1.31.0→1.32.0 / `prompt_dependency` v31→v32 / `SCENE_DETAIL_SCHEMA_VERSION=12` 불변) + 8 alignment file sync + C5 test G9-G10 append. `detail_schema.json` byte-identical. 11 file, 843+/82-.
- W3 fix-up 1 `3d901cc` — `version_registry.py` `_MODULE_INFO["scene_detail_composer"]["updated_at"]` comment C9/v31→C5/v32 정정 (`prompt_dependency` comment 와 자기모순 해소, comment-only). 1 file, 1+/1-.
- W4 closure commit — 본 closure docs atomic (4 docs path-limited: spec + plan + roadmap §5.9 + index.html C5 marker). hash 는 push 후 external memory 기록 (W4 self-hash 금지).

### 10.2 Gate result
- W1 — C5 test 5 passed (G1-G3/G_reg/G_loader) / shot_extract+area_7b regression 71 passed / residue (split-string 한국어+영어 needle + schema absence) OK / 백엔드 전체 5 failed / 4082 passed. `test_prompt_schema_openai_strict` — W1 OQ blocker 해소 후 PASS.
- W2 — C5 test 10 passed / shot_validator regression 69 passed / residue (영문+한국어 needle 13 + contract canary 5 + schema sha256) OK / 5 failed / 4087 passed.
- W3 — C5 test 12 passed / scene_detail alignment+regression 119 passed / residue (backtick+slash+한국어 mini-list + schema sha256 + version) OK / 5 failed / 4089 passed.
- W3 fix-up 1 — C5 test + scene_detail alignment + g4_5a 4-way 50 passed (comment-only).
- W4 — closure docs atomic (docs-only, code/prompt/test 변경 0).
- 5 failures = pre-existing (`test_analysis_dispatch_service` ×1 / `test_prompt_service` ×1 / `test_text_cleanup` ×3 — `clean_text` ImportError). C4 closure baseline 과 동일. C5 W1-W4 신규 failure 0. C5 test 총 12개 (W1 5 / W2 5 / W3 2).

### 10.3 Codex review trace
- C5 entry sanity — `APPROVED_FOR_SPEC_DRAFTING_WITH_NARROW_GUARDS` (옵션 B narrow 확정, `action_segment[]` NO-GO, 4-wave, version_registry sync, boundary A069).
- spec review v1 `APPROVED_FOR_PLAN` (OQ-C5-A active contact `:113-115` collapse APPROVED / OQ-C5-B config_hash mechanism 미도입 APPROVED WITH PLAN NOTE).
- plan review iter 1 `NEEDS_REVISION_NARROW_1` (BLOCKING: 교체 wording 4곳 한국어 mini-list 재도입 / IMPORTANT: residue gate 한국어 needle + §5.2 per-wave report) → amend 1 → plan re-review `APPROVED_FOR_EXECUTION`.
- W1 per-wave `NEEDS_REVISION_NARROW_1` (spec §5.1 schema 통합 stale residue) → W1 re-review `APPROVED_FOR_W2_ENTRY`. W1 OQ blocker → `OPTION_1_APPROVED` (schema 미통합).
- W2 per-wave `APPROVED_FOR_W3_ENTRY` (active contact 핵심 원칙 line illustrative `류` = non-blocking boundary-keep).
- W3 per-wave `NEEDS_REVISION_NARROW_1` (version_registry `updated_at` comment C9/v31 stale) → W3 fix-up 1 → W3 re-review `APPROVED_FOR_W4_ENTRY`.
- W1-W4 range review — W4 closure commit 후 기재 (push 후 external memory).

### 10.4 함정 (lessons)
- **N-1 W1 OQ blocker — prompt-pack stem 통합이 latest-dir-only linter 에 dormant 위반 노출**: index.html/Codex entry sanity 의 "shot_schema.json v10→v13 통합 (stem drift 해소)" 지시대로 v13 에 schema 통합 시 `test_prompt_schema_openai_strict.py` (각 module 의 **latest version dir** schema 만 lint) 가 `shot_schema.json` 의 pre-existing dormant 위반 (`characters` properties 有 / required 無, OpenAI strict) 노출 → W1.4 신규 fail. C5 전 `shot_extract` latest dir (v12) 는 schema 부재라 lint 제외 → dormant. **해소 = Codex `OPTION_1_APPROVED`**: schema 미통합 (v13 = system.md+user.md only, v10 per-stem fallback). 옵션 2 (`characters` required 추가) NO-GO (schema structural change + scope creep). 향후 prompt-pack stem 통합 시 latest-dir-only linter 노출 위험 사전 점검 의무.
- **N-2 plan W0 가 area_7b latest-activation canary 미열거**: plan §3.2/§5.2 alignment-pin W0 가 `test_prompt_versions.py` 만 확인, `test_area_7b_no_drift.py` 의 `NEW_DIR_EXPECTED` (latest-activation canary, C1/C2/C9 가 갱신해온 alignment pin) 누락. W1 (shot_extract) + W3 (scene_detail) 양쪽 plan-gap 흡수. alignment-pin W0 = `test_prompt_versions.py` + `test_area_7b_no_drift.py` canary + dedicated alignment test 전수.
- **N-3 broad grep 패턴 부족 — dict-value 형태 미포착**: W3 §5.2 broad grep (`scene_detail/v31`/`1.31.0`/`31.202605200805`) 가 `test_area_7b_no_drift.py` 의 `"scene_detail": "31."` dict-value 형태 미포착. occurrence SSOT grep 은 `"<module>": "<major>."` dict-value 형태도 포함 의무. §5.2 의 "실행 시점 broad grep 재확인 + 파일별 분류" 가 backstop 으로 작동 (W3 8번째 alignment file 흡수).
- **N-4 version_registry `_MODULE_INFO` metadata block 양쪽 comment 동기**: W3 4-point cascade 가 `prompt_dependency` comment 는 C5/v32, 같은 block `updated_at` comment 는 C9/v31 stale 잔존 → 자기모순 → Codex W3 per-wave `NEEDS_REVISION_NARROW_1` → W3 fix-up 1. metadata block 갱신 시 block 내 모든 comment 동기 의무.
- **N-5 test_c9 cosmetic stale 변수명 (non-blocking KEEP)**: `test_c9_scene_detail_body_light_verb.py` `test_g5` 가 v30 vs `SCENE_DETAIL_PROMPT_VERSION` (C5 후 v32) detail_schema.json 비교 — v30==v31==v32 byte-identical 이라 transitive PASS, 함수명 `to_v30` 정확. 내부 `v31_schema`/`v31_dir` 변수명만 cosmetic stale → C9-test scope 보존 (Codex non-blocking). 기능 문제 0.

### 10.5 carry priority
C5 closed → 다음 = C8 (#7 잔여 sub-area split (a)/(c)/(d) + code carry, Tier γ #9). 잔여 = C8/C10.
- **schema-strict carry**: `shot_extract/.../shot_schema.json` 의 `characters` properties-有/required-無 (OpenAI strict 위반) — C5 scope 외 (§3.7, W1 OQ blocker). C8/C10 또는 dedicated schema-strict cleanup 으로.
