{"candidate_reason": "python scope discovery", "chunk_end": 63, "chunk_start": 1, "chunk_summary": "The file defines a canonical enum for framing scales and performs exact validation on structured input with no actionable findings.", "duration_ms": 4572, "findings": [], "path": "backend/app/core/framing_scale.py", "scan_kind": "python", "sha256": "a48840fd0a5c37397cb26a10a57d4bd4333071aa55ad4bae0f6db74f786ca4e3"}
{"candidate_reason": "python scope discovery", "chunk_end": 454, "chunk_start": 1, "chunk_summary": "The file implements deterministic detectors that use extensive Korean and English lexicons and regex patterns to infer visual framing, gaze targets, and off-screen status from natural-language scenario descriptions and camera directions.", "duration_ms": 17306, "findings": [{"category": "semantic_string_judgment", "evidence": "detect_gaze_pattern_exclusions uses _KOREAN_GAZE_STEMS, _KOREAN_FRAMING_NOUNS, and _BODY_PART_NOUNS", "line_end": 304, "line_start": 37, "recommended_fix": "Replace natural-language parsing with structured LLM outputs where the director explicitly identifies gaze_subject and gaze_target as entity IDs.", "severity": "P1", "why_problematic": "This mechanism decides entity visibility membership by parsing Korean natural-language descriptions for specific gaze verbs and framing nouns. It uses brittle heuristics (like body-part possession checks) to disambiguate open-world prose, which is prone to false triggers as story-telling style evolves."}, {"category": "semantic_string_judgment", "evidence": "detect_offscreen_drift uses OFFSCREEN_RE and _PROXIMITY_PRE/POST", "line_end": 445, "line_start": 85, "recommended_fix": "Update the staging schema to include a structured off_screen_entities list of IDs, and validate against that list instead of parsing the camera_direction string.", "severity": "P1", "why_problematic": "This function triggers a fail-fast validation error (VisibleStagingDriftError) by searching for 'off-camera' or '화면 밖' phrases in natural-language camera directions and associating them with nearby character names. This makes system stability dependent on specific phrasing in generated prose."}, {"category": "semantic_string_judgment", "evidence": "_detect_directional_pattern uses _DIRECTIONAL_TAILS and _CLOSE_UP_MARKERS", "line_end": 234, "line_start": 172, "recommended_fix": "Centralize visual framing logic into the structured shot schema rather than inferring it from directional phrases in the description.", "severity": "P1", "why_problematic": "It implements a '4-token gate' requiring specific markers like '클로즈업' or '쪽으로' to infer visual intent. This is a high-maintenance semantic classifier that attempts to reconstruct visual logic from unstructured text."}], "path": "backend/app/modules/pipeline/shot_visibility.py", "scan_kind": "python", "sha256": "1b551eb799e33ae1cd96ed94b561fda2b0921cd0a2f8d77e4f2ba515d2af15db"}
{"candidate_reason": "python scope discovery", "chunk_end": 457, "chunk_start": 1, "chunk_summary": "The file implements a reference contract validator that uses keyword-based semantic classification of natural language prompts to enforce reference attachment rules.", "duration_ms": 17784, "findings": [{"category": "semantic_string_judgment", "evidence": "_CHARACTER_TOKENS, _BACKGROUND_TOKENS, _OBJECT_TOKENS, _FROM_THE_REFERENCE_RE, classify_from_the_reference", "line_end": 190, "line_start": 49, "recommended_fix": "Replace the post-hoc prompt parsing with structured metadata. The component generating the prompt should explicitly tag which entities or reference types are being invoked by specific phrases, rather than relying on keyword heuristics like 'her hand' or 'mart'.", "severity": "P1", "why_problematic": "The 'phantom guard' logic uses brittle keyword lists and regex to infer the semantic target (character, background, or object) of the phrase 'from the reference' within natural language prompt text. This inference is used in validate_attached_refs (lines 426-457) to fail validation (RefContractError), blocking image generation based on string-pattern matching of open-world prose."}], "path": "backend/app/core/ref_contract_validator.py", "scan_kind": "python", "sha256": "93a34075f568486f74bd384f96f18208bab54f8e5777726c6d7beef955a7b504"}
{"candidate_reason": "python scope discovery", "chunk_end": 70, "chunk_start": 1, "chunk_summary": "No actionable findings; the file handles technical machine identifiers (short IDs) using a fixed prefix mapping and database lookups without performing semantic analysis on natural language.", "duration_ms": 5700, "findings": [], "path": "backend/app/modules/short_id.py", "scan_kind": "python", "sha256": "a12da612ad174a03abd3fc704048950edc892d574fbad599ae73f53b5b9a325e"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 25, "chunk_start": 1, "chunk_summary": "The file is a technical layout validator for a webbook PDF and contains no actionable scenario pollution or brittle semantic string patterns.", "duration_ms": 5992, "findings": [], "path": "prompts/_base/pdf_validation/v1/validate.md", "scan_kind": "prompt", "sha256": "9d9d162a76c35ddaa16838e139091f919d987a92e1182e122eb4df0cdabe6035"}
{"candidate_reason": "python scope discovery", "chunk_end": 213, "chunk_start": 1, "chunk_summary": "The file defines controlled vocabularies and validators for background IDs and state classes, containing hardcoded semantic categories that require manual synchronization with LLM prompts.", "duration_ms": 28552, "findings": [{"category": "schema_or_enum_drift", "evidence": "STATE_CLASS_ENUM: FrozenSet[str] = frozenset({\n    \"normal\",\n    \"quiet\",\n    \"busy\",\n    \"busy_exit\",\n    \"ransacked\",\n    \"clean_after\",\n    \"blood_scene\",\n    \"intrusion\",\n    \"arrival\",\n    \"evidence_display\",\n    \"dream_or_vision_state\",\n})", "line_end": 56, "line_start": 26, "recommended_fix": "Define the state_class enum in a shared schema (e.g., a JSON schema or a central Pydantic model) that can be used to both generate the LLM prompt instructions and perform validation in code.", "severity": "P2", "why_problematic": "The state_class vocabulary contains scenario-specific semantic labels (e.g., 'ransacked', 'blood_scene') that are enforced via exact string matching in validate_state_class. As noted in the docstring (line 48), this enum must be manually synchronized with LLM prompts, creating a risk of drift where the LLM produces valid semantic descriptions that the code rejects."}, {"category": "schema_or_enum_drift", "evidence": "LOCATION_SPACE_KEY_VOCAB: FrozenSet[str] = frozenset({\n    \"main\",\n    \"kitchen\",\n    \"rooftop\",\n    \"stairs\",\n    \"yard\",\n    \"exterior\",\n    \"office\",\n})", "line_end": 213, "line_start": 128, "recommended_fix": "Centralize the location space vocabulary in a schema file that is used to hydrate both the LLM system prompts and the validation logic.", "severity": "P2", "why_problematic": "The location space keys are hardcoded semantic categories for scene locations. The comment at line 127 explicitly states that this list must be kept in sync with the entity_extractor system prompt. This manual synchronization is brittle and prone to drift as new location types are needed for different scenarios."}], "path": "backend/app/core/bg_state_vocab.py", "scan_kind": "python", "sha256": "d6c2d1fccafa20ba72e40e90ca8a76f14d4225eebe57c37a205c010e50e9aafd"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 21, "chunk_start": 1, "chunk_summary": "The file defines a standard JSON schema for a scene detail judge and contains no actionable findings.", "duration_ms": 5585, "findings": [], "path": "prompts/_base/scene_detail_owned_judge/3.202605051746/schema.json", "scan_kind": "prompt", "sha256": "2ceaa86e4bda0aec69b371fce33acf8f39965e993a82a7a29e0bc21aa6c25967"}
{"candidate_reason": "python scope discovery", "chunk_end": 953, "chunk_start": 1, "chunk_summary": "The validator uses regex and substring matching over generated prompt text to infer visual framing and entity associations, which directly controls ID enforcement and validation pass/fail behavior.", "duration_ms": 30643, "findings": [{"category": "semantic_string_judgment", "evidence": "_FACE_CLOSE_UP_PATTERNS and t.lower() in prompt_lower", "line_end": 230, "line_start": 139, "recommended_fix": "Pass framing and focus metadata as structured boolean or enum fields from the producer (e.g., in id_policy) instead of inferring them from the prompt prose.", "severity": "P1", "why_problematic": "The validator infers visual framing (face close-up) and focus state (body part focus) by matching natural-language patterns against the generated t2i_prompt. This decision determines whether character ID enforcement is exempted or required, leading to potential AppError fail-fasts based on brittle string matching."}, {"category": "semantic_string_judgment", "evidence": "_entity_specific_id_in_window and _ANCHOR_WINDOW = 60", "line_end": 571, "line_start": 102, "recommended_fix": "Use a structured prompt format where IDs are explicitly linked to entities, or rely on the LLM to output a mapping of names to IDs in a separate field.", "severity": "P1", "why_problematic": "It uses a character-window heuristic (60 chars) and sentence boundary detection to infer if a character's natural-language name in the prompt is correctly associated with their technical ID. This is an attempt to parse semantic relationships from unstructured prose."}, {"category": "schema_or_enum_drift", "evidence": "kind == \"character\", kind == \"character_outlook\", kind == \"prop\", kind == \"location\", kind == \"background\"", "line_end": 756, "line_start": 659, "recommended_fix": "Define a formal Enum for reference kinds in the schema and use it for both production and validation.", "severity": "P2", "why_problematic": "The 'kind' field in required_refs is validated against a hardcoded list of strings in code, but the schema does not enforce this as a formal enum, leading to drift between the producer's output and the validator's expectations."}], "path": "backend/app/core/visible_entities_validator.py", "scan_kind": "python", "sha256": "366e2185c5df853112075146a74dc8d81d4c36e5fe4441689b7cc81833b80485"}
{"candidate_reason": "python scope discovery", "chunk_end": 454, "chunk_start": 1, "chunk_summary": "The file implements a T2I prompt review system that uses an LLM to suggest fixes for generated prompts, which are then applied using blind string replacement.", "duration_ms": 28918, "findings": [{"category": "blind_string_mutation", "evidence": "old.replace(target, suggestion) and old_prompt.replace(target, suggestion)", "line_end": 454, "line_start": 383, "recommended_fix": "Instead of blind substring replacement, have the LLM return the full corrected prompt or use a more robust structured editing approach that identifies specific tokens or segments to modify.", "severity": "P1", "why_problematic": "The functions _apply_entity_fixes and _apply_scene_fixes perform blind substring replacement on generated T2I prompt text using 'target' and 'suggestion' strings produced by an LLM. This is brittle because the target substring may appear multiple times or as part of other words, leading to unintended semantic corruption of the visual prompt without context-aware parsing."}], "path": "backend/app/modules/pipeline/t2i_review.py", "scan_kind": "python", "sha256": "e5323a52576aa62eafcd92d24ae73f9667641d7fc4d92cc1e588b23e2239b5b8"}
{"candidate_reason": "python scope discovery", "chunk_end": 779, "chunk_start": 1, "chunk_summary": "The file uses regex and keyword lists to classify visual framing from natural language, employs brittle Korean string prefixes for retry logic, and contains scenario-specific examples in prompts.", "duration_ms": 33685, "findings": [{"category": "semantic_string_judgment", "evidence": "_ELEMENT_ID_CLOSE_REGEX = re.compile(...) and _DESCRIPTION_CLOSE_KEYWORDS = (...) used in _classify_framing", "line_end": 120, "line_start": 65, "recommended_fix": "Move framing classification to the LLM schema as an explicit field or use a dedicated vision-language model to determine framing, rather than relying on keyword matching over natural language descriptions.", "severity": "P1", "why_problematic": "It uses a hardcoded list of body parts (wrist, hand, eye, etc.) and cinematic keywords to infer visual framing ('close' vs 'full') from element IDs and descriptions. This classification directly triggers validation failures (STATUS_VALIDATOR_VIOLATIONS) and blocks downstream consumption."}, {"category": "semantic_string_judgment", "evidence": "summary.startswith(\"분석 실패\") or summary.startswith(\"분석 차단\")", "line_end": 620, "line_start": 355, "recommended_fix": "Rely exclusively on the structured 'status' field for routing and validation. Migrate old checkpoints to include the proper status enum instead of parsing summary text.", "severity": "P2", "why_problematic": "The code routes retry and validation logic based on hardcoded Korean string prefixes in the 'analysis_summary' field. This is brittle and will break if the prompt or LLM output format for summaries changes."}, {"category": "scenario_dependent_prompt", "evidence": "사망/부상/의식불명 인물의 자세와 위치, 환경 상태 (깨진 창문, 열린 문, 혈흔 등)", "line_end": 751, "line_start": 749, "recommended_fix": "Use more abstract categories for extraction guidance (e.g., 'static physical states', 'environmental damage', 'fixed props') and provide neutral examples if necessary.", "severity": "P2", "why_problematic": "The prompt contains concrete scenario-specific examples (dead/injured/unconscious states, broken windows, bloodstains) as instructions for extraction. This biases the LLM towards specific tropes and may cause it to overlook other relevant static elements in different genres."}], "path": "backend/app/core/steps/scene_consistency_step.py", "scan_kind": "python", "sha256": "a07ea382bb71f5f22aa07c2f67ccd3ca32b598675d75e6e1b8731e0664ec9267"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 16, "chunk_start": 1, "chunk_summary": "No actionable findings; the file is a neutral prompt template using placeholders for structured context without scenario pollution or semantic string classifiers.", "duration_ms": 2438, "findings": [], "path": "prompts/_base/t2i_composer/v1/user.md", "scan_kind": "prompt", "sha256": "81af21682d5f98b7f21ae45575b86c796400e419ed0d7465df66c1757c212882"}
{"candidate_reason": "python scope discovery", "chunk_end": 363, "chunk_start": 1, "chunk_summary": "The file provides structured validation and preparation logic for a frame spatial contract, using technical identifiers and enums rather than brittle natural-language patterns, with only a soft diagnostic performing substring checks.", "duration_ms": 40869, "findings": [], "path": "backend/app/core/frame_spatial_contract.py", "scan_kind": "python", "sha256": "dc8cd3121d7ca06ba098541ab7a40a722f0c79326fa6c4f65ed6b0ded2483f80"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 68, "chunk_start": 1, "chunk_summary": "The prompt defines entity visibility logic using brittle natural-language phrase patterns and contains scenario-specific examples that bias the LLM's spatial reasoning.", "duration_ms": 15058, "findings": [{"category": "llm_closed_list_instruction", "evidence": "Gaze-target close-up 패턴, 명시적 off-camera/off-screen phrase, 차단(blocking) 패턴, Reaction-only 패턴", "line_end": 49, "line_start": 31, "recommended_fix": "Replace the phrase-based classification rules with high-level spatial reasoning principles. Instruct the LLM to infer visibility from the overall scene geometry and framing description rather than matching specific substrings.", "severity": "P1", "why_problematic": "The prompt instructs the LLM to determine entity visibility (membership in visible_entity_ids) based on a closed list of Korean and English string patterns. This forces the model to act as a keyword classifier rather than performing spatial reasoning, which will fail on valid scenario descriptions that use synonymous but unlisted phrasing."}, {"category": "scenario_dependent_prompt", "evidence": "캐릭터A, 캐릭터B, 남자 직원, L01 방, 캐릭터C", "line_end": 48, "line_start": 24, "recommended_fix": "Use generic placeholders (e.g., {Character_ID}, {Location_ID}) and abstract descriptions in examples to avoid scenario pollution.", "severity": "P2", "why_problematic": "The prompt uses concrete scenario-specific names, roles, and location IDs as examples for visibility and blocking rules. This can bias the LLM towards these specific entity types or naming conventions when processing arbitrary new scenarios."}], "path": "prompts/_base/shot_director/5.202605131800/system.md", "scan_kind": "prompt", "sha256": "95ea6973e6cdc22d2e6442dffe5405333a24d9b5e3fb354a82586cec7d09b041"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 19, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt provides generic instructions for cleaning up PDF extraction artifacts and preserving standard screenplay formatting.", "duration_ms": 4188, "findings": [], "path": "prompts/_base/text_cleanup/1.202603231200/system.md", "scan_kind": "prompt", "sha256": "1f0e6a5f8a2b730e03543b26f06b0115d2d33a901754bd22a90a556e69aed4a5"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 108, "chunk_start": 1, "chunk_summary": "The schema defines several fields as strings with suggested categorical values in descriptions rather than formal enums, and overloads the gaze_target field with physical state data.", "duration_ms": 21466, "findings": [{"category": "schema_or_enum_drift", "evidence": "\"gaze_target\": {\"type\": \"string\", \"description\": \"Where the character's eyes are looking: another character's name, an object name, 'camera', 'down', 'up', 'distant', 'closed', 'unconscious', 'dead', 'severely_injured'\"}", "line_end": 30, "line_start": 30, "recommended_fix": "Split physical state into a separate 'character_state' enum and convert the spatial gaze targets into a formal enum or a union type.", "severity": "P2", "why_problematic": "The field overloads spatial gaze targets with biological/physical states ('dead', 'unconscious', 'severely_injured'). These are listed as string examples in the description but are not enforced as an enum, creating a brittle contract where downstream logic likely relies on exact string matches to infer character status or reference policy."}, {"category": "schema_or_enum_drift", "evidence": "\"perspective\": {\"type\": \"string\", \"description\": \"Camera POV: subjective_pov, over_shoulder, observer, omniscient, object_pov, voyeur\"}", "line_end": 28, "line_start": 16, "recommended_fix": "Convert these fields to formal JSON enums to ensure validation at the schema level, following the pattern used for framing_scale.", "severity": "P2", "why_problematic": "Multiple fields (perspective at line 16, perception_mode at line 18, and angle at line 28) define a closed set of categorical values in their descriptions but are typed as 'string' without JSON enum enforcement. This leads to drift between the prompt's expectations and the code's string-matching logic."}], "path": "prompts/_base/shot_staging/11.202605150319/schema.json", "scan_kind": "prompt", "sha256": "563bb3a1f8e2fa6ff7915841c59e1a92c848206f06a407e58c093531aaa3ef1b"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 77, "chunk_start": 1, "chunk_summary": "The prompt defines a judge that uses brittle phrase whitelists and exact-match string requirements to classify whether a T2I prompt is attempting to redraw background objects.", "duration_ms": 23744, "findings": [{"category": "llm_closed_list_instruction", "evidence": "redraw 동사 화이트리스트 (이 동사가 owned 객체를 직접 받을 때만 redraw): - 생성: `create`, `render`, `draw`, `generate`, `paint`, `build`, `furnish` ... 명시적 reference 표현 ... 공간 / 프레이밍 표현 ...", "line_end": 61, "line_start": 18, "recommended_fix": "Reframe the instructions to focus on the underlying semantic intent of 'creation' vs. 'reference' and provide the phrase lists as non-exhaustive examples rather than a strict whitelist.", "severity": "P1", "why_problematic": "The prompt instructs the LLM to act as a rigid pattern-matching engine by providing closed whitelists of verbs and phrases to determine semantic intent (redraw vs. anchor). This is brittle because natural language can express these intents through many synonyms or complex structures not captured in the lists, leading to false negatives or misclassifications."}, {"category": "semantic_string_judgment", "evidence": "owned 어휘는 t2i_prompt 의 English token 과 정확히 매칭되어야 한다 (semantic gloss / 번역 매칭 금지)", "line_end": 7, "line_start": 7, "recommended_fix": "Allow the LLM to use semantic matching to identify objects from the owned_list within the t2i_prompt, ensuring it captures variations in natural language description.", "severity": "P1", "why_problematic": "This requirement enforces exact string matching for semantic entities (objects) within natural language text. It prevents the LLM from identifying objects when they are described using synonyms, plural forms, or when adjectives separate the tokens, which is a brittle approach to open-world scenario analysis."}, {"category": "semantic_string_judgment", "evidence": "owned 객체의 의미적 우회 표현 (예: portal 로 door 우회, screen 으로 TV 우회) 도 위 redraw 동사의 직접 목적어로 들어오면 redraw_violation.", "line_end": 21, "line_start": 21, "recommended_fix": "Instead of manual mappings, instruct the LLM to identify if the prompt describes an object that serves the same functional or visual role as an item in the owned_list.", "severity": "P1", "why_problematic": "This defines manual semantic mappings (e.g., 'portal' maps to 'door') to bypass the exact-match rule. This is a brittle way to handle semantic variation and creates a maintenance burden as more 'bypass' terms are discovered."}], "path": "prompts/_base/scene_detail_owned_judge/3.202605051746/system.md", "scan_kind": "prompt", "sha256": "954aaf54f2737cc38b337e7db7e60d54282fe0d8d0887ab71bf0a8c0fa29a1bc"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 597, "chunk_start": 1, "chunk_summary": "The prompt defines several brittle semantic routing mechanisms based on natural language patterns, including ID enforcement exemptions triggered by specific phrases, blind substitution of character descriptions with IDs, and a character-count-based validation for entity name/ID mapping.", "duration_ms": 30706, "findings": [{"category": "semantic_string_judgment", "evidence": "body_part_focus_rule.trigger_phrases ('focus on / close on / tight on / detail on' + body part)", "line_end": 44, "line_start": 41, "recommended_fix": "Move the 'body_part_focus' state into the RenderPromptCard as a boolean or enum field rather than inferring it from trigger phrases in the prompt text.", "severity": "P1", "why_problematic": "The prompt uses a list of natural language patterns to decide whether to strip character IDs (C##O##) from the output. This makes the ID enforcement policy dependent on brittle prose patterns rather than structured intent."}, {"category": "blind_string_mutation", "evidence": "cross_shot_id_substitution_rule: 'fixed_elements[i].description 안 보통명사 인물 ... 이 ... 조건 만족 시 해당 보통명사를 C##/C##O## 로 치환'", "line_end": 119, "line_start": 119, "recommended_fix": "Instead of substitution, provide the ID as a separate field in the fixed_elements structure and instruct the LLM to use the ID when describing that specific element.", "severity": "P1", "why_problematic": "This instructs the LLM to perform blind string replacement of natural language descriptions (e.g., 'an adult figure') with technical IDs. This is a semantic mutation that can lead to grammatical errors or incorrect entity mapping if the description is ambiguous."}, {"category": "llm_closed_list_instruction", "evidence": "skipped_close_framing: 'the existing X' / 'from the reference' / 'preserving the same room perspective' / 'maintaining the reference's framing' / 'do not generate a new X'", "line_end": 144, "line_start": 140, "recommended_fix": "Define the constraint semantically (e.g., 'do not refer to the background reference') rather than providing a list of exact forbidden substrings.", "severity": "P2", "why_problematic": "It defines a closed list of natural language phrases that are strictly forbidden based on a technical mode (skipped_close_framing). This creates a brittle contract where the LLM must avoid specific wording to satisfy a downstream (or upstream) constraint."}, {"category": "llm_closed_list_instruction", "evidence": "entity-aware silhouette policy: 'face fully obscured' / 'no visible facial features' / 'face hidden in shadow'", "line_end": 228, "line_start": 217, "recommended_fix": "Use a structured boolean flag like 'is_face_obscured' in the entity traits schema instead of parsing natural language strings.", "severity": "P2", "why_problematic": "The prompt asks the LLM to classify an entity's visual state by matching specific phrases within the 'stable_traits' field. This is a semantic classifier implemented as a phrase list, which then triggers the suppression of other facial description terms."}, {"category": "semantic_string_judgment", "evidence": "entity_canon.name ... must be in the same sentence + ±60 char window ... of the ID", "line_end": 515, "line_start": 511, "recommended_fix": "Validate entity mapping using structured output (e.g., a JSON mapping of name to ID) rather than performing proximity checks on natural language strings.", "severity": "P1", "why_problematic": "This describes a validation rule (visible_entities_validator) that uses a brittle character-count window to verify the semantic mapping between a character's name and their ID in generated prose. This is highly prone to false positives/negatives based on sentence structure."}], "path": "prompts/_base/scene_detail/24.202605151451/system.md", "scan_kind": "prompt", "sha256": "d35e50e1332ba5226384543fa6532ba0dc98f7c38b3d86f5cd3e88b578bdd47a"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 38, "chunk_start": 1, "chunk_summary": "The schema defines a shot validation structure that relies on natural-language string extraction for entity lookup and uses an implicit semantic category ('visible-human-action') to drive validation logic.", "duration_ms": 36123, "findings": [{"category": "schema_or_enum_drift", "evidence": "visible-human-action 인 shot 에서 빈 배열 금지", "line_end": 23, "line_start": 23, "recommended_fix": "Formalize 'visible-human-action' as a value in a structured 'shot_type' or 'visibility_state' enum field.", "severity": "P2", "why_problematic": "The term 'visible-human-action' functions as a semantic classifier that controls validation logic (whether the characters array can be empty), but it is not formally defined as an enum or a field in the schema. This forces the LLM to infer a specific category from natural language to satisfy a technical constraint."}, {"category": "semantic_string_judgment", "evidence": "이름 배열 (entity name 또는 description 의 raw 표현). 다운스트림 lookup 호환을 위해 항상 채울 것", "line_end": 23, "line_start": 23, "recommended_fix": "Ensure downstream logic uses 'character_ids' for entity resolution and treat the 'characters' string array as non-functional metadata for display or logging.", "severity": "P2", "why_problematic": "The schema establishes a contract where natural-language 'raw expressions' extracted from descriptions are used for downstream entity lookup. This is a brittle pattern that relies on string matching for semantic identity resolution instead of using stable identifiers."}], "path": "prompts/_base/shot_validator/5.202605081700/validator_schema.json", "scan_kind": "prompt", "sha256": "0d269a0576fdd7f1b9eb1cf590b1b4ee71ba3fb68d1af49309fd1ff4ba9cfdc8"}
