{"candidate_reason": "python scope discovery", "chunk_end": 70, "chunk_start": 1, "chunk_summary": "No actionable findings; this file contains standard Alembic migration configuration and technical database setup.", "duration_ms": 3248, "findings": [], "path": "backend/alembic/env.py", "scan_kind": "python", "sha256": "0ebc7e60b781371151de2a3e04377b883bf6dc5258eec68551ce6d915acb66c0"}
{"candidate_reason": "python scope discovery", "chunk_end": 104, "chunk_start": 1, "chunk_summary": "No actionable findings; this file contains standard database migration logic for creating indexes on technical identifiers.", "duration_ms": 3824, "findings": [], "path": "backend/alembic/versions/001_add_indexes.py", "scan_kind": "python", "sha256": "443d404214d268646a852a16b9fb0dae2be7d48f7e5246ca1280fc7ed869aed2"}
{"candidate_reason": "python scope discovery", "chunk_end": 48, "chunk_start": 1, "chunk_summary": "No actionable findings; this is a standard database migration for technical logging metadata.", "duration_ms": 4285, "findings": [], "path": "backend/alembic/versions/006_llm_call_log_metadata_json.py", "scan_kind": "python", "sha256": "1b72ded9be069eae18d32f41b6f416b9804e4877927fce0731f13475004634bf"}
{"candidate_reason": "python scope discovery", "chunk_end": 60, "chunk_start": 1, "chunk_summary": "No actionable findings; this is a standard database migration file for adding a metadata column to the entity_canon table.", "duration_ms": 4376, "findings": [], "path": "backend/alembic/versions/007_d6_entity_canon_metadata_json.py", "scan_kind": "python", "sha256": "dd607b5a3858f9f017e6f5f9b32eb2c1e81a61faf1a53b7ba9dbcdf8ce30c307"}
{"candidate_reason": "python scope discovery", "chunk_end": 65, "chunk_start": 1, "chunk_summary": "No actionable findings; this is a standard database migration file for technical recovery tracking and metadata field expansion.", "duration_ms": 4470, "findings": [], "path": "backend/alembic/versions/003_resume_integrity.py", "scan_kind": "python", "sha256": "8ce8dd8d21121f9b607f2ad1c9dac6df425a9f83d9b80fb807be0988d41667f9"}
{"candidate_reason": "python scope discovery", "chunk_end": 99, "chunk_start": 1, "chunk_summary": "No actionable findings; this file is a database migration that enforces technical file path constraints and performs data normalization without inferring open-world scenario or visual meaning.", "duration_ms": 4758, "findings": [], "path": "backend/alembic/versions/005_file_path_relative_check.py", "scan_kind": "python", "sha256": "63389a9d05e169558dc925ede63fceb3a0d990d8cc66b4ca85c640f9a2fe056e"}
{"candidate_reason": "python scope discovery", "chunk_end": 72, "chunk_start": 1, "chunk_summary": "This file is a standard Alembic database migration adding technical columns for image asset variants and contains no actionable semantic string debt.", "duration_ms": 6494, "findings": [], "path": "backend/alembic/versions/002_phase5_image_asset_variants.py", "scan_kind": "python", "sha256": "e4e87dc3c8f6b93e5f1dd0ea46beeece8ebe6c77003fb5157d59d60b5ad47783"}
{"candidate_reason": "python scope discovery", "chunk_end": 46, "chunk_start": 1, "chunk_summary": "No actionable findings; this file contains standard authentication API endpoints using technical identifiers and does not process scenario or visual semantics.", "duration_ms": 3330, "findings": [], "path": "backend/app/api/v1/auth.py", "scan_kind": "python", "sha256": "897f59b16fd7a5874d60124f0bfeb419ae516004bf924b003684733adf31e85e"}
{"candidate_reason": "python scope discovery", "chunk_end": 154, "chunk_start": 1, "chunk_summary": "No actionable findings; the file contains standard FastAPI dependency injection and utility code using technical identifiers and status constants.", "duration_ms": 4669, "findings": [], "path": "backend/app/api/deps.py", "scan_kind": "python", "sha256": "483314672232f13f52c439ddde4113e4cc80d4d9c9ecedee6b0a6f9313f87cfb"}
{"candidate_reason": "python scope discovery", "chunk_end": 60, "chunk_start": 1, "chunk_summary": "No actionable findings; this is a standard database migration file increasing column length for a metadata field.", "duration_ms": 8010, "findings": [], "path": "backend/alembic/versions/004_variant_label_extend.py", "scan_kind": "python", "sha256": "4d8a88e7e7074489bb79c48cbb9cb62b23bf132db35add90d286cb0f93954b52"}
{"candidate_reason": "python scope discovery", "chunk_end": 212, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 5080, "findings": [], "path": "backend/app/api/v1/exports.py", "scan_kind": "python", "sha256": "2020ad132c8eb0656b13fabe61e1981975228e27cd7c09e7ec805cd852f16059"}
{"candidate_reason": "python scope discovery", "chunk_end": 70, "chunk_start": 1, "chunk_summary": "No actionable findings. This file contains standard API plumbing for operation logs and provenance tracking using technical identifiers.", "duration_ms": 3933, "findings": [], "path": "backend/app/api/v1/operations.py", "scan_kind": "python", "sha256": "0f7f23fe55215e99777c21681da6ba640ac71643716099be716f6c272a926691"}
{"candidate_reason": "python scope discovery", "chunk_end": 84, "chunk_start": 1, "chunk_summary": "No actionable findings; this file contains standard FastAPI CRUD endpoints for user management and does not involve scenario processing or visual semantics.", "duration_ms": 3045, "findings": [], "path": "backend/app/api/v1/users.py", "scan_kind": "python", "sha256": "6976912b349a4e82df9ee64157335cca7cb55bc0178040ecc9669a78001d75d6"}
{"candidate_reason": "python scope discovery", "chunk_end": 236, "chunk_start": 1, "chunk_summary": "No actionable findings; this file provides standard CRUD and version management infrastructure for prompt templates without performing semantic analysis or containing scenario-specific logic.", "duration_ms": 5932, "findings": [], "path": "backend/app/api/v1/prompts.py", "scan_kind": "python", "sha256": "122494141f3e88c71eda968f511c7e8d06566fc93f08738a132bae1706040aa4"}
{"candidate_reason": "python scope discovery", "chunk_end": 268, "chunk_start": 1, "chunk_summary": "No actionable findings; the file contains standard FastAPI routing and technical metadata validation for timestamps and operation modes.", "duration_ms": 8046, "findings": [], "path": "backend/app/api/v1/steps.py", "scan_kind": "python", "sha256": "475e38d587f4bc934cf5ebd1edd7a6d457e47f1204a977998d8ccfb592964670"}
{"candidate_reason": "python scope discovery", "chunk_end": 570, "chunk_start": 1, "chunk_summary": "No actionable findings; the file contains standard API plumbing for project management, file uploads, and technical LLM configuration without semantic string judgment.", "duration_ms": 10127, "findings": [], "path": "backend/app/api/v1/projects.py", "scan_kind": "python", "sha256": "3aa863e13caa986487d44188e1d22e782e543cb053da74423a706f1c39a18079"}
{"candidate_reason": "python scope discovery", "chunk_end": 298, "chunk_start": 1, "chunk_summary": "No actionable findings. The file contains technical infrastructure for step applicability routing based on configuration settings and structured checkpoint data.", "duration_ms": 7896, "findings": [], "path": "backend/app/core/applicability.py", "scan_kind": "python", "sha256": "8cc4c734e80e9b97e773f8c16db66ae397ee7d17a4477f8f86c75e34f41eb45e"}
{"candidate_reason": "python scope discovery", "chunk_end": 82, "chunk_start": 1, "chunk_summary": "No actionable findings. This file contains technical infrastructure for atomic JSON file I/O and does not perform semantic string judgment or scenario-specific logic.", "duration_ms": 3212, "findings": [], "path": "backend/app/core/checkpoint_io.py", "scan_kind": "python", "sha256": "9921f13f1dd3fafa94bdb8d7ed2f6a0642f772854ae7dcc168958e3df2a4ddea"}
{"candidate_reason": "python scope discovery", "chunk_end": 422, "chunk_start": 1, "chunk_summary": "The file is a standard FastAPI router for episode management and pipeline triggering, with no actionable semantic string debt or scenario pollution.", "duration_ms": 18263, "findings": [], "path": "backend/app/api/v1/episodes.py", "scan_kind": "python", "sha256": "63af6d843b5f1747846e3e921cf2787ed67a29846924d55773b26004c2473c65"}
{"candidate_reason": "python scope discovery", "chunk_end": 8, "chunk_start": 1, "chunk_summary": "No actionable findings; this is a standard package initialization file for DTOs.", "duration_ms": 2561, "findings": [], "path": "backend/app/core/dto/__init__.py", "scan_kind": "python", "sha256": "08aff79b29f622f9a3b9d2722fd95e43d14ee3c512de50b4cd6fee5912c05d64"}
{"candidate_reason": "python scope discovery", "chunk_end": 330, "chunk_start": 1, "chunk_summary": "The file implements a deterministic background ID cataloging system using structured metadata and contains no actionable findings related to brittle string patterns or scenario pollution.", "duration_ms": 13892, "findings": [], "path": "backend/app/core/bg_catalog.py", "scan_kind": "python", "sha256": "2225fe163ccb224e71c66211be106160a1aaef1c39fac8d4e2cf93eacbe4a480"}
{"candidate_reason": "python scope discovery", "chunk_end": 249, "chunk_start": 1, "chunk_summary": "No actionable findings; the file contains standard technical configuration, security validators, and pipeline toggles using machine-readable identifiers and enums.", "duration_ms": 9894, "findings": [], "path": "backend/app/core/config.py", "scan_kind": "python", "sha256": "08605a2d225b7e37cf36b1211e63abc722c2a5b55a6dd1f3afb3e3896fc7f034"}
{"candidate_reason": "python scope discovery", "chunk_end": 205, "chunk_start": 1, "chunk_summary": "No actionable findings; the file provides technical schema validation for structured entity metadata using closed-world identifiers.", "duration_ms": 5685, "findings": [], "path": "backend/app/core/entity_metadata.py", "scan_kind": "python", "sha256": "893d93150185304ee8d6b294842e6b970f8a7590185eb9681df3095795d0be49"}
{"candidate_reason": "python scope discovery", "chunk_end": 264, "chunk_start": 1, "chunk_summary": "The file contains database initialization and migration logic using SQLAlchemy and raw SQL; it defines technical schema structures and identifier generation rules without performing semantic analysis on natural language or containing scenario-specific pollution.", "duration_ms": 13322, "findings": [], "path": "backend/app/core/database.py", "scan_kind": "python", "sha256": "3255c3bb7dbac684feae1f4fa2b966b762df9cb41a1ef2a41d02ae7e68c73abe"}
{"candidate_reason": "python scope discovery", "chunk_end": 137, "chunk_start": 1, "chunk_summary": "The file defines the SceneAnalysisContext DTO, which serves as a structured container for data aggregated from various pipeline checkpoints; it contains no logic for string parsing or semantic judgment.", "duration_ms": 12294, "findings": [], "path": "backend/app/core/dto/scene_analysis.py", "scan_kind": "python", "sha256": "5d17c2fdffaa87103bf4484442ea4485b1da846eb1a343445430c5fd3cd8ce84"}
{"candidate_reason": "python scope discovery", "chunk_end": 191, "chunk_start": 1, "chunk_summary": "The file implements a deterministic entity protection cascade using structured metadata, machine identifiers, and pipeline manifest signals without relying on natural-language string patterns.", "duration_ms": 9466, "findings": [], "path": "backend/app/core/entity_protection.py", "scan_kind": "python", "sha256": "e181a4a35b8014686e298d8c09967a00e3be7867fd2c0fd005f3836515faaaa6"}
{"candidate_reason": "python scope discovery", "chunk_end": 484, "chunk_start": 1, "chunk_summary": "The file implements asset readiness validation to prevent silent fallbacks, but it relies on overloading the 'gaze_target' field with semantic state strings to determine asset requirements.", "duration_ms": 25220, "findings": [{"category": "semantic_string_judgment", "evidence": "gaze = ca.get(\"gaze_target\", \"\") ... if gaze in (\"dead\", \"severely_injured\", \"unconscious\")", "line_end": 440, "line_start": 435, "recommended_fix": "Introduce a dedicated 'physical_state' or 'required_variant' field in the shot_staging schema and use a formal enum instead of overloading the gaze field with semantic strings.", "severity": "P1", "why_problematic": "The 'gaze_target' field in the shot_staging checkpoint is overloaded to carry physical state information. The code uses a hardcoded list of natural-language strings to infer that a character requires a specific state-variant reference asset. This semantic judgment drives a fail-fast validation that blocks the pipeline if the inferred asset is missing, making the system brittle to LLM phrasing variations."}], "path": "backend/app/core/asset_readiness.py", "scan_kind": "python", "sha256": "254da5a0e1790186c83b8f42077b113e9f92c2d3fa3fcd1d4fd01d9551f8a5af"}
{"candidate_reason": "python scope discovery", "chunk_end": 175, "chunk_start": 1, "chunk_summary": "No actionable findings. This file contains technical infrastructure for handling relative and absolute file paths in the database and manifest files, which is permitted as closed-world syntax validation.", "duration_ms": 4052, "findings": [], "path": "backend/app/core/file_paths.py", "scan_kind": "python", "sha256": "39921edd78a9cb4a0ade74a2728088eff7b2d104f6ee7f95c19b8da0a8992679"}
{"candidate_reason": "python scope discovery", "chunk_end": 46, "chunk_start": 1, "chunk_summary": "No actionable findings; the file defines technical integrity report dataclasses using standard literals for infrastructure status tracking.", "duration_ms": 3092, "findings": [], "path": "backend/app/core/integrity_report.py", "scan_kind": "python", "sha256": "746d4ecf33b66cd7e4c2b3d94f850ba980b2ca941cf49393fbaeef54dc4bce79"}
{"candidate_reason": "python scope discovery", "chunk_end": 63, "chunk_start": 1, "chunk_summary": "No actionable findings; the file defines a canonical framing scale enum and performs exact-match validation on structured data without using regex or natural-language pattern matching.", "duration_ms": 3312, "findings": [], "path": "backend/app/core/framing_scale.py", "scan_kind": "python", "sha256": "a48840fd0a5c37397cb26a10a57d4bd4333071aa55ad4bae0f6db74f786ca4e3"}
{"candidate_reason": "python scope discovery", "chunk_end": 42, "chunk_start": 1, "chunk_summary": "No actionable findings; this file contains infrastructure for background job management using technical identifiers and does not process scenario or visual semantics.", "duration_ms": 3416, "findings": [], "path": "backend/app/core/job_manager.py", "scan_kind": "python", "sha256": "fee1d9730d64a20295f3dbc70474835423be6fa6632498e616d282a36a410696"}
{"candidate_reason": "python scope discovery", "chunk_end": 62, "chunk_start": 1, "chunk_summary": "No actionable findings. This file provides technical I/O utilities for managing lists of entity IDs to be skipped during image generation for cost optimization.", "duration_ms": 3219, "findings": [], "path": "backend/app/core/low_freq_skip.py", "scan_kind": "python", "sha256": "5a119ae11d83690059124ebe4ab43860481a2bac301864835aaf9d9e972f9f9d"}
{"candidate_reason": "python scope discovery", "chunk_end": 35, "chunk_start": 1, "chunk_summary": "No actionable findings; this file contains standard infrastructure for structured JSON logging.", "duration_ms": 3598, "findings": [], "path": "backend/app/core/logging_config.py", "scan_kind": "python", "sha256": "b6e8ab379da48f01ee8f87b1878a8d25a6bb38859dce8238521a89ee7f1a4d4c"}
{"candidate_reason": "python scope discovery", "chunk_end": 213, "chunk_start": 1, "chunk_summary": "The file defines centralized vocabularies and validators for background states and location types, which are coupled to LLM prompts and used for fail-fast validation.", "duration_ms": 29723, "findings": [{"category": "schema_or_enum_drift", "evidence": "STATE_CLASS_ENUM, validate_state_class", "line_end": 56, "line_start": 26, "recommended_fix": "Centralize the state vocabulary in a shared schema (e.g., JSON Schema or Pydantic) that can be used to both generate the prompt instructions and perform validation, reducing the risk of drift.", "severity": "P2", "why_problematic": "The STATE_CLASS_ENUM defines semantic visual states (e.g., 'ransacked', 'blood_scene', 'intrusion') that the LLM is expected to output exactly. The code (line 48) admits that this enum is forced in the LLM prompt and that violations trigger a retry. This creates a manual synchronization requirement between the prompt prose and the code's validation logic."}, {"category": "schema_or_enum_drift", "evidence": "LOCATION_SPACE_KEY_VOCAB, validate_location_space_profile", "line_end": 201, "line_start": 128, "recommended_fix": "Use a shared source of truth for location space keys that is injected into the LLM prompt and used for validation, rather than maintaining a hardcoded list in the code that requires manual prompt updates.", "severity": "P2", "why_problematic": "The LOCATION_SPACE_KEY_VOCAB defines semantic location types (e.g., 'kitchen', 'rooftop', 'yard') that must match the LLM's output. Line 126 explicitly states that this must be kept in sync with the entity_extractor system prompt. Validation failures (line 195) cause the background ID assignment to fail."}], "path": "backend/app/core/bg_state_vocab.py", "scan_kind": "python", "sha256": "d6c2d1fccafa20ba72e40e90ca8a76f14d4225eebe57c37a205c010e50e9aafd"}
{"candidate_reason": "python scope discovery", "chunk_end": 130, "chunk_start": 1, "chunk_summary": "No actionable findings; the file performs technical schema validation and exact enum checks for structured metadata without inferring meaning from natural-language prose.", "duration_ms": 6139, "findings": [], "path": "backend/app/core/keep_elements.py", "scan_kind": "python", "sha256": "1fa17ab361a1f74991d78c8965aa818897f82f6e9cbd652423308c3f853293fe"}
{"candidate_reason": "python scope discovery", "chunk_end": 1016, "chunk_start": 1, "chunk_summary": "The file defines API endpoints for image management and generation, including a finding where entity membership is determined by searching for technical tags within natural-language prompt strings.", "duration_ms": 42996, "findings": [{"category": "semantic_string_judgment", "evidence": "prompt_used contains 'outlook_id:{outlook_id}'", "line_end": 115, "line_start": 107, "recommended_fix": "Store entity associations in a structured metadata table or a dedicated JSON field instead of embedding and parsing them within the T2I prompt string.", "severity": "P1", "why_problematic": "The API documentation and implementation (via service call) rely on substring matching of technical IDs within a natural-language prompt field ('prompt_used') to filter images by entity. This is a brittle way to track entity-image associations and couples the prompt's prose to the database query logic."}], "path": "backend/app/api/v1/images.py", "scan_kind": "python", "sha256": "5b74e60458b29711ced0f37357bf4401cf87a5b19b1b52a81fe798e58a34f6b9"}
{"candidate_reason": "python scope discovery", "chunk_end": 85, "chunk_start": 1, "chunk_summary": "No actionable findings; the file provides technical infrastructure for pipeline caching using content hashes and technical step identifiers.", "duration_ms": 3578, "findings": [], "path": "backend/app/core/pipeline_cache.py", "scan_kind": "python", "sha256": "0efc4fe218ff2295389ecfb153eede4bfa30670817c8b6059307c716350ee318"}
{"candidate_reason": "python scope discovery", "chunk_end": 31, "chunk_start": 1, "chunk_summary": "No actionable findings; this file contains standard technical security utilities for password hashing and session management.", "duration_ms": 3111, "findings": [], "path": "backend/app/core/security.py", "scan_kind": "python", "sha256": "efce0d75e3a2e4ccdc8c675afcc00854a5af7fbe5799da350b7caf2bf30957ad"}
{"candidate_reason": "python scope discovery", "chunk_end": 83, "chunk_start": 1, "chunk_summary": "No actionable findings. This file contains technical infrastructure for feature flags and model selection routing based on technical identifiers, which is permitted.", "duration_ms": 3876, "findings": [], "path": "backend/app/core/settings_registry.py", "scan_kind": "python", "sha256": "a75c16fd433e6ca3dbba88f5a6ed532714c3670dc287f6992b8cef98fc7d62d7"}
{"candidate_reason": "python scope discovery", "chunk_end": 218, "chunk_start": 1, "chunk_summary": "No actionable findings; the file defines application-level error classes and technical validation for reserved keys, but does not implement semantic string matching or contain scenario-specific prompt pollution.", "duration_ms": 28219, "findings": [], "path": "backend/app/core/errors.py", "scan_kind": "python", "sha256": "ba89fa3d25ef305a82f0bc1b664d5f5b01a78c04656a81067792cb165042f7b2"}
{"candidate_reason": "python scope discovery", "chunk_end": 225, "chunk_start": 1, "chunk_summary": "The file defines the StepCatalog and StepEntry structures for pipeline orchestration, using technical identifiers and status constants without performing semantic string analysis or containing scenario pollution.", "duration_ms": 7397, "findings": [], "path": "backend/app/core/step_catalog.py", "scan_kind": "python", "sha256": "a9349acfefc4619ad2fbd259fab29f7803b2677237d2b146736d9687bef7ef3d"}
{"candidate_reason": "python scope discovery", "chunk_end": 166, "chunk_start": 1, "chunk_summary": "The file provides a helper class and function to load and format planning document analysis results for injection into pipeline prompts, using structured JSON data from checkpoints without performing semantic string inference.", "duration_ms": 16305, "findings": [], "path": "backend/app/core/planning_doc_context.py", "scan_kind": "python", "sha256": "96a5e66e6ef2bd8f932a78d98da7cf04cc0bb01723a449a16a4d79929afbe7ea"}
{"candidate_reason": "python scope discovery", "chunk_end": 161, "chunk_start": 1, "chunk_summary": "The file provides a utility for matching entity names between LLM outputs and database records, using regex to handle whitespace and bracketed suffixes.", "duration_ms": 21071, "findings": [{"category": "semantic_string_judgment", "evidence": "_BRACKET_PATTERN and lookup_name logic", "line_end": 161, "line_start": 51, "recommended_fix": "Transition to using immutable identifiers (UUIDs) or a canonical enum in the LLM output schema to avoid the need for heuristic string normalization for entity resolution.", "severity": "P1", "why_problematic": "The utility infers entity identity by stripping bracketed suffixes from LLM-generated strings to resolve 'drift' (e.g., mapping '이도령(혼)' to '이도령'). This is a brittle heuristic for mapping natural language names to database IDs, which can lead to collisions or incorrect entity resolution if the bracketed content is semantically significant or if the LLM produces unexpected formats."}], "path": "backend/app/core/name_matcher.py", "scan_kind": "python", "sha256": "6a06d3cde26de3c8fec7c158b189b543c3b86df0d99b9e9cdda903b03f62f797"}
{"candidate_reason": "python scope discovery", "chunk_end": 125, "chunk_start": 1, "chunk_summary": "No actionable findings; this file is a standard technical registry mapping step identifiers to their respective class implementations.", "duration_ms": 2939, "findings": [], "path": "backend/app/core/steps/__init__.py", "scan_kind": "python", "sha256": "7dfe3f4a7e6f7f2fb6c660abc77c47b48790b723847c664652cecacc26c88b42"}
{"candidate_reason": "python scope discovery", "chunk_end": 276, "chunk_start": 1, "chunk_summary": "The file implements pipeline gate logic using database status checks and technical metadata tags (e.g., 'composite:') within prompt fields, which are permitted under the provided guidelines.", "duration_ms": 22346, "findings": [], "path": "backend/app/core/pipeline_gate.py", "scan_kind": "python", "sha256": "7c845f2b6194ec9c311aa1825f965c6553892db648cd29cb090e356e7921c46f"}
{"candidate_reason": "python scope discovery", "chunk_end": 457, "chunk_start": 1, "chunk_summary": "The file implements a reference contract validator that uses brittle keyword-based NLP heuristics to classify natural language prompt text and drive validation failures.", "duration_ms": 22489, "findings": [{"category": "semantic_string_judgment", "evidence": "_CHARACTER_TOKENS, _GENERIC_VERB_TOKENS, classify_from_the_reference, and validate_attached_refs", "line_end": 457, "line_start": 49, "recommended_fix": "Replace prompt-text parsing with structured metadata (e.g., reference-target IDs or instruction-type flags) provided by the LLM or the prompt-card schema during the generation phase.", "severity": "P1", "why_problematic": "The 'phantom guard' mechanism uses brittle keyword lists (e.g., 'mart', 'her hand', 'copy', 'poses') to classify the semantic target of phrases in the prompt and decide whether to skip or enforce reference presence. This natural-language parsing directly triggers RefContractError (HTTP 422), blocking generation based on fragile string matches rather than structured intent."}], "path": "backend/app/core/ref_contract_validator.py", "scan_kind": "python", "sha256": "93a34075f568486f74bd384f96f18208bab54f8e5777726c6d7beef955a7b504"}
{"candidate_reason": "python scope discovery", "chunk_end": 363, "chunk_start": 1, "chunk_summary": "The file defines a technical validation and preparation layer for a frame spatial contract, using structured enums and ID regexes to validate LLM-generated JSON without brittle parsing of natural language for core routing.", "duration_ms": 37000, "findings": [], "path": "backend/app/core/frame_spatial_contract.py", "scan_kind": "python", "sha256": "dc8cd3121d7ca06ba098541ab7a40a722f0c79326fa6c4f65ed6b0ded2483f80"}
{"candidate_reason": "python scope discovery", "chunk_end": 116, "chunk_start": 1, "chunk_summary": "The file is a clean wrapper for an LLM-based judge that validates owned objects in generated prompts; it performs technical schema validation but contains no brittle string-pattern logic or scenario pollution.", "duration_ms": 10021, "findings": [], "path": "backend/app/core/steps/_owned_judge.py", "scan_kind": "python", "sha256": "6280d7a602b422b4d3a0815310a128f83cc6eacf7b0ab3ba4944eb703268fdcb"}
{"candidate_reason": "python scope discovery", "chunk_end": 129, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 17083, "findings": [], "path": "backend/app/core/steps/_evidence_helpers.py", "scan_kind": "python", "sha256": "1b11a4a10b12e90373ed92fd688d5eb5db3a49220fc3c31d94987b7fdf77b9aa"}
{"candidate_reason": "python scope discovery", "chunk_end": 400, "chunk_start": 1, "chunk_summary": "The file contains technical validation helpers and hashing utilities for 'owned objects' metadata, enforcing ASCII constraints and schema shapes without performing semantic inference from natural language.", "duration_ms": 18876, "findings": [], "path": "backend/app/core/steps/_owned_helpers.py", "scan_kind": "python", "sha256": "b9b4d7f230a479d642279017c5296d7a471f7e09c4e32cf0a9a6dcb1fc915dec"}
{"candidate_reason": "python scope discovery", "chunk_end": 1154, "chunk_start": 1, "chunk_summary": "The file is a central manifest defining pipeline steps, dependencies, and technical metadata; it contains no actionable string-pattern debt or scenario pollution.", "duration_ms": 24315, "findings": [], "path": "backend/app/core/step_manifest.py", "scan_kind": "python", "sha256": "ca41b2e1efde1513640c9b57ce37a6fc42665ec7a0b111f849ba847a76fba548"}
{"candidate_reason": "python scope discovery", "chunk_end": 214, "chunk_start": 1, "chunk_summary": "The file is a StepRunner orchestrator that manages checkpoint loading and data passing for background chain planning; it contains no actionable semantic string judgments or scenario pollution.", "duration_ms": 16359, "findings": [], "path": "backend/app/core/steps/background_chain_planning_step.py", "scan_kind": "python", "sha256": "0fed58a03fae448319826f84ba117fe61266792824f6f7500ea105d649ad5d39"}
{"candidate_reason": "python scope discovery", "chunk_end": 264, "chunk_start": 1, "chunk_summary": "The file is a StepRunner implementation that orchestrates data for background classification by an LLM, using structured IDs and passing natural language descriptions without performing local string-based semantic analysis.", "duration_ms": 12054, "findings": [], "path": "backend/app/core/steps/background_classify_step.py", "scan_kind": "python", "sha256": "1ffb71738766db06c062a8702c057a161718c17d4b721d15138ca50a742f33eb"}
{"candidate_reason": "python scope discovery", "chunk_end": 629, "chunk_start": 1, "chunk_summary": "The file is a StepRunner for background chain rendering that orchestrates data loading from checkpoints, calls the rendering module, and updates the database with generated image assets, using technical identifiers for traceability rather than semantic string patterns.", "duration_ms": 20722, "findings": [], "path": "backend/app/core/steps/background_chain_render_step.py", "scan_kind": "python", "sha256": "db955002c4caf6db1a7f2927358a8e72e4d761f4dfa4bec668d8a4c36376f52f"}
{"candidate_reason": "python scope discovery", "chunk_end": 519, "chunk_start": 1, "chunk_summary": "The file is a step runner for background master planning that orchestrates LLM calls and manages background ID assignments using structured data and technical identifiers; no actionable semantic string debt or scenario pollution was found.", "duration_ms": 15886, "findings": [], "path": "backend/app/core/steps/background_master_plan_step.py", "scan_kind": "python", "sha256": "f316adda85aac755b904d1cc15c8d3ff7ed749c8c9584a6289f4d9cd457d646c"}
{"candidate_reason": "python scope discovery", "chunk_end": 369, "chunk_start": 1, "chunk_summary": "The file is a step runner that aggregates data from previous checkpoints to prepare a prompt for the background planner; it contains no actionable string-pattern debt or scenario pollution.", "duration_ms": 18882, "findings": [], "path": "backend/app/core/steps/background_planner_step.py", "scan_kind": "python", "sha256": "53d33dcd02ffd8685de2d501c41a75e5556ef64a21aa374b9bfa3ed61ecdbfb8"}
{"candidate_reason": "python scope discovery", "chunk_end": 366, "chunk_start": 1, "chunk_summary": "The file is a high-level orchestration step for background prompt generation and does not contain brittle string patterns or scenario-specific prompt pollution.", "duration_ms": 16079, "findings": [], "path": "backend/app/core/steps/background_prompt_step.py", "scan_kind": "python", "sha256": "9318a00456c3f8bb0eaf22772efac3dc477b8daba55892adea74588c6be52359"}
{"candidate_reason": "python scope discovery", "chunk_end": 107, "chunk_start": 1, "chunk_summary": "The file is a standard step runner that extracts a character list from scene text using an LLM and contains no actionable string-pattern debt or scenario pollution.", "duration_ms": 7094, "findings": [], "path": "backend/app/core/steps/character_list_step.py", "scan_kind": "python", "sha256": "ee4727eab61e855b22a5898064a08f163d1b34b4b45a0d79472a6489ae8b5254"}
{"candidate_reason": "python scope discovery", "chunk_end": 766, "chunk_start": 1, "chunk_summary": "The file is a pipeline step runner for background rendering and ImageAsset registration, using technical identifiers and structured checkpoint data without performing semantic string pattern matching or containing scenario-specific prompt pollution.", "duration_ms": 13728, "findings": [], "path": "backend/app/core/steps/background_render_step.py", "scan_kind": "python", "sha256": "61f88d19935e0b1efe05d6cdf48d004f8901bd7705a8577ad4c8f9516bf5d7b9"}
{"candidate_reason": "python scope discovery", "chunk_end": 995, "chunk_start": 1, "chunk_summary": "The file contains legacy analysis steps for a scenario pipeline, with notable debt in the SceneDirectorStep regarding scenario-specific prompt instructions and brittle string-based entity ID resolution.", "duration_ms": 41672, "findings": [{"category": "scenario_dependent_prompt", "evidence": "인물: 자기 물리적 몸으로 존재하는 인물만. 대사를 하더라도 빙의/원격접속 중이면 제외... 앞쪽 씬에서 인물A가 인물B의 몸에 접속/빙의/라이드했다면...", "line_end": 817, "line_start": 810, "recommended_fix": "Move scenario-specific logic into a separate configuration or a specialized prompt variant, and use more abstract terms for physical presence rules in the base prompt.", "severity": "P2", "why_problematic": "The prompt contains concrete scenario-specific mechanics (possession/remote access) that bias the LLM's analysis of physical presence, making the step less generalizable and prone to hallucinations in scenarios without these tropes."}, {"category": "semantic_string_judgment", "evidence": "clean = raw_id.replace(\"CHAR_\", \"\").replace(\"BG_\", \"\").replace(\"PROP_\", \"\") ... if clean in name_to_uuid:", "line_end": 863, "line_start": 852, "recommended_fix": "Rely on strict schema enforcement (enums) in the LLM call and handle validation errors by retrying or failing, rather than attempting to guess identity via string manipulation.", "severity": "P1", "why_problematic": "The code uses brittle string replacement and partial matching to infer entity identity from LLM output that failed to follow the provided short-ID schema. This result directly determines visible-entity membership in the scene."}], "path": "backend/app/core/steps/analysis_steps_legacy.py", "scan_kind": "python", "sha256": "5309486c802bcbd8c46d563320b1b652467837e59f9414993412e25513d9e3a3"}
{"candidate_reason": "python scope discovery", "chunk_end": 95, "chunk_start": 1, "chunk_summary": "The file chunk contains infrastructure for assembling beat and shot context into a string for downstream entity relation extraction, with no actionable string-pattern debt or scenario pollution.", "duration_ms": 4662, "findings": [], "path": "backend/app/core/steps/entity_relation_step.py", "scan_kind": "python", "sha256": "b1a46b315c5130b07a2b6a7569645a2432bfda4bcba2a1d7a27a110c321ebe71"}
{"candidate_reason": "python scope discovery", "chunk_end": 537, "chunk_start": 1, "chunk_summary": "The file is a step runner for floor plan rendering and contains no actionable semantic string judgment or scenario pollution; it uses technical identifiers and status constants for orchestration.", "duration_ms": 10221, "findings": [], "path": "backend/app/core/steps/floor_plan_render_step.py", "scan_kind": "python", "sha256": "95bc28000e5f70e5ac3f3830e7679e68d6c937b7ce401cc96a21bafcc17a6b06"}
{"candidate_reason": "python scope discovery", "chunk_end": 304, "chunk_start": 1, "chunk_summary": "No actionable findings; the file is a standard pipeline step runner that orchestrates data and delegates prompt generation and execution to external modules.", "duration_ms": 16074, "findings": [], "path": "backend/app/core/steps/floor_plan_prompt_step.py", "scan_kind": "python", "sha256": "3d0f71b1f1d384eeb6b46210236a9910106809dec6aed137cf941ee4f45ab8be"}
{"candidate_reason": "python scope discovery", "chunk_end": 561, "chunk_start": 1, "chunk_summary": "The file implements beat and shot extraction steps, but contains hardcoded story-specific tropes and semantic instructions used to filter and inject visual guidelines into prompts.", "duration_ms": 44102, "findings": [{"category": "scenario_dependent_code", "evidence": "if r.get(\"rule_type\") in (\"possession\", \"projection\", \"ghost\") and [물리적 존재 판단 기준]", "line_end": 326, "line_start": 110, "recommended_fix": "Replace the hardcoded trope list with a generic metadata flag in the rule schema (e.g., 'is_visual_guideline') and move the semantic instructions into the prompt templates or the rule data itself.", "severity": "P1", "why_problematic": "The code hardcodes specific story tropes ('possession', 'projection', 'ghost') to filter visual guidelines in both BeatExtractStep and ShotExtractStep. It also injects hardcoded Korean semantic instructions regarding 'physical presence' based on these tropes. This makes the pipeline logic dependent on specific narrative genres and brittle to other types of non-physical entities (e.g., holograms, illusions) that might require similar visual handling."}], "path": "backend/app/core/steps/beat_shot_steps.py", "scan_kind": "python", "sha256": "c25b9c5afa08d9056c9af9387bfc34788f5960423bb426df0b7445ce8a2d8321"}
{"candidate_reason": "python scope discovery", "chunk_end": 921, "chunk_start": 1, "chunk_summary": "The file manages entity and scene still APIs, including a brittle mechanism for resolving character and outlook entities by parsing name-based patterns from generated prompt text.", "duration_ms": 142349, "findings": [{"category": "semantic_string_judgment", "evidence": "_re.finditer(r'\\[\\[([^\\]]+)\\]\\+\\[([^\\]]+)\\]\\]', t2i_text) ... lookup_name(_char_name_idx, c_name)", "line_end": 477, "line_start": 433, "recommended_fix": "Rely exclusively on structured entity ID lists (e.g., in visible_entities_json) populated during the generation phase, instead of parsing names from the prompt string at read-time.", "severity": "P1", "why_problematic": "The code extracts character and outlook names from bracketed patterns within natural-language prompt text to resolve entities and attach reference images. This relies on the LLM producing exact name matches and specific syntax in the prose, which is brittle compared to using structured ID fields and directly affects reference attachment behavior."}], "path": "backend/app/api/v1/entities.py", "scan_kind": "python", "sha256": "e5f92eef6cfdc114ebcc82cef44fd9975cb444244f497a6c11c87c707a1717fe"}
{"candidate_reason": "python scope discovery", "chunk_end": 315, "chunk_start": 1, "chunk_summary": "The LocationConsistencyStep uses brittle substring matching on natural-language names to map locations to scenes and relies on hardcoded Korean string prefixes in LLM output fields to drive execution logic.", "duration_ms": 28282, "findings": [{"category": "semantic_string_judgment", "evidence": "if name in heading: scenes_by_location[sid].append(si)", "line_end": 105, "line_start": 104, "recommended_fix": "Rely exclusively on structured entity IDs (short_id) for mapping. If a fallback is necessary, use a proper NLP entity linker or require the script to provide explicit ID-based headings.", "severity": "P1", "why_problematic": "Uses a substring check on natural-language location names and scene headings to determine scene membership for consistency analysis. This is brittle (e.g., 'Room' matching 'Living Room') and directly affects the context provided to the LLM in the user prompt."}, {"category": "schema_or_enum_drift", "evidence": "if summary.startswith(\"실패\"):", "line_end": 179, "line_start": 179, "recommended_fix": "Introduce a structured 'status' enum field in the location schema (e.g., 'SUCCESS', 'FAILED_FALLBACK') instead of parsing natural-language summary text.", "severity": "P2", "why_problematic": "Uses a hardcoded Korean string prefix ('실패') within a natural-language field ('analysis_summary') to drive logic for failure counting and resume skipping (line 122). This creates a brittle contract between the LLM output/fallback and the step runner logic."}], "path": "backend/app/core/steps/location_consistency_step.py", "scan_kind": "python", "sha256": "6dadf83395598ee2fa477e1a5d0b06313b910f0a9baf0707c6dafd727dde1dab"}
{"candidate_reason": "python scope discovery", "chunk_end": 978, "chunk_start": 1, "chunk_summary": "The file implements image generation steps but relies on overloading the 'gaze_target' field to infer character physical states, using brittle string matching to route reference image generation.", "duration_ms": 35894, "findings": [{"category": "semantic_string_judgment", "evidence": "gaze = ca.get(\"gaze_target\", \"\") ... if gaze in self.STATE_DESCRIPTIONS:", "line_end": 666, "line_start": 665, "recommended_fix": "Introduce a dedicated 'physical_state' field in the shot staging schema and use a formal enum instead of overloading the gaze target field.", "severity": "P1", "why_problematic": "The 'gaze_target' field is overloaded to carry character physical states ('dead', 'severely_injured', 'unconscious'). The code performs a brittle string match against this field (which is generated by an LLM in a previous step) to decide whether to trigger the generation of state-variant reference images. This couples visual state logic to a field intended for spatial orientation."}, {"category": "schema_or_enum_drift", "evidence": "STATE_DESCRIPTIONS = { \"dead\": \"...\", \"severely_injured\": \"...\", \"unconscious\": \"...\" }", "line_end": 642, "line_start": 638, "recommended_fix": "Centralize character state definitions in a shared schema enum and reference it in both the staging prompt and the image generation steps.", "severity": "P2", "why_problematic": "The keys in this dictionary act as a semantic classifier for character states but are defined locally within the step runner. This creates a drift risk where the LLM in the staging step must produce exact string matches for these keys without a shared schema enforcement."}, {"category": "scenario_dependent_prompt", "evidence": "\"dead\": \"lying motionless, pale/ashen skin...\", \"severely_injured\": \"visible bruises and cuts...\"", "line_end": 641, "line_start": 639, "recommended_fix": "Move these visual descriptions into a configurable style guide or the prompt template itself rather than hardcoding them in the Python logic.", "severity": "P2", "why_problematic": "The step runner hardcodes specific visual tropes (e.g., 'pale/ashen skin', 'bloodied areas') into the prompt generation logic for character states. These descriptions may bias or conflict with specific story contexts, character types (e.g., non-human), or artistic styles."}], "path": "backend/app/core/steps/image_steps.py", "scan_kind": "python", "sha256": "a1404a37cdd9b2ef5529d5936f0663a5a51e07a44f5c6ed057442bd14ce2491c"}
{"candidate_reason": "python scope discovery", "chunk_end": 217, "chunk_start": 1, "chunk_summary": "The file defines a planning document analysis step using an LLM to extract structured information from PDFs or text, with no actionable semantic string debt or scenario pollution found.", "duration_ms": 12558, "findings": [], "path": "backend/app/core/steps/planning_doc_step.py", "scan_kind": "python", "sha256": "30736eedb414dddb5c432e9cde26f18ac1a90b52404ba4abdd013f8df3485131"}
{"candidate_reason": "python scope discovery", "chunk_end": 781, "chunk_start": 1, "chunk_summary": "The file orchestrates floor plan generation using a sequential planner, but relies on brittle punctuation-based string slicing to summarize generated prompts for multi-turn context.", "duration_ms": 27602, "findings": [{"category": "semantic_string_judgment", "evidence": "_summarize_prompt using text.find(sep) with (\". \", \".\\n\", \"\\n\\n\") and length check < 200", "line_end": 734, "line_start": 714, "recommended_fix": "Instead of slicing the generated prompt, have the LLM explicitly return a structured 'summary' or 'spatial_context' field in its JSON response, or use a separate summarization call with a clear instruction.", "severity": "P1", "why_problematic": "It attempts to extract the semantic summary of an open-world visual description (T2I prompt) using brittle punctuation patterns and magic number length constraints. This summary is then injected as context for subsequent generations, meaning a change in LLM output style (e.g., adding a preamble) can corrupt the spatial context for the rest of the building group."}], "path": "backend/app/core/steps/location_floor_plan_step.py", "scan_kind": "python", "sha256": "86bc164f3624c24cfe7edc1704db823d4f3d9122c7f53fd39106b85d11dcb146"}
{"candidate_reason": "python scope discovery", "chunk_end": 553, "chunk_start": 1, "chunk_summary": "The file is a StepRunner that orchestrates outlook extraction phases, focusing on technical ID management, checkpoint handling, and retry logic without using brittle string patterns or scenario-polluted prompts.", "duration_ms": 24767, "findings": [], "path": "backend/app/core/steps/outlook_steps.py", "scan_kind": "python", "sha256": "7cff875a4cc7dd2b8d2a3bc0961d812f257d97eba72e149a570f06b4e35548d2"}
{"candidate_reason": "python scope discovery", "chunk_end": 242, "chunk_start": 1, "chunk_summary": "The SceneCameraFlowStep class orchestrates the camera flow design by preparing context for an LLM call and validating technical identifiers (shot indices) via dynamic schema enums, without using brittle string patterns to infer semantic meaning.", "duration_ms": 10324, "findings": [], "path": "backend/app/core/steps/scene_camera_flow_step.py", "scan_kind": "python", "sha256": "657e39ab6fa5b6c7e0a3f31c562ee529d72342fdf1be7e23ac81d058dbcef351"}
{"candidate_reason": "python scope discovery", "chunk_end": 1597, "chunk_start": 1, "chunk_summary": "The StepRunner base class manages pipeline execution, checkpointing, and state transitions using technical metadata and status enums, with no actionable findings related to open-world scenario string matching or prompt pollution.", "duration_ms": 128698, "findings": [], "path": "backend/app/core/step_runner.py", "scan_kind": "python", "sha256": "1bc98850586701b74aec05907a3329fb336d1b8e4412efc5724e836aeafc121a"}
{"candidate_reason": "python scope discovery", "chunk_end": 312, "chunk_start": 1, "chunk_summary": "The file implements scene segmentation and splitting, relying on LLM-generated regex patterns validated by character-length heuristics and specific formatting tropes.", "duration_ms": 29583, "findings": [{"category": "semantic_string_judgment", "evidence": "pattern.finditer(fulltext), avg_len < min_avg, and len(matches) >= threshold", "line_end": 144, "line_start": 110, "recommended_fix": "Replace the global regex approach with a more robust line-by-line classification or a multi-stage structural analysis that does not rely on character-count heuristics to validate semantic boundaries.", "severity": "P1", "why_problematic": "The pipeline's primary structural segmentation (scenes) is determined by an LLM-generated regex that is validated using brittle heuristics (average character length and match count vs estimation). This logic directly controls the routing and creation of scene entities from natural language scenario text, making the core data structure of the episode dependent on pattern-matching success."}, {"category": "scenario_dependent_prompt", "evidence": "f\"씬 내부의 장소 전환('- 장소명')이 아니라 씬 번호('숫자.') 패턴으로 분리해야 합니다.\"", "line_end": 131, "line_start": 131, "recommended_fix": "Abstract the formatting tropes into a project-level configuration or provide them as neutral examples rather than hardcoded corrective instructions in the step runner.", "severity": "P2", "why_problematic": "The retry instruction hardcodes specific Korean script formatting tropes ('- 장소명', '숫자.') as a semantic classifier to steer the LLM's regex generation, which biases the segmentation logic toward specific document styles and may fail on scripts with different conventions."}], "path": "backend/app/core/steps/scene_steps.py", "scan_kind": "python", "sha256": "3aa185bd3a049018d749c91b437e39ae0ace024d800f64d0e2fab32a510d9015"}
{"candidate_reason": "python scope discovery", "chunk_end": 779, "chunk_start": 1, "chunk_summary": "The file implements a scene consistency step that extracts fixed visual elements across shots, but it relies on brittle string heuristics to classify visual framing and determine scene status from natural language summaries.", "duration_ms": 39953, "findings": [{"category": "semantic_string_judgment", "evidence": "_ELEMENT_ID_CLOSE_REGEX, _DESCRIPTION_CLOSE_KEYWORDS, _classify_framing", "line_end": 180, "line_start": 65, "recommended_fix": "Update the LLM schema to include an explicit framing category field (e.g., 'framing_scope': 'close' | 'full') instead of inferring it from prose or ID suffixes.", "severity": "P1", "why_problematic": "The code infers visual framing (close-up vs. full-body) by searching for body parts (eye, wrist, etc.) and framing keywords (macro, tight shot) in natural language descriptions and element IDs. This classification drives a deterministic validator that can fail the step and block downstream processing if a conflict is detected."}, {"category": "semantic_string_judgment", "evidence": "summary.startswith(\"분석 실패\"), summary.startswith(\"분석 차단\")", "line_end": 620, "line_start": 352, "recommended_fix": "Rely exclusively on the structured 'status' field for all logic. For backward compatibility, check for the presence of data or use a migration to backfill the status field.", "severity": "P2", "why_problematic": "The code uses string prefixes on the natural language 'analysis_summary' field to determine technical status (failed or blocked) for routing and validation. This is brittle and relies on exact Korean string matches in a field intended for human-readable summaries, creating a risk of silent failures if the summary text is modified."}, {"category": "scenario_dependent_prompt", "evidence": "\"사망/부상/의식불명\", \"깨진 창문, 열린 문, 혈흔\"", "line_end": 751, "line_start": 749, "recommended_fix": "Replace concrete examples with abstract categories such as 'character physical states', 'static environmental changes', or 'fixed prop placements'.", "severity": "P2", "why_problematic": "The prompt contains concrete scenario-specific examples of character states (death, injury) and environmental props (broken windows, bloodstains). These specific tropes can bias the LLM's analysis towards certain genres or details even when processing unrelated scenarios."}], "path": "backend/app/core/steps/scene_consistency_step.py", "scan_kind": "python", "sha256": "a07ea382bb71f5f22aa07c2f67ccd3ca32b598675d75e6e1b8731e0664ec9267"}
{"candidate_reason": "python scope discovery", "chunk_end": 162, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 22648, "findings": [], "path": "backend/app/core/steps/shot_cinematography_step.py", "scan_kind": "python", "sha256": "553ac84f1a94ced477d79e1c148187e782717b8332a723c27413affb05b1d128"}
{"candidate_reason": "python scope discovery", "chunk_end": 889, "chunk_start": 1, "chunk_summary": "The file is a centralized loader for scene context and is generally clean, with most logic focused on technical checkpoint mapping and schema validation; one instance of semantic string judgment exists in a deactivated method.", "duration_ms": 45447, "findings": [], "path": "backend/app/core/steps/scene_context_loader.py", "scan_kind": "python", "sha256": "1cd6a7d7b27f853057101287ef0c718d2337d8e7e89a3f65096e6395b01ed410"}
{"candidate_reason": "python scope discovery", "chunk_end": 3657, "chunk_start": 1, "chunk_summary": "The file defines the RenderPromptCard builder, which lifts natural-language rules into structured constraints; it contains several prompt-side semantic classifiers and a contract for blind string mutation by the LLM.", "duration_ms": 67724, "findings": [{"category": "blind_string_mutation", "evidence": "\"substitution\": \"replace the common-noun person reference inside fixed_elements[i].description ... with the matched C## or C##O##\"", "line_end": 1498, "line_start": 1494, "recommended_fix": "Use a formal placeholder syntax in the description (e.g., [ENTITY_ID]) and have the LLM map IDs to those placeholders, or perform the replacement in code using structured entity mapping.", "severity": "P1", "why_problematic": "This instructs the LLM to perform a substring replacement on natural-language text based on a fuzzy semantic category ('common-noun person reference'). This is a contract for blind semantic mutation that relies on the LLM to correctly identify and slice arbitrary prose."}, {"category": "llm_closed_list_instruction", "evidence": "\"triggered by 'focus on / close on / tight on / detail on' phrasing\"", "line_end": 1191, "line_start": 1187, "recommended_fix": "Define the 'body-part focus' state as a structured boolean or enum field in the input staging data rather than inferring it from phrasing.", "severity": "P2", "why_problematic": "The prompt defines a semantic rule (body-part focus) based on a closed list of trigger phrases. This forces the LLM to act as a brittle string-pattern classifier rather than using structured intent."}, {"category": "llm_closed_list_instruction", "evidence": "\"do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', ...\"", "line_end": 1334, "line_start": 1326, "recommended_fix": "Provide a general principle about not referencing absent images and use a post-generation semantic validator rather than exact phrase blacklists.", "severity": "P2", "why_problematic": "The prompt defines 'invalid phrasing' for close framing using a closed list of specific substrings. This is a brittle semantic classifier for output validation that may miss variations or over-penalize valid prose."}, {"category": "scenario_dependent_prompt", "evidence": "\"(low / hip-height / overhead / ground level / quay level / floor level / from above)\"", "line_end": 584, "line_start": 584, "recommended_fix": "Use generic camera height terms (e.g., 'surface level', 'eye level') or abstract placeholders.", "severity": "P2", "why_problematic": "The prompt includes 'quay level' as a specific camera height example. This is scenario-specific pollution (maritime/port setting) that can bias the LLM's spatial reasoning in unrelated scenarios."}, {"category": "llm_closed_list_instruction", "evidence": "\"ethnicity\": list(_ID_ETHNICITY_COMPONENTS), \"age_band\": list(_ID_AGE_BANDS)", "line_end": 1140, "line_start": 1138, "recommended_fix": "Pass the allowed demographic vocabulary as a dynamic context field derived from the project's visual world rules rather than using a hardcoded module constant.", "severity": "P2", "why_problematic": "The prompt asks the LLM to classify open-world demographic meaning from a closed list of ethnicities and age bands. This list may drift from the project's actual demographic SOT or bias the LLM against unlisted groups."}], "path": "backend/app/core/steps/render_prompt_card.py", "scan_kind": "python", "sha256": "d7960bcbc097897cfdc1205fc20d0a448feb49c786901023e7461f33438f221d"}
{"candidate_reason": "python scope discovery", "chunk_end": 126, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 13142, "findings": [], "path": "backend/app/core/steps/shot_director_step.py", "scan_kind": "python", "sha256": "9a337c33f08a7b50b1b2344fde61ef56d39e90922639effa8e06e34012114abe"}
{"candidate_reason": "python scope discovery", "chunk_end": 329, "chunk_start": 1, "chunk_summary": "The file defines step runners for the director phase, including logic for injecting entity IDs and filtering visual rules based on semantic categories.", "duration_ms": 120322, "findings": [{"category": "schema_or_enum_drift", "evidence": "if r.get(\"rule_type\") in (\"possession\", \"projection\", \"ghost\")", "line_end": 127, "line_start": 126, "recommended_fix": "Centralize the rule type definitions in a shared enum and use that enum for both the upstream classification and this filtering logic.", "severity": "P2", "why_problematic": "The code filters visual rules using a hardcoded list of semantic categories ('possession', 'projection', 'ghost'). This creates a brittle dependency on specific string values produced by an upstream LLM step, which may drift from the intended schema or miss new categories."}], "path": "backend/app/core/steps/director_steps.py", "scan_kind": "python", "sha256": "4832353f84c57b443d43af643af033dcd71d175ad607caeb2853e389bd1c3265"}
{"candidate_reason": "python scope discovery", "chunk_end": 46, "chunk_start": 1, "chunk_summary": "No actionable findings; this file is a high-level orchestrator that passes data between checkpoints and the pipeline module without performing semantic string analysis.", "duration_ms": 3065, "findings": [], "path": "backend/app/core/steps/shot_staging_step.py", "scan_kind": "python", "sha256": "e86b746584f044e566326671dc8be66843ca343ea2d8b7e09356a77dcf07d935"}
{"candidate_reason": "python scope discovery", "chunk_end": 309, "chunk_start": 1, "chunk_summary": "The file implements a shot essence extraction step using structured LLM calls to categorize shot descriptions into essence, peripheral, and atmospheric components without using brittle string patterns or scenario-specific pollution.", "duration_ms": 13648, "findings": [], "path": "backend/app/core/steps/shot_essence_extraction_step.py", "scan_kind": "python", "sha256": "bd3cf91c9b396438817a9061f82d5b2f1d5414d825f17ae6641c171361bf1820"}
{"candidate_reason": "python scope discovery", "chunk_end": 302, "chunk_start": 1, "chunk_summary": "The file is a clean LLM-based step coordinator that performs shot dependency analysis using structured LLM outputs and technical validation without brittle string patterns or scenario pollution.", "duration_ms": 27631, "findings": [], "path": "backend/app/core/steps/shot_dependency_t2i_step.py", "scan_kind": "python", "sha256": "4e5bf81c1d9040583870f1e8f14636e453dad73093f557bbbaf9b1511ec9cc8a"}
{"candidate_reason": "python scope discovery", "chunk_end": 920, "chunk_start": 1, "chunk_summary": "The file manages entity extraction, filtering, and T2I prompt generation steps, with findings related to semantic classification instructions and schema drift in metadata validation.", "duration_ms": 130480, "findings": [{"category": "llm_closed_list_instruction", "evidence": "인물(character)은 다른 타입과 중복될 가능성이 거의 없으니 주로 배경/소품 간 중복을 확인하세요.", "line_end": 461, "line_start": 453, "recommended_fix": "Move such heuristics to a centralized system prompt or configuration rather than hardcoding them in the step runner's user prompt construction.", "severity": "P2", "why_problematic": "This instruction provides a semantic heuristic to the LLM based on entity types, which functions as a soft classifier rule for merging logic. While not scenario-specific pollution, it hardcodes a behavioral assumption about open-world entity relationships."}, {"category": "schema_or_enum_drift", "evidence": "validate_entity_metadata_shape(etype, md, short_id=name_to_sid.get(ename, \"\") or ename)", "line_end": 811, "line_start": 796, "recommended_fix": "Ensure the vocabulary used in `validate_entity_metadata_shape` is programmatically injected into the LLM's system prompt to prevent drift between the classifier's instructions and the validator's enforcement.", "severity": "P1", "why_problematic": "The code performs a fail-fast validation of LLM-generated metadata (specifically space_profile for locations, as noted in comments on lines 768-774). This implies a contract where the LLM must output values from a closed vocabulary (SpaceProfileError) that is enforced by code. If the prompt's schema guide and the validator's vocabulary drift, it causes P0-level generation failures."}], "path": "backend/app/core/steps/entity_steps.py", "scan_kind": "python", "sha256": "32107108f11ad489695d7bb3e6f6880af8f83bb4e46899ac45c1a5ae01e5637e"}
{"candidate_reason": "python scope discovery", "chunk_end": 197, "chunk_start": 1, "chunk_summary": "The file contains StepRunner implementations for episode and scene summarization that handle data flow between checkpoints and LLM modules without performing semantic string inspection or containing scenario-specific prompt pollution.", "duration_ms": 9810, "findings": [], "path": "backend/app/core/steps/summary_steps.py", "scan_kind": "python", "sha256": "68cadacda2b891546478fce5e24ebdc5117e38140cbe27bd27070780fcb4a949"}
{"candidate_reason": "python scope discovery", "chunk_end": 287, "chunk_start": 1, "chunk_summary": "The shot selection step coordinates LLM-based shot filtering using numerical caps and structural validation without performing brittle string matching on scenario text.", "duration_ms": 14782, "findings": [], "path": "backend/app/core/steps/shot_selection_step.py", "scan_kind": "python", "sha256": "0b3d7f87247c5760f000b0ed7d6031a2ed5722df3d4e2c087fc2ef055d16a254"}
{"candidate_reason": "python scope discovery", "chunk_end": 54, "chunk_start": 1, "chunk_summary": "No actionable findings; this file is a high-level step runner that delegates text extraction to external modules without performing string-based semantic judgment or prompt manipulation.", "duration_ms": 3360, "findings": [], "path": "backend/app/core/steps/text_steps.py", "scan_kind": "python", "sha256": "dee0d749567714398fc791817e5732c769049f44dd42787e16593f185023fd08"}
{"candidate_reason": "python scope discovery", "chunk_end": 258, "chunk_start": 1, "chunk_summary": "No actionable findings; this file is a StepRunner infrastructure wrapper that orchestrates the T2I review process and manages checkpoint integrity without defining semantic string patterns or prompt logic itself.", "duration_ms": 11882, "findings": [], "path": "backend/app/core/steps/t2i_review_step.py", "scan_kind": "python", "sha256": "7f44d1520245d3690182a66bd7e2d6892be7b59cc8939e0b4c85abeb75ae6baf"}
{"candidate_reason": "python scope discovery", "chunk_end": 40, "chunk_start": 1, "chunk_summary": "No actionable findings; the file contains standard technical infrastructure for background task tracking and database status recovery.", "duration_ms": 3545, "findings": [], "path": "backend/app/core/task_registry.py", "scan_kind": "python", "sha256": "ff6afe0ab1644dfaa038b42db7fadb121b972c02662ff83b685bfd4aa28ff348"}
{"candidate_reason": "python scope discovery", "chunk_end": 20, "chunk_start": 1, "chunk_summary": "No actionable findings; the file provides standard internationalization (i18n) infrastructure for loading and retrieving localized strings.", "duration_ms": 2960, "findings": [], "path": "backend/app/i18n/loader.py", "scan_kind": "python", "sha256": "1df58ae74fe67baf31a49079fd1cbddf2dabf03081e7ba321cd802e024319af9"}
{"candidate_reason": "python scope discovery", "chunk_end": 42, "chunk_start": 1, "chunk_summary": "No actionable findings; this file contains standard infrastructure for activity logging using technical identifiers and metadata.", "duration_ms": 2853, "findings": [], "path": "backend/app/logging/activity_logger.py", "scan_kind": "python", "sha256": "997d9bc02147260f7d5770a934833ee80b3a205db9e22867aa632dd587764d10"}
{"candidate_reason": "python scope discovery", "chunk_end": 16, "chunk_start": 1, "chunk_summary": "No actionable findings; this file defines a standard technical activity log model using machine-level identifiers.", "duration_ms": 3537, "findings": [], "path": "backend/app/logging/models.py", "scan_kind": "python", "sha256": "5e479a106bc17dc09334a3b3871991ec6787e18bdf9d372fe805dc4c9a19d6c8"}
{"candidate_reason": "python scope discovery", "chunk_end": 130, "chunk_start": 1, "chunk_summary": "No actionable findings; the file contains standard FastAPI application setup, infrastructure initialization, and health check logic without semantic string judgment or scenario pollution.", "duration_ms": 3784, "findings": [], "path": "backend/app/main.py", "scan_kind": "python", "sha256": "49472efd68728a06703b1264499b0c8c0dc8dc57e7b020a1fec14e155b4587bc"}
{"candidate_reason": "python scope discovery", "chunk_end": 51, "chunk_start": 1, "chunk_summary": "No actionable findings; the file defines standard database models for user accounts, sessions, and project registries using technical status and role constants.", "duration_ms": 3034, "findings": [], "path": "backend/app/models/catalog.py", "scan_kind": "python", "sha256": "9d4a647c9247795de8bc255e2c91bbe888ea3fb924797258c1032c869d7f5ac7"}
{"candidate_reason": "python scope discovery", "chunk_end": 524, "chunk_start": 1, "chunk_summary": "The file is clean, using structured LLM calls and technical identifier validation without brittle natural-language string patterns or scenario pollution.", "duration_ms": 22168, "findings": [], "path": "backend/app/core/steps/shot_validator_step.py", "scan_kind": "python", "sha256": "4c28fc69a4a9e706c558d73f8bae3e411531373f1529fa9d2b553333ec3a1b86"}
{"candidate_reason": "python scope discovery", "chunk_end": 180, "chunk_start": 1, "chunk_summary": "The file implements shot dependency analysis using entity overlap scoring, but relies on brittle exact string matching for location-based routing.", "duration_ms": 44642, "findings": [{"category": "semantic_string_judgment", "evidence": "if prev[\"location\"] != cur_loc: continue", "line_end": 142, "line_start": 141, "recommended_fix": "Resolve 'primary_location' names to canonical entity IDs (e.g., L##) using the 'name_matcher' already initialized in this file (line 81) before performing the comparison.", "severity": "P1", "why_problematic": "Shot dependency routing (which selects reference images for visual consistency) is gated by an exact string match on location names. These names originate from LLM-generated 'primary_location' fields (line 53) and are prone to minor variations in casing, punctuation, or synonyms, which would break the dependency chain. This is particularly problematic as the file already initializes a 'name_matcher' for locations (line 77) but fails to use it here."}], "path": "backend/app/core/steps/shot_dependency_step.py", "scan_kind": "python", "sha256": "6db76375617c27cd5402dc6c8b9a6177fc84261bf73fe26f54e2293104acf226"}
{"candidate_reason": "python scope discovery", "chunk_end": 3146, "chunk_start": 1, "chunk_summary": "The file implements the scene_detail and scene_verify steps, using complex logic to derive visual prompts and reference contracts from scene context, including entity variant detection and physical state inference.", "duration_ms": 148803, "findings": [{"category": "semantic_string_judgment", "evidence": "_OUTLOOK_COMPOSITE_RE = re.compile(r'(C\\d{2,3})(O\\d{2,3})') and _STATE_VARIANT_GAZE_VALUES = (\"unconscious\", \"dead\", \"severely_injured\")", "line_end": 310, "line_start": 251, "recommended_fix": "Pass explicit physical state and reference usage flags as structured metadata from upstream steps instead of inferring them from natural-language fields or generated prose.", "severity": "P1", "why_problematic": "The code uses regex to parse generated prompt prose and string matching to check physical state values in the gaze_target field. These results directly change reference attachment behavior and validation policy (e.g., excluding dead characters from outlook requirements)."}, {"category": "semantic_string_judgment", "evidence": "_base_name = re.split(r'\\s*[\\(（]', name)[0].strip()", "line_end": 1967, "line_start": 1939, "recommended_fix": "Use a canonical entity_id or parent_id field in the entity schema to define variant relationships rather than relying on display name patterns.", "severity": "P1", "why_problematic": "The code infers semantic 'variant-of' relationships between entities by parsing natural-language names for parentheses. This brittle pattern matching determines which entities are grouped as variants, affecting prompt instructions and visibility logic."}, {"category": "blind_string_mutation", "evidence": "re.sub(r\"focus on\\s+'s\", \"focus on the figure's\", prompt)", "line_end": 2870, "line_start": 2865, "recommended_fix": "Improve the system prompt to prevent these specific output patterns or use a structured 'focus_target' field that is formatted into the prompt by a controlled template.", "severity": "P1", "why_problematic": "The code performs blind substring replacement on generated T2I prompt prose to fix specific grammatical or semantic errors. This is brittle and assumes a closed set of failure modes in open-world LLM output."}, {"category": "llm_closed_list_instruction", "evidence": "긴장=어둡고 대비 강한, 슬픔=탈색/청색, 분노=적색 등", "line_end": 2291, "line_start": 2286, "recommended_fix": "Move visual style mappings to a configurable world-building or style-guide module that can be adjusted per project.", "severity": "P2", "why_problematic": "The prompt contains a hardcoded semantic mapping of emotions to specific visual styles. This functions as a closed-list classifier that biases the LLM's creative decisions for arbitrary scenarios."}], "path": "backend/app/core/steps/detail_steps.py", "scan_kind": "python", "sha256": "13d5494eabda57fd91fc817a7b5df837146b46e1ba33ed168da309d019eb88ed"}
{"candidate_reason": "python scope discovery", "chunk_end": 156, "chunk_start": 1, "chunk_summary": "The file is a technical version registry for modules and their prompt dependencies; it contains no logic for semantic string judgment or scenario-specific prompt text.", "duration_ms": 15966, "findings": [], "path": "backend/app/core/version_registry.py", "scan_kind": "python", "sha256": "b4454265a347ae52a317b1277af5b517365c83f12e58fc952e6630c916bda0c1"}
{"candidate_reason": "python scope discovery", "chunk_end": 122, "chunk_start": 1, "chunk_summary": "No actionable findings; this file provides technical infrastructure for image generation checkpointing using machine identifiers and structured JSON.", "duration_ms": 3373, "findings": [], "path": "backend/app/modules/image_checkpoint.py", "scan_kind": "python", "sha256": "b253475dfa2921c3c105af37d0654414f3438c8f17adef04d4f4e31fcc8081a4"}
{"candidate_reason": "python scope discovery", "chunk_end": 351, "chunk_start": 1, "chunk_summary": "The file provides a utility for Gemini-based image-to-image editing, including camera diagram generation and API orchestration, without any actionable semantic string debt or scenario pollution.", "duration_ms": 9603, "findings": [], "path": "backend/app/modules/gemini_i2i_editor.py", "scan_kind": "python", "sha256": "3ecd9be0d08929461578a029b148fa228612db99edd966f28d8d46d44b5d3a8a"}
{"candidate_reason": "python scope discovery", "chunk_end": 1, "chunk_start": 1, "chunk_summary": "No actionable findings; the file contains only a standard package docstring.", "duration_ms": 2485, "findings": [], "path": "backend/app/modules/llm/__init__.py", "scan_kind": "python", "sha256": "154c2f746a44ce90bdb76dee3da6fbcef2f58bd62941312a6fdb533cc3f4882d"}
{"candidate_reason": "python scope discovery", "chunk_end": 139, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 6296, "findings": [], "path": "backend/app/modules/generation_tracker.py", "scan_kind": "python", "sha256": "635516c04a47c0e75bbe854a51872482c73a7b9b55195c7d16f4df442b04c6fa"}
{"candidate_reason": "python scope discovery", "chunk_end": 18, "chunk_start": 1, "chunk_summary": "No actionable findings; this file defines a standard abstract base class for LLM clients without any scenario-specific logic or string-based semantic judgment.", "duration_ms": 2271, "findings": [], "path": "backend/app/modules/llm/base.py", "scan_kind": "python", "sha256": "e80908ebc287a538add83673361d6a5652e7508a279e0c95d3940885d1c8b3a9"}
{"candidate_reason": "python scope discovery", "chunk_end": 90, "chunk_start": 1, "chunk_summary": "No actionable findings. This file contains technical infrastructure for Gemini API key management and does not process scenario or visual semantics.", "duration_ms": 3998, "findings": [], "path": "backend/app/modules/llm/gemini_key_pool.py", "scan_kind": "python", "sha256": "b0eb3589a24814832578ac71eada7146f061dfa877735336bc58949c7976e48b"}
{"candidate_reason": "python scope discovery", "chunk_end": 214, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 15702, "findings": [], "path": "backend/app/modules/entity_dependency.py", "scan_kind": "python", "sha256": "d7d1dc91f1acdd43734d0097877c1e5646006e307759d8e080654f80375d5ab3"}
{"candidate_reason": "python scope discovery", "chunk_end": 953, "chunk_start": 1, "chunk_summary": "The validator uses brittle regex patterns to detect face close-ups, performs substring matching of LLM-generated trigger phrases against prompt text, and employs a character-window heuristic to associate names with IDs, all of which drive critical validation pass/fail decisions.", "duration_ms": 25591, "findings": [{"category": "semantic_string_judgment", "evidence": "_FACE_CLOSE_UP_PATTERNS and _is_face_close_up(prompt)", "line_end": 161, "line_start": 139, "recommended_fix": "Pass framing/focus metadata as a structured enum from the scene director rather than parsing the final prompt prose.", "severity": "P1", "why_problematic": "Hardcoded English keywords (face, eye, gaze, stare, expression) are used in a regex to infer visual framing semantics from the generated t2i_prompt. This result is used to deny validation exemptions, forcing ID enforcement based on brittle natural-language detection."}, {"category": "semantic_string_judgment", "evidence": "t.lower() in prompt_lower where t is from body_part_focus_rule.trigger_phrases", "line_end": 231, "line_start": 212, "recommended_fix": "Use a structured boolean or enum in the prompt card to signal focus-based ID exemptions instead of relying on phrase matching.", "severity": "P1", "why_problematic": "Validation routing (granting ID exemptions) depends on exact substring matches of LLM-generated phrases within the final prompt text. This creates a brittle dependency between two natural-language outputs where minor phrasing variations can cause validation failures."}, {"category": "semantic_string_judgment", "evidence": "_entity_specific_id_in_window using _ANCHOR_WINDOW = 60", "line_end": 128, "line_start": 102, "recommended_fix": "Enforce ID association at the prompt-generation stage using structured templates or token-level tagging rather than post-hoc proximity heuristics.", "severity": "P1", "why_problematic": "The validator uses a fixed 60-character window and sentence boundary detection to infer semantic association between a character's natural-language name and their machine ID (C##). This heuristic is prone to false negatives in complex or descriptive prompts."}], "path": "backend/app/core/visible_entities_validator.py", "scan_kind": "python", "sha256": "366e2185c5df853112075146a74dc8d81d4c36e5fe4441689b7cc81833b80485"}
{"candidate_reason": "python scope discovery", "chunk_end": 282, "chunk_start": 1, "chunk_summary": "The file defines a structured entity extraction module using JSON schemas and LLM clients, with no actionable semantic string judgment or scenario pollution found in this chunk.", "duration_ms": 19500, "findings": [], "path": "backend/app/modules/entity_extractor_legacy.py", "scan_kind": "python", "sha256": "9edba4cc7829246a732320b6db3828ad8c1692f47fd691cf57b98eb2994998ed"}
{"candidate_reason": "python scope discovery", "chunk_end": 221, "chunk_start": 1, "chunk_summary": "The GeminiTextClient is a technical infrastructure component for API communication and does not contain semantic string judgment or scenario-specific logic.", "duration_ms": 7509, "findings": [], "path": "backend/app/modules/llm/gemini_text_client.py", "scan_kind": "python", "sha256": "ab01305191af5c3df4f4b3f5085b038ead3cc5c3a2e918c810577467921fc89b"}
{"candidate_reason": "python scope discovery", "chunk_end": 216, "chunk_start": 1, "chunk_summary": "No actionable findings. The file provides a technical tracing utility for image generation metadata using Opik, with string checks limited to technical model identifiers and provider routing.", "duration_ms": 5604, "findings": [], "path": "backend/app/modules/llm/image_tracer.py", "scan_kind": "python", "sha256": "0ebe23c2d9b90987dfc52fac1097d9edc98d866707618f5e881a6d5fece24a91"}
{"candidate_reason": "python scope discovery", "chunk_end": 289, "chunk_start": 1, "chunk_summary": "The image validator module uses structured LLM outputs (OpenAI Responses API with JSON schema) and numeric thresholds for validation, avoiding brittle string-pattern matching for semantic judgment.", "duration_ms": 14044, "findings": [], "path": "backend/app/modules/image_validator.py", "scan_kind": "python", "sha256": "e6401c59a6af4492ce33f2619f42f239905bc5551008b0b4e4591a93cfe7948b"}
{"candidate_reason": "python scope discovery", "chunk_end": 82, "chunk_start": 1, "chunk_summary": "No actionable findings; the file contains standard infrastructure for logging LLM calls to a database.", "duration_ms": 5007, "findings": [], "path": "backend/app/modules/llm/llm_logger.py", "scan_kind": "python", "sha256": "bc280499bbdb46679b12250b3904c4c770a5cf5128a42d9172beff71e0d09c30"}
{"candidate_reason": "python scope discovery", "chunk_end": 169, "chunk_start": 1, "chunk_summary": "No actionable findings; the file contains low-level LLM client infrastructure for technical API communication and response parsing.", "duration_ms": 6302, "findings": [], "path": "backend/app/modules/llm/openai_client.py", "scan_kind": "python", "sha256": "b09b7d78ae5185fd4ffc7c1a080f9c8f4bb45efeca66da594fef3bdfe7212d2f"}
{"candidate_reason": "python scope discovery", "chunk_end": 35, "chunk_start": 1, "chunk_summary": "The module provides technical utilities for PDF text extraction and basic language detection using character range heuristics, with no actionable semantic string debt.", "duration_ms": 6195, "findings": [], "path": "backend/app/modules/pdf_parser.py", "scan_kind": "python", "sha256": "6dae8e6cd873a2b8f8b6bcf8de055862e1c3c0105bbeefe6eff5d75ffc091a79"}
{"candidate_reason": "python scope discovery", "chunk_end": 369, "chunk_start": 1, "chunk_summary": "The Gemini image client handles API requests, retries with key rotation, and structural response validation (modality checks) without using brittle natural-language string patterns or scenario-specific prompt pollution.", "duration_ms": 17964, "findings": [], "path": "backend/app/modules/llm/gemini_image_client.py", "scan_kind": "python", "sha256": "da5180d7d8c0c04163c45e1c6f95e1d82d0243af4597aefb939e2dfd6baf3162"}
{"candidate_reason": "python scope discovery", "chunk_end": 361, "chunk_start": 1, "chunk_summary": "The PDF renderer is a technical utility for layout and formatting that does not perform semantic classification or scenario-based routing.", "duration_ms": 7718, "findings": [], "path": "backend/app/modules/pdf_renderer.py", "scan_kind": "python", "sha256": "24d6b3c7ccf5da2095f93686ae6c526580f18ac2e3bb0a756c255f7a6b00f5ce"}
{"candidate_reason": "python scope discovery", "chunk_end": 36, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 2849, "findings": [], "path": "backend/app/modules/pipeline/_workers.py", "scan_kind": "python", "sha256": "022738fed30d0efce3ee58a0a4ef4bac167dcd1e61c1257148162d97ea593559"}
{"candidate_reason": "python scope discovery", "chunk_end": 58, "chunk_start": 1, "chunk_summary": "No actionable findings; the file contains technical DAG dependency resolution logic using machine identifiers.", "duration_ms": 4379, "findings": [], "path": "backend/app/modules/pipeline/_dag_levels.py", "scan_kind": "python", "sha256": "50b9da1dd402a115f0a6951f0b978e3ed43213794210fbeec653b06882cc504a"}
{"candidate_reason": "python scope discovery", "chunk_end": 281, "chunk_start": 1, "chunk_summary": "The PDF validation module is a technical utility that uses structured vision LLM outputs to verify document quality without brittle string-based semantic routing or scenario pollution.", "duration_ms": 6913, "findings": [], "path": "backend/app/modules/pdf_validator.py", "scan_kind": "python", "sha256": "5cf00222ec7f7687470cb6a65aa529f7ddb6a29be7cc8e0c2464fdd5518ffaaf"}
{"candidate_reason": "python scope discovery", "chunk_end": 51, "chunk_start": 1, "chunk_summary": "The file uses fuzzy string matching and regex-based normalization to resolve character identities from natural-language names, which determines visible-entity membership for shots.", "duration_ms": 15669, "findings": [{"category": "semantic_string_judgment", "evidence": "_PAREN_RE, match_shot_char, and its use in filter_ve_by_shot_chars (line 49)", "line_end": 51, "line_start": 8, "recommended_fix": "Replace fuzzy name matching with unique entity IDs in shot descriptions, or use a canonical name-to-ID lookup table that avoids ad-hoc string logic.", "severity": "P1", "why_problematic": "Visible-entity membership is decided by brittle string patterns (regex stripping and prefix matching) over natural-language character names. This can cause incorrect entity resolution in shots when names are similar or formatted inconsistently, directly affecting which characters are included in the visual context."}], "path": "backend/app/modules/name_matcher.py", "scan_kind": "python", "sha256": "431470212b80e7a3bd4b33fcb142e5499adc75515995ec4e849041ce8a75e34e"}
{"candidate_reason": "python scope discovery", "chunk_end": 341, "chunk_start": 1, "chunk_summary": "The file defines the database schema for the project, including several fields that use generic Text columns to store semantic categories and natural language labels, leading to schema drift and overloaded semantic channels.", "duration_ms": 41552, "findings": [{"category": "schema_or_enum_drift", "evidence": "entity_type (line 34), variation_a_type (line 110), scene_type (line 127), asset_type (line 166), status (line 175), sanitization_strategy (line 179), prompt_type (line 187), variant_label (line 199)", "line_end": 199, "line_start": 34, "recommended_fix": "Use SQLAlchemy Enum types or CheckConstraints to enforce these values at the schema level, and synchronize these enums with the LLM prompt definitions.", "severity": "P2", "why_problematic": "Multiple columns use generic Text types to store specific semantic categories defined only in comments. This creates a brittle contract between LLM outputs and downstream logic, increasing the risk of drift. Additionally, values like 'aftermath' in sanitization_strategy (line 179) introduce scenario-specific narrative states into the technical schema."}, {"category": "schema_or_enum_drift", "evidence": "reference_image_ids (line 193) vs reference_image_ids (line 297)", "line_end": 297, "line_start": 193, "recommended_fix": "Rename LLMCallLog.reference_image_ids to reference_labels and define a structured schema for these labels instead of free-form strings.", "severity": "P2", "why_problematic": "The field 'reference_image_ids' is overloaded with different semantic meanings across tables: in ImageAsset it stores UUIDs (lineage), while in LLMCallLog it stores natural language 'labels' (e.g., 'character C01O02 in outfit'). Overloading a technical ID field with natural language descriptors creates a brittle semantic channel that requires string parsing to resolve identity."}], "path": "backend/app/models/project.py", "scan_kind": "python", "sha256": "c31a4345928225a45b84f3d64938a3481dd19f3858014ef6700b16e2db71a1dd"}
{"candidate_reason": "python scope discovery", "chunk_end": 236, "chunk_start": 1, "chunk_summary": "The file implements a safety fallback mechanism that uses blind string replacements and scenario-specific prompt suffixes to bypass LLM content filters by rephrasing graphic content into movie-set terminology.", "duration_ms": 20634, "findings": [{"category": "blind_string_mutation", "evidence": "_SAFETY_REPLACEMENTS_KO, _SAFETY_REPLACEMENTS_EN, sanitize_for_safety", "line_end": 89, "line_start": 26, "recommended_fix": "Move safety-related rephrasing to a dedicated LLM pass with contextual awareness rather than using hardcoded string replacement tables that ignore the surrounding prose context.", "severity": "P1", "why_problematic": "The code performs blind substring and regex replacement on natural-language scenario text to mutate graphic terms (e.g., 'blood', 'corpse', 'kill') into 'movie set' euphemisms (e.g., 'paint', 'motionless figure', 'struck down'). This is a brittle semantic mutation that can corrupt prompts or lead to nonsensical descriptions when the context does not align with the assumed 'special effects' framing (e.g., 'melting' ice cream becoming 'deforming by effect')."}, {"category": "scenario_dependent_prompt", "evidence": "SAFETY_SYSTEM_SUFFIX", "line_end": 102, "line_start": 94, "recommended_fix": "Provide abstract instructions for safety-compliant rephrasing or use a dynamic few-shot approach that adapts to the specific scenario context instead of hardcoding specific prop/action names.", "severity": "P2", "why_problematic": "The prompt suffix contains concrete scenario-specific examples (e.g., 'dark red stage paint pool', 'motionless figure in character') and instructs the LLM to use them as a closed list of euphemisms. This biases the model's output towards a specific 'movie set' trope and limits its ability to handle diverse scenario contexts naturally, functioning as a semantic classifier for visual framing."}], "path": "backend/app/modules/llm/safety.py", "scan_kind": "python", "sha256": "bf4dadd9df7fe27d183af62dc19d91d9f173c086e3e9705dac55bce4b42e2b46"}
{"candidate_reason": "python scope discovery", "chunk_end": 280, "chunk_start": 1, "chunk_summary": "The file handles background prompt assembly and validation, using structured identifiers and technical format guards (ASCII checks) without brittle semantic string patterns or scenario pollution.", "duration_ms": 14343, "findings": [], "path": "backend/app/modules/pipeline/background_prompt.py", "scan_kind": "python", "sha256": "de5f48a96c5a19b9b07b12506ddaa30556c2053f398f2284c175be142c76a3b2"}
{"candidate_reason": "python scope discovery", "chunk_end": 499, "chunk_start": 1, "chunk_summary": "The background_planner module implements a structured LLM pipeline step with robust technical validation and dynamic schema injection, showing no actionable semantic string debt.", "duration_ms": 25244, "findings": [], "path": "backend/app/modules/pipeline/background_planner.py", "scan_kind": "python", "sha256": "647640786fa18df4962693aba3275f4d1a2c69b11d1cb8821117c14f74bb1d32"}
{"candidate_reason": "python scope discovery", "chunk_end": 1136, "chunk_start": 1, "chunk_summary": "The file implements background chain planning by grouping shots by location and using an LLM to design a sequence of background nodes, with a fallback mechanism for location resolution that uses brittle substring matching.", "duration_ms": 36708, "findings": [{"category": "semantic_string_judgment", "evidence": "if len(ename) >= 2 and (loc_raw in ename or ename in loc_raw): loc_id = esid", "line_end": 154, "line_start": 151, "recommended_fix": "Ensure the upstream LLM (scene_director) always outputs the canonical short_id (e.g., 'L01') for the primary_location field, and enforce this via schema or exact ID lookup only.", "severity": "P1", "why_problematic": "This logic uses substring matching on natural-language location names (generated by LLMs) to resolve entity IDs when an exact match fails. This is brittle and can lead to incorrect shot grouping/routing if location names overlap (e.g., 'Room' matching 'Living Room')."}], "path": "backend/app/modules/pipeline/background_chain_planning.py", "scan_kind": "python", "sha256": "0f30de23db87c06e6e9c30c8344679eeb02c49a6348e0f9df6dd19984af8714d"}
{"candidate_reason": "python scope discovery", "chunk_end": 473, "chunk_start": 1, "chunk_summary": "The file handles orchestration and validation of the background master plan, using technical regex for ID validation and ensuring consistency between structured LLM outputs without using brittle natural-language patterns for routing.", "duration_ms": 38446, "findings": [], "path": "backend/app/modules/pipeline/background_master_plan.py", "scan_kind": "python", "sha256": "d98a2853ffce308c5404b5652147816a637a2cabd6f9acb6847a521675c00cbe"}
{"candidate_reason": "python scope discovery", "chunk_end": 224, "chunk_start": 1, "chunk_summary": "The file implements background clustering and classification with structured validation, including hard-coded semantic heuristics for background types.", "duration_ms": 41127, "findings": [{"category": "schema_or_enum_drift", "evidence": "kind not in {\"chain_bg\", \"prev_shot_ref\"}", "line_end": 168, "line_start": 147, "recommended_fix": "Centralize the background category definitions and their validation rules (such as minimum shot counts or required attributes) into the schema or a shared configuration object that both the prompt and the validator can reference.", "severity": "P2", "why_problematic": "The classification categories ('chain_bg', 'prev_shot_ref') and their associated semantic constraints (e.g., requiring at least 3 shots and an indoor anchor for 'chain_bg') are hard-coded in the validator. This duplicates logic that should ideally be defined in the schema or a central source of truth, leading to potential drift between the LLM's instructions and the code's enforcement logic."}], "path": "backend/app/modules/pipeline/background_classify.py", "scan_kind": "python", "sha256": "49b9985cf8fb46be2e33e57cd8ed86814808df13e625a334b417f431d1bfeea4"}
{"candidate_reason": "python scope discovery", "chunk_end": 101, "chunk_start": 1, "chunk_summary": "The entity filtering logic uses a brittle regex to normalize LLM-generated entity names for membership checks instead of using stable identifiers.", "duration_ms": 9188, "findings": [{"category": "semantic_string_judgment", "evidence": "re.sub(r'^[CLP]\\d{2,3}\\s*', '', raw_name).strip()", "line_end": 83, "line_start": 71, "recommended_fix": "Instruct the LLM to return the 'short_id' in the response schema and use that exact technical identifier for filtering instead of performing regex-based name normalization.", "severity": "P1", "why_problematic": "The code attempts to normalize LLM-generated names by stripping prefixes (like C01, L02) using a regex to match them against the original entity list. This is brittle because it relies on the LLM's output format for names and can lead to incorrect entity removal or retention if the name naturally contains similar patterns or if the LLM deviates from the expected prefix format."}], "path": "backend/app/modules/pipeline/entity_filter.py", "scan_kind": "python", "sha256": "6942f826c21f51b159a159a2e14e22d2dd3826fee9b826bf1a8623cadca757d3"}
{"candidate_reason": "python scope discovery", "chunk_end": 116, "chunk_start": 1, "chunk_summary": "The file is a clean LLM orchestration module for entity extraction and enrichment, using structured outputs and technical identifiers without brittle semantic string patterns or scenario pollution.", "duration_ms": 13780, "findings": [], "path": "backend/app/modules/pipeline/entity_extractor_v4.py", "scan_kind": "python", "sha256": "e13e19f1e6b9079f28d905440e6d106f69367d417d47349add85469ee51e11bb"}
{"candidate_reason": "python scope discovery", "chunk_end": 43, "chunk_start": 1, "chunk_summary": "The file defines a standard LLM-based entity review module that passes scenario text and extracted entities to a structured LLM call without using brittle string patterns or scenario-specific logic.", "duration_ms": 4180, "findings": [], "path": "backend/app/modules/pipeline/entity_reviewer.py", "scan_kind": "python", "sha256": "fcef947cadd9d7c4eb00bbed3df22fa77435056e08c2d59951dbad87a87a800e"}
{"candidate_reason": "python scope discovery", "chunk_end": 526, "chunk_start": 1, "chunk_summary": "The entity extraction pipeline uses brittle string matching ('none') to filter entities based on LLM-judged importance and contains unenforced schema enums for entity types.", "duration_ms": 35207, "findings": [{"category": "semantic_string_judgment", "evidence": "e.get(\"importance\") == \"none\" and int(e.get(\"appearances\", 0)) < 2", "line_end": 196, "line_start": 193, "recommended_fix": "Define a formal enum for importance in the review schema and use it for filtering, or use a numeric threshold if the LLM provides a score.", "severity": "P1", "why_problematic": "The pipeline performs entity filtering (removing characters/locations/props from the scenario context) based on a brittle string comparison ('none') against an LLM's semantic assessment of 'importance'. This makes the core entity list dependent on exact keyword matching of subjective LLM output, which can lead to silent failures or inconsistent story context if the LLM uses synonyms or different casing."}, {"category": "schema_or_enum_drift", "evidence": "\"entity_type\": {\"type\": \"string\", \"description\": \"character|location|prop\"}", "line_end": 72, "line_start": 72, "recommended_fix": "Convert the 'entity_type' field to a formal JSON enum to ensure output consistency and allow for schema-level validation.", "severity": "P2", "why_problematic": "The schema defines a set of allowed values in a text description rather than a formal JSON enum. This creates a loose contract where the LLM is instructed to classify entities into categories that the downstream code expects to be stable, but does not enforce at the schema level."}], "path": "backend/app/modules/pipeline/entity_extractor_v2_legacy.py", "scan_kind": "python", "sha256": "491a07d32324e43bc3d0823cf4b20d94b9635a232efd731ff7f180a324f8c123"}
{"candidate_reason": "python scope discovery", "chunk_end": 37, "chunk_start": 1, "chunk_summary": "No actionable findings; the module is a standard LLM wrapper for episode summarization without brittle string logic or scenario pollution in the code.", "duration_ms": 3297, "findings": [], "path": "backend/app/modules/pipeline/episode_summarizer.py", "scan_kind": "python", "sha256": "ab7011132784352e2ada55950c411304521d1c9cde4bb6212c2f263baedef8b5"}
{"candidate_reason": "python scope discovery", "chunk_end": 115, "chunk_start": 1, "chunk_summary": "The file is a technical utility for rendering floor plans via an image generation API and contains no actionable semantic string debt or scenario pollution.", "duration_ms": 7260, "findings": [], "path": "backend/app/modules/pipeline/floor_plan_render.py", "scan_kind": "python", "sha256": "ec4b73480bd0a2ebd76fd42e029f2144bc5201052901c84bd988f77964836551"}
{"candidate_reason": "python scope discovery", "chunk_end": 150, "chunk_start": 1, "chunk_summary": "The file implements entity relation extraction using a combination of name-based heuristics and LLM verification, with a brittle candidate detection mechanism.", "duration_ms": 22540, "findings": [{"category": "semantic_string_judgment", "evidence": "bn = base_name(name) ... members.sort(key=lambda x: (len(x[0]), x[0]))", "line_end": 50, "line_start": 15, "recommended_fix": "Shift the responsibility of identifying base/variant relationships entirely to the LLM or a more robust semantic similarity check, rather than relying on name-string patterns and ID lengths to pre-classify candidates.", "severity": "P1", "why_problematic": "The code infers semantic 'variant' relationships between entities by matching natural-language names via base_name() and uses a brittle ID-length heuristic to determine which entity is the 'base'. This result is used to bias LLM relationship extraction via the candidate_block, which can lead to incorrect relationship direction or missed variants if naming/ID conventions vary."}], "path": "backend/app/modules/pipeline/entity_relation.py", "scan_kind": "python", "sha256": "702fe956160167b22f8c13170e231f0b3e61c7c143a8d691b9f574bd4f20209b"}
{"candidate_reason": "python scope discovery", "chunk_end": 284, "chunk_start": 1, "chunk_summary": "The file defines prompt construction and validation logic for floor plan generation, focusing on technical schema enforcement and machine identifier (bg_id) integrity without using brittle semantic string patterns.", "duration_ms": 14215, "findings": [], "path": "backend/app/modules/pipeline/floor_plan_prompt.py", "scan_kind": "python", "sha256": "2b5573a261a1a27f638ee9a2d6e993d0b343f3e50ac66ccf20fdf19f37421029"}
{"candidate_reason": "python scope discovery", "chunk_end": 522, "chunk_start": 1, "chunk_summary": "The file implements a multi-step entity extraction pipeline using structured LLM calls, with minor schema drift in the entity detail extraction step where LLM-generated types and metadata shapes are not strictly enforced.", "duration_ms": 42868, "findings": [{"category": "schema_or_enum_drift", "evidence": "ENTITY_DETAIL_SCHEMA, metadata_json, entity_type", "line_end": 169, "line_start": 84, "recommended_fix": "Use a string enum for entity_type in the schema. Refactor metadata_json to use a discriminator or separate schemas per entity type to ensure the LLM follows the expected structure for characters vs locations vs props, and validate these constraints in _gen_t2i.", "severity": "P2", "why_problematic": "The schema defines entity_type as a generic string and makes it required, but the code in _gen_t2i ignores the LLM's output for this field in favor of an upstream variable. Furthermore, metadata_json uses permissive anyOf schemas for location and visual_identity, while comments (lines 96-104) specify strict per-type shapes (e.g., character must have null location) that are not enforced by the schema or validated by the code before forwarding."}], "path": "backend/app/modules/pipeline/entity_extractor_v3.py", "scan_kind": "python", "sha256": "c986035718b7f91b3dc9915305b09b38345443d8f0dfc9fcb7f037ea64709b33"}
{"candidate_reason": "python scope discovery", "chunk_end": 402, "chunk_start": 1, "chunk_summary": "The file implements entity listing with scene-chaining logic, but uses brittle string replacements and dynamic schema patching to adapt scene-based logic for shot-based extraction.", "duration_ms": 33130, "findings": [{"category": "blind_string_mutation", "evidence": "type_prompt.replace(\"scene_count\", \"shot_count\") and _patch_schema_shot_count(schema)", "line_end": 371, "line_start": 199, "recommended_fix": "Use separate, explicitly defined prompt templates and schemas for shot-based extraction, or use a formal templating system (e.g., Jinja2) to inject the correct terminology and schema requirements.", "severity": "P1", "why_problematic": "The code adapts entity extraction logic from 'scenes' to 'shots' by performing blind substring replacements on natural-language prompt text and dynamically mutating JSON schema keys at runtime. This is brittle, as it assumes specific phrasing in the prompt templates and creates a fragile contract between the LLM output and the application logic."}], "path": "backend/app/modules/pipeline/entity_lister.py", "scan_kind": "python", "sha256": "a0c86dcd35b83d29571024e2362155f34e605e48919512678f9fce63f7a693fb"}
{"candidate_reason": "python scope discovery", "chunk_end": 205, "chunk_start": 1, "chunk_summary": "The file defines a pipeline for generating floor plan prompts and images using LLMs, focusing on prompt assembly and technical validation without using brittle semantic string patterns or scenario-specific pollution.", "duration_ms": 11265, "findings": [], "path": "backend/app/modules/pipeline/location_floor_plan.py", "scan_kind": "python", "sha256": "ed1c1f785630980449d2de23bce336c12221b32c106d6ff80b5881dab1eb6551"}
{"candidate_reason": "python scope discovery", "chunk_end": 134, "chunk_start": 1, "chunk_summary": "The file is a clean LLM orchestration module for extracting character outlooks from scenes, using structured schema enforcement and dynamic enum injection without brittle string patterns or scenario pollution.", "duration_ms": 14717, "findings": [], "path": "backend/app/modules/pipeline/outlook_extractor.py", "scan_kind": "python", "sha256": "06b9ac1042d32428b3d8c26caa1da8e0be00760eded0d9c3c60abfe756ee8387"}
{"candidate_reason": "python scope discovery", "chunk_end": 111, "chunk_start": 1, "chunk_summary": "The file implements a mechanism to merge duplicate visual 'outlooks' by calling an LLM and then applying the resulting name changes to generated T2I prompts via blind substring replacement.", "duration_ms": 11541, "findings": [{"category": "blind_string_mutation", "evidence": "t2i.replace(f\"[{old_name}]\", f\"[{new_name}]\")", "line_end": 105, "line_start": 97, "recommended_fix": "Maintain T2I prompts as structured objects or token lists where entity references are tracked by unique identifiers rather than performing substring replacement on final prose.", "severity": "P1", "why_problematic": "The code performs blind substring replacement on generated T2I prompt prose using names determined by an LLM. This treats natural-language visual descriptions as simple string buffers, which is brittle if names overlap, appear in unexpected contexts, or if the bracketed format is inconsistent in the generated output."}], "path": "backend/app/modules/pipeline/outlook_merger.py", "scan_kind": "python", "sha256": "5efbf5429fc2cd12e1d25c9407ccad251840f279c826c7935df59bce83238a76"}
{"candidate_reason": "python scope discovery", "chunk_end": 84, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 4753, "findings": [], "path": "backend/app/modules/pipeline/scene_dependency_extractor.py", "scan_kind": "python", "sha256": "6383ce4de75a8cc7f349689891e01fd0dd52d72da8aafe6f8f966a9f413795b4"}
{"candidate_reason": "python scope discovery", "chunk_end": 255, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 18305, "findings": [], "path": "backend/app/modules/pipeline/outlook_extractor_v2.py", "scan_kind": "python", "sha256": "5171f914c84b3f5138ec04a16502840b8783021d06d71fee74857d344eabf905"}
{"candidate_reason": "python scope discovery", "chunk_end": 63, "chunk_start": 1, "chunk_summary": "No actionable findings; the file performs standard prompt assembly and LLM orchestration without brittle string-based semantic logic or scenario pollution.", "duration_ms": 5137, "findings": [], "path": "backend/app/modules/pipeline/scene_dependency_v2.py", "scan_kind": "python", "sha256": "621ea80cec9ecf872356bf7abbca36077cc221d644290becd497ae6faa203cfe"}
{"candidate_reason": "python scope discovery", "chunk_end": 85, "chunk_start": 1, "chunk_summary": "The code prepares a structured LLM prompt by dynamically injecting entity short_id enums into the JSON schema to ensure valid output, which is a recommended practice for maintaining schema integrity.", "duration_ms": 7683, "findings": [], "path": "backend/app/modules/pipeline/scene_director_v2.py", "scan_kind": "python", "sha256": "a6511cb91674a8bce17425e8c5e5ae9c33f4e3faf7e4df02c2dcef641a50c5a6"}
{"candidate_reason": "python scope discovery", "chunk_end": 534, "chunk_start": 1, "chunk_summary": "The file implements outlook deduplication and merging logic, but contains debt related to blind string mutation of generated prompts and scenario-specific examples in LLM instructions.", "duration_ms": 29428, "findings": [{"category": "blind_string_mutation", "evidence": "re.sub(r'C\\d{2,3}O\\d{2,3}', _replace_sid, text) ... re.sub(r'\\s{2,}', ' ', result)", "line_end": 83, "line_start": 72, "recommended_fix": "Perform entity deduplication at the structured data level before prompt assembly, or use a grammar-aware template system that handles optional entity references.", "severity": "P1", "why_problematic": "The function blindly removes duplicate entity markers (e.g., C01O02) from generated T2I prompt prose. This can leave dangling conjunctions or broken grammar (e.g., 'Character A and Character A' becomes 'Character A and ') because it does not account for the surrounding natural language context."}, {"category": "blind_string_mutation", "evidence": "t2i_v.replace(remove_marker, keep_marker)", "line_end": 300, "line_start": 288, "recommended_fix": "Use a structured prompt representation where entity references are tracked by stable IDs, and only resolve them to names/markers during the final rendering step.", "severity": "P1", "why_problematic": "During outlook merging, the code performs blind substring replacement of entity markers (e.g., '[Red Dress]') within generated T2I prompt prose. This assumes the bracketed name pattern is unique and safe to replace globally, which risks unintended mutations if the name appears in other contexts or if the prompt structure is complex."}, {"category": "scenario_dependent_prompt", "evidence": "\"검은정장1\"과 \"검은정장2\"는 다를 수 있음", "line_end": 145, "line_start": 136, "recommended_fix": "Replace concrete Korean examples with abstract descriptions of the logic, such as 'distinct numbered variants of the same base item should not be merged'.", "severity": "P2", "why_problematic": "The prompt contains concrete scenario-specific examples (Korean clothing names 'Black Suit 1' and 'Black Suit 2') to define deduplication logic. This biases the LLM towards specific naming conventions and types of props/outlooks found in specific stories."}], "path": "backend/app/modules/pipeline/outlook_dedup.py", "scan_kind": "python", "sha256": "de7e28e35db0549f0b523c81eed8fc32f15884268d1ae726dfda7ef43a8d966f"}
{"candidate_reason": "python scope discovery", "chunk_end": 125, "chunk_start": 1, "chunk_summary": "No actionable findings; the module performs standard LLM-based scene summarization using structured outputs without brittle string-pattern logic or scenario pollution.", "duration_ms": 6049, "findings": [], "path": "backend/app/modules/pipeline/scene_summarizer.py", "scan_kind": "python", "sha256": "98d3e551a2a11f10bc389764409c065358a34de89f1d5b5bee1128421524c7eb"}
{"candidate_reason": "python scope discovery", "chunk_end": 778, "chunk_start": 1, "chunk_summary": "The file provides a unified LLM client with LiteLLM and Opik integration, featuring technical routing, schema validation, and safety-related fallback mechanisms without actionable semantic string debt.", "duration_ms": 132215, "findings": [], "path": "backend/app/modules/llm/llm_client.py", "scan_kind": "python", "sha256": "16dda2eae6b7463c05729ddb95db0d5fbc4a5bacf78e9769c2f11af368df8340"}
{"candidate_reason": "python scope discovery", "chunk_end": 363, "chunk_start": 1, "chunk_summary": "The file implements a reference image generation and validation pipeline using Gemini and GPT LVM, with logic that routes behavior based on unenforced string categories in the LVM response schema.", "duration_ms": 45544, "findings": [{"category": "schema_or_enum_drift", "evidence": "_VALIDATION_SCHEMA, _COMPARISON_SCHEMA, validation.get('severity') == 'severe', comparison.get('winner')", "line_end": 337, "line_start": 66, "recommended_fix": "Add 'enum' constraints to the JSON schemas for 'severity' and 'winner' fields, and ensure the code uses a shared constant or enum to handle these values consistently.", "severity": "P2", "why_problematic": "The JSON schemas for LVM validation and comparison define allowed values (e.g., 'ok', 'minor', 'severe', 'image_1', 'image_2') only in descriptions. The code at lines 322 and 337 performs exact string matches on these values to drive critical pipeline behavior (regeneration and winner selection). This is brittle as the schema does not use the 'enum' keyword to enforce these values, and line 303 even introduces an out-of-schema 'unavailable' value."}], "path": "backend/app/modules/pipeline/ref_image_pipeline.py", "scan_kind": "python", "sha256": "f7f720c3c3d0c4e71f2b19e9013ad8600d8bc0b5b33b035f89d34a2caefd0387"}
{"candidate_reason": "python scope discovery", "chunk_end": 337, "chunk_start": 1, "chunk_summary": "The module determines frame-visible entities for shots using an LLM, but includes a post-processing step that uses string patterns to override the LLM's visibility decisions.", "duration_ms": 22718, "findings": [{"category": "semantic_string_judgment", "evidence": "detect_gaze_pattern_exclusions(desc, name_to_char_id)", "line_end": 199, "line_start": 182, "recommended_fix": "Remove the post-process exclusion logic and rely on the LLM's structured output for frame visibility. If the LLM is unreliable, improve the prompt instructions or provide the gaze patterns as examples in the prompt rather than enforcing them via regex in code.", "severity": "P1", "why_problematic": "The code uses a pattern-matching helper to scan natural-language shot descriptions for gaze/offscreen cues and then mutates the 'visible_entity_ids' list. This overrides the LLM's semantic judgment of frame visibility using brittle string heuristics, directly contradicting the module's own docstring (line 79) which explicitly forbids code heuristics for open-world semantic judgment."}], "path": "backend/app/modules/pipeline/shot_director.py", "scan_kind": "python", "sha256": "becac71f7b5224ed6be94088c15448f827b6229f53f731ee955c604ab8db9d6d"}
{"candidate_reason": "python scope discovery", "chunk_end": 166, "chunk_start": 1, "chunk_summary": "The file manages background rendering with a moderation retry loop that relies on brittle string prefix matching to mutate generated prompts.", "duration_ms": 119891, "findings": [{"category": "semantic_string_judgment", "evidence": "if not sanitized.lstrip().startswith(\"BACKGROUND-ONLY\"): sanitized = _BACKGROUND_ONLY_REINFORCEMENT + sanitized", "line_end": 150, "line_start": 148, "recommended_fix": "Use a structured metadata field in the sanitizer response to indicate if the reinforcement was applied, and avoid hardcoding specific visual styles like 'architectural still' in global reinforcement strings.", "severity": "P1", "why_problematic": "The code uses a brittle string prefix check on LLM-generated prompt text to decide whether to prepend a hardcoded reinforcement fragment. This creates a fragile dependency on the exact wording of the LLM output. Additionally, the reinforcement constant (line 22) contains scenario-biasing terms like 'architectural still' which may conflict with non-building backgrounds."}], "path": "backend/app/modules/pipeline/background_render.py", "scan_kind": "python", "sha256": "497a49b7050919807a148e8fa32be91353e756dea2991ba82b21f4691213d15d"}
{"candidate_reason": "python scope discovery", "chunk_end": 525, "chunk_start": 1, "chunk_summary": "The file defines several JSON schemas for LLM interaction where categorical fields are documented in descriptions but not enforced as enums, leading to brittle string-based routing in the pipeline.", "duration_ms": 38195, "findings": [{"category": "schema_or_enum_drift", "evidence": "_SCENE_VALIDATION_SCHEMA (severity), _COMPARISON_SCHEMA (winner), _IMPROVEMENT_SCHEMA (type)", "line_end": 522, "line_start": 36, "recommended_fix": "Update the JSON schema definitions to use the 'enum' keyword for these fields (e.g., 'enum': ['ok', 'minor', 'severe']). This ensures the LLM is constrained to the expected values and allows the schema validator to catch drift early.", "severity": "P2", "why_problematic": "Categorical fields like 'severity' (line 41), 'winner' (line 52), and 'type' (line 68) are defined as strings with allowed values listed only in the 'description' field of the JSON schema. Downstream code (lines 370, 391, 452, 505, 519) performs exact string comparisons on these values. This creates a brittle contract where the LLM might emit valid but slightly different strings (e.g., capitalization or extra whitespace) that the code fails to recognize, potentially bypassing logic like regeneration or variant selection."}], "path": "backend/app/modules/pipeline/scene_image_pipeline.py", "scan_kind": "python", "sha256": "5d6383246ebb757e1d612256a3abfbc0f964cf92ecc1fd17d0ae09e72357b70d"}
{"candidate_reason": "python scope discovery", "chunk_end": 48, "chunk_start": 1, "chunk_summary": "The file is a standard pipeline module for extracting visual world rules using an LLM and contains no actionable string-pattern debt or scenario pollution.", "duration_ms": 5869, "findings": [], "path": "backend/app/modules/pipeline/visual_world_rules.py", "scan_kind": "python", "sha256": "d175b0ca2f77e250eb3e5f62c48a7af863d5ea6426c80c7c7a03b630a4b1c411"}
{"candidate_reason": "python scope discovery", "chunk_end": 47, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 2631, "findings": [], "path": "backend/app/modules/png_metadata.py", "scan_kind": "python", "sha256": "b11942c89529fb36b00d1f2b737d9343b53835d5fbe6dfd85e72b69ee578f1b9"}
{"candidate_reason": "python scope discovery", "chunk_end": 242, "chunk_start": 1, "chunk_summary": "The file implements a scene validator that uses an LLM to verify entity visibility, containing scenario-specific prompt pollution and blind string mutation of generated T2I prompts.", "duration_ms": 39205, "findings": [{"category": "scenario_dependent_prompt", "evidence": "\"동녘(강의원)\" 같은 표현 → 동녘의 몸만 있고, 강의원은 원격에서 조종 중이므로 강의원은 false", "line_end": 144, "line_start": 144, "recommended_fix": "Replace specific character names and plot points with abstract placeholders like 'Character A (Character B)' or generic descriptions.", "severity": "P2", "why_problematic": "The prompt contains concrete character names and a specific plot situation (remote control) as a rule, which can bias the LLM's judgment in unrelated scenarios."}, {"category": "blind_string_mutation", "evidence": "_clean_prompt using re.sub with escaped name and sid patterns", "line_end": 236, "line_start": 222, "recommended_fix": "Instead of post-hoc regex cleaning, regenerate the prompt or use a structured prompt assembly method where entities are managed as objects rather than embedded strings.", "severity": "P1", "why_problematic": "The code performs blind regex-based removal of entity names and markers from generated T2I prompt prose. This can result in broken grammar or accidental deletion of natural language text that happens to match the entity name."}], "path": "backend/app/modules/pipeline/scene_validator.py", "scan_kind": "python", "sha256": "8e27a9499877233d3a1e9ece29fbd4dd3aa5656c9d29dfbaa4b82f4e4671d42d"}
{"candidate_reason": "python scope discovery", "chunk_end": 297, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 25574, "findings": [], "path": "backend/app/modules/pipeline/shot_staging.py", "scan_kind": "python", "sha256": "2e103d7cf3b31422d96abcbbe9730debfb96d88b64252c5544feab66e91171fb"}
{"candidate_reason": "python scope discovery", "chunk_end": 1240, "chunk_start": 1, "chunk_summary": "The file implements a background rendering pipeline with brittle architectural assumptions and blind prompt mutations for safety reinforcement.", "duration_ms": 141818, "findings": [{"category": "blind_string_mutation", "evidence": "_BACKGROUND_ONLY_REINFORCEMENT = \"BACKGROUND-ONLY architectural still — empty space, NO people, NO faces...\"", "line_end": 61, "line_start": 57, "recommended_fix": "Move the reinforcement instructions into the PromptSanitizer configuration or the system prompt as a conditional instruction, rather than performing blind string concatenation in the rendering loop.", "severity": "P1", "why_problematic": "The code blindly prepends a hardcoded semantic constraint string to a generated prompt (line 290) to override a generic sanitizer. This is brittle, bypasses LLM reasoning, and introduces a specific 'architectural' bias that may not fit all background scenarios (e.g., natural landscapes)."}, {"category": "scenario_dependent_prompt", "evidence": "Thoroughly describe wall/floor/ceiling/lighting/palette since later children inherit from this rendered photo.", "line_end": 92, "line_start": 89, "recommended_fix": "Use more generic terminology such as 'surfaces', 'boundaries', or 'environment details' to accommodate both indoor and outdoor scenarios.", "severity": "P2", "why_problematic": "Hardcodes architectural assumptions ('wall/floor/ceiling') into the prompt instructions for root background anchors, which may bias or confuse the LLM when generating prompts for outdoor or natural scenarios."}], "path": "backend/app/modules/pipeline/background_chain_render.py", "scan_kind": "python", "sha256": "f68591b10e7661b59fffffffde393e9c9208fba64dbe4c7d8e6b3c69116b4da6"}
{"candidate_reason": "python scope discovery", "chunk_end": 86, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 4041, "findings": [], "path": "backend/app/modules/progress_tracker.py", "scan_kind": "python", "sha256": "668fae07268d57f39931347c5ce69298e415a505ee85005e39345d4387725908"}
{"candidate_reason": "python scope discovery", "chunk_end": 454, "chunk_start": 1, "chunk_summary": "The file uses extensive Korean lexicons and regex patterns to infer entity visibility and gaze targets from natural language shot descriptions and camera directions, which controls visible-entity membership and validation.", "duration_ms": 24011, "findings": [{"category": "semantic_string_judgment", "evidence": "_KOREAN_GAZE_STEMS, _KOREAN_FRAMING_NOUNS, _BODY_PART_NOUNS, _OFFSCREEN_PHRASES, detect_gaze_pattern_exclusions, detect_offscreen_drift", "line_end": 445, "line_start": 37, "recommended_fix": "Replace the deterministic regex-based extraction with a structured LLM extraction step that identifies gaze targets and off-screen entities as part of the shot metadata, or enforce these as explicit fields in the upstream shot_director/shot_staging schemas.", "severity": "P1", "why_problematic": "The module implements deterministic detectors that parse open-world natural language (shot descriptions and camera directions) using brittle Korean lexicons and proximity-based regex to decide entity visibility and gaze targets. This logic directly mutates the visible_entity_ids list or triggers VisibleStagingDriftError, making the pipeline's core visibility logic dependent on linguistic pattern matching rather than structured semantic signals."}], "path": "backend/app/modules/pipeline/shot_visibility.py", "scan_kind": "python", "sha256": "1b551eb799e33ae1cd96ed94b561fda2b0921cd0a2f8d77e4f2ba515d2af15db"}
{"candidate_reason": "python scope discovery", "chunk_end": 403, "chunk_start": 1, "chunk_summary": "The file provides infrastructure for loading prompt templates and JSON schemas from the database or filesystem with version-aware fallback logic, and contains no actionable semantic string debt.", "duration_ms": 6442, "findings": [], "path": "backend/app/modules/prompt_loader.py", "scan_kind": "python", "sha256": "4f096399c0a91a5d5bc3adbc065988b68a1ea77178a4d4a8da063de484233a1b"}
{"candidate_reason": "python scope discovery", "chunk_end": 86, "chunk_start": 1, "chunk_summary": "No actionable findings; the file is a technical logging utility for LLM traces and does not perform semantic string judgment or mutation.", "duration_ms": 4479, "findings": [], "path": "backend/app/modules/prompt_tracer_legacy.py", "scan_kind": "python", "sha256": "a3de142f72aa3d16ff0c2108ae34640343b3b6be72783f726101a0cbd41f6538"}
{"candidate_reason": "python scope discovery", "chunk_end": 287, "chunk_start": 1, "chunk_summary": "The file provides infrastructure for provenance logging and operation tracking, containing no actionable semantic string judgment or scenario pollution.", "duration_ms": 8227, "findings": [], "path": "backend/app/modules/provenance.py", "scan_kind": "python", "sha256": "449131b46eb16420f309910a745d6435af6627edf44c22e71a3472aba467f1fb"}
{"candidate_reason": "python scope discovery", "chunk_end": 78, "chunk_start": 1, "chunk_summary": "The text extraction prompt contains a project-specific name as an example, which is a form of scenario pollution.", "duration_ms": 28883, "findings": [{"category": "scenario_dependent_prompt", "evidence": "예: \"네메\\\\n시스\" → \"네메시스\"", "line_end": 31, "line_start": 31, "recommended_fix": "Replace the specific name 'Nemesis' with a generic example or a placeholder like '가\\\\n나다' → '가나다'.", "severity": "P2", "why_problematic": "The prompt uses a specific proper noun ('Nemesis') as an example for word joining. This is concrete scenario pollution that can bias the LLM's extraction or correction behavior toward specific project-related terminology."}], "path": "backend/app/modules/pipeline/text_cleaner.py", "scan_kind": "python", "sha256": "c9e826bc21f7993a9b265dd8e989e9f58000b6e44a85c1b4bfa2aec7186db266"}
{"candidate_reason": "python scope discovery", "chunk_end": 454, "chunk_start": 1, "chunk_summary": "The file implements a T2I prompt review and correction pipeline that uses an LLM to suggest fixes, which are then applied using brittle substring replacement.", "duration_ms": 33522, "findings": [{"category": "blind_string_mutation", "evidence": "old.replace(target, suggestion) and old_prompt.replace(target, suggestion)", "line_end": 454, "line_start": 383, "recommended_fix": "Modify the LLM review schema to return the full corrected prompt string instead of target/suggestion pairs, or implement a token-aware replacement strategy.", "severity": "P1", "why_problematic": "The functions _apply_entity_fixes and _apply_scene_fixes apply LLM-generated corrections to T2I prompts using simple substring replacement. This is a blind semantic mutation that can lead to corrupted prompts if the 'target' string appears multiple times, is a substring of another word, or if the LLM provides a slightly mismatched target string."}], "path": "backend/app/modules/pipeline/t2i_review.py", "scan_kind": "python", "sha256": "e5323a52576aa62eafcd92d24ae73f9667641d7fc4d92cc1e588b23e2239b5b8"}
{"candidate_reason": "python scope discovery", "chunk_end": 70, "chunk_start": 1, "chunk_summary": "The file provides technical utility functions for generating and mapping short identifiers (e.g., C01, L01) for entities, which are treated as machine-readable formats rather than natural-language scenario text.", "duration_ms": 7992, "findings": [], "path": "backend/app/modules/short_id.py", "scan_kind": "python", "sha256": "a12da612ad174a03abd3fc704048950edc892d574fbad599ae73f53b5b9a325e"}
{"candidate_reason": "python scope discovery", "chunk_end": 152, "chunk_start": 1, "chunk_summary": "The file defines a SemanticContractRouter that infers physical character states (immobilized/pose_locked) from LLM-produced strings to drive sanitizer constraints.", "duration_ms": 17408, "findings": [{"category": "semantic_string_judgment", "evidence": "IMMOBILIZED_GAZE = frozenset({\"dead\", \"unconscious\", \"severely_injured\"}) ... gaze = entry.get(\"gaze_target\") ... if gaze not in IMMOBILIZED_GAZE", "line_end": 107, "line_start": 22, "recommended_fix": "Implement the planned 'subject_state.immobility_state' structured field with a canonical enum as mentioned in the file header (lines 9-11), and update the router to use this field instead of matching semantic strings in 'gaze_target'.", "severity": "P1", "why_problematic": "The system infers a character's physical 'immobilized' state by matching specific semantic strings ('dead', 'unconscious') within the 'gaze_target' field. This is brittle as it relies on exact LLM output for open-world concepts and uses an overloaded field (gaze_target) to carry physical state information. This classification directly changes sanitizer behavior, such as forbidding active reactions or state rewrites."}], "path": "backend/app/modules/semantic_contract_router.py", "scan_kind": "python", "sha256": "3eabedd46fc41df8eb486c7c37b479c82096db368111f44188c3cc7912667d56"}
{"candidate_reason": "python scope discovery", "chunk_end": 63, "chunk_start": 1, "chunk_summary": "The module defines a structured schema for extracting style rules from scenarios using an LLM, but contains no brittle string patterns, scenario-specific pollution, or blind mutations in the provided code.", "duration_ms": 17660, "findings": [], "path": "backend/app/modules/style_rules_generator.py", "scan_kind": "python", "sha256": "d371c3250f2dbae4b3655e1b522c6a618ed7cc7b96cbd915a616e1f0c2bb856d"}
{"candidate_reason": "python scope discovery", "chunk_end": 257, "chunk_start": 1, "chunk_summary": "The module uses brittle string prefix matching to identify screenplay scene headings from natural language text, which then drives the structural indexing and routing for LLM-based still extraction.", "duration_ms": 33729, "findings": [{"category": "semantic_string_judgment", "evidence": "HEADING_PREFIXES = (\"INT.\", \"EXT.\", \"INT/EXT.\", \"I/E.\") ... if upper.startswith(prefix) and len(stripped) <= HEADING_MAX_LEN", "line_end": 192, "line_start": 19, "recommended_fix": "Replace the brittle prefix check with a more robust screenplay parser or allow the LLM to identify and return scene boundaries as part of its structured output, rather than relying on Python-side string heuristics to define the scene index.", "severity": "P1", "why_problematic": "The module identifies scene boundaries in natural-language screenplay text using a hardcoded list of English prefixes. This segmentation is used to build a 'heading_catalog' which the LLM is then required to reference by index (heading_catalog_index). This is brittle for non-English scripts or scripts with non-standard formatting, and it directly controls the structural routing and validation of the extraction process."}], "path": "backend/app/modules/scene_still_extractor_legacy.py", "scan_kind": "python", "sha256": "baa63faac463130f5931fae18b7f24ec4d990a1643049af5e823c7ca0267931a"}
{"candidate_reason": "python scope discovery", "chunk_end": 182, "chunk_start": 1, "chunk_summary": "The file defines a T2I prompt composer that transforms scene descriptions into structured T2I prompts using an LLM, with no actionable semantic string debt found.", "duration_ms": 17501, "findings": [], "path": "backend/app/modules/t2i_prompt_composer.py", "scan_kind": "python", "sha256": "eb3ec3ea7ab066c510d18ef2ade7cc2449656a9317a31df1201834b0ca025fc7"}
{"candidate_reason": "python scope discovery", "chunk_end": 247, "chunk_start": 1, "chunk_summary": "The module uses brittle substring checks to mutate LLM-generated prompts and contains hardcoded semantic state mappings that drift from upstream routers.", "duration_ms": 42091, "findings": [{"category": "blind_string_mutation", "evidence": "if not sanitized.startswith(strategy[\"prefix\"].strip()[:40]):", "line_end": 230, "line_start": 228, "recommended_fix": "Use a technical marker or a separate field in the structured LLM response to indicate if the prefix was applied, rather than checking a 40-character slice of natural language.", "severity": "P1", "why_problematic": "This performs a brittle substring check on LLM-generated prose to decide whether to prepend a strategy prefix. If the LLM output slightly varies the prefix (e.g., whitespace or punctuation), it results in double-prepending or inconsistent prompt structure."}, {"category": "schema_or_enum_drift", "evidence": "_STATE_GUIDANCE and the loop over preserve_pose, preserve_subject_state, etc.", "line_end": 106, "line_start": 67, "recommended_fix": "Centralize the semantic state vocabulary and constraint flags in a shared schema or enum used by both the router and the sanitizer.", "severity": "P2", "why_problematic": "The module hardcodes a vocabulary of semantic states (dead, unconscious) and constraint flags (preserve_pose, forbid_active_reaction) that must be manually synchronized with the upstream semantic_contract_router. This is an unenforced string contract prone to drift."}], "path": "backend/app/modules/prompt_sanitizer.py", "scan_kind": "python", "sha256": "1683afd2c14de05d98cb740416b11672fa98f0049d44330251143670f2538d90"}
{"candidate_reason": "python scope discovery", "chunk_end": 396, "chunk_start": 1, "chunk_summary": "The module contains scenario-specific prompt pollution in the character reference rules, hardcoding Korean cultural context and specific plot states into the general generation logic.", "duration_ms": 43440, "findings": [{"category": "scenario_dependent_prompt", "evidence": "mapping = { \"character\": [ ..., \"포박 상태\", \"현대 한국/근미래 한국 기준의 현실적 기본 복장\", ... ] }", "line_end": 98, "line_start": 61, "recommended_fix": "Remove hardcoded scenario-specific phrases from the general character rules and rely on the world_guide or entity-specific traits for cultural or situational context.", "severity": "P2", "why_problematic": "The character reference rules hardcode scenario-specific details such as 'Korean baseline clothing' and 'restraint state' (포박 상태). This pollutes the prompt with specific cultural and plot context that should be derived from the world_guide or entity description, biasing generation for non-Korean or non-action scenarios."}], "path": "backend/app/modules/reference_image_generator.py", "scan_kind": "python", "sha256": "968475c02cf20d169fef0a67556ee73f3be39cb8ff3f3279f61c1094931e370f"}
{"candidate_reason": "python scope discovery", "chunk_end": 16, "chunk_start": 1, "chunk_summary": "No actionable findings; this file contains standard authentication schemas with technical metadata fields.", "duration_ms": 2770, "findings": [], "path": "backend/app/schemas/auth.py", "scan_kind": "python", "sha256": "c2a78063e1a4ff91ccb3722ce4b76ae354c44ad3396920e7ecb3f919beb06ab2"}
{"candidate_reason": "python scope discovery", "chunk_end": 20, "chunk_start": 1, "chunk_summary": "No actionable findings; the file contains standard technical schema definitions for error responses and pagination.", "duration_ms": 2641, "findings": [], "path": "backend/app/schemas/common.py", "scan_kind": "python", "sha256": "efa97cf6a53a58a07adb5498f1f44e7bdb1ea42e1accf6593cc8128cea8e2b56"}
{"candidate_reason": "python scope discovery", "chunk_end": 171, "chunk_start": 1, "chunk_summary": "The module converts entity and scene descriptions into T2I prompts, but relies on a brittle prompt-side contract for entity referencing using bracketed name markers intended for downstream blind string mutation.", "duration_ms": 28942, "findings": [{"category": "blind_string_mutation", "evidence": "## [마커] 규칙 — 반드시 준수... 1. 각 씬 아래의 '★ 엔티티 목록'에 있는 이름만 [이름] 마커 사용 가능... 3. [이름]은 목록의 이름을 공백 포함 정확히 복사... 4. [] 마커는 참조 이미지 치환용이므로 목록 외 사용 시 시스템 오류 발생", "line_end": 133, "line_start": 128, "recommended_fix": "Replace natural-language name markers with unique, stable identifiers (e.g., <ENTITY_ID>) in the prompt instructions, or move to a structured output format where the LLM explicitly maps entities to their positions in the generated prompt.", "severity": "P1", "why_problematic": "This prompt instruction establishes a contract for blind substring replacement in downstream modules. It requires the LLM to perform exact string replication of natural-language names to serve as anchors for reference injection, which is highly susceptible to minor formatting variations or hallucinations that break the replacement logic. The prompt explicitly mentions that failure to follow this pattern causes system errors."}], "path": "backend/app/modules/t2i_visual_converter.py", "scan_kind": "python", "sha256": "c288f257d1b6d258eea3850beaec967eb2d189a69209f4f25642ea86e9f3249c"}
{"candidate_reason": "python scope discovery", "chunk_end": 579, "chunk_start": 1, "chunk_summary": "The module constructs structured T2I prompts for scene generation, but contains brittle string truncation of world context, unenforced schema dependencies for character traits, and humanoid-biased prompt instructions.", "duration_ms": 52250, "findings": [{"category": "blind_string_mutation", "evidence": "world_summary = world_summary[:200].rsplit(\".\", 1)[0] + \".\"", "line_end": 63, "line_start": 62, "recommended_fix": "Use an LLM-based summarizer or a robust sentence-aware truncation utility to ensure the world context remains semantically coherent.", "severity": "P2", "why_problematic": "This is a blind string mutation of natural language world context. It attempts to truncate to the last period within a character limit, which is brittle and can result in loss of critical semantic context or broken sentences if the text contains abbreviations or non-standard punctuation."}, {"category": "schema_or_enum_drift", "evidence": "traits_data.get(\"visual_anchor_traits\", [])", "line_end": 97, "line_start": 89, "recommended_fix": "Define a formal schema for entity traits and use a validated data model to access these fields instead of raw dictionary lookups on parsed JSON.", "severity": "P2", "why_problematic": "The code relies on a specific internal key ('visual_anchor_traits') within a JSON-string field ('stable_traits') to extract identity-fixing traits. This structure is not enforced by a central schema or enum, making the prompt generation logic vulnerable to silent failures if the upstream LLM's output format changes."}, {"category": "scenario_dependent_prompt", "evidence": "Keep exact face, hair, and build from this image.", "line_end": 303, "line_start": 301, "recommended_fix": "Generalize the reference instructions to use neutral terms like 'visual features', 'identity', and 'appearance', or make the instructions dynamic based on the entity's type.", "severity": "P2", "why_problematic": "The prompt instructions for character references contain hardcoded humanoid bias (e.g., 'face', 'hair', 'wardrobe' on line 145, and '인물' on line 105). This can bias or confuse the T2I model when the entity is a non-human character such as a robot, creature, or vehicle."}], "path": "backend/app/modules/scene_image_generator.py", "scan_kind": "python", "sha256": "ecdff80635095f8ac3d4b2171cc50a33304e8e36ba0c278b02703a0e849e06ad"}
{"candidate_reason": "python scope discovery", "chunk_end": 178, "chunk_start": 1, "chunk_summary": "The module defines a structured LLM interaction for scene variations, but uses string descriptions instead of JSON enums for categorical fields in the response schema.", "duration_ms": 20330, "findings": [{"category": "schema_or_enum_drift", "evidence": "_RESPONSE_SCHEMA", "line_end": 88, "line_start": 14, "recommended_fix": "Convert the 'type' and 'recommended' fields in _RESPONSE_SCHEMA to use the 'enum' keyword with the allowed string values.", "severity": "P2", "why_problematic": "The fields 'variation_a.type', 'variation_b.type', and 'recommended' define allowed values (e.g., 'angle | color | angle+color | none', 'original | A | B') only within the description string rather than using a JSON 'enum'. This prevents the schema validator from enforcing these categories and forces downstream consumers to rely on brittle string comparisons for logic that depends on these types."}], "path": "backend/app/modules/variation_recommender.py", "scan_kind": "python", "sha256": "69145ad1e970b20fa74035168c091d03c232cc7c5b192b9f3ca0f6c21c4ba7a0"}
{"candidate_reason": "python scope discovery", "chunk_end": 316, "chunk_start": 1, "chunk_summary": "The webbook generator module is a well-structured orchestrator that uses technical schemas and character-count validations without relying on brittle string patterns or scenario-specific prompt pollution.", "duration_ms": 15498, "findings": [], "path": "backend/app/modules/webbook_generator.py", "scan_kind": "python", "sha256": "9ec93175aa0c2d3159f2896f374778595166dd28f420ea5bc780870523a45941"}
{"candidate_reason": "python scope discovery", "chunk_end": 138, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 15451, "findings": [], "path": "backend/app/modules/world_guide_generator.py", "scan_kind": "python", "sha256": "8a0040e8cdf5ce23c74f9a2250f7e6cbc45ad1adc140785b5d420a0bb23fdd27"}
{"candidate_reason": "python scope discovery", "chunk_end": 29, "chunk_start": 1, "chunk_summary": "No actionable findings; the file contains standard Pydantic models for episode metadata without semantic string logic or scenario pollution.", "duration_ms": 3852, "findings": [], "path": "backend/app/schemas/episode.py", "scan_kind": "python", "sha256": "a72dc87a847d7c558a06f1abcfbcd98dfd41f3e1e40ec2a273018d70ff7c8996"}
{"candidate_reason": "python scope discovery", "chunk_end": 50, "chunk_start": 1, "chunk_summary": "No actionable findings; this file contains standard technical metadata schemas for operation logging and monitoring.", "duration_ms": 3322, "findings": [], "path": "backend/app/schemas/operation.py", "scan_kind": "python", "sha256": "c4dee1d33fc72dfaa6a198d9aa276c3e6689d996005cd164e98dd91b8d4cb7b3"}
{"candidate_reason": "python scope discovery", "chunk_end": 63, "chunk_start": 1, "chunk_summary": "No actionable findings; the file defines standard Pydantic schemas for technical export/import and validation metadata without semantic string logic or prompt pollution.", "duration_ms": 5091, "findings": [], "path": "backend/app/schemas/export.py", "scan_kind": "python", "sha256": "30349132c6762b409151f67c5a537f72d87049357a821e4ada65badaa81d0244"}
{"candidate_reason": "python scope discovery", "chunk_end": 47, "chunk_start": 1, "chunk_summary": "No actionable findings; the file defines standard Pydantic schemas for project and member management using technical metadata.", "duration_ms": 4279, "findings": [], "path": "backend/app/schemas/project.py", "scan_kind": "python", "sha256": "db325ae49a0a3e2eb855ff3392b7ffa2aa1f5d4963bd2f4a21842a04217c4a02"}
{"candidate_reason": "python scope discovery", "chunk_end": 30, "chunk_start": 1, "chunk_summary": "No actionable findings; the file defines standard technical API schemas for tracing and logging without semantic string logic or scenario pollution.", "duration_ms": 5320, "findings": [], "path": "backend/app/schemas/trace.py", "scan_kind": "python", "sha256": "3bab02539298dd74bc98eddae9ed88e8aefb8aed869b53630b49524baed63926"}
{"candidate_reason": "python scope discovery", "chunk_end": 16, "chunk_start": 1, "chunk_summary": "No actionable findings; the file contains standard technical user management schemas.", "duration_ms": 3498, "findings": [], "path": "backend/app/schemas/user.py", "scan_kind": "python", "sha256": "454ee8dcddb1a547cf1b2d44876d36861449a1fb0892266ba0570686ce43e627"}
{"candidate_reason": "python scope discovery", "chunk_end": 68, "chunk_start": 1, "chunk_summary": "No actionable findings; this file contains standard authentication and session management logic using technical identifiers and error codes.", "duration_ms": 3103, "findings": [], "path": "backend/app/services/auth_service.py", "scan_kind": "python", "sha256": "baa838999fa13b569c7daa02f52487f6d17f6303caea0fd3b9eb12c9ec22584f"}
{"candidate_reason": "python scope discovery", "chunk_end": 182, "chunk_start": 1, "chunk_summary": "The module defines a GPT Vision variation recommender where categorical output fields are defined as generic strings in the JSON schema instead of enums, leading to potential schema drift.", "duration_ms": 28353, "findings": [{"category": "schema_or_enum_drift", "evidence": "type: { \"type\": \"string\", \"description\": \"angle | color | angle+color | none\" }, recommended: {\"type\": \"string\"}", "line_end": 66, "line_start": 24, "recommended_fix": "Update the JSON schema to use the 'enum' keyword for 'type' and 'recommended' fields to enforce the allowed values at the API level.", "severity": "P2", "why_problematic": "The 'type' and 'recommended' fields are defined as strings in the JSON schema despite having a fixed set of expected values (as seen in descriptions and docstrings at line 90). This lacks formal enforcement via the 'enum' keyword, which can lead to the LLM producing slightly different strings (e.g., 'angle and color' vs 'angle+color') that pass JSON validation but break downstream logic expecting exact matches."}], "path": "backend/app/modules/variation_recommender_v2.py", "scan_kind": "python", "sha256": "0408b1a87e0733b48fd82e256a86074aaed373f586cee69ce5f12f8df55114c6"}
{"candidate_reason": "python scope discovery", "chunk_end": 26, "chunk_start": 1, "chunk_summary": "No actionable findings; this file is a structural __init__.py that exports synchronization services without implementing logic or prompts.", "duration_ms": 3192, "findings": [], "path": "backend/app/services/checkpoint_sync/__init__.py", "scan_kind": "python", "sha256": "6950afde87f19ddbf7a7f2ef7501c20cab26b30cf2e3b0d9707d643560377a44"}
{"candidate_reason": "python scope discovery", "chunk_end": 86, "chunk_start": 1, "chunk_summary": "The file defines Pydantic schemas for entities and scene stills; no actionable semantic string judgment or scenario pollution was found in this structural definition.", "duration_ms": 14672, "findings": [], "path": "backend/app/schemas/entity.py", "scan_kind": "python", "sha256": "9ab2573cd9eff34c336c3a09d57d0ff5b1d84d53b976a0c01afd506865a20149"}
{"candidate_reason": "python scope discovery", "chunk_end": 105, "chunk_start": 1, "chunk_summary": "No actionable findings. The file contains technical infrastructure for checkpoint synchronization using status constants and structural JSON validation.", "duration_ms": 4341, "findings": [], "path": "backend/app/services/checkpoint_sync/_base.py", "scan_kind": "python", "sha256": "63961d4d3b025abc4d5fbcaed4c929ef1250aa9f4c05f8f9f8f6c9f4a8d5c491"}
{"candidate_reason": "python scope discovery", "chunk_end": 78, "chunk_start": 1, "chunk_summary": "This file defines technical dataclasses and type aliases for the SceneStillSyncService pipeline and contains no actionable semantic string debt or prompt pollution.", "duration_ms": 8748, "findings": [], "path": "backend/app/services/checkpoint_sync/_scene_still_contracts.py", "scan_kind": "python", "sha256": "97663cc81d9af81732e0760ef170dcc3f5ac46cbc24d4b9eefa3e1fbb447714b"}
{"candidate_reason": "python scope discovery", "chunk_end": 774, "chunk_start": 1, "chunk_summary": "No actionable findings. The file serves as a technical dispatcher and job orchestrator using machine identifiers, status constants, and configuration-driven applicability logic without performing semantic analysis on natural-language text.", "duration_ms": 12217, "findings": [], "path": "backend/app/services/analysis_dispatch_service.py", "scan_kind": "python", "sha256": "9c128dce46be495f153fd8f15a3349a8ca94ad23146bbd68ac57d13747444d1e"}
{"candidate_reason": "python scope discovery", "chunk_end": 153, "chunk_start": 1, "chunk_summary": "The file is a technical orchestrator for database synchronization and contains no actionable findings related to semantic string judgment or scenario pollution.", "duration_ms": 7147, "findings": [], "path": "backend/app/services/checkpoint_sync/orchestrator.py", "scan_kind": "python", "sha256": "2ddbb1e40fcb91e679e13b21f95d97b571430d3503dcf8accc184e668024ffd0"}
{"candidate_reason": "python scope discovery", "chunk_end": 260, "chunk_start": 1, "chunk_summary": "The file is a technical synchronization service that moves structured entity data from checkpoints to the database using machine-defined identifiers and schema-validated fields; no actionable semantic string debt or scenario pollution was found.", "duration_ms": 9492, "findings": [], "path": "backend/app/services/checkpoint_sync/entity_sync_service.py", "scan_kind": "python", "sha256": "d93b0ef98a45c52fe596c45bdb0c0f69aa161af00e7f7c4ec167ba1570200581"}
{"candidate_reason": "python scope discovery", "chunk_end": 85, "chunk_start": 1, "chunk_summary": "The file defines image-related schemas with several string fields that function as unenforced enums, creating potential for schema drift.", "duration_ms": 21628, "findings": [{"category": "schema_or_enum_drift", "evidence": "variant_type (line 28), prompt_type (line 33), status (line 84)", "line_end": 84, "line_start": 28, "recommended_fix": "Use typing.Literal or Enum for variant_type, prompt_type, and status fields to enforce the allowed values at the schema level.", "severity": "P2", "why_problematic": "These fields use plain strings with allowed values documented only in comments (e.g., 'cinematic | closeup | original'). This lacks runtime validation and type safety, leading to drift if downstream logic (such as framing-based ID enforcement for 'closeup') expects specific exact strings."}], "path": "backend/app/schemas/image.py", "scan_kind": "python", "sha256": "36fc5caeec3ffedca36d21dbabe52fd31526363862bd65fd022d47d0cd1caca2"}
{"candidate_reason": "python scope discovery", "chunk_end": 953, "chunk_start": 1, "chunk_summary": "The file implements a multi-turn scene extraction pipeline using LLMs and regex, featuring brittle anchor-based segmentation and blind mutation of generated T2I prompts.", "duration_ms": 133583, "findings": [{"category": "semantic_string_judgment", "evidence": "pos = fulltext.find(start_text, search_from)", "line_end": 330, "line_start": 330, "recommended_fix": "Use token-based offsets or unique line identifiers in the prompt to allow the LLM to return stable indices rather than arbitrary prose snippets.", "severity": "P1", "why_problematic": "Uses an LLM-generated natural language snippet (start_line_text) as a brittle anchor to determine scene boundaries in the original scenario text. If the LLM slightly alters punctuation or characters, the match fails, leading to incorrect scene routing."}, {"category": "semantic_string_judgment", "evidence": "if split_text in scene_text: split_pos = scene_text.index(split_text)", "line_end": 451, "line_start": 450, "recommended_fix": "Implement fuzzy matching for anchors or use structured line-by-line analysis to identify split points.", "severity": "P1", "why_problematic": "Similar to the segmentation anchor, this uses LLM-generated prose to find a split point for long scenes. Failure to match exactly results in keeping the original segment, which is a routing decision based on brittle string matching."}, {"category": "blind_string_mutation", "evidence": "if marker not in current_t2i ... var[\"t2i_prompt\"] = current_t2i.rstrip() + \" \" + suffix", "line_end": 822, "line_start": 817, "recommended_fix": "Instruct the LLM to include markers in a structured field or use a template-based prompt assembly method that ensures markers are present without post-generation string injection.", "severity": "P1", "why_problematic": "Blindly appends a suffix to the generated T2I prompt prose if a specific character/outlook marker pattern is missing. This is a post-hoc semantic mutation of generated text based on a brittle substring check."}], "path": "backend/app/modules/pipeline/scene_extractor_v2.py", "scan_kind": "python", "sha256": "9ead4b3967543b38bc6f0d8ec6b108a3f20681a680830b6ad10a8cef99948480"}
{"candidate_reason": "python scope discovery", "chunk_end": 108, "chunk_start": 1, "chunk_summary": "No actionable findings; the file is a technical data aggregator that uses exact schema keys and status constants to load checkpoint data into a bundle.", "duration_ms": 9228, "findings": [], "path": "backend/app/services/checkpoint_sync/scene_still_checkpoint_loader.py", "scan_kind": "python", "sha256": "7f7f750650e328e72bbb53317eedb31699f08e50e97fb52d864fc211747470a6"}
{"candidate_reason": "python scope discovery", "chunk_end": 201, "chunk_start": 1, "chunk_summary": "The RelationSyncService performs delta synchronization of entity relations from checkpoints to the database using exact identifier matches and technical constants, with no actionable semantic string debt.", "duration_ms": 12307, "findings": [], "path": "backend/app/services/checkpoint_sync/relation_sync_service.py", "scan_kind": "python", "sha256": "6e92eee3c6bdec60861c5972e32d868f03819c1b7c7efa46cdf47f1c3147694e"}
{"candidate_reason": "python scope discovery", "chunk_end": 175, "chunk_start": 1, "chunk_summary": "No actionable findings; the file performs technical integrity checks using machine-generated hashes and step identifiers to ensure pipeline consistency.", "duration_ms": 4675, "findings": [], "path": "backend/app/services/dispatcher_preflight.py", "scan_kind": "python", "sha256": "bb5f7357bcc5c3f9f26ea927115cbe561ab373aa782965d002b82058e6ce4a2e"}
{"candidate_reason": "python scope discovery", "chunk_end": 97, "chunk_start": 1, "chunk_summary": "The file is a thin orchestrator for syncing scene stills from checkpoints and contains no actionable semantic string judgment or scenario pollution.", "duration_ms": 12872, "findings": [], "path": "backend/app/services/checkpoint_sync/scene_still_sync_service.py", "scan_kind": "python", "sha256": "713434e0a55bff3a92581f12cc3044077f046ac52a3c0bd5c798c95749abd83f"}
{"candidate_reason": "python scope discovery", "chunk_end": 248, "chunk_start": 1, "chunk_summary": "The file is a standard CRUD service for episode management and does not contain actionable semantic string debt or scenario pollution.", "duration_ms": 6401, "findings": [], "path": "backend/app/services/episode_service.py", "scan_kind": "python", "sha256": "f1eaaedaff9fdc20ef72f00e40125caeb7adef762f13ef365f1eb67d9c1edcdd"}
{"candidate_reason": "python scope discovery", "chunk_end": 213, "chunk_start": 1, "chunk_summary": "The SceneStillWriter service is a data-synchronization layer that handles database UPSERTs for scene still records based on structured checkpoint data, with no actionable semantic string debt.", "duration_ms": 11322, "findings": [], "path": "backend/app/services/checkpoint_sync/scene_still_writer.py", "scan_kind": "python", "sha256": "1f52aa60a54f0f34744d909cec355179d8d2a900cb87266cc37ff1ae2cd39704"}
{"candidate_reason": "python scope discovery", "chunk_end": 293, "chunk_start": 1, "chunk_summary": "The file manages episode status projection and T2I appearance counts using technical status constants and machine-identifier regex patterns, which are permitted under the audit rules.", "duration_ms": 23176, "findings": [], "path": "backend/app/services/checkpoint_sync/episode_projection_service.py", "scan_kind": "python", "sha256": "09b092c7f0cf9cb4d25f17fe560deed5bdc44e387b9d67359d9482a6071b5cbd"}
{"candidate_reason": "python scope discovery", "chunk_end": 198, "chunk_start": 1, "chunk_summary": "The file contains logic to normalize scene and shot data into planned stills, including a heuristic that filters visible entities by searching for their IDs within generated T2I prompt text.", "duration_ms": 19813, "findings": [{"category": "semantic_string_judgment", "evidence": "used = set(_BARE_ID_RE.findall(text)); ... return [sid for sid in director_ve if sid in used]", "line_end": 76, "line_start": 69, "recommended_fix": "Modify the T2I variation generation process to return a structured list of included entity IDs alongside the prompt text, rather than relying on regex parsing of the generated prompt string to infer visibility.", "severity": "P1", "why_problematic": "The function _shot_ve filters the list of visible entities by performing a regex search for entity IDs (e.g., C01, L02) within the generated t2i_prompt text. This uses brittle string matching over natural-language prose to decide visual entity membership, which directly affects downstream reference attachment and policy enforcement."}], "path": "backend/app/services/checkpoint_sync/scene_still_normalizer.py", "scan_kind": "python", "sha256": "c0c29435dd7a4a4aafa0fa5d348a19901db4489d5eef09f5904ab3bf52d3e12f"}
{"candidate_reason": "python scope discovery", "chunk_end": 145, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 4233, "findings": [], "path": "backend/app/services/image_upload_service.py", "scan_kind": "python", "sha256": "1d6513ba312bc54256900329b481a3c819d17b80d1790bb7999a8abfdd5846a6"}
{"candidate_reason": "python scope discovery", "chunk_end": 241, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 15319, "findings": [], "path": "backend/app/services/fal_angle_helpers.py", "scan_kind": "python", "sha256": "f77edf941603c41d5c372a5b0f61292ed7ebc77b0fa39e076087e278ebbf247e"}
{"candidate_reason": "python scope discovery", "chunk_end": 339, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 18174, "findings": [], "path": "backend/app/services/image_review_service.py", "scan_kind": "python", "sha256": "7f8ea4ae1778bd448c530d21e51550fce37f1329d8e0c5721abe11dbed3e2d46"}
{"candidate_reason": "python scope discovery", "chunk_end": 248, "chunk_start": 1, "chunk_summary": "The file is a service layer that orchestrates T2I prompt generation by delegating to a composer module and managing project-level prompt overrides; no actionable semantic string judgment or scenario pollution was found.", "duration_ms": 20704, "findings": [], "path": "backend/app/services/image_composer_service.py", "scan_kind": "python", "sha256": "3542b129ba7f9899f2936d64d2b65b09fac2c32783ffaf153e3e3cc35d1c3fc7"}
{"candidate_reason": "python scope discovery", "chunk_end": 398, "chunk_start": 1, "chunk_summary": "The file contains helper functions for image asset management, metadata extraction, and T2I prompt population, using allowed technical identifiers and structured schema contracts without brittle natural-language pattern matching.", "duration_ms": 22674, "findings": [], "path": "backend/app/services/image_service_helpers.py", "scan_kind": "python", "sha256": "4cb95f5c43c7fe4de43a78c55da9f78f7710f90e18f15ada0aa380675e73d540"}
{"candidate_reason": "python scope discovery", "chunk_end": 874, "chunk_start": 1, "chunk_summary": "The file is a service layer for planning document analysis, focusing on orchestration, locking, and structured LLM dispatching without using brittle string patterns for semantic judgment.", "duration_ms": 15692, "findings": [], "path": "backend/app/services/planning_doc_analysis_service.py", "scan_kind": "python", "sha256": "a99dd956a14efe6da51185101b99cb2579aaf8c509209bbeb6f7e5182630df3e"}
{"candidate_reason": "python scope discovery", "chunk_end": 515, "chunk_start": 1, "chunk_summary": "The file is a standard data export and import service that handles database serialization and ID remapping without performing semantic analysis or scenario-based string matching.", "duration_ms": 11929, "findings": [], "path": "backend/app/services/project_export_service.py", "scan_kind": "python", "sha256": "ca89ee0c105ac860374f4ee5515554799004ff1ef9c59c96213158c54879d8b4"}
{"candidate_reason": "python scope discovery", "chunk_end": 339, "chunk_start": 1, "chunk_summary": "The service performs delta synchronization of outlooks and character-outlook links, using brittle string parsing to resolve character IDs and handling inconsistent schema keys in checkpoint data.", "duration_ms": 46828, "findings": [{"category": "semantic_string_judgment", "evidence": "csid_raw.split(\"O\")[0] if \"O\" in csid_raw and csid_raw.startswith(\"C\")", "line_end": 238, "line_start": 233, "recommended_fix": "Ensure the upstream checkpoint generation (outlook_phase3) provides character_id and outlook_id as distinct, structured fields. Remove the string-splitting logic in favor of direct ID lookups.", "severity": "P1", "why_problematic": "This logic infers character identity by parsing a composite string pattern (e.g., 'C01O02') from checkpoint data. It relies on a brittle, non-standard ID formatting convention to resolve entity references, which can break if the LLM or upstream process changes its output format."}, {"category": "schema_or_enum_drift", "evidence": "ol.get(\"outlook_id\") or ol.get(\"short_id\", \"\"); sa.get(\"assignments\", sa.get(\"characters\", []))", "line_end": 231, "line_start": 73, "recommended_fix": "Standardize the output schema for the outlook checkpoint and enforce single canonical keys in the validator.", "severity": "P2", "why_problematic": "The code uses fallback logic for multiple keys across different parts of the checkpoint data (outlooks and scene assignments), indicating inconsistent schema enforcement for LLM-generated outputs."}], "path": "backend/app/services/checkpoint_sync/outlook_sync_service.py", "scan_kind": "python", "sha256": "77f48701691d4b39436443ee782c53617a8784e7c9cd6103f4cb66f8c32f3193"}
{"candidate_reason": "python scope discovery", "chunk_end": 379, "chunk_start": 1, "chunk_summary": "The file is a service layer for image management that delegates most logic to specialized services; it contains no actionable findings regarding brittle semantic string patterns or scenario pollution.", "duration_ms": 26808, "findings": [], "path": "backend/app/services/image_service.py", "scan_kind": "python", "sha256": "3e95506e2df29531254df2f0517a140a55c86dd835853b8c6436851b6578f045"}
{"candidate_reason": "python scope discovery", "chunk_end": 441, "chunk_start": 1, "chunk_summary": "The file contains standard project management service logic and a translation utility for project names, with no actionable semantic string debt or scenario pollution.", "duration_ms": 11919, "findings": [], "path": "backend/app/services/project_service.py", "scan_kind": "python", "sha256": "30015de0bd5b291a8723078b28a977564db4c113f58227d83f1e03bb063668da"}
{"candidate_reason": "python scope discovery", "chunk_end": 180, "chunk_start": 1, "chunk_summary": "The file contains standard service logic for generating reference images and managing database assets, with no actionable semantic string judgment or scenario pollution.", "duration_ms": 6519, "findings": [], "path": "backend/app/services/reference_entity_service.py", "scan_kind": "python", "sha256": "bdc38e95c20fd1a9a3ea6886b7db7c8d2d2e18b05f449cfa0e6aa2c2cf911848"}
{"candidate_reason": "python scope discovery", "chunk_end": 188, "chunk_start": 1, "chunk_summary": "No actionable findings; the file serves as a clean service facade delegating to specialized orchestrators and services without implementing brittle string-based logic.", "duration_ms": 6510, "findings": [], "path": "backend/app/services/reference_image_service.py", "scan_kind": "python", "sha256": "25f234aab96453b4ee319adb98b5c863aabe2d4f0cc365ea860f28a6e5f6de20"}
{"candidate_reason": "python scope discovery", "chunk_end": 1098, "chunk_start": 1, "chunk_summary": "The export service uses technical identifiers and structured LLM calls for image placement and reference attachment, avoiding brittle natural-language pattern matching for semantic judgment.", "duration_ms": 35779, "findings": [], "path": "backend/app/services/export_service.py", "scan_kind": "python", "sha256": "1eda78af58ad6847382d0cd6c5301196c7d501861ca524ee0689659f3585d2c9"}
{"candidate_reason": "python scope discovery", "chunk_end": 52, "chunk_start": 1, "chunk_summary": "The file defines a dataclass for pipeline state and contains no actionable semantic string judgment or scenario pollution.", "duration_ms": 5591, "findings": [], "path": "backend/app/services/reference_pipeline_context.py", "scan_kind": "python", "sha256": "a97061282cf5286d5b5845ba0766e18973ef220d57a0afed94db2fd0571c0f4c"}
{"candidate_reason": "python scope discovery", "chunk_end": 462, "chunk_start": 1, "chunk_summary": "The file contains several instances of semantic string judgment over reference labels and blind string mutations of generated prompt text, including camera angle stripping and style deduplication.", "duration_ms": 19293, "findings": [{"category": "semantic_string_judgment", "evidence": "_classify_label uses substring checks like 'previous shot', 'same room', 'wearing', 'outfit', 'prop', 'background'", "line_end": 116, "line_start": 75, "recommended_fix": "Use a structured enum for reference roles in the labeled_refs data structure instead of parsing natural language labels.", "severity": "P1", "why_problematic": "It infers the semantic role and visual instructions for a reference image by matching natural-language substrings in labels. This is brittle and can misclassify if these common words appear in different contexts."}, {"category": "semantic_string_judgment", "evidence": "if sid in label: return idx", "line_end": 239, "line_start": 235, "recommended_fix": "Pass explicit entity-to-reference mappings in the payload rather than searching within label strings.", "severity": "P1", "why_problematic": "Resolves entity IDs (C01, P01, etc.) to reference images by checking if the ID is a substring of the natural-language label. This can lead to false positives if an ID appears in a description but is not the primary subject."}, {"category": "blind_string_mutation", "evidence": "re.sub(r\"In a (low angle|dutch angle|high angle|bird eye|wide|tracking|over the shoulder)\\s*(frame|composition|shot|view)\\s*\", \"\", cleaned)", "line_end": 301, "line_start": 296, "recommended_fix": "If camera angles need to be handled separately, they should be extracted into a structured field rather than being blindly deleted from the prose.", "severity": "P1", "why_problematic": "Blindly strips camera framing and angle descriptions from the generated prompt text. This removes intentional cinematic direction provided by the LLM."}, {"category": "scenario_dependent_prompt", "evidence": "\"'from the reference', 'from Reference image N' 같은 표현은 절대 새로 만들지 마세요 (phantom guard 충돌).\"", "line_end": 369, "line_start": 368, "recommended_fix": "Improve the downstream validator to be context-aware or use structured references that do not rely on specific natural language phrases.", "severity": "P2", "why_problematic": "The prompt contains specific phrase-avoidance instructions designed to bypass a brittle downstream regex validator ('phantom guard'). This couples the LLM behavior to specific regex patterns."}, {"category": "blind_string_mutation", "evidence": "cleaned.replace('Photorealistic cinematic still.', '').strip()", "line_end": 417, "line_start": 417, "recommended_fix": "Manage style prefixes as a separate structured component of the prompt assembly rather than using string replacement on the final body.", "severity": "P2", "why_problematic": "Blindly removes a specific style string from the prompt to avoid duplication. This assumes the string appears exactly as written and may fail or cause odd spacing if the LLM varies the phrasing."}], "path": "backend/app/services/prompt_service.py", "scan_kind": "python", "sha256": "0e1f2edfaf73d969c61bd4c340dce41dfe55b883e8e1a1635deb6777e8ed60cc"}
{"candidate_reason": "python scope discovery", "chunk_end": 194, "chunk_start": 1, "chunk_summary": "The code manages composite image generation using technical tags and identifiers (e.g., '[composite:]', 'O00') for routing and state management, which are permitted technical metadata patterns.", "duration_ms": 16844, "findings": [], "path": "backend/app/services/reference_composite_service.py", "scan_kind": "python", "sha256": "0808de0b8cef16a31e727d1b4a2e72faa5c170483b4473497546bad8a20b282b"}
{"candidate_reason": "python scope discovery", "chunk_end": 221, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 14711, "findings": [], "path": "backend/app/services/reference_phase1_service.py", "scan_kind": "python", "sha256": "2a1d55ccad09abddd63606381b8339bf867b25cf8ce9b0068350441eb69568a7"}
{"candidate_reason": "python scope discovery", "chunk_end": 221, "chunk_start": 1, "chunk_summary": "No actionable findings; the file handles orchestration of standalone outfit reference generation using technical identifiers and standard translation prompts without brittle semantic string patterns.", "duration_ms": 15861, "findings": [], "path": "backend/app/services/reference_phase2_service.py", "scan_kind": "python", "sha256": "6afb9ffdd066966fc9941807d3278079047521e72dcf73d4c4231b0f9611ee0e"}
{"candidate_reason": "python scope discovery", "chunk_end": 248, "chunk_start": 1, "chunk_summary": "No actionable findings; the file performs technical orchestration and manifest updates using structured identifiers and indices without semantic string pattern matching.", "duration_ms": 7109, "findings": [], "path": "backend/app/services/scene_detail_redo_service.py", "scan_kind": "python", "sha256": "05995a6cafe7b8188b9a6955c53706071f6bc727f0cc044995d69a282689012b"}
{"candidate_reason": "python scope discovery", "chunk_end": 212, "chunk_start": 1, "chunk_summary": "The file is clean; it uses technical metadata tags within string fields for asset tracking and routing, which is an allowed pattern for technical identifiers.", "duration_ms": 15739, "findings": [], "path": "backend/app/services/reference_phase3_service.py", "scan_kind": "python", "sha256": "65ab25d190edfa3da7822ea16b37be88494cad9d4717c445bbd0ec0c6b1b8458"}
{"candidate_reason": "python scope discovery", "chunk_end": 350, "chunk_start": 1, "chunk_summary": "The file contains stateless checkpoint loaders that perform technical indexing, schema validation, and legacy field normalization without using brittle string patterns to infer open-world semantic meaning.", "duration_ms": 19214, "findings": [], "path": "backend/app/services/scene_checkpoint_loaders.py", "scan_kind": "python", "sha256": "8ea0144cf6f32b7a4bad899852e7ab110b4b92beae3471502a886f692dcf8079"}
{"candidate_reason": "python scope discovery", "chunk_end": 142, "chunk_start": 1, "chunk_summary": "No actionable findings; the file handles technical metadata embedding and provenance tracking using machine identifiers and indices without performing semantic string analysis or prompt mutation.", "duration_ms": 8528, "findings": [], "path": "backend/app/services/scene_provenance_service.py", "scan_kind": "python", "sha256": "2b9a4ed11b13c486c31e7f93e7581e4b83249650a34589be0d6dc2f71175870f"}
{"candidate_reason": "python scope discovery", "chunk_end": 444, "chunk_start": 1, "chunk_summary": "The ReferencePipelineOrchestrator manages the execution flow of reference image generation phases and handles technical metadata, database state, and dependency sorting without using brittle string patterns to infer scenario meaning.", "duration_ms": 19994, "findings": [], "path": "backend/app/services/reference_pipeline_orchestrator.py", "scan_kind": "python", "sha256": "ff2ad64624ebed2747e69bc0bdb588816e6c17ef2fa38e5739cf4f05255d0c59"}
{"candidate_reason": "python scope discovery", "chunk_end": 713, "chunk_start": 1, "chunk_summary": "The file is a persistence service for scene images and world guides, primarily handling structured database operations and state restoration without using brittle string patterns for semantic judgment.", "duration_ms": 15985, "findings": [], "path": "backend/app/services/scene_persistence_service.py", "scan_kind": "python", "sha256": "5c95c40e8b9d324dffb601a0769b3e5f7f38116e61f61e19468a617813d5dd44"}
{"candidate_reason": "python scope discovery", "chunk_end": 201, "chunk_start": 1, "chunk_summary": "The SnapshotService handles technical checkpoint management, including file-based versioning and status synchronization, without using semantic string patterns or scenario-specific logic.", "duration_ms": 6411, "findings": [], "path": "backend/app/services/snapshot_service.py", "scan_kind": "python", "sha256": "c63bfd39afaf8532eedaf1a5265d07c484d69e6b35868363721b53e16b9cf503"}
{"candidate_reason": "python scope discovery", "chunk_end": 222, "chunk_start": 1, "chunk_summary": "The ShotSelectionService handles structured checkpoint updates and database synchronization for shot selection without using semantic string patterns or scenario-specific logic.", "duration_ms": 7069, "findings": [], "path": "backend/app/services/shot_selection_service.py", "scan_kind": "python", "sha256": "949ccd4bffcdf1831d462528144038395e6cadd0528a395e37518505d2b3ac86"}
{"candidate_reason": "python scope discovery", "chunk_end": 102, "chunk_start": 1, "chunk_summary": "The file is a service wrapper for scene image validation using an LVM; it uses numeric scores and technical status constants without brittle string pattern matching over natural language.", "duration_ms": 13099, "findings": [], "path": "backend/app/services/scene_validation_service.py", "scan_kind": "python", "sha256": "20fc23378e4105db86ea78ec23e616b951d01734bba5094647e060779a1eae9f"}
{"candidate_reason": "python scope discovery", "chunk_end": 155, "chunk_start": 1, "chunk_summary": "No actionable findings; the file contains standard user management and authentication logic using technical identifiers.", "duration_ms": 3400, "findings": [], "path": "backend/app/services/user_service.py", "scan_kind": "python", "sha256": "5ecb98097bdc112cf9cc8692a1822e3c383e9578b7b925a59b7d71b047aa933e"}
{"candidate_reason": "python scope discovery", "chunk_end": 135, "chunk_start": 1, "chunk_summary": "No actionable findings; the file handles technical workflow status routing and metadata assembly using machine-defined identifiers and status constants.", "duration_ms": 5376, "findings": [], "path": "backend/app/services/step_readmodel_service.py", "scan_kind": "python", "sha256": "b5a855b0ed4d02835ae020c4bbde363f6546a9ae5095af948e6d0a2ce55a2051"}
{"candidate_reason": "python scope discovery", "chunk_end": 61, "chunk_start": 1, "chunk_summary": "No actionable findings; this file contains standard technical infrastructure for bootstrapping default system user accounts.", "duration_ms": 3410, "findings": [], "path": "backend/app/startup/default_users.py", "scan_kind": "python", "sha256": "be84724df19a13f57579bd6f5ecf50a68c89cf7a07e11ca22e64e0bc6336f825"}
{"candidate_reason": "python scope discovery", "chunk_end": 211, "chunk_start": 1, "chunk_summary": "The file handles step execution orchestration, task locking, and checkpoint validation using technical identifiers and status constants without any actionable semantic string debt.", "duration_ms": 8889, "findings": [], "path": "backend/app/services/step_execution_service.py", "scan_kind": "python", "sha256": "4041e2063fde5752e15e0cef31152028a2fa0a25dfd62db7100f88d9d5d0ab2e"}
{"candidate_reason": "python scope discovery", "chunk_end": 975, "chunk_start": 1, "chunk_summary": "The file is a facade service that orchestrates scene image generation by delegating to specialized services for validation, variation, persistence, and reference management, with no actionable semantic string debt found.", "duration_ms": 25563, "findings": [], "path": "backend/app/services/scene_image_service.py", "scan_kind": "python", "sha256": "3ad11a1143a4a45f872c2d94089db0ad5de8b64de34f1fcddf73f12d1994a4b0"}
{"candidate_reason": "python scope discovery", "chunk_end": 3, "chunk_start": 1, "chunk_summary": "No actionable findings; the file contains only a technical version string which is allowed metadata.", "duration_ms": 3317, "findings": [], "path": "backend/app/version.py", "scan_kind": "python", "sha256": "8a74b49cf200d288fd2e6ee89692f5efa767192e7a461fbd9b84fd4410ec70ff"}
{"candidate_reason": "python scope discovery", "chunk_end": 99, "chunk_start": 1, "chunk_summary": "No actionable findings. This script is a technical utility for managing prompt file versions using file system paths and git commands, without any semantic analysis of prompt content.", "duration_ms": 3001, "findings": [], "path": "backend/scripts/archive_prompts.py", "scan_kind": "python", "sha256": "68f7087ca8084f080df87bee035a9ebd4f3537bffa0399974b041ec08ebce046"}
{"candidate_reason": "python scope discovery", "chunk_end": 95, "chunk_start": 1, "chunk_summary": "No actionable findings. This script is a technical infrastructure utility for auditing database row statuses and timestamps, using only machine identifiers and standard datetime formats.", "duration_ms": 3141, "findings": [], "path": "backend/scripts/audit_stale_running.py", "scan_kind": "python", "sha256": "0bfb86be58d0540df97cb4c06c7a87e6335f95f3db82daf487e5138552341049"}
{"candidate_reason": "python scope discovery", "chunk_end": 117, "chunk_start": 1, "chunk_summary": "No actionable findings; this is a technical maintenance script using machine identifiers and technical constants to trigger a batch process.", "duration_ms": 5127, "findings": [], "path": "backend/scripts/_quarantined/dispatch_pid_80f62523.py", "scan_kind": "python", "sha256": "1731f4c6ff8e6c2370f40ab3478e09e6d745f93b5632e8cfe9386e54b5f8ec9f"}
{"candidate_reason": "python scope discovery", "chunk_end": 63, "chunk_start": 1, "chunk_summary": "No actionable findings; the script handles technical infrastructure for user account bootstrapping and environment-based guards without processing scenario or visual semantics.", "duration_ms": 3541, "findings": [], "path": "backend/scripts/bootstrap_default_users.py", "scan_kind": "python", "sha256": "3d9c2dc63255eacaecfd529b3fbee085d5b7afbf07eb6374f1a6df913a9ebcac"}
{"candidate_reason": "python scope discovery", "chunk_end": 90, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 2806, "findings": [], "path": "backend/scripts/cleanup_checkpoint_archives.py", "scan_kind": "python", "sha256": "2e48a037ad73ad7a65fb789bfee90c6ba78a23b93d725fd63aeb5cd78ff6307f"}
{"candidate_reason": "python scope discovery", "chunk_end": 177, "chunk_start": 1, "chunk_summary": "No actionable findings; the script is a technical utility for documenting and validating the pipeline's step manifest using structured identifiers.", "duration_ms": 4508, "findings": [], "path": "backend/scripts/dump_step_manifest.py", "scan_kind": "python", "sha256": "10ca16329cb26bc26991e55a379d4118da356601fe1628332af50fd7f4e9be34"}
{"candidate_reason": "python scope discovery", "chunk_end": 170, "chunk_start": 1, "chunk_summary": "The file is a utility for serializing visual context and rules into Markdown for LLM consumption, and it includes a language detection heuristic for backward compatibility; no actionable semantic string-pattern debt was found.", "duration_ms": 21434, "findings": [], "path": "backend/app/services/visual_context_helper.py", "scan_kind": "python", "sha256": "f8775f56fa6cf6eaee7a434885d8586928b4e0e5f2eb0bfa31fa815ddb2a7749"}
{"candidate_reason": "python scope discovery", "chunk_end": 1027, "chunk_start": 1, "chunk_summary": "The service uses brittle regex patterns to resolve entity references from natural-language prompts and labels, performs blind string mutation on generated T2I prompts, and overloads the 'gaze_target' field as a semantic state classifier.", "duration_ms": 37227, "findings": [{"category": "semantic_string_judgment", "evidence": "_re.finditer(r'(C\\d{2,3})(O\\d{2,3})', t2i_prompt), _re.finditer(r'\\[\\[([^\\]]+)\\]\\+\\[([^\\]]+)\\]\\]', t2i_prompt)", "line_end": 478, "line_start": 367, "recommended_fix": "Pass a structured list of active entity IDs alongside the prompt instead of inferring them from the prompt text via regex.", "severity": "P1", "why_problematic": "The service resolves entity identity and decides which reference images to attach by parsing natural-language prompt text (both short_id patterns and legacy name-based patterns). This makes reference resolution dependent on the LLM's ability to maintain exact string formatting in prose."}, {"category": "blind_string_mutation", "evidence": "rewritten = _re.sub(pattern, replacement, rewritten)", "line_end": 130, "line_start": 111, "recommended_fix": "Use a template-based prompt generation system where placeholders are replaced in a controlled manner, or perform replacement on a structured representation of the prompt.", "severity": "P1", "why_problematic": "The function blindly replaces short IDs (C##, P##) within the generated T2I prompt text with descriptive phrases. This risks corrupting the prompt if these patterns appear naturally or in other metadata fields within the string."}, {"category": "semantic_string_judgment", "evidence": "ca.get(\"gaze_target\", \"\") in (\"unconscious\", \"dead\", \"severely_injured\")", "line_end": 988, "line_start": 932, "recommended_fix": "Introduce a dedicated 'physical_state' or 'status' field in the staging schema and use a formal enum for these values.", "severity": "P1", "why_problematic": "The 'gaze_target' field, which nominally describes orientation, is overloaded to carry physical/biological state information. Downstream code uses these specific strings to branch prompt label generation and reference image selection (state_variant)."}, {"category": "semantic_string_judgment", "evidence": "_re.search(r'character\\s+(C\\d{2,3}(?:O\\d{2,3})?)', label)", "line_end": 88, "line_start": 65, "recommended_fix": "Pass structured metadata (e.g., a dict or object) through the indexing pipeline instead of encoding/decoding information in label strings.", "severity": "P2", "why_problematic": "Internal metadata (entity IDs) is extracted from intermediate string labels to decide how to further transform those labels and attach descriptions. This creates a brittle internal string contract between different parts of the service."}], "path": "backend/app/services/scene_reference_service.py", "scan_kind": "python", "sha256": "053a42a8eb51b29dd818ab455f9c8589589f247774cc7050a428f2ba7d305a66"}
{"candidate_reason": "python scope discovery", "chunk_end": 181, "chunk_start": 1, "chunk_summary": "The script is a regression canary (test runner) that validates technical reference contracts using database lookups and dry-run validation, with no actionable semantic debt found.", "duration_ms": 11280, "findings": [], "path": "backend/scripts/canary_single_vs_batch_refs.py", "scan_kind": "python", "sha256": "b93a69efb195a1ec7c3db5cac5cfcfc5f3d489db9be04832dcd866cb9a6f7cec"}
{"candidate_reason": "python scope discovery", "chunk_end": 768, "chunk_start": 1, "chunk_summary": "The service uses LLM-generated strings to route image variation logic and selection states without formal enum enforcement, creating potential for schema drift.", "duration_ms": 38717, "findings": [{"category": "schema_or_enum_drift", "evidence": "var_type == \"angle\" / \"color\" / \"angle+color\"", "line_end": 467, "line_start": 280, "recommended_fix": "Define a central Enum for variation types and use it in both the LLM response schema and the service routing logic.", "severity": "P2", "why_problematic": "The service routes image editing logic (i2i) based on exact string matches of 'var_type' produced by LLMs (VariationRecommender). These strings are not enforced by a shared Enum, making the pipeline brittle to minor changes in LLM output formatting or casing (e.g., 'Angle' vs 'angle')."}], "path": "backend/app/services/scene_variation_service.py", "scan_kind": "python", "sha256": "f4b1b2cf9b8c20659fbf47b577739901ff318e0dd6f28a546429a564772354d9"}
{"candidate_reason": "python scope discovery", "chunk_end": 329, "chunk_start": 1, "chunk_summary": "The script is a standalone experiment for generating specific floor plans and background images; it contains scenario-specific prompts and hardcoded IDs appropriate for an experiment but lacks brittle string-based routing or semantic classifiers.", "duration_ms": 16293, "findings": [], "path": "backend/scripts/experiment_chain_bg_floorplan_v2.py", "scan_kind": "python", "sha256": "f9efd06f2f67ad427d826f22e51c52ba9755a92db1e12685852c6a8ba068dedb"}
{"candidate_reason": "python scope discovery", "chunk_end": 113, "chunk_start": 1, "chunk_summary": "No actionable findings; the file is a standalone experiment script for a specific scenario (L05) and does not use brittle string patterns for routing or contain scenario pollution in general-purpose templates.", "duration_ms": 24261, "findings": [], "path": "backend/scripts/experiment_bg_angles.py", "scan_kind": "python", "sha256": "49fe1f07654271bafb116d0315832cb0d381da90c99a3d36827defec1b89e3f9"}
{"candidate_reason": "python scope discovery", "chunk_end": 167, "chunk_start": 1, "chunk_summary": "The script contains hardcoded scenario-specific props and layout assumptions in prompts, and manually synchronizes environment schema keys.", "duration_ms": 34189, "findings": [{"category": "scenario_dependent_prompt", "evidence": "opposite the entry, weak floor lamp, faint old television glow, dust motes, scuff marks, subtle wear", "line_end": 88, "line_start": 62, "recommended_fix": "Move specific prop and aesthetic details into the environment_canon or a separate style configuration. Remove spatial assumptions like 'opposite the entry' from the general direction descriptions.", "severity": "P2", "why_problematic": "The prompt contains concrete scenario-specific props (television, floor lamp) and layout assumptions (entry is opposite North) that bias the generation and may conflict with the provided environment canon or floor plan."}, {"category": "schema_or_enum_drift", "evidence": "for k in (\"stories\", \"primary_material\", ...), for k in (\"wall_finish\", \"floor_finish\", ...)", "line_end": 50, "line_start": 37, "recommended_fix": "Iterate over the dictionary keys dynamically or use a shared serialization utility that respects the canonical schema definition.", "severity": "P2", "why_problematic": "The function manually enumerates keys from the environment_canon schema to build a prompt string. This creates a maintenance burden and risk of drift as the canonical schema evolves."}], "path": "backend/scripts/experiment_360_interior.py", "scan_kind": "python", "sha256": "73fa4adf88bb3207f3e43d30885de503180089d563cb4ba3b8b43248770e1382"}
{"candidate_reason": "python scope discovery", "chunk_end": 257, "chunk_start": 1, "chunk_summary": "No actionable findings; the file is a scenario-specific experiment script that uses hardcoded prompts and paths for a single test case without implementing brittle string-based logic or generic prompt pollution.", "duration_ms": 20776, "findings": [], "path": "backend/scripts/experiment_chain_bg_with_floorplan.py", "scan_kind": "python", "sha256": "913e13f38e54ec971501c6a3161ad4df1e55970d63df39d4aaf271830aedea49"}
{"candidate_reason": "python scope discovery", "chunk_end": 373, "chunk_start": 1, "chunk_summary": "The script contains prompts and reference labels with hardcoded scenario-specific details, including character names, relationships, and specific prop descriptions.", "duration_ms": 49078, "findings": [{"category": "scenario_dependent_prompt", "evidence": "MAIN BEDROOM (안방 — mother's room), DAUGHTER'S BEDROOM (수리영 방), character C04 identity, object P01 (small bloodstained photograph)", "line_end": 337, "line_start": 54, "recommended_fix": "Replace hardcoded names, IDs, and prop descriptions with generic placeholders (e.g., 'Character A', 'Object 1') and inject specific details dynamically from a structured data source.", "severity": "P2", "why_problematic": "The prompts and reference labels contain concrete scenario-specific names, family relationships, project-specific IDs, and descriptive prop details. This biases the LLM towards a specific story and couples the generation logic to the plot, making the prompts non-reusable and prone to drift."}], "path": "backend/scripts/experiment_chain_bg_floorplan_v3_tworoom.py", "scan_kind": "python", "sha256": "42a42787d1aee150c674d15e606ed4731dcd10a0dc8205483020a81196b41c1a"}
{"candidate_reason": "python scope discovery", "chunk_end": 441, "chunk_start": 1, "chunk_summary": "The file defines an LLM-based image chain planning script that uses Gemini Pro Vision to structure shots into a tree for visual continuity. While the code logic is clean of string-pattern debt, the system prompt contains scenario-specific examples.", "duration_ms": 30415, "findings": [{"category": "scenario_dependent_prompt", "evidence": "rooftop terrace overlook, rooftop terrace exterior", "line_end": 73, "line_start": 68, "recommended_fix": "Replace scenario-specific examples with generic placeholders or abstract descriptions, such as 'Location A', 'Exterior Area', or 'Sub-room B'.", "severity": "P2", "why_problematic": "The system prompt contains concrete scenario-specific location examples ('rooftop terrace') within general heuristics and rules. This can bias the LLM's spatial reasoning or grouping logic when applied to different story environments (e.g., a forest or a spaceship) instead of remaining scenario-agnostic."}], "path": "backend/scripts/experiment_chain_structure_planning.py", "scan_kind": "python", "sha256": "da1c366554fcad7497a7efc61e84642a7401440e0f93885db20a65f5ae2ae82e"}
{"candidate_reason": "python scope discovery", "chunk_end": 637, "chunk_start": 1, "chunk_summary": "The script uses hardcoded Korean and English keywords to filter scenario scenes and contains scenario-specific examples in the system prompt for background planning.", "duration_ms": 24454, "findings": [{"category": "semantic_string_judgment", "evidence": "extra_keywords = [\"옥탑\", \"옥상\", \"rooftop\"] ... any(kw in h or kw in txt for kw in extra_keywords)", "line_end": 244, "line_start": 189, "recommended_fix": "Pass the required scene indices or location IDs explicitly via the API or configuration rather than inferring them from scenario prose using keywords.", "severity": "P1", "why_problematic": "The script performs a fallback scene discovery by searching for specific Korean and English substrings within natural-language scenario headings and text. This hardcodes the 'rooftop' scenario into the logic, making the tool brittle and scenario-dependent for routing decisions."}, {"category": "llm_closed_list_instruction", "evidence": "different room state (clean / lived-in / disturbed / heavily-ransacked) ... different lighting setup (window light only / television glow only / dawn spill / etc.)", "line_end": 47, "line_start": 43, "recommended_fix": "Rephrase as abstract criteria (e.g., 'significant changes in lighting or physical arrangement') and provide the specific states as non-exhaustive examples if necessary.", "severity": "P2", "why_problematic": "The prompt provides a closed list of semantic states and lighting conditions as the primary criteria for node splitting. This biases the LLM toward these specific categories rather than allowing it to describe the open-world state of the scene."}, {"category": "scenario_dependent_prompt", "evidence": "id: unique snake_case id (e.g., \"interior_living_kitchen_day_normal\", \"interior_living_kitchen_dusk_ransacked\", \"small_bedroom_inside_night\", \"rooftop_terrace_night\", \"courtyard_stairs_approach\")", "line_end": 90, "line_start": 90, "recommended_fix": "Use abstract placeholders for examples, such as 'location_a_day_normal' or 'sub_region_b_night'.", "severity": "P2", "why_problematic": "The system prompt contains concrete scenario-specific location and state names (rooftop, living kitchen, ransacked) as ID examples. This pollutes the prompt with 'rooftop' project context, which can bias the LLM's naming and classification in other scenarios."}], "path": "backend/scripts/experiment_chain_structure_planning_gpt.py", "scan_kind": "python", "sha256": "cb849b35582d1846db72e923420761502445698e021884938156497cad179286"}
{"candidate_reason": "python scope discovery", "chunk_end": 531, "chunk_start": 1, "chunk_summary": "The file contains a scope detection mechanism that falls back to keyword matching over natural-language scene text to determine which parts of a scenario are in scope for image generation.", "duration_ms": 18335, "findings": [{"category": "semantic_string_judgment", "evidence": "extra_keywords = [\"옥탑\", \"옥상\", \"rooftop\"] ... if any(kw in h or kw in txt for kw in extra_keywords): scenes_in_scope.add(...)", "line_end": 119, "line_start": 81, "recommended_fix": "Remove the keyword-based fallback. Scope should be explicitly defined in the input 'context.json' or 'step2_plan_specs.json' using structured identifiers rather than inferred from prose.", "severity": "P1", "why_problematic": "The script determines the operational scope (which scenes/shots to process) by searching for specific natural-language keywords within scene headings and text. This is a brittle pattern-based approach to inferring scenario meaning and routing."}], "path": "backend/scripts/experiment_chain_structure_render_gpt.py", "scan_kind": "python", "sha256": "5b08d181695247f9dd1311df61e62d9edc11e0a67a39ea8ea7cd91e6d19fd1fd"}
{"candidate_reason": "python scope discovery", "chunk_end": 262, "chunk_start": 1, "chunk_summary": "The script contains a system prompt with hardcoded scenario-specific details and layout rules for a specific story, which limits its generalizability.", "duration_ms": 23362, "findings": [{"category": "scenario_dependent_prompt", "evidence": "SYSTEM_PROMPT and build_user_message containing '옥탑방', '민숙 방', '수리영 방', '커튼 알코브', and specific prop lists like '찻잔 2개', '백팩+인형'.", "line_end": 165, "line_start": 114, "recommended_fix": "Move scenario-specific details into the input context (ctx) and use generic placeholders or instructions in the system prompt to handle the provided context dynamically.", "severity": "P2", "why_problematic": "The prompt hardcodes specific character names, room functions, and prop lists into the system instructions. This is concrete scenario pollution that biases the LLM and makes the prompt non-reusable for other floor plan generation tasks. It also functions as a closed-list classifier for props and labels (e.g., 'Minsook Room')."}], "path": "backend/scripts/experiment_floor_plan_compare.py", "scan_kind": "python", "sha256": "783b4c7cab5fe95ce342b5971bc1a168463c1b77cbd07c61ef619777d9290fb9"}
{"candidate_reason": "python scope discovery", "chunk_end": 362, "chunk_start": 1, "chunk_summary": "The script manages an image-generation chain by building prompts and routing reference images, but it contains scenario-specific prompt pollution and brittle substring matching for floor plan resolution.", "duration_ms": 44789, "findings": [{"category": "scenario_dependent_prompt", "evidence": "NO people, NO blood, NO broken glass, NO action. Reflect atmosphere only via worn surfaces, dust, dim light, etc. ... open the prompt with an atmospheric anchor like 'Same room/space as the previous reference image...'", "line_end": 58, "line_start": 57, "recommended_fix": "Move scenario-specific constraints and aesthetic preferences to a configuration file or dynamic prompt segment. Use structured instructions for consistency anchors rather than hard-coding exact phrases in the system prompt.", "severity": "P2", "why_problematic": "The system prompt hard-codes specific negative constraints (props/action) and aesthetic choices (worn surfaces, dust) that are scenario-specific. It also mandates a specific natural-language preamble to achieve visual consistency, which is a brittle way to handle cross-node semantics."}, {"category": "semantic_string_judgment", "evidence": "if bp[\"id\"] in gn or gn in bp[\"id\"]:", "line_end": 128, "line_start": 128, "recommended_fix": "Replace the substring heuristic with an explicit 'base_plan_id' field in the group or node schema to ensure deterministic routing of reference images.", "severity": "P1", "why_problematic": "The code uses a brittle substring match between a natural-language group name (gn) and a technical plan ID (bp['id']) to resolve which floor plan should be used as a reference image. This heuristic can easily fail or misroute if names are ambiguous or slightly different."}], "path": "backend/scripts/experiment_chain_structure_render.py", "scan_kind": "python", "sha256": "18bc16c35b45c068ce7b95afa906d933081f3d4c7748353cb34ba5f01d19590f"}
{"candidate_reason": "python scope discovery", "chunk_end": 1511, "chunk_start": 1, "chunk_summary": "The file coordinates scene generation, including prompt assembly, reference attachment, and variation generation, but contains a brittle substring check for camera directives.", "duration_ms": 135104, "findings": [{"category": "blind_string_mutation", "evidence": "if shot_name and shot_name.lower() not in var_t2i.lower(): var_t2i = f\"[Camera: {shot_name}] {var_t2i}\"", "line_end": 719, "line_start": 718, "recommended_fix": "Pass camera directives as a separate structured field to the T2I generator or use a dedicated prompt assembly helper that handles deduplication semantically.", "severity": "P1", "why_problematic": "This uses a brittle case-insensitive substring check over natural-language prompt text to decide whether to prepend a camera directive. Variations in phrasing or punctuation in the generated prompt can cause redundant or missing directives."}], "path": "backend/app/services/scene_generation_coordinator.py", "scan_kind": "python", "sha256": "258fea47b6c20d942e942bb8a6629f39495560b30f2655559c8b72a5818993fc"}
{"candidate_reason": "python scope discovery", "chunk_end": 663, "chunk_start": 1, "chunk_summary": "The script implements a multi-step floor plan generation pipeline using LLMs, featuring prompts that enforce scenario-agnostic naming and include a semantic mapping for safety/moderation avoidance.", "duration_ms": 27703, "findings": [{"category": "llm_closed_list_instruction", "evidence": "avoid: dead, corpse, deceased, victim, body / use: \"motionless seated figure marker\"", "line_end": 197, "line_start": 186, "recommended_fix": "Replace the keyword-based 'avoid/use' list with a high-level instruction to describe physical states using neutral architectural or diagrammatic terminology, or move the mapping to a structured post-processing step if specific symbols are required.", "severity": "P1", "why_problematic": "The prompt uses a closed list of keywords to classify open-world story events (death, injury, violence) and map them to specific visual symbols. This is a brittle semantic classifier that biases the LLM's interpretation of the scene based on keyword presence rather than holistic meaning."}, {"category": "llm_closed_list_instruction", "evidence": "id (snake_case): **일반 명사 기반만**. 인명·도시명·지역명·국가명·작품명 어떤 고유명사도 포함 금지.", "line_end": 113, "line_start": 107, "recommended_fix": "Instead of asking the LLM to filter proper nouns, provide a structured list of allowed categories or use a deterministic ID system that doesn't rely on the LLM's linguistic classification of scenario entities.", "severity": "P2", "why_problematic": "Instructs the LLM to perform semantic classification (identifying proper nouns vs common nouns) on open-world scenario text to enforce a naming convention. This is a semantic judgment task that can lead to inconsistent IDs or loss of context if the LLM misclassifies a word."}], "path": "backend/scripts/experiment_floor_plan_v3.py", "scan_kind": "python", "sha256": "0d437a91bf2b0771c98a6284465ca2ade8de31cec7642547b338eafcaa34baac"}
{"candidate_reason": "python scope discovery", "chunk_end": 352, "chunk_start": 1, "chunk_summary": "The system prompt for floor plan generation contains significant scenario-specific pollution, including character names, room types, and plot-specific scene descriptions.", "duration_ms": 46613, "findings": [{"category": "scenario_dependent_prompt", "evidence": "Suriyoung · 수리영, 민숙 방, S12 (엄마 시신 발견), S14 (시신 사라진 상태)", "line_end": 204, "line_start": 170, "recommended_fix": "Replace specific names and plot points with generic placeholders (e.g., <character_name>, <room_name>) and move scene-specific prioritization logic to the user prompt or dynamic context.", "severity": "P1", "why_problematic": "The system prompt is hard-wired with specific character names, room names, and plot points (e.g., 'mom's body discovery'). This biases the LLM's spatial reasoning and prevents the prompt from being reused for other scenarios or stories. It also instructs the LLM to prioritize specific scenes based on their narrative content, which functions as a closed-list semantic classifier embedded in the prompt."}], "path": "backend/scripts/experiment_floor_plan.py", "scan_kind": "python", "sha256": "dc8f469fa610967f3a2c40209052afc37b5435890fc8a887831572101c2054ed"}
{"candidate_reason": "python scope discovery", "chunk_end": 291, "chunk_start": 1, "chunk_summary": "The file implements an experimental pipeline for extracting locations and props from screenplays using LLM chaining, but it relies on brittle exact string matching for entity deduplication and contains scenario-specific prompt pollution.", "duration_ms": 114692, "findings": [{"category": "semantic_string_judgment", "evidence": "if name in existing_names: ... existing[\"shot_count\"] += new_sc", "line_end": 235, "line_start": 229, "recommended_fix": "Use a semantic similarity check or a normalization step (e.g., LLM-based reconciliation or fuzzy matching) before aggregating counts, or rely on a stable unique identifier if available.", "severity": "P1", "why_problematic": "The code uses exact string matching to determine if an LLM-generated entity name (location or prop) matches a previously extracted one for the purpose of aggregating shot counts. This is brittle because LLMs often produce slight variations for the same semantic entity (e.g., 'Living Room' vs 'The Living Room'), leading to fragmented data and incorrect counts."}, {"category": "scenario_dependent_prompt", "evidence": "(아머+헬멧→아머), UI 화면", "line_end": 57, "line_start": 54, "recommended_fix": "Replace concrete examples with abstract categories or provide a broader, more diverse set of examples that cover multiple genres.", "severity": "P2", "why_problematic": "The prop extraction prompt contains concrete, genre-specific examples like 'Armor+Helmet' and 'UI Screen'. These examples can bias the LLM's extraction logic toward specific genres (fantasy/sci-fi) or cause it to incorrectly exclude valid props in other contexts (e.g., a modern office drama where a UI screen might be a key prop)."}], "path": "backend/experiments/entity_loc_prop_shots.py", "scan_kind": "python", "sha256": "511b0d53a6b0b1e26889771be6e99823762f4cef29c1e7c7b543564a4578c00e"}
{"candidate_reason": "python scope discovery", "chunk_end": 184, "chunk_start": 1, "chunk_summary": "The script contains experimental prompts with hardcoded scenario-specific details and semantic instructions for reference image interpretation, violating the script's own stated goal of avoiding hardcoded scenario words.", "duration_ms": 27069, "findings": [{"category": "scenario_dependent_prompt", "evidence": "PROMPT_F and PROMPT_E (e.g., '옥탑방', 'Seoul, Korea', 'vinyl-finish wallpaper', '2010s to early 2020s')", "line_end": 105, "line_start": 76, "recommended_fix": "Parameterize these details or derive them from a structured world-rule configuration to ensure the prompt remains scenario-agnostic.", "severity": "P2", "why_problematic": "These prompts contain concrete scenario-specific locations, cultural tropes, and era-specific props. While used for experimentation, they represent scenario pollution that biases the model and contradicts the instruction on line 10 to avoid hardcoded scenario-dependent words."}, {"category": "llm_closed_list_instruction", "evidence": "PROMPT_A, PROMPT_B, PROMPT_D (e.g., 'reference floor plan', 'Strictly NOT a top-down view', 'use it ONLY to understand')", "line_end": 72, "line_start": 46, "recommended_fix": "Move reference interpretation logic into a structured metadata field that the system prompt uses to generate appropriate instructions based on the reference type.", "severity": "P2", "why_problematic": "The prompts define semantic rules for how the LLM should interpret a specific category of reference ('floor plan') and how to map it to the output (eye-level vs top-down). This is prompt-side semantic routing based on the 'floor plan' keyword."}], "path": "backend/scripts/experiment_fp_ref_bias.py", "scan_kind": "python", "sha256": "ef1a8d991f59165f43159424370fc143bd21d738c8f6509ed4f12f37012f7d3a"}
{"candidate_reason": "python scope discovery", "chunk_end": 1985, "chunk_start": 1, "chunk_summary": "The file implements a multi-step floor plan and photo generation pipeline with significant debt in semantic string sanitization, prompt-side phrase classifiers, and schema-to-prompt enum drift.", "duration_ms": 33560, "findings": [{"category": "semantic_string_judgment", "evidence": "call_llm_json_sanitized, grep_unsafe, grep_scenario, UNSAFE_WORDS_PLAN", "line_end": 1071, "line_start": 1035, "recommended_fix": "Move safety and scenario-compliance checks to a dedicated LLM-based validator or use structured metadata tags instead of scanning prose for forbidden substrings.", "severity": "P1", "why_problematic": "The pipeline uses brittle substring matching (grep_unsafe/grep_scenario) over generated natural-language JSON fields (like t2i_prompt) to detect 'unsafe' or 'scenario-specific' words. Matches trigger a re-generation loop, making the system's success and behavior dependent on keyword lists rather than structured semantic validation."}, {"category": "llm_closed_list_instruction", "evidence": "_SAFETY_NOTE_PLAN, _SAFETY_NOTE_PHOTO, avoid: dead, corpse, deceased, victim, body", "line_end": 495, "line_start": 480, "recommended_fix": "Define these semantic transformations as a structured style guide or use a post-processing step that operates on structured entity states rather than asking the LLM to perform phrase-level substitution.", "severity": "P1", "why_problematic": "The system prompts instruct the LLM to act as a semantic classifier and rewriter by providing a closed list of forbidden phrases and their 'safe' equivalents (e.g., replacing 'dead' with 'motionless seated figure marker'). This creates a maintenance burden where semantic rules are hardcoded in prompt prose."}, {"category": "scenario_dependent_prompt", "evidence": "\"doll\" + \"backpack\" + \"dim bedroom\" + \"stain/footprint\"", "line_end": 493, "line_start": 491, "recommended_fix": "Abstract these examples into general categories (e.g., 'vulnerable objects in dark settings') or move them to a scenario-specific configuration file.", "severity": "P2", "why_problematic": "The safety instructions contain concrete scenario-specific props and locations as negative examples to avoid moderation triggers. This biases the model against specific visual tropes and pollutes the general-purpose prompt with arbitrary scenario details."}, {"category": "schema_or_enum_drift", "evidence": "SCHEMA_STEP1, SCHEMA_STEP2, visual_domain as string", "line_end": 378, "line_start": 207, "recommended_fix": "Update the JSON schemas to use 'enum' for these fields to ensure the LLM output is constrained to the values the code actually supports.", "severity": "P2", "why_problematic": "Multiple fields such as 'visual_domain', 'type', and 'reference_strategy' are defined as generic strings in the JSON schema, but the prompts and downstream code (e.g., lines 429, 455, 1204) expect and validate exact values like 'interior', 'exterior', or 'site_map'. This drift makes the schema an unreliable contract."}], "path": "backend/scripts/experiment_floor_plan_v4.py", "scan_kind": "python", "sha256": "b3c71ddd8b2b11039b2afb23f127342ad4f06d5d15b92f42568ebbca19b69eab"}
{"candidate_reason": "python scope discovery", "chunk_end": 406, "chunk_start": 1, "chunk_summary": "The script is a specialized experiment for generating architectural views using Gemini Pro Vision and Gemini Image Client, and it does not contain brittle string-based semantic judgments or scenario pollution.", "duration_ms": 20756, "findings": [], "path": "backend/scripts/experiment_gemini_redrawn_plan_45deg.py", "scan_kind": "python", "sha256": "49054091039d61ee29d2bef43d34df887dac42853e45ea03b64142fa2b115cc5"}
{"candidate_reason": "python scope discovery", "chunk_end": 268, "chunk_start": 1, "chunk_summary": "The script contains hardcoded scenario-specific prompts and reference labels for image generation experiments, which include concrete scenario pollution and negative constraints to bias model behavior.", "duration_ms": 120543, "findings": [{"category": "scenario_dependent_prompt", "evidence": "NEW_CHAIN_BG_PROMPT, PROMPT_A_ORIGINAL", "line_end": 98, "line_start": 55, "recommended_fix": "Externalize scenario-specific descriptions, entity IDs, and layout constraints into a structured configuration file or use a template system with abstract placeholders.", "severity": "P2", "why_problematic": "The prompts contain concrete scenario-specific details such as '옥탑방' (rooftop room), 'CRT television', and specific entity IDs like 'C04O06' and 'P06'. They also include negative constraints ('NOT a multi-room apartment') designed to override model biases for a specific shot, which biases arbitrary future scenarios if the script is reused as a template."}, {"category": "scenario_dependent_prompt", "evidence": "character C04 identity, object P06", "line_end": 222, "line_start": 221, "recommended_fix": "Use abstract labels like 'Character A' or '<entity_id>' in the prompt assembly and map them to specific IDs in the execution context.", "severity": "P2", "why_problematic": "The reference labels sent to the LLM contain project-specific entity IDs ('C04', 'P06') rather than abstract roles, creating scenario pollution in the prompt assembly."}], "path": "backend/scripts/experiment_chain_bg_floorplan_rebuild.py", "scan_kind": "python", "sha256": "86dd23714d3eb654d63a5eb58ae0f62df7e3a6350e6987284b6e35cc5f94f7e9"}
{"candidate_reason": "python scope discovery", "chunk_end": 184, "chunk_start": 1, "chunk_summary": "The script contains hardcoded scenario-specific details and fallback strings in image generation prompts, along with manual schema serialization that drifts from the canonical environment definition.", "duration_ms": 26171, "findings": [{"category": "scenario_dependent_prompt", "evidence": "soft natural daylight... weak floor lamp, faint television glow; aged residential interior, modest domestic clutter", "line_end": 101, "line_start": 72, "recommended_fix": "Remove specific prop mentions like 'television glow' and 'floor lamp' from the base prompt. Move the 'aged residential' fallback to a configuration file or make it a parameter, and use more generic lighting/style descriptions in the template.", "severity": "P2", "why_problematic": "The prompts contain concrete scenario-specific props (floor lamp, television) and style descriptions (aged residential) as either fixed instructions or fallback values. This biases the image generation towards a specific domestic setting even when the input plan might represent a different type of interior (e.g., office, warehouse, or modern laboratory)."}, {"category": "schema_or_enum_drift", "evidence": "compact_canon_text keys: stories, primary_material, exterior_stairs, rooftop_features, window_pattern, weathering, wall_finish, floor_finish, ceiling, lighting_fixtures, general_clutter_level", "line_end": 54, "line_start": 30, "recommended_fix": "Use a shared schema model (e.g., Pydantic) to handle serialization, or iterate over the dictionary keys dynamically while excluding known technical metadata.", "severity": "P2", "why_problematic": "The function manually lists and iterates over specific keys expected in the environment_canon dictionary. This creates a maintenance burden where changes to the canonical environment schema must be manually synchronized with this script's serialization logic, leading to silent data loss if the schema evolves."}], "path": "backend/scripts/experiment_panorama_and_quad.py", "scan_kind": "python", "sha256": "4ae34c7fda740e261ff15568919fafb1464c8a9c20a26e4b10c3f2a61ac619a3"}
{"candidate_reason": "python scope discovery", "chunk_end": 231, "chunk_start": 1, "chunk_summary": "The script contains hardcoded scenario-specific details in prompt templates and manually synchronized schema keys for environment attributes.", "duration_ms": 32768, "findings": [{"category": "scenario_dependent_prompt", "evidence": "'aged residential interior, modest domestic clutter'", "line_end": 135, "line_start": 93, "recommended_fix": "Replace hardcoded strings with a generic placeholder or require the canon input to be explicitly provided.", "severity": "P2", "why_problematic": "Hardcoded fallback scenario text biases the image generation toward a specific setting (aged residential) when no canon is provided, rather than using a neutral or template-based placeholder."}, {"category": "scenario_dependent_prompt", "evidence": "dim domestic practicals (weak floor lamp, faint old television glow)... lived-in details (dust motes, scuff marks, subtle wear)", "line_end": 129, "line_start": 127, "recommended_fix": "Move specific prop and wear details into the dynamic canon text or a separate style configuration rather than hardcoding them in the base prompt.", "severity": "P2", "why_problematic": "Concrete props (television, floor lamp) and specific 'lived-in' details are baked into the photorealistic style instruction, which will pollute generations for non-domestic or clean environments."}, {"category": "schema_or_enum_drift", "evidence": "('stories', 'primary_material', 'exterior_stairs', 'rooftop_features', 'window_pattern', 'weathering') ... ('wall_finish', 'floor_finish', 'ceiling', 'lighting_fixtures', 'general_clutter_level')", "line_end": 53, "line_start": 40, "recommended_fix": "Iterate over the dictionary keys dynamically or use a shared schema-aware utility to format the canon text.", "severity": "P2", "why_problematic": "The script manually lists keys to extract from the environment_canon object. This creates a maintenance burden and drift if the upstream spatial analysis schema (e.g., in step1_spatial.json) is updated or renamed."}], "path": "backend/scripts/experiment_line_elevation_quad.py", "scan_kind": "python", "sha256": "70e9f5dd34691a1cfebea1e80dcb5e3262ab5fde01725c0ae5a92abcfad27e97"}
{"candidate_reason": "python scope discovery", "chunk_end": 318, "chunk_start": 1, "chunk_summary": "The script is an experimental harness for generating architectural visualizations and does not contain brittle string-pattern logic or scenario-specific prompt pollution.", "duration_ms": 20282, "findings": [], "path": "backend/scripts/experiment_scene_aware_line_quad.py", "scan_kind": "python", "sha256": "0b9354c5df25efd3324236ffafbb19409ee5d2b1b700f1f6d09038d3f6bc68db"}
{"candidate_reason": "python scope discovery", "chunk_end": 289, "chunk_start": 1, "chunk_summary": "The SYSTEM_PROMPT contains brittle phrase-based safety rules and scenario-specific visual examples (doll, backpack, floor stains) used as semantic filters to avoid image moderation.", "duration_ms": 35293, "findings": [{"category": "llm_closed_list_instruction", "evidence": "Safety Vocabulary and Risk Combination Avoidance sections", "line_end": 73, "line_start": 59, "recommended_fix": "Use abstract safety guidelines or a separate moderation layer instead of embedding specific prop/angle combinations in the generation prompt.", "severity": "P1", "why_problematic": "The prompt defines a closed list of phrases and specific scenario-dependent combinations (e.g., 'doll' + 'backpack' + 'dim bedroom') as a semantic classifier to avoid moderation. This biases the LLM towards specific visual tropes and creates a brittle interface for describing environments based on hardcoded phrase patterns."}, {"category": "scenario_dependent_prompt", "evidence": "\"overturned chair\", \"weathered red mark on wall\", \"circular stain\", \"faded ring shape\", \"dark dried floor stain\"", "line_end": 65, "line_start": 62, "recommended_fix": "Use more abstract descriptions of 'disarray' or 'environmental marks' rather than specific prop names and shapes.", "severity": "P2", "why_problematic": "These are concrete scenario-specific props and visual descriptions provided as examples, which can bias the LLM's generation of arbitrary future scenarios towards these specific tropes rather than allowing for open-world description."}], "path": "backend/scripts/experiment_plan_to_photo.py", "scan_kind": "python", "sha256": "a387f64ec5a637a46f6ab0e3478744e2ec4a5f3e7405b0ecfea0db38f58e7526"}
{"candidate_reason": "python scope discovery", "chunk_end": 366, "chunk_start": 1, "chunk_summary": "The script orchestrates a multi-view architectural visualization pipeline using Gemini Pro and Nano, but contains scenario-specific prompt pollution and schema duplication.", "duration_ms": 59632, "findings": [{"category": "scenario_dependent_prompt", "evidence": "labeled NORTH, toward EAST wall, worn wallpaper, dust, scuff, no blood, no broken glass", "line_end": 81, "line_start": 60, "recommended_fix": "Parameterize style preferences and narrative constraints. Instruct the LLM to identify orientation labels from the provided legend/metadata rather than assuming specific strings like 'NORTH'.", "severity": "P2", "why_problematic": "The system prompt contains concrete scenario-specific style preferences (gritty textures), narrative-negative constraints (blood/glass), and brittle assumptions about input image labels (NORTH/EAST). These bias the LLM toward a specific project genre (thriller/noir) and make the prompt dependent on specific labeling conventions in the floor plan images."}, {"category": "schema_or_enum_drift", "evidence": "VIEW_KEYS vs RESPONSE_SCHEMA", "line_end": 128, "line_start": 47, "recommended_fix": "Define the view identifiers in a single source of truth and programmatically generate the RESPONSE_SCHEMA and VIEW_KEYS list from that source.", "severity": "P2", "why_problematic": "The view identifiers ('view_0_deg', 'view_45_deg', etc.) are duplicated across a constant list (VIEW_KEYS), the JSON schema property names, and the schema's 'required' list. This creates a manual synchronization burden and risk of drift if the number or naming of views changes."}], "path": "backend/scripts/experiment_gemini_45deg_chain.py", "scan_kind": "python", "sha256": "1b0bbb10904b3aa86124216f1d7e5c23fe6b67365098094589b56dd3ac9a1f4a"}
{"candidate_reason": "python scope discovery", "chunk_end": 328, "chunk_start": 1, "chunk_summary": "The file implements an experimental pipeline for generating a 4-view image chain using GPT-vision for planning and gpt-image-2 for generation, with some minor schema drift and scenario-specific prompt pollution.", "duration_ms": 62038, "findings": [{"category": "schema_or_enum_drift", "evidence": "uses_prev (lines 96, 98, 175) vs loop logic (lines 315-321)", "line_end": 321, "line_start": 96, "recommended_fix": "Either remove 'uses_prev' from the schema and prompt if the chain logic is fixed, or use the field's value in the loop to decide between 'gpt_image_generate' and 'gpt_image_edit_with_prev'.", "severity": "P2", "why_problematic": "The 'uses_prev' field is defined as a required boolean in the RESPONSE_SCHEMA and requested in the prompt, but the actual generation loop ignores this value and hardcodes the logic (first view is an anchor, subsequent views are edits). This creates a drift between the contract and the implementation."}, {"category": "scenario_dependent_prompt", "evidence": "'soft natural daylight' (line 58), 'no blood, no broken glass' (line 72)", "line_end": 72, "line_start": 58, "recommended_fix": "Move specific lighting and negative constraints to a scenario-specific configuration or use template variables that can be populated based on the input context.", "severity": "P2", "why_problematic": "The system prompt contains concrete lighting preferences and negative constraints that are specific to a certain genre or scenario (e.g., daytime architectural, thriller/crime). These hardcoded details can bias the LLM's output and may conflict with the instruction to 'reflect scene atmosphere' when processing arbitrary scenarios."}], "path": "backend/scripts/experiment_gpt_planned_4view_chain.py", "scan_kind": "python", "sha256": "376fcca421d658aa4aa6325bc3d58fd50110e988ee113e79110983f971c5f898"}
{"candidate_reason": "python scope discovery", "chunk_end": 288, "chunk_start": 1, "chunk_summary": "The script is a temporary experiment for rendering shots using background references, but it contains scenario-specific pollution in the T2I generation prompt.", "duration_ms": 143061, "findings": [{"category": "scenario_dependent_prompt", "evidence": "a Korean woman in her early 20s, slim, mid-length black hair, casual student look with a backpack; rooftop dwelling; rear courtyard; worn surface, dust, shadow", "line_end": 59, "line_start": 50, "recommended_fix": "Replace concrete examples with abstract placeholders (e.g., 'a person of specific age/look', 'a specific type of room') and move project-specific visual interpretations to a separate style configuration.", "severity": "P2", "why_problematic": "The prompt contains concrete scenario-specific examples (protagonist description and settings from 'The Road' project) and a specific visual interpretation of 'injury' (worn surface, dust, shadow). These bias the LLM's generation towards the current project's content and aesthetic, making the prompt less effective for arbitrary future scenarios."}], "path": "backend/scripts/experiment_chain_shot_render_temp.py", "scan_kind": "python", "sha256": "d3feaf4a136b36a1566e869d712f21a9d072dcbe619aeda373850e16e438344d"}
{"candidate_reason": "python scope discovery", "chunk_end": 386, "chunk_start": 1, "chunk_summary": "The script is a clean experimental prototype for set design orchestration using LLMs and T2I, following project conventions for technical identifiers and JSON parsing without brittle semantic string matching or scenario pollution.", "duration_ms": 27775, "findings": [], "path": "backend/scripts/experiment_set_design.py", "scan_kind": "python", "sha256": "877501bc4a08d7a43b8ad5870fe08d05822ebb377e3d8355b0f061125e9ea708"}
{"candidate_reason": "python scope discovery", "chunk_end": 299, "chunk_start": 1, "chunk_summary": "The script uses brittle regex patterns to mutate generated prompts and to infer character outfit states from prompt prose for reference image routing.", "duration_ms": 27671, "findings": [{"category": "blind_string_mutation", "evidence": "re.sub(r'NO people\\s*[—–- ]\\s*instead include.*?placement guides\\.?', '', prompt, flags=re.DOTALL)", "line_end": 40, "line_start": 40, "recommended_fix": "Instead of post-processing the prompt string with regex, use a structured flag in the composition data to control whether the silhouette instruction is included during the initial prompt construction.", "severity": "P1", "why_problematic": "This performs a blind replacement of a specific semantic instruction within a generated prompt. If the LLM's phrasing for silhouette instructions changes slightly (e.g., different wording or punctuation), the removal will fail, leading to conflicting instructions when 'Empty room only' is later appended."}, {"category": "semantic_string_judgment", "evidence": "pattern = rf'{short_id}(O\\d{{2,3}})' ... re.search(pattern, t2i_text)", "line_end": 116, "line_start": 115, "recommended_fix": "Store the active outfit ID as a structured field in the shot metadata and use that field for reference routing instead of parsing the generated prompt text.", "severity": "P1", "why_problematic": "The code infers the active outfit (visual state) by searching for ID patterns within the natural-language prose of a generated prompt. This result directly routes which reference images (composite vs. face) are attached to the generation request. It is brittle and depends on exact ID concatenation within the prose."}], "path": "backend/scripts/experiment_set_regen.py", "scan_kind": "python", "sha256": "62d04a171149fa0363086ebfadb8fcf8060443e9689b1e8162f08372b91e49e3"}
{"candidate_reason": "python scope discovery", "chunk_end": 293, "chunk_start": 1, "chunk_summary": "The script uses regex to parse generated prompt text for entity identifiers to determine reference image routing.", "duration_ms": 24819, "findings": [{"category": "semantic_string_judgment", "evidence": "pattern = rf'{short_id}(O\\d{{2,3}})' ... m = re.search(pattern, t2i_text)", "line_end": 97, "line_start": 96, "recommended_fix": "Pass the character-to-outfit mapping as structured metadata in the shot/scene data instead of extracting it from the prompt string via regex.", "severity": "P1", "why_problematic": "The code parses the generated T2I prompt (natural language/semantic text) using regex to identify which outfit (Oxx) is associated with a character (Cxx). This result is used to route reference image attachment (selecting a composite reference vs. an individual character reference)."}], "path": "backend/scripts/experiment_set_shots.py", "scan_kind": "python", "sha256": "c002953934ab147b0cff3c4b048f4aa98a28e481622369bbf470c24d80f32445"}
{"candidate_reason": "python scope discovery", "chunk_end": 571, "chunk_start": 1, "chunk_summary": "The script implements a set design and image generation pipeline that relies on regex-based entity detection in prompts, blind string mutation for safety filtering, and scenario-specific prompt constraints.", "duration_ms": 24100, "findings": [{"category": "semantic_string_judgment", "evidence": "re.findall(r'C\\d{2,3}O\\d{2,3}', t2i_prompt) and re.search(rf'(?<![CO\\d]){sid}', t2i_text)", "line_end": 402, "line_start": 77, "recommended_fix": "Pass entity membership as a structured list alongside the prompt rather than parsing it back out of the generated text.", "severity": "P1", "why_problematic": "The code infers the presence of characters and props in a shot by searching for their short IDs within natural-language prompt text. This result directly controls which reference images are attached to the generation request, making the visual output dependent on the LLM's ability to perfectly preserve ID strings in prose."}, {"category": "blind_string_mutation", "evidence": "re.sub(r'blood-soaked torn shoulder and collarbone of the slumped corpse', 'a motionless figure slumped behind the curtain', text)", "line_end": 442, "line_start": 431, "recommended_fix": "Use a more abstract safety-rewriting prompt or handle safety constraints at the initial prompt generation stage rather than using regex post-processing.", "severity": "P1", "why_problematic": "The sanitize_gore function performs hard-coded, scenario-specific string replacements on generated prompt text. Replacing specific anatomical descriptions with unrelated spatial descriptions (e.g., 'behind the curtain') is brittle and will cause visual hallucinations if the original scene context differs."}, {"category": "scenario_dependent_prompt", "evidence": "NEVER include skin tone/face color modifiers (pale, drained, flushed, ashen, gray face, etc.)", "line_end": 179, "line_start": 177, "recommended_fix": "Move safety-related style constraints to a separate style-guide configuration or a dedicated safety-filtering step.", "severity": "P2", "why_problematic": "The system prompt contains a concrete list of scenario-specific tropes and forbidden phrases. This biases the LLM's creative output for all future scenarios based on a specific set of safety-related keywords and preferred 'softened' replacements."}, {"category": "scenario_dependent_code", "evidence": "PROJECT_ID = \"b789d6ce-f474-4f49-9388-b03c9d95020e\"", "line_end": 32, "line_start": 31, "recommended_fix": "Accept project and episode IDs as command-line arguments or environment variables.", "severity": "P2", "why_problematic": "The script contains hardcoded project and episode UUIDs, making it a one-off script tied to a specific scenario rather than a reusable pipeline component."}], "path": "backend/scripts/experiment_set_v4.py", "scan_kind": "python", "sha256": "4db56357b919b516cbf93e484f565a5d4a5e318f73c567ca808218a0c1056e27"}
{"candidate_reason": "python scope discovery", "chunk_end": 38, "chunk_start": 1, "chunk_summary": "No actionable findings; the script contains scenario-specific prompts for a specific experiment (S12), which is appropriate for a dedicated script and does not constitute reusable prompt pollution or semantic string judgment.", "duration_ms": 16053, "findings": [], "path": "backend/scripts/generate_line_art_s12.py", "scan_kind": "python", "sha256": "8062f06362cf85fad5fcea62747e57ea49338c8bfd93422e9c60d7f144f49273"}
{"candidate_reason": "python scope discovery", "chunk_end": 585, "chunk_start": 1, "chunk_summary": "The script contains brittle regex patterns for entity detection in generated prompts, blind string mutation for safety filtering, and hardcoded scenario-specific identifiers.", "duration_ms": 32315, "findings": [{"category": "semantic_string_judgment", "evidence": "re.search(rf'(?<![CO\\d]){sid}', t2i_text), re.search(rf'{sid}(O\\d{{2,3}})', t2i_text)", "line_end": 412, "line_start": 401, "recommended_fix": "Pass structured entity visibility data alongside the prompt instead of parsing the prompt text to recover entity presence.", "severity": "P1", "why_problematic": "The code uses regex to detect entity IDs (characters, props, outfits) within natural-language generated prompt text to decide whether to attach reference images. This is brittle as it depends on the LLM including exact technical IDs in the prose to drive reference attachment behavior."}, {"category": "blind_string_mutation", "evidence": "re.sub(r'blood-soaked|corpse|dead body|dead woman|exposed flesh|torn shoulder', '', text, flags=re.IGNORECASE)", "line_end": 444, "line_start": 440, "recommended_fix": "Use a dedicated LLM-based safety/style refiner or structured prompt parameters rather than regex-based sanitization.", "severity": "P1", "why_problematic": "The function performs blind substring replacement on generated T2I prompts using a hardcoded list of scenario-specific gore terms. This can lead to mangled prompts and relies on a brittle, non-exhaustive list of terms to enforce safety/style."}, {"category": "scenario_dependent_code", "evidence": "PROJECT_ID = \"b789d6ce-f474-4f49-9388-b03c9d95020e\", if \"L05\" not in ve: continue", "line_end": 73, "line_start": 30, "recommended_fix": "Parameterize project, episode, and location filters via environment variables or command-line arguments.", "severity": "P2", "why_problematic": "The script is hardcoded to a specific project, episode, and location ID ('L05'), making it unusable for other scenarios without manual code modification."}, {"category": "llm_closed_list_instruction", "evidence": "choose ONE background reference: - **\"background\"**: ... - **\"prev_shot\"**: ...", "line_end": 313, "line_start": 297, "recommended_fix": "Use a structured comparison step that outputs a confidence score or use a more robust similarity metric for background continuity.", "severity": "P2", "why_problematic": "The prompt instructs the LLM to act as a semantic classifier for shot routing (deciding between a new background or a previous shot reference) using a closed list of strings, which is then consumed by exact string comparison in code."}], "path": "backend/scripts/experiment_set_v9.py", "scan_kind": "python", "sha256": "c8456f7443136c26329f4d09d9921fd1e981ec4bd83965fc452190621e290cca"}
{"candidate_reason": "python scope discovery", "chunk_end": 527, "chunk_start": 1, "chunk_summary": "The script contains several instances of semantic string judgment for routing, blind mutation of generated prompts, and scenario-specific pollution in LLM instructions.", "duration_ms": 35342, "findings": [{"category": "semantic_string_judgment", "evidence": "is_indoor = any(kw in desc for kw in [\"내부\", \"실내\", \"방\", \"사무실\", \"조타실\"])", "line_end": 98, "line_start": 98, "recommended_fix": "Use a structured metadata field for location type (e.g., an enum) or have the LLM classify the location type during an earlier analysis phase.", "severity": "P1", "why_problematic": "Uses a hardcoded list of Korean keywords to classify a location's physical nature (indoor/outdoor) from a natural-language description, which then routes the entire prompt generation logic."}, {"category": "semantic_string_judgment", "evidence": "re.findall(r'C\\d{2,3}O\\d{2,3}', t2i_prompt) and re.search(rf'{sid}(O\\d{{2,3}})', t2i_text)", "line_end": 358, "line_start": 75, "recommended_fix": "Pass character and outlook IDs as structured metadata alongside the prompt instead of parsing them from the generated text.", "severity": "P1", "why_problematic": "Extracts character/outlook IDs by searching for patterns inside natural-language prompt text. This is used to route reference image attachment, making the system dependent on the LLM maintaining specific ID syntax within prose."}, {"category": "blind_string_mutation", "evidence": "re.sub(r'blood-soaked torn shoulder and collarbone of the slumped corpse', 'a motionless figure slumped behind the curtain', text)", "line_end": 394, "line_start": 386, "recommended_fix": "Move sanitization logic into the LLM system prompt or use a more general safety filter rather than hardcoded scenario-specific string replacements.", "severity": "P1", "why_problematic": "Performs blind semantic replacement of specific story-driven phrases in generated prompts. This is brittle, scenario-dependent, and bypasses the LLM's role in content safety/refinement."}, {"category": "scenario_dependent_prompt", "evidence": "TOP-LEFT (SET_TL): Kitchen/sink wall ... BOTTOM-RIGHT (SET_BR): Bedroom area", "line_end": 192, "line_start": 189, "recommended_fix": "Parameterize the quadrant definitions or allow the LLM to define the quadrants based on the location description.", "severity": "P2", "why_problematic": "The prompt hardcodes specific room quadrants (Kitchen, Bedroom, etc.) for a specific location (L05), which biases the LLM and prevents the script from being used for arbitrary locations."}, {"category": "llm_closed_list_instruction", "evidence": "NEVER include skin tone/face color modifiers (pale, drained, flushed, ashen, gray).", "line_end": 177, "line_start": 175, "recommended_fix": "Use a more abstract instruction for style consistency or handle color normalization in a dedicated post-processing step.", "severity": "P2", "why_problematic": "Instructs the LLM to act as a semantic classifier/filter using a closed list of specific visual attributes. This creates drift between the prompt's exclusion list and the actual visual requirements of the scene."}], "path": "backend/scripts/experiment_set_v5.py", "scan_kind": "python", "sha256": "f4c4b53813996fe879802361e8a47f402af99b78e16344b029f1e64f6d796d28"}
{"candidate_reason": "python scope discovery", "chunk_end": 426, "chunk_start": 1, "chunk_summary": "The script uses brittle regex patterns to infer entity presence and outfit selection from natural language prompts and contains hardcoded scenario-specific string replacements for content sanitization.", "duration_ms": 35206, "findings": [{"category": "blind_string_mutation", "evidence": "re.sub(r'blood-soaked torn shoulder and collarbone of the slumped corpse', ...)", "line_end": 258, "line_start": 249, "recommended_fix": "Replace hardcoded regex substitutions with a structured LLM-based sanitization step or move safety constraints into the primary generation prompt.", "severity": "P1", "why_problematic": "The function performs blind string replacement of highly specific, scenario-dependent gore descriptions. This hardcodes story-specific details into the pipeline and risks corrupting the prompt if the LLM's phrasing varies slightly from the expected pattern."}, {"category": "semantic_string_judgment", "evidence": "re.search(rf'(?<![CO\\d]){sid}', t2i_text) and re.search(rf'{sid}(O\\d{{2,3}})', t2i_text)", "line_end": 177, "line_start": 169, "recommended_fix": "Require the LLM to output a structured list of active entities and their outfit IDs (e.g., in a JSON field) instead of parsing them from the prompt prose.", "severity": "P1", "why_problematic": "The script determines which reference images (character identity or specific outfits) to attach by searching for short ID patterns within the natural language prompt. This is brittle; if the LLM describes the scene without using the exact ID string, the system fails to attach the correct visual references."}, {"category": "scenario_dependent_code", "evidence": "if \"L05\" not in ve: continue", "line_end": 73, "line_start": 73, "recommended_fix": "Parameterize the target location ID or use a configuration file instead of hardcoding it in the data loading logic.", "severity": "P2", "why_problematic": "The script hardcodes a specific location ID ('L05') to filter scenes for processing. This makes the script scenario-dependent and limits its reusability across different projects or locations."}], "path": "backend/scripts/experiment_set_v8.py", "scan_kind": "python", "sha256": "7fa33e1c28ef1fc9b915410b3e22bf9bbac221507e00dbcea54dabff8ebb696e"}
{"candidate_reason": "python scope discovery", "chunk_end": 207, "chunk_start": 1, "chunk_summary": "No actionable findings; the script is a technical migration utility using machine identifiers and status constants for pipeline orchestration.", "duration_ms": 3200, "findings": [], "path": "backend/scripts/migrate_shot_validator.py", "scan_kind": "python", "sha256": "dc0983f8a48d6bb669deda5d334a2a9a21ba68b79298251ab489118cd65f7e2b"}
{"candidate_reason": "python scope discovery", "chunk_end": 281, "chunk_start": 1, "chunk_summary": "No actionable findings; the script is a technical migration utility using machine identifiers and status constants to manage pipeline execution via API.", "duration_ms": 5553, "findings": [], "path": "backend/scripts/migrate_v0513_reanalyze.py", "scan_kind": "python", "sha256": "04bd2083c9b57dc105508aa0599857da898aa6846d284620565db709d3c3bdbd"}
{"candidate_reason": "python scope discovery", "chunk_end": 495, "chunk_start": 1, "chunk_summary": "The script contains scenario-dependent fallback logic that hardcodes specific location IDs to visual nodes, which limits its use to a single project.", "duration_ms": 37304, "findings": [{"category": "scenario_dependent_code", "evidence": "LOCATION_FALLBACK = {\"L04\": \"...\", \"L05\": \"...\"} ... if loc_id in visible: node_id = fb_node", "line_end": 384, "line_start": 363, "recommended_fix": "Move scenario-specific fallbacks to a project-level configuration file or the database, or ensure the upstream planning process (chain v6) provides complete mappings for all shots.", "severity": "P1", "why_problematic": "The script hardcodes specific location IDs (L04, L05) and maps them to specific visual node identifiers to resolve background images when the primary mapping fails. This logic is specific to the 'Rooftop Room' scenario and will fail or produce incorrect results for other scenarios."}], "path": "backend/scripts/experiment_v4_main_shot_render_with_refs.py", "scan_kind": "python", "sha256": "030a57c3b0cbe264929f7f6f7b540bdfd584157d9b7e60b95026c5af06e82bfa"}
{"candidate_reason": "python scope discovery", "chunk_end": 160, "chunk_start": 1, "chunk_summary": "No actionable findings. The script is a diagnostic CLI utility for querying LLM observability logs and does not drive production pipeline logic or visual semantics.", "duration_ms": 5058, "findings": [], "path": "backend/scripts/opik_query.py", "scan_kind": "python", "sha256": "e836209c6c8b10cdb0b77e4594e60bde134501a504737282f02f186b9e618df2"}
{"candidate_reason": "python scope discovery", "chunk_end": 238, "chunk_start": 1, "chunk_summary": "The script is a visualization tool for generating a gallery HTML from run artifacts and does not perform semantic inference or mutation on scenario or prompt text.", "duration_ms": 10952, "findings": [], "path": "backend/scripts/regen_gallery_with_prompts.py", "scan_kind": "python", "sha256": "df12f751477caefc6a9aa0e2f8bcd4420e18191201da97edb2ec68b621eb1f34"}
{"candidate_reason": "python scope discovery", "chunk_end": 304, "chunk_start": 1, "chunk_summary": "This file is a standalone utility web server for managing a project improvement checklist and does not contain pipeline logic or scenario-processing code.", "duration_ms": 10064, "findings": [], "path": "docs/checklist-server.py", "scan_kind": "python", "sha256": "f2e11cc1473ff7b5ab8269466fae1247faac26f7ef256c2cddebdeb0d0d83bea"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 49, "chunk_start": 1, "chunk_summary": "No actionable findings; the file defines a standard JSON schema for structured background planning without scenario pollution or semantic string-pattern debt.", "duration_ms": 3445, "findings": [], "path": "prompts/_base/background_chain_planning/1.202604271600/schema.json", "scan_kind": "prompt", "sha256": "39807d088c0f02e0d2d16ed2ce207117ff07c954f01fe8c098548e44353d9f84"}
{"candidate_reason": "python scope discovery", "chunk_end": 263, "chunk_start": 1, "chunk_summary": "The script is a diagnostic utility for verifying scene_director results using LLMs; it does not contain actionable semantic string debt or scenario pollution.", "duration_ms": 14894, "findings": [], "path": "backend/scripts/verify_scene_director.py", "scan_kind": "python", "sha256": "e0d16e5f1fc1d1594537cc8f694a997182137d8684372417128c7cc0ec7aed30"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 21, "chunk_start": 1, "chunk_summary": "The prompt template is a clean structural definition for background chain planning and contains no actionable scenario pollution or brittle semantic classifiers.", "duration_ms": 6675, "findings": [], "path": "prompts/_base/background_chain_planning/1.202604271600/user_template.md", "scan_kind": "prompt", "sha256": "92cae51f7a0d2fab8eb355699863de2e6480e32ea8b9568780f62b4f033b0e63"}
{"candidate_reason": "python scope discovery", "chunk_end": 70, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 30591, "findings": [], "path": "backend/scripts/generate_line_art_s12_multiturn.py", "scan_kind": "python", "sha256": "828d41af425ce53df9fd46c1620e4088695c80a8811e2335b123175ee5b19778"}
{"candidate_reason": "python scope discovery", "chunk_end": 486, "chunk_start": 1, "chunk_summary": "The script uses regex to extract entity and outfit IDs from LLM-generated natural language prompts to determine reference image attachment, creating a brittle link between prose and visual identity.", "duration_ms": 77829, "findings": [{"category": "semantic_string_judgment", "evidence": "re.search(rf'(?<![CO\\d]){sid}', t2i_text), re.search(rf'{sid}(O\\d{{2,3}})', t2i_text), and re.search(rf'(?<![A-Z]){sid}(?!\\d)', t2i_text)", "line_end": 345, "line_start": 313, "recommended_fix": "Modify the Phase 1 LLM schema to return a structured list of entity IDs (e.g., 'active_entities': ['C01', 'P05']) alongside the character_prompt, and use that list for reference attachment instead of regex searching the prose.", "severity": "P1", "why_problematic": "The script attempts to detect entity presence by searching for short IDs (C##, P##) within LLM-generated natural language prompt text. This makes reference image attachment dependent on the LLM's ability to verbatim include technical IDs in its prose output, which is brittle and prone to failure if the LLM rephrases or omits the IDs."}], "path": "backend/scripts/experiment_set_v3.py", "scan_kind": "python", "sha256": "f05ee05509ea4eb80f20d1f67ad2029465a21ec9593c7d564d0473c5570618ad"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 57, "chunk_start": 1, "chunk_summary": "The schema defines a boolean flag 'skip_chain' that uses a semantic phrase list to instruct the LLM on how to classify locations, which significantly alters the rendering pipeline's behavior.", "duration_ms": 19125, "findings": [{"category": "llm_closed_list_instruction", "evidence": "(street, road, coast, sea, forest, yard, park, exterior rooftop, public square, beach, dock, vehicle exterior, etc.)", "line_end": 7, "line_start": 7, "recommended_fix": "Introduce a formal 'environment_type' enum in the schema and move the skip logic to the application code based on that enum value, rather than relying on a descriptive list of examples to set a boolean.", "severity": "P1", "why_problematic": "The prompt defines a semantic classifier for 'OUTDOOR/OPEN-AIR' using a list of specific scenario types. This classification directly controls the 'skip_chain' boolean flag, which changes the rendering pipeline's routing logic (skipping chain planning). This creates a brittle dependency on the LLM's interpretation of these specific examples to drive core architectural behavior."}], "path": "prompts/_base/background_chain_planning/2.202604272110/schema.json", "scan_kind": "prompt", "sha256": "d0bf9f8dfd54f532aecbf6a5f81e530510d339059878e7f057c80afc06628352"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 30, "chunk_start": 1, "chunk_summary": "The prompt defines a semantic classification rule (outdoor vs. indoor) to route the background chain generation logic, which is a form of closed-list semantic judgment.", "duration_ms": 13696, "findings": [{"category": "llm_closed_list_instruction", "evidence": "If SKIP applies (outdoor / open-air) ... Otherwise (indoor / enclosed / fixed-set)", "line_end": 20, "line_start": 16, "recommended_fix": "Define the skip/render requirement as a structured boolean or enum in the location metadata schema rather than asking the LLM to infer it from the description during the planning phase.", "severity": "P1", "why_problematic": "The prompt instructs the LLM to perform a semantic classification based on a closed list of natural-language categories to decide whether to skip or execute background chain planning. This routes major pipeline behavior (skip_chain: true/false) based on the LLM's interpretation of open-world location descriptions against these specific phrases."}], "path": "prompts/_base/background_chain_planning/2.202604272110/user_template.md", "scan_kind": "prompt", "sha256": "2f771dba85c03ee0942052832f240282e78c75afd0ef85dfb3ab89881f777da4"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 57, "chunk_start": 1, "chunk_summary": "The schema defines a boolean flag 'skip_chain' whose value is determined by an LLM-side semantic classification of the location using a provided list of example categories.", "duration_ms": 19269, "findings": [{"category": "llm_closed_list_instruction", "evidence": "OUTDOOR/OPEN-AIR (street, road, coast, sea, forest, yard, park, exterior rooftop, public square, beach, dock, vehicle exterior, etc.)", "line_end": 7, "line_start": 5, "recommended_fix": "Define a formal environment_type enum in the schema and move the skip_chain logic to the pipeline code based on that enum.", "severity": "P2", "why_problematic": "The prompt instructs the LLM to perform a semantic classification of the location based on a list of natural language examples to drive a boolean that changes the rendering pipeline's reference strategy."}], "path": "prompts/_base/background_chain_planning/3.202604290417/schema.json", "scan_kind": "prompt", "sha256": "d0bf9f8dfd54f532aecbf6a5f81e530510d339059878e7f057c80afc06628352"}
{"candidate_reason": "python scope discovery", "chunk_end": 348, "chunk_start": 1, "chunk_summary": "The script contains scenario-specific pollution in the system prompt and uses brittle name-based string matching to resolve entity identities for prompt construction.", "duration_ms": 150567, "findings": [{"category": "semantic_string_judgment", "evidence": "if info[\"name\"] == fe[\"character_name\"]:", "line_end": 120, "line_start": 120, "recommended_fix": "Use canonical short_ids or UUIDs to link entities across checkpoints instead of natural-language names.", "severity": "P1", "why_problematic": "This performs a brittle exact-string match between two natural-language name fields (likely generated by LLMs in previous steps) to resolve entity identity. The result determines whether an entity is included in the prompt context (visible_entity_ids), directly affecting the generated T2I prompt content."}, {"category": "scenario_dependent_prompt", "evidence": "혈흔/액체 패턴: red dots (#FF0000) ... 핵심 소품과 혈흔/환경 상태의 색상과 위치", "line_end": 160, "line_start": 152, "recommended_fix": "Remove scenario-specific props from the system prompt and pass them as dynamic context in the user prompt if applicable.", "severity": "P2", "why_problematic": "The system prompt contains concrete scenario-specific props ('blood/liquid patterns') hardcoded as a general rule. This biases the LLM to look for or invent these elements even in unrelated scenes, polluting the visual diagram generation."}, {"category": "llm_closed_list_instruction", "evidence": "인물 1 (주 인물): bright cyan lines (#00E5FF) ... 인물 2 (보조): bright magenta lines (#FF00FF)", "line_end": 151, "line_start": 148, "recommended_fix": "Assign colors based on stable identifiers (e.g., Character A, Character B) rather than inferred semantic roles like 'Main' or 'Secondary'.", "severity": "P2", "why_problematic": "This instructs the LLM to classify characters into a closed list of semantic roles (Main vs. Secondary) to satisfy a visual color-coding rule. This forces the LLM to make subjective open-world judgments about character importance."}], "path": "backend/scripts/experiment_line_art_composition.py", "scan_kind": "python", "sha256": "96512b16086c10b60dce6aca2174ccf012042deda281bf55895d5217490d75d8"}
{"candidate_reason": "python scope discovery", "chunk_end": 86, "chunk_start": 1, "chunk_summary": "The script contains scenario-specific prompts for a line art generation task, including a reference image label that contains concrete scenario props.", "duration_ms": 56082, "findings": [{"category": "scenario_dependent_prompt", "evidence": "labeled_refs = [(\"Previous shot 1 reference — preserve style, layout, curtain, bed, corpse:\", shot1_bytes)]", "line_end": 71, "line_start": 71, "recommended_fix": "Use a generic label like 'Previous shot reference' and move specific preservation instructions to the main prompt body.", "severity": "P2", "why_problematic": "The label for the reference image contains concrete scenario-specific props ('curtain, bed, corpse'). This hardcodes scenario details into a technical label field, which can bias the model or lead to drift if the script is used as a template for other scenes."}], "path": "backend/scripts/generate_line_art_s12_v2.py", "scan_kind": "python", "sha256": "6d312348e6f1a3a8c08a896c2aca40880fed900ae5c3937e74463e23addb010d"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 31, "chunk_start": 1, "chunk_summary": "The prompt template defines a semantic routing logic for background chain planning based on location type (outdoor vs. indoor) using placeholders and technical constraints without scenario-specific pollution or brittle string patterns.", "duration_ms": 13267, "findings": [], "path": "prompts/_base/background_chain_planning/3.202604290417/user_template.md", "scan_kind": "prompt", "sha256": "304dac14ef0a3261104a157cadae45f43795d187c7d3292ee6de1665b45bc763"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 8, "chunk_start": 1, "chunk_summary": "No actionable findings; the file is a standard structural JSON schema for a text-to-image prompt field.", "duration_ms": 2156, "findings": [], "path": "prompts/_base/background_chain_render/1.202604271700/schema.json", "scan_kind": "prompt", "sha256": "e3e7189629203831751b57b20e820f18eadcb50cdedfb06b1821d12d85ee563b"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 94, "chunk_start": 1, "chunk_summary": "The prompt uses closed-list semantic classifiers to drive pipeline routing and node membership, and defines an unenforced vocabulary for physical states.", "duration_ms": 36581, "findings": [{"category": "llm_closed_list_instruction", "evidence": "OUTDOOR / OPEN-AIR (street, road, alley, coast, sea, beach, dock, yard, garden, park, public square, forest, mountain, exterior rooftop view, vehicle exterior, open-air market, etc.)", "line_end": 19, "line_start": 11, "recommended_fix": "Define the criteria for skipping (e.g., 'unbounded parallax' or 'natural lighting variance') rather than providing a list of specific place types.", "severity": "P1", "why_problematic": "The prompt instructs the LLM to set a boolean routing flag (skip_chain) based on whether a location matches a specific list of place types. This is a brittle semantic classifier for pipeline control flow that may fail on unlisted or ambiguous location types."}, {"category": "llm_closed_list_instruction", "evidence": "Close-ups, prop inserts, hand-scale plates, 'background plate' shots, photograph inserts", "line_end": 87, "line_start": 29, "recommended_fix": "Provide a general rule for background reuse (e.g., 'if the background is a subset of a previously defined node') rather than a list of shot categories.", "severity": "P1", "why_problematic": "The prompt uses a specific list of shot types to decide node membership and background reuse. This is a semantic classifier for entity/node clustering that relies on the LLM matching these exact categories in the scenario text."}, {"category": "schema_or_enum_drift", "evidence": "clean / lived-in / disturbed / heavily-ransacked", "line_end": 88, "line_start": 31, "recommended_fix": "Define a formal state or condition enum in the schema rather than embedding it in the description prose.", "severity": "P2", "why_problematic": "The prompt repeatedly uses a specific vocabulary for physical states (day/night/dusk/dawn and clean/disturbed/ransacked) across multiple instructions. This creates an unenforced string contract that likely drifts from a central state enum and even drifts within the file (e.g., 'heavily-ransacked' vs 'ransacked')."}], "path": "prompts/_base/background_chain_planning/2.202604272110/system.md", "scan_kind": "prompt", "sha256": "85af282d2d10d37795624ba9fb88b70ff5f5ed6e41227032f2011c9680065d4e"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 74, "chunk_start": 1, "chunk_summary": "The prompt defines background node clustering and splitting logic using specific lists of semantic categories for shot types, room states, and lighting conditions.", "duration_ms": 48382, "findings": [{"category": "llm_closed_list_instruction", "evidence": "Close-ups, prop inserts, hand-scale plates... clean / lived-in / disturbed / heavily-ransacked... window light only / artificial light only / dawn spill", "line_end": 68, "line_start": 14, "recommended_fix": "Formalize these categories into a structured schema or enum in the input/output, or provide more abstract criteria for 'tight views' and 'state changes' that do not rely on specific phrase lists.", "severity": "P2", "why_problematic": "The prompt instructs the LLM to classify open-world Korean scenario text into specific English categories (shot types, room states, lighting) to drive node grouping and splitting logic. This creates a dependency on these specific phrases for pipeline routing and clustering behavior, even though they are presented as examples."}], "path": "prompts/_base/background_chain_planning/1.202604271600/system.md", "scan_kind": "prompt", "sha256": "c5be6528964195a14ec17b754fb182713e22ed8e4241b8e1c41be8dca0d51601"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 26, "chunk_start": 1, "chunk_summary": "The prompt template provides structural instructions for background generation using generic architectural placeholders and technical identifiers without scenario-specific pollution or brittle string classifiers.", "duration_ms": 5982, "findings": [], "path": "prompts/_base/background_chain_render/1.202604271700/user_template.md", "scan_kind": "prompt", "sha256": "2d6a41752148553a33e814740e39cafcea066aa1542352d4e719cc3262a1cb37"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 30, "chunk_start": 1, "chunk_summary": "No actionable findings; the schema defines technical identifiers and functional requirements for generated text without scenario pollution or brittle string classifiers.", "duration_ms": 3825, "findings": [], "path": "prompts/_base/background_chain_render/2.202604282201/schema.json", "scan_kind": "prompt", "sha256": "0add65ca63b853793c54fbf527a3c182b69ad8b0f9e90764495afed2ef579fe7"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 57, "chunk_start": 1, "chunk_summary": "The schema defines a boolean flag 'skip_chain' whose value is determined by an LLM classification of location types based on a provided list of examples.", "duration_ms": 17641, "findings": [{"category": "llm_closed_list_instruction", "evidence": "true if this location is OUTDOOR/OPEN-AIR (street, road, coast, sea, forest, yard, park, exterior rooftop, public square, beach, dock, vehicle exterior, etc.)", "line_end": 7, "line_start": 5, "recommended_fix": "Define 'location_type' as a formal enum in the location schema and use that to drive the 'skip_chain' logic, rather than asking the LLM to infer it from a list of examples in a description.", "severity": "P2", "why_problematic": "The prompt uses a list of examples to define a semantic classifier for the 'skip_chain' boolean, which directly routes the rendering logic (chain vs. fallback). This relies on the LLM's interpretation of an open-world concept against a non-exhaustive list of examples."}], "path": "prompts/_base/background_chain_planning/4.202604291315/schema.json", "scan_kind": "prompt", "sha256": "d0bf9f8dfd54f532aecbf6a5f81e530510d339059878e7f057c80afc06628352"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 103, "chunk_start": 1, "chunk_summary": "The prompt defines semantic classifiers for pipeline routing and node management using closed phrase lists and scenario-specific examples.", "duration_ms": 30624, "findings": [{"category": "llm_closed_list_instruction", "evidence": "OUTDOOR / OPEN-AIR (street, road, alley, coast, sea, beach, dock, yard, garden, park, public square, forest, mountain, exterior rooftop view, vehicle exterior, open-air market, etc.)", "line_end": 26, "line_start": 18, "recommended_fix": "Define the skip condition based on abstract visual continuity requirements (e.g., 'environments with high natural variance or non-fixed spatial boundaries') rather than a list of specific location types.", "severity": "P1", "why_problematic": "The prompt uses a closed list of location types as a semantic classifier to determine the 'skip_chain' routing decision. This is a brittle way to handle open-world locations where the scenario text might not match these specific keywords but requires the same pipeline behavior."}, {"category": "llm_closed_list_instruction", "evidence": "clean / lived-in / disturbed / heavily-ransacked, Close-ups, prop inserts, hand-scale plates, open window with torn curtain", "line_end": 42, "line_start": 36, "recommended_fix": "Use abstract criteria for node management (e.g., 'significant change in lighting, geometry, or state') and provide these specific states as non-binding examples or move them to project-specific configuration.", "severity": "P2", "why_problematic": "These lists act as semantic classifiers for node splitting and reuse. They include specific scenario states and prop examples (e.g., 'heavily-ransacked', 'torn curtain') that bias the LLM's grouping logic and function as a closed-world classifier for open-world visual states."}], "path": "prompts/_base/background_chain_planning/3.202604290417/system.md", "scan_kind": "prompt", "sha256": "337f4a1ee3c8e226a3e31484051d1ad799754b4add68fd5695f12602ceb6ac45"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 27, "chunk_start": 1, "chunk_summary": "The prompt file provides instructions for generating image-generation prompts for a background chain, focusing on consistency and avoiding scenario pollution by forbidding proper names and Korean text in the output.", "duration_ms": 16168, "findings": [], "path": "prompts/_base/background_chain_render/1.202604271700/system.md", "scan_kind": "prompt", "sha256": "d1dc39ca307411646ad79d39dfbe426fc232f8ef346056088e9c4852de04a1cc"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 21, "chunk_start": 1, "chunk_summary": "No actionable findings; the schema defines technical identifiers and a closed-world technical enum for background classification without scenario pollution or brittle semantic string patterns.", "duration_ms": 4052, "findings": [], "path": "prompts/_base/background_classify/1.202604291937/schema.json", "scan_kind": "prompt", "sha256": "2be2f04c944552e255fe943261bad8cb500348434982028de41ff249a646669e"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 26, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt template uses technical placeholders and generic architectural instructions without scenario pollution or brittle string-based classification.", "duration_ms": 6164, "findings": [], "path": "prompts/_base/background_chain_render/2.202604282201/user_template.md", "scan_kind": "prompt", "sha256": "2d6a41752148553a33e814740e39cafcea066aa1542352d4e719cc3262a1cb37"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 21, "chunk_start": 1, "chunk_summary": "No actionable findings; the schema defines technical identifiers and a closed-world enum for background classification without scenario pollution or semantic string judgment.", "duration_ms": 3049, "findings": [], "path": "prompts/_base/background_classify/1.202604300430/schema.json", "scan_kind": "prompt", "sha256": "2be2f04c944552e255fe943261bad8cb500348434982028de41ff249a646669e"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 11, "chunk_start": 1, "chunk_summary": "No actionable findings; the template is a structural wrapper for classification using placeholders for rules and data.", "duration_ms": 9680, "findings": [], "path": "prompts/_base/background_classify/1.202604291937/user_template.md", "scan_kind": "prompt", "sha256": "fd92c70e978782eabcf5b7165714fb2ff68250a2348d1307838737cc0d7991c3"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 11, "chunk_start": 1, "chunk_summary": "No actionable findings; the file is a generic prompt template for classification using placeholders for rules and input data.", "duration_ms": 5974, "findings": [], "path": "prompts/_base/background_classify/1.202604300430/user_template.md", "scan_kind": "prompt", "sha256": "fd92c70e978782eabcf5b7165714fb2ff68250a2348d1307838737cc0d7991c3"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 25, "chunk_start": 1, "chunk_summary": "The system prompt defines a technical classification task for background rendering strategies based on shot counts and indoor/outdoor status, with explicit instructions to avoid scenario-specific pollution.", "duration_ms": 13551, "findings": [], "path": "prompts/_base/background_classify/1.202604300430/system.md", "scan_kind": "prompt", "sha256": "0946fca18949414a098067a6c1c8647d323c5374af6e1422e9641b5c651755cf"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 36, "chunk_start": 1, "chunk_summary": "No actionable findings; the schema defines technical identifiers and structured output fields without scenario pollution or brittle semantic string patterns.", "duration_ms": 6029, "findings": [], "path": "prompts/_base/background_classify/2.202604300500/schema.json", "scan_kind": "prompt", "sha256": "226f089229ca74dab57b5b2c18f07b808701f6e8f97b6cc32e4477c0488ad6e9"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 31, "chunk_start": 1, "chunk_summary": "The prompt contains a semantic classification rule that uses environmental categories to drive pipeline routing logic.", "duration_ms": 36949, "findings": [{"category": "llm_closed_list_instruction", "evidence": "If SKIP applies (outdoor / open-air) ... Otherwise (indoor / enclosed / fixed-set)", "line_end": 21, "line_start": 14, "recommended_fix": "Move the skip logic to a structured metadata field (e.g., environment_type enum) in the location schema, and use that field to drive the skip_chain decision in code or via a simple boolean check.", "severity": "P2", "why_problematic": "The prompt instructs the LLM to perform a semantic classification of the location (outdoor vs indoor) to determine pipeline routing via the skip_chain field. This logic is brittle as it depends on LLM interpretation of open-world descriptions against a closed set of categories to decide whether to bypass a generation stage."}], "path": "prompts/_base/background_chain_planning/4.202604291315/user_template.md", "scan_kind": "prompt", "sha256": "304dac14ef0a3261104a157cadae45f43795d187c7d3292ee6de1665b45bc763"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 36, "chunk_start": 1, "chunk_summary": "No actionable findings; the schema defines technical identifiers and structured fields for background classification without scenario pollution or brittle semantic string patterns.", "duration_ms": 3411, "findings": [], "path": "prompts/_base/background_classify/3.202604300520/schema.json", "scan_kind": "prompt", "sha256": "226f089229ca74dab57b5b2c18f07b808701f6e8f97b6cc32e4477c0488ad6e9"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 25, "chunk_start": 1, "chunk_summary": "The system prompt defines a background classification strategy based on shot counts and indoor/outdoor status without using brittle keyword lists or scenario-specific pollution.", "duration_ms": 22857, "findings": [], "path": "prompts/_base/background_classify/1.202604291937/system.md", "scan_kind": "prompt", "sha256": "5125b2d75756681b0c2c536beebbd0c05e16abce623ae4199402645bca369b0d"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 58, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 4782, "findings": [], "path": "prompts/_base/background_master_plan/1.202604292000/schema.json", "scan_kind": "prompt", "sha256": "1257ed08c8b548f4ddf34f4a66bc25cdf48335eaa4151a602b030c31c327e2f3"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 112, "chunk_start": 1, "chunk_summary": "The prompt defines semantic classification logic for skipping background chains and splitting nodes based on closed lists of environment types, shot types, and room states.", "duration_ms": 45312, "findings": [{"category": "llm_closed_list_instruction", "evidence": "INDOOR / ENCLOSED / FIXED-SET... vs DETACHED OPEN AREA... (a road far from any building, an unrelated forest, a wide beach, a public street block, a mountain trail, a public square not attached to a tracked building)", "line_end": 25, "line_start": 21, "recommended_fix": "Move the skip_chain decision to an upstream metadata field or provide a more abstract set of criteria that doesn't rely on a list of specific environment examples.", "severity": "P1", "why_problematic": "The prompt defines a binary routing decision (skip_chain) based on a semantic classification of the location using a closed list of environment types and specific scenario examples. This forces the LLM to map open-world locations into a narrow set of categories to drive pipeline behavior."}, {"category": "llm_closed_list_instruction", "evidence": "Close-ups, prop inserts, hand-scale plates... vs different room state (clean / lived-in / disturbed / heavily-ransacked)", "line_end": 51, "line_start": 45, "recommended_fix": "Define these states and shot types in a formal schema and have the LLM output them as structured enums, or use a more robust method for determining node splits that doesn't rely on a fixed list of narrative states.", "severity": "P1", "why_problematic": "The prompt uses closed lists of shot types and room states as semantic classifiers to decide whether to group shots or split them into separate background nodes. This requires the LLM to perform brittle semantic mapping from natural language descriptions to determine the visual structure of the plan."}], "path": "prompts/_base/background_chain_planning/4.202604291315/system.md", "scan_kind": "prompt", "sha256": "b6d96cccd24910b03feb484005f1233195e64b54e48add4ed8c1f3fc1ecec938"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 51, "chunk_start": 1, "chunk_summary": "The system prompt defines a semantic classifier for clustering locations and determining background rendering strategies using generic architectural examples and clear logic rules.", "duration_ms": 17599, "findings": [], "path": "prompts/_base/background_classify/2.202604300500/system.md", "scan_kind": "prompt", "sha256": "fec5b2a5555284cbc6769e943dfedb187a3498b10f8233192ca3156dbcb8a313"}
{"candidate_reason": "python scope discovery", "chunk_end": 501, "chunk_start": 1, "chunk_summary": "The script is an experimental utility for rendering shots using reference images, but it contains a hardcoded prompt that assumes an indoor scenario, which is a form of scenario pollution.", "duration_ms": 135370, "findings": [{"category": "scenario_dependent_prompt", "evidence": "\"Same room/space as the reference image — match its wall finish, floor, ceiling, lighting tone, color palette.\"", "line_end": 315, "line_start": 313, "recommended_fix": "Move these descriptors to a configuration field or use more generic terms like 'environment details' or 'surfaces' to allow for arbitrary scenario types.", "severity": "P2", "why_problematic": "The prompt hardcodes indoor-specific architectural elements (wall, floor, ceiling), which biases the image generator and will cause issues for outdoor or non-room scenarios."}], "path": "backend/scripts/experiment_v4_main_shot_render_temp.py", "scan_kind": "python", "sha256": "95c9c5278eba2bab06df207502ed81048bd4322d957630e47527bdb2a4be3b83"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 17, "chunk_start": 1, "chunk_summary": "No actionable findings; the file is a clean template using placeholders for structured data and scenario text.", "duration_ms": 3343, "findings": [], "path": "prompts/_base/background_master_plan/1.202604292000/user_template.md", "scan_kind": "prompt", "sha256": "93dbe3a995f82ee34482a1b1403ead2b9c630689b2cc4398e9df0a23060f6560"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 17, "chunk_start": 1, "chunk_summary": "No actionable findings; the file is a structural template using placeholders for dynamic content without scenario pollution or semantic string classifiers.", "duration_ms": 3123, "findings": [], "path": "prompts/_base/background_master_plan/2.202605091400/user_template.md", "scan_kind": "prompt", "sha256": "93dbe3a995f82ee34482a1b1403ead2b9c630689b2cc4398e9df0a23060f6560"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 18, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 16566, "findings": [], "path": "prompts/_base/background_classify/2.202604300500/user_template.md", "scan_kind": "prompt", "sha256": "f2a44f60cc72c3d5919e162301bd8f09e5bb291a1d087ef35a2ec85462ab32fc"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 66, "chunk_start": 1, "chunk_summary": "The prompt uses specific Korean keyword lists to instruct the LLM on how to classify locations as indoor or outdoor, which is a brittle semantic string judgment pattern.", "duration_ms": 22077, "findings": [{"category": "llm_closed_list_instruction", "evidence": "Korean clues that often imply indoor: 내부 / 안 / 방 / 실 / 층 / 차내 / 매장 안 / 사무실 ... Korean clues: 외부 / 옥상 / 거리 / 도로 / 공터 / 골목 / 해안 / 숲 / 마당", "line_end": 20, "line_start": 18, "recommended_fix": "Remove the specific keyword lists and instead provide a clear physical definition of indoor vs. outdoor spaces (e.g., enclosed structure vs. open sky), instructing the LLM to infer the state from the overall context of the location label and summary.", "severity": "P1", "why_problematic": "The prompt defines semantic classification rules for 'is_indoor' based on a closed list of Korean substrings. This forces the LLM to act as a keyword-matching classifier rather than using its natural language understanding, leading to potential misclassification of locations described with synonyms or complex phrasing not covered by the list."}], "path": "prompts/_base/background_classify/3.202604300520/system.md", "scan_kind": "prompt", "sha256": "bfa0a31e9c0d0d0b60cc3bc8819b0e5bdd093e8776b3721c4b4f5beb604754ed"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 53, "chunk_start": 1, "chunk_summary": "The prompt contains significant scenario-specific bias towards indoor architectural settings and defines a brittle strategy for prepending generated text to other prompts.", "duration_ms": 45262, "findings": [{"category": "scenario_dependent_prompt", "evidence": "Photoreal architectural still — empty room/space, Same room/space, wall finish, floor, ceiling, TV is in the upper-left, sofa cluster", "line_end": 43, "line_start": 11, "recommended_fix": "Generalize the instructions to handle any environment type (e.g., 'environment/setting' instead of 'room/space') and use abstract placeholders for props in examples.", "severity": "P1", "why_problematic": "The prompt is heavily biased towards indoor architectural scenarios, forcing specific terminology (room, floor, ceiling, furniture) and opening phrases that will cause hallucinations or failures for outdoor, natural, or non-building backgrounds."}, {"category": "blind_string_mutation", "evidence": "t2i prompt에 직접 prepend되므로 영어.", "line_end": 44, "line_start": 44, "recommended_fix": "Use structured prompt composition where the guide is passed as a separate field to the downstream generator or merged using a formal template rather than blind prepending.", "severity": "P1", "why_problematic": "The instruction confirms a pipeline design where generated natural-language paragraphs (shot_guides) are blindly prepended to other prompts. This is a brittle semantic composition strategy that can lead to conflicting instructions or broken prompt syntax."}], "path": "prompts/_base/background_chain_render/2.202604282201/system.md", "scan_kind": "prompt", "sha256": "d1cea9a7d76fc41325a290eb3a428e03bcf5c0938ef39b3bb7fbae96d858a657"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 18, "chunk_start": 1, "chunk_summary": "The prompt template is a clean classification instruction using structured placeholders and technical heuristics without scenario pollution or brittle natural-language pattern matching.", "duration_ms": 24822, "findings": [], "path": "prompts/_base/background_classify/3.202604300520/user_template.md", "scan_kind": "prompt", "sha256": "f2a44f60cc72c3d5919e162301bd8f09e5bb291a1d087ef35a2ec85462ab32fc"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 17, "chunk_start": 1, "chunk_summary": "No actionable findings; the file is a structural prompt template using standard placeholders and technical output instructions.", "duration_ms": 4455, "findings": [], "path": "prompts/_base/background_master_plan/3.202605092023/user_template.md", "scan_kind": "prompt", "sha256": "ee647c0273d545c417474316d9ba4a520338c78467df5e314d82e63f40210171"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 82, "chunk_start": 1, "chunk_summary": "The prompt defines several closed-list semantic classifiers (state_class, space_key_hint) and includes scenario-specific examples that bias the model.", "duration_ms": 25926, "findings": [{"category": "schema_or_enum_drift", "evidence": "normal / quiet / busy / busy_exit / ransacked / clean_after / blood_scene / intrusion / arrival / evidence_display / dream_or_vision_state", "line_end": 41, "line_start": 41, "recommended_fix": "Inject the enum values dynamically from a central schema definition into the prompt template instead of hardcoding them.", "severity": "P2", "why_problematic": "Hardcoded list of semantic states in the prompt that must match code-side expectations for grouping and validation. Includes scenario-specific values like 'blood_scene' and 'ransacked' that bias the model toward specific genres."}, {"category": "schema_or_enum_drift", "evidence": "\"main\" | \"kitchen\" | \"rooftop\" | \"stairs\" | \"yard\" | \"exterior\" | \"office\"", "line_end": 74, "line_start": 26, "recommended_fix": "Allow for more flexible keys or inject the allowed vocabulary from the project configuration.", "severity": "P2", "why_problematic": "Closed list of sub-locations used as a semantic classifier. It forces open-world locations into a small set of keys, losing semantic precision and requiring manual synchronization between the prompt and the code's normalization logic."}, {"category": "scenario_dependent_prompt", "evidence": "예: 'dusk busy with employee pointing toward exit'", "line_end": 79, "line_start": 31, "recommended_fix": "Use more abstract or generic examples such as 'time of day with specific activity or state'.", "severity": "P2", "why_problematic": "Concrete scenario-specific example ('employee pointing toward exit') that can bias the LLM's description style for unrelated scenes or genres."}], "path": "prompts/_base/background_master_plan/2.202605091400/system.md", "scan_kind": "prompt", "sha256": "40c7bc11082d014da97cba4b839b5a1380771c7fd3e1d978aea762e6aff2e94c"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 32, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 10710, "findings": [], "path": "prompts/_base/background_planner/1.202604290417/user_template.md", "scan_kind": "prompt", "sha256": "529063896441903d8aa04130fc5e3cf9d71d999590bb6d67bfdb01a7dd2c39f2"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 99, "chunk_start": 1, "chunk_summary": "The prompt defines a background generation planner with strict logic for location frequency and grouping, explicitly forbidding scenario-specific pollution and brittle name-pattern matching.", "duration_ms": 12856, "findings": [], "path": "prompts/_base/background_planner/1.202604290417/system.md", "scan_kind": "prompt", "sha256": "4fb8e5fd42eb39a819fc9768c9000a77b17f6d116d615c3a0244c09e69876fc5"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 98, "chunk_start": 1, "chunk_summary": "The prompt defines closed-list enums for semantic classification of background states and spatial types, and includes a concrete scenario-specific example for floor plan linking logic.", "duration_ms": 26068, "findings": [{"category": "llm_closed_list_instruction", "evidence": "state_class enum (정확히 한 값. 그 외는 reject): `normal` / `quiet` / `busy` / `busy_exit` / `ransacked` / `clean_after` / `blood_scene` / `intrusion` / `arrival` / `evidence_display` / `dream_or_vision_state`", "line_end": 45, "line_start": 41, "recommended_fix": "Move semantic classification to a separate analysis step or allow the LLM to provide descriptive labels that are then mapped via a more robust embedding-based or LLM-assisted classifier.", "severity": "P2", "why_problematic": "The LLM is forced to classify open-world story events (e.g., violence, break-ins, or dream sequences) into a rigid set of semantic strings which the code then uses for validation and retry logic. This creates a brittle interface between story meaning and system behavior."}, {"category": "llm_closed_list_instruction", "evidence": "space_key_hint: controlled vocab ... 모르는 공간은 `main` 으로 fallback.", "line_end": 90, "line_start": 86, "recommended_fix": "Allow free-text space keys or expand the vocabulary to be more comprehensive, and avoid blind fallbacks in favor of explicit 'other' categories or descriptive labels.", "severity": "P2", "why_problematic": "Forces spatial categorization into a narrow list and uses a blind 'main' fallback for unknown spaces. This loses semantic precision for complex architectural scenarios and relies on string-based classification of visual spaces."}, {"category": "scenario_dependent_prompt", "evidence": "Example (group `bg_large_mart` covers L09 외부 + L10 매장 + L14 사무실): ... fp_sales_floor ... fp_exterior_entrance", "line_end": 79, "line_start": 74, "recommended_fix": "Use abstract placeholders like Group A, Location 1, Space A, and fp_alpha to demonstrate the logic without scenario pollution.", "severity": "P2", "why_problematic": "The example uses concrete scenario-specific names (large mart, sales floor) and IDs (L09, L10, L14) which can bias the LLM's output for unrelated building types or story contexts."}], "path": "prompts/_base/background_master_plan/3.202605092023/system.md", "scan_kind": "prompt", "sha256": "4358960fd84707d2d4bd36eb2afe5525ca1af6a5cf1ff707cbb113af50e9a280"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 47, "chunk_start": 1, "chunk_summary": "The system prompt defines a structured background planning process with clear technical constraints, but uses scenario-specific examples that could bias the LLM.", "duration_ms": 33936, "findings": [{"category": "scenario_dependent_prompt", "evidence": "ok-tab-bang_living_room, dusk_ransacked, night_blood_curtain_drawn, blood/dust on surfaces", "line_end": 39, "line_start": 19, "recommended_fix": "Replace scenario-specific examples with neutral, generic ones (e.g., 'living_room_day', 'office_night_messy') to ensure the prompt remains genre-agnostic.", "severity": "P2", "why_problematic": "The prompt uses concrete, genre-specific examples (crime/thriller elements like 'blood', 'ransacked') and cultural-specific terms ('ok-tab-bang') to illustrate state labels and naming conventions. These can bias the LLM's planning and labeling for scenarios in other genres."}], "path": "prompts/_base/background_master_plan/1.202604292000/system.md", "scan_kind": "prompt", "sha256": "fd6480acc85f30e8c7d4557662421e9c45521fa5699c7b3d0b1379242bb89f30"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 38, "chunk_start": 1, "chunk_summary": "No actionable findings; the template uses generic placeholders and structural logic for background planning without scenario-specific pollution or brittle string classifiers.", "duration_ms": 5032, "findings": [], "path": "prompts/_base/background_planner/2.202604291245/user_template.md", "scan_kind": "prompt", "sha256": "9b10c2ba3118987737fc486111f5b8eff83b3ab2d187ce8f763ab19e7c561e4b"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 72, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 34992, "findings": [], "path": "prompts/_base/background_master_plan/2.202605091400/schema.json", "scan_kind": "prompt", "sha256": "fd1bdaecd75993bdadbc033041680a3e3677ed0e0a45c3912dbea52fa796b0b7"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 22, "chunk_start": 1, "chunk_summary": "No actionable findings; the file defines a standard JSON schema for background prompt outputs with technical identifier validation.", "duration_ms": 3894, "findings": [], "path": "prompts/_base/background_prompt/1.202604292053/schema.json", "scan_kind": "prompt", "sha256": "3ae7fb278c13dbc525e3faa53f960af7103e7ad7ed349077c414b4d196aedef9"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 38, "chunk_start": 1, "chunk_summary": "No actionable findings; the template uses placeholders for scenario data and defines logical rules for background planning without scenario pollution or brittle string-based classification.", "duration_ms": 5468, "findings": [], "path": "prompts/_base/background_planner/3.202604291500/user_template.md", "scan_kind": "prompt", "sha256": "9b10c2ba3118987737fc486111f5b8eff83b3ab2d187ce8f763ab19e7c561e4b"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 77, "chunk_start": 1, "chunk_summary": "The file defines a structured JSON schema for background master planning, using technical patterns for IDs and enums for classification; no actionable semantic string debt or scenario pollution was found according to the provided rules.", "duration_ms": 35837, "findings": [], "path": "prompts/_base/background_master_plan/3.202605092023/schema.json", "scan_kind": "prompt", "sha256": "89d5b432867c456662276679f96828b35c4c06811bf627a9f8d7e86d5f53bfdf"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 18, "chunk_start": 1, "chunk_summary": "No actionable findings; the file is a clean structural template using abstract placeholders.", "duration_ms": 3641, "findings": [], "path": "prompts/_base/background_prompt/1.202604292053/user_template.md", "scan_kind": "prompt", "sha256": "23620dbe7a2b35034644c0fcaea9dd4c7e266a4ee27f7fe7bd3becd79ff20f61"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 22, "chunk_start": 1, "chunk_summary": "No actionable findings; the file is a standard JSON schema defining technical output structure and machine-identifier formats.", "duration_ms": 4844, "findings": [], "path": "prompts/_base/background_prompt/2.202604300800/schema.json", "scan_kind": "prompt", "sha256": "3ae7fb278c13dbc525e3faa53f960af7103e7ad7ed349077c414b4d196aedef9"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 24, "chunk_start": 1, "chunk_summary": "No actionable findings; the file is a structural prompt template using abstract placeholders for background and scene data.", "duration_ms": 4654, "findings": [], "path": "prompts/_base/background_prompt/2.202604300800/user_template.md", "scan_kind": "prompt", "sha256": "91903591fa68be17830395b99ee426dad812e40f28fb39bd512e3474caf5a154"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 165, "chunk_start": 1, "chunk_summary": "The schema defines the structure for a background planner, including floor plans and background groups, using technical identifiers and structural enums without actionable scenario pollution or brittle string logic.", "duration_ms": 23472, "findings": [], "path": "prompts/_base/background_planner/2.202604291245/schema.json", "scan_kind": "prompt", "sha256": "3f106edc052e99e473f5131c17712a11fa1600e67c445f94dbc65ebc84a37c4e"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 176, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 20233, "findings": [], "path": "prompts/_base/background_planner/3.202604291500/schema.json", "scan_kind": "prompt", "sha256": "cc0fa46524bdbf476b116634fb9ac2e469f3d6e651e5ec402ed3a9cd5d03ac66"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 21, "chunk_start": 1, "chunk_summary": "The system prompt contains scenario-specific examples in the state variation rules that may bias background generation toward specific plot tropes.", "duration_ms": 13735, "findings": [{"category": "scenario_dependent_prompt", "evidence": "dusk_ransacked, night_blood_curtain_drawn", "line_end": 17, "line_start": 17, "recommended_fix": "Replace scenario-specific examples with neutral or abstract placeholders such as 'day_clear', 'night_interior_variant', or 'state_label_example'.", "severity": "P2", "why_problematic": "These examples introduce concrete, high-entropy scenario details (ransacking, blood on curtains) into a base system prompt. This can bias the LLM to assume a thriller or horror context even when the input state_label is more neutral."}], "path": "prompts/_base/background_prompt/1.202604292053/system.md", "scan_kind": "prompt", "sha256": "b22793bd0d744517ad2f793a990efc71b6c701b00ae9bbfa84fdd8f23016c81c"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 22, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 4070, "findings": [], "path": "prompts/_base/background_prompt/3.202604300936/schema.json", "scan_kind": "prompt", "sha256": "3ae7fb278c13dbc525e3faa53f960af7103e7ad7ed349077c414b4d196aedef9"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 27, "chunk_start": 1, "chunk_summary": "No actionable findings; the file contains only abstract template placeholders and section headers for background prompt generation.", "duration_ms": 3095, "findings": [], "path": "prompts/_base/background_prompt/3.202604300936/user_template.md", "scan_kind": "prompt", "sha256": "9d1a5a8f310cbfafc8a9bcfb89f5d00e6058068dfd76a0ebed5202d06d390de5"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 22, "chunk_start": 1, "chunk_summary": "No actionable findings; the schema defines technical identifiers and general text fields without scenario pollution or semantic string classifiers.", "duration_ms": 2441, "findings": [], "path": "prompts/_base/background_prompt/4.202604301033/schema.json", "scan_kind": "prompt", "sha256": "3ae7fb278c13dbc525e3faa53f960af7103e7ad7ed349077c414b4d196aedef9"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 27, "chunk_start": 1, "chunk_summary": "No actionable findings; this is a clean prompt template using abstract placeholders for background specification and scene data.", "duration_ms": 4276, "findings": [], "path": "prompts/_base/background_prompt/4.202604301033/user_template.md", "scan_kind": "prompt", "sha256": "9d1a5a8f310cbfafc8a9bcfb89f5d00e6058068dfd76a0ebed5202d06d390de5"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 22, "chunk_start": 1, "chunk_summary": "The system prompt defines rules for generating background image prompts based on structured input, using generic examples and technical identifiers without scenario-specific pollution or brittle string-based classification logic.", "duration_ms": 10666, "findings": [], "path": "prompts/_base/background_prompt/3.202604300936/system.md", "scan_kind": "prompt", "sha256": "13ce2d806e922b2554c1a744f86d158ed5da42f05ffb5b97d2e4183dd7307362"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 27, "chunk_start": 1, "chunk_summary": "No actionable findings; the file is a structural prompt template using abstract placeholders without scenario pollution or semantic string classifiers.", "duration_ms": 3308, "findings": [], "path": "prompts/_base/background_prompt/5.202605032354/user_template.md", "scan_kind": "prompt", "sha256": "9d1a5a8f310cbfafc8a9bcfb89f5d00e6058068dfd76a0ebed5202d06d390de5"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 165, "chunk_start": 1, "chunk_summary": "The schema defines the structure for background planning, including floor plans and background chains, but contains scenario-specific examples and an overloaded semantic classifier enum.", "duration_ms": 55106, "findings": [{"category": "scenario_dependent_prompt", "evidence": "e.g. 'okt_room'", "line_end": 25, "line_start": 21, "recommended_fix": "Replace 'okt_room' with a generic technical example like 'building_a' or 'house_main'.", "severity": "P2", "why_problematic": "The example 'okt_room' (rooftop room) is a culturally specific Korean drama trope. Including it in a base schema description can bias the LLM towards specific architectural or scenario settings during generation."}, {"category": "llm_closed_list_instruction", "evidence": "\"enum\": [\"outdoor_3+\", \"low_freq_2\", \"single_shot\"]", "line_end": 147, "line_start": 144, "recommended_fix": "Split the semantic properties into separate fields (e.g., a boolean 'is_outdoor') and handle the composite logic in code or via clearer prompt instructions.", "severity": "P2", "why_problematic": "This enum functions as an overloaded semantic channel, forcing the LLM to map open-world location properties (outdoor vs indoor) and shot counts into a single composite string. This is a brittle classifier that duplicates information from the 'shot_count' field and creates a rigid semantic contract."}], "path": "prompts/_base/background_planner/1.202604290417/schema.json", "scan_kind": "prompt", "sha256": "3f106edc052e99e473f5131c17712a11fa1600e67c445f94dbc65ebc84a37c4e"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 22, "chunk_start": 1, "chunk_summary": "The system prompt for background generation is clean, using generic examples and instructing the LLM to derive context from structured inputs rather than hardcoding scenario-specific details.", "duration_ms": 25435, "findings": [], "path": "prompts/_base/background_prompt/2.202604300800/system.md", "scan_kind": "prompt", "sha256": "3548d49cdf3358579edf49d486fe50a078ce9db1beccad4976594f5d9ae26007"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 138, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 40463, "findings": [], "path": "prompts/_base/background_planner/3.202604291500/system.md", "scan_kind": "prompt", "sha256": "5fc66af29fc1f40910012103f4050997efa88a7b3ae569ded117b52f2e1a0f67"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 27, "chunk_start": 1, "chunk_summary": "No actionable findings; the file is a structural prompt template using abstract placeholders for context assembly.", "duration_ms": 4771, "findings": [], "path": "prompts/_base/background_prompt/6.202605091200/user_template.md", "scan_kind": "prompt", "sha256": "fdb96d453f99db6ddaf689a3802060706113b4974c8e04b75c58615da8c58604"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 19, "chunk_start": 1, "chunk_summary": "The system prompt defines photorealistic background generation rules and language constraints without scenario-specific pollution or brittle semantic string classifiers.", "duration_ms": 20171, "findings": [], "path": "prompts/_base/background_prompt/4.202604301033/system.md", "scan_kind": "prompt", "sha256": "db08e471eb7eb32a1683e41a8997da74440d2fdb13da5bd46fcbc1d611f27070"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 1, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt contains only a generic role and task description without scenario pollution or semantic string classifiers.", "duration_ms": 2454, "findings": [], "path": "prompts/_base/beat_extract/1.202603281644/system.md", "scan_kind": "prompt", "sha256": "91cb49bd92a43667d86370bcde3f69fcff6c57b0e8b46c8f668d880cd51c080b"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 20, "chunk_start": 1, "chunk_summary": "The system prompt defines a background generation task with a specific focus on language consistency and a string-based 'contract' for object deduplication.", "duration_ms": 18696, "findings": [{"category": "schema_or_enum_drift", "evidence": "objects_owned_by_background ... items MUST be English canonical common nouns ... contract 역할을 한다", "line_end": 20, "line_start": 20, "recommended_fix": "Implement a shared object vocabulary or use unique entity IDs from the world-state/layout-spec to synchronize objects across generation passes instead of relying on natural language noun consistency.", "severity": "P2", "why_problematic": "The prompt establishes a 'contract' for object deduplication between pipeline stages (background vs scene_detail) based on 'English canonical common nouns'. Since there is no closed vocabulary or enforced enum, different LLM iterations or models may use slightly different terms (e.g., 'wardrobe' vs 'closet' or 'TV' vs 'television'), breaking the deduplication logic and potentially causing visual artifacts or redundant rendering."}], "path": "prompts/_base/background_prompt/5.202605032354/system.md", "scan_kind": "prompt", "sha256": "faccdd541969085188c747ea7b1ae44672a9f3c53637dca827c1d051c5b8dcef"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 1, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt contains only a generic role and task description without scenario pollution or brittle semantic classifiers.", "duration_ms": 2465, "findings": [], "path": "prompts/_base/beat_extract/2.202603290030/system.md", "scan_kind": "prompt", "sha256": "91cb49bd92a43667d86370bcde3f69fcff6c57b0e8b46c8f668d880cd51c080b"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 24, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt provides abstract narrative definitions for beat extraction without scenario-specific pollution or brittle string-matching instructions.", "duration_ms": 5359, "findings": [], "path": "prompts/_base/beat_extract/1.202603281644/user.md", "scan_kind": "prompt", "sha256": "7618c846f74fee19c16a0f7860aa33b975e76c97b4886a4634f3cafc2722dac1"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 37, "chunk_start": 1, "chunk_summary": "The file defines a standard JSON schema for story beat extraction with generic dramatic categories and contains no actionable scenario pollution or brittle string-pattern debt.", "duration_ms": 9269, "findings": [], "path": "prompts/_base/beat_extract/1.202603281644/beat_schema.json", "scan_kind": "prompt", "sha256": "744017c11bbc619a12f5344bd37eb4dc1e4a49affb6056b3a97cf7d0721ce808"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 115, "chunk_start": 1, "chunk_summary": "The prompt is well-structured and explicitly instructs the LLM to avoid name-pattern matching, but it contains modern-day and genre-specific scenario pollution in its examples.", "duration_ms": 54408, "findings": [{"category": "scenario_dependent_prompt", "evidence": "CEO room, parking lot, office tower, mart_complex, cb_l05_living_night_blood", "line_end": 60, "line_start": 10, "recommended_fix": "Replace specific examples with era-neutral terms (e.g., 'main chamber', 'courtyard', 'market') and neutral state variants (e.g., 'night_variant_1').", "severity": "P2", "why_problematic": "The prompt uses modern corporate and urban examples (CEO room, parking lot, mart_complex) and genre-specific state examples (night_blood) which can bias the LLM's architectural and state analysis for non-modern or non-violent scenarios, potentially contradicting the instruction in line 98 to use universal physical descriptors."}], "path": "prompts/_base/background_planner/2.202604291245/system.md", "scan_kind": "prompt", "sha256": "29acbbbf4a25b04ca81ac7a599db9aedf50c27dfb925b90d265267f18d2f15d5"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 37, "chunk_start": 1, "chunk_summary": "No actionable findings; the file defines a standard JSON schema for structured story beat extraction with an enforced enum for change types.", "duration_ms": 3341, "findings": [], "path": "prompts/_base/beat_extract/3.202603301500/beat_schema.json", "scan_kind": "prompt", "sha256": "744017c11bbc619a12f5344bd37eb4dc1e4a49affb6056b3a97cf7d0721ce808"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 1, "chunk_start": 1, "chunk_summary": "No actionable findings; the file contains a standard system instruction for scenario analysis without scenario pollution or brittle string classifiers.", "duration_ms": 2178, "findings": [], "path": "prompts/_base/beat_extract/3.202603301500/system.md", "scan_kind": "prompt", "sha256": "91cb49bd92a43667d86370bcde3f69fcff6c57b0e8b46c8f668d880cd51c080b"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 28, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 20495, "findings": [], "path": "prompts/_base/background_prompt/6.202605091200/schema.json", "scan_kind": "prompt", "sha256": "fe5c7aed07ecfd3f68d7a4b1baba969db6d0d97618640b56f803aca6a9f3cca6"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 37, "chunk_start": 1, "chunk_summary": "The file defines a standard JSON schema for story beat extraction with no actionable semantic string debt or scenario pollution.", "duration_ms": 8660, "findings": [], "path": "prompts/_base/beat_extract/2.202603290030/beat_schema.json", "scan_kind": "prompt", "sha256": "744017c11bbc619a12f5344bd37eb4dc1e4a49affb6056b3a97cf7d0721ce808"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 19, "chunk_start": 1, "chunk_summary": "No actionable findings; the file is a standard JSON schema for character metadata without scenario pollution or semantic string logic.", "duration_ms": 2944, "findings": [], "path": "prompts/_base/entity_all/2.202603260725/character_schema.json", "scan_kind": "prompt", "sha256": "83b2414658c1be2118bddc7069f1c45c6a5f5dbf669ab04359ffa5b04ed6a0b8"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 30, "chunk_start": 1, "chunk_summary": "The prompt defines the logic for extracting narrative beats based on state changes and provides generic examples for scene continuity without scenario-specific pollution.", "duration_ms": 8984, "findings": [], "path": "prompts/_base/beat_extract/2.202603290030/user.md", "scan_kind": "prompt", "sha256": "4f3371a9b028d1bd740687a4dbe0a1fef8b5be87fad603d0fd3e8c35ee11ce6d"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 28, "chunk_start": 1, "chunk_summary": "The schema defines a field for background objects that uses natural language nouns as a contract for downstream visual redrawing logic, creating a dependency on brittle string matching.", "duration_ms": 33918, "findings": [{"category": "semantic_string_judgment", "evidence": "objects_owned_by_background ... English canonical common nouns ... scene_detail 이 redraw 하지 않도록 contract", "line_end": 24, "line_start": 19, "recommended_fix": "Use a structured entity ID system to track objects across components instead of relying on natural language noun matching to enforce redrawing policies.", "severity": "P1", "why_problematic": "The schema establishes a contract where natural language nouns are used as identifiers to control downstream redrawing behavior in 'scene_detail'. This relies on brittle string matching and requires strict normalization (singular form, no adjectives, English only) to work, which is a form of semantic string judgment over generated prose."}], "path": "prompts/_base/background_prompt/5.202605032354/schema.json", "scan_kind": "prompt", "sha256": "29f8a6f315df0ca6c69b3b508c94e044d9d86b4a54f84ba4a8555d4025407e5b"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 18, "chunk_start": 1, "chunk_summary": "No actionable findings; the file is a standard, abstract JSON schema for location entities without scenario pollution or semantic string classifiers.", "duration_ms": 4176, "findings": [], "path": "prompts/_base/entity_all/2.202603260725/location_schema.json", "scan_kind": "prompt", "sha256": "88949edccdfb064f20e8efd74a90e64e229469332f4c6a24694196b6bd30f750"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 32, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 10042, "findings": [], "path": "prompts/_base/beat_extract/3.202603301500/user.md", "scan_kind": "prompt", "sha256": "1a8c4693f32e627516c7911eb4c9e8928ef8cf5b8bd2194b3a0b96879fc63f84"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 19, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 3551, "findings": [], "path": "prompts/_base/entity_all/2.202603260725/prop_schema.json", "scan_kind": "prompt", "sha256": "a2b56df5767b69fa2c3ad7546d0feaea77361a0b7c805f86bc2d1f2e770912c4"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 14, "chunk_start": 1, "chunk_summary": "The prompt defines extraction and grouping rules for scenario locations using generic architectural examples without scenario-specific pollution or brittle string-based classification instructions.", "duration_ms": 9074, "findings": [], "path": "prompts/_base/entity_all/2.202603260725/location.md", "scan_kind": "prompt", "sha256": "84f5d6ff0a930d563bc8be853547a89e838c9c16cf1c764050f2496b15a1d199"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 14, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt contains generic instructions for scenario analysis without scenario-specific pollution or brittle semantic classifiers.", "duration_ms": 3796, "findings": [], "path": "prompts/_base/entity_all/2.202603260725/system.md", "scan_kind": "prompt", "sha256": "13a47454da9c24e4364de8c0040c59c47a5aa8c00b7acddcd26ee707837fbdb1"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 16, "chunk_start": 1, "chunk_summary": "The prompt contains scenario-specific visual instructions (wounds/blood) that bias the model toward injury-related states regardless of the input state type.", "duration_ms": 12585, "findings": [{"category": "scenario_dependent_prompt", "evidence": "skin pallor, posture, wounds/blood as appropriate for the state", "line_end": 12, "line_start": 12, "recommended_fix": "Generalize the instruction to 'visual indicators relevant to the state' or move specific injury-related terms to a specialized template or dynamic variable.", "severity": "P2", "why_problematic": "The prompt hardcodes specific visual tropes related to physical trauma or illness into a general 'state variant' instruction. This biases the model to consider these elements even when the requested state (e.g., 'happy', 'wet', 'glowing') does not involve them, potentially leading to unwanted morbid visual artifacts in arbitrary scenarios."}], "path": "prompts/_base/character_state_variant/1.202604101200/system.md", "scan_kind": "prompt", "sha256": "0bae30a11cefa54d02ebbde518f68a058e7d12caeca5b619881d370e081d095a"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 19, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 3126, "findings": [], "path": "prompts/_base/entity_all/3.202603290500/character_schema.json", "scan_kind": "prompt", "sha256": "6c396525e1b050f4a4b99584c99fcd99ddf7637df4331d3af8fcb2cc880bf836"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 20, "chunk_start": 1, "chunk_summary": "The prompt defines a cross-component visual contract based on open-ended English nouns and instructs the LLM to perform pattern-based string replacement for entity resolution.", "duration_ms": 29932, "findings": [{"category": "blind_string_mutation", "evidence": "Convert numbered references (e.g., \"number 2 (wardrobe)\") into descriptive phrases using the input numbered_elements mapping", "line_end": 15, "line_start": 15, "recommended_fix": "Pass structured entity objects or IDs directly to the prompt and allow the LLM to reference them naturally, rather than requiring the LLM to perform manual string-pattern resolution.", "severity": "P2", "why_problematic": "This instructs the LLM to perform pattern-based string replacement on input text to resolve entity references. Relying on the LLM to parse and mutate specific string patterns like 'number X (name)' is a brittle way to maintain entity identity across prompt segments."}, {"category": "schema_or_enum_drift", "evidence": "objects_owned_by_background ... items MUST be English canonical common nouns ... 이 list 는 scene_detail 이 같은 객체를 다시 그리지 않도록 contract 역할을 한다.", "line_end": 20, "line_start": 20, "recommended_fix": "Define a canonical vocabulary or enum for common background objects in the schema and enforce its use across both background and scene detail prompts.", "severity": "P2", "why_problematic": "The prompt establishes a visual consistency contract between components (background_prompt and scene_detail) using an unenforced, open-ended set of English nouns ('canonical common nouns'). Without a shared enum or schema, different LLM calls may use different synonyms (e.g., 'wardrobe' vs 'closet'), breaking the 'contract' intended to prevent redrawing."}], "path": "prompts/_base/background_prompt/6.202605091200/system.md", "scan_kind": "prompt", "sha256": "1a7df487a6353e45d35af4b4fc93e6952160728d2d8a036a060c429d224b586f"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 19, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 3020, "findings": [], "path": "prompts/_base/entity_all/3.202603290500/location_schema.json", "scan_kind": "prompt", "sha256": "343dc66596429b320b46ed182671572df45078c3545a4ef808051e894216d7e6"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 19, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 3965, "findings": [], "path": "prompts/_base/entity_all/3.202603290500/prop_schema.json", "scan_kind": "prompt", "sha256": "1560913f4e4684ab1bab8f1a01b2fba0991152902666d8df6d152631cb8d06f4"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 15, "chunk_start": 1, "chunk_summary": "The prompt provides generic instructions for extracting and grouping locations from a scenario based on visual production logic without scenario-specific pollution.", "duration_ms": 7767, "findings": [], "path": "prompts/_base/entity_all/3.202603290500/location.md", "scan_kind": "prompt", "sha256": "d8a15dfe64e2e786f5bb18394080ba148dffeb960fea7fda0ef79c2bff37f2e1"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 14, "chunk_start": 1, "chunk_summary": "The prompt provides general instructions for entity extraction based on visual presence without scenario-specific pollution or brittle semantic classifiers.", "duration_ms": 4506, "findings": [], "path": "prompts/_base/entity_all/3.202603290500/system.md", "scan_kind": "prompt", "sha256": "13a47454da9c24e4364de8c0040c59c47a5aa8c00b7acddcd26ee707837fbdb1"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 19, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 2878, "findings": [], "path": "prompts/_base/entity_all/4.202603310100/character_schema.json", "scan_kind": "prompt", "sha256": "6c396525e1b050f4a4b99584c99fcd99ddf7637df4331d3af8fcb2cc880bf836"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 19, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 2952, "findings": [], "path": "prompts/_base/entity_all/4.202603310100/location_schema.json", "scan_kind": "prompt", "sha256": "343dc66596429b320b46ed182671572df45078c3545a4ef808051e894216d7e6"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 15, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 6914, "findings": [], "path": "prompts/_base/entity_all/4.202603310100/location.md", "scan_kind": "prompt", "sha256": "d8a15dfe64e2e786f5bb18394080ba148dffeb960fea7fda0ef79c2bff37f2e1"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 19, "chunk_start": 1, "chunk_summary": "No actionable findings; the file is a standard JSON schema defining a technical data structure for prop metadata without scenario pollution or semantic classifiers.", "duration_ms": 3869, "findings": [], "path": "prompts/_base/entity_all/4.202603310100/prop_schema.json", "scan_kind": "prompt", "sha256": "1560913f4e4684ab1bab8f1a01b2fba0991152902666d8df6d152631cb8d06f4"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 19, "chunk_start": 1, "chunk_summary": "No actionable findings; the file is a standard JSON schema for character metadata with no scenario pollution or brittle string logic.", "duration_ms": 3052, "findings": [], "path": "prompts/_base/entity_character_list/1.202604010100/character_list_schema.json", "scan_kind": "prompt", "sha256": "51eeead38ce71cafebcfef226e8d7dff91ac7714c1cdf55548302c15f722018f"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 14, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 8343, "findings": [], "path": "prompts/_base/entity_all/4.202603310100/system.md", "scan_kind": "prompt", "sha256": "13a47454da9c24e4364de8c0040c59c47a5aa8c00b7acddcd26ee707837fbdb1"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 14, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 6617, "findings": [], "path": "prompts/_base/entity_character_list/1.202604010100/system.md", "scan_kind": "prompt", "sha256": "163a62f2f9522b9aad17dab823c0d4397801467558c3e7c1fca3a2d82fb47952"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 19, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 2255, "findings": [], "path": "prompts/_base/entity_character_list/2.202605011057/character_list_schema.json", "scan_kind": "prompt", "sha256": "51eeead38ce71cafebcfef226e8d7dff91ac7714c1cdf55548302c15f722018f"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 34, "chunk_start": 1, "chunk_summary": "The character extraction prompt contains scenario-specific mythological tropes used as semantic classifiers for entity separation logic.", "duration_ms": 22287, "findings": [{"category": "scenario_dependent_prompt", "evidence": "(이무기, 구미호, 요괴화, 뱀파이어 등)", "line_end": 30, "line_start": 30, "recommended_fix": "Replace specific mythological examples with abstract categories such as 'creature form', 'transformed state', or 'visual mutation' to maintain genre neutrality.", "severity": "P2", "why_problematic": "The prompt provides a list of specific mythological and genre-specific modifiers (Imoogi, Gumiho, Yokai, Vampire) to guide the LLM in splitting character entities. This introduces scenario-specific bias into a base prompt intended for general use and functions as a closed-list semantic classifier."}], "path": "prompts/_base/entity_all/4.202603310100/character.md", "scan_kind": "prompt", "sha256": "f918e34e677c2843fea63d9ca6db822d5e82c5f0f4a1842022e36902792e2286"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 13, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 3942, "findings": [], "path": "prompts/_base/entity_extract_v4/6.202603261200/character.md", "scan_kind": "prompt", "sha256": "f0edfdc662f097bd9590cdbfb239ca93c79a0474f52e0cd802f8a6a9e21396a5"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 20, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 2691, "findings": [], "path": "prompts/_base/entity_extract_v4/6.202603261200/character_schema.json", "scan_kind": "prompt", "sha256": "bc15a486b3396e6036ab8e16a3042e48e57fa077158a18b3607368409f6241c5"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 28, "chunk_start": 1, "chunk_summary": "The prompt defines the extraction logic for 'prop' entities using several closed-list semantic classifiers to exclude specific categories like outfits, VFX, and common objects.", "duration_ms": 28400, "findings": [{"category": "llm_closed_list_instruction", "evidence": "제외 기준 (중요!) ... (수트, 우주복, 갑옷, 제복, 의상, 입는 장치나 로봇은 제외) ... (피, 물, 불, 연기, 안개, 먼지, 눈, 비 등) ... (번호표, 명함, 영수증 등 텍스트만 다른 종이류)", "line_end": 28, "line_start": 21, "recommended_fix": "Replace specific noun lists with abstract functional criteria or reference a central ontology. For example, instead of listing 'blood, water, fire', instruct the LLM to exclude items that are primarily environmental effects or handled by a separate VFX pipeline.", "severity": "P2", "why_problematic": "The prompt uses closed lists of specific nouns and categories to force the LLM to exclude items from the 'prop' entity. This creates brittle semantic boundaries where unique or story-critical items (e.g., a 'magic receipt' or a 'sentient liquid') might be incorrectly filtered out because they match these hardcoded exclusion strings."}], "path": "prompts/_base/entity_all/3.202603290500/prop.md", "scan_kind": "prompt", "sha256": "1eabcda09586a55f0378b330b12a14ed282105fcab6a2ee45f8fb3e09e64bd7b"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 32, "chunk_start": 1, "chunk_summary": "The prompt defines character extraction logic with a naming convention that overloads the name field with state metadata and uses genre-specific examples for transformation criteria.", "duration_ms": 31909, "findings": [{"category": "scenario_dependent_prompt", "evidence": "인간↔요괴, 인간↔괴물", "line_end": 25, "line_start": 25, "recommended_fix": "Use neutral placeholders like 'Form A' and 'Form B' or 'Original' and 'Transformed' to illustrate visual changes.", "severity": "P2", "why_problematic": "Uses genre-specific tropes ('Yokai', 'Monster') as examples for transformation logic in a base prompt, which can bias the LLM's extraction behavior toward specific story types even when processing unrelated scenarios."}, {"category": "schema_or_enum_drift", "evidence": "이름 구분: \"A\", \"A (변형 상태)\" — 괄호 안에 변형 상태를 명시", "line_end": 31, "line_start": 31, "recommended_fix": "Introduce a structured field for 'variant_description' or 'state' in the output schema instead of embedding it in the name string.", "severity": "P2", "why_problematic": "Overloads the 'name' field with visual state metadata using a string pattern. This creates a dependency on string parsing (regex/substring) to identify the base character or the specific variant state in downstream processing, rather than using a structured field."}], "path": "prompts/_base/entity_all/3.202603290500/character.md", "scan_kind": "prompt", "sha256": "c1340776f6bf8ffb7f8070ca4e80bccca8faf9a469380143bddd9b246f1bfac4"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 20, "chunk_start": 1, "chunk_summary": "The prompt defines character extraction rules for scenario analysis without scenario-specific pollution or brittle string-based classification logic.", "duration_ms": 6886, "findings": [], "path": "prompts/_base/entity_character_list/2.202605011057/system.md", "scan_kind": "prompt", "sha256": "4ca95ca996a5e1d649e92c9baf8963654a5f89537a794ab6ec04e86ce9971713"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 20, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 3165, "findings": [], "path": "prompts/_base/entity_extract_v4/6.202603261200/location_schema.json", "scan_kind": "prompt", "sha256": "9695d47c6b17d38d9070651a909e3e07e0f2adebc043a34c93cede17ec28d84e"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 20, "chunk_start": 1, "chunk_summary": "No actionable findings; the file is a standard JSON schema for prop extraction with no scenario pollution or semantic string classifiers.", "duration_ms": 3421, "findings": [], "path": "prompts/_base/entity_extract_v4/6.202603261200/prop_schema.json", "scan_kind": "prompt", "sha256": "c930a18e26c7f94f42c7124da3cca36d8ffb85311edaeecb47039d449c48875d"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 12, "chunk_start": 1, "chunk_summary": "The location extraction prompt defines generic rules for identifying recurring backgrounds and does not contain scenario-specific pollution or brittle string-based classifiers.", "duration_ms": 5169, "findings": [], "path": "prompts/_base/entity_extract_v4/6.202603261200/location.md", "scan_kind": "prompt", "sha256": "9050b6be0e6772587ed00744e36d75bda123971911357e2f55ae64e57754db78"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 32, "chunk_start": 1, "chunk_summary": "The prompt defines character extraction and splitting logic using genre-specific tropes and establishes a brittle string-based naming convention for character variants.", "duration_ms": 46555, "findings": [{"category": "llm_closed_list_instruction", "evidence": "행인, 군중, 이름 없는 단역", "line_end": 14, "line_start": 14, "recommended_fix": "Define extras by their functional role (e.g., 'characters whose visual identity is not required for continuity') rather than a list of role names.", "severity": "P2", "why_problematic": "Defines the 'extra' exclusion rule using a closed list of role types. This is a semantic classifier that relies on the LLM matching specific role names rather than a general functional definition of non-essential characters."}, {"category": "scenario_dependent_prompt", "evidence": "인간↔요괴, 인간↔괴물, 수술 전후, 빙의/합체", "line_end": 28, "line_start": 25, "recommended_fix": "Replace specific tropes with abstract descriptions of visual change, such as 'significant change in facial features, body structure, or species'.", "severity": "P2", "why_problematic": "Uses specific genre tropes (fantasy, medical, supernatural) as primary examples for character splitting logic. This biases the LLM towards these specific scenarios and may lead to inconsistent behavior in scenarios that do not fit these specific categories."}, {"category": "semantic_string_judgment", "evidence": "이름 구분: \"A\", \"A (변형 상태)\" — 괄호 안에 변형 상태를 명시", "line_end": 31, "line_start": 31, "recommended_fix": "Separate identity and state into distinct schema fields (e.g., 'name' and 'variant_description') instead of encoding them into a single string.", "severity": "P1", "why_problematic": "Overloads the character name field with state metadata using a brittle string pattern (parentheses). This creates a contract where downstream logic must use pattern matching to decouple identity from state, which is prone to failure if the LLM deviates from the exact format."}], "path": "prompts/_base/entity_all/2.202603260725/character.md", "scan_kind": "prompt", "sha256": "4d93299bf291019476c120d5baa177a35b32ea082ab41f995187fb59d58fc63e"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 20, "chunk_start": 1, "chunk_summary": "No actionable findings; the file is a standard structural JSON schema for character extraction without scenario pollution or semantic string logic.", "duration_ms": 4198, "findings": [], "path": "prompts/_base/entity_extract_v4/7.202603261400/character_schema.json", "scan_kind": "prompt", "sha256": "bc15a486b3396e6036ab8e16a3042e48e57fa077158a18b3607368409f6241c5"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 17, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 3790, "findings": [], "path": "prompts/_base/entity_extract_v4/7.202603261400/location.md", "scan_kind": "prompt", "sha256": "1302a26fba03cd0994a6fb79ecc67375bc71f6c8dd629bc868d0614793d21fe6"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 13, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt provides generic instructions for character extraction without scenario-specific pollution or brittle semantic classifiers.", "duration_ms": 5802, "findings": [], "path": "prompts/_base/entity_extract_v4/7.202603261400/character.md", "scan_kind": "prompt", "sha256": "ef4d0d0a1d95732f9c815662f3f78e939cf1b2f6886c89b33926e1ef93c9bf1a"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 28, "chunk_start": 1, "chunk_summary": "The prompt defines the scope of 'prop' extraction using specific exclusion lists that act as semantic classifiers for open-world scenario content.", "duration_ms": 30166, "findings": [{"category": "llm_closed_list_instruction", "evidence": "제외 기준 (중요!) ... 수트, 우주복, 갑옷 ... 피, 물, 불 ... 자동차, 트럭 ... 의자, 탁자 ...", "line_end": 28, "line_start": 21, "recommended_fix": "Shift from exhaustive item lists to abstract criteria based on narrative role and visual uniqueness. Ensure the 'unique visual features' exception is explicitly applied to all categories, including wearables and effects, to prevent loss of critical scenario entities.", "severity": "P2", "why_problematic": "The prompt uses specific lists of object categories to instruct the LLM on what to exclude from the 'prop' entity type. This functions as a closed-list semantic classifier for open-world scenario content. While intended to reduce noise, hard-coded lists like 'wearable robots' or 'liquids/phenomena' can cause the LLM to overlook visually unique or narratively critical items that happen to fall into these categories, especially when the 'unique visual features' exception is not applied consistently across all lists."}], "path": "prompts/_base/entity_all/4.202603310100/prop.md", "scan_kind": "prompt", "sha256": "1eabcda09586a55f0378b330b12a14ed282105fcab6a2ee45f8fb3e09e64bd7b"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 20, "chunk_start": 1, "chunk_summary": "No actionable findings; the file defines a standard structural JSON schema for location entity extraction without scenario pollution or semantic string classifiers.", "duration_ms": 2875, "findings": [], "path": "prompts/_base/entity_extract_v4/7.202603261400/location_schema.json", "scan_kind": "prompt", "sha256": "9695d47c6b17d38d9070651a909e3e07e0f2adebc043a34c93cede17ec28d84e"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 25, "chunk_start": 1, "chunk_summary": "The system prompt defines extraction principles for visual entities using generic cinematic terms and logic rules without scenario-specific pollution or brittle string-based classifiers.", "duration_ms": 9596, "findings": [], "path": "prompts/_base/entity_extract_v4/6.202603261200/system.md", "scan_kind": "prompt", "sha256": "714617f603558b21bc5995ae6b9631ae7b238df69a16f2bfac9a1d3e8bf70026"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 20, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 2837, "findings": [], "path": "prompts/_base/entity_extract_v4/7.202603261400/prop_schema.json", "scan_kind": "prompt", "sha256": "c930a18e26c7f94f42c7124da3cca36d8ffb85311edaeecb47039d449c48875d"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 13, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 3719, "findings": [], "path": "prompts/_base/entity_extract_v4/8.202603290500/character.md", "scan_kind": "prompt", "sha256": "ef4d0d0a1d95732f9c815662f3f78e939cf1b2f6886c89b33926e1ef93c9bf1a"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 20, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 3968, "findings": [], "path": "prompts/_base/entity_extract_v4/8.202603290500/character_schema.json", "scan_kind": "prompt", "sha256": "bc15a486b3396e6036ab8e16a3042e48e57fa077158a18b3607368409f6241c5"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 20, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 2553, "findings": [], "path": "prompts/_base/entity_extract_v4/8.202603290500/location_schema.json", "scan_kind": "prompt", "sha256": "9695d47c6b17d38d9070651a909e3e07e0f2adebc043a34c93cede17ec28d84e"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 20, "chunk_start": 1, "chunk_summary": "No actionable findings; the file defines a generic structural schema for prop extraction without scenario pollution or semantic string classifiers.", "duration_ms": 3234, "findings": [], "path": "prompts/_base/entity_extract_v4/8.202603290500/prop_schema.json", "scan_kind": "prompt", "sha256": "c930a18e26c7f94f42c7124da3cca36d8ffb85311edaeecb47039d449c48875d"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 17, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 7602, "findings": [], "path": "prompts/_base/entity_extract_v4/8.202603290500/location.md", "scan_kind": "prompt", "sha256": "1302a26fba03cd0994a6fb79ecc67375bc71f6c8dd629bc868d0614793d21fe6"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 26, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 8022, "findings": [], "path": "prompts/_base/entity_extract_v4/8.202603290500/system.md", "scan_kind": "prompt", "sha256": "be3b168e706876531b387dbe2836c2c2aca23baf14ec9a9099e2ce867018e3e9"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 26, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 15886, "findings": [], "path": "prompts/_base/entity_extract_v4/7.202603261400/system.md", "scan_kind": "prompt", "sha256": "be3b168e706876531b387dbe2836c2c2aca23baf14ec9a9099e2ce867018e3e9"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 12, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt uses generic placeholders and high-level instructions without scenario-specific pollution or brittle string classifiers.", "duration_ms": 6983, "findings": [], "path": "prompts/_base/entity_extraction/v5/chunk_user.md", "scan_kind": "prompt", "sha256": "e5bbce34404d876df02ee69d081ac214535c0fdf5989ce8f4303695aa142d719"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 22, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt provides generic instructions for entity consolidation and continuity without scenario-specific pollution or brittle phrase-based classification rules.", "duration_ms": 5135, "findings": [], "path": "prompts/_base/entity_extraction/v5/final_system.md", "scan_kind": "prompt", "sha256": "f5781582efaf038296d6b5cba0d57b0c746893113c2fa61b4e6bb05a1d33f3e6"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 12, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt uses abstract placeholders and high-level instructions without scenario pollution or brittle string classifiers.", "duration_ms": 3700, "findings": [], "path": "prompts/_base/entity_extraction/v5/final_user.md", "scan_kind": "prompt", "sha256": "7570134e2e60184e6bf189bb02371ecbc3ad0641b7f33066143402a76344c25c"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 28, "chunk_start": 1, "chunk_summary": "The prompt defines the scope of 'prop' extraction using closed-list semantic classifiers and genre-specific examples to exclude certain object types.", "duration_ms": 30517, "findings": [{"category": "llm_closed_list_instruction", "evidence": "수트, 우주복, 갑옷, 제복, 의상, 입는 장치 나 로봇... 벽면 모니터, TV, CCTV... 문, 창문, 계단, 엘리베이터... 상태창, 모니터 화면, HUD", "line_end": 25, "line_start": 22, "recommended_fix": "Replace specific object lists with abstract functional definitions (e.g., 'items permanently attached to the environment' or 'items worn as part of a character's outfit') or reference a centralized entity-type schema to ensure consistency across different extraction prompts.", "severity": "P2", "why_problematic": "These lines provide a closed list of semantic categories and specific examples to instruct the LLM on what to exclude from the 'prop' entity type. This functions as a classifier for open-world scenario content and introduces genre-specific pollution (e.g., spacesuits, robots, HUDs) into a base prompt, which can lead to inconsistent extraction or bias across different story types."}], "path": "prompts/_base/entity_extract_v4/6.202603261200/prop.md", "scan_kind": "prompt", "sha256": "2cbc5e8092c5accc5dfc7940b9ea5c5c0394e410641db40dd6cc6901546f40d1"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 12, "chunk_start": 1, "chunk_summary": "The prompt defines entity and relation extraction rules using abstract semantic categories without scenario-specific pollution or brittle phrase-matching instructions.", "duration_ms": 11066, "findings": [], "path": "prompts/_base/entity_extraction/v6/chunk_user.md", "scan_kind": "prompt", "sha256": "5be1ffbc2b571cdecd0cd5a9edefe35694d3f2243cab5d4c1d086f2c3b3b232c"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 28, "chunk_start": 1, "chunk_summary": "The prompt defines prop exclusion criteria using genre-specific examples that may bias extraction in non-Sci-Fi/Fantasy scenarios.", "duration_ms": 31557, "findings": [{"category": "scenario_dependent_prompt", "evidence": "수트, 우주복, 갑옷, 제복, 의상, 입는 장치 나 로봇은 제외 ... 상태창, 모니터 화면, HUD", "line_end": 25, "line_start": 22, "recommended_fix": "Replace genre-specific examples with abstract category descriptions or a more diverse set of examples spanning multiple genres (e.g., 'period-specific attire', 'household appliances', 'architectural elements').", "severity": "P2", "why_problematic": "The exclusion criteria use concrete, genre-specific examples (spacesuits, armor, robots, HUDs, status windows) to define the boundaries of what constitutes a 'prop'. This biases the LLM towards Sci-Fi, Fantasy, or Game-like scenarios and may lead to incorrect exclusions or inclusions in other genres (e.g., historical or slice-of-life)."}], "path": "prompts/_base/entity_extract_v4/7.202603261400/prop.md", "scan_kind": "prompt", "sha256": "2cbc5e8092c5accc5dfc7940b9ea5c5c0394e410641db40dd6cc6901546f40d1"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 62, "chunk_start": 1, "chunk_summary": "The prompt defines a closed-list semantic classifier for relationship extraction and provides a list of suggested labels for entity variants.", "duration_ms": 13981, "findings": [{"category": "llm_closed_list_instruction", "evidence": "Only extract: identity (same person/different name), transformation (appearance change — age, disguise, injury), possession (character carries/wears item), containment (entity is inside/part of location).", "line_end": 56, "line_start": 55, "recommended_fix": "Define these relationship types as a formal enum in the JSON schema and use the prompt to describe the selection criteria for each enum value.", "severity": "P1", "why_problematic": "This forces the LLM to perform semantic classification of open-world narrative relationships into a narrow, closed set of four visual categories. This logic is hardcoded in the prompt rather than being handled by structured schema or downstream logic."}, {"category": "schema_or_enum_drift", "evidence": "Use concrete labels such as `age`, `disguise`, `injury`, `costume`, `hair_makeup`, `time_of_day`, `weather`, `damage`, `crowd_density`, `open_closed`, `ownership`, `blood_stain`, or `loaded_empty`.", "line_end": 48, "line_start": 48, "recommended_fix": "Move these standard variant axes into a formal enum in the schema to ensure consistency across different extraction passes.", "severity": "P2", "why_problematic": "These labels function as semantic categories for state tracking. Providing them as 'examples' in a prompt suggests they are not enforced by the schema, leading to potential drift where downstream code might expect specific strings from this list to trigger logic."}], "path": "prompts/_base/entity_extraction/v6/chunk_system.md", "scan_kind": "prompt", "sha256": "92c7193473dac3506013faf2f8a8b1c863017c4b28cb623e5deea4ceadcfade9"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 27, "chunk_start": 1, "chunk_summary": "The prompt defines the 'Prop' entity extraction logic using several closed-list semantic classifiers for exclusion, which creates a brittle boundary for open-world scenario analysis.", "duration_ms": 34066, "findings": [{"category": "llm_closed_list_instruction", "evidence": "수트, 우주복, 갑옷, 제복, 의상, 입는 장치나 로봇 / 벽면 모니터, TV, CCTV / 문, 창문, 계단, 엘리베이터 / 상태창, 모니터 화면, HUD / 피, 물, 불, 연기, 안개", "line_end": 26, "line_start": 22, "recommended_fix": "Replace specific noun lists with abstract category definitions (e.g., 'wearables', 'architectural elements', 'environmental effects') and provide a centralized ontology for entity classification to ensure consistency across the pipeline.", "severity": "P2", "why_problematic": "The prompt uses specific noun lists to define the exclusion boundary for props. This functions as a semantic classifier that relies on enumeration rather than abstract definitions, leading to potential inconsistency when encountering similar but unlisted items (e.g., 'lava' vs 'water') or when definitions drift between different entity extractors (e.g., background vs prop)."}], "path": "prompts/_base/entity_extract_v4/8.202603290500/prop.md", "scan_kind": "prompt", "sha256": "fdd7be8ee1122650678ad8e65160acaced1934ab29ccdb08eb33911275f78c7b"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 12, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 18539, "findings": [], "path": "prompts/_base/entity_extraction/v6/final_user.md", "scan_kind": "prompt", "sha256": "1d02f2d2493816be8259d5385bc6be041da351a5c3340e069ffefaf35e9c50f2"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 62, "chunk_start": 1, "chunk_summary": "The prompt defines a semantic vocabulary for entity variants and relationships using informal example lists, which likely creates a brittle contract with downstream continuity logic.", "duration_ms": 41135, "findings": [{"category": "schema_or_enum_drift", "evidence": "Use concrete labels such as age, disguise, injury... Good examples: identity reveal, family tie, alliance...", "line_end": 58, "line_start": 48, "recommended_fix": "Define these semantic categories (variant types and relationship types) as formal enums in the JSON schema and reference them in the prompt, rather than providing them as a list of examples.", "severity": "P2", "why_problematic": "The prompt provides specific semantic labels for 'variant_axes' and 'relation_facts' as examples. These strings are likely used as exact keys in the continuity graph or downstream logic, but they are defined here as informal examples rather than being enforced via a formal JSON enum in the schema. This leads to drift between the prompt's suggested vocabulary and the system's expected categories."}], "path": "prompts/_base/entity_extraction/v5/chunk_system.md", "scan_kind": "prompt", "sha256": "1bedb2ccc3696431002d2b11c8e567e1ee57e5dd822a228c13ef57b950d44575"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 12, "chunk_start": 1, "chunk_summary": "The prompt defines a closed list of allowed and excluded relation types for entity extraction, which acts as a semantic classifier for open-world story content.", "duration_ms": 18494, "findings": [{"category": "llm_closed_list_instruction", "evidence": "identity, transformation, possession, containment only. Exclude kinship, social, conflict, collaboration, membership, control, goal, and event relations.", "line_end": 4, "line_start": 4, "recommended_fix": "Define the allowed relation types in a central schema enum and inject them into the prompt as a variable or schema definition to ensure consistency across the pipeline.", "severity": "P2", "why_problematic": "The prompt defines a semantic classifier for relations using a hardcoded list of allowed and excluded types in prose. This forces the LLM to map open-world screenplay meaning into a closed set of categories that are not formally defined in a schema, leading to potential drift and maintenance overhead as the continuity graph requirements evolve."}], "path": "prompts/_base/entity_extraction/v7/chunk_user.md", "scan_kind": "prompt", "sha256": "5be1ffbc2b571cdecd0cd5a9edefe35694d3f2243cab5d4c1d086f2c3b3b232c"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 22, "chunk_start": 1, "chunk_summary": "The prompt defines a hardcoded semantic filter for relation types, which duplicates schema-level logic and risks drift.", "duration_ms": 31643, "findings": [{"category": "schema_or_enum_drift", "evidence": "identity, transformation, possession, containment only. Exclude kinship, social, conflict, collaboration, membership, control, goal, and event relations.", "line_end": 22, "line_start": 5, "recommended_fix": "Define the allowed and excluded relation types in a central configuration or schema and inject them into the prompt as template variables.", "severity": "P2", "why_problematic": "The prompt defines a closed-list semantic classifier to filter 'visually relevant' relations. This logic is hardcoded in the prompt prose rather than being driven by the schema, creating a maintenance burden and potential for drift between the extraction policy and the data model."}], "path": "prompts/_base/entity_extraction/v6/final_system.md", "scan_kind": "prompt", "sha256": "a9093df70ae7c1e055c753760b1f5f64444b73b2ebc601145d63f4be6b31af1f"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 10, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt provides generic entity extraction instructions without scenario-specific pollution or brittle string-based classification lists.", "duration_ms": 8006, "findings": [], "path": "prompts/_base/entity_extractor_v2/4.202604021900/turn1.md", "scan_kind": "prompt", "sha256": "131cd0d20ee7aa0f183c463e454de83adb772de2eca314edd6594972804f7b95"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 15, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 11339, "findings": [], "path": "prompts/_base/entity_extractor_v2/4.202604021900/turn0_style_schema.json", "scan_kind": "prompt", "sha256": "ddadc6b3ba3f79279dc52a9049e8bf5b1aff2e5a7b6b13d9090bcee9413c0f15"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 22, "chunk_start": 1, "chunk_summary": "The prompt contains scenario-specific examples and uses a closed list of phrases to define semantic exclusion rules for entity attributes.", "duration_ms": 32820, "findings": [{"category": "scenario_dependent_prompt", "evidence": "예: \"Set in near-future Korea.\"", "line_end": 8, "line_start": 8, "recommended_fix": "Use abstract placeholders like 'Set in [Era], [Location].' or a more neutral example.", "severity": "P2", "why_problematic": "The prompt uses a specific real-world location ('Korea') and a specific era ('near-future') as an example for the T2I prompt prefix. This is scenario pollution that can bias the LLM's output for arbitrary stories toward these specific settings."}, {"category": "llm_closed_list_instruction", "evidence": "장식품(리본, 꽃 등), 상처/피/흙, 변장, 특수 메이크업", "line_end": 14, "line_start": 14, "recommended_fix": "Define the exclusion rule conceptually (e.g., 'exclude features that are not part of the entity's base design') rather than relying on a specific list of props/states.", "severity": "P2", "why_problematic": "The prompt uses a closed list of specific props and states to define the semantic boundary between 'permanent' and 'temporary' features. This can lead to incorrect exclusions (e.g., a permanent scar being excluded because 'blood/wound' is in the list)."}], "path": "prompts/_base/entity_extractor_v2/4.202603242100/turn_entity_detail.md", "scan_kind": "prompt", "sha256": "9821f5496d056652a0d7d5e3ada34a27d35b6566ea80020af3c4a8b3982b99f4"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 25, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 7777, "findings": [], "path": "prompts/_base/entity_extractor_v2/4.202604021900/turn1_7_detail_batch_schema.json", "scan_kind": "prompt", "sha256": "c37d0b2ad98d09e2aae9c14b59e27467caeee1af360f7ff6d6a1e7862e3dbeda"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 21, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 5323, "findings": [], "path": "prompts/_base/entity_extractor_v2/4.202604021900/turn1_review_schema.json", "scan_kind": "prompt", "sha256": "8da829a58de03b15e392fe01e73b04699056e6dfe8aba79c77139d1a9f017dac"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 85, "chunk_start": 1, "chunk_summary": "The prompt contains scenario-specific pollution in examples and defines closed-list semantic classifiers for relationship extraction.", "duration_ms": 39896, "findings": [{"category": "scenario_dependent_prompt", "evidence": "(예: 아머 유닛, 가면, 무기류 등) ... (예: 은성<->ZRBB51)", "line_end": 24, "line_start": 16, "recommended_fix": "Replace concrete examples with abstract placeholders or generic categories (e.g., 'Character A', 'Prop A').", "severity": "P2", "why_problematic": "Contains concrete scenario-specific examples like 'Armor Unit' and specific character names/IDs ('은성', 'ZRBB51') which can bias the LLM towards specific genres or naming conventions during entity extraction."}, {"category": "llm_closed_list_instruction", "evidence": "Only extract: identity (same person/different name), transformation (appearance change — age, disguise, injury), possession (character carries/wears item), containment (entity is inside/part of location).", "line_end": 79, "line_start": 78, "recommended_fix": "Define these relationship types as an enum in the JSON schema and refer to the schema definition in the prompt.", "severity": "P2", "why_problematic": "Instructs the LLM to classify open-world relationships into a hardcoded list of four semantic categories within the prompt prose. This logic should ideally be defined in the JSON schema as an enum to ensure consistency and prevent drift between the prompt and downstream code."}], "path": "prompts/_base/entity_extraction/v7/chunk_system.md", "scan_kind": "prompt", "sha256": "18ae0154de3911a0110e3988f01546e52d47d2b8b64f98e3fa67a39e12701a76"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 10, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt uses generic visual variation examples and template placeholders for location extraction without scenario-specific pollution or brittle semantic classifiers.", "duration_ms": 5569, "findings": [], "path": "prompts/_base/entity_extractor_v2/4.202604021900/turn3.md", "scan_kind": "prompt", "sha256": "f757a7155f34670b5e6dafe6ac19be55de01cdcc65645990ab96036500746196"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 64, "chunk_start": 1, "chunk_summary": "The prompt defines entity extraction logic using specific scenario tropes and semantic states as a classifier list.", "duration_ms": 34092, "findings": [{"category": "llm_closed_list_instruction", "evidence": "\"전투 준비 상태\", \"결박된 상태\", \"부상 상태\", \"두 동강 난 상태\", \"부상, 결박, 사망\", \"A의 정신이 B의 몸에 들어가면\"", "line_end": 64, "line_start": 26, "recommended_fix": "Abstract the extraction logic into generalized principles (e.g., 'transient physical states', 'temporary equipment', 'visual identity vs. narrative soul') and move specific examples to a non-normative guidance section if necessary.", "severity": "P2", "why_problematic": "The prompt uses a closed list of specific semantic states and narrative tropes to instruct the LLM on how to route scenario content (e.g., deciding if a state is a 'Variant' or a 'Scene Prompt'). This creates a brittle semantic classifier based on specific examples like 'cut in half' or 'possession' rather than generalized visual principles."}], "path": "prompts/_base/entity_extractor_v2/4.202604021900/system.md", "scan_kind": "prompt", "sha256": "c734c208ceb05e3271b0e3bcb0702e756affc2114ce149e090bffc387188a5d4"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 24, "chunk_start": 1, "chunk_summary": "The prompt defines extraction rules for entity details, including a requirement to embed specific ethnic/national classifications at the start of character descriptions.", "duration_ms": 21607, "findings": [{"category": "schema_or_enum_drift", "evidence": "반드시 국적 또는 인종(예: Korean, East Asian, South Asian, Black, White, Hispanic 등)을 description 첫 부분에 명시", "line_end": 13, "line_start": 13, "recommended_fix": "Move 'ethnicity' or 'nationality' to a separate structured field in the output schema with a defined enum, rather than embedding it as a prefix in the 'description' string.", "severity": "P2", "why_problematic": "This instruction mandates a semantic classification (race/ethnicity) and requires it to be placed at a specific position within a natural-language string field. This creates a brittle contract where downstream logic likely relies on string splitting or prefix matching to recover this structured attribute for image generation (e.g., model selection or prompt weighting), rather than using a dedicated schema field."}], "path": "prompts/_base/entity_extractor_v2/4.202604021900/turn1_7_detail_batch.md", "scan_kind": "prompt", "sha256": "20e33cce20dc4a55dd7f6458de5911dfd80389064a09ead6ab27828fa13e54c1"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 6, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 8030, "findings": [], "path": "prompts/_base/entity_extractor_v2/4.202604021900/turn4.md", "scan_kind": "prompt", "sha256": "704a66e992e6ebf7080c998f6de17f8fdec2576843e6ca5d321a0c8829256a17"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 22, "chunk_start": 1, "chunk_summary": "The prompt defines extraction and exclusion criteria for 'prop' entities, using specific genre-related examples as semantic classifiers to bound the entity scope.", "duration_ms": 118599, "findings": [{"category": "llm_closed_list_instruction", "evidence": "(수트, 우주복, 갑옷, 제복, 의상, 입는 장치나 로봇은 제외), (벽면 모니터, TV, CCTV 등), (문, 창문, 계단, 엘리베이터), (상태창, 모니터 화면, HUD)", "line_end": 22, "line_start": 19, "recommended_fix": "Define entity boundaries using abstract category definitions (e.g., 'wearable items', 'architectural elements') and move specific examples to a centralized schema or shared documentation to ensure consistency across different entity extraction prompts.", "severity": "P2", "why_problematic": "These lists function as a semantic classifier to define the boundary of the 'Prop' entity. They contain genre-specific examples (space suits, armor, HUD) that act as a closed-world filter for an open-world extraction task, creating potential drift if other entity types (like outfits or backgrounds) change their definitions."}], "path": "prompts/_base/entity_all/2.202603260725/prop.md", "scan_kind": "prompt", "sha256": "7cf834521b7b74482214d6e4d8924a963150cd16fecee1b86293ee8be0fdc5fe"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 29, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt defines a structured extraction schema for world-building metadata using generic examples without scenario-specific pollution or brittle semantic classifiers.", "duration_ms": 4879, "findings": [], "path": "prompts/_base/entity_extractor_v2/6.202605091300/turn0_style.md", "scan_kind": "prompt", "sha256": "31930e4a978832afdd7f6b7163943c8d9b891c897bc91adebf5959e74669d55b"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 29, "chunk_start": 1, "chunk_summary": "The prompt defines a world-building extraction task with specific instructions for physical presence rules and provides culturally specific examples for setting and style.", "duration_ms": 39283, "findings": [{"category": "llm_closed_list_instruction", "evidence": "visual_world_rules: \"이 인물이 이 장소에 물리적으로 존재하는가?\"를 판단하는 핵심 규칙만... 원격 접속/조종/빙의/텔레파시... 몽타주/교차편집", "line_end": 15, "line_start": 11, "recommended_fix": "Generalize the instruction to ask the LLM to identify any narrative or technical conditions in the scenario that affect whether a character is physically present in a scene, without pre-defining the tropes.", "severity": "P2", "why_problematic": "The prompt instructs the LLM to define physical presence logic based on a closed list of tropes (remote access, montage). This creates a semantic classifier for entity visibility that is biased towards these specific narrative devices rather than identifying the underlying logic of the scenario."}, {"category": "scenario_dependent_prompt", "evidence": "조선시대, 한국 서울, 현대 한국 도시, 한옥, 한복", "line_end": 23, "line_start": 17, "recommended_fix": "Replace culturally specific examples with more abstract or globally diverse ones (e.g., 'Historical Era', 'Metropolitan City', 'Traditional Architecture', 'Period-appropriate clothing').", "severity": "P2", "why_problematic": "The prompt uses culturally specific examples (Joseon Dynasty, Seoul, Hanok, Hanbok) which can bias the LLM's extraction and interpretation for scenarios set in different cultures or eras, potentially leading to hallucinations or incorrect style associations."}], "path": "prompts/_base/entity_extractor_v2/4.202604021900/turn0_style.md", "scan_kind": "prompt", "sha256": "31930e4a978832afdd7f6b7163943c8d9b891c897bc91adebf5959e74669d55b"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 15, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 7145, "findings": [], "path": "prompts/_base/entity_extractor_v2/6.202605091300/turn0_style_schema.json", "scan_kind": "prompt", "sha256": "ddadc6b3ba3f79279dc52a9049e8bf5b1aff2e5a7b6b13d9090bcee9413c0f15"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 10, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 6583, "findings": [], "path": "prompts/_base/entity_extractor_v2/6.202605091300/turn1.md", "scan_kind": "prompt", "sha256": "131cd0d20ee7aa0f183c463e454de83adb772de2eca314edd6594972804f7b95"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 25, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 6378, "findings": [], "path": "prompts/_base/entity_extractor_v2/6.202605091300/turn1_7_detail_batch_schema.json", "scan_kind": "prompt", "sha256": "c37d0b2ad98d09e2aae9c14b59e27467caeee1af360f7ff6d6a1e7862e3dbeda"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 106, "chunk_start": 1, "chunk_summary": "The prompt defines a controlled vocabulary for location sub-spaces and provides specific semantic rules for character variations using a closed list of examples.", "duration_ms": 13993, "findings": [{"category": "schema_or_enum_drift", "evidence": "allowed_space_keys 는 controlled vocab 안에서 선택: main / kitchen / rooftop / stairs / yard / exterior / office", "line_end": 82, "line_start": 82, "recommended_fix": "Define the allowed_space_keys in a shared schema or SOT and inject them into the prompt dynamically, or use a more flexible classification system.", "severity": "P2", "why_problematic": "This defines a hardcoded list of semantic sub-space categories in the prompt that must be synchronized with downstream logic (background_master_plan) mentioned in line 90. It functions as an unenforced schema enum."}, {"category": "llm_closed_list_instruction", "evidence": "허용되는 변형 예시: ... 금지되는 변형 (씬 T2I 프롬프트로 처리 가능): ...", "line_end": 30, "line_start": 20, "recommended_fix": "Provide abstract criteria for what constitutes a visual variation (e.g., 'significant change in silhouette or age') rather than a list of specific forbidden states.", "severity": "P2", "why_problematic": "The prompt uses a closed list of specific semantic examples (e.g., 'injured state', 'cut in half') to define the boundary of the 'variation' entity type. This forces the LLM to classify open-world scenario meaning based on a fixed set of phrase-based rules."}], "path": "prompts/_base/entity_extractor_v2/6.202605091300/system.md", "scan_kind": "prompt", "sha256": "29d0f842cebd8cb68e6c24a2c3faf4b7fb78990444db7db426570e76a0fc7c7a"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 21, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 6879, "findings": [], "path": "prompts/_base/entity_extractor_v2/6.202605091300/turn1_review_schema.json", "scan_kind": "prompt", "sha256": "8da829a58de03b15e392fe01e73b04699056e6dfe8aba79c77139d1a9f017dac"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 14, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 29162, "findings": [], "path": "prompts/_base/entity_extractor_v2/4.202604021900/turn2.md", "scan_kind": "prompt", "sha256": "a4177ce4a007861512d66ee9bdb9b69afea47ff818eeeddfb1cb1a1fb6f2b817"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 6, "chunk_start": 1, "chunk_summary": "No actionable findings.", "duration_ms": 9340, "findings": [], "path": "prompts/_base/entity_extractor_v2/6.202605091300/turn4.md", "scan_kind": "prompt", "sha256": "704a66e992e6ebf7080c998f6de17f8fdec2576843e6ca5d321a0c8829256a17"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 27, "chunk_start": 1, "chunk_summary": "The prompt contains scenario-specific examples and instructions for the LLM to classify entities into specific nationality and race categories.", "duration_ms": 26316, "findings": [{"category": "scenario_dependent_prompt", "evidence": "예: \"Set in near-future 인천, Korea.\"", "line_end": 9, "line_start": 9, "recommended_fix": "Use abstract placeholders like 'Set in [Era], [Location].' without concrete examples.", "severity": "P2", "why_problematic": "The prompt uses a concrete real-world location (Incheon, Korea) and era (near-future) as an example, which can bias the LLM's generation for arbitrary scenarios."}, {"category": "llm_closed_list_instruction", "evidence": "국적 또는 인종을 반드시 명기 ... (예: Korean, Japanese, American) ... (예: East Asian, Caucasian, Black, Middle Eastern)", "line_end": 16, "line_start": 5, "recommended_fix": "Define these categories in a central schema or allow the LLM to describe appearance naturally without forcing specific nationality/race labels.", "severity": "P2", "why_problematic": "The prompt instructs the LLM to classify visual identity into a closed list of nationality and race examples. This forces semantic classification based on a limited set of categories provided in the prompt."}], "path": "prompts/_base/entity_extractor_v2/5.202603270930/turn_entity_detail.md", "scan_kind": "prompt", "sha256": "736150475000884f04e05d2da19f17bb21aeffc9f9c4c24ca9ed437ae60e03ab"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 24, "chunk_start": 1, "chunk_summary": "The prompt defines extraction rules for character, background, and object entities, focusing on permanent visual traits while excluding temporary states, with no actionable scenario pollution or brittle string patterns found.", "duration_ms": 21588, "findings": [], "path": "prompts/_base/entity_extractor_v2/6.202605091300/turn1_7_detail_batch.md", "scan_kind": "prompt", "sha256": "20e33cce20dc4a55dd7f6458de5911dfd80389064a09ead6ab27828fa13e54c1"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 15, "chunk_start": 1, "chunk_summary": "The file defines a generic JSON schema for style and entity extraction with no actionable scenario pollution or semantic string judgment debt.", "duration_ms": 6628, "findings": [], "path": "prompts/_base/entity_extractor_v2/7.202605091845/turn0_style_schema.json", "scan_kind": "prompt", "sha256": "ddadc6b3ba3f79279dc52a9049e8bf5b1aff2e5a7b6b13d9090bcee9413c0f15"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 14, "chunk_start": 1, "chunk_summary": "The prompt defines semantic boundaries for character 'visual variations' using a closed list of allowed and forbidden examples, which acts as a prompt-side semantic classifier.", "duration_ms": 22488, "findings": [{"category": "llm_closed_list_instruction", "evidence": "허용: 20대→60대 같은 큰 나이 변화, 완전히 다른 실루엣(전신 갑옷 등), 변장... 금지: 의상만 바뀌는 경우(군복/정장/일상복...), 부상/결박/사망 상태", "line_end": 11, "line_start": 10, "recommended_fix": "Define the 'visual variation' criteria using abstract principles (e.g., 'structural changes to the character model') and move specific state exclusions (like injury/death) to a downstream validation or filtering step if they are consistently undesirable.", "severity": "P2", "why_problematic": "The prompt instructs the LLM to classify open-world character states into a 'visual variation' field based on a closed list of semantic examples. This creates a brittle boundary for entity extraction where states like 'injury' or 'death' are explicitly excluded via a prompt-side classifier rather than a structured schema or logic."}], "path": "prompts/_base/entity_extractor_v2/6.202605091300/turn2.md", "scan_kind": "prompt", "sha256": "a4177ce4a007861512d66ee9bdb9b69afea47ff818eeeddfb1cb1a1fb6f2b817"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 10, "chunk_start": 1, "chunk_summary": "The prompt provides generic instructions for entity extraction (characters, backgrounds, objects) from a scenario without scenario-specific pollution or brittle phrase-based classifiers.", "duration_ms": 7329, "findings": [], "path": "prompts/_base/entity_extractor_v2/7.202605091845/turn1.md", "scan_kind": "prompt", "sha256": "131cd0d20ee7aa0f183c463e454de83adb772de2eca314edd6594972804f7b95"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 10, "chunk_start": 1, "chunk_summary": "The prompt defines visual variation categories using concrete scenario examples like fire and destruction, which biases the entity extraction process.", "duration_ms": 27859, "findings": [{"category": "scenario_dependent_prompt", "evidence": "시간대 변화 (낮/밤/새벽), 날씨 변화 (맑음/비/안개), 상태 변화 (화재 이후/파괴된/정상)", "line_end": 9, "line_start": 7, "recommended_fix": "Replace concrete scenario examples with abstract descriptions of the variation types or a more diverse, neutral set of examples to avoid biasing the extraction toward specific plot points like fire or destruction.", "severity": "P2", "why_problematic": "The prompt provides specific scenario-based examples (fire, destruction) as definitions for visual variation states. This biases the LLM to interpret open-world scenarios through these specific tropes and may lead to incorrect or forced classifications when the actual scenario contains different types of variations (e.g., 'festive', 'abandoned', 'under construction')."}], "path": "prompts/_base/entity_extractor_v2/6.202605091300/turn3.md", "scan_kind": "prompt", "sha256": "f757a7155f34670b5e6dafe6ac19be55de01cdcc65645990ab96036500746196"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 24, "chunk_start": 1, "chunk_summary": "The prompt contains scenario-specific examples, hardcoded visual style mappings for entity types, and references to external controlled vocabularies for schema fields.", "duration_ms": 26312, "findings": [{"category": "scenario_dependent_prompt", "evidence": "Set in near-future Korea.", "line_end": 8, "line_start": 8, "recommended_fix": "Replace with abstract placeholders like 'Set in [Era], [Location].'", "severity": "P2", "why_problematic": "The use of a concrete scenario (near-future Korea) as an example in a base prompt can bias the LLM toward specific cultural or temporal tropes when generating for arbitrary scenarios."}, {"category": "llm_closed_list_instruction", "evidence": "Passport-style ID photo... Photorealistic cinematic establishing shot... Photorealistic product photo", "line_end": 18, "line_start": 10, "recommended_fix": "Allow the LLM to determine the most appropriate framing/style based on the entity's description, or provide a wider, more abstract set of style guidelines.", "severity": "P1", "why_problematic": "The prompt forces open-world entities into a closed list of visual styles (ID photo, establishing shot, product photo) based on their type. This limits the visual flexibility for entities that do not fit these specific framing/style templates."}, {"category": "schema_or_enum_drift", "evidence": "system prompt 의 controlled vocab 따라", "line_end": 21, "line_start": 21, "recommended_fix": "Explicitly list the allowed vocabulary for space_profile within this prompt or ensure it is injected dynamically.", "severity": "P2", "why_problematic": "The prompt refers to an external 'controlled vocab' for the space_profile field without defining it locally. This creates a synchronization risk where the LLM might use values not supported by downstream code."}], "path": "prompts/_base/entity_extractor_v2/6.202605091300/turn_entity_detail.md", "scan_kind": "prompt", "sha256": "1716b6d5371e24806018c29c0601bcf99e4547ec016a24a222a76a7babfd1b84"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 106, "chunk_start": 1, "chunk_summary": "The prompt defines a closed-list semantic classifier for spatial sub-divisions within locations, forcing the LLM to map arbitrary scenario spaces to a small set of hardcoded strings used for downstream ID assignment.", "duration_ms": 21362, "findings": [{"category": "llm_closed_list_instruction", "evidence": "allowed_space_keys 는 controlled vocab 안에서 선택: main / kitchen / rooftop / stairs / yard / exterior / office", "line_end": 86, "line_start": 81, "recommended_fix": "Replace the hardcoded list with a requirement for the LLM to provide a descriptive common-noun key, or move the controlled vocabulary to a dynamic configuration that can be updated per-project without modifying the base prompt.", "severity": "P1", "why_problematic": "The prompt forces the LLM to classify open-world spatial sub-divisions into a narrow, hardcoded list of 7 strings. This is a semantic classifier that biases the extraction process and limits the system's ability to handle diverse environments (e.g., bedrooms, hallways, forests). Since these keys drive downstream deterministic ID assignment (line 90), this creates a brittle link between scenario content and system logic."}], "path": "prompts/_base/entity_extractor_v2/7.202605091845/system.md", "scan_kind": "prompt", "sha256": "29d0f842cebd8cb68e6c24a2c3faf4b7fb78990444db7db426570e76a0fc7c7a"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 25, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 10878, "findings": [], "path": "prompts/_base/entity_extractor_v2/7.202605091845/turn1_7_detail_batch_schema.json", "scan_kind": "prompt", "sha256": "c37d0b2ad98d09e2aae9c14b59e27467caeee1af360f7ff6d6a1e7862e3dbeda"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 18, "chunk_start": 1, "chunk_summary": "The prompt contains a scenario-specific example that may bias LLM generation for arbitrary stories.", "duration_ms": 46821, "findings": [{"category": "scenario_dependent_prompt", "evidence": "\"Set in near-future Korea.\"", "line_end": 8, "line_start": 8, "recommended_fix": "Use abstract placeholders like \"Set in [Era], [Location].\"", "severity": "P2", "why_problematic": "The use of a concrete location and era in an example can bias the LLM towards those specific scenario elements even when the input scenario is different."}], "path": "prompts/_base/entity_extractor_v2/4.202604021900/turn_entity_detail.md", "scan_kind": "prompt", "sha256": "9759271f0130e1f187f19b13d858ca4b451723a62b7de5959150463c1ce1aa2f"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 21, "chunk_start": 1, "chunk_summary": "The file defines a standard JSON schema for entity extraction results and contains no actionable semantic string debt or scenario pollution.", "duration_ms": 10676, "findings": [], "path": "prompts/_base/entity_extractor_v2/7.202605091845/turn1_review_schema.json", "scan_kind": "prompt", "sha256": "8da829a58de03b15e392fe01e73b04699056e6dfe8aba79c77139d1a9f017dac"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 24, "chunk_start": 1, "chunk_summary": "The prompt defines extraction rules for character, background, and object entities, focusing on stable visual traits while providing generic examples for exclusion and classification.", "duration_ms": 19641, "findings": [], "path": "prompts/_base/entity_extractor_v2/7.202605091845/turn1_7_detail_batch.md", "scan_kind": "prompt", "sha256": "20e33cce20dc4a55dd7f6458de5911dfd80389064a09ead6ab27828fa13e54c1"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 14, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 10877, "findings": [], "path": "prompts/_base/entity_extractor_v2/7.202605091845/turn2.md", "scan_kind": "prompt", "sha256": "a4177ce4a007861512d66ee9bdb9b69afea47ff818eeeddfb1cb1a1fb6f2b817"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 29, "chunk_start": 1, "chunk_summary": "The prompt defines an entity and style extractor but includes scenario-specific examples and a closed list of narrative tropes for physical presence logic.", "duration_ms": 33232, "findings": [{"category": "scenario_dependent_prompt", "evidence": "현대 한국 도시 + 미래 연구시설, 조선시대 한옥, 한복, 현대 군용차 + 미래 캡슐", "line_end": 22, "line_start": 17, "recommended_fix": "Use more abstract or diverse examples (e.g., 'Ancient Civilization', 'Futuristic Metropolis') to avoid biasing the model toward specific Korean or Sci-Fi settings.", "severity": "P2", "why_problematic": "The examples for era, building, clothing, and vehicle styles use concrete cultural and genre-specific tropes (Joseon era, Hanbok, specific sci-fi pairings) which can bias the LLM when extracting details for scenarios outside these specific contexts."}, {"category": "llm_closed_list_instruction", "evidence": "반드시 포함: 원격 접속/조종/빙의/텔레파시... 몽타주/교차편집", "line_end": 15, "line_start": 11, "recommended_fix": "Rephrase to encourage the LLM to identify any relevant narrative mechanism for physical presence, treating the listed tropes as non-exhaustive examples.", "severity": "P2", "why_problematic": "The prompt instructs the LLM to define 'physical presence' rules using a closed list of narrative tropes as mandatory criteria. This functions as a semantic classifier for visibility logic, potentially missing other reasons for non-physical presence."}], "path": "prompts/_base/entity_extractor_v2/7.202605091845/turn0_style.md", "scan_kind": "prompt", "sha256": "31930e4a978832afdd7f6b7163943c8d9b891c897bc91adebf5959e74669d55b"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 15, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 6200, "findings": [], "path": "prompts/_base/entity_extractor_v2/8.202605121200/turn0_style_schema.json", "scan_kind": "prompt", "sha256": "ddadc6b3ba3f79279dc52a9049e8bf5b1aff2e5a7b6b13d9090bcee9413c0f15"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 6, "chunk_start": 1, "chunk_summary": "The prompt chunk provides instructions for extracting and describing important props, using generic examples to filter out non-essential items without scenario-specific pollution.", "duration_ms": 14894, "findings": [], "path": "prompts/_base/entity_extractor_v2/7.202605091845/turn4.md", "scan_kind": "prompt", "sha256": "704a66e992e6ebf7080c998f6de17f8fdec2576843e6ca5d321a0c8829256a17"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 10, "chunk_start": 1, "chunk_summary": "The prompt provides generic instructions for entity extraction without scenario-specific pollution or brittle phrase-based classifiers.", "duration_ms": 7564, "findings": [], "path": "prompts/_base/entity_extractor_v2/8.202605121200/turn1.md", "scan_kind": "prompt", "sha256": "131cd0d20ee7aa0f183c463e454de83adb772de2eca314edd6594972804f7b95"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 25, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 4880, "findings": [], "path": "prompts/_base/entity_extractor_v2/8.202605121200/turn1_7_detail_batch_schema.json", "scan_kind": "prompt", "sha256": "c37d0b2ad98d09e2aae9c14b59e27467caeee1af360f7ff6d6a1e7862e3dbeda"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 106, "chunk_start": 1, "chunk_summary": "The prompt defines a controlled vocabulary for location sub-spaces and provides specific semantic examples to restrict entity variation extraction.", "duration_ms": 18198, "findings": [{"category": "llm_closed_list_instruction", "evidence": "allowed_space_keys 는 controlled vocab 안에서 선택: main / kitchen / rooftop / stairs / yard / exterior / office", "line_end": 86, "line_start": 81, "recommended_fix": "Allow the LLM to generate descriptive space keys or move the classification logic to a separate step that maps natural language descriptions to a broader, versioned taxonomy.", "severity": "P2", "why_problematic": "It forces the LLM to classify arbitrary open-world locations into a small, fixed set of semantic categories. This creates a brittle interface where any location not in the list (e.g., 'bedroom', 'hallway') must be collapsed into 'main', losing visual specificity and potentially causing collisions in downstream ID generation as noted in line 90."}, {"category": "llm_closed_list_instruction", "evidence": "금지되는 변형 ... \"전투 준비 상태\", \"결박된 상태\", \"부상 상태\", \"두 동강 난 상태\"", "line_end": 28, "line_start": 25, "recommended_fix": "Define the variation policy using abstract criteria (e.g., 'permanent physical changes vs. temporary poses/states') rather than a list of specific scenario-like examples.", "severity": "P2", "why_problematic": "The prompt uses a specific list of semantic states as a negative classifier to decide whether to create a new entity variation. This relies on the LLM matching these specific concepts/phrases to enforce entity lifecycle policy, which is brittle for open-world scenarios."}], "path": "prompts/_base/entity_extractor_v2/8.202605121200/system.md", "scan_kind": "prompt", "sha256": "29d0f842cebd8cb68e6c24a2c3faf4b7fb78990444db7db426570e76a0fc7c7a"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 21, "chunk_start": 1, "chunk_summary": "The schema defines a structured output for entity extraction with fields for name, type, frequency, and importance, containing no actionable scenario pollution or brittle string logic.", "duration_ms": 7325, "findings": [], "path": "prompts/_base/entity_extractor_v2/8.202605121200/turn1_review_schema.json", "scan_kind": "prompt", "sha256": "8da829a58de03b15e392fe01e73b04699056e6dfe8aba79c77139d1a9f017dac"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 14, "chunk_start": 1, "chunk_summary": "The prompt defines character extraction rules using generic examples to distinguish between persistent visual variations and scene-specific states, with no actionable scenario pollution or brittle string patterns.", "duration_ms": 13139, "findings": [], "path": "prompts/_base/entity_extractor_v2/8.202605121200/turn2.md", "scan_kind": "prompt", "sha256": "a4177ce4a007861512d66ee9bdb9b69afea47ff818eeeddfb1cb1a1fb6f2b817"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 6, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 12919, "findings": [], "path": "prompts/_base/entity_extractor_v2/8.202605121200/turn4.md", "scan_kind": "prompt", "sha256": "704a66e992e6ebf7080c998f6de17f8fdec2576843e6ca5d321a0c8829256a17"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 29, "chunk_start": 1, "chunk_summary": "The prompt defines a template for extracting world-building and stylistic metadata from a scenario, using generic examples and conceptual instructions without brittle string patterns or scenario-specific pollution.", "duration_ms": 30114, "findings": [], "path": "prompts/_base/entity_extractor_v2/8.202605121200/turn0_style.md", "scan_kind": "prompt", "sha256": "31930e4a978832afdd7f6b7163943c8d9b891c897bc91adebf5959e74669d55b"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 24, "chunk_start": 1, "chunk_summary": "The prompt contains scenario-specific pollution in examples and uses closed lists of semantic states to instruct the LLM on filtering visual descriptions for T2I prompt generation.", "duration_ms": 33021, "findings": [{"category": "scenario_dependent_prompt", "evidence": "Set in near-future Korea.", "line_end": 8, "line_start": 8, "recommended_fix": "Replace concrete examples with abstract placeholders like 'Set in [Era], [Location].'", "severity": "P2", "why_problematic": "The use of a concrete location and era (Korea, near-future) as an example can bias the LLM's entity extraction and T2I prompt generation toward specific cultural and temporal tropes, even when the input scenario differs."}, {"category": "semantic_string_judgment", "evidence": "의상/복장/바디 묘사 절대 금지, 장식품(리본, 꽃 등), 상처/피/흙, 변장, 특수 메이크업, 폭발 후, 파괴된 상태, 파손, 분해", "line_end": 18, "line_start": 11, "recommended_fix": "Define 'permanent vs temporary' appearance using abstract semantic criteria or a structured classification schema rather than a list of specific visual examples.", "severity": "P1", "why_problematic": "The prompt instructs the LLM to perform semantic filtering of visual descriptions based on closed lists of temporary states or categories (e.g., wounds, blood, explosions). This creates brittle visual logic for defining 'permanent appearance' and directly mutates the generated T2I prompt content."}], "path": "prompts/_base/entity_extractor_v2/7.202605091845/turn_entity_detail.md", "scan_kind": "prompt", "sha256": "7fcf0fed915e4e24a917537c76cd1fab37f353037d84aa07f3c9a973d95db95b"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 10, "chunk_start": 1, "chunk_summary": "The prompt is a generic entity extraction instruction for characters, backgrounds, and objects without scenario-specific pollution or brittle classifier lists.", "duration_ms": 4838, "findings": [], "path": "prompts/_base/entity_extractor_v2/9.202605130226/turn1.md", "scan_kind": "prompt", "sha256": "131cd0d20ee7aa0f183c463e454de83adb772de2eca314edd6594972804f7b95"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 15, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 5084, "findings": [], "path": "prompts/_base/entity_extractor_v2/9.202605130226/turn0_style_schema.json", "scan_kind": "prompt", "sha256": "ddadc6b3ba3f79279dc52a9049e8bf5b1aff2e5a7b6b13d9090bcee9413c0f15"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 24, "chunk_start": 1, "chunk_summary": "The prompt defines entity extraction rules, including a requirement to classify and embed ethnicity information within a natural-language description field.", "duration_ms": 24924, "findings": [{"category": "llm_closed_list_instruction", "evidence": "반드시 국적 또는 인종(예: Korean, East Asian, South Asian, Black, White, Hispanic 등)을 description 첫 부분에 명시", "line_end": 13, "line_start": 13, "recommended_fix": "Define a structured 'ethnicity' field in the output schema with a canonical enum, and remove the requirement to embed this information in the 'description' string.", "severity": "P2", "why_problematic": "The prompt instructs the LLM to perform a semantic classification of ethnicity and embed the result as a string prefix within a natural-language field. This creates an overloaded semantic channel and encourages downstream code to use brittle string matching (e.g., checking if a description starts with 'Korean') instead of using a structured enum field."}], "path": "prompts/_base/entity_extractor_v2/8.202605121200/turn1_7_detail_batch.md", "scan_kind": "prompt", "sha256": "20e33cce20dc4a55dd7f6458de5911dfd80389064a09ead6ab27828fa13e54c1"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 10, "chunk_start": 1, "chunk_summary": "The prompt contains scenario-specific examples ('fire', 'destroyed') in a base entity extraction prompt, which may bias the LLM.", "duration_ms": 42100, "findings": [{"category": "scenario_dependent_prompt", "evidence": "상태 변화 (화재 이후/파괴된/정상)", "line_end": 9, "line_start": 9, "recommended_fix": "Replace scenario-specific examples with generic ones such as 'Clean/Dirty', 'Old/New', or 'Under construction', or use abstract placeholders to define the expected type of variation.", "severity": "P2", "why_problematic": "The inclusion of specific disaster-themed examples like 'fire' and 'destroyed' in a base prompt for entity extraction introduces scenario pollution. This biases the LLM toward specific story tropes and may cause it to overlook or misclassify other types of state changes in non-disaster scenarios."}], "path": "prompts/_base/entity_extractor_v2/7.202605091845/turn3.md", "scan_kind": "prompt", "sha256": "f757a7155f34670b5e6dafe6ac19be55de01cdcc65645990ab96036500746196"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 25, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 4451, "findings": [], "path": "prompts/_base/entity_extractor_v2/9.202605130226/turn1_7_detail_batch_schema.json", "scan_kind": "prompt", "sha256": "c37d0b2ad98d09e2aae9c14b59e27467caeee1af360f7ff6d6a1e7862e3dbeda"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 10, "chunk_start": 1, "chunk_summary": "The prompt chunk provides instructions for extracting and describing locations and their visual variations, using generic examples for time, weather, and state changes.", "duration_ms": 25433, "findings": [], "path": "prompts/_base/entity_extractor_v2/8.202605121200/turn3.md", "scan_kind": "prompt", "sha256": "f757a7155f34670b5e6dafe6ac19be55de01cdcc65645990ab96036500746196"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 137, "chunk_start": 1, "chunk_summary": "The prompt defines a strict controlled vocabulary for sub-space classification, forcing open-world scenario locations into a small set of hardcoded strings used for downstream background routing.", "duration_ms": 15136, "findings": [{"category": "llm_closed_list_instruction", "evidence": "allowed_space_keys 는 controlled vocab 안에서 선택: main / kitchen / rooftop / stairs / yard / exterior / office. ... 위 controlled vocab 밖 단어 사용 절대 금지.", "line_end": 101, "line_start": 97, "recommended_fix": "Allow the LLM to generate descriptive keys based on the scenario text (e.g., 'bedroom', 'bridge') or expand the controlled vocabulary to a comprehensive set of common architectural spaces. If a fixed list is required for downstream logic, move the mapping to a post-processing step rather than a hardcoded prompt constraint.", "severity": "P1", "why_problematic": "This instruction forces the LLM to map arbitrary scenario locations (e.g., bedroom, laboratory, cockpit) into a very limited set of hardcoded semantic categories. It acts as a brittle semantic classifier that limits the system's ability to handle diverse environments and forces lossy 'main' fallback for any non-matching space, which directly affects the deterministic background ID assignment mentioned in line 106."}], "path": "prompts/_base/entity_extractor_v2/9.202605130226/system.md", "scan_kind": "prompt", "sha256": "4c6ca2572963ae30038f2acd9e844dc18c96adf97ceab28cead3f90c4a8af01a"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 21, "chunk_start": 1, "chunk_summary": "The file defines a standard JSON schema for entity extraction and contains no actionable scenario pollution or brittle string-pattern debt.", "duration_ms": 9315, "findings": [], "path": "prompts/_base/entity_extractor_v2/9.202605130226/turn1_review_schema.json", "scan_kind": "prompt", "sha256": "8da829a58de03b15e392fe01e73b04699056e6dfe8aba79c77139d1a9f017dac"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 24, "chunk_start": 1, "chunk_summary": "The prompt defines extraction rules for characters, backgrounds, and objects with specific visual constraints, using generic placeholders for scenario content.", "duration_ms": 11135, "findings": [], "path": "prompts/_base/entity_extractor_v2/9.202605130226/turn1_7_detail_batch.md", "scan_kind": "prompt", "sha256": "20e33cce20dc4a55dd7f6458de5911dfd80389064a09ead6ab27828fa13e54c1"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 24, "chunk_start": 1, "chunk_summary": "The prompt defines structured extraction rules for entities, including specific T2I prompt templates and a metadata schema for locations that requires the LLM to classify space types.", "duration_ms": 27889, "findings": [{"category": "schema_or_enum_drift", "evidence": "metadata_json.location.space_profile ... single_space → ... multi_space → ...", "line_end": 24, "line_start": 21, "recommended_fix": "Define the space_profile schema and its allowed values in a central JSON schema or shared system prompt fragment, and refer to it by name rather than duplicating the structure and examples here.", "severity": "P2", "why_problematic": "The prompt defines a specific JSON schema and a closed list of semantic categories (single_space, multi_space) for location entities in prose. This creates a dependency where changes to the location model must be manually synchronized across prompts and downstream code that consumes this JSON, despite the prompt's own reference to a controlled vocabulary."}], "path": "prompts/_base/entity_extractor_v2/8.202605121200/turn_entity_detail.md", "scan_kind": "prompt", "sha256": "d4c294572b35a866ffe299f8953b53eab3b49bb77e1b9ad67d8bab1825468c9e"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 26, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 6008, "findings": [], "path": "prompts/_base/entity_extractor_v2/9.202605130226/turn_entity_detail.md", "scan_kind": "prompt", "sha256": "ec173df86b94c263a602aab6f01fd08b3b04afbda67b0ffdfe8a18ae0058482e"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 11, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 4435, "findings": [], "path": "prompts/_base/entity_filter/1.202603231200/system.md", "scan_kind": "prompt", "sha256": "53aee05e4629526ef24828309b54418651a936d050f46341f5f284738d48cb8b"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 21, "chunk_start": 1, "chunk_summary": "No actionable findings; the file is a standard JSON schema defining a technical output format for entity filtering decisions.", "duration_ms": 3956, "findings": [], "path": "prompts/_base/entity_filter/2.202603241900/filter_schema.json", "scan_kind": "prompt", "sha256": "b39d2cbda5ef947208d71bc9fae20381140fc1e695f6eff4894b4968dd23972e"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 6, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 9746, "findings": [], "path": "prompts/_base/entity_extractor_v2/9.202605130226/turn4.md", "scan_kind": "prompt", "sha256": "704a66e992e6ebf7080c998f6de17f8fdec2576843e6ca5d321a0c8829256a17"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 21, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 7535, "findings": [], "path": "prompts/_base/entity_filter/1.202603231200/filter_schema.json", "scan_kind": "prompt", "sha256": "b39d2cbda5ef947208d71bc9fae20381140fc1e695f6eff4894b4968dd23972e"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 29, "chunk_start": 1, "chunk_summary": "The prompt defines semantic rules for extracting physical presence from scenario tropes and includes culturally specific examples for world-building fields.", "duration_ms": 24742, "findings": [{"category": "llm_closed_list_instruction", "evidence": "visual_world_rules: \"이 인물이 이 장소에 물리적으로 존재하는가?\" ... 원격 접속/조종/빙의/텔레파시 ... 몽타주/교차편집", "line_end": 15, "line_start": 11, "recommended_fix": "Move physical presence logic to a structured entity state field in the schema and use a dedicated classifier or explicit scenario tags rather than extracting rules from prose.", "severity": "P1", "why_problematic": "The prompt uses a closed list of scenario tropes (remote access, possession, montage) as a semantic classifier to determine physical presence. This logic directly affects whether entities are rendered in images, making it a brittle natural-language routing mechanism that attempts to infer visual state from arbitrary prose."}, {"category": "scenario_dependent_prompt", "evidence": "조선시대, 한국 서울, 현대 한국 도시 + 미래 연구시설, 조선시대 한옥, 현대복 + 군복 + 미래 전투복", "line_end": 23, "line_start": 17, "recommended_fix": "Replace specific cultural and genre examples with abstract placeholders like [Era], [Location], or [Style Description] to maintain neutrality.", "severity": "P2", "why_problematic": "The prompt contains concrete, culturally specific examples (Joseon era, Seoul, specific SF/historical blends) that can bias the LLM's world-building extraction toward these tropes even when the input scenario is different."}], "path": "prompts/_base/entity_extractor_v2/9.202605130226/turn0_style.md", "scan_kind": "prompt", "sha256": "31930e4a978832afdd7f6b7163943c8d9b891c897bc91adebf5959e74669d55b"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 10, "chunk_start": 1, "chunk_summary": "The prompt provides instructions for extracting visual descriptions and state variations of locations using generic examples (time, weather, and physical state) without scenario-specific pollution.", "duration_ms": 15568, "findings": [], "path": "prompts/_base/entity_extractor_v2/9.202605130226/turn3.md", "scan_kind": "prompt", "sha256": "f757a7155f34670b5e6dafe6ac19be55de01cdcc65645990ab96036500746196"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 46, "chunk_start": 1, "chunk_summary": "No actionable findings; the file defines a clean technical schema for entity relations using abstract identifiers and canonical enums.", "duration_ms": 4217, "findings": [], "path": "prompts/_base/entity_relation/1.202603301200/analyze_schema.json", "scan_kind": "prompt", "sha256": "69d5ccded35446b0620cdc238849f916dcaf2af3e727bb19d7ff16f3404b2417"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 16, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 6440, "findings": [], "path": "prompts/_base/entity_relation/1.202603301200/analyze.md", "scan_kind": "prompt", "sha256": "5664dc626df722b9772b0979379d88ffe3e5b892f65446b529d6766e31674151"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 16, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 4226, "findings": [], "path": "prompts/_base/entity_relation/2.202603301800/analyze.md", "scan_kind": "prompt", "sha256": "f3b2328dfba03b6f04267beef2b5539c9a30f86420e5102efec2db90899d3cd2"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 46, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 3943, "findings": [], "path": "prompts/_base/entity_relation/2.202603301800/analyze_schema.json", "scan_kind": "prompt", "sha256": "69d5ccded35446b0620cdc238849f916dcaf2af3e727bb19d7ff16f3404b2417"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 14, "chunk_start": 1, "chunk_summary": "The prompt defines semantic boundaries for character visual variations using a closed list of allowed and forbidden states (e.g., age changes vs. injury/death), which acts as a semantic classifier for scenario extraction.", "duration_ms": 21758, "findings": [{"category": "llm_closed_list_instruction", "evidence": "허용: 20대→60대... 금지: 의상만 바뀌는 경우(군복/정장/일상복...), 부상/결박/사망 상태", "line_end": 11, "line_start": 10, "recommended_fix": "Define the 'visual variation' field's scope in the schema using more abstract criteria or move the filtering logic to a post-processing step that uses a canonical state vocabulary.", "severity": "P2", "why_problematic": "The prompt uses a closed list of semantic categories and examples to instruct the LLM on how to classify open-world scenario states into the 'visual variation' field. This creates a brittle semantic boundary where the LLM must map arbitrary scenario descriptions (e.g., 'unconscious', 'bleeding') to these specific Korean terms to decide on exclusion from the entity list."}], "path": "prompts/_base/entity_extractor_v2/9.202605130226/turn2.md", "scan_kind": "prompt", "sha256": "a4177ce4a007861512d66ee9bdb9b69afea47ff818eeeddfb1cb1a1fb6f2b817"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 44, "chunk_start": 1, "chunk_summary": "The system prompt defines the logic for identifying entity transformation relationships and visual similarity using generic examples without scenario-specific pollution or brittle string-matching instructions.", "duration_ms": 9976, "findings": [], "path": "prompts/_base/entity_relation/1.202603301200/system.md", "scan_kind": "prompt", "sha256": "fc32bbe39e98201c9ba341fcef4d6003368ba87a5188ee025ab80da40270c8f3"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 33, "chunk_start": 1, "chunk_summary": "No actionable findings; the file defines a generic JSON schema for entity review without scenario pollution or string-based routing logic.", "duration_ms": 5532, "findings": [], "path": "prompts/_base/entity_review_v4/2.202603241900/review_schema.json", "scan_kind": "prompt", "sha256": "55e73bd7e3dd1efee870cf537946cb63af4e55d8895223189d1d2c55de9e0afe"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 13, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 2616, "findings": [], "path": "prompts/_base/episode_summary/1.202603231200/summary_schema.json", "scan_kind": "prompt", "sha256": "58d2399111953754dbf3c5187e9d579ead0bed650918f7a7cc8b6f6352cef874"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 33, "chunk_start": 1, "chunk_summary": "The file is a structural JSON schema for entity review and contains no actionable scenario pollution or semantic string judgment logic.", "duration_ms": 8868, "findings": [], "path": "prompts/_base/entity_review_v4/1.202603231200/review_schema.json", "scan_kind": "prompt", "sha256": "55e73bd7e3dd1efee870cf537946cb63af4e55d8895223189d1d2c55de9e0afe"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 22, "chunk_start": 1, "chunk_summary": "The prompt defines generic semantic review criteria for an LLM to validate entity extraction without scenario-specific pollution or brittle phrase-matching instructions.", "duration_ms": 7771, "findings": [], "path": "prompts/_base/entity_review_v4/1.202603231200/system.md", "scan_kind": "prompt", "sha256": "c45a67bd6563029709396486050c5ba412f2cd670501af2e12b2db0fece380e1"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 10, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt provides generic instructions for episode summarization without scenario pollution or brittle semantic classifiers.", "duration_ms": 3119, "findings": [], "path": "prompts/_base/episode_summary/1.202603231200/system.md", "scan_kind": "prompt", "sha256": "f4083c07c91825326874ce1d0594b73c533d78c27367645c57c2e97ad7747c99"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 10, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 2909, "findings": [], "path": "prompts/_base/floor_plan_prompt/1.202604292033/schema.json", "scan_kind": "prompt", "sha256": "24ebabc439b7adf43a9118eea2a3ce90126a86500eb5b6f5055cdceb1b4c89d3"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 16, "chunk_start": 1, "chunk_summary": "No actionable findings; the file is a structural prompt template using abstract placeholders and section headers.", "duration_ms": 3781, "findings": [], "path": "prompts/_base/floor_plan_prompt/1.202604292033/user_template.md", "scan_kind": "prompt", "sha256": "ae084aafb17e4841c5337db4aa25779da32b6178dc178f1b893d12874c70fa85"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 16, "chunk_start": 1, "chunk_summary": "No actionable findings; the file is a clean template using abstract placeholders for floor plan generation.", "duration_ms": 3107, "findings": [], "path": "prompts/_base/floor_plan_prompt/2.202604300800/user_template.md", "scan_kind": "prompt", "sha256": "9f91dd418f0a7911ea52a92c3d4be17a502d4a685fe583064580181f0c08cc20"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 40, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 5101, "findings": [], "path": "prompts/_base/floor_plan_prompt/2.202604300800/schema.json", "scan_kind": "prompt", "sha256": "04c51854936287ed8a11d7b45f57302f64be4c75d63f95c6e09982a36ea3013c"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 16, "chunk_start": 1, "chunk_summary": "The prompt defines entity removal logic using a closed list of object types, creating a brittle semantic classifier for filtering scenario elements.", "duration_ms": 22027, "findings": [{"category": "llm_closed_list_instruction", "evidence": "수트, 우주복, 갑옷, 제복 ... 벽면 모니터, TV, CCTV", "line_end": 13, "line_start": 12, "recommended_fix": "Replace the category-based removal list with functional criteria that evaluate the entity's importance to the narrative and its need for visual consistency, regardless of whether it is worn or installed in the background.", "severity": "P1", "why_problematic": "The prompt uses a closed list of specific object types (wearables and background equipment) as a semantic classifier for entity removal. This instruction forces the LLM to filter out items based on their category rather than their narrative importance, which can lead to the loss of plot-critical props or unique costumes (e.g., a specific 'spacesuit' or 'wearable robot') that require visual consistency tracking."}], "path": "prompts/_base/entity_filter/2.202603241900/system.md", "scan_kind": "prompt", "sha256": "c502937d8bafd262fe82d98c0a41087574371cf06f88e5ed2744b3a9b90af225"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 16, "chunk_start": 1, "chunk_summary": "No actionable findings; the file is a clean prompt template using abstract placeholders for floor plan generation.", "duration_ms": 2898, "findings": [], "path": "prompts/_base/floor_plan_prompt/3.202604301041/user_template.md", "scan_kind": "prompt", "sha256": "9f91dd418f0a7911ea52a92c3d4be17a502d4a685fe583064580181f0c08cc20"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 54, "chunk_start": 1, "chunk_summary": "The system prompt defines the logic for identifying entity transformation relationships and visual similarity using generic tropes as examples, with no actionable scenario pollution or brittle string patterns found.", "duration_ms": 22034, "findings": [], "path": "prompts/_base/entity_relation/2.202603301800/system.md", "scan_kind": "prompt", "sha256": "225b2bec987546cf5149416899dcd85827092b1a01b343d38008a32537f2207b"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 40, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 6637, "findings": [], "path": "prompts/_base/floor_plan_prompt/4.202605091200/schema.json", "scan_kind": "prompt", "sha256": "02af9d1d07861c601f84f5725bc5aca93b2463cb0613c64829060b7566d13fcc"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 40, "chunk_start": 1, "chunk_summary": "The file defines a JSON schema for floor plan generation and contains no actionable semantic string debt or scenario pollution.", "duration_ms": 11363, "findings": [], "path": "prompts/_base/floor_plan_prompt/3.202604301041/schema.json", "scan_kind": "prompt", "sha256": "04c51854936287ed8a11d7b45f57302f64be4c75d63f95c6e09982a36ea3013c"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 20, "chunk_start": 1, "chunk_summary": "No actionable findings; the template contains only structural headers and placeholders for dynamic content without scenario pollution or semantic classifiers.", "duration_ms": 3303, "findings": [], "path": "prompts/_base/floor_plan_prompt/4.202605091200/user_template.md", "scan_kind": "prompt", "sha256": "24fd549170c03d3bc801c72186de5ecaebf9b39345023c6fb0c70f70c566f64e"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 2, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt contains generic instructions for camera viewpoint changes without scenario pollution or brittle semantic classifiers.", "duration_ms": 3792, "findings": [], "path": "prompts/_base/i2i_editor/v1/angle.md", "scan_kind": "prompt", "sha256": "6d01893a1b4001212ba3192514d3d21db01e0ec2c5b2fedbaadd06f34b50ff53"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 2, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt contains generic instructions for lighting and color editing without scenario pollution or brittle semantic classifiers.", "duration_ms": 3556, "findings": [], "path": "prompts/_base/i2i_editor/v1/color.md", "scan_kind": "prompt", "sha256": "6566ff7edea40ff41419f975dfeca8b024390da0af4b0d45326271d2404f0d60"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 2, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt uses generic instructions and placeholders without scenario-specific pollution or brittle semantic classifiers.", "duration_ms": 2448, "findings": [], "path": "prompts/_base/i2i_editor/v1/combined.md", "scan_kind": "prompt", "sha256": "357ff73d93ee627a8513cf2dbade17e136ecb55fcf3500c5968618a6790eb547"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 1, "chunk_start": 1, "chunk_summary": "No actionable findings; the file contains only a neutral template placeholder for composition notes.", "duration_ms": 2447, "findings": [], "path": "prompts/_base/i2i_editor/v1/composition.md", "scan_kind": "prompt", "sha256": "a456c0450d6fc79fc4f9ebc449f5efc0309a3a63294a4b1fffaf55fc2ce2e25a"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 25, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt is a technical PDF rendering validator using structured placeholders and generic quality criteria.", "duration_ms": 4248, "findings": [], "path": "prompts/_base/image_validation/v1/pdf_validation.md", "scan_kind": "prompt", "sha256": "b019a374ed74286a6f770532fc3904868d3c06362f0e6d0dc4834f1452789d0f"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 17, "chunk_start": 1, "chunk_summary": "The prompt defines a floor plan generation task with clear rules, but includes genre-specific examples that could bias the LLM.", "duration_ms": 25234, "findings": [{"category": "scenario_dependent_prompt", "evidence": "a curtain that hides a body, a broken window, a hidden compartment", "line_end": 11, "line_start": 11, "recommended_fix": "Use more neutral, architectural examples for plot-critical devices, such as 'a specific entry point, a line-of-sight obstruction, or a unique structural feature'.", "severity": "P2", "why_problematic": "These examples are concrete scenario fragments (thriller/mystery tropes) used to define 'plot-critical visual devices'. In a base prompt, such specific examples can bias the LLM toward certain narrative tones or types of props even when not present in the input spec."}], "path": "prompts/_base/floor_plan_prompt/1.202604292033/system.md", "scan_kind": "prompt", "sha256": "5f151416e85d57ef0a79f197fafe2c38c859147c147f522e0cae5cd47869d5aa"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 31, "chunk_start": 1, "chunk_summary": "The prompt is a generic template for image validation using placeholders and contains no actionable scenario pollution or brittle string-based semantic classifiers.", "duration_ms": 6263, "findings": [], "path": "prompts/_base/image_validation/v1/reference_validation.md", "scan_kind": "prompt", "sha256": "098f81bf8e1fe789d206376f8013e1dff3167be59281a019f0552ed592983e38"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 32, "chunk_start": 1, "chunk_summary": "The image validation prompt uses abstract placeholders and generic evaluation criteria without scenario-specific pollution or brittle string-based classification rules.", "duration_ms": 5383, "findings": [], "path": "prompts/_base/image_validation/v1/scene_validation.md", "scan_kind": "prompt", "sha256": "8d4f6bb07ebbe2010a82f1c2b68999c0798e8541eb9551cf057fd0820b22ef36"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 30, "chunk_start": 1, "chunk_summary": "No actionable findings; the file defines a clean technical schema for location consistency without scenario pollution or brittle string-based routing.", "duration_ms": 2912, "findings": [], "path": "prompts/_base/location_consistency/1.202604191800/location_schema.json", "scan_kind": "prompt", "sha256": "0dfe1cb0a807a863b3c4b4106189faf2c3b85869487137afd1fc010733d93807"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 23, "chunk_start": 1, "chunk_summary": "The prompt defines clear semantic criteria for reviewing entity extraction, using generic examples to clarify category boundaries without scenario-specific pollution or brittle string-matching debt.", "duration_ms": 34112, "findings": [], "path": "prompts/_base/entity_review_v4/2.202603241900/system.md", "scan_kind": "prompt", "sha256": "db2ea9b43f8e8540b07db86686f39774915fbee618e2df1464899e29710fd15f"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 30, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 4222, "findings": [], "path": "prompts/_base/location_consistency/2.202604201230/location_schema.json", "scan_kind": "prompt", "sha256": "0dfe1cb0a807a863b3c4b4106189faf2c3b85869487137afd1fc010733d93807"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 16, "chunk_start": 1, "chunk_summary": "No actionable findings; the file is a clean structural template for prompt assembly using abstract placeholders.", "duration_ms": 3071, "findings": [], "path": "prompts/_base/location_floor_plan/1.202604282315/user_template.md", "scan_kind": "prompt", "sha256": "52c648af4d8ed819db67381a00cd69591fd50cbb909508a45254cd9ae5e1cd9b"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 20, "chunk_start": 1, "chunk_summary": "No actionable findings; the template uses standard placeholders for prompt assembly without scenario pollution or semantic string classifiers.", "duration_ms": 3340, "findings": [], "path": "prompts/_base/location_floor_plan/2.202604290417/user_template.md", "scan_kind": "prompt", "sha256": "185416e92518bc46de8ab3040f5741f2784d86d504550c3f403ea8fcf4fbb7f3"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 19, "chunk_start": 1, "chunk_summary": "The prompt defines a closed-list semantic classifier for architectural elements and establishes a natural-language contract for encoding entity-to-camera relationships in prose.", "duration_ms": 33914, "findings": [{"category": "llm_closed_list_instruction", "evidence": "category (furniture | opening | prop | plot_device | area)", "line_end": 14, "line_start": 14, "recommended_fix": "Ensure these categories are defined in a central schema enum and passed to the prompt as a variable to prevent drift.", "severity": "P2", "why_problematic": "The LLM is instructed to classify open-world objects into a closed set of semantic categories. This creates a brittle mapping that may not cover all architectural or plot-critical elements and often drifts from the underlying schema if not centrally managed."}, {"category": "semantic_string_judgment", "evidence": "camera_position (use number references like \"near number 1 (entrance)... \"), framing_notes (e.g., \"include numbers 2 and 3 prominently...\")", "line_end": 15, "line_start": 15, "recommended_fix": "Add a structured field such as `visible_element_ids: number[]` or `proximal_element_ids: number[]` to the `camera_recommendations` object to explicitly track these relationships without parsing prose.", "severity": "P1", "why_problematic": "This establishes a contract where semantic entity-to-camera relationships (proximity, visibility) are encoded in natural language prose. Downstream background prompts or logic must use brittle string parsing (e.g., regex for 'number X') to identify which floor plan elements are relevant to a specific shot."}], "path": "prompts/_base/floor_plan_prompt/2.202604300800/system.md", "scan_kind": "prompt", "sha256": "b068125361cdcf434bffec5ed542e8d58f307483052d002978bcfe6f0be4b095"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 21, "chunk_start": 1, "chunk_summary": "No actionable findings; the file is a generic prompt template using placeholders for location-specific data without hardcoded scenario pollution or semantic string classifiers.", "duration_ms": 4391, "findings": [], "path": "prompts/_base/location_floor_plan/3.202604291130/user_template.md", "scan_kind": "prompt", "sha256": "a6d1b2b598c4c2b0e799aefe808989b056f7d062c3fdda8e63da08f1a901313b"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 13, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt uses abstract placeholders and generic instructions for entity evaluation without scenario pollution or brittle string-based classification.", "duration_ms": 4431, "findings": [], "path": "prompts/_base/lvm_prompts/1.202603171237/entity_list_review.md", "scan_kind": "prompt", "sha256": "faa1bb90cce5cdb8933ee4266e9cf6c9716b25526e5b1d9f664a5712dce776af"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 7, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt is a generic template for image comparison using abstract placeholders.", "duration_ms": 3795, "findings": [], "path": "prompts/_base/lvm_prompts/1.202603171237/ref_comparison.md", "scan_kind": "prompt", "sha256": "74f4922d2868aa0aad4ec036f7de04a65df68ebfdabdcd89c74e89d37b80e014"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 22, "chunk_start": 1, "chunk_summary": "The prompt defines a floor plan generation logic that includes a semantic color mapping for room types, concrete cultural/era-specific prop examples, and a closed list of element categories in prose.", "duration_ms": 43697, "findings": [{"category": "llm_closed_list_instruction", "evidence": "living = pale yellow, bedroom = pale blue, kitchen = pale green, bathroom = pale cyan, rooftop = pale gray, hallway = pale beige", "line_end": 10, "line_start": 10, "recommended_fix": "Define a canonical mapping of zone types to colors in a shared configuration or schema, and instruct the LLM to use that mapping rather than providing examples in the system prompt.", "severity": "P2", "why_problematic": "The prompt provides a specific mapping of room types to colors as examples. This encourages the LLM to act as a semantic classifier for visual zones based on a limited list, which can lead to inconsistent or missing styling for room types not explicitly mentioned."}, {"category": "scenario_dependent_prompt", "evidence": "low ondol-friendly bed vs western mattress; wall-mounted air-con position; built-in wardrobe on a specific wall", "line_end": 16, "line_start": 16, "recommended_fix": "Replace specific prop examples with abstract categories of layout considerations, such as 'heating-related furniture placement' or 'utility-dependent appliance positioning'.", "severity": "P2", "why_problematic": "The prompt uses concrete cultural (ondol) and era-specific (air-con) props as examples for layout derivation. These specific examples can bias the LLM's output toward these contexts even when the input scenario is unrelated (e.g., a fantasy or historical setting)."}, {"category": "schema_or_enum_drift", "evidence": "category (furniture | opening | prop | plot_device | area)", "line_end": 17, "line_start": 17, "recommended_fix": "Ensure these categories are defined as a formal enum in the JSON schema and referenced in the prompt, rather than being listed as a string-based contract in the prose.", "severity": "P2", "why_problematic": "The prompt defines a closed list of semantic categories for output elements in prose. This creates a risk of drift if the downstream code or validation logic expects these exact strings but the formal schema does not enforce them."}], "path": "prompts/_base/floor_plan_prompt/3.202604301041/system.md", "scan_kind": "prompt", "sha256": "f3659020522811a95bb5f005c9b011c8f259ab8f8d70eabd644e971289f0ef2e"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 19, "chunk_start": 1, "chunk_summary": "The prompt relies on a specific string-tagging convention to identify architectural zones, creating a brittle link between scenario text and visual output.", "duration_ms": 22939, "findings": [{"category": "llm_closed_list_instruction", "evidence": "Identify zone markers (e.g., '/거실', '/안방', '/욕실', '/현관', '/욕조')", "line_end": 17, "line_start": 17, "recommended_fix": "Use a structured input format for zones and locations instead of asking the LLM to parse them from tagged natural language.", "severity": "P1", "why_problematic": "The prompt instructs the LLM to use a specific slash-prefixed string pattern to classify text as zones. This is a brittle semantic classifier that depends on the scenario text following a specific, non-standard tagging format."}], "path": "prompts/_base/location_floor_plan/1.202604282315/system.md", "scan_kind": "prompt", "sha256": "f2895d8f6b572c7000a49a0c2856b3d012fb2200b01c7a45b47199ba02ffe354"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 6, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt is a minimal validation template with a generic severity enum and no scenario-specific pollution or brittle string-pattern instructions.", "duration_ms": 7413, "findings": [], "path": "prompts/_base/lvm_prompts/1.202603171237/scene_validation.md", "scan_kind": "prompt", "sha256": "60e8bb1165578f128c64bd51de2961cb530a36879448e594ff0c02fb35a18235"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 76, "chunk_start": 1, "chunk_summary": "The prompt defines a workflow for generating fixed location descriptions to be blindly inserted into downstream T2I prompts and uses specific scenario examples (fishing boats, specific dimensions) that may bias generation.", "duration_ms": 32322, "findings": [{"category": "blind_string_mutation", "evidence": "이 문장은 나중에 scene_detail이 t2i_prompt에 그대로 삽입하므로", "line_end": 11, "line_start": 11, "recommended_fix": "Pass the fixed visual description as a structured reference to the downstream LLM rather than instructing it to perform a blind string insertion.", "severity": "P1", "why_problematic": "This instruction establishes a contract for blind string mutation where a generated description is spliced into a downstream prompt. This prevents the downstream generator from adapting the location details to the specific context of a scene, leading to potential visual contradictions or poor prompt integration."}, {"category": "scenario_dependent_prompt", "evidence": "A small wooden fishing boat approximately 8 meters long... a traditional Korean fishing village harbor", "line_end": 59, "line_start": 39, "recommended_fix": "Replace specific scenario examples with more diverse or abstract templates (e.g., 'A [size] [material] [object]...') to minimize thematic bias.", "severity": "P2", "why_problematic": "The prompt uses concrete, culturally specific examples (fishing boats, Korean villages) and specific dimensions (8 meters, 4-meter-wide) to illustrate rules. These specific details can leak into the LLM's internal state and bias descriptions for unrelated scenarios."}], "path": "prompts/_base/location_consistency/1.202604191800/system.md", "scan_kind": "prompt", "sha256": "54341c9189416c3745aee10fa57b7dd3a964539231568d82d57eb0d28d110fe4"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 9, "chunk_start": 1, "chunk_summary": "The prompt is a generic template for scene improvement suggestions and does not contain scenario-specific pollution or brittle semantic string classifiers.", "duration_ms": 9945, "findings": [], "path": "prompts/_base/lvm_prompts/1.202603171237/scene_improvement.md", "scan_kind": "prompt", "sha256": "47016bfe812a928a17935a6973a90ef4cedde87782855e4a7777b443f7efac0e"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 21, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt provides generic instructions for camera and color variations using technical thresholds and descriptive examples without scenario pollution or brittle string-based classification.", "duration_ms": 5105, "findings": [], "path": "prompts/_base/lvm_prompts/2.202603181600/combined_variation_recommend.md", "scan_kind": "prompt", "sha256": "efd98deb1306e35699ea3f18691be3a7af0aed9db01cbc68e475a20aad937b05"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 92, "chunk_start": 1, "chunk_summary": "The prompt defines a workflow for generating consistent location descriptions to be blindly inserted into T2I prompts, using semantic filtering instructions and concrete examples.", "duration_ms": 36862, "findings": [{"category": "blind_string_mutation", "evidence": "이 문장은 나중에 scene_detail이 t2i_prompt에 그대로 삽입하므로 ... 영어로 작성 (T2I 프롬프트에 직접 삽입)", "line_end": 34, "line_start": 11, "recommended_fix": "Instead of blind insertion of prose, use a structured representation of location attributes that the downstream component can compose safely, or use a template-based approach with validated slots.", "severity": "P1", "why_problematic": "The prompt establishes a contract for blind string insertion of LLM-generated natural language prose into a downstream T2I prompt. This is fragile as any failure in the LLM's filtering logic will pollute the final image generation prompt with inconsistent or unwanted elements across an entire episode."}, {"category": "llm_closed_list_instruction", "evidence": "절대 포함 금지 — 환경 상태는 씬마다 달라짐 ... 이 문장에 날씨·조명·인물이 섞여 있는가? — YES라면 그 부분만 삭제", "line_end": 83, "line_start": 23, "recommended_fix": "Define the 'fixed' attributes of a location in a structured schema (e.g., materials, architecture_style, layout) and have the LLM populate those fields, rather than asking it to filter a natural language description.", "severity": "P1", "why_problematic": "The prompt instructs the LLM to act as a semantic classifier and filter, stripping out open-world concepts (weather, lighting, characters, etc.) based on a closed list of categories. This relies on the LLM's ability to correctly categorize arbitrary prose into these buckets to maintain 'location consistency' through string manipulation."}, {"category": "scenario_dependent_prompt", "evidence": "A compact one-room apartment with faded wallpaper and a worn linoleum floor ... utility pole wrapped with tangled wires", "line_end": 57, "line_start": 43, "recommended_fix": "Use more abstract or diverse examples, or replace specific props with placeholders like [material] or [specific_prop] to demonstrate the desired level of detail without biasing the content.", "severity": "P2", "why_problematic": "The examples contain concrete, specific props and architectural details (faded wallpaper, linoleum, utility poles) that are not abstract placeholders. These can bias the LLM towards specific urban/contemporary styles even when the target scenario is different (e.g., sci-fi or historical)."}], "path": "prompts/_base/location_consistency/2.202604201230/system.md", "scan_kind": "prompt", "sha256": "dcac2b2e414a6c2561a116c4c282f6c435b823785ea9f2f1b808241c949a7645"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 32, "chunk_start": 1, "chunk_summary": "The prompt instructs the LLM to use specific string patterns (Korean room names with a '/' prefix) to identify zones in a screenplay for floor plan generation.", "duration_ms": 33371, "findings": [{"category": "llm_closed_list_instruction", "evidence": "Identify zone markers (e.g., '/거실', '/안방', '/욕실', '/현관', '/욕조').", "line_end": 17, "line_start": 17, "recommended_fix": "Broaden the instruction to identify all rooms, zones, and locations mentioned in the screenplay text based on narrative context, and treat the provided markers as optional formatting hints rather than the primary identification method.", "severity": "P2", "why_problematic": "The instruction defines a specific string pattern (prefixing with '/') and a list of examples to identify semantic zones. This encourages the LLM to rely on brittle string matching rather than natural language understanding to determine the floor plan's components, potentially missing rooms not explicitly marked or named in the list."}], "path": "prompts/_base/location_floor_plan/2.202604290417/system.md", "scan_kind": "prompt", "sha256": "0e29ae369c44852e40fb9138334d3cc728b77a3b7769311438ede5edd0a58da5"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 13, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt uses generic placeholders and requests numerical semantic evaluations without scenario pollution or brittle phrase-based classification.", "duration_ms": 5403, "findings": [], "path": "prompts/_base/lvm_prompts/2.202603181600/entity_list_review.md", "scan_kind": "prompt", "sha256": "faa1bb90cce5cdb8933ee4266e9cf6c9716b25526e5b1d9f664a5712dce776af"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 7, "chunk_start": 1, "chunk_summary": "No actionable findings. This is a generic image comparison prompt using standard placeholders for entity names and descriptions.", "duration_ms": 3250, "findings": [], "path": "prompts/_base/lvm_prompts/2.202603181600/ref_comparison.md", "scan_kind": "prompt", "sha256": "74f4922d2868aa0aad4ec036f7de04a65df68ebfdabdcd89c74e89d37b80e014"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 15, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt is a generic image selection instruction using abstract placeholders.", "duration_ms": 3094, "findings": [], "path": "prompts/_base/lvm_prompts/2.202603181600/representative_selection.md", "scan_kind": "prompt", "sha256": "16f2201dc8e1f0ec994f05f5a8a99e4b207d1c72b6dba3f6a81cd11a4286deb1"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 15, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt is a generic template for image selection using abstract placeholders.", "duration_ms": 3383, "findings": [], "path": "prompts/_base/lvm_prompts/2.202603181600/select_best_from_n.md", "scan_kind": "prompt", "sha256": "c52da2d988be52a70cabaa7ae292b92c39a8af82c949d6436036518382f56312"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 10, "chunk_start": 1, "chunk_summary": "The prompt defines a closed-list semantic classifier for visual consistency validation with inline natural language descriptions, which risks schema drift and parsing errors.", "duration_ms": 22421, "findings": [{"category": "schema_or_enum_drift", "evidence": "심각도: ok(문제없음), minor(사소한 차이), severe(핵심 누락/완전 다름)", "line_end": 9, "line_start": 9, "recommended_fix": "Define the allowed values as a strict enum in a JSON schema and move the natural language descriptions to the schema's 'description' field or a separate mapping section.", "severity": "P2", "why_problematic": "The prompt defines classification labels (ok, minor, severe) alongside natural language descriptions in parentheses. This often causes LLMs to include the descriptions in the output, leading to parsing failures if downstream code expects exact enum values. It also creates a synchronization burden between prompt prose and code-side enums."}], "path": "prompts/_base/lvm_prompts/1.202603171237/ref_validation.md", "scan_kind": "prompt", "sha256": "6e3007c24428e687f7c021d1e52c72f7e3b7d7e9ca16f8a6331d8bafacff148d"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 10, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 8006, "findings": [], "path": "prompts/_base/lvm_prompts/2.202603181600/ref_validation.md", "scan_kind": "prompt", "sha256": "6e3007c24428e687f7c021d1e52c72f7e3b7d7e9ca16f8a6331d8bafacff148d"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 6, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt is a generic validation template using placeholders and standard severity categories.", "duration_ms": 5866, "findings": [], "path": "prompts/_base/lvm_prompts/2.202603181600/scene_validation.md", "scan_kind": "prompt", "sha256": "60e8bb1165578f128c64bd51de2961cb530a36879448e594ff0c02fb35a18235"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 9, "chunk_start": 1, "chunk_summary": "The prompt provides a generic template for scene improvement suggestions without scenario-specific pollution or brittle semantic classifiers.", "duration_ms": 9333, "findings": [], "path": "prompts/_base/lvm_prompts/2.202603181600/scene_improvement.md", "scan_kind": "prompt", "sha256": "47016bfe812a928a17935a6973a90ef4cedde87782855e4a7777b443f7efac0e"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 21, "chunk_start": 1, "chunk_summary": "No actionable findings; the file defines a standard JSON schema for outlook extraction without scenario pollution or semantic string classifiers.", "duration_ms": 3740, "findings": [], "path": "prompts/_base/outlook_extractor/10.202603261238/phase1_schema.json", "scan_kind": "prompt", "sha256": "01de295c7851c67c107173d035a66f6924bc68c75d337d3ff0e40f0b615bdef2"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 30, "chunk_start": 1, "chunk_summary": "No actionable findings; the file defines a generic JSON schema for scene-based character outlook assignments without scenario-specific pollution or semantic string classifiers.", "duration_ms": 3017, "findings": [], "path": "prompts/_base/outlook_extractor/10.202603261238/phase2_schema.json", "scan_kind": "prompt", "sha256": "8a04dc55d45f18285fbdb8278835e42d5843596c2bc30b11b3f515faa06d5320"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 20, "chunk_start": 1, "chunk_summary": "No actionable findings; the file defines a technical schema for merging outlook IDs without scenario pollution or semantic string judgment.", "duration_ms": 2678, "findings": [], "path": "prompts/_base/outlook_extractor/10.202603261238/phase3_schema.json", "scan_kind": "prompt", "sha256": "9bdc26765a90a101a0a2ff5fab9eb155074a9d87e4fe8423725dd20e5b40a407"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 20, "chunk_start": 1, "chunk_summary": "The prompt contains scenario-specific examples for outfit changes that may bias the model towards specific genres.", "duration_ms": 14628, "findings": [{"category": "scenario_dependent_prompt", "evidence": "평상복→전투복, 정장→피의갑옷", "line_end": 13, "line_start": 13, "recommended_fix": "Replace scenario-specific examples with generic placeholders or neutral descriptions like 'Casual -> Formal' or 'Outfit A -> Outfit B'.", "severity": "P2", "why_problematic": "The examples 'battle suit' (전투복) and 'blood armor' (피의갑옷) are concrete, genre-specific props that introduce scenario pollution into a base prompt, potentially biasing the LLM towards fantasy or action contexts during outfit extraction."}], "path": "prompts/_base/outlook_extractor/10.202603261238/phase2.md", "scan_kind": "prompt", "sha256": "ab29270ff877404cc1711b09caed2caf843d6303155edc72b088c8bbc469c4f2"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 28, "chunk_start": 1, "chunk_summary": "The prompt defines rules for extracting character outfits (outlooks) and classifying humanoid vs. non-humanoid entities using generic examples and instructions without scenario-specific pollution.", "duration_ms": 8682, "findings": [], "path": "prompts/_base/outlook_extractor/11.202603311724/phase1.md", "scan_kind": "prompt", "sha256": "48204c280029e2dbd933775dd1b7e23fa8e9c3fda4c2cc85e10d6e1ad7722129"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 12, "chunk_start": 1, "chunk_summary": "The prompt contains scenario-specific examples (historical Korean outfits) that may bias the LLM's deduplication logic.", "duration_ms": 14568, "findings": [{"category": "scenario_dependent_prompt", "evidence": "\"고급선비복1\"과 \"고급선비복2\"", "line_end": 6, "line_start": 6, "recommended_fix": "Replace the specific outfit names with abstract placeholders such as \"의상 A\" and \"의상 B\" or generic descriptions like \"검은색 정장\".", "severity": "P2", "why_problematic": "The prompt uses culturally and era-specific prop names (Joseon-era scholar outfits) as examples for merging logic. This introduces scenario pollution into a base prompt, potentially biasing the LLM toward specific historical tropes or naming conventions during the outlook extraction phase."}], "path": "prompts/_base/outlook_extractor/10.202603261238/phase3.md", "scan_kind": "prompt", "sha256": "0690187a6e667049b629b4b5163ca8b2718054926527bc4801d09e335c9a3e29"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 26, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 5492, "findings": [], "path": "prompts/_base/outlook_extractor/11.202603311724/phase1_schema.json", "scan_kind": "prompt", "sha256": "49051b17ad03146b26c180d6b869ece95dcd8d935ce4bfd51ac744ebfe1e4bfb"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 12, "chunk_start": 1, "chunk_summary": "The prompt contains culturally specific examples (Joseon Dynasty, Hanok, Hanbok) that may bias the LLM's style extraction for arbitrary scenarios.", "duration_ms": 22063, "findings": [{"category": "scenario_dependent_prompt", "evidence": "조선시대, 한국/일본/미국, 한옥, 한복", "line_end": 9, "line_start": 5, "recommended_fix": "Replace culturally specific examples with abstract placeholders or a broader range of non-specific examples (e.g., 'Historical period', 'Specific region', 'Traditional architecture') to ensure the prompt remains scenario-agnostic.", "severity": "P2", "why_problematic": "The prompt includes specific cultural, historical, and geographical examples (Joseon Dynasty, Korea/Japan/USA, Hanok, Hanbok) to illustrate style categories. These concrete examples can bias the LLM towards Korean-specific tropes or the listed countries even when the input scenario belongs to a different cultural or historical context."}], "path": "prompts/_base/lvm_prompts/2.202603181600/style_rules_generator.md", "scan_kind": "prompt", "sha256": "9dc1d0c61bafa3e4f35794acc15a8a7069158f6300d5e2595127209ffab2be2a"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 19, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 22400, "findings": [], "path": "prompts/_base/outlook_extractor/10.202603261238/phase1.md", "scan_kind": "prompt", "sha256": "f9abba86c86814378083ce2f9e4073c09952a439ed6bdf1b604a0e242cce0582"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 30, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 4454, "findings": [], "path": "prompts/_base/outlook_extractor/11.202603311724/phase2_schema.json", "scan_kind": "prompt", "sha256": "8a04dc55d45f18285fbdb8278835e42d5843596c2bc30b11b3f515faa06d5320"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 20, "chunk_start": 1, "chunk_summary": "No actionable findings; the file is a standard JSON schema for entity merging and does not contain scenario pollution or brittle string-based semantic classifiers.", "duration_ms": 3182, "findings": [], "path": "prompts/_base/outlook_extractor/11.202603311724/phase3_schema.json", "scan_kind": "prompt", "sha256": "9bdc26765a90a101a0a2ff5fab9eb155074a9d87e4fe8423725dd20e5b40a407"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 21, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 2945, "findings": [], "path": "prompts/_base/outlook_extractor/9.202603261200/phase1_schema.json", "scan_kind": "prompt", "sha256": "01de295c7851c67c107173d035a66f6924bc68c75d337d3ff0e40f0b615bdef2"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 30, "chunk_start": 1, "chunk_summary": "No actionable findings; the file defines a standard technical JSON schema for scene-to-outlook assignments without scenario pollution or brittle string classifiers.", "duration_ms": 3488, "findings": [], "path": "prompts/_base/outlook_extractor/9.202603261200/phase2_schema.json", "scan_kind": "prompt", "sha256": "8a04dc55d45f18285fbdb8278835e42d5843596c2bc30b11b3f515faa06d5320"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 12, "chunk_start": 1, "chunk_summary": "The prompt contains culturally and historically specific examples that bias the style extraction process.", "duration_ms": 43420, "findings": [{"category": "scenario_dependent_prompt", "evidence": "조선시대, 한옥, 한복, 한국/일본/미국", "line_end": 9, "line_start": 5, "recommended_fix": "Replace specific cultural and historical examples with abstract categories or a more diverse set of global examples (e.g., 'Historical/Modern/Future', 'Traditional/Modern/Industrial', 'Regional/Global').", "severity": "P2", "why_problematic": "The prompt uses culturally and historically specific examples (Joseon Dynasty, Hanok, Hanbok, and specific countries) to guide the LLM's extraction of style rules. This introduces bias towards these specific settings and can lead to skewed extractions when processing scenarios from other cultures or eras."}], "path": "prompts/_base/lvm_prompts/1.202603171237/style_rules_generator.md", "scan_kind": "prompt", "sha256": "9dc1d0c61bafa3e4f35794acc15a8a7069158f6300d5e2595127209ffab2be2a"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 56, "chunk_start": 1, "chunk_summary": "No actionable findings; the file defines a structural JSON schema for outlook extraction without scenario pollution or semantic string patterns.", "duration_ms": 2766, "findings": [], "path": "prompts/_base/outlook_extractor/9.202603261200/phase3_schema.json", "scan_kind": "prompt", "sha256": "be91c2bae2ecb2851d75f91167b8e9575c7fc770afc7ea60f75ddea3e3440000"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 20, "chunk_start": 1, "chunk_summary": "The prompt defines rules for mapping characters to outfits (outlooks) across scenes, including continuity and handling of transitions, but contains scenario-specific examples in the base prompt.", "duration_ms": 18575, "findings": [{"category": "scenario_dependent_prompt", "evidence": "변신, 갑옷 착용, 피의갑옷", "line_end": 13, "line_start": 12, "recommended_fix": "Use more neutral examples for outfit changes, such as '환복' (changing clothes) or '의상 교체' (outfit swap), and use generic placeholders like '의상A→의상B' in examples.", "severity": "P2", "why_problematic": "The prompt uses genre-specific terms like 'transformation' (변신), 'wearing armor' (갑옷 착용), and 'blood armor' (피의갑옷) as examples in a base prompt. This introduces scenario pollution that may bias the LLM when extracting outlooks for non-fantasy/action genres."}], "path": "prompts/_base/outlook_extractor/11.202603311724/phase2.md", "scan_kind": "prompt", "sha256": "ab29270ff877404cc1711b09caed2caf843d6303155edc72b088c8bbc469c4f2"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 12, "chunk_start": 1, "chunk_summary": "The prompt contains a scenario-specific example (Korean historical outfit) in a base instruction for outlook merging.", "duration_ms": 15986, "findings": [{"category": "scenario_dependent_prompt", "evidence": "\"고급선비복1\"과 \"고급선비복2\"", "line_end": 6, "line_start": 6, "recommended_fix": "Replace the specific example with generic placeholders such as 'Outfit A' and 'Outfit B' or neutral descriptions.", "severity": "P2", "why_problematic": "The prompt uses a culturally and era-specific trope (Korean historical scholar outfit) as a concrete example for a general merging rule. This can bias the LLM's semantic judgment toward specific genres or naming patterns instead of remaining scenario-agnostic."}], "path": "prompts/_base/outlook_extractor/11.202603311724/phase3.md", "scan_kind": "prompt", "sha256": "0690187a6e667049b629b4b5163ca8b2718054926527bc4801d09e335c9a3e29"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 25, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 3330, "findings": [], "path": "prompts/_base/pdf_validation/v1/validate.md", "scan_kind": "prompt", "sha256": "9d9d162a76c35ddaa16838e139091f919d987a92e1182e122eb4df0cdabe6035"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 25, "chunk_start": 1, "chunk_summary": "No actionable findings; the file is a standard JSON schema defining the structure for an entity-merging task without scenario pollution or brittle logic.", "duration_ms": 6735, "findings": [], "path": "prompts/_base/outlook_merger/1.202603181600/merge_schema.json", "scan_kind": "prompt", "sha256": "835ea63b756fdce3248a67fc051e1aacd8811d452701f11e3d9e144aabe225f6"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 19, "chunk_start": 1, "chunk_summary": "The prompt defines rules for extracting character outfits (outlooks) from scene text, using generic examples for naming conventions and category definitions without scenario-specific pollution or brittle classifiers.", "duration_ms": 22975, "findings": [], "path": "prompts/_base/outlook_extractor/9.202603261200/phase1.md", "scan_kind": "prompt", "sha256": "f9abba86c86814378083ce2f9e4073c09952a439ed6bdf1b604a0e242cce0582"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 14, "chunk_start": 1, "chunk_summary": "The prompt contains a scenario-specific example for outfit merging which introduces concrete prop pollution into a base template.", "duration_ms": 16987, "findings": [{"category": "scenario_dependent_prompt", "evidence": "\"서바이벌강하복1\", \"서바이벌강하복2\" → \"서바이벌강하복\"", "line_end": 6, "line_start": 6, "recommended_fix": "Replace the concrete example with abstract placeholders such as '의상A_1', '의상A_2' → '의상A' to maintain genre neutrality.", "severity": "P2", "why_problematic": "The use of '서바이벌강하복' (Survival Descent Suit) as a concrete example in a base prompt introduces scenario-specific prop and genre pollution. This can bias the LLM's naming and merging logic toward specific action/sci-fi tropes even when processing unrelated scenarios."}], "path": "prompts/_base/outlook_extractor/9.202603261200/phase3.md", "scan_kind": "prompt", "sha256": "77883baa6d063a0f1679a5c5dc272a3f609cae813bb5e7e0f6d54b3f452029e8"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 17, "chunk_start": 1, "chunk_summary": "The prompt provides instructions for merging similar outfit descriptions extracted from a scenario, using generic examples to illustrate the merging logic without introducing significant scenario pollution or brittle classifiers.", "duration_ms": 15957, "findings": [], "path": "prompts/_base/outlook_merger/1.202603181600/merge_prompt.md", "scan_kind": "prompt", "sha256": "3b42b60b6cf26bf9282f7c7135092786ea5e997dd5aa59daefccbed9f28fbe5b"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 20, "chunk_start": 1, "chunk_summary": "The prompt contains a closed-list semantic classifier for character presence and scenario-specific prop examples in a base extraction prompt.", "duration_ms": 24489, "findings": [{"category": "llm_closed_list_instruction", "evidence": "V.O./회상/이름만 언급: 배정 안 함", "line_end": 9, "line_start": 9, "recommended_fix": "Define 'presence' conceptually or provide a broader set of criteria that allows the LLM to reason about narrative presence rather than relying on a fixed list of terms.", "severity": "P2", "why_problematic": "The prompt instructs the LLM to classify character presence (an open-world semantic state) based on a closed list of phrases or technical terms found in the scene text, which can lead to incorrect exclusions if the scenario uses different terminology."}, {"category": "scenario_dependent_prompt", "evidence": "피의갑옷, 서바이벌강하복", "line_end": 20, "line_start": 13, "recommended_fix": "Replace scenario-specific examples with generic placeholders or neutral examples such as 'Outfit A', 'Uniform', or 'Casual Wear'.", "severity": "P2", "why_problematic": "Concrete, genre-specific prop names like 'Blood Armor' (피의갑옷) and 'Survival Descent Suit' (서바이벌강하복) are used as examples in a base prompt. This scenario pollution can bias the LLM's extraction and naming logic when processing unrelated stories or genres."}], "path": "prompts/_base/outlook_extractor/9.202603261200/phase2.md", "scan_kind": "prompt", "sha256": "aba028e413d24a48508ed7e0912e00a615f328a6366058441d4271dcd17b4287"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 14, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt template uses generic variables and style instructions without scenario-specific pollution or brittle string-based classification logic.", "duration_ms": 6232, "findings": [], "path": "prompts/_base/prompt_sanitizer/2.202605112104/sanitize_user.md", "scan_kind": "prompt", "sha256": "4de9dd0cf185502515fa684b3626a5c6f6f6307fe93f82afeb8bd71d620c04ec"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 12, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 5271, "findings": [], "path": "prompts/_base/prompt_sanitizer/v1/sanitize_user.md", "scan_kind": "prompt", "sha256": "a1b96732cc3eb249d20a5f0e1acb08fd9f9c678cad239bb56b1553d66d49d2f3"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 22, "chunk_start": 1, "chunk_summary": "The prompt defines high-level safety sanitization rules and cinematic strategies for an LLM without scenario-specific pollution or brittle string-matching instructions.", "duration_ms": 13547, "findings": [], "path": "prompts/_base/prompt_sanitizer/2.202605112104/sanitize_system.md", "scan_kind": "prompt", "sha256": "17c143e448fdb4c639dd0247291e118d2113f293264fa84374356bde2837e650"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 38, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt uses abstract placeholders and general instructions for screenplay-to-webbook conversion without scenario pollution or brittle semantic classifiers.", "duration_ms": 4708, "findings": [], "path": "prompts/_base/prototype_prompts/v5/webbook_package_system.md", "scan_kind": "prompt", "sha256": "b1e04c9474a0c6e0ab2a5b39aeaf146327b75f3028f7a3d347ebcfd1f25c1284"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 27, "chunk_start": 1, "chunk_summary": "The prompt defines a hardcoded visual vocabulary for floor plan generation, mapping semantic room and object types to specific colors and geometric shapes, and includes scenario-specific cultural examples.", "duration_ms": 119818, "findings": [{"category": "llm_closed_list_instruction", "evidence": "living = pale yellow, bedroom = pale blue, kitchen = pale green, bathroom = pale cyan, rooftop = pale gray, hallway = pale beige... bed = rectangle with pillow shape; sofa = long rectangle with cushion division; table = simple rectangle/square; door = arc with line indicating swing; window = double parallel line in the wall; sink/toilet = standard plan symbols.", "line_end": 13, "line_start": 10, "recommended_fix": "Move the visual vocabulary mapping (room-to-color and object-to-glyph) to a configuration object or schema injected into the prompt, allowing for scenario-specific or project-wide overrides.", "severity": "P1", "why_problematic": "These instructions hardcode a visual vocabulary (colors and geometric descriptions) for open-world room and object types. This forces the LLM to perform semantic classification against a closed list of visual representations, which may not scale to all scenarios or may conflict with project-specific visual world rules."}, {"category": "scenario_dependent_prompt", "evidence": "low ondol-friendly bed vs western mattress; wall-mounted air-con position; built-in wardrobe on a specific wall", "line_end": 16, "line_start": 16, "recommended_fix": "Replace concrete examples with abstract placeholders or a more diverse set of examples covering multiple eras and cultures.", "severity": "P2", "why_problematic": "The prompt contains concrete cultural (ondol) and technological (air-con) examples in its instructions for layout derivation. These specific props can bias the LLM's generation toward certain eras or regions even when the input scenario is different."}], "path": "prompts/_base/floor_plan_prompt/4.202605091200/system.md", "scan_kind": "prompt", "sha256": "1e45ff82cbc1142f00b2266b10463053527018ab613418ae63664c0eea5182c3"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 17, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt uses technical placeholders and structural constraints without scenario pollution or semantic string classifiers.", "duration_ms": 2731, "findings": [], "path": "prompts/_base/prototype_prompts/v5/webbook_package_user.md", "scan_kind": "prompt", "sha256": "a35629eff8d74c1a488eed4c798f51baf6f6515b07fab60dc6a4bba3e3f7d36b"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 35, "chunk_start": 1, "chunk_summary": "The prompt contains hardcoded scenario-specific constraints regarding location and prop types that bias the generation toward a specific project setting.", "duration_ms": 14253, "findings": [{"category": "scenario_dependent_prompt", "evidence": "grounded in contemporary / near-future Korea ... modern military, police, industrial, or biotech equipment ... No full-body power armor, spacesuit styling, or giant mecha", "line_end": 33, "line_start": 31, "recommended_fix": "Move project-specific setting and prop constraints into the {world_guide_block} or a separate project-level configuration file rather than hardcoding them in the base scene generation prompt.", "severity": "P2", "why_problematic": "The base prompt template hardcodes specific geographic (Korea), temporal (near-future), and prop-related (military/biotech) constraints. This creates scenario pollution that biases the model's output regardless of the provided world_guide_block, making the prompt less reusable and prone to era/style drift."}], "path": "prompts/_base/prototype_prompts/v5/scene_image_en.md", "scan_kind": "prompt", "sha256": "1ded398a2364fa4ecdd726b2b72fd37a35a84585bbf63d922c4a834a9f508b37"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 10, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt uses standard template placeholders for screenplay text and structured entity data without scenario pollution or semantic string classifiers.", "duration_ms": 2841, "findings": [], "path": "prompts/_base/prototype_prompts/v5/world_guide_user.md", "scan_kind": "prompt", "sha256": "6c27670e4e60de172f1da34b632be5f1d4606a6a515538f7d30c4a783c6ae254"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 39, "chunk_start": 1, "chunk_summary": "The prompt contains concrete cultural and genre-specific constraints that pollute the neutral reference generation process with a modern Korean bias.", "duration_ms": 15675, "findings": [{"category": "scenario_dependent_prompt", "evidence": "Korean baseline clothing ... Do not introduce historical, fantasy, medieval, retro-period-drama, or space-opera styling", "line_end": 33, "line_start": 27, "recommended_fix": "Remove the specific 'Korean' and genre-exclusion constraints from the base template. Move these requirements into the {world_guide_block} or a scenario-specific configuration layer to maintain template neutrality.", "severity": "P2", "why_problematic": "These instructions hardcode a specific cultural (Korean) and temporal (present-day) setting as the 'neutral' baseline for character references. This biases the generation of reference images for entities that should belong to other cultures or genres, creating scenario pollution in a base template that is intended to be general-purpose."}], "path": "prompts/_base/prototype_prompts/v5/entity_reference_en.md", "scan_kind": "prompt", "sha256": "88e2a055fbe72109535dcdcc5c516b99339a06e6ebb5211307e468da3027bd8d"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 35, "chunk_start": 1, "chunk_summary": "The prompt contains hardcoded scenario-specific constraints regarding cultural setting (Korea), time period (near-future), and prohibited genres (fantasy/historical), which biases the model against arbitrary scenarios.", "duration_ms": 12673, "findings": [{"category": "scenario_dependent_prompt", "evidence": "동시대~근미래 한국 기준... 사극풍 복식, 판타지 갑옷, 중세풍 건축 금지... 현대 군/경/산업 장비... 전신 파워아머... 과장하지 마라", "line_end": 33, "line_start": 31, "recommended_fix": "Abstract these constraints into the {world_guide_block} or a project-specific configuration variable to ensure the base prompt remains scenario-agnostic.", "severity": "P2", "why_problematic": "These lines hardcode a specific cultural and technological setting (modern/near-future Korea) and explicitly forbid other genres. This creates scenario pollution in a base prototype prompt, biasing the LLM's output for any story that does not fit this specific project's world-building."}], "path": "prompts/_base/prototype_prompts/v5/scene_image_ko.md", "scan_kind": "prompt", "sha256": "76781a6c81543b313343d3964890b0c9df81054cef0d8ce037f506775a459cde"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 13, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 8981, "findings": [], "path": "prompts/_base/prototype_prompts/v5/world_guide_system.md", "scan_kind": "prompt", "sha256": "f9f3714fdc78cbaf9a47a07de2f660fae5c0d7624fc76da6b704dcf1225b9367"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 35, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt uses generic template placeholders and high-level instructions without scenario-specific pollution or brittle string-based classification.", "duration_ms": 3726, "findings": [], "path": "prompts/_base/prototype_prompts/v6/scene_image_en.md", "scan_kind": "prompt", "sha256": "2adf71a7a20b598f7b06cb3ebb722461096b0712528958ffc094969bea97334f"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 39, "chunk_start": 1, "chunk_summary": "The prompt contains scenario-specific pollution that biases 'neutral' reference images toward a modern Korean setting while explicitly banning historical and fantasy genres.", "duration_ms": 19874, "findings": [{"category": "scenario_dependent_prompt", "evidence": "현대 한국/근미래 한국 기준의 현실적 기본 복장 ... 사극, 전통 복식, 중세풍, 판타지풍 ... 금지", "line_end": 33, "line_start": 27, "recommended_fix": "Replace specific cultural and genre anchors with abstract requirements for neutrality, such as 'standard attire consistent with the entity's world' and 'avoidance of temporary action-oriented details' without naming specific genres.", "severity": "P2", "why_problematic": "The prompt defines 'neutrality' by anchoring it to a specific culture (Korea) and era (Modern/Near-future), while explicitly banning genres like fantasy or historical. This creates a conflict when the entity being described belongs to one of the banned or non-Korean categories, leading to identity drift in the reference image."}], "path": "prompts/_base/prototype_prompts/v5/entity_reference_ko.md", "scan_kind": "prompt", "sha256": "46e14a175f56e3c153c4f3b04175d7de656d0253b4f2deb12ecb3675d3efc15a"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 39, "chunk_start": 1, "chunk_summary": "The prompt file is a generic template for generating master reference images and contains no actionable scenario pollution or brittle string-based semantic classifiers.", "duration_ms": 5337, "findings": [], "path": "prompts/_base/prototype_prompts/v6/entity_reference_ko.md", "scan_kind": "prompt", "sha256": "4d0f13798cf679e4da2a7a1e53b67e2ae30417f7f6c809ee20fd9b08e6365eed"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 17, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt uses abstract placeholders and technical constraints without scenario pollution or brittle string classifiers.", "duration_ms": 2752, "findings": [], "path": "prompts/_base/prototype_prompts/v6/webbook_package_user.md", "scan_kind": "prompt", "sha256": "a35629eff8d74c1a488eed4c798f51baf6f6515b07fab60dc6a4bba3e3f7d36b"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 35, "chunk_start": 1, "chunk_summary": "The prompt file is a clean template for generating cinematic still frames using abstract placeholders and general visual constraints without scenario-specific pollution or brittle string classifiers.", "duration_ms": 6386, "findings": [], "path": "prompts/_base/prototype_prompts/v6/scene_image_ko.md", "scan_kind": "prompt", "sha256": "c6b8d05d47015dc2db303e2254036ba3dc9b22a567c2007451277c661ff4daf0"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 38, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt contains general instructions for screenplay-to-webbook conversion without scenario-specific pollution or brittle semantic classifiers.", "duration_ms": 3613, "findings": [], "path": "prompts/_base/prototype_prompts/v6/webbook_package_system.md", "scan_kind": "prompt", "sha256": "b1e04c9474a0c6e0ab2a5b39aeaf146327b75f3028f7a3d347ebcfd1f25c1284"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 10, "chunk_start": 1, "chunk_summary": "No actionable findings; this chunk contains only generic template placeholders for screenplay text and structured entity/scene data.", "duration_ms": 2942, "findings": [], "path": "prompts/_base/prototype_prompts/v6/world_guide_user.md", "scan_kind": "prompt", "sha256": "6c27670e4e60de172f1da34b632be5f1d4606a6a515538f7d30c4a783c6ae254"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 39, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt uses abstract placeholders and generic neutralization instructions for reference image generation without scenario pollution or brittle semantic classifiers.", "duration_ms": 8850, "findings": [], "path": "prompts/_base/prototype_prompts/v6/entity_reference_en.md", "scan_kind": "prompt", "sha256": "a86a3734594989c6084e1a0f643246debcac5472a018817841d9554657c979fb"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 50, "chunk_start": 1, "chunk_summary": "The prompt instructs the LLM to derive architectural floor plans from screenplay text using specific Korean phrase lists as semantic classifiers for room separation and movement.", "duration_ms": 108706, "findings": [{"category": "llm_closed_list_instruction", "evidence": "Cues to look for: ... 거실/안방, 부엌/거실 ... 문을 열고 들어간다 ... 거실에서 안방으로", "line_end": 25, "line_start": 22, "recommended_fix": "Generalize the instruction to identify spatial transitions and room labels based on the linguistic context of the screenplay language (Korean) without relying on a hardcoded list of phrases.", "severity": "P1", "why_problematic": "The prompt defines spatial layout logic (room separation and movement) using a brittle list of Korean keywords and phrases as semantic classifiers. This biases the LLM to only recognize these specific patterns when inferring the physical structure of a location."}, {"category": "scenario_dependent_prompt", "evidence": "옥탑방 안 / 실내, 한옥 / 안방 / 마루", "line_end": 31, "line_start": 31, "recommended_fix": "Use generic placeholders or universal architectural examples (e.g., 'Living Room / Kitchen') to illustrate the zone separation logic.", "severity": "P2", "why_problematic": "The prompt uses specific Korean architectural tropes (Rooftop room, Hanok) as concrete examples for a general structural parsing rule (slash-separated zones). This can bias the LLM's interpretation of other locations toward these specific scenario types."}], "path": "prompts/_base/location_floor_plan/3.202604291130/system.md", "scan_kind": "prompt", "sha256": "208e9e78602d9642b375b7b6f086358d66e257241d1746f0c4a6c39765678f8f"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 3, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt contains generic style and framing instructions for a character reference image without scenario-specific pollution or semantic classifiers.", "duration_ms": 3036, "findings": [], "path": "prompts/_base/ref_image_prompts/3.202603251000/character_ref.md", "scan_kind": "prompt", "sha256": "7f328187b3c69cbebb4f4d54618c277db4de6e57a6871ee0719466835de39850"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 13, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt contains generic instructions for character reference composition without scenario-specific pollution or brittle semantic classifiers.", "duration_ms": 3617, "findings": [], "path": "prompts/_base/ref_image_prompts/3.202603251000/character_composite_ref.md", "scan_kind": "prompt", "sha256": "1ff2430c6dff64ca7d0b38d86dd2e771730f9d564687e1912f29a1a00b488f11"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 8, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt is a generic template for generating outfit reference images using a faceless mannequin and contains no scenario-specific pollution or semantic classifiers.", "duration_ms": 4102, "findings": [], "path": "prompts/_base/ref_image_prompts/3.202603251000/character_outlook_ref.md", "scan_kind": "prompt", "sha256": "f93899b1d747cfb84a6fa406c96bde322a8dc169753caa941c5fc9f05ed51841"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 13, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt provides generic instructions for world guide extraction without scenario-specific pollution or brittle semantic classifiers.", "duration_ms": 6542, "findings": [], "path": "prompts/_base/prototype_prompts/v6/world_guide_system.md", "scan_kind": "prompt", "sha256": "f9f3714fdc78cbaf9a47a07de2f660fae5c0d7624fc76da6b704dcf1225b9367"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 3, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 3267, "findings": [], "path": "prompts/_base/ref_image_prompts/3.202603251000/location_ref.md", "scan_kind": "prompt", "sha256": "14f532450163d0f3614444db153de40238ed1f3e7bdd29e8aa9da03cdc847877"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 3, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt template uses generic style and framing instructions for reference image generation without scenario-specific pollution.", "duration_ms": 3730, "findings": [], "path": "prompts/_base/ref_image_prompts/3.202603251000/prop_ref.md", "scan_kind": "prompt", "sha256": "4305658f5e64b21a7f6bcc6dd3f6a0ec50b6ae41216538f50f53dd6f2308adee"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 3, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt contains generic style instructions for character reference generation without scenario-specific pollution.", "duration_ms": 3533, "findings": [], "path": "prompts/_base/ref_image_prompts/4.202603251000/character_ref.md", "scan_kind": "prompt", "sha256": "7f328187b3c69cbebb4f4d54618c277db4de6e57a6871ee0719466835de39850"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 3, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt uses generic cinematic instructions and placeholders for location reference generation.", "duration_ms": 3239, "findings": [], "path": "prompts/_base/ref_image_prompts/4.202603251000/location_ref.md", "scan_kind": "prompt", "sha256": "14f532450163d0f3614444db153de40238ed1f3e7bdd29e8aa9da03cdc847877"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 8, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt is a generic template for generating character outfit reference images using a mannequin silhouette.", "duration_ms": 4585, "findings": [], "path": "prompts/_base/ref_image_prompts/4.202603251000/character_outlook_ref.md", "scan_kind": "prompt", "sha256": "1f4d53da286be8d0cfa12102a8dda75cb9b1c8b6865009ba9dc62e497d2f88d8"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 13, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt contains generic instructions for character identity preservation and outfit assembly without scenario-specific pollution or brittle string-based classifiers.", "duration_ms": 3701, "findings": [], "path": "prompts/_base/ref_image_prompts/5.202603311724/character_composite_ref.md", "scan_kind": "prompt", "sha256": "1ff2430c6dff64ca7d0b38d86dd2e771730f9d564687e1912f29a1a00b488f11"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 3, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt uses generic style instructions and abstract placeholders for reference image generation.", "duration_ms": 3145, "findings": [], "path": "prompts/_base/ref_image_prompts/5.202603311724/character_nonhuman_ref.md", "scan_kind": "prompt", "sha256": "518f894d7739cb187f56faef754c7a7c2d9da76c8477ab65696587cf0db3d2ea"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 3, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt contains generic visual formatting instructions for reference image generation without scenario-specific pollution or semantic classifiers.", "duration_ms": 2641, "findings": [], "path": "prompts/_base/ref_image_prompts/5.202603311724/character_ref.md", "scan_kind": "prompt", "sha256": "7f328187b3c69cbebb4f4d54618c277db4de6e57a6871ee0719466835de39850"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 8, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt is a generic template for generating reference images of character outfits using a placeholder.", "duration_ms": 3218, "findings": [], "path": "prompts/_base/ref_image_prompts/5.202603311724/character_outlook_ref.md", "scan_kind": "prompt", "sha256": "1f4d53da286be8d0cfa12102a8dda75cb9b1c8b6865009ba9dc62e497d2f88d8"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 7, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt contains generic style and technical constraints for character reference generation without scenario-specific pollution.", "duration_ms": 3223, "findings": [], "path": "prompts/_base/reference_image/v2/character.md", "scan_kind": "prompt", "sha256": "9d7757060aa0cbfbc2408aeda2adae376e1d58f7e9d7cfb3b5f74132c5cec25f"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 3, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt contains generic cinematic instructions and placeholders for location reference generation without scenario-specific pollution.", "duration_ms": 4159, "findings": [], "path": "prompts/_base/ref_image_prompts/5.202603311724/location_ref.md", "scan_kind": "prompt", "sha256": "14f532450163d0f3614444db153de40238ed1f3e7bdd29e8aa9da03cdc847877"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 5, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt contains generic technical requirements for reference image generation without scenario-specific pollution or semantic classifiers.", "duration_ms": 2647, "findings": [], "path": "prompts/_base/reference_image/v2/prop.md", "scan_kind": "prompt", "sha256": "08fb9724dc164c07eab250dedca7aa2dab98fc423ac93e7117eb081e841ec9ca"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 4, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt contains only generic cinematic style requirements for location reference generation.", "duration_ms": 3320, "findings": [], "path": "prompts/_base/reference_image/v2/location.md", "scan_kind": "prompt", "sha256": "7daeb117ff2abbcb571480b1732b2029018afd0e3860c12594126cda8ca977bf"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 22, "chunk_start": 1, "chunk_summary": "The prompt defines a closed list of safety categories and specific visual mutation rules, which acts as a hardcoded semantic classifier for open-world scenario content.", "duration_ms": 41800, "findings": [{"category": "llm_closed_list_instruction", "evidence": "안전 정책 가이드라인: - 폭력: ... - 무기: ... - 선정성: ... - 부상/피: ... - 아동: ...", "line_end": 15, "line_start": 11, "recommended_fix": "Externalize the safety policy and transformation rules into a structured configuration or dynamic context provided at runtime, rather than hardcoding specific semantic mappings in the system prompt.", "severity": "P1", "why_problematic": "The prompt instructs the LLM to classify open-world scenario content into five hardcoded safety categories and applies fixed visual transformation rules for each. This creates a brittle semantic mapping that is difficult to maintain and synchronize with evolving safety policies or diverse scenario requirements."}, {"category": "scenario_dependent_prompt", "evidence": "attempt 1 — film_previs ... attempt 2 — movie_poster ... attempt 3 — aftermath", "line_end": 20, "line_start": 18, "recommended_fix": "Generalize the rewriting strategies or allow them to be passed as parameters that match the input scenario's original style.", "severity": "P2", "why_problematic": "These specific style and narrative strategies (previs, poster, aftermath) bias the LLM's output towards cinematic tropes, which may conflict with the original scenario's intended style or context, such as documentary or casual photography."}], "path": "prompts/_base/prompt_sanitizer/v1/sanitize_system.md", "scan_kind": "prompt", "sha256": "17c143e448fdb4c639dd0247291e118d2113f293264fa84374356bde2837e650"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 13, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 13711, "findings": [], "path": "prompts/_base/ref_image_prompts/4.202603251000/character_composite_ref.md", "scan_kind": "prompt", "sha256": "1ff2430c6dff64ca7d0b38d86dd2e771730f9d564687e1912f29a1a00b488f11"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 20, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt uses abstract placeholders and provides structural instructions for camera flow design without scenario pollution or semantic classifiers.", "duration_ms": 4489, "findings": [], "path": "prompts/_base/scene_camera_flow/1.202604151200/user.md", "scan_kind": "prompt", "sha256": "6d6e0061c6631cf1db76c4e0831e52959f7eda479298f97c828de753a3172f43"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 9, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt is a generic template for cinematography analysis using placeholders for shot types and scene data.", "duration_ms": 6282, "findings": [], "path": "prompts/_base/scene_cinematography/1.202603220900/analyze.md", "scan_kind": "prompt", "sha256": "482dfcb55b770b0b32561abda374cfcb0306d0652aa34485e4bb09bfba29e564"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 14, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt defines generic cinematography principles and selection logic without scenario-specific pollution or brittle string-based classifiers.", "duration_ms": 4945, "findings": [], "path": "prompts/_base/scene_cinematography/1.202603220900/system.md", "scan_kind": "prompt", "sha256": "22f708173255c6b6c5b03f6995a1c2b63ccf0d4839148350389b9909ae158d95"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 71, "chunk_start": 1, "chunk_summary": "The schema defines a structured camera flow sequence using standard cinematic enums and technical identifiers without scenario-specific pollution or brittle string-parsing instructions.", "duration_ms": 11439, "findings": [], "path": "prompts/_base/scene_camera_flow/1.202604151200/schema.json", "scan_kind": "prompt", "sha256": "8134593afd3332f3ede702bc020080e923df57687494bb925daca4e03ba4bea6"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 10, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt is a generic template for cinematography analysis using placeholders for shot types and scene data.", "duration_ms": 7430, "findings": [], "path": "prompts/_base/scene_cinematography/2.202603261200/analyze.md", "scan_kind": "prompt", "sha256": "2987558190f17242230fe12709790c5bccacbbacea85014b42b7c68bc7ff5a94"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 9, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt defines general cinematography principles and narrative arcs without scenario-specific pollution or brittle string-based classification.", "duration_ms": 6382, "findings": [], "path": "prompts/_base/scene_cinematography/2.202603261200/system.md", "scan_kind": "prompt", "sha256": "ff95f90509cddeb6ef28b086c8031d53de8a82d1ed47f54425be940b14b471d9"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 31, "chunk_start": 1, "chunk_summary": "The JSON schema defines a generic structure for cinematography analysis without scenario-specific pollution or brittle string-matching logic.", "duration_ms": 8508, "findings": [], "path": "prompts/_base/scene_cinematography/2.202603261200/analyze_schema.json", "scan_kind": "prompt", "sha256": "7dcd5d06779d8bccedb0dcacafb62cc991250e4290a9fec810e23bd9f57d2709"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 24, "chunk_start": 1, "chunk_summary": "The JSON schema defines a structured output for cinematography analysis with no scenario-specific pollution or brittle string-based logic.", "duration_ms": 13284, "findings": [], "path": "prompts/_base/scene_cinematography/1.202603220900/analyze_schema.json", "scan_kind": "prompt", "sha256": "bd44a09a6ee15d0b867c039ad378c8e6b24beb2cb7142dfa70d79baeb5966c78"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 7, "chunk_start": 1, "chunk_summary": "The prompt uses a closed list of prop examples and body parts to guide the LLM in classifying objects and determining visual composition.", "duration_ms": 26387, "findings": [{"category": "llm_closed_list_instruction", "evidence": "e.g. earring, necklace, bracelet, mask, weapon held in hand, shoulder armor, backpack ... ear, neck, wrist, face, hand, shoulder, torso ... e.g. chair, sword on display, book, bottle", "line_end": 5, "line_start": 3, "recommended_fix": "Use a structured field in the input schema to specify the prop's mounting type or category, rather than relying on example-based classification within the prompt.", "severity": "P2", "why_problematic": "The prompt uses a closed list of examples to define semantic categories ('worn/held' vs 'freestanding') and visual routing (silhouette inclusion). This biases the LLM towards the provided examples and creates a brittle classification mechanism for open-world prop descriptions that may fail for unlisted items like belts or anklets."}], "path": "prompts/_base/ref_image_prompts/4.202603251000/prop_ref.md", "scan_kind": "prompt", "sha256": "ea474ced47b0bb5b61ada88f2dc9cbe3d0143c1cbd7baa4e6d2599c065f7a2b0"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 7, "chunk_start": 1, "chunk_summary": "The prompt defines a conditional visual composition rule for prop reference images using a closed list of body parts for silhouettes, which is insufficient for open-world prop variety.", "duration_ms": 27532, "findings": [{"category": "llm_closed_list_instruction", "evidence": "ONLY the relevant body part (ear, neck, wrist, face, hand, shoulder, torso)", "line_end": 3, "line_start": 3, "recommended_fix": "Allow the LLM to dynamically determine the relevant body part based on the prop's description or provide a comprehensive anatomical list including waist, feet, and fingers.", "severity": "P2", "why_problematic": "The prompt instructs the LLM to classify props into a fixed set of body-part silhouettes for visual context. This closed list acts as a semantic filter but lacks coverage for common open-world items like footwear (feet), belts (waist), or rings (fingers), making the generation logic brittle for arbitrary props."}], "path": "prompts/_base/ref_image_prompts/5.202603311724/prop_ref.md", "scan_kind": "prompt", "sha256": "ea474ced47b0bb5b61ada88f2dc9cbe3d0143c1cbd7baa4e6d2599c065f7a2b0"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 51, "chunk_start": 1, "chunk_summary": "The prompt defines closed-list semantic classifiers for camera motion and flow position, mapping open-world scene descriptions to fixed technical categories.", "duration_ms": 26298, "findings": [{"category": "llm_closed_list_instruction", "evidence": "flow_position: `start` / `mid` / `end` / `transition`, stage_label: establishing / approach / ..., camera_motion: `static` / ... / `cut` 중 하나", "line_end": 37, "line_start": 26, "recommended_fix": "Define these values as formal enums in the JSON schema to ensure validation and reduce drift between the prompt instructions and the data structure.", "severity": "P2", "why_problematic": "The prompt requires the LLM to classify open-world visual movement and shot roles into a closed set of string constants. This creates a brittle semantic contract where the LLM must map natural language descriptions to specific tokens, which are likely used for downstream routing or T2I prompt generation."}], "path": "prompts/_base/scene_camera_flow/1.202604151200/system.md", "scan_kind": "prompt", "sha256": "3b1aa48396d082998f7497297cec0373f590df708ca47ccf6be4e61ecda3f483"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 47, "chunk_start": 1, "chunk_summary": "The schema defines a structure for scene consistency analysis, but contains a concrete scenario-specific example in a field description.", "duration_ms": 18767, "findings": [{"category": "scenario_dependent_prompt", "evidence": "dead_woman_by_door", "line_end": 19, "line_start": 19, "recommended_fix": "Replace the concrete example with a generic placeholder like 'character_outfit' or 'room_background'.", "severity": "P2", "why_problematic": "The example provided for 'element_id' contains a specific scenario (a dead person, a specific gender, and a location) which can bias the LLM towards specific narrative tropes or styles when generating IDs for arbitrary scenes."}], "path": "prompts/_base/scene_consistency/2.202604141200/schema.json", "scan_kind": "prompt", "sha256": "834cc0117e8d30afba5a1204654588e23fa28bbce4f73df08d3c488176d4a7a6"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 47, "chunk_start": 1, "chunk_summary": "The schema defines a structured output for scene consistency analysis, but includes a concrete scenario-specific example in the element_id description.", "duration_ms": 16903, "findings": [{"category": "scenario_dependent_prompt", "evidence": "e.g. dead_woman_by_door", "line_end": 20, "line_start": 17, "recommended_fix": "Use a neutral placeholder such as 'character_a_outfit' or 'background_object_id'.", "severity": "P2", "why_problematic": "The example 'dead_woman_by_door' is a concrete scenario fragment (a specific state and location) rather than a neutral placeholder. This can bias the LLM toward specific narrative styles or naming patterns in unrelated scenarios."}], "path": "prompts/_base/scene_consistency/4.202604201700/schema.json", "scan_kind": "prompt", "sha256": "35bcd8c77e2050e60acfff9d844acd82843d3cb086fcff698995f4c878f2d77e"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 47, "chunk_start": 1, "chunk_summary": "The schema defines a structured output for scene consistency analysis but includes a concrete, scenario-specific example in a field description that could bias LLM generation.", "duration_ms": 18896, "findings": [{"category": "scenario_dependent_prompt", "evidence": "e.g. dead_woman_by_door", "line_end": 19, "line_start": 19, "recommended_fix": "Replace the concrete example with a neutral, abstract placeholder such as 'character_a_outfit' or 'living_room_background'.", "severity": "P2", "why_problematic": "The example 'dead_woman_by_door' is a concrete scenario fragment (specific state, character, and location) used in a base schema. This can bias the LLM toward specific genres or morbid themes and encourages packing semantic details into the ID rather than using neutral identifiers."}], "path": "prompts/_base/scene_consistency/3.202604201230/schema.json", "scan_kind": "prompt", "sha256": "834cc0117e8d30afba5a1204654588e23fa28bbce4f73df08d3c488176d4a7a6"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 113, "chunk_start": 1, "chunk_summary": "The system prompt contains instructions for the LLM to perform semantic classification of visual framing using a closed list of keywords and includes concrete scenario pollution in its examples.", "duration_ms": 18720, "findings": [{"category": "llm_closed_list_instruction", "evidence": "camera_direction / character_angles를 기준으로 각 샷의 지배적 프레이밍을 판정하세요: ... close-up / tight on / focus on body part / detail shot", "line_end": 35, "line_start": 30, "recommended_fix": "Instead of keyword-based classification in the prompt, provide a structured framing field in the input schema or use a more robust semantic analysis that does not rely on a closed list of strings.", "severity": "P1", "why_problematic": "The prompt instructs the LLM to act as a semantic classifier for visual framing based on a brittle list of specific keywords. This classification directly controls the logic for splitting character states and applying them to shots, making the pipeline sensitive to the exact phrasing used in shot descriptions."}, {"category": "scenario_dependent_prompt", "evidence": "씬 S12에 민숙(사망, C04)이 등장... dead_minsook_full... A middle-aged Korean woman...", "line_end": 79, "line_start": 46, "recommended_fix": "Replace concrete names and IDs with abstract placeholders like 'Character A', 'Scene S1', and 'C01', and use more neutral visual examples.", "severity": "P2", "why_problematic": "The example uses concrete scenario data including a specific character name (민숙), scene ID (S12), entity ID (C04), and specific visual/narrative details (deceased woman on wooden floor). This scenario pollution can bias the LLM's generation for arbitrary future scenarios."}], "path": "prompts/_base/scene_consistency/4.202604201700/system.md", "scan_kind": "prompt", "sha256": "17a4798addf9d8b671d8aca45e21c8c9a260333dd4a69937d091033a1a643c5f"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 12, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 4657, "findings": [], "path": "prompts/_base/scene_dependency/1.202603190100/extract_prompt.md", "scan_kind": "prompt", "sha256": "7283c1cf8f1869e92e03a88eca50f64809c22ddad437009ad8a979b83092ee62"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 21, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 2314, "findings": [], "path": "prompts/_base/scene_dependency/1.202603190100/extract_schema.json", "scan_kind": "prompt", "sha256": "901fb2eb5e6bdab9e25969c92d0207320c831646aad33e31fd4bc70198c58ce1"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 70, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 12038, "findings": [], "path": "prompts/_base/scene_consistency/6.202605031033/schema.json", "scan_kind": "prompt", "sha256": "4aeb529eb7dec036534313f38b8689cbb6406faca3398a3b4f331c6fc36ee4d7"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 21, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 3538, "findings": [], "path": "prompts/_base/scene_dependency/2.202603231200/dependency_schema.json", "scan_kind": "prompt", "sha256": "cd033d882c36acc4f4081a37502bdb92e428c7b1abddfff641a06e6b977256f6"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 19, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 4617, "findings": [], "path": "prompts/_base/scene_dependency/2.202603231200/system.md", "scan_kind": "prompt", "sha256": "2e112b49c795f09b9a51f8dc95403637964474f450422e339d52b8604c08cd43"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 52, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 7884, "findings": [], "path": "prompts/_base/scene_detail/10.202604301430/detail_schema.json", "scan_kind": "prompt", "sha256": "7b30ebe26e94189a1d2dd6d1afed295c041efc40cc2671a688a265d65301117e"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 47, "chunk_start": 1, "chunk_summary": "The schema defines the structure for scene consistency analysis, including a concrete scenario-specific example in a field description.", "duration_ms": 25950, "findings": [{"category": "scenario_dependent_prompt", "evidence": "dead_woman_by_door", "line_end": 19, "line_start": 19, "recommended_fix": "Replace the concrete example with an abstract placeholder like 'character_a_state' or 'main_prop_id'.", "severity": "P2", "why_problematic": "The example 'dead_woman_by_door' is a concrete scenario-specific identifier that can bias the LLM towards specific story tropes (e.g., crime/thriller) instead of remaining scenario-neutral."}], "path": "prompts/_base/scene_consistency/5.202605021400/schema.json", "scan_kind": "prompt", "sha256": "35bcd8c77e2050e60acfff9d844acd82843d3cb086fcff698995f4c878f2d77e"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 52, "chunk_start": 1, "chunk_summary": "The schema defines structured fields for scene details using abstract technical identifiers (C01, P01, L01) and standard cinematic enums, with no actionable scenario pollution or brittle semantic string judgment.", "duration_ms": 8146, "findings": [], "path": "prompts/_base/scene_detail/11.202604301730/detail_schema.json", "scan_kind": "prompt", "sha256": "7b30ebe26e94189a1d2dd6d1afed295c041efc40cc2671a688a265d65301117e"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 155, "chunk_start": 1, "chunk_summary": "The prompt defines a semantic classification system for shot framing based on natural language keywords to manage visual consistency and prevent rendering artifacts.", "duration_ms": 19866, "findings": [{"category": "llm_closed_list_instruction", "evidence": "전신형(full): ... 전신/상반신/미디엄 / 확대형(zoom): ... close-up / tight on / focus on body part / detail shot", "line_end": 35, "line_start": 30, "recommended_fix": "Pass the framing classification as a structured metadata field (enum) from the upstream shot analysis rather than asking the LLM to infer it from natural language keywords in the description.", "severity": "P1", "why_problematic": "The prompt instructs the LLM to classify open-world visual framing into 'full' or 'zoom' categories based on a closed list of natural language keywords. This classification is used to route descriptions to specific shots to prevent 'double body' rendering artifacts, making the visual logic dependent on brittle keyword matching over shot descriptions."}, {"category": "semantic_string_judgment", "evidence": "element_id에 _close_up 등 접미사", "line_end": 41, "line_start": 41, "recommended_fix": "Use a separate structured field for framing type (e.g., framing_type: 'zoom') instead of encoding it into the element_id string.", "severity": "P2", "why_problematic": "Instructing the LLM to encode semantic framing information into the element_id string (e.g., using a suffix) creates a brittle contract where downstream systems or human reviewers might rely on string parsing to understand the visual context of the element."}], "path": "prompts/_base/scene_consistency/6.202605031033/system.md", "scan_kind": "prompt", "sha256": "23cf18a3169873911f22b34f130f22e65f0f95cdcb82d07e17c7e6ca9f45c5d4"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 38, "chunk_start": 1, "chunk_summary": "The prompt defines semantic categories for visual consistency using closed lists of physical states and environmental features, which act as semantic classifiers for open-world scenario analysis.", "duration_ms": 42338, "findings": [{"category": "llm_closed_list_instruction", "evidence": "수면·의식불명·기절·휴식·부상·사망 (line 9), 깨진 창문, 열린/닫힌 문, 벽 손상, 벽의 표식/낙서 (line 17), 문신·반점·흉터 (line 35)", "line_end": 37, "line_start": 9, "recommended_fix": "Rephrase the instructions to define the categories by their functional role (e.g., 'any physical state that remains constant across shots') rather than a list of specific states. Use the current lists as clearly labeled non-exhaustive examples.", "severity": "P2", "why_problematic": "These lists function as semantic classifiers that define the boundaries of 'character_state' and 'environment_state'. By providing a specific set of states and features, the prompt biases the LLM to look for these exact patterns in the open-world scenario text, potentially missing other valid consistency elements or misclassifying ambiguous states to fit the provided list."}], "path": "prompts/_base/scene_consistency/3.202604201230/system.md", "scan_kind": "prompt", "sha256": "9f39d07e4b568f56110813479c94851859d45b6ecad5b90311273d5195e48700"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 113, "chunk_start": 1, "chunk_summary": "The prompt defines semantic classifiers for shot framing and character states using closed phrase lists to drive logic for splitting visual descriptions and preventing rendering artifacts.", "duration_ms": 33941, "findings": [{"category": "llm_closed_list_instruction", "evidence": "전신형(full): ... 전신/상반신/미디엄, 확대형(zoom): ... close-up / tight on / focus on body part / detail shot", "line_end": 33, "line_start": 32, "recommended_fix": "Define framing scales using abstract visual criteria or rely on a pre-validated framing enum from the input schema rather than keyword matching in the prompt.", "severity": "P1", "why_problematic": "The prompt instructs the LLM to classify visual framing based on a closed list of Korean and English keywords. This classification is used to route descriptions to different element_ids (e.g., adding a '_close_up' suffix as per line 41) to prevent 'double rendering' artifacts. This is a brittle semantic classifier that may fail if the input scenario uses synonyms or varied cinematic terminology."}, {"category": "llm_closed_list_instruction", "evidence": "character_state: ... (수면·의식불명·기절·휴식·부상·사망 등 모든 '정지 상태' 해당)", "line_end": 9, "line_start": 9, "recommended_fix": "Use a functional definition of 'static physical state' (e.g., 'any physical posture or condition that remains constant across multiple shots') instead of a list of specific examples.", "severity": "P2", "why_problematic": "The prompt provides a prescriptive list of physical states to define the 'character_state' category. This functions as a semantic classifier that may bias the LLM toward these specific tropes or cause it to miss other valid static physical states not explicitly listed."}], "path": "prompts/_base/scene_consistency/5.202605021400/system.md", "scan_kind": "prompt", "sha256": "790a2a86a020ecd3f0f97f1286369e3efddc4eafcead0026dfd4814fff7dcfad"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 52, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 17966, "findings": [], "path": "prompts/_base/scene_detail/12.202605021300/detail_schema.json", "scan_kind": "prompt", "sha256": "7b30ebe26e94189a1d2dd6d1afed295c041efc40cc2671a688a265d65301117e"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 619, "chunk_start": 1, "chunk_summary": "The prompt defines several semantic classifiers and behavioral routing rules based on natural-language string patterns, including framing-based reference skipping and body-part-specific ID prohibitions.", "duration_ms": 20834, "findings": [{"category": "semantic_string_judgment", "evidence": "camera_direction ... ECU, XCU, extreme close-up, MCU, medium close-up, close-up, CU ... skip chain_bg reference image", "line_end": 242, "line_start": 226, "recommended_fix": "Pass a structured framing enum from the upstream shot analysis rather than parsing natural-language tags to decide reference-skipping behavior.", "severity": "P1", "why_problematic": "This defines a behavioral routing rule where the presence of specific natural-language framing tags in the camera_direction field triggers an automatic skip of reference images in the composition pipeline. This is a brittle semantic classifier."}, {"category": "llm_closed_list_instruction", "evidence": "Focus on / close on / tight on / detail on + 특정 신체 부위 ... 무조건 보통명사", "line_end": 49, "line_start": 29, "recommended_fix": "Use a structured 'focus_target_type' field (e.g., FACE, BODY_PART, OBJECT) to determine whether to use character IDs or common nouns.", "severity": "P1", "why_problematic": "The prompt instructs the LLM to act as a regex-like classifier, switching from character IDs (C##) to common nouns if specific 'Focus on' patterns are detected. This logic is brittle and should be handled by structured metadata about the shot's subject."}, {"category": "llm_closed_list_instruction", "evidence": "cut / slice / split / carve / bisect + 신체 부위 조합 절대 금지", "line_end": 98, "line_start": 71, "recommended_fix": "Move these constraints to a negative prompt or a post-processing validator rather than relying on the LLM to self-censor a specific list of verbs.", "severity": "P1", "why_problematic": "This is a semantic string prohibition list. It forces the LLM to avoid specific verbs when describing lighting on body parts to prevent 'physical cutting' hallucinations. This is a workaround for model behavior using a brittle word blacklist."}, {"category": "scenario_dependent_prompt", "evidence": "attacker / assailant / predator / tearing flesh / ripped skin / blood spray", "line_end": 456, "line_start": 420, "recommended_fix": "Abstract the violence intensity into a 'violence_level' enum and provide neutral instructions on how to handle power imbalances without providing a list of graphic nouns/verbs.", "severity": "P2", "why_problematic": "The prompt contains a 'vocabulary palette' for violence that includes highly specific and graphic scenario pollution. Even if conditional, providing these specific tropes can bias the LLM toward more extreme imagery than the scenario requires."}, {"category": "schema_or_enum_drift", "evidence": "Asian, East Asian, South Asian, Southeast Asian, Black, Middle Eastern, Hispanic, Caucasian", "line_end": 375, "line_start": 350, "recommended_fix": "Inject the allowed demographic descriptors dynamically from the project's global configuration/schema rather than hard-coding them in the system prompt.", "severity": "P2", "why_problematic": "The prompt defines a closed list of demographic descriptors that the LLM must use. If the downstream system or reference database uses a different set of labels, this creates a synchronization debt (drift) between the prompt and the canonical world-building schema."}], "path": "prompts/_base/scene_detail/11.202604301730/system.md", "scan_kind": "prompt", "sha256": "b7ee2130bae31ddb3b1bd50eb3d727e92e1aa727472739347dc9e746174cab49"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 37, "chunk_start": 1, "chunk_summary": "The prompt defines visual consistency categories using concrete scenario-specific examples and instructs the LLM to use natural-language names instead of technical IDs for identification.", "duration_ms": 58272, "findings": [{"category": "scenario_dependent_prompt", "evidence": "사망, 부상, 의식불명 ... a middle-aged woman lying face-down ... a dark blood pool ... shattered with jagged glass edges ... a crumpled white bedsheet", "line_end": 21, "line_start": 9, "recommended_fix": "Replace specific scenario details with neutral placeholders or a broader variety of examples. For instance, use 'a person sitting in a specific posture' or 'a specific object placed on a surface' instead of crime-scene-specific descriptions.", "severity": "P2", "why_problematic": "The prompt uses highly specific and morbid scenario fragments (death, injury, blood pools, shattered glass) as primary examples for general visual consistency categories. This concrete scenario pollution can bias the LLM to look for or prioritize similar details (e.g., tattoos, damage) even in unrelated or neutral scenarios."}, {"category": "semantic_string_judgment", "evidence": "엔티티 ID(C##, L##, P##) 절대 금지 ... element_id와 character_name에 인물 이름을 포함하여 식별", "line_end": 31, "line_start": 28, "recommended_fix": "Allow the use of canonical entity IDs (e.g., C##) as the primary key in 'element_id' and keep 'character_name' as a separate metadata field.", "severity": "P2", "why_problematic": "The prompt explicitly forbids the use of structured technical identifiers (C##, L##, P##) and instead requires embedding natural-language character names into the 'element_id' field. This creates an overloaded semantic channel and forces downstream components to rely on brittle string matching for identity tracking rather than stable machine IDs."}], "path": "prompts/_base/scene_consistency/2.202604141200/system.md", "scan_kind": "prompt", "sha256": "d5d5c575a0b9ae0d4a015abeac5f9ef1b0514b4b669f46980917f555c5e2bf94"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 52, "chunk_start": 1, "chunk_summary": "The schema defines a T2I prompt field with instructions for conditional string formatting based on semantic visual context and establishes a contract for blind string mutation of entity IDs.", "duration_ms": 19828, "findings": [{"category": "llm_closed_list_instruction", "evidence": "신체 부위 클로즈업/사진·거울 속 인물 등 system prompt가 명시한 예외 구도에서는 보통명사로 대체", "line_end": 16, "line_start": 16, "recommended_fix": "Remove the conditional formatting logic from the prompt. Instead, have the LLM always output structured IDs and handle the conversion to common nouns in a post-processing step that uses explicit framing/context metadata.", "severity": "P1", "why_problematic": "This instructs the LLM to perform semantic classification of the visual scene (identifying close-ups, reflections, or photos) to decide whether to use a structured ID or a natural language noun. This creates a brittle dependency where visual meaning dictates string syntax."}, {"category": "blind_string_mutation", "evidence": "합성 단계가 'the character from Image N'으로 자동 치환", "line_end": 16, "line_start": 16, "recommended_fix": "Use a templating system or a structured representation for entities within the prompt rather than performing substring replacement on generated natural language.", "severity": "P1", "why_problematic": "The schema establishes a contract where natural-language prompt text is expected to contain specific ID patterns (e.g., C01O02) that will be blindly replaced by a downstream process. This is fragile as it relies on the LLM maintaining exact string patterns within arbitrary prose."}, {"category": "schema_or_enum_drift", "evidence": "t2i_prompt의 복합 ID와 동일한 정보를 명시", "line_end": 29, "line_start": 17, "recommended_fix": "Treat the structured outfit_assignments as the single source of truth and generate the prompt string from it, or validate the prompt string against the structured data during post-processing.", "severity": "P2", "why_problematic": "The schema requires the LLM to synchronize information between a natural language string (t2i_prompt) and a structured array (outfit_assignments). This redundancy is prone to drift and indicates that the prompt text is being treated as a parallel source of truth for entity state."}], "path": "prompts/_base/scene_detail/13.202605022141/detail_schema.json", "scan_kind": "prompt", "sha256": "413eb51a6595d4a0ee422a809ac66710935da480c5cd7ebc6de18be25565f5bb"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 447, "chunk_start": 1, "chunk_summary": "The system prompt defines several brittle string-based heuristics and closed-list classifiers for visual framing, character ID usage, and entity persistence, creating a tight coupling between natural language patterns and pipeline behavior.", "duration_ms": 33010, "findings": [{"category": "semantic_string_judgment", "evidence": "판단 기준: 'Focus on / close on / tight on / detail on + 특정 신체 부위' 패턴이 등장하면 무조건 보통명사.", "line_end": 48, "line_start": 48, "recommended_fix": "Instead of pattern matching on generated prose, the LLM should use a structured 'framing' or 'focus_target' field in its internal reasoning or output schema to decide ID usage policy.", "severity": "P1", "why_problematic": "This instruction forces the LLM to use a brittle substring-matching heuristic to classify visual framing. The result of this match (presence of 'Focus on', etc.) directly changes the behavior of character ID (C##) usage, which in turn controls whether face-reference images are injected into the T2I process."}, {"category": "blind_string_mutation", "evidence": "고정 요소 description의 보통명사 인물 묘사(\"A Korean man\", \"a woman\" 등)를 해당 C##으로 대체", "line_end": 144, "line_start": 134, "recommended_fix": "Pass the character state as a structured object where the ID and the description are separate fields, rather than asking the LLM to perform text-level surgery on prose.", "severity": "P1", "why_problematic": "This instructs the LLM to perform blind string replacement of natural language descriptions ('A Korean man') with technical identifiers ('C##'). This is prone to errors if the description is slightly different or if multiple characters of the same type exist, leading to 'double-drawing' or incorrect ID mapping."}, {"category": "semantic_string_judgment", "evidence": "Use the door from the reference image; do not generate a new one", "line_end": 225, "line_start": 207, "recommended_fix": "Use a structured 'persistent_entities' array or a 'source' field in the object description schema to indicate that an entity should be pulled from a specific reference image.", "severity": "P1", "why_problematic": "This establishes a natural-language string contract ('Use the [object] from the reference') to handle entity persistence (Rule C). Downstream systems likely use regex to find these markers to prevent duplicate object generation, which is brittle and depends on the LLM following the exact phrasing."}, {"category": "llm_closed_list_instruction", "evidence": "attacker / assailant / aggressor / predator / pursuer ... victim / prey / target", "line_end": 299, "line_start": 277, "recommended_fix": "Allow the LLM to describe the power dynamic and physical interaction using natural language guided by the scenario, rather than forcing a choice from a specific word list.", "severity": "P2", "why_problematic": "The prompt provides a closed 'Vocabulary Palette' for violence, acting as a semantic classifier for character roles. This biases the LLM toward specific tropes and may result in awkward mapping when the open-world scenario does not perfectly fit these predefined labels."}], "path": "prompts/_base/scene_detail/10.202604301430/system.md", "scan_kind": "prompt", "sha256": "e88033d4847a3c7b7dd284c4d34ddfe05d0a82f3223a1472c610ab5213c3f081"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 75, "chunk_start": 1, "chunk_summary": "The schema for `t2i_prompt` defines a contract for blind string mutation of character IDs and instructs the LLM to use visual framing as a semantic classifier for string formatting.", "duration_ms": 26651, "findings": [{"category": "blind_string_mutation", "evidence": "t2i_prompt: \"인물+아웃룩은 복합 ID(C01O02)를 사용 — 합성 단계가 'the character from Image N'으로 자동 치환.\"", "line_end": 16, "line_start": 16, "recommended_fix": "Instead of blind replacement in a single string, use a structured prompt representation (e.g., a list of text and entity segments) or a templating engine that handles entity injection safely.", "severity": "P1", "why_problematic": "This establishes a contract for blind substring replacement of technical IDs within a natural language prompt. This is brittle and can lead to grammatical errors or incorrect replacements if the ID pattern appears in unintended contexts or if the surrounding sentence structure is not preserved."}, {"category": "llm_closed_list_instruction", "evidence": "t2i_prompt: \"신체 부위 클로즈업/사진·거울 속 인물 등 system prompt가 명시한 예외 구도에서는 보통명사로 대체.\"", "line_end": 16, "line_start": 16, "recommended_fix": "Define explicit framing or context flags in the schema and let the prompt assembly logic handle the string formatting based on those flags.", "severity": "P2", "why_problematic": "The prompt instructs the LLM to perform semantic classification (identifying close-ups, mirrors, or photos) to decide between using a technical ID or a common noun. This logic is better handled by structured metadata or explicit framing enums rather than implicit LLM judgment during string generation."}], "path": "prompts/_base/scene_detail/14.202605031033/detail_schema.json", "scan_kind": "prompt", "sha256": "fc4b7b905ec2540a85873e2b6ffbfe7b01f47f44cf38c4bbf2897300d69e2a89"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 75, "chunk_start": 1, "chunk_summary": "The schema defines a scene detail structure with a semantic classification rule in the t2i_prompt description regarding character ID usage in specific visual contexts.", "duration_ms": 18838, "findings": [{"category": "llm_closed_list_instruction", "evidence": "신체 부위 클로즈업/사진·거울 속 인물 등 system prompt가 명시한 예외 구도에서는 보통명사로 대체", "line_end": 16, "line_start": 16, "recommended_fix": "Use a structured field for 'visual_context' or 'framing_type' and handle the ID-to-noun conversion in code based on that field, rather than instructing the LLM to mutate the prompt string semantically.", "severity": "P2", "why_problematic": "The instruction requires the LLM to semantically classify the visual context (e.g., mirror, photo, body-part close-up) to decide whether to use a trackable ID or a generic noun. This makes the downstream ID-replacement logic (which replaces IDs with 'the character from Image N') dependent on the LLM's subjective interpretation of these categories within the prompt string."}], "path": "prompts/_base/scene_detail/15.202605032354/detail_schema.json", "scan_kind": "prompt", "sha256": "fc4b7b905ec2540a85873e2b6ffbfe7b01f47f44cf38c4bbf2897300d69e2a89"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 669, "chunk_start": 1, "chunk_summary": "The prompt uses several brittle keyword and phrase lists (framing tags, body parts, forbidden verbs) to classify scenario meaning and route reference image attachment, and contains scenario-specific demographic examples.", "duration_ms": 31160, "findings": [{"category": "semantic_string_judgment", "evidence": "camera_direction... ECU, XCU, extreme close-up, MCU, medium close-up, close-up, CU... skip reference / close framing: close-up, CU, MCU, ECU, XCU, extreme close-up, 클로즈업, 손가락이, 손이, 눈이, 얼굴이", "line_end": 341, "line_start": 228, "recommended_fix": "Pass framing scale as a structured enum from the upstream scenario analysis rather than inferring it from natural-language keywords or body-part mentions.", "severity": "P1", "why_problematic": "The prompt instructs the LLM to classify framing scale and route reference image attachment (Rule E) or entity visibility (Rule J) based on a brittle list of keywords and body parts found in natural-language descriptions."}, {"category": "semantic_string_judgment", "evidence": "cut / slice / split / carve / bisect + 신체 부위 조합 절대 금지", "line_end": 96, "line_start": 77, "recommended_fix": "Use negative prompts or style-based guidance to prevent physical artifacts rather than forbidding specific natural-language verbs.", "severity": "P1", "why_problematic": "Forbids specific verbs based on semantic context (body parts) to avoid visual artifacts. This creates a brittle linguistic constraint that may fail to capture other synonyms or valid artistic descriptions while blocking natural language."}, {"category": "semantic_string_judgment", "evidence": "Focus on / close on / tight on / detail on + 특정 신체 부위 패턴이 등장하면 무조건 보통명사", "line_end": 48, "line_start": 48, "recommended_fix": "Determine ID usage based on a structured 'focus_target' field or framing enum rather than pattern-matching the generated prompt text.", "severity": "P1", "why_problematic": "Uses a phrase pattern to decide whether to use a character ID (C##) or a common noun. This directly controls whether a reference image is attached, making the routing dependent on exact string patterns in the prompt prose."}, {"category": "scenario_dependent_prompt", "evidence": "East Asian, Southeast Asian, South Asian, Caucasian, Black, Hispanic, Latina(o), Middle Eastern", "line_end": 424, "line_start": 412, "recommended_fix": "Move demographic descriptors to a separate world-building configuration or use abstract placeholders like [ethnicity] in the base prompt.", "severity": "P2", "why_problematic": "The prompt provides a concrete list of demographic and regional examples. This biases the LLM towards a specific set of ethnicities and regions, which may not be appropriate for all future scenarios."}], "path": "prompts/_base/scene_detail/13.202605022141/system.md", "scan_kind": "prompt", "sha256": "bd52343fbc9124efa30e5b1d7f6c01ac3ce9d04e0109a517ea410346d04c2b17"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 669, "chunk_start": 1, "chunk_summary": "The prompt defines several semantic classifiers using closed keyword lists to determine visual framing, motion complexity, and reference usage logic, and instructs the LLM to perform blind string replacements.", "duration_ms": 40925, "findings": [{"category": "llm_closed_list_instruction", "evidence": "Focus on / close on / tight on / detail on, ECU, XCU, extreme close-up, MCU, medium close-up, close-up, CU, 클로즈업, 손가락이, 손이, 눈이, 얼굴이", "line_end": 341, "line_start": 48, "recommended_fix": "Pass the framing scale as a structured enum from the upstream shot-list generator instead of inferring it from natural language or body part mentions.", "severity": "P1", "why_problematic": "The prompt uses these keyword lists as semantic classifiers to determine framing scale from natural language. This classification then triggers critical logic: disabling character IDs (C##), skipping background references (Rule E), and enforcing entity visibility rules (Rule J). Mapping body parts like 'finger' or 'eye' to framing scale is brittle and limits open-world expression."}, {"category": "llm_closed_list_instruction", "evidence": "running / riding / walking / swimming 류)이나 \"동작A하며 동작B\" 같은 두 동작 합성 표현", "line_end": 533, "line_start": 533, "recommended_fix": "Use a structured 'complexity' or 'motion_type' flag in the input schema to guide strategy selection.", "severity": "P1", "why_problematic": "This instructs the LLM to detect specific motion verbs to trigger a 'Reframe' strategy. This is a semantic routing decision based on a closed list of open-world actions, which may fail to capture other complex movements or incorrectly trigger for simple ones."}, {"category": "blind_string_mutation", "evidence": "고정 요소 description의 보통명사 인물 묘사(\"An Asian man\", \"a woman\" 등)를 해당 C##으로 대체", "line_end": 135, "line_start": 135, "recommended_fix": "Provide the fixed elements with placeholders or structured entity references instead of requiring the LLM to perform string substitution on prose.", "severity": "P1", "why_problematic": "This instructs the LLM to perform a blind string replacement of natural language descriptions with technical IDs. This is prone to errors if the description doesn't match perfectly or if there are multiple characters of the same demographic, leading to incorrect ID assignment in the final prompt."}], "path": "prompts/_base/scene_detail/12.202605021300/system.md", "scan_kind": "prompt", "sha256": "bd52343fbc9124efa30e5b1d7f6c01ac3ce9d04e0109a517ea410346d04c2b17"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 711, "chunk_start": 1, "chunk_summary": "The prompt defines several semantic classifiers using closed lists of natural language keywords (framing, motion verbs, media types) to control critical behaviors like character ID usage, reference image integration, and entity visibility.", "duration_ms": 26604, "findings": [{"category": "semantic_string_judgment", "evidence": "close-up, CU, MCU, ECU, XCU, extreme close-up, 클로즈업, 손가락이, 손이, 눈이, 얼굴이 ... wide shot, establishing, aerial, 전경, 전신", "line_end": 342, "line_start": 337, "recommended_fix": "Replace keyword-based classification with a structured framing_scale enum provided in the input schema, and have the LLM reason about visibility based on that enum rather than searching for substrings.", "severity": "P1", "why_problematic": "This instruction uses a brittle list of natural language keywords (including specific body parts like 'finger' or 'eye') to classify the visual framing scale. This classification then dictates strict visibility rules for all entities in the shot, potentially causing entities to be incorrectly excluded if the scenario uses synonymous but unlisted terms."}, {"category": "semantic_string_judgment", "evidence": "camera_direction 자연어에 close-framing tag — ECU, XCU, extreme close-up, MCU, medium close-up, close-up, CU — 가 하나라도 포함되면", "line_end": 230, "line_start": 226, "recommended_fix": "Pass an explicit boolean flag (e.g., 'is_reference_available') to the LLM instead of requiring it to infer pipeline state from natural language camera descriptions.", "severity": "P1", "why_problematic": "The prompt instructs the LLM to infer the technical state of the composition pipeline (whether a reference image is available) by searching for framing keywords in a natural language field. This creates a brittle dependency where a slight variation in camera description terminology can lead to the LLM generating instructions for non-existent references."}, {"category": "semantic_string_judgment", "evidence": "shot description이 동적 동사 (running, riding, walking, moving, chasing, pedaling, rowing)를 명시한 인물의 freeze 순간", "line_end": 652, "line_start": 649, "recommended_fix": "Use a structured 'is_motion' or 'action_type' field in the shot metadata to trigger freeze-frame logic, rather than relying on verb matching in the description.", "severity": "P1", "why_problematic": "This uses a closed list of verbs to detect 'motion' in open-world scenario text. If a scenario uses a verb not in this list (e.g., 'sprinting', 'cycling', 'gliding'), the 'mid-action freeze' logic will fail to trigger, leading to inconsistent visual results for similar actions."}, {"category": "semantic_string_judgment", "evidence": "사진, 포스터, 그림, 초상화, 모니터, TV, 거울, 창유리 반사, 투영 — 은 C##O## 절대 금지", "line_end": 130, "line_start": 119, "recommended_fix": "Define a structured 'entity_medium' or 'is_reflection' property in the entity schema to explicitly signal when an ID should be suppressed.", "severity": "P1", "why_problematic": "The prompt asks the LLM to classify whether an entity is 'real' or '2D/reflected' based on a list of media types. This decision changes the output token (ID vs common noun), which directly affects whether the face-reference system is engaged. This is a semantic classifier that relies on an incomplete list of media types."}, {"category": "semantic_string_judgment", "evidence": "Focus on / close on / tight on / detail on + 특정 신체 부위", "line_end": 48, "line_start": 48, "recommended_fix": "Centralize the logic for ID suppression based on a structured 'focus_target' field rather than pattern-matching natural language framing instructions.", "severity": "P1", "why_problematic": "This defines a phrase-pattern-based rule to switch from character IDs to common nouns. It relies on the LLM identifying specific framing phrases and body parts to decide whether to apply identity enforcement, which is brittle and prone to inconsistent application across different scenario phrasings."}], "path": "prompts/_base/scene_detail/14.202605031033/system.md", "scan_kind": "prompt", "sha256": "2ddec5371f3acf9c62ec78fca89fb33984181a12b7a5b53543f9de678b7f7d2b"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 75, "chunk_start": 1, "chunk_summary": "The schema defines a contract for the LLM to generate T2I prompts using specific ID patterns that are subject to blind string mutation and semantic-based branching logic.", "duration_ms": 12738, "findings": [{"category": "blind_string_mutation", "evidence": "합성 단계가 'the character from Image N'으로 자동 치환", "line_end": 16, "line_start": 16, "recommended_fix": "Pass the character/outlook mapping as structured metadata alongside the prompt rather than performing substring replacement on the generated prose.", "severity": "P1", "why_problematic": "This defines a contract where technical IDs (C01O02) embedded in generated natural-language prompt prose are blindly replaced by semantic reference phrases during a later synthesis stage, which is brittle if the LLM places the ID in an unexpected linguistic context."}, {"category": "llm_closed_list_instruction", "evidence": "신체 부위 클로즈업/사진·거울 속 인물 등 system prompt가 명시한 예외 구도에서는 보통명사로 대체", "line_end": 16, "line_start": 16, "recommended_fix": "Allow the LLM to always use structured IDs and handle the 'common noun' fallback in a downstream visual-processing or prompt-formatting layer based on explicit framing metadata.", "severity": "P1", "why_problematic": "This instructs the LLM to use a closed list of semantic visual categories (body part close-ups, mirrors, photos) to decide whether to use a technical ID or a common noun. This creates a brittle dependency on the LLM's interpretation of visual framing to drive ID enforcement policy."}], "path": "prompts/_base/scene_detail/17.202605042018/detail_schema.json", "scan_kind": "prompt", "sha256": "fc4b7b905ec2540a85873e2b6ffbfe7b01f47f44cf38c4bbf2897300d69e2a89"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 75, "chunk_start": 1, "chunk_summary": "The schema defines a contract for blind string mutation of IDs into natural language and uses semantic visual categories as a logic switch for ID usage in T2I prompts.", "duration_ms": 36638, "findings": [{"category": "blind_string_mutation", "evidence": "합성 단계가 'the character from Image N'으로 자동 치환", "line_end": 16, "line_start": 16, "recommended_fix": "Use a structured template or a post-processing step that understands the prompt's syntax rather than blind string replacement.", "severity": "P1", "why_problematic": "This establishes a contract for blind string replacement of structured IDs with natural language phrases ('the character from Image N') within the generated T2I prompt. This is brittle as it assumes the ID can be safely swapped for a phrase without breaking the surrounding prompt's grammar or semantics."}, {"category": "llm_closed_list_instruction", "evidence": "신체 부위 클로즈업/사진·거울 속 인물 등 ... 보통명사로 대체", "line_end": 16, "line_start": 16, "recommended_fix": "Move the logic for ID vs. common noun replacement to a post-processor that uses structured framing fields rather than asking the LLM to change its output format based on semantic interpretation.", "severity": "P1", "why_problematic": "It instructs the LLM to use a closed list of semantic visual categories (close-ups, mirrors, photos) to decide whether to use a structured ID or a common noun. This creates a brittle dependency on the LLM's interpretation of these visual states to control the output format."}], "path": "prompts/_base/scene_detail/16.202605041200/detail_schema.json", "scan_kind": "prompt", "sha256": "fc4b7b905ec2540a85873e2b6ffbfe7b01f47f44cf38c4bbf2897300d69e2a89"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 75, "chunk_start": 1, "chunk_summary": "The schema defines a contract for blind string mutation of character IDs in generated prompts and provides a closed list of semantic visual scenarios for conditional formatting.", "duration_ms": 22325, "findings": [{"category": "blind_string_mutation", "evidence": "합성 단계가 'the character from Image N'으로 자동 치환", "line_end": 16, "line_start": 16, "recommended_fix": "Use a structured representation for entities within prompts (e.g., a list of entity-to-index mappings) rather than performing blind substring replacement on the final prose.", "severity": "P1", "why_problematic": "This establishes a contract where the synthesis stage performs blind substring replacement of IDs (e.g., C01O02) within generated natural-language prompt text. This is brittle as it relies on the LLM placing the ID in a context where replacement is semantically valid and doesn't account for partial matches or unexpected prose usage."}, {"category": "llm_closed_list_instruction", "evidence": "신체 부위 클로즈업/사진·거울 속 인물 등 system prompt가 명시한 예외 구도에서는 보통명사로 대체", "line_end": 16, "line_start": 16, "recommended_fix": "Maintain consistent ID usage across all compositions and handle visual exceptions (like 'photo of') in the synthesis/rendering logic rather than via conditional LLM output formatting.", "severity": "P1", "why_problematic": "The instruction requires the LLM to perform semantic classification of visual scenarios (body parts, photos, mirrors) to determine output formatting (ID vs. common noun). This couples visual meaning to string-level formatting rules and creates a dependency on a closed list of visual tropes."}], "path": "prompts/_base/scene_detail/19.202605050814/detail_schema.json", "scan_kind": "prompt", "sha256": "fc4b7b905ec2540a85873e2b6ffbfe7b01f47f44cf38c4bbf2897300d69e2a89"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 669, "chunk_start": 1, "chunk_summary": "The system prompt uses several brittle string-matching rules and keyword lists to classify framing scales, enforce ID policies, and filter temporal or reference-related language from generated prompts.", "duration_ms": 29323, "findings": [{"category": "semantic_string_judgment", "evidence": "close-up, CU, MCU, ECU, XCU, extreme close-up, 클로즈업, 손가락이, 손이, 눈이, 얼굴이", "line_end": 300, "line_start": 295, "recommended_fix": "Pass the framing scale as a structured enum in the RenderPromptCard instead of inferring it from natural language keywords.", "severity": "P1", "why_problematic": "It uses a brittle list of keywords (including Korean body parts) to infer the framing scale from natural language shot descriptions, which then dictates strict visibility and ID rules."}, {"category": "semantic_string_judgment", "evidence": "Focus on / close on / tight on / detail on + 특정 신체 부위", "line_end": 64, "line_start": 45, "recommended_fix": "Use a structured flag in the ID policy or asset requirements to indicate if a shot is a body-part close-up exempt from ID injection.", "severity": "P1", "why_problematic": "It uses a specific phrase pattern to trigger a fallback to common nouns, bypassing ID injection (C##O##). This makes ID policy dependent on the presence of specific substrings."}, {"category": "semantic_string_judgment", "evidence": "and then, while ~ing, after ~ing, as ~, before ~, ~하자, ~하며, ~한 뒤", "line_end": 29, "line_start": 27, "recommended_fix": "Instead of banning substrings, provide a structural instruction to describe the scene as a static composition and use a separate validator to check for temporal logic.", "severity": "P1", "why_problematic": "It enforces a 'single moment' constraint by banning specific natural language substrings. This is a brittle way to control semantic output and may lead to awkward phrasing or failed validations."}, {"category": "semantic_string_judgment", "evidence": "the existing X / from the reference / use the X from the reference / preserving the same room perspective", "line_end": 212, "line_start": 209, "recommended_fix": "Define the background binding mode clearly in the prompt and instruct the LLM to describe the environment from scratch when the reference is unavailable, without relying on a forbidden phrase list.", "severity": "P1", "why_problematic": "It bans specific phrases to handle the skipped_close_framing mode. This is a hard string-based filter for a semantic state that should be handled by the LLM's understanding of the context."}, {"category": "llm_closed_list_instruction", "evidence": "attacker / assailant / aggressor / predator / pursuer, tearing flesh, ripped skin, blood spray", "line_end": 456, "line_start": 435, "recommended_fix": "Replace the vocabulary palette with high-level instructions on maintaining intensity and power imbalance without prescribing specific words.", "severity": "P2", "why_problematic": "It provides a closed list of 'approved' semantic tokens for violence, which biases the LLM's open-world description of physical conflict and may lead to repetitive or trope-heavy generation."}], "path": "prompts/_base/scene_detail/17.202605042018/system.md", "scan_kind": "prompt", "sha256": "c91b16e87259591162b8bb24c0f36aa645ffb131736e79e6b3e836c8a56bbf6e"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 587, "chunk_start": 1, "chunk_summary": "The prompt defines several semantic classification rules based on keyword lists (framing scale, ID policy triggers, motion states) and includes scenario-specific vocabulary for violence.", "duration_ms": 27406, "findings": [{"category": "semantic_string_judgment", "evidence": "close-up, CU, MCU, ECU, XCU, extreme close-up, 클로즈업, 손가락이, 손이, 눈이, 얼굴이 ... 판정 키워드", "line_end": 261, "line_start": 256, "recommended_fix": "Pass the framing scale as a structured enum in the RenderPromptCard rather than having the LLM infer it from natural language or metadata strings.", "severity": "P1", "why_problematic": "The prompt instructs the LLM to classify the framing scale of a shot using a brittle list of English and Korean keywords. This classification (close vs. wide) then triggers 'Rule J', which dictates whether entities are removed or blurred, making visual composition dependent on string matches."}, {"category": "semantic_string_judgment", "evidence": "trigger_phrases (focus on / close on / tight on / detail on + 신체부위) 패턴이 등장하면 ... C##O## 사용 금지", "line_end": 44, "line_start": 41, "recommended_fix": "Define a boolean 'is_body_part_focus' or similar flag in the id_policy schema to explicitly control this behavior.", "severity": "P1", "why_problematic": "This rule uses a phrase-based pattern match over the intended visual description to decide whether to apply a critical ID enforcement policy. It forces a fallback to common nouns based on the presence of specific substrings."}, {"category": "semantic_string_judgment", "evidence": "applies_to_surfaces (사진·포스터·모니터·거울·반사·투영 등) 안의 인물은 C##O## 절대 금지", "line_end": 51, "line_start": 49, "recommended_fix": "Use a structured 'surface_type' attribute for entities or backgrounds to signal when an ID should be treated as a reproduction.", "severity": "P1", "why_problematic": "It classifies the semantic nature of a surface (reproduction vs. real) using a phrase list to route ID policy. This is brittle as it relies on the LLM identifying these specific surface types to trigger a safety/consistency rule."}, {"category": "scenario_dependent_prompt", "evidence": "attacker / assailant / aggressor / predator / pursuer ... tearing flesh, ripped skin, gaping wound", "line_end": 370, "line_start": 353, "recommended_fix": "Move specialized genre-specific vocabularies to dynamic prompt injections that are only included when the scenario genre or content tags match.", "severity": "P2", "why_problematic": "The prompt contains a concrete 'palette' of highly specific, scenario-dependent vocabulary for violence. This biases the LLM toward specific tropes and graphic descriptions whenever a conflict is detected, rather than remaining a neutral scene analyzer."}, {"category": "semantic_string_judgment", "evidence": "running, riding, walking, moving, chasing, pedaling, rowing ... freeze 순간을 묘사할 때 ... motion direction을 자세 묘사에 포함", "line_end": 546, "line_start": 525, "recommended_fix": "Include a 'motion_state' or 'is_dynamic' flag in the shot metadata to explicitly signal when motion-blur or directional-freeze logic should be applied.", "severity": "P1", "why_problematic": "The prompt uses a specific list of action verbs to trigger 'mid-action freeze' logic. This makes the physical description of the character (e.g., hair flowing) dependent on the presence of specific verbs in the input description."}], "path": "prompts/_base/scene_detail/18.202605041549/system.md", "scan_kind": "prompt", "sha256": "7d915d79a07cd158f22b3e8e1fa4e2efb807a75efbc6648d9c417d19b002019e"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 75, "chunk_start": 1, "chunk_summary": "The schema defines a contract for embedding structured IDs within natural language prose for downstream blind string mutation and requires the LLM to use a closed list of visual scenarios as a semantic classifier for string formatting.", "duration_ms": 34459, "findings": [{"category": "blind_string_mutation", "evidence": "t2i_prompt ... 합성 단계가 'the character from Image N'으로 자동 치환", "line_end": 16, "line_start": 16, "recommended_fix": "Instead of embedding IDs for replacement, use a structured representation where the prompt template and the entity references are separate, or perform the substitution at a stage where the LLM can see the final text.", "severity": "P1", "why_problematic": "This defines a contract where LLM-generated natural language prose is subjected to blind substring replacement of IDs (e.g., C01O02). This is brittle because the replacement string ('the character from Image N') may not be grammatically or semantically compatible with the surrounding sentence structure generated by the LLM."}, {"category": "llm_closed_list_instruction", "evidence": "신체 부위 클로즈업/사진·거울 속 인물 등 system prompt가 명시한 예외 구도에서는 보통명사로 대체", "line_end": 16, "line_start": 16, "recommended_fix": "Standardize the output format regardless of visual context, and handle context-specific rendering logic in a downstream visual-aware component or via explicit metadata fields.", "severity": "P1", "why_problematic": "The schema instructs the LLM to use a closed list of visual contexts (close-ups, mirrors, photos) as a semantic classifier to decide whether to use a structured ID or a common noun. This creates a brittle dependency on the LLM's interpretation of these categories to drive technical string formatting."}], "path": "prompts/_base/scene_detail/18.202605041549/detail_schema.json", "scan_kind": "prompt", "sha256": "fc4b7b905ec2540a85873e2b6ffbfe7b01f47f44cf38c4bbf2897300d69e2a89"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 732, "chunk_start": 1, "chunk_summary": "The prompt defines several brittle string-pattern-based semantic classifiers and routing rules, including framing inference from natural language keywords, ID policy switching based on focus patterns, and redraw violation detection via synonym matching.", "duration_ms": 53704, "findings": [{"category": "semantic_string_judgment", "evidence": "camera_direction 자연어에 close-framing tag — ECU, XCU, extreme close-up, MCU, medium close-up, close-up, CU — 가 하나라도 포함되면, 합성 단계는 chain_bg reference image를 자동 skip한다", "line_end": 363, "line_start": 249, "recommended_fix": "Use a structured framing enum in the input schema instead of parsing natural language strings.", "severity": "P0", "why_problematic": "High-stakes routing (skipping reference images) and entity visibility rules (Rule J) are decided by brittle keyword matching over natural language descriptions (camera_direction, shot description)."}, {"category": "semantic_string_judgment", "evidence": "판단 기준: 'Focus on / close on / tight on / detail on + 특정 신체 부위' 패턴이 등장하면 무조건 보통명사.", "line_end": 64, "line_start": 64, "recommended_fix": "Pass a structured 'focus_target' field to the prompt generator to explicitly control ID policy.", "severity": "P1", "why_problematic": "String pattern matching over the generated prompt text is used to decide whether to use character IDs (C##), which directly affects reference image attachment and ID policy."}, {"category": "semantic_string_judgment", "evidence": "위반 패턴 (post-parse judge 가 차단) ... A figure stands near a wooden door; a tall window beside her ... screen for TV", "line_end": 240, "line_start": 235, "recommended_fix": "Use explicit object anchoring in the prompt structure and have the LLM tag referenced objects by ID.", "severity": "P1", "why_problematic": "A downstream 'post-parse judge' uses synonym matching and phrase patterns to block redraws of 'owned' objects, which is brittle and prone to false positives."}, {"category": "semantic_string_judgment", "evidence": "cut / slice / split / carve / bisect + 신체 부위 조합 절대 금지", "line_end": 112, "line_start": 112, "recommended_fix": "Use negative prompts or broader stylistic guidelines to avoid artifacts without banning specific verbs.", "severity": "P1", "why_problematic": "Prohibits specific semantic combinations in the generated prompt to avoid T2I artifacts, functioning as a brittle semantic filter on natural language output."}, {"category": "llm_closed_list_instruction", "evidence": "사용 가능 어휘 팔레트 ... attacker / assailant / aggressor ... tearing flesh, ripped skin ...", "line_end": 513, "line_start": 503, "recommended_fix": "Provide a neutral intensity scale or general descriptive guidelines instead of a fixed word list.", "severity": "P2", "why_problematic": "Provides a closed list of words and instructs the LLM to use them as a semantic classifier for violence intensity, biasing the output toward a fixed vocabulary."}], "path": "prompts/_base/scene_detail/16.202605041200/system.md", "scan_kind": "prompt", "sha256": "1847b818e67aa62990b12ca4547e5be25024730fd0de7e6434ee1ad92163f112"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 534, "chunk_start": 1, "chunk_summary": "The prompt uses several brittle keyword lists to infer visual framing, trigger ID policies, and validate lighting descriptions, while also containing scenario-specific ethnicity bias in examples.", "duration_ms": 33458, "findings": [{"category": "semantic_string_judgment", "evidence": "close-up, CU, MCU, ECU, XCU, extreme close-up, 클로즈업, 손가락이, 손이, 눈이, 얼굴이", "line_end": 227, "line_start": 222, "recommended_fix": "Pass the framing scale as a structured enum from the upstream shot extractor rather than inferring it from natural language keywords in the system prompt.", "severity": "P1", "why_problematic": "The prompt instructs the LLM to infer the visual framing scale (close/wide/medium) from a brittle list of Korean and English keywords in the shot description. This classification then dictates strict rules for entity visibility and ID usage, making the pipeline sensitive to minor phrasing variations."}, {"category": "semantic_string_judgment", "evidence": "focus on / close on / tight on / detail on + face filling the entire frame", "line_end": 48, "line_start": 41, "recommended_fix": "Use a structured boolean flag or focus_target field in the shot metadata to control ID injection policy instead of parsing the prompt text for trigger phrases.", "severity": "P1", "why_problematic": "Specific natural language phrases are used as semantic triggers to disable character ID (C##O##) injection. This is brittle because it relies on exact phrase matching to decide a critical behavior (ID policy), which can fail if the scenario uses synonymous but unlisted phrases."}, {"category": "semantic_string_judgment", "evidence": "red light cuts across her eyes, crimson spill cuts across her features, a beam slicing through his face", "line_end": 76, "line_start": 69, "recommended_fix": "Move lighting safety validation to a dedicated review step or use more abstract instructions that focus on 'surface-only' lighting without listing specific forbidden phrases.", "severity": "P1", "why_problematic": "The prompt defines a list of forbidden semantic patterns for lighting to prevent physical artifacts (e.g., 'cutting' the body). This is a semantic validator based on string patterns rather than physical or geometric constraints, which is difficult to maintain as scenario complexity grows."}, {"category": "blind_string_mutation", "evidence": "the existing X, from the reference, use the X from the reference, preserving the same room perspective", "line_end": 139, "line_start": 136, "recommended_fix": "Instead of forbidding specific phrases, provide a clear instruction on what the output should focus on (e.g., 'describe only the immediate foreground surface') and let the LLM generate naturally.", "severity": "P1", "why_problematic": "The prompt mandates the exclusion of specific semantic phrases when the background binding mode is 'skipped_close_framing'. This creates a brittle contract where the LLM must avoid specific substrings, which is a form of blind semantic mutation/filtering."}, {"category": "scenario_dependent_prompt", "evidence": "Asian man, Asian woman, East Asian person", "line_end": 436, "line_start": 434, "recommended_fix": "Replace specific ethnicity descriptors in examples with abstract placeholders like [ethnicity] or [demographic_descriptor] to maintain neutrality.", "severity": "P2", "why_problematic": "The examples provided for character descriptions consistently use 'Asian' as the demographic descriptor. This introduces concrete scenario pollution that can bias the LLM towards a specific ethnicity for arbitrary future scenarios where demographics are not explicitly defined."}], "path": "prompts/_base/scene_detail/19.202605050814/system.md", "scan_kind": "prompt", "sha256": "9b4d7ab87961efb3220ef768a6a79eb4a3812ed3ee42a54bdf8bab0cde72f158"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 716, "chunk_start": 1, "chunk_summary": "The system prompt defines several brittle keyword-based semantic classification rules for framing, motion, and ID usage, and establishes a contract for synonym-based redraw prevention.", "duration_ms": 65874, "findings": [{"category": "semantic_string_judgment", "evidence": "camera_direction 자연어에 close-framing tag — ECU, XCU, extreme close-up... 가 하나라도 포함되면, 합성 단계는 chain_bg reference image를 자동 skip한다 / 판정 키워드... 손가락이, 손이, 눈이, 얼굴이", "line_end": 346, "line_start": 233, "recommended_fix": "Replace keyword-based detection with a structured framing_scale enum in the shot metadata, or use a dedicated LLM classifier to determine framing intent without relying on specific substrings.", "severity": "P1", "why_problematic": "The system uses brittle keyword matching over natural-language camera directions and shot descriptions to route critical behavior, such as skipping reference images or excluding entities from the frame (Rule J). This can lead to incorrect visual routing if these common words appear in different semantic contexts."}, {"category": "semantic_string_judgment", "evidence": "shot description이 동적 동사 (running, riding, walking, moving, chasing, pedaling, rowing)를 명시한 인물의 freeze 순간을 묘사할 때", "line_end": 675, "line_start": 654, "recommended_fix": "Introduce a structured motion_state field in the shot metadata to explicitly signal when a mid-action freeze pose is required.", "severity": "P1", "why_problematic": "The prompt instructs the LLM to trigger specific 'mid-action freeze' logic based on the presence of specific dynamic verbs in the natural-language shot description. This is a brittle semantic classifier that may fail to catch other motion verbs or misinterpret static descriptions containing these words."}, {"category": "semantic_string_judgment", "evidence": "회피 표현: portal for door, screen for TV — 의미상 redraw 면 위반 / post-parse 단계가 LLM judge 로 위반을 검증", "line_end": 231, "line_start": 207, "recommended_fix": "Enforce object persistence through structured entity IDs and negative prompts rather than attempting to catch semantic synonyms in generated prose.", "severity": "P1", "why_problematic": "The system establishes a contract where a downstream judge uses semantic synonym matching (e.g., 'portal' for 'door') to block redraws of owned objects. This is a brittle and unpredictable way to enforce technical constraints, as it relies on open-world semantic equivalence checks."}, {"category": "semantic_string_judgment", "evidence": "판단 기준: 'Focus on / close on / tight on / detail on + 특정 신체 부위' 패턴이 등장하면 무조건 보통명사", "line_end": 48, "line_start": 31, "recommended_fix": "Decouple ID usage from framing phrases. Use a structured flag to indicate whether a shot is a body-part close-up exempt from face-reference injection.", "severity": "P1", "why_problematic": "The prompt uses specific phrase patterns to decide whether to use character IDs (C##) or common nouns. This affects whether face reference images are attached, making the visual identity policy dependent on brittle string patterns in the generated prompt text."}, {"category": "llm_closed_list_instruction", "evidence": "시간 연결어 절대 금지: 'and then', 'while ~ing'... / cut / slice / split / carve / bisect + 신체 부위 조합 절대 금지 / 사용 가능 어휘 팔레트... attacker / assailant...", "line_end": 511, "line_start": 11, "recommended_fix": "Move these constraints into a centralized style/safety guide or use negative prompts in the T2I engine rather than hardcoding phrase lists in the system prompt.", "severity": "P2", "why_problematic": "The prompt contains several closed lists of forbidden or allowed semantic phrases used to constrain temporal logic, prevent lighting hallucinations, or bias vocabulary for violent scenes. These function as brittle semantic classifiers or vocabulary filters."}], "path": "prompts/_base/scene_detail/15.202605032354/system.md", "scan_kind": "prompt", "sha256": "26ef6712dbc576f4acbf98e17589ef5a8fddcd57e90e9bcc08633d518f5313ca"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 75, "chunk_start": 1, "chunk_summary": "The schema defines a contract for blind string mutation of T2I prompts and instructs the LLM to use semantic visual classification (close-ups, mirrors) to alter string formatting.", "duration_ms": 19912, "findings": [{"category": "blind_string_mutation", "evidence": "t2i_prompt: ... 합성 단계가 'the character from Image N'으로 자동 치환", "line_end": 16, "line_start": 16, "recommended_fix": "Pass IDs and their intended positions as a structured list of entity spans alongside the prompt, rather than performing blind substring replacement on the prose.", "severity": "P1", "why_problematic": "The schema explicitly documents a downstream 'synthesis stage' that performs blind string replacement of IDs within the generated natural-language prompt prose, which is prone to collision and context loss."}, {"category": "semantic_string_judgment", "evidence": "신체 부위 클로즈업/사진·거울 속 인물 등 ... 예외 구도에서는 보통명사로 대체", "line_end": 16, "line_start": 16, "recommended_fix": "Maintain consistent ID usage in the prompt and use a structured field (e.g., 'composition_type' or 'is_indirect_view') to signal to the downstream renderer how to handle character references.", "severity": "P1", "why_problematic": "This instruction forces the LLM to act as a semantic classifier for visual framing (close-ups, mirrors) to determine the string format (ID vs. common noun). This creates a brittle dependency where downstream logic must infer the visual context based on the presence or absence of specific string patterns."}], "path": "prompts/_base/scene_detail/21.202605061636/detail_schema.json", "scan_kind": "prompt", "sha256": "fc4b7b905ec2540a85873e2b6ffbfe7b01f47f44cf38c4bbf2897300d69e2a89"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 75, "chunk_start": 1, "chunk_summary": "The schema for t2i_prompt requires the LLM to perform semantic classification for framing-based string formatting and defines a contract for downstream blind string mutation.", "duration_ms": 15631, "findings": [{"category": "llm_closed_list_instruction", "evidence": "신체 부위 클로즈업/사진·거울 속 인물 등 ... 예외 구도에서는 보통명사로 대체", "line_end": 16, "line_start": 16, "recommended_fix": "Use a structured field to indicate if the character representation is indirect or partial, rather than having the LLM mutate the prompt string based on framing.", "severity": "P1", "why_problematic": "The LLM is instructed to classify visual meaning (body parts, mirrors, photos) to decide between using a structured ID or a common noun. This is a semantic classifier that controls string formatting, creating a brittle dependency between visual framing and prompt syntax."}, {"category": "blind_string_mutation", "evidence": "합성 단계가 'the character from Image N'으로 자동 치환", "line_end": 16, "line_start": 16, "recommended_fix": "Pass the reference image index as a structured metadata field alongside the prompt instead of relying on string substitution.", "severity": "P1", "why_problematic": "The schema description explicitly documents a downstream process that performs blind string replacement on the generated prompt text. This is a brittle pattern that depends on the LLM producing specific ID formats that are later swapped."}], "path": "prompts/_base/scene_detail/21.202605062217/detail_schema.json", "scan_kind": "prompt", "sha256": "fc4b7b905ec2540a85873e2b6ffbfe7b01f47f44cf38c4bbf2897300d69e2a89"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 423, "chunk_start": 1, "chunk_summary": "The prompt defines several brittle semantic classifiers and mutation rules based on closed lists of natural-language phrases and keywords to control ID policy, framing scale, and temporal consistency.", "duration_ms": 37761, "findings": [{"category": "llm_closed_list_instruction", "evidence": "close 판정 키워드 = 'close-up', 'CU', 'MCU', 'ECU', 'XCU', 'extreme close-up', '클로즈업', '손가락이', '손이', '눈이', '얼굴이' (총 11 entries)", "line_end": 151, "line_start": 151, "recommended_fix": "Pass the framing scale as a structured enum in the RenderPromptCard rather than asking the LLM to infer it from a keyword list.", "severity": "P1", "why_problematic": "It uses a brittle, closed list of 11 keywords (including specific body parts in Korean) to classify the visual framing scale. This classification then triggers significant behavioral changes in ID policy and entity visibility rules."}, {"category": "semantic_string_judgment", "evidence": "다음 6개 표현은 절대 출력 금지 — 'the existing X' / 'from the reference' / 'use the X from the reference' / 'preserving the same room perspective' / 'maintaining the reference's framing' / 'do not generate a new X'", "line_end": 138, "line_start": 136, "recommended_fix": "Define the constraint semantically (e.g., 'do not anchor to background references') and use a validator to check for semantic intent rather than exact phrase matching.", "severity": "P1", "why_problematic": "It enforces a negative constraint based on exact natural-language substrings. This is brittle as the LLM might use synonymous phrases that bypass the filter while still violating the underlying 'skipped_close_framing' logic."}, {"category": "semantic_string_judgment", "evidence": "body_part_focus_rule.trigger_phrases ('focus on / close on / tight on / detail on' + 신체부위) 패턴이 등장하면 ... C##O## 사용 금지", "line_end": 43, "line_start": 41, "recommended_fix": "Explicitly flag 'body_part_focus' as a boolean or enum in the input schema/card instead of relying on pattern matching over the generated description.", "severity": "P1", "why_problematic": "This is a semantic classifier that changes the ID policy (routing) based on the presence of specific natural-language patterns. It creates a brittle dependency between the prompt's prose and the system's identity enforcement logic."}, {"category": "blind_string_mutation", "evidence": "character_name → C## 또는 C##O## 매핑이 id_policy 안에 존재 시 해당 보통명사를 C##/C##O## 로 치환", "line_end": 115, "line_start": 115, "recommended_fix": "Use a structured entity mapping where the LLM only works with IDs, or perform the substitution in a post-processing step using a robust NER/linking tool.", "severity": "P1", "why_problematic": "It instructs the LLM to perform blind string substitution of natural-language names with technical IDs. This is prone to errors if names are partial, misspelled, or used in different grammatical contexts, leading to 'double-description' or broken references."}, {"category": "semantic_string_judgment", "evidence": "시간 연결어 절대 금지: 'and then', 'while ~ing', 'after ~ing', 'as ~', 'before ~', '~하자', '~하며', '~한 뒤'", "line_end": 27, "line_start": 27, "recommended_fix": "Instead of a forbidden phrase list, provide a structural requirement for the prompt (e.g., 'describe only static states and positions') and use a semantic validator to detect temporal progression.", "severity": "P1", "why_problematic": "It uses a closed list of temporal connectors to enforce the 'single moment' rule. This is a brittle way to control the temporal semantics of the output, as many other phrases can imply sequence or duration."}], "path": "prompts/_base/scene_detail/20.202605051240/system.md", "scan_kind": "prompt", "sha256": "e5a0910ce397e832d950cf306c3be32c3cdacfba441633ca6cd57ea0c394adfa"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 75, "chunk_start": 1, "chunk_summary": "The schema defines a brittle ID-replacement mechanism for T2I prompts that relies on LLM semantic classification to handle exceptions and documents a downstream blind string mutation process.", "duration_ms": 21834, "findings": [{"category": "semantic_string_judgment", "evidence": "신체 부위 클로즈업, reproduction surface ... 등 예외 구도에서는 보통명사로 대체", "line_end": 16, "line_start": 16, "recommended_fix": "Introduce structured boolean or enum fields (e.g., 'is_detail_shot', 'is_reproduction_surface') to explicitly signal these states to downstream processors instead of relying on the LLM to mutate the prompt string format.", "severity": "P1", "why_problematic": "The LLM is instructed to use semantic visual categories (body part close-ups, reproduction surfaces) as a classifier to decide whether to use structured IDs or natural language. This creates a brittle boundary where the LLM must pivot its string formatting logic based on visual interpretation, which is better handled by structured metadata."}, {"category": "blind_string_mutation", "evidence": "합성 단계가 'the character from Image N'으로 자동 치환", "line_end": 16, "line_start": 16, "recommended_fix": "Pass the prompt and the entity mapping as separate structured fields to the synthesis stage, or use a more robust templating syntax (e.g., {{C01O02}}) that is less likely to collide with natural language.", "severity": "P1", "why_problematic": "This documents a contract for blind substring replacement within the generated T2I prompt prose. This is prone to collision or failure if the LLM-generated text contains the ID patterns (like C01O02) in unintended contexts or if the LLM produces slightly malformed IDs."}], "path": "prompts/_base/scene_detail/22.202605122049/detail_schema.json", "scan_kind": "prompt", "sha256": "37123c7b9efaa3b7112168d1ac0c3b811607fb0889facf1e7ce2f9761cbee384"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 81, "chunk_start": 1, "chunk_summary": "The schema defines a structured scene detail output but contains instructions for conditional entity referencing based on visual semantics and establishes a contract for blind string mutation of generated prompts.", "duration_ms": 17618, "findings": [{"category": "llm_closed_list_instruction", "evidence": "신체 부위 클로즈업, reproduction surface ... 등 예외 구도에서는 보통명사로 대체", "line_end": 16, "line_start": 16, "recommended_fix": "Use a structured boolean or enum field (e.g., 'is_close_up', 'is_reproduction_surface') to explicitly signal these states, and handle the naming convention logic in the prompt assembly code rather than as a conditional instruction within the LLM's prose generation task.", "severity": "P1", "why_problematic": "This instructs the LLM to perform semantic classification of the visual scene (detecting close-ups or reflections) to determine whether to use IDs or common nouns. This creates inconsistent entity referencing logic that depends on the LLM's interpretation of open-world visual tropes."}, {"category": "blind_string_mutation", "evidence": "합성 단계가 'the character from Image N'으로 자동 치환", "line_end": 16, "line_start": 16, "recommended_fix": "Use a templating system or a structured prompt format where entity placeholders are distinct from the natural language prose, or perform the substitution at a stage where the sentence structure can be validated.", "severity": "P1", "why_problematic": "This establishes a contract where the generated natural-language 't2i_prompt' will be modified via blind string replacement of IDs. This is prone to grammatical errors and context-blind substitution when the ID is embedded in complex prose."}], "path": "prompts/_base/scene_detail/23.202605141758/detail_schema.json", "scan_kind": "prompt", "sha256": "7070e3b9450d30e6bc31d0632d894ef8250d9157cc76813352ed95fcdcc9b2dd"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 52, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 5973, "findings": [], "path": "prompts/_base/scene_detail/7.202604201230/detail_schema.json", "scan_kind": "prompt", "sha256": "7b30ebe26e94189a1d2dd6d1afed295c041efc40cc2671a688a265d65301117e"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 597, "chunk_start": 1, "chunk_summary": "The prompt defines several semantic classifiers and validators based on string patterns, including framing scale keywords, body part focus triggers, and character-window-based identity grounding.", "duration_ms": 24384, "findings": [{"category": "semantic_string_judgment", "evidence": "primary_framing_rule.framing_scale_keywords: close-up, CU, MCU, ECU, XCU, extreme close-up, 클로즈업, 손가락이, 손이, 눈이, 얼굴이", "line_end": 155, "line_start": 155, "recommended_fix": "Move framing classification to a structured field in the input schema (e.g., an enum in RenderPromptCard) rather than inferring it from prose keywords.", "severity": "P1", "why_problematic": "Uses a hardcoded list of 11 keywords (including natural language body parts in Korean) to classify visual framing scale, which then triggers different visibility and ID policies."}, {"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": "Pass a explicit boolean flag or focus_target_type in the structured card instead of relying on phrase matching.", "severity": "P1", "why_problematic": "Uses a regex-like phrase pattern over natural language to decide whether to disable character ID injection (C##O##). This is a brittle semantic classifier for safety/policy routing."}, {"category": "semantic_string_judgment", "evidence": "entity_canon.name ... ±60 char window 안에 있어야 한다", "line_end": 516, "line_start": 511, "recommended_fix": "Use structured mapping in the output JSON where IDs are explicitly associated with their descriptive labels, rather than relying on proximity in a flat string.", "severity": "P1", "why_problematic": "Enforces a semantic relationship (identity grounding) using a brittle character-distance heuristic (60-character window) between names and IDs in generated prose."}, {"category": "blind_string_mutation", "evidence": "cross_shot_id_substitution_rule ... 보통명사 인물 ... 을 C##/C##O## 로 치환", "line_end": 119, "line_start": 119, "recommended_fix": "Allow the LLM to generate the correct ID directly in the first pass based on the context, rather than performing a post-hoc substitution.", "severity": "P1", "why_problematic": "Instructs the LLM to perform blind string replacement of natural language descriptions with structured IDs. This is a semantic mutation that can lead to grammatical errors or incorrect identity assignment."}, {"category": "llm_closed_list_instruction", "evidence": "skipped_close_framing: the existing X / from the reference / use the X from the reference / preserving the same room perspective / maintaining the reference's framing / do not generate a new X", "line_end": 143, "line_start": 140, "recommended_fix": "Define the negative constraint as a high-level instruction (e.g., 'do not refer to the background reference') rather than a list of exact substrings.", "severity": "P2", "why_problematic": "Uses a closed list of forbidden phrases to control semantic output for a specific rendering mode. This is brittle and may fail if the LLM uses synonymous phrasing."}], "path": "prompts/_base/scene_detail/23.202605141758/system.md", "scan_kind": "prompt", "sha256": "fcd7953f00be507f9dae1842d26254acfe62ef861a2b86624f27a668921b004c"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 548, "chunk_start": 1, "chunk_summary": "This prompt file defines complex semantic routing and validation logic based on brittle string patterns, including keyword-based framing classification, ID policy triggers, and blind string substitution rules.", "duration_ms": 37355, "findings": [{"category": "semantic_string_judgment", "evidence": "body_part_focus_rule.trigger_phrases ('focus on / close on / tight on / detail on' + 신체부위) 패턴이 등장하면 얼굴·비얼굴 가리지 않고 C##O## 사용 금지", "line_end": 44, "line_start": 41, "recommended_fix": "Move the 'body_part_focus' detection to a structured field in the RenderPromptCard (e.g., a boolean or enum) rather than relying on the LLM to match phrases in the scenario.", "severity": "P1", "why_problematic": "It uses a brittle substring/pattern match over natural language scenario text to trigger a critical behavior change (disabling character ID enforcement). This is prone to false positives and ignores semantic context."}, {"category": "blind_string_mutation", "evidence": "해당 보통명사를 C##/C##O## 로 치환. 같은 인물 C##/C##O## + 보통명사 이중 묘사 금지", "line_end": 115, "line_start": 115, "recommended_fix": "Use structured entity placeholders in the source text that are resolved by the pipeline rather than asking the LLM to perform string replacement on natural language.", "severity": "P1", "why_problematic": "This instructs the LLM to perform blind string substitution of character names/nouns with IDs. This is a 'blind semantic string mutation' contract that can lead to broken grammar or incorrect entity mapping if the substitution context is not handled structurally."}, {"category": "semantic_string_judgment", "evidence": "close 판정 키워드 = 'close-up', 'CU', 'MCU', 'ECU', 'XCU', 'extreme close-up', '클로즈업', '손가락이', '손이', '눈이', '얼굴이' (총 11 entries)", "line_end": 151, "line_start": 151, "recommended_fix": "The framing scale should be a structured enum in the input metadata (RenderPromptCard) rather than being inferred from a list of keywords in the prompt.", "severity": "P1", "why_problematic": "It defines a closed list of keywords, including body parts in Korean, to classify the framing scale of a shot. This is a brittle semantic classifier that drives downstream logic (close_framing_rules)."}, {"category": "semantic_string_judgment", "evidence": "trait 가 'face fully obscured' / 'no visible facial features' / 'face hidden in shadow' 같은 face-obscured 표현을 포함하면, face / jaw / feature 묘사 표현 금지", "line_end": 174, "line_start": 170, "recommended_fix": "Introduce a structured 'visibility_flags' or 'obscured_parts' array in the entity traits schema instead of parsing natural language descriptions.", "severity": "P1", "why_problematic": "It performs semantic judgment by searching for specific natural-language phrases within the 'stable_traits' field to enforce a 'no-face' policy. This is brittle and depends on exact wording in the entity canon."}, {"category": "semantic_string_judgment", "evidence": "entity_canon.name 이 prompt 안에 등장하면 그 specific entity 의 ID 가 같은 sentence + ±60 char window 안에 있어야 한다", "line_end": 466, "line_start": 462, "recommended_fix": "Validate entity presence using structured metadata or token-level tagging rather than character-distance heuristics over natural language.", "severity": "P1", "why_problematic": "This defines a brittle validation rule based on character windowing and substring matching of names and IDs within generated prose. This is a high-risk semantic validator that can fail due to minor formatting or phrasing changes."}], "path": "prompts/_base/scene_detail/21.202605062217/system.md", "scan_kind": "prompt", "sha256": "7e7c680ae4dad5c2c2c1713e66104cab5bc005b11a575adde8296acbdf7fa099"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 532, "chunk_start": 1, "chunk_summary": "The system prompt defines several semantic classifiers and validation rules based on brittle string patterns and closed phrase lists, particularly for framing classification, ID policy triggers, and entity-name mapping.", "duration_ms": 47719, "findings": [{"category": "llm_closed_list_instruction", "evidence": "primary_framing_rule.framing_scale_keywords: close 판정 키워드 = `close-up`, `CU`, `MCU`, `ECU`, `XCU`, `extreme close-up`, `클로즈업`, `손가락이`, `손이`, `눈이`, `얼굴이` (총 11 entries)", "line_end": 151, "line_start": 151, "recommended_fix": "Rely on the structured `framing_scale` field in the RenderPromptCard rather than inferring framing from natural language keywords.", "severity": "P1", "why_problematic": "It uses a hardcoded list of 11 keywords, including specific body parts in Korean, to classify open-world visual framing. This is brittle and fails to capture the semantic variety of framing descriptions."}, {"category": "llm_closed_list_instruction", "evidence": "body_part_focus_rule.trigger_phrases (`focus on / close on / tight on / detail on` + 신체부위) 패턴이 등장하면 ... C##O## 사용 금지", "line_end": 43, "line_start": 41, "recommended_fix": "Introduce a structured boolean flag or enum in the input schema to explicitly signal body-part focus.", "severity": "P1", "why_problematic": "It triggers a significant change in ID policy (forbidding composite IDs) based on a closed list of phrase patterns. This is a semantic classifier that depends on exact wording."}, {"category": "semantic_string_judgment", "evidence": "skipped_close_framing: ... 다음 6개 표현은 절대 출력 금지 — `the existing X` / `from the reference` / `use the X from the reference` / `preserving the same room perspective` / `maintaining the reference's framing` / `do not generate a new X`.", "line_end": 139, "line_start": 136, "recommended_fix": "Define the constraint semantically (e.g., 'do not reference the background or reference image') rather than as a list of forbidden substrings.", "severity": "P1", "why_problematic": "It enforces background binding policy by forbidding a specific list of natural language substrings. This is brittle and easily bypassed by paraphrasing while still violating the underlying intent."}, {"category": "llm_closed_list_instruction", "evidence": "entity-aware silhouette policy: ... 'face fully obscured' / 'no visible facial features' / 'face hidden in shadow' ... 류만 사용한다.", "line_end": 174, "line_start": 170, "recommended_fix": "Use structured trait flags (e.g., `is_face_obscured: true`) in the entity canon rather than matching phrases in natural language traits.", "severity": "P1", "why_problematic": "It infers visibility and silhouette policy from specific phrase patterns within the `stable_traits` field. This is a semantic classifier based on string matching in open-world trait descriptions."}, {"category": "semantic_string_judgment", "evidence": "entity_canon.name 이 prompt 안에 등장하면 그 specific entity 의 ID ... 가 같은 sentence + ±60 char window 안에 있어야 한다.", "line_end": 450, "line_start": 446, "recommended_fix": "Use a structured output schema for entity mapping (e.g., an array of objects linking IDs to their specific descriptors) instead of relying on proximity in the prompt prose.", "severity": "P1", "why_problematic": "It defines a brittle validation rule based on character-window proximity between names and IDs in natural language. This is a high-risk fail-fast mechanism that relies on string patterns rather than structure."}], "path": "prompts/_base/scene_detail/21.202605061636/system.md", "scan_kind": "prompt", "sha256": "7f69a258c9d8d0eb3da6efaca56921d6b8003a70f345c92735eea4d0e5546662"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 52, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 7951, "findings": [], "path": "prompts/_base/scene_detail/9.202604201700/detail_schema.json", "scan_kind": "prompt", "sha256": "7b30ebe26e94189a1d2dd6d1afed295c041efc40cc2671a688a265d65301117e"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 552, "chunk_start": 1, "chunk_summary": "The prompt defines several brittle string-matching rules for classifying framing, ID policy, and entity resolution from natural language, which are prone to drift and misinterpretation.", "duration_ms": 40220, "findings": [{"category": "llm_closed_list_instruction", "evidence": "close 판정 키워드 = 'close-up', 'CU', 'MCU', 'ECU', 'XCU', 'extreme close-up', '클로즈업', '손가락이', '손이', '눈이', '얼굴이'", "line_end": 155, "line_start": 155, "recommended_fix": "Replace keyword-based classification with a structured framing_scale enum in the RenderPromptCard that is determined by the upstream staging analysis.", "severity": "P1", "why_problematic": "Uses a hardcoded list of 11 English and Korean phrases to classify framing scale. This is brittle and fails to capture semantic variations (e.g., 'palm' vs 'hand') or different languages/synonyms."}, {"category": "llm_closed_list_instruction", "evidence": "body_part_focus_rule.trigger_phrases ('focus on / close on / tight on / detail on' + 신체부위) 패턴이 등장하면 ... C##O## 사용 금지", "line_end": 44, "line_start": 41, "recommended_fix": "Use a boolean flag like 'is_body_part_focus' in the id_policy schema instead of inferring it from prompt text patterns.", "severity": "P1", "why_problematic": "Changes the ID policy (stripping character IDs) based on the presence of specific natural language phrase patterns. This makes reference attachment dependent on brittle string matching."}, {"category": "semantic_string_judgment", "evidence": "fixed_elements[i].description 안 보통명사 인물 (\"an adult figure\" / \"the seated person\" 류) 이 ... 치환", "line_end": 119, "line_start": 119, "recommended_fix": "Ensure fixed_elements use stable entity IDs or structured roles rather than natural language descriptions for substitution logic.", "severity": "P1", "why_problematic": "Performs entity resolution by matching generic natural language nouns in descriptions to character IDs. This is highly brittle as descriptions vary significantly in prose."}, {"category": "llm_closed_list_instruction", "evidence": "trait 가 \"face fully obscured\" / \"no visible facial features\" / \"face hidden in shadow\" 같은 face-obscured 표현을 포함하면", "line_end": 176, "line_start": 174, "recommended_fix": "Add a structured 'visibility_state' or 'is_face_obscured' boolean to the entity stable_traits schema.", "severity": "P2", "why_problematic": "Triggers a specific silhouette rendering policy based on exact string matches within entity traits. This creates a hidden dependency on specific wording in the entity canon."}, {"category": "semantic_string_judgment", "evidence": "entity_canon.name 이 prompt 안에 등장하면 ... 같은 sentence + ±60 char window 안에 있어야 한다", "line_end": 470, "line_start": 466, "recommended_fix": "Use structured entity-to-ID mapping in the output schema rather than validating proximity in the natural language prompt string.", "severity": "P2", "why_problematic": "Enforces entity-ID mapping using a brittle character-window distance check. This can lead to false positives/negatives in complex sentences or multi-character descriptions."}], "path": "prompts/_base/scene_detail/22.202605122049/system.md", "scan_kind": "prompt", "sha256": "8af3731123c0c755ed4a0206ecdce55869f88cea7b24b51cc2ace883091ee512"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 20, "chunk_start": 1, "chunk_summary": "No actionable findings; the file defines a generic JSON schema for reporting scene detail violations without scenario-specific pollution or string-based classifiers.", "duration_ms": 4207, "findings": [], "path": "prompts/_base/scene_detail_owned_judge/1.202605032354/schema.json", "scan_kind": "prompt", "sha256": "8c85452fa11026fa9e9aeca09ab9f1a98114674b46bd152beb28ca53c85ba86f"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 273, "chunk_start": 1, "chunk_summary": "The prompt defines several semantic classifiers for entity referencing based on phrase patterns and visual scenarios, and includes instructions for blind string mutation and scenario-specific examples.", "duration_ms": 25663, "findings": [{"category": "llm_closed_list_instruction", "evidence": "판단 기준: 'Focus on / close on / tight on / detail on + 특정 신체 부위' 패턴이 등장하면 무조건 보통명사.", "line_end": 48, "line_start": 48, "recommended_fix": "Replace phrase-based triggers with a structured 'framing' or 'focus_target' field in the input schema that explicitly signals when a shot is a body-part close-up.", "severity": "P1", "why_problematic": "This instructs the LLM to use a brittle string-matching heuristic to decide between using a structured character ID (C##) and a common noun. It forces a semantic decision based on specific phrase patterns rather than the underlying visual intent."}, {"category": "blind_string_mutation", "evidence": "고정 요소 description의 보통명사 인물 묘사...를 해당 C##으로 대체", "line_end": 107, "line_start": 107, "recommended_fix": "Provide the description as a template with placeholders or ask the LLM to generate a new description using the provided IDs rather than performing a 'replace' operation.", "severity": "P1", "why_problematic": "This is a direct instruction for the LLM to perform blind substring replacement of natural language text with technical IDs. This is prone to grammatical errors, incorrect mapping if multiple characters share descriptions, and breaks the separation between prose and metadata."}, {"category": "llm_closed_list_instruction", "evidence": "C## 사용 여부는 얼굴이 식별 가능한지로 판단: ... 완전히 뒤돌아선 인물 ... 실루엣 ... OTS에서 뒷통수/어깨만", "line_end": 25, "line_start": 21, "recommended_fix": "Define a 'visibility_state' enum in the schema (e.g., FACE_VISIBLE, BACK_TO_CAMERA, SILHOUETTE) and use it to drive referencing logic.", "severity": "P2", "why_problematic": "The LLM is acting as a semantic classifier to decide entity referencing (C## vs noun) based on a closed list of visual scenarios. This logic is better handled by upstream metadata or a dedicated visibility/orientation field."}, {"category": "scenario_dependent_prompt", "evidence": "middle-aged Korean woman, Korean man in his 30s, young Korean woman", "line_end": 135, "line_start": 96, "recommended_fix": "Use abstract placeholders like [ethnicity], [gender], or [age_group] in examples to maintain neutrality.", "severity": "P2", "why_problematic": "The prompt contains multiple concrete examples specifying 'Korean' ethnicity and specific age groups. This constitutes scenario pollution that can bias the LLM's generation for scenarios involving different cultures or demographics."}], "path": "prompts/_base/scene_detail/7.202604201230/system.md", "scan_kind": "prompt", "sha256": "0ce7d711cce452479171e24e86872666f98428fa021459def876138f97df4650"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 52, "chunk_start": 1, "chunk_summary": "The file defines a structured JSON schema for scene details, using enums for scene types and abstract placeholders for entity IDs, which is consistent with the pipeline's technical requirements.", "duration_ms": 23926, "findings": [], "path": "prompts/_base/scene_detail/8.202604201530/detail_schema.json", "scan_kind": "prompt", "sha256": "7b30ebe26e94189a1d2dd6d1afed295c041efc40cc2671a688a265d65301117e"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 8, "chunk_start": 1, "chunk_summary": "No actionable findings; the file contains standard prompt section headers and technical state instructions.", "duration_ms": 3411, "findings": [], "path": "prompts/_base/scene_detail_owned_judge/1.202605032354/user_template.md", "scan_kind": "prompt", "sha256": "6d57d82ee092bee6bf0d1eeb1453e3bdc990e6051c40da9472e6788083f196a3"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 597, "chunk_start": 1, "chunk_summary": "The prompt defines several semantic rules and behavior-changing classifiers based on natural-language phrase patterns, including ID policy exemptions, blind noun-to-ID substitution, and scene re-framing triggers.", "duration_ms": 36365, "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": "Pass a structured boolean flag (e.g., is_body_part_focus) in the RenderPromptCard instead of relying on the LLM to detect focus from prose patterns.", "severity": "P1", "why_problematic": "The prompt instructs the LLM to use a specific list of natural-language phrases to classify a shot as a body-part focus, which then triggers a behavior change: prohibiting the use of character IDs (C##O##) in favor of common nouns."}, {"category": "blind_string_mutation", "evidence": "fixed_elements[i].description 안 보통명사 인물 ... 이 ... 매핑이 id_policy 안에 존재 시 해당 보통명사를 C##/C##O## 로 치환", "line_end": 119, "line_start": 119, "recommended_fix": "The source description should already use placeholders or IDs, or the mapping should be handled by a structured entity-linking step rather than string replacement.", "severity": "P1", "why_problematic": "This is a contract for blind semantic mutation where natural-language nouns in a description are replaced with structured IDs based on a mapping. This assumes the noun uniquely and correctly identifies the entity in arbitrary prose."}, {"category": "semantic_string_judgment", "evidence": "stable_traits ... 'face fully obscured' / 'no visible facial features' ... face / jaw / feature 묘사 표현 금지", "line_end": 221, "line_start": 219, "recommended_fix": "Use a structured enum or boolean (e.g., face_visible: false) in the entity traits schema to control vocabulary constraints.", "severity": "P1", "why_problematic": "The prompt asks the LLM to classify the character's visual state by searching for specific phrases within the 'stable_traits' text and then enforces a negative vocabulary constraint on the output based on that match."}, {"category": "semantic_string_judgment", "evidence": "running / riding / walking / moving / chasing / pedaling / rowing ... re-frame 가능", "line_end": 369, "line_start": 369, "recommended_fix": "The complexity or 'motion' status of a shot should be a structured attribute provided by the upstream staging/scenario analysis rather than inferred via verb matching.", "severity": "P1", "why_problematic": "The prompt uses a closed list of motion verbs to classify the complexity of a scene and instructs the LLM to change its depiction strategy (Reframe) based on the presence of these words in the input description."}, {"category": "semantic_string_judgment", "evidence": "entity_canon.name ... 같은 sentence + ±60 char window ... ID 가 ... 있어야 한다", "line_end": 516, "line_start": 511, "recommended_fix": "Use structured entity-to-ID mappings or markup (e.g., [Name](ID)) in the source text instead of proximity-based heuristics.", "severity": "P1", "why_problematic": "This defines a brittle semantic rule for entity linking that uses character proximity (60-character window) to validate that a name mentioned in prose is correctly associated with an ID. This is prone to false positives/negatives in complex sentences."}], "path": "prompts/_base/scene_detail/24.202605151451/system.md", "scan_kind": "prompt", "sha256": "d35e50e1332ba5226384543fa6532ba0dc98f7c38b3d86f5cd3e88b578bdd47a"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 8, "chunk_start": 1, "chunk_summary": "No actionable findings; the template contains standard section headers and technical instructions for state management without scenario pollution or semantic classifiers.", "duration_ms": 3207, "findings": [], "path": "prompts/_base/scene_detail_owned_judge/2.202605051641/user_template.md", "scan_kind": "prompt", "sha256": "6d57d82ee092bee6bf0d1eeb1453e3bdc990e6051c40da9472e6788083f196a3"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 21, "chunk_start": 1, "chunk_summary": "No actionable findings; the file defines a standard JSON schema for structured LLM output without scenario pollution or brittle string patterns.", "duration_ms": 10597, "findings": [], "path": "prompts/_base/scene_detail_owned_judge/2.202605051641/schema.json", "scan_kind": "prompt", "sha256": "2ceaa86e4bda0aec69b371fce33acf8f39965e993a82a7a29e0bc21aa6c25967"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 21, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 10668, "findings": [], "path": "prompts/_base/scene_detail_owned_judge/3.202605051746/schema.json", "scan_kind": "prompt", "sha256": "2ceaa86e4bda0aec69b371fce33acf8f39965e993a82a7a29e0bc21aa6c25967"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 37, "chunk_start": 1, "chunk_summary": "The prompt defines semantic violation and allowance criteria for object redrawing using brittle phrase patterns and specific synonym examples.", "duration_ms": 27001, "findings": [{"category": "llm_closed_list_instruction", "evidence": "create / render / add / draw / place / generate / place a new <owned>, portal for door, near the doorway, from the reference", "line_end": 25, "line_start": 16, "recommended_fix": "Define the classification criteria using abstract semantic principles (e.g., 'existential introduction' vs 'spatial/source anchoring') rather than specific verb or phrase lists, and provide abstract examples of the logic.", "severity": "P1", "why_problematic": "The prompt instructs the LLM to classify whether an object is being redrawn or referenced based on specific phrase patterns and synonym lists. This creates a brittle semantic classifier that may fail on natural language variations not explicitly listed, forcing the LLM to act as a string-pattern matcher rather than a semantic reasoner."}], "path": "prompts/_base/scene_detail_owned_judge/1.202605032354/system.md", "scan_kind": "prompt", "sha256": "4a2e0893bec05cac8b9e6c3f36c19e8ee1c3c64466fe19a66acef828bd7579f9"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 8, "chunk_start": 1, "chunk_summary": "No actionable findings; the template contains only generic placeholders and functional instructions for state management.", "duration_ms": 3132, "findings": [], "path": "prompts/_base/scene_detail_owned_judge/3.202605051746/user_template.md", "scan_kind": "prompt", "sha256": "6d57d82ee092bee6bf0d1eeb1453e3bdc990e6051c40da9472e6788083f196a3"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 47, "chunk_start": 1, "chunk_summary": "The prompt defines a semantic classifier for object redrawing vs. referencing using closed phrase lists and a rigid fallback rule for ambiguous cases.", "duration_ms": 18781, "findings": [{"category": "llm_closed_list_instruction", "evidence": "패턴 예시: create / render / add / draw / place / generate... anchor 참조: near the doorway, beside the table... ambiguous case... 명시적 reference 표현이 없으면 redraw_violation 으로 분류", "line_end": 31, "line_start": 16, "recommended_fix": "Define the semantic intent of 'redrawing' vs. 'referencing' using abstract criteria rather than specific phrase patterns. Allow the LLM to use its linguistic understanding to determine intent, or move the pattern matching to a post-processing step if strict string matching is required.", "severity": "P1", "why_problematic": "The prompt instructs the LLM to perform semantic classification (distinguishing between creating a new object and referencing an existing one) based on a closed list of phrase patterns and a rigid fallback rule. This creates a brittle semantic classifier that may fail on natural language variations or synonyms not included in the list, and forces a 'violation' verdict on ambiguous but potentially valid prose."}], "path": "prompts/_base/scene_detail_owned_judge/2.202605051641/system.md", "scan_kind": "prompt", "sha256": "521a4db44ae22f852bcdbe2954c88a2364e876e5560e4cef48bc7e652d20fd14"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 289, "chunk_start": 1, "chunk_summary": "The prompt defines several semantic classifiers based on phrase patterns and closed vocabulary lists, and it instructs the LLM to perform blind string mutations on scenario text.", "duration_ms": 48422, "findings": [{"category": "semantic_string_judgment", "evidence": "\"Focus on / close on / tight on / detail on + 특정 신체 부위\" 패턴이 등장하면 무조건 보통명사", "line_end": 48, "line_start": 29, "recommended_fix": "Pass a structured 'framing' or 'focus_target' field to the prompt instead of relying on the LLM to parse phrase patterns from the description.", "severity": "P1", "why_problematic": "The prompt defines a semantic classifier based on a closed list of phrase patterns to determine entity referencing logic (C## vs common noun). This makes the system's behavior brittle and dependent on specific natural-language wording in the scenario."}, {"category": "llm_closed_list_instruction", "evidence": "\"사용 가능 어휘 팔레트\" (attacker / assailant / aggressor / predator / pursuer, victim / prey / target, etc.)", "line_end": 184, "line_start": 168, "recommended_fix": "Allow the LLM to use natural language appropriate to the scenario or provide these as non-binding examples rather than a strict 'palette' for selection.", "severity": "P1", "why_problematic": "The prompt restricts open-world semantic description of violence to a closed list of specific terms. This biases the LLM's output and forces it to classify complex scenarios into a narrow set of predefined labels."}, {"category": "blind_string_mutation", "evidence": "고정 요소 description의 보통명사 인물 묘사(\"A Korean man\", \"a woman\" 등)를 해당 C##으로 대체", "line_end": 116, "line_start": 106, "recommended_fix": "Use structured templates for fixed elements where character placeholders are already defined, rather than asking the LLM to find and replace substrings.", "severity": "P1", "why_problematic": "This instructs the LLM to perform blind substring replacement on natural language prose (fixed_elements). This is a brittle way to manage entity references and can result in ungrammatical or nonsensical sentences if the match is imperfect."}, {"category": "schema_or_enum_drift", "evidence": "\"normal\", \"montage\", \"flashback\", \"dream\", \"voiceover\", \"transition\"", "line_end": 288, "line_start": 282, "recommended_fix": "Define these scene types in a central schema or enum and reference that SOT in both the prompt and the code.", "severity": "P2", "why_problematic": "These scene types are defined as a list of strings in the prompt and are likely consumed as exact values by downstream logic. This creates an unenforced string contract that is prone to drift between the prompt and the code."}, {"category": "scenario_dependent_prompt", "evidence": "\"middle-aged Korean woman\", \"Korean man in his 30s\", \"young Korean woman\"", "line_end": 100, "line_start": 95, "recommended_fix": "Replace specific demographic examples with abstract placeholders like 'a middle-aged woman' or 'a man in his 30s' to maintain neutrality.", "severity": "P2", "why_problematic": "The prompt contains concrete demographic and cultural examples (Korean ethnicity, specific age groups) that can bias the LLM's generation for arbitrary future scenarios that may require different settings or characters."}], "path": "prompts/_base/scene_detail/8.202604201530/system.md", "scan_kind": "prompt", "sha256": "58547578315eb8e11069a69f6650baa9b98b0d391c3ea2f8a1e49f74b1c60b9d"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 350, "chunk_start": 1, "chunk_summary": "The prompt defines several semantic classifiers and phrase-based routing rules for character ID usage, entity membership, and scenario-specific vocabulary for violence.", "duration_ms": 40237, "findings": [{"category": "llm_closed_list_instruction", "evidence": "C## 사용 여부는 얼굴이 식별 가능한지로 판단... Focus on / close on / tight on / detail on + 특정 신체 부위 패턴... 2D 매체 속 이미지인가?", "line_end": 102, "line_start": 19, "recommended_fix": "Move visibility, medium, and focus-target classification to structured metadata in the scene/shot schema, allowing the pipeline to handle ID-to-noun conversion deterministically.", "severity": "P1", "why_problematic": "Uses a combination of phrase patterns and semantic categories (visibility, body parts, 2D vs 3D medium) to route between structured IDs (C##) and common nouns. This brittle logic controls reference attachment and face-injection behavior."}, {"category": "blind_string_mutation", "evidence": "고정 요소 description의 보통명사 인물 묘사를 해당 C##으로 대체", "line_end": 110, "line_start": 106, "recommended_fix": "Provide fixed elements as structured data with ID mappings already resolved, or use a template system that doesn't require the LLM to perform manual string replacement.", "severity": "P1", "why_problematic": "Instructs the LLM to perform blind string replacement of natural language descriptions with structured IDs to merge entity states. This is a brittle way to handle semantic data integration."}, {"category": "scenario_dependent_prompt", "evidence": "attacker / assailant / aggressor / predator / tearing flesh, ripped skin, blood spray", "line_end": 226, "line_start": 204, "recommended_fix": "Remove the specific word lists. Use abstract instructions for intensity or move the vocabulary to a separate style-guide module that is injected only when relevant.", "severity": "P2", "why_problematic": "Provides a concrete, high-intensity vocabulary palette for violence/horror scenarios. This biases the LLM towards specific tropes and pollutes the prompt with scenario-specific language."}, {"category": "semantic_string_judgment", "evidence": "visible_entities 엄격 규칙... 목소리만 들리는 인물 제외... 회상/환상/꿈에만 등장 제외", "line_end": 332, "line_start": 323, "recommended_fix": "Derive visibility from structured narrative metadata (e.g., 'presence_type' or 'is_onscreen') rather than asking the LLM to infer it from prose.", "severity": "P1", "why_problematic": "The LLM is tasked with filtering entity membership based on complex narrative semantics (V.O., flashback, remote presence). This determines the behavior-changing 'visible_entities' array."}], "path": "prompts/_base/scene_detail/9.202604201700/system.md", "scan_kind": "prompt", "sha256": "46dcfb78de951ab47fb714ce9f73466397415842b7d46f573570de6144add052"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 25, "chunk_start": 1, "chunk_summary": "The schema defines a scene_type field with a list of allowed values in the description rather than using a formal JSON enum, leading to potential schema drift.", "duration_ms": 8605, "findings": [{"category": "schema_or_enum_drift", "evidence": "\"scene_type\": {\"type\": \"string\", \"description\": \"normal | montage | flashback | dream | voiceover | transition | other\"}", "line_end": 11, "line_start": 11, "recommended_fix": "Change the scene_type definition to use an 'enum' array containing the listed strings.", "severity": "P2", "why_problematic": "The allowed values for scene_type are defined only in the description string rather than as a formal JSON enum. This forces downstream code to rely on exact string matching of LLM output without schema-level enforcement, increasing the risk of drift or unexpected values."}], "path": "prompts/_base/scene_director/6.202603251200/analyze_schema.json", "scan_kind": "prompt", "sha256": "d6ab4edccec1ba46ff95deab0075c434da094aa79e1112c55c26db4a50ecfe64"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 25, "chunk_start": 1, "chunk_summary": "The schema defines a scene_type field with a list of allowed values in the description but fails to enforce them using a JSON enum.", "duration_ms": 9225, "findings": [{"category": "schema_or_enum_drift", "evidence": "\"scene_type\": {\"type\": \"string\", \"description\": \"normal | montage | flashback | dream | voiceover | transition | other\"}", "line_end": 11, "line_start": 11, "recommended_fix": "Convert the scene_type property to use an enum: [\"normal\", \"montage\", \"flashback\", \"dream\", \"voiceover\", \"transition\", \"other\"].", "severity": "P2", "why_problematic": "The allowed values for scene_type are provided as a pipe-separated list in the description rather than a formal JSON enum. This creates a brittle contract where the LLM might produce near-miss strings that downstream logic expects to be exact matches."}], "path": "prompts/_base/scene_director/7.202604031800/analyze_schema.json", "scan_kind": "prompt", "sha256": "d6ab4edccec1ba46ff95deab0075c434da094aa79e1112c55c26db4a50ecfe64"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 77, "chunk_start": 1, "chunk_summary": "The prompt defines a semantic validator that relies on brittle string-matching constraints and closed whitelists of verbs and phrases to judge visual intent.", "duration_ms": 25474, "findings": [{"category": "llm_closed_list_instruction", "evidence": "owned 어휘는 t2i_prompt 의 English token 과 정확히 매칭되어야 한다 (semantic gloss / 번역 매칭 금지)", "line_end": 7, "line_start": 7, "recommended_fix": "Allow the LLM to use semantic matching and normalization to identify objects, rather than enforcing strict token-level identity.", "severity": "P1", "why_problematic": "This instruction explicitly forbids the LLM from using semantic understanding, forcing it to perform exact string matching between a list of nouns and natural language prompt text. This is brittle and prevents the model from correctly identifying referred objects that use synonyms or descriptive variations."}, {"category": "llm_closed_list_instruction", "evidence": "redraw 동사 화이트리스트 (create, render, draw, generate, paint, build, furnish, add, place, put, insert, hang, mount, install, set up) and anchor_reference phrases (from the reference, from chain_bg, the existing X, leaning into, framed together between, etc.)", "line_end": 45, "line_start": 18, "recommended_fix": "Define the classification categories (redraw vs. reference) conceptually and provide the lists as illustrative examples rather than a strict 'whitelist' or 'phrase match' requirement.", "severity": "P1", "why_problematic": "The prompt uses closed whitelists of verbs and spatial phrases as a primary classifier for visual intent (determining if an object is being redrawn or merely referenced). This creates a brittle semantic router that depends on specific keyword presence rather than the actual meaning of the generated prompt."}], "path": "prompts/_base/scene_detail_owned_judge/3.202605051746/system.md", "scan_kind": "prompt", "sha256": "954aaf54f2737cc38b337e7db7e60d54282fe0d8d0887ab71bf0a8c0fa29a1bc"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 52, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 5893, "findings": [], "path": "prompts/_base/scene_extractor_v2/15.202604091500/scene_detail_schema.json", "scan_kind": "prompt", "sha256": "7b30ebe26e94189a1d2dd6d1afed295c041efc40cc2671a688a265d65301117e"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 33, "chunk_start": 1, "chunk_summary": "The prompt defines entity presence using a closed list of narrative tropes and technical devices as a semantic classifier.", "duration_ms": 19170, "findings": [{"category": "llm_closed_list_instruction", "evidence": "영상통화, CCTV, 방송 화면, 홀로그램, VR, 원격 조종/빙의 기술, 유령, 영혼, 아스트랄 투영, V.O., 내레이션, 변장, 쌍둥이 교체, 바디더블, 회상(플래시백), 미래 예견(플래시포워드), 꿈/환상/상상", "line_end": 33, "line_start": 7, "recommended_fix": "Define 'physical presence' using abstract spatial criteria (e.g., 'Does the entity's physical body occupy the scene's coordinate space?') rather than a list of tropes. If specific exclusions like 'holograms' are required, they should be handled via structured metadata or a more generalized rule about 'physical body location'.", "severity": "P1", "why_problematic": "The prompt uses a closed list of specific narrative tropes and technical devices to define the 'physical presence' of entities. This acts as a semantic classifier that biases the LLM toward specific scenario types (e.g., sci-fi or fantasy) and creates brittle logic for entity membership in the output array based on keyword-like concepts."}], "path": "prompts/_base/scene_director/6.202603251200/system.md", "scan_kind": "prompt", "sha256": "14e46d5169f3ff71f18c2f27788e101efc7337555d0a460159d5a18502acbb07"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 11, "chunk_start": 1, "chunk_summary": "No actionable findings; the file contains only generic prompt placeholders and task instructions for scene extraction.", "duration_ms": 2679, "findings": [], "path": "prompts/_base/scene_extractor_v2/15.202604091500/turn0_context.md", "scan_kind": "prompt", "sha256": "f368f86b21e3ba608484cca34a7b58432da01fdf1b1fc07cfde4a96a63627db2"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 75, "chunk_start": 1, "chunk_summary": "The schema defines a T2I prompt field with blind mutation contracts and requires manual synchronization between structured fields and natural language prose.", "duration_ms": 119163, "findings": [{"category": "blind_string_mutation", "evidence": "합성 단계가 'the character from Image N'으로 자동 치환... 신체 부위 클로즈업/사진·거울 속 인물 등... 보통명사로 대체", "line_end": 16, "line_start": 16, "recommended_fix": "Use a structured prompt representation that separates entity references from natural language prose, and move framing-based formatting logic to a dedicated post-processing or rendering stage.", "severity": "P1", "why_problematic": "The schema codifies a brittle system where character IDs are blindly replaced in natural language prose and where the LLM must use visual framing as a semantic classifier to decide string formatting. This creates a high risk of grammatical errors and inconsistent entity representation."}, {"category": "schema_or_enum_drift", "evidence": "t2i_prompt의 복합 ID와 동일한 정보를 명시", "line_end": 19, "line_start": 19, "recommended_fix": "Derive the structured outfit_assignments from the prompt tokens or vice versa in a single source of truth, rather than asking the LLM to duplicate the information.", "severity": "P2", "why_problematic": "Requires the LLM to manually synchronize data between the structured outfit_assignments array and the natural language t2i_prompt string, which is prone to drift and validation failures."}], "path": "prompts/_base/scene_detail/20.202605051240/detail_schema.json", "scan_kind": "prompt", "sha256": "fc4b7b905ec2540a85873e2b6ffbfe7b01f47f44cf38c4bbf2897300d69e2a89"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 25, "chunk_start": 1, "chunk_summary": "The schema defines a semantic scene classifier using a string description instead of a formal enum, creating potential for schema drift.", "duration_ms": 16141, "findings": [{"category": "schema_or_enum_drift", "evidence": "\"scene_type\": {\"type\": \"string\", \"description\": \"normal | montage | flashback | dream | voiceover | transition | other\"}", "line_end": 11, "line_start": 11, "recommended_fix": "Convert the 'scene_type' property to use a formal JSON 'enum' array containing the allowed values.", "severity": "P2", "why_problematic": "The allowed values for scene classification are defined in a natural-language description string rather than a formal JSON enum. This creates a contract that is not enforced by the schema validator, leading to potential drift or parsing failures if the LLM produces variations of these terms (e.g., 'flash-back' vs 'flashback')."}], "path": "prompts/_base/scene_director/8.202604081200/analyze_schema.json", "scan_kind": "prompt", "sha256": "d6ab4edccec1ba46ff95deab0075c434da094aa79e1112c55c26db4a50ecfe64"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 34, "chunk_start": 1, "chunk_summary": "The prompt defines visibility logic for entity membership using a closed list of specific scenario tropes and cinematic techniques as semantic classifiers.", "duration_ms": 18969, "findings": [{"category": "llm_closed_list_instruction", "evidence": "교차편집/몽타주... 영상통화, CCTV, 방송 화면, 홀로그램, VR, 원격 조종/빙의 기술... V.O.(보이스오버), 내레이션... 변장, 쌍둥이 교체, 바디더블... 회상/꿈/환상/상상... 유령... 빙의/원격접속", "line_end": 24, "line_start": 7, "recommended_fix": "Generalize the visibility criteria into a physical/optical principle (e.g., 'Is the entity's visual form or its direct representation captured by the camera lens in this scene?'). Move specific trope-based edge cases to few-shot examples or a separate configuration.", "severity": "P2", "why_problematic": "The prompt instructs the LLM to determine entity visibility (present_entity_ids) by matching scene text against a closed list of specific scenario tropes and cinematic techniques. This functions as a semantic classifier that may bias the model or fail to generalize to scenarios not explicitly listed (e.g., reflections, shadows, or different types of remote presence)."}], "path": "prompts/_base/scene_director/8.202604081200/system.md", "scan_kind": "prompt", "sha256": "c0ccc32eff66642ab081fe58317496e4a28b0f9fce2761af72db227b96682b75"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 11, "chunk_start": 1, "chunk_summary": "No actionable findings; this chunk contains only generic prompt headers and placeholders for scenario context.", "duration_ms": 3305, "findings": [], "path": "prompts/_base/scene_extractor_v2/16.202604091800/turn0_context.md", "scan_kind": "prompt", "sha256": "f368f86b21e3ba608484cca34a7b58432da01fdf1b1fc07cfde4a96a63627db2"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 33, "chunk_start": 1, "chunk_summary": "The prompt defines entity visibility using a closed list of narrative markers and genre-specific tropes, which acts as a semantic classifier for the LLM.", "duration_ms": 28547, "findings": [{"category": "llm_closed_list_instruction", "evidence": "V.O.(보이스오버), 내레이션, CCTV, 방송 화면, 홀로그램, VR, 원격 조종/빙의, 유령, 변장, 쌍둥이 교체, 바디더블", "line_end": 33, "line_start": 7, "recommended_fix": "Generalize the visibility criteria to focus on physical presence in the frame and move specific trope handling to genre-specific prompt layers or structured metadata.", "severity": "P2", "why_problematic": "The prompt instructs the LLM to classify entity visibility based on a closed list of narrative markers and specific tropes (e.g., possession, body doubles). This creates a brittle semantic classifier that relies on the LLM identifying these specific patterns in natural language and may bias results toward these specific scenarios."}], "path": "prompts/_base/scene_director/7.202604031800/system.md", "scan_kind": "prompt", "sha256": "e9ca2d9d4766d1a05be6666c599622e8e799ca8336fb067a83ab2caaffc3d464"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 13, "chunk_start": 1, "chunk_summary": "The prompt establishes a brittle contract for scene splitting based on exact substring matching of scenario text.", "duration_ms": 17145, "findings": [{"category": "blind_string_mutation", "evidence": "split_after_line 규칙 ... 원문에서 정확히 복사한 한 줄이어야 함 (띄어쓰기, 문장부호 포함 100% 일치)", "line_end": 11, "line_start": 8, "recommended_fix": "Pass the scenario text with line numbers or unique IDs and have the LLM return the ID of the line after which to split, avoiding reliance on exact string matching.", "severity": "P1", "why_problematic": "The prompt mandates an exact 100% match of a line from the scenario to be used as a split marker. This is a brittle contract for structural mutation (splitting) of natural language text, as minor LLM hallucinations in punctuation or spacing will break the downstream logic."}], "path": "prompts/_base/scene_extractor_v2/15.202604091500/turn1_split_long.md", "scan_kind": "prompt", "sha256": "f17b9125bdb94d8dd7bd8117cf0114b63ad745161c074e6ff1b111f3b3a80002"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 52, "chunk_start": 1, "chunk_summary": "The file defines a structured JSON schema for scene details, including T2I prompt formatting and scene types, with no actionable scenario pollution or brittle semantic string debt.", "duration_ms": 14844, "findings": [], "path": "prompts/_base/scene_extractor_v2/16.202604091800/scene_detail_schema.json", "scan_kind": "prompt", "sha256": "7b30ebe26e94189a1d2dd6d1afed295c041efc40cc2671a688a265d65301117e"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 92, "chunk_start": 1, "chunk_summary": "The prompt contains scenario-specific examples (Korean/Joseon-era) and prompt-side semantic mappings that translate technical camera labels into visual descriptions.", "duration_ms": 19825, "findings": [{"category": "llm_closed_list_instruction", "evidence": "\"soft_light_intimate\" → \"soft warm light...\", \"dutch_angle\" → \"the frame is tilted...\", \"over_the_shoulder\" → \"the camera is positioned...\"", "line_end": 45, "line_start": 43, "recommended_fix": "Move the visual expansion logic to a central configuration or include the description directly in the input data for the camera_effect field.", "severity": "P2", "why_problematic": "The prompt defines a hardcoded mapping of technical identifiers to visual prose descriptions. This creates a semantic classifier within the prompt that must be manually synchronized with the system's camera technique vocabulary."}, {"category": "scenario_dependent_prompt", "evidence": "\"Korean police officer\", \"Korean-style apartment\", \"Korean convenience store\", \"Joseon-era nobleman\"", "line_end": 68, "line_start": 66, "recommended_fix": "Replace specific cultural/historical examples with abstract placeholders like \"[Region]-style apartment\" or \"[Era] nobleman\".", "severity": "P2", "why_problematic": "The prompt uses concrete, culture-specific and era-specific examples (Korean, Joseon-era) to illustrate general rules. This can bias the LLM's generation toward these specific tropes even when the target scenario is different."}, {"category": "scenario_dependent_prompt", "evidence": "\"캡슐속 남자들\"이 헬기에 타고 있다면 → 캡슐은 헬기에 없으므로 제외", "line_end": 91, "line_start": 91, "recommended_fix": "Use a generic example of spatial exclusion, such as an object mentioned as being in a different location or a container not present in the current scene.", "severity": "P2", "why_problematic": "Uses a highly specific scenario example (men in capsules in a helicopter) to explain entity exclusion logic, which is unnecessary scenario pollution."}], "path": "prompts/_base/scene_extractor_v2/15.202604091500/turn_scene_detail.md", "scan_kind": "prompt", "sha256": "9fdd05f4f433c27db905ea8ead5122263d967282a9d0f28f2fdbe26c98b5c841"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 52, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 4761, "findings": [], "path": "prompts/_base/scene_extractor_v2/17.202604101200/scene_detail_schema.json", "scan_kind": "prompt", "sha256": "7b30ebe26e94189a1d2dd6d1afed295c041efc40cc2671a688a265d65301117e"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 11, "chunk_start": 1, "chunk_summary": "No actionable findings; the file contains standard prompt headers and placeholders for scenario context without scenario pollution or semantic string classifiers.", "duration_ms": 2823, "findings": [], "path": "prompts/_base/scene_extractor_v2/17.202604101200/turn0_context.md", "scan_kind": "prompt", "sha256": "f368f86b21e3ba608484cca34a7b58432da01fdf1b1fc07cfde4a96a63627db2"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 13, "chunk_start": 1, "chunk_summary": "The prompt defines a brittle contract for scene splitting based on exact natural-language substring matching.", "duration_ms": 18122, "findings": [{"category": "blind_string_mutation", "evidence": "split_after_line 규칙... 원문에서 정확히 복사한 한 줄이어야 함... 그 줄 직후에서 씬이 분할됩니다", "line_end": 11, "line_start": 8, "recommended_fix": "Pass line numbers or unique identifiers to the LLM and have it return the index/ID where the split should occur, rather than relying on exact string matching of natural language prose.", "severity": "P1", "why_problematic": "The prompt requires the LLM to provide an exact substring from the scenario to serve as a structural delimiter. This is a brittle contract for blind string mutation; any minor hallucination or formatting change by the LLM will cause the split logic to fail."}], "path": "prompts/_base/scene_extractor_v2/16.202604091800/turn1_split_long.md", "scan_kind": "prompt", "sha256": "f17b9125bdb94d8dd7bd8117cf0114b63ad745161c074e6ff1b111f3b3a80002"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 70, "chunk_start": 1, "chunk_summary": "The prompt contains instructions for semantic classification based on specific phrase patterns and includes scenario-specific character names and props in its examples.", "duration_ms": 30317, "findings": [{"category": "llm_closed_list_instruction", "evidence": "<몽타주>, V.O., 전화 통화, 무전, 방송 음성", "line_end": 58, "line_start": 47, "recommended_fix": "Define these categories using abstract semantic descriptions or provide a wider, more varied set of examples that do not rely on exact string matches.", "severity": "P1", "why_problematic": "The prompt instructs the LLM to classify scene types (montage, voiceover) and determine entity visibility based on a closed list of specific string patterns and phrases rather than general semantic understanding. This creates a brittle dependency on exact script formatting."}, {"category": "scenario_dependent_prompt", "evidence": "\"동녘(강의원)\", \"캡슐속 남자들\"", "line_end": 63, "line_start": 60, "recommended_fix": "Replace specific names and props with abstract placeholders like 'Character A', 'Character B', or generic objects like 'a chair' or 'a car'.", "severity": "P2", "why_problematic": "The prompt uses concrete scenario-specific character names and props as examples for visibility logic. These specific names and tropes can bias the LLM toward specific story contexts or genres during generation."}], "path": "prompts/_base/scene_extractor_v2/16.202604091800/system.md", "scan_kind": "prompt", "sha256": "4f554d5306bcdfddb6b83f99efcc2bc9ddfd50de9991a6a147b30f04bfa2596c"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 52, "chunk_start": 1, "chunk_summary": "The file defines a JSON schema for scene extraction and T2I prompt generation, using abstract placeholders and canonical enums without scenario-specific pollution.", "duration_ms": 12651, "findings": [], "path": "prompts/_base/scene_extractor_v2/18.202605150955/scene_detail_schema.json", "scan_kind": "prompt", "sha256": "7b30ebe26e94189a1d2dd6d1afed295c041efc40cc2671a688a265d65301117e"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 70, "chunk_start": 1, "chunk_summary": "The prompt contains scenario-specific character names and prop examples, as well as instructions for the LLM to perform semantic classification based on specific natural language phrase patterns.", "duration_ms": 25158, "findings": [{"category": "scenario_dependent_prompt", "evidence": "예: \"동녘(강의원)\", 예: \"캡슐속 남자들\"", "line_end": 63, "line_start": 60, "recommended_fix": "Replace scenario-specific names and props with abstract placeholders like 'Character A', 'Character B', or 'Prop A'.", "severity": "P2", "why_problematic": "The prompt uses concrete character names ('동녘', '강의원') and specific props ('캡슐') from a particular scenario as examples. This pollutes the base prompt and can bias the LLM's behavior in unrelated scenarios."}, {"category": "llm_closed_list_instruction", "evidence": "V.O., 전화 통화, 무전, 방송 음성, <몽타주> 표시", "line_end": 58, "line_start": 47, "recommended_fix": "Instead of relying on specific phrase patterns, instruct the LLM to infer visibility and scene type from the overall context and physical presence described in the scenario.", "severity": "P2", "why_problematic": "The prompt instructs the LLM to classify scene types and determine entity visibility based on the presence of specific natural language phrases or markers. This is a brittle way to handle open-world scenario semantics."}], "path": "prompts/_base/scene_extractor_v2/17.202604101200/system.md", "scan_kind": "prompt", "sha256": "4f554d5306bcdfddb6b83f99efcc2bc9ddfd50de9991a6a147b30f04bfa2596c"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 81, "chunk_start": 1, "chunk_summary": "The schema defines a contract for scene detailing where visual framing and semantic context (close-ups, reproduction surfaces) are signaled by mutating string patterns (IDs vs nouns) and specifies a blind string replacement mechanism for character references.", "duration_ms": 115394, "findings": [{"category": "semantic_string_judgment", "evidence": "신체 부위 클로즈업, reproduction surface... 등 예외 구도에서는 보통명사로 대체", "line_end": 16, "line_start": 16, "recommended_fix": "Add a structured 'framing_context' or 'is_id_exempt' boolean/enum to the variation object instead of relying on the presence or absence of ID patterns in the prompt string.", "severity": "P1", "why_problematic": "Visual framing (close-up) and semantic context (reproduction surface) are used as classifiers to decide whether to use structured IDs (C01O02) or common nouns. This implies downstream logic infers the 'exception' state by the absence of ID patterns, which is a brittle way to handle framing-based ID exemptions."}, {"category": "blind_string_mutation", "evidence": "합성 단계가 'the character from Image N'으로 자동 치환", "line_end": 16, "line_start": 16, "recommended_fix": "Use a structured prompt assembly system or templating engine that handles reference resolution before final string generation rather than post-hoc string replacement.", "severity": "P1", "why_problematic": "This defines a contract for blind substring replacement of technical IDs with natural language reference phrases in the final T2I prompt, which can lead to grammatical errors or broken prompt logic if the context changes."}], "path": "prompts/_base/scene_detail/24.202605151451/detail_schema.json", "scan_kind": "prompt", "sha256": "7070e3b9450d30e6bc31d0632d894ef8250d9157cc76813352ed95fcdcc9b2dd"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 11, "chunk_start": 1, "chunk_summary": "No actionable findings; the file contains only standard prompt template placeholders and section headers.", "duration_ms": 2647, "findings": [], "path": "prompts/_base/scene_extractor_v2/18.202605150955/turn0_context.md", "scan_kind": "prompt", "sha256": "f368f86b21e3ba608484cca34a7b58432da01fdf1b1fc07cfde4a96a63627db2"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 1, "chunk_start": 1, "chunk_summary": "No actionable findings; the file contains a generic template for labeling reference images using abstract placeholders.", "duration_ms": 2941, "findings": [], "path": "prompts/_base/scene_generator/v1/reference_labels.md", "scan_kind": "prompt", "sha256": "716fcd1b63425a1ecfaef17b53941cffb513939576e2e18744feae428e3f4e00"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 8, "chunk_start": 1, "chunk_summary": "The prompt contains scenario-specific cultural and genre constraints in a base rule file.", "duration_ms": 10403, "findings": [{"category": "scenario_dependent_prompt", "evidence": "Korean aesthetics, fantasy armor, or medieval architecture", "line_end": 6, "line_start": 5, "recommended_fix": "Relocate scenario-specific constraints to a project-level or scenario-level prompt template.", "severity": "P2", "why_problematic": "These are concrete scenario-specific style and genre constraints embedded in a base rule file, which biases the model against non-Korean or non-contemporary settings."}], "path": "prompts/_base/scene_generator/v1/scene_rules_en.md", "scan_kind": "prompt", "sha256": "a6784e29342462a9e7a9cf7f8df8e7ebaeeb5ea296caee90b8562defd22dc568"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 70, "chunk_start": 1, "chunk_summary": "The prompt contains brittle string-based classification rules for scene types and scenario-specific logic related to a 'possession' mechanic.", "duration_ms": 24173, "findings": [{"category": "semantic_string_judgment", "evidence": "(<몽타주> 표시 또는 빠른 컷 전환)", "line_end": 47, "line_start": 47, "recommended_fix": "Instruct the LLM to identify montage sequences based on semantic characteristics (e.g., rapid time jumps, multiple locations) rather than specific bracketed markers.", "severity": "P1", "why_problematic": "Instructs the LLM to classify a scene as 'montage' based on the presence of a specific Korean string pattern in the input scenario text, which is a brittle way to infer cinematic structure."}, {"category": "scenario_dependent_prompt", "evidence": "rule_type=possession, remote_identity, visible_body", "line_end": 60, "line_start": 60, "recommended_fix": "Move scenario-specific entity relationship rules to a dynamic configuration or a specialized prompt layer rather than the base system prompt.", "severity": "P2", "why_problematic": "Hardcodes a specific 'possession' or 'remote control' story mechanic into the base scene extraction logic. This is scenario pollution that assumes the existence of specific supernatural or sci-fi tropes in arbitrary scenarios."}], "path": "prompts/_base/scene_extractor_v2/18.202605150955/system.md", "scan_kind": "prompt", "sha256": "acf7ef11303d21772e3caa534a4c7c76b02a391b7de8574ceb0e881072ca1874"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 13, "chunk_start": 1, "chunk_summary": "The prompt defines a structural splitting mechanism based on exact substring matching of scenario text, which is a brittle contract for blind string mutation.", "duration_ms": 38211, "findings": [{"category": "blind_string_mutation", "evidence": "split_after_line 규칙 (매우 중요): - 원문에서 정확히 복사한 한 줄이어야 함 (띄어쓰기, 문장부호 포함 100% 일치) ... 그 줄 직후에서 씬이 분할됩니다", "line_end": 11, "line_start": 8, "recommended_fix": "Use line numbers or unique block identifiers to define split points instead of relying on exact natural language string matching.", "severity": "P1", "why_problematic": "This establishes a contract where the LLM must perfectly reproduce a natural language substring to control scenario structure. Any minor hallucination or formatting change by the LLM will cause the downstream splitting logic to fail or corrupt the scenario."}], "path": "prompts/_base/scene_extractor_v2/17.202604101200/turn1_split_long.md", "scan_kind": "prompt", "sha256": "f17b9125bdb94d8dd7bd8117cf0114b63ad745161c074e6ff1b111f3b3a80002"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 1, "chunk_start": 1, "chunk_summary": "No actionable findings; the file contains a generic structural template for reference image labeling without scenario pollution or semantic classifiers.", "duration_ms": 2250, "findings": [], "path": "prompts/_base/scene_generator/v2/reference_labels.md", "scan_kind": "prompt", "sha256": "716fcd1b63425a1ecfaef17b53941cffb513939576e2e18744feae428e3f4e00"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 13, "chunk_start": 1, "chunk_summary": "The prompt defines a brittle contract for splitting scenario text based on exact natural-language substring matching.", "duration_ms": 27851, "findings": [{"category": "blind_string_mutation", "evidence": "split_after_line 규칙 (매우 중요): - 원문에서 정확히 복사한 한 줄이어야 함 (띄어쓰기, 문장부호 포함 100% 일치)", "line_end": 11, "line_start": 8, "recommended_fix": "Use line indices or unique line IDs to identify the split point instead of relying on exact natural-language substring matching.", "severity": "P1", "why_problematic": "This instruction requires the LLM to provide an exact substring from the scenario to drive structural splitting. Natural language text is prone to minor variations (whitespace, punctuation) during LLM generation, making exact string matching a brittle mechanism for scenario mutation."}], "path": "prompts/_base/scene_extractor_v2/18.202605150955/turn1_split_long.md", "scan_kind": "prompt", "sha256": "f17b9125bdb94d8dd7bd8117cf0114b63ad745161c074e6ff1b111f3b3a80002"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 8, "chunk_start": 1, "chunk_summary": "The scene rules contain hardcoded geographic, temporal, and genre-specific constraints that bias the generator toward a specific setting.", "duration_ms": 16840, "findings": [{"category": "scenario_dependent_prompt", "evidence": "동시대~근미래 한국 기준, 사극풍 복식, 판타지 갑옷, 중세풍 건축 금지", "line_end": 6, "line_start": 5, "recommended_fix": "Move setting-specific and genre-specific constraints to a dynamic configuration or a project-specific prompt layer rather than including them in the base scene rules.", "severity": "P2", "why_problematic": "The prompt hardcodes a specific setting (Korea, contemporary/near-future) and specific genre exclusions (historical drama, fantasy, medieval) into base rules, which biases the model against arbitrary scenarios or different cultural contexts."}], "path": "prompts/_base/scene_generator/v1/scene_rules_ko.md", "scan_kind": "prompt", "sha256": "88ea6d5dd050060178279c1899161b5a837221c25ff3a4f7382779e38320e7e9"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 109, "chunk_start": 1, "chunk_summary": "The prompt defines several semantic rules for T2I generation, including a closed list of camera/color options and a logic rule for omitting character IDs based on visual state (silhouettes/shadows).", "duration_ms": 35929, "findings": [{"category": "semantic_string_judgment", "evidence": "얼굴/형태 식별 불가 인물 — short_id 사용 금지: 실루엣, 그림자, 창문 반사, 역광, 안개 속 등으로 인물의 얼굴이나 신체 형태를 식별할 수 없는 경우 C##O## short_id를 사용하지 마세요.", "line_end": 38, "line_start": 34, "recommended_fix": "Pass a structured 'visibility_state' or 'is_silhouette' flag for each entity from the previous analysis step instead of asking the LLM to infer it from prose.", "severity": "P1", "why_problematic": "This instruction requires the LLM to perform semantic judgment on the scenario text (identifying visual states like 'silhouette' or 'backlight') to decide whether to include or exclude a character's short_id. This is a brittle routing mechanism that affects entity membership and reference attachment in the generated image."}, {"category": "llm_closed_list_instruction", "evidence": "카메라 구도 선택지: low angle / high angle / dutch angle / over-the-shoulder / bird's eye / extreme wide / tight medium\n색감 선택지: warm amber / cold blue / high contrast / desaturated / golden hour / neon-lit / silhouette backlight", "line_end": 92, "line_start": 91, "recommended_fix": "Define these options in a central schema/enum and inject them into the prompt dynamically, or ensure the downstream consumer handles arbitrary descriptive text.", "severity": "P2", "why_problematic": "The prompt provides a closed list of semantic categories for camera angles and color palettes. If downstream code or validators expect these exact strings, it creates a schema drift risk where the prompt and code must be manually synchronized."}, {"category": "semantic_string_judgment", "evidence": "visible_entities 주의사항: 이 씬의 화면에 물리적으로 존재하는 대상만 넣으세요 ... 예: \"<container descriptor> 안의 인물들\"이 <transport vehicle>에 타고 있다면 → container 는 transport vehicle 에 없으므로 제외", "line_end": 109, "line_start": 105, "recommended_fix": "Move entity visibility logic to a dedicated structured analysis step that uses a world-state model rather than relying on LLM interpretation of prose during prompt generation.", "severity": "P1", "why_problematic": "The LLM is instructed to perform complex semantic filtering of entities based on physical presence and containment logic described in natural language. This is a high-risk area for inconsistent entity membership across scenes."}], "path": "prompts/_base/scene_extractor_v2/18.202605150955/turn_scene_detail.md", "scan_kind": "prompt", "sha256": "a32ab2a3e97d6e51050ae5abda5d9ee002879725bc1ee1d626e9436b3d4c03d2"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 8, "chunk_start": 1, "chunk_summary": "The prompt contains hardcoded genre-specific exclusions in a base rule file, which creates scenario pollution and potential conflicts with dynamic world rules.", "duration_ms": 16975, "findings": [{"category": "scenario_dependent_prompt", "evidence": "No ... fantasy armor, or medieval architecture", "line_end": 6, "line_start": 6, "recommended_fix": "Remove specific genre/era examples from the base rules and move them to the project-specific world rules or style guide to maintain the base prompt's neutrality.", "severity": "P2", "why_problematic": "Hardcoding specific genre-based exclusions (fantasy, medieval) in a base prompt biases the model and may conflict with the dynamic 'world rules' mentioned in line 5, which are intended to define the era and region."}], "path": "prompts/_base/scene_generator/v2/scene_rules_en.md", "scan_kind": "prompt", "sha256": "5bf6b0dac84a14275eb5f6ce71888aed7e0743c171004a3b143e1a9493581a0b"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 26, "chunk_start": 1, "chunk_summary": "The prompt contains concrete cultural and historical examples in its analysis categories which may bias the LLM's style rule generation for arbitrary scenarios.", "duration_ms": 20008, "findings": [{"category": "scenario_dependent_prompt", "evidence": "조선시대 (line 5), 한국, 일본, 미국, 유럽 (line 6), 한복 (line 9)", "line_end": 10, "line_start": 5, "recommended_fix": "Generalize the examples by removing specific cultural/national names and historical periods, or use abstract placeholders like 'Specific Historical Period' and 'Regional/Cultural Style' to ensure the base prompt remains neutral.", "severity": "P2", "why_problematic": "The base prompt includes specific cultural and historical examples (Joseon Dynasty, Korea, Japan, Hanbok) within its analysis categories. These concrete references can bias the LLM's stylistic analysis and rule generation, potentially leaking specific cultural or historical elements into unrelated or fictional scenarios where they do not belong."}], "path": "prompts/_base/scene_generator/v1/style_rules_generator.md", "scan_kind": "prompt", "sha256": "45cdd96820cd73fe19915326811a36b83f7e5b4abc1d93a8a4d563673b8d24d6"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 109, "chunk_start": 1, "chunk_summary": "The prompt contains semantic classifiers for entity ID suppression and membership based on visual/spatial context, along with scenario-specific examples that bias generation towards Korean/Joseon contexts.", "duration_ms": 60088, "findings": [{"category": "semantic_string_judgment", "evidence": "얼굴/형태 식별 불가 인물 — short_id 사용 금지: 실루엣, 그림자, 창문 반사, 역광, 안개 속... C##O## short_id를 사용하지 마세요.", "line_end": 38, "line_start": 34, "recommended_fix": "Pass identifiability or visual state as a structured field from the upstream extractor rather than having the LLM infer it and mutate the ID format.", "severity": "P1", "why_problematic": "This instruction asks the LLM to classify visual identifiability from a closed list of semantic conditions (silhouette, shadow, etc.) and use that to decide whether to suppress structured entity IDs. This breaks the entity tracking chain and reference attachment based on a semantic guess."}, {"category": "scenario_dependent_prompt", "evidence": "예: 한국 배경이면 'Korean police officer', 'Korean-style apartment'... 예: 조선시대면 'Joseon-era nobleman'... generic 묘사 금지 ('police officer' -> 'Korean police officer')", "line_end": 85, "line_start": 83, "recommended_fix": "Replace specific cultural examples with abstract placeholders or move them to a project-specific configuration/system prompt.", "severity": "P2", "why_problematic": "The prompt contains concrete scenario-specific examples (Korean, Joseon) and explicitly forbids generic descriptions, biasing the LLM towards a specific culture/era regardless of the actual world-building context provided in the system prompt."}, {"category": "semantic_string_judgment", "evidence": "visible_entities 주의사항: 이 씬의 화면에 물리적으로 존재하는 대상만 넣으세요... 텍스트에 이름/단어가 등장해도, 실제로 그 공간에 없으면 제외", "line_end": 109, "line_start": 105, "recommended_fix": "Use structured spatial data or a dedicated visibility classifier rather than relying on LLM inference from scene prose during extraction.", "severity": "P1", "why_problematic": "This is a semantic classifier instruction that asks the LLM to determine entity membership in the 'visible_entities' list based on spatial/physical presence inferred from natural language. This logic is brittle and affects downstream reference attachment and validation."}], "path": "prompts/_base/scene_extractor_v2/17.202604101200/turn_scene_detail.md", "scan_kind": "prompt", "sha256": "df067460057e0dcc3ed26fa8babdbf89e384f7863bea96d1d38844cac88b7f37"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 8, "chunk_start": 1, "chunk_summary": "The prompt contains hard-coded negative constraints for specific genres and styles (historical drama, fantasy, medieval) which constitutes scenario pollution in a base rule file.", "duration_ms": 16495, "findings": [{"category": "scenario_dependent_prompt", "evidence": "사극풍 복식, 판타지 갑옷, 중세풍 건축 금지", "line_end": 6, "line_start": 6, "recommended_fix": "Move genre-specific negative constraints to a project-specific configuration or dynamic style guide injection instead of hard-coding them in the base prompt.", "severity": "P2", "why_problematic": "These are concrete genre-specific exclusions (historical drama costumes, fantasy armor, medieval architecture) hard-coded into base scene rules. This biases the LLM against these themes, which may conflict with scenarios defined in the world rules mentioned in line 5, and prevents the generator from being truly scenario-agnostic."}], "path": "prompts/_base/scene_generator/v2/scene_rules_ko.md", "scan_kind": "prompt", "sha256": "e355584a8818267261533a37e10c4d28a131ef3da9ea1fe81f047087d7697856"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 45, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt provides high-level extraction and formatting instructions without scenario pollution or brittle string-based classification rules.", "duration_ms": 3973, "findings": [], "path": "prompts/_base/scene_stills/v2/system.md", "scan_kind": "prompt", "sha256": "7848addcddf180703f4da529dd5ca23311af3e4601040cda8a01c329cb9179da"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 35, "chunk_start": 1, "chunk_summary": "The prompt defines strict negative constraints to avoid triggering a brittle downstream string-matching validator that fails renders based on specific natural-language phrases.", "duration_ms": 8465, "findings": [{"category": "semantic_string_judgment", "evidence": "PHANTOM PHRASE PROHIBITION (strict): ... phrases trigger a downstream phantom-reference validator and will fail the render", "line_end": 26, "line_start": 23, "recommended_fix": "Replace the downstream string-matching validator with a structured check or a semantic model that understands context, or move reference tracking to a non-natural-language metadata field that is not part of the final T2I prompt string.", "severity": "P1", "why_problematic": "The prompt explicitly identifies a downstream validator that uses brittle string patterns (e.g., 'from the reference') over generated natural-language prose to fail-fast the rendering process. This forces the prompt to include complex negative constraints to avoid accidental semantic triggers."}], "path": "prompts/_base/scene_image/3.202605101200/translate_prompt.md", "scan_kind": "prompt", "sha256": "7b0e7b75cbaccc81a2777037a2609d31a17197a7002f1c8f37f5deb851fb8b71"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 8, "chunk_start": 1, "chunk_summary": "No actionable findings; the file is a standard JSON schema for a scene summary without scenario pollution or semantic string logic.", "duration_ms": 2460, "findings": [], "path": "prompts/_base/scene_summary/1.202603231200/summary_schema.json", "scan_kind": "prompt", "sha256": "3eebe99502b2b118d100b562767de2fb26fe2ebe9b1f4759ce47bc97faaaeca3"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 19, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt is a clean template using placeholders for screenplay extraction without scenario pollution or brittle semantic classifiers.", "duration_ms": 4621, "findings": [], "path": "prompts/_base/scene_stills/v2/user.md", "scan_kind": "prompt", "sha256": "b1bb4ffe42ae8067c44aa187fc08c411486fee93a4b97d13cd68210f4b430b3d"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 11, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt contains generic instructions for scene summarization without scenario pollution or brittle semantic classifiers.", "duration_ms": 3060, "findings": [], "path": "prompts/_base/scene_summary/1.202603231200/system.md", "scan_kind": "prompt", "sha256": "a2bcc469aceb162567f95b226080394e40580343556be69f8fa67709f715d10f"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 20, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 2843, "findings": [], "path": "prompts/_base/scene_verify/1.202603231200/verify_schema.json", "scan_kind": "prompt", "sha256": "3fc6a5b81451494904a5435dfac61376b52940b9fe0b500dc2b1fa292085de45"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 39, "chunk_start": 1, "chunk_summary": "No actionable findings; the file defines a structural JSON schema for cinematography techniques without scenario pollution or brittle string classifiers.", "duration_ms": 3788, "findings": [], "path": "prompts/_base/shot_cinematography/1.202603281644/cine_schema.json", "scan_kind": "prompt", "sha256": "372fd1f6b4cd399324f2b4fae119af028284e69783a824d1f96a717b392dea6d"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 26, "chunk_start": 1, "chunk_summary": "The style rules generator prompt provides generic analysis categories and output sections for T2I style guidance without using brittle classifiers or scenario-specific pollution.", "duration_ms": 20771, "findings": [], "path": "prompts/_base/scene_generator/v2/style_rules_generator.md", "scan_kind": "prompt", "sha256": "45cdd96820cd73fe19915326811a36b83f7e5b4abc1d93a8a4d563673b8d24d6"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 29, "chunk_start": 1, "chunk_summary": "The prompt defines rules for translating T2I prompts into scene descriptions, including blind string replacement for entity IDs and a closed-list semantic filter for camera framing.", "duration_ms": 18019, "findings": [{"category": "blind_string_mutation", "evidence": "Replace character/object IDs (C##O##, P##, etc.) with \"the character/object from Reference image N\" format", "line_end": 5, "line_start": 5, "recommended_fix": "Pass structured entity metadata and use a templating system or a scene-graph-aware replacement logic rather than asking the LLM to perform string-level ID mapping.", "severity": "P1", "why_problematic": "This establishes a contract for the LLM to perform blind substring replacement of entity IDs within generated prompt prose. This is brittle as it relies on the LLM to correctly identify and replace these patterns without context-aware validation, which can lead to broken references if IDs appear in non-entity contexts or are hallucinated."}, {"category": "llm_closed_list_instruction", "evidence": "Do NOT include camera angles or shot types (no \"close-up\", \"wide shot\", \"medium shot\")", "line_end": 11, "line_start": 11, "recommended_fix": "Define framing as a separate structured field in the schema and instruct the LLM to ignore framing entirely during translation, rather than relying on a keyword-based exclusion list.", "severity": "P1", "why_problematic": "This is a semantic classifier instruction that uses a closed list of phrases to filter visual framing from open-world prose. It is brittle because it may miss synonyms or incorrectly strip valid descriptive text that happens to use these words in a non-framing context."}], "path": "prompts/_base/scene_image/2.202603251100/translate_prompt.md", "scan_kind": "prompt", "sha256": "87acaae286c16277ea90d909bed40342973d38f26c855fb09de14578f7534410"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 10, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt defines general cinematography principles and role instructions without scenario-specific pollution or brittle semantic classifiers.", "duration_ms": 4131, "findings": [], "path": "prompts/_base/shot_cinematography/1.202603281644/system.md", "scan_kind": "prompt", "sha256": "6dab0ae518fa9afbc0765dd5483006880024038b649b86c0bd89985d79f5e858"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 45, "chunk_start": 1, "chunk_summary": "No actionable findings; the file defines a technical JSON schema for shot dependency indices without scenario pollution or semantic string patterns.", "duration_ms": 3337, "findings": [], "path": "prompts/_base/shot_dependency/1.202603281907/dependency_schema.json", "scan_kind": "prompt", "sha256": "96cfc2a753557c9dd9a966a801067ea87312c6d9efc1f44826affa4d06557e91"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 31, "chunk_start": 1, "chunk_summary": "The prompt defines rules for transforming T2I prompts into final image generation instructions, including semantic filtering of framing terms and demographic-specific examples.", "duration_ms": 21592, "findings": [{"category": "scenario_dependent_prompt", "evidence": "a young Korean man", "line_end": 5, "line_start": 5, "recommended_fix": "Use more neutral or abstract placeholders in examples, such as 'a [age] [ethnicity] [gender]' or 'an elderly person'.", "severity": "P2", "why_problematic": "The use of a specific ethnicity ('Korean') in a generic instruction example can bias the LLM towards that demographic when generating descriptions for arbitrary characters in open-world scenarios."}, {"category": "llm_closed_list_instruction", "evidence": "no 'close-up', 'wide shot', 'medium shot'", "line_end": 10, "line_start": 10, "recommended_fix": "Instruct the LLM to remove all camera-related technical terminology and framing descriptions generally, rather than relying on a specific phrase list.", "severity": "P2", "why_problematic": "The prompt uses a closed list of framing terms to instruct the LLM to perform semantic filtering. This is brittle as it may miss synonyms (e.g., 'tight shot', 'POV', 'long shot') or incorrectly filter natural language that happens to use these words in a non-technical context."}], "path": "prompts/_base/scene_image/1.202603181600/translate_prompt.md", "scan_kind": "prompt", "sha256": "69eee740ad09dcf011198809308df6603cba9fa1a103bca31afa4442c254f5a8"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 16, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 3197, "findings": [], "path": "prompts/_base/shot_dependency/1.202603281907/system.md", "scan_kind": "prompt", "sha256": "48baa6819e70f3aaa8c611114eae2436be5975e525f1f84ff42bcb804b92657e"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 8, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 5017, "findings": [], "path": "prompts/_base/shot_dependency/1.202603281907/user.md", "scan_kind": "prompt", "sha256": "12e3d3b0b1a32ccf46ea21de6814d3930dc22db25940b40e3b24257a159aaa5d"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 10, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt is a generic template for cinematography classification using placeholders and does not contain scenario-specific pollution or brittle string-based logic.", "duration_ms": 8454, "findings": [], "path": "prompts/_base/shot_cinematography/1.202603281644/user.md", "scan_kind": "prompt", "sha256": "0e2703c156ca88fba4e9c0bafbdc004ecaeed6e6b4753a96c6f87c14aabd9395"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 16, "chunk_start": 1, "chunk_summary": "The system prompt defines logical rules for an LLM to verify entity visibility in a scene, including narrative logic for possession, but contains no brittle string patterns or concrete scenario pollution.", "duration_ms": 19010, "findings": [], "path": "prompts/_base/scene_verify/1.202603231200/system.md", "scan_kind": "prompt", "sha256": "0fb80ccb798115177554a94674cd9f2e24bd77573c9032454e08f7c2033daf0b"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 70, "chunk_start": 1, "chunk_summary": "The prompt defines scene extraction rules using brittle string patterns for classification and contains scenario-specific character names and prop examples in its visibility logic.", "duration_ms": 119121, "findings": [{"category": "semantic_string_judgment", "evidence": "<몽타주> 표시", "line_end": 47, "line_start": 47, "recommended_fix": "Replace string-based triggers with semantic descriptions of scene structure or use a structured metadata field for scene types.", "severity": "P1", "why_problematic": "The prompt instructs the LLM to classify a scene as 'montage' based on the presence of a specific string literal, which is brittle and fails if the scenario text uses different terminology or lacks the specific tag."}, {"category": "llm_closed_list_instruction", "evidence": "V.O., 전화 통화, 무전, 방송 음성", "line_end": 58, "line_start": 58, "recommended_fix": "Instruct the LLM to reason about physical presence based on the scene context rather than matching specific phrases.", "severity": "P1", "why_problematic": "Uses a closed list of natural language phrases as a semantic classifier to determine entity visibility (exclusion). This may fail to capture other ways of describing off-screen presence in open-world scenarios."}, {"category": "scenario_dependent_prompt", "evidence": "\"원격 조종/접속 인물\", \"동녘(강의원)\", \"캡슐속 남자들\"", "line_end": 63, "line_start": 59, "recommended_fix": "Replace project-specific names and props with abstract placeholders like 'Character A', 'Character B', or 'Prop A'.", "severity": "P2", "why_problematic": "The prompt contains logic and examples (remote control mechanics, specific character names, and specific props) that are highly specific to a single project's scenario, which can bias the LLM's extraction logic for unrelated stories."}], "path": "prompts/_base/scene_extractor_v2/15.202604091500/system.md", "scan_kind": "prompt", "sha256": "4f554d5306bcdfddb6b83f99efcc2bc9ddfd50de9991a6a147b30f04bfa2596c"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 48, "chunk_start": 1, "chunk_summary": "The schema defines shot dependency structures with specific instructions for background continuity, including a scenario-specific example in a field description.", "duration_ms": 16771, "findings": [{"category": "scenario_dependent_prompt", "evidence": "Ignore the blood on the floor.", "line_end": 28, "line_start": 28, "recommended_fix": "Replace the concrete example with a generic placeholder or a neutral architectural element, such as 'Ignore the chair' or 'Ignore the specific prop'.", "severity": "P2", "why_problematic": "The example uses a concrete, genre-specific visual element ('blood on the floor') which can bias the LLM towards specific scenario types or tropes during generation, even when the actual scenario is neutral."}], "path": "prompts/_base/shot_dependency_t2i/3.202604101200/schema.json", "scan_kind": "prompt", "sha256": "e1110749ca0f6123bfd92fba4d812142d41ee64c0ef8de54150dbce893fa4819"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 48, "chunk_start": 1, "chunk_summary": "The schema contains scenario-specific examples in field descriptions that introduce genre bias and semantic classification rules into the base prompt structure.", "duration_ms": 21332, "findings": [{"category": "scenario_dependent_prompt", "evidence": "Ignore the blood on the floor.", "line_end": 28, "line_start": 28, "recommended_fix": "Replace with a neutral, generic example such as 'Ignore the chair' or 'Ignore the background posters'.", "severity": "P2", "why_problematic": "The use of a specific, high-impact scenario example ('blood on the floor') in a base schema description can bias the LLM towards generating or assuming violent or thriller-themed contexts for arbitrary scenarios."}, {"category": "scenario_dependent_prompt", "evidence": "immobile characters (dead/unconscious bodies)", "line_end": 33, "line_start": 33, "recommended_fix": "Use more abstract descriptions like 'characters in a fixed physical state' or provide generic examples like 'statues' if applicable.", "severity": "P2", "why_problematic": "This instruction provides a concrete scenario-specific definition for 'immobile characters' that biases the model toward specific plot points (death/injury) and functions as a semantic classifier for character state within a base schema."}], "path": "prompts/_base/shot_dependency_t2i/4.202604141200/schema.json", "scan_kind": "prompt", "sha256": "2d312ae0285a109344860368af584c3bf03391ecc6b98147eba6f55996319124"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 19, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt uses abstract placeholders and generic instructions for shot-level visibility and variant resolution without scenario pollution or brittle string-based classification rules.", "duration_ms": 4339, "findings": [], "path": "prompts/_base/shot_director/1.202603301500/analyze.md", "scan_kind": "prompt", "sha256": "bada04f94da97c924810efb1fddf90e196b64ed9128cb3f95edc757027999014"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 54, "chunk_start": 1, "chunk_summary": "The prompt defines a semantic classifier for shot relationships and uses concrete scenario-specific examples (crime scene elements) that could bias model output.", "duration_ms": 26589, "findings": [{"category": "llm_closed_list_instruction", "evidence": "ref_usage: \"exact_background\", \"atmosphere_reference\"", "line_end": 30, "line_start": 23, "recommended_fix": "Formalize these categories in a JSON schema enum and inject them into the prompt dynamically to ensure the code and prompt stay synchronized.", "severity": "P2", "why_problematic": "The prompt requires the LLM to classify complex visual relationships into a closed set of strings. This is a semantic classifier that creates a brittle contract between the prompt and downstream processing logic."}, {"category": "scenario_dependent_prompt", "evidence": "\"blood stains on the floor\", \"police tape and detectives\", \"broken glass on the table\"", "line_end": 49, "line_start": 42, "recommended_fix": "Use abstract placeholders (e.g., [object_A], [character_B]) or generic, non-genre-specific examples (e.g., 'the chair', 'the person') to demonstrate the rules.", "severity": "P2", "why_problematic": "The prompt uses concrete, genre-specific examples (crime scene props) to illustrate formatting rules. These specific details can bias the LLM's generation toward crime/thriller scenarios regardless of the actual input story."}], "path": "prompts/_base/shot_dependency_t2i/3.202604101200/system.md", "scan_kind": "prompt", "sha256": "bcd7a786e015d61be9a20b6bcbe8f65ca80edf63d458e9e6ca7b9a6e4d23f3a5"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 30, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 3994, "findings": [], "path": "prompts/_base/shot_director/1.202603301500/analyze_schema.json", "scan_kind": "prompt", "sha256": "08294dc471c016f741a49298cd16b4273ae0b90c735ffd3271bf6cd516064692"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 66, "chunk_start": 1, "chunk_summary": "The prompt defines semantic rules for reclassifying characters as environment based on physical state and mandates the use of natural language descriptions over structured entity IDs for element exclusion.", "duration_ms": 27224, "findings": [{"category": "semantic_string_judgment", "evidence": "죽은, 의식불명, 심하게 다친 인물... 이 인물은 환경의 일부입니다", "line_end": 37, "line_start": 31, "recommended_fix": "Pass a structured 'is_static' or 'is_environment' flag for each entity based on the scene state rather than asking the LLM to infer it from health descriptions.", "severity": "P1", "why_problematic": "The LLM is instructed to perform semantic classification of character health/state (dead, unconscious, severely injured) to decide whether an entity belongs in 'keep_elements' (environment) or 'ignore_elements' (actors). This routes visual continuity logic based on open-world narrative interpretation rather than structured state metadata."}, {"category": "semantic_string_judgment", "evidence": "엔티티 ID (C01, O02, P03, L04 등) 사용 절대 금지 → 보통명사만 사용", "line_end": 47, "line_start": 46, "recommended_fix": "Allow or require the use of entity IDs in ignore_elements to maintain a strict link to the project's entity manifest.", "severity": "P1", "why_problematic": "Forcing the LLM to discard structured identifiers in favor of natural language descriptions ('the woman in red') creates a brittle semantic link. Downstream masking or reference-attachment logic must then attempt to re-identify these entities from prose, which is error-prone compared to using stable IDs."}, {"category": "schema_or_enum_drift", "evidence": "\"exact_background\", \"atmosphere_reference\"", "line_end": 27, "line_start": 23, "recommended_fix": "Define these values in a central JSON schema enum and reference that schema in the prompt.", "severity": "P2", "why_problematic": "These string constants define a semantic classification of shot relationships. Defining them in prompt prose without a corresponding schema enum creates a risk of drift where the LLM might use slightly different terms or the downstream code might expect different values."}], "path": "prompts/_base/shot_dependency_t2i/4.202604141200/system.md", "scan_kind": "prompt", "sha256": "ef8a0207d89aa2890223bd015f171e783fe9ee1379456693dd6f6666770c136a"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 48, "chunk_start": 1, "chunk_summary": "The schema contains concrete scenario pollution in examples and defines a contract for downstream blind string mutation of natural language prose.", "duration_ms": 30282, "findings": [{"category": "blind_string_mutation", "evidence": "Use common nouns only (no entity IDs). No add/replace/adjust instructions. No conditional phrasing", "line_end": 28, "line_start": 28, "recommended_fix": "Use structured entity references or semantic tags instead of natural language substrings for element exclusion.", "severity": "P1", "why_problematic": "This instruction defines a contract for downstream code to perform blind string manipulation on natural language prose. It forces the LLM to produce simplified substrings to accommodate a brittle string-matching processor (likely for negative prompting or token removal)."}, {"category": "scenario_dependent_prompt", "evidence": "Ignore the standing man by the door. ... dead/unconscious bodies", "line_end": 33, "line_start": 28, "recommended_fix": "Replace concrete scenario examples with abstract placeholders or generic, neutral examples like 'the red chair' or 'stationary objects'.", "severity": "P2", "why_problematic": "The schema includes concrete scenario-specific examples ('standing man by the door', 'dead/unconscious bodies') which can bias the LLM's output for arbitrary scenarios by suggesting specific physical states or character types."}], "path": "prompts/_base/shot_dependency_t2i/5.202604201700/schema.json", "scan_kind": "prompt", "sha256": "3a74b98165eeee59e8366e1b6c281594b7ba5e510491bc78d4f28ab0b4778a41"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 19, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt chunk contains structural instructions and placeholders for shot analysis without scenario pollution or brittle string-based classification rules.", "duration_ms": 4355, "findings": [], "path": "prompts/_base/shot_director/2.202604031800/analyze.md", "scan_kind": "prompt", "sha256": "bada04f94da97c924810efb1fddf90e196b64ed9128cb3f95edc757027999014"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 30, "chunk_start": 1, "chunk_summary": "No actionable findings; the file defines a structural JSON schema for shot analysis using technical identifiers.", "duration_ms": 2593, "findings": [], "path": "prompts/_base/shot_director/3.202605101200/analyze_schema.json", "scan_kind": "prompt", "sha256": "92ed45caf3f0f85bfa823b37c90ca389abbed3fd23948158cbeb86025521dbcb"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 19, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt is a generic template for shot-level visibility and variant analysis using placeholders.", "duration_ms": 4910, "findings": [], "path": "prompts/_base/shot_director/3.202605101200/analyze.md", "scan_kind": "prompt", "sha256": "637e8b7ffe25d85477a81053e7c14b5a338580755092c8e9269d277773acf28b"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 30, "chunk_start": 1, "chunk_summary": "The prompt contains scenario-specific character names and plot examples in the ID mapping instructions.", "duration_ms": 15086, "findings": [{"category": "scenario_dependent_prompt", "evidence": "백련이 요괴화된 후이면, 백련이 아직 변형 전이면", "line_end": 22, "line_start": 20, "recommended_fix": "Replace specific character names and story events with abstract placeholders like '캐릭터A' or '변형 이벤트'.", "severity": "P2", "why_problematic": "The system prompt uses a specific character name ('백련') and a specific story event ('요괴화') as examples, which constitutes scenario pollution in a base prompt meant for general use."}], "path": "prompts/_base/shot_director/1.202603301500/system.md", "scan_kind": "prompt", "sha256": "0c3045ce2f16e1e6dde41099d05cb54c7575f5578699c372d7dbd8787d299e34"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 112, "chunk_start": 1, "chunk_summary": "The prompt defines semantic classifiers for shot relationships and character states, and contains significant scenario-specific pollution related to crime/thriller tropes.", "duration_ms": 34043, "findings": [{"category": "semantic_string_judgment", "evidence": "ref_usage 유형 판단, zoom_in_detail, exact_background, atmosphere_reference", "line_end": 59, "line_start": 20, "recommended_fix": "Move the shot relationship classification to an upstream structured analysis step or provide the classification as a machine-readable input rather than asking the LLM to infer it from prose.", "severity": "P1", "why_problematic": "The prompt asks the LLM to classify the visual and temporal relationship between shots into a closed list of categories using natural-language checklists (e.g., 'same moment', 'same space', 'camera framing change'). This classification directly routes how the T2I engine utilizes the reference image."}, {"category": "semantic_string_judgment", "evidence": "죽은/의식불명/움직이지 않는 인물 처리, 이 인물은 환경의 일부입니다, keep_elements에 이 인물의 시각적 묘사를 반드시 포함하세요", "line_end": 70, "line_start": 61, "recommended_fix": "Use a structured 'physical_state' or 'is_static' flag in the character metadata to drive this logic instead of relying on semantic inference in the prompt.", "severity": "P1", "why_problematic": "The prompt forces a routing change (treating an entity as environment) based on the semantic state of a character (dead, unconscious, or injured). This is a brittle classifier that relies on the LLM's interpretation of character status to decide reference attachment and visibility policy."}, {"category": "scenario_dependent_prompt", "evidence": "바닥에 쓰러진 인물, detective walking in, police tape, the body lying face-down on the floor", "line_end": 111, "line_start": 36, "recommended_fix": "Replace scenario-specific examples with abstract placeholders (e.g., Character A, Object B) or generic continuity examples that apply across all genres.", "severity": "P2", "why_problematic": "The prompt is saturated with concrete crime-scene specific examples and tropes (detectives, bodies, police tape). This biases the model towards thriller/crime interpretations and may lead to incorrect handling of other genres, such as misidentifying a sleeping character as a 'body' or 'environment'."}], "path": "prompts/_base/shot_dependency_t2i/5.202604201700/system.md", "scan_kind": "prompt", "sha256": "34132df6e045a8a6b3d80bf8b739c1a3909494262e39226c368c0a7e3c721686"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 19, "chunk_start": 1, "chunk_summary": "No actionable findings; this is a structural prompt template for shot-level entity visibility and variant resolution using abstract placeholders.", "duration_ms": 5338, "findings": [], "path": "prompts/_base/shot_director/4.202605121200/analyze.md", "scan_kind": "prompt", "sha256": "637e8b7ffe25d85477a81053e7c14b5a338580755092c8e9269d277773acf28b"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 30, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 3705, "findings": [], "path": "prompts/_base/shot_director/4.202605121200/analyze_schema.json", "scan_kind": "prompt", "sha256": "92ed45caf3f0f85bfa823b37c90ca389abbed3fd23948158cbeb86025521dbcb"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 31, "chunk_start": 1, "chunk_summary": "The prompt contains concrete scenario-specific examples (character name and transformation type) that should be replaced with abstract placeholders.", "duration_ms": 17201, "findings": [{"category": "scenario_dependent_prompt", "evidence": "백련이 요괴화된 후이면 → C01 대신 C02", "line_end": 23, "line_start": 21, "recommended_fix": "Replace '백련' and '요괴화' with abstract placeholders like 'Character A' and 'Variant form' (e.g., '캐릭터A가 변형된 후이면').", "severity": "P2", "why_problematic": "The prompt uses a specific character name ('백련') and a specific plot point ('요괴화' - monster transformation) as examples. This can bias the LLM towards similar fantasy/transformation tropes in unrelated scenarios."}], "path": "prompts/_base/shot_director/2.202604031800/system.md", "scan_kind": "prompt", "sha256": "75690487f0fc6810f35a9fc26b86fb8c4e8b63025e4ac386713128c5ca9444ac"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 30, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 2958, "findings": [], "path": "prompts/_base/shot_director/5.202605131800/analyze_schema.json", "scan_kind": "prompt", "sha256": "92ed45caf3f0f85bfa823b37c90ca389abbed3fd23948158cbeb86025521dbcb"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 63, "chunk_start": 1, "chunk_summary": "The schema defines shot dependency structures with semantic instructions in descriptions that impose syntactic constraints on natural language fields and use specific semantic states for routing.", "duration_ms": 32813, "findings": [{"category": "blind_string_mutation", "evidence": "No add/replace/adjust instructions. No conditional phrasing (no 'if...', 'when...', 'only if'). E.g. 'Ignore the standing man by the door.'", "line_end": 29, "line_start": 26, "recommended_fix": "If the downstream logic requires specific actions like replacement or conditional logic, these should be modeled as structured fields in the schema. Remove concrete scenario examples from the description.", "severity": "P1", "why_problematic": "The field 'ignore_elements' is a natural language string but the prompt forbids semantic logic (conditionals, verbs), indicating it is used for blind concatenation or simple replacement in downstream prompts. It also contains a concrete scenario example ('standing man by the door') that can bias generation."}, {"category": "llm_closed_list_instruction", "evidence": "character state (dead/unconscious/pose) is handled by separate layers (scene_consistency / character_state_variant / semantic_contract_router)", "line_end": 49, "line_start": 39, "recommended_fix": "Define the boundary using abstract categories (e.g., 'non-human entities only') rather than listing specific character states, and ensure the schema structure itself enforces the separation.", "severity": "P2", "why_problematic": "The instructions for 'kind' and 'keep_elements' use a specific list of semantic states ('dead', 'unconscious') to define a routing boundary for the LLM. This creates a brittle semantic contract where the LLM must classify open-world meaning against a closed list of examples to decide which field to populate."}], "path": "prompts/_base/shot_dependency_t2i/7.202605151200/schema.json", "scan_kind": "prompt", "sha256": "edbaf7ecd82b9f03edd7c25f2e50dffb5123e9d8e47b18360858ffa8f4eac42e"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 19, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt template uses abstract placeholders and technical schema instructions without scenario pollution or brittle semantic classifiers.", "duration_ms": 4875, "findings": [], "path": "prompts/_base/shot_director/5.202605131800/analyze.md", "scan_kind": "prompt", "sha256": "637e8b7ffe25d85477a81053e7c14b5a338580755092c8e9269d277773acf28b"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 40, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 4192, "findings": [], "path": "prompts/_base/shot_essence_extraction/1.202604281800/schema.json", "scan_kind": "prompt", "sha256": "3c9b5c6022405d9e046aab60fd5451dd5a211847cf184ab5d28728a75d11c8a1"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 40, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 5132, "findings": [], "path": "prompts/_base/shot_essence_extraction/2.202604290900/schema.json", "scan_kind": "prompt", "sha256": "a851516da452004e07f0749581b4b54ff060f0bab91c2a5faea5e61f4263c9f4"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 102, "chunk_start": 1, "chunk_summary": "The prompt contains scenario-specific examples (Korean/Joseon context) and restricts visual variety through closed-list instructions for camera and color effects.", "duration_ms": 138070, "findings": [{"category": "scenario_dependent_prompt", "evidence": "Korean police officer, Korean-style apartment, Joseon-era nobleman", "line_end": 78, "line_start": 76, "recommended_fix": "Replace specific cultural examples with abstract placeholders like '[Region]-style [Building]' or '[Era]-era [Role]'.", "severity": "P2", "why_problematic": "The prompt uses concrete, culture-specific examples to illustrate regional context rules, which can bias the LLM toward Korean/historical tropes even for unrelated scenarios."}, {"category": "llm_closed_list_instruction", "evidence": "카메라 구도 선택지: low angle / high angle ... 색감 선택지: warm amber / cold blue ...", "line_end": 85, "line_start": 84, "recommended_fix": "Provide these as non-exhaustive examples or move the selection logic to a structured configuration.", "severity": "P2", "why_problematic": "The prompt provides a closed list of visual descriptors for camera angles and color palettes, restricting the LLM's ability to describe open-world visual variety and creating a brittle string-based contract for the camera_effect field."}], "path": "prompts/_base/scene_extractor_v2/16.202604091800/turn_scene_detail.md", "scan_kind": "prompt", "sha256": "e96ddba245ae4d310d291c8cedd305979fae58186ebcf4d6a901aa9a9d170909"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 52, "chunk_start": 1, "chunk_summary": "The prompt defines visibility logic for the LLM using brittle phrase patterns and contains scenario-specific character names in examples.", "duration_ms": 19753, "findings": [{"category": "llm_closed_list_instruction", "evidence": "Gaze-target close-up 패턴, 명시적 off-camera/off-screen phrase, 차단(blocking) 패턴, Reaction-only 패턴", "line_end": 33, "line_start": 15, "recommended_fix": "Replace phrase-based classification with high-level semantic instructions or provide a more diverse set of examples that focus on the visual intent rather than specific substrings.", "severity": "P1", "why_problematic": "The prompt instructs the LLM to determine entity visibility (routing logic) by matching specific Korean/English phrase patterns and grammatical structures. This turns the LLM into a brittle string classifier for open-world visual meaning, which is prone to failure if the scenario description uses slightly different phrasing."}, {"category": "scenario_dependent_prompt", "evidence": "혜수, 수리영, 인우, 백련", "line_end": 44, "line_start": 19, "recommended_fix": "Replace specific character names and plot-specific transformations with abstract placeholders like 'Character A', 'Character B', or '<character_name>'.", "severity": "P2", "why_problematic": "The prompt uses concrete character names and specific plot points (e.g., '백련이 요괴화된 후') from a particular scenario in its examples. This scenario pollution can bias the LLM's generation or interpretation when working on different stories or genres."}], "path": "prompts/_base/shot_director/3.202605101200/system.md", "scan_kind": "prompt", "sha256": "7ca09dd515995d49bb7bdc176d72b83cd47cbb0abe3c51f3b68d9cfd44f8b8ec"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 52, "chunk_start": 1, "chunk_summary": "The prompt defines visibility and entity membership rules using brittle phrase-based semantic classifiers for gaze, off-screen status, and blocking.", "duration_ms": 16225, "findings": [{"category": "llm_closed_list_instruction", "evidence": "Gaze-target close-up 패턴... 명시적 off-camera/off-screen phrase... 차단(blocking) 패턴... Reaction-only 패턴", "line_end": 33, "line_start": 15, "recommended_fix": "Replace specific phrase lists and grammatical templates with high-level semantic instructions regarding camera framing and character presence.", "severity": "P1", "why_problematic": "The prompt defines visibility logic (visible_entity_ids membership) using specific Korean/English phrase patterns and grammatical structures, forcing the LLM to act as a brittle string-pattern classifier for open-world visual meaning."}], "path": "prompts/_base/shot_director/4.202605121200/system.md", "scan_kind": "prompt", "sha256": "85a48ad01787123a671f3bab97913a81c187b49850cd83ea4c16224882b64dd9"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 40, "chunk_start": 1, "chunk_summary": "No actionable findings; the schema defines structured fields for natural-language extraction without scenario pollution or brittle string classifiers.", "duration_ms": 4655, "findings": [], "path": "prompts/_base/shot_essence_extraction/3.202605081814/schema.json", "scan_kind": "prompt", "sha256": "a851516da452004e07f0749581b4b54ff060f0bab91c2a5faea5e61f4263c9f4"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 175, "chunk_start": 1, "chunk_summary": "The prompt defines a semantic classifier for visual continuity and enforces strict negative constraints on output strings using a brittle lexicon of person-related terms to maintain a semantic boundary between characters and environment.", "duration_ms": 46723, "findings": [{"category": "semantic_string_judgment", "evidence": "human / person / character / body / figure / man / woman / detective / prisoner / child / person silhouette", "line_end": 163, "line_start": 146, "recommended_fix": "Instead of a negative lexicon, use a structured schema where characters and environment/props are separate entities, and rely on the LLM's understanding of the schema rather than keyword filtering.", "severity": "P1", "why_problematic": "The prompt uses a brittle list of natural-language words to validate the semantic content of the 'label' field. If any of these words appear, the output is rejected (fail-fast), which is a string-pattern-based judgment of open-world meaning (personhood)."}, {"category": "llm_closed_list_instruction", "evidence": "ref_usage (zoom_in_detail, exact_background, atmosphere_reference)", "line_end": 59, "line_start": 20, "recommended_fix": "Ensure these categories are part of a central SOT enum and provide more objective, technical criteria for classification to reduce semantic drift.", "severity": "P2", "why_problematic": "The prompt asks the LLM to classify open-world visual relationships between shots into a closed list of three semantic categories. This is a semantic classifier that routes downstream image generation behavior."}, {"category": "schema_or_enum_drift", "evidence": "immobilized_character / character / pose 등 enum 외 값 절대 금지", "line_end": 161, "line_start": 161, "recommended_fix": "Enforce the enum at the schema level (e.g., JSON schema) rather than using negative instructions in the prompt.", "severity": "P2", "why_problematic": "The prompt explicitly forbids specific strings that are not in the defined enum, suggesting that the LLM frequently emits these values or that they exist in other parts of the system, indicating a lack of strict schema enforcement."}], "path": "prompts/_base/shot_dependency_t2i/7.202605151200/system.md", "scan_kind": "prompt", "sha256": "4bb9564d103d4c10a4183bbc190f58568e1564cf199cf2e4defb057a3542b378"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 43, "chunk_start": 1, "chunk_summary": "The file defines a standard JSON schema for shot extraction and contains no actionable scenario pollution or brittle semantic string patterns.", "duration_ms": 7604, "findings": [], "path": "prompts/_base/shot_extract/10.202604151200/shot_schema.json", "scan_kind": "prompt", "sha256": "190c5ba6e252a60c370adc3f9eaa9f5d3d43034f60d363d6cd145976a2066af9"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 57, "chunk_start": 1, "chunk_summary": "The prompt contains scenario-specific character names in examples and uses a closed list of semantic states (death, bloodstains) to instruct the LLM on visual categorization.", "duration_ms": 23784, "findings": [{"category": "scenario_dependent_prompt", "evidence": "민숙이 거실 바닥에 엎어진 채 누워있다", "line_end": 49, "line_start": 39, "recommended_fix": "Replace specific names with generic placeholders like '인물 A' or '<character_name>'.", "severity": "P2", "why_problematic": "The prompt uses a specific character name ('민숙' - Minsuk) and a concrete scenario in its examples, which can bias the LLM towards specific character types or settings in future generations."}, {"category": "llm_closed_list_instruction", "evidence": "폐허, 깨진 유리, 핏자국 ... 사망/부상/의식불명 인물의 자세는 essence ... 그 인물 옆 혈흔은 atmospheric", "line_end": 57, "line_start": 25, "recommended_fix": "Replace specific prop/state examples with abstract visual priority rules (e.g., 'primary narrative focus' vs 'environmental context') to allow for flexible classification across different genres.", "severity": "P1", "why_problematic": "The prompt instructs the LLM to classify open-world visual elements into categories (essence vs atmospheric) based on a closed list of specific props and states (bloodstains, ruins, death). This creates brittle semantic routing that may fail for shots where these elements are the primary focus or intended to be handled differently by the pipeline."}], "path": "prompts/_base/shot_essence_extraction/1.202604281800/system.md", "scan_kind": "prompt", "sha256": "defda41e43a87df346ef6492d49a4a4934de5e7cb29ef21c1b32e5dced13ed69"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 80, "chunk_start": 1, "chunk_summary": "The prompt defines semantic constraints for shot extraction using forbidden phrase lists and includes concrete demographic examples for character description.", "duration_ms": 10153, "findings": [{"category": "llm_closed_list_instruction", "evidence": "시간 연결어 절대 금지: \"~하자\" / \"~하면서\" / \"~하며\" / \"~하고\" / \"~한 뒤\" / \"~한 후\" / \"~하고 나서\", 영어 금지: \"and then\", \"while ~ing\", \"after ~ing\", \"as ~\", \"before ~\"", "line_end": 19, "line_start": 18, "recommended_fix": "Replace the phrase list with a conceptual instruction to avoid sequential actions or multiple verbs, and rely on the 'single verb/state' rule (line 17) without brittle keyword bans.", "severity": "P1", "why_problematic": "The prompt uses a closed list of temporal connectors as a semantic classifier to enforce the 'single moment' rule. This forces the LLM to perform string-based semantic routing rather than understanding the visual simultaneity of the scene."}, {"category": "scenario_dependent_prompt", "evidence": "\"한국인 경찰\", \"동양인 노파\"", "line_end": 63, "line_start": 63, "recommended_fix": "Use abstract placeholders or more diverse, non-specific examples like \"[Race/Nationality] [Occupation/Role]\" to avoid demographic bias.", "severity": "P2", "why_problematic": "The prompt includes concrete demographic and role examples (Korean police, Asian old woman) to illustrate how to describe unlisted characters. These specific examples can bias the LLM toward certain ethnicities or archetypes in arbitrary future scenarios."}], "path": "prompts/_base/shot_extract/11.202604201230/user.md", "scan_kind": "prompt", "sha256": "0be1caec39403c4af11874a53831d28579ed1a6b24c29c2363a18ed2f4add03e"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 2, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt contains high-level task instructions and persona definitions without scenario pollution or brittle semantic classifiers.", "duration_ms": 2645, "findings": [], "path": "prompts/_base/shot_extract/9.202604081200/system.md", "scan_kind": "prompt", "sha256": "79a456aff543da28f549491040bff2129b50f55106e5ee82bb685d0d3c71a6b1"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 43, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 5177, "findings": [], "path": "prompts/_base/shot_extract/9.202604081200/shot_schema.json", "scan_kind": "prompt", "sha256": "190c5ba6e252a60c370adc3f9eaa9f5d3d43034f60d363d6cd145976a2066af9"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 87, "chunk_start": 1, "chunk_summary": "The prompt defines a semantic classification task for visual elements, using specific prop lists and concrete scenario examples to guide the LLM's categorization logic.", "duration_ms": 23199, "findings": [{"category": "llm_closed_list_instruction", "evidence": "혈흔, 깨진 유리, 부상 흔적", "line_end": 83, "line_start": 13, "recommended_fix": "Define the 'essence' category using abstract criteria for 'one-time event consequences' or 'irreversible state changes' rather than listing specific props like blood or glass.", "severity": "P2", "why_problematic": "The prompt instructs the LLM to classify specific visual props (bloodstains, broken glass, injury marks) as 'essence' rather than 'atmospheric' to bypass technical limitations of the background consistency system (chain bg). This creates a semantic classifier based on a closed list of props."}, {"category": "scenario_dependent_prompt", "evidence": "거실 바닥에 엎어진 채 누워있다, 인형 백팩", "line_end": 66, "line_start": 44, "recommended_fix": "Replace concrete scenario examples with more generic or abstract placeholders (e.g., 'a person performing an action with a specific prop') to avoid biasing the model.", "severity": "P2", "why_problematic": "The prompt uses concrete scenario examples (a woman lying on a living room floor, a doll backpack) to illustrate classification and ID-to-name mapping. These specific props and settings can bias the LLM's extraction logic toward similar tropes or specific object types in arbitrary future scenarios."}], "path": "prompts/_base/shot_essence_extraction/3.202605081814/system.md", "scan_kind": "prompt", "sha256": "fee50340f8b33be5a0da31f20d912212ff323c0523df5d522db52a3dd15ce8d6"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 87, "chunk_start": 1, "chunk_summary": "The prompt defines a 3-way classification for shot elements but contains scenario-specific names and props in examples, and uses a closed list of visual tropes to drive semantic routing.", "duration_ms": 25328, "findings": [{"category": "scenario_dependent_prompt", "evidence": "민숙, 인형 백팩, 수리영", "line_end": 70, "line_start": 44, "recommended_fix": "Replace specific names with generic placeholders like '여인', '남성', or '인물A' and props with generic terms like '가방' or '물건'.", "severity": "P2", "why_problematic": "Concrete names ('민숙', '수리영') and specific props ('인형 백팩') from a particular scenario are used as examples in a base prompt, which can bias the LLM's extraction for unrelated stories."}, {"category": "llm_closed_list_instruction", "evidence": "혈흔, 깨진 유리, 부상 흔적, 사망/부상/의식불명 인물의 자세", "line_end": 83, "line_start": 13, "recommended_fix": "Define the 'essence' category by its functional role (e.g., 'elements that change per shot and are not handled by background consistency') rather than a list of specific tropes.", "severity": "P2", "why_problematic": "The prompt instructs the LLM to classify specific open-world visual tropes and character states into the 'essence' category based on a closed list of examples to compensate for pipeline limitations (chain bg). This creates a brittle semantic classifier within the prompt."}], "path": "prompts/_base/shot_essence_extraction/2.202604290900/system.md", "scan_kind": "prompt", "sha256": "e667671629fae98f391973efc2b937071a52de05aeb37cb687e5926506bfda8f"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 12, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 2453, "findings": [], "path": "prompts/_base/shot_selection/2.202604151200/selection_schema.json", "scan_kind": "prompt", "sha256": "29fd968ac8bb9494412292d8b26498f707175904197badce7f5b5266c770c455"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 15, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 4226, "findings": [], "path": "prompts/_base/shot_selection/2.202604151200/user.md", "scan_kind": "prompt", "sha256": "bf609f6b3d17164956ad029e9399bb51d2a5d379ffe6736f09d11e3c774789f3"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 12, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 3234, "findings": [], "path": "prompts/_base/shot_selection/3.202604181300/selection_schema.json", "scan_kind": "prompt", "sha256": "29fd968ac8bb9494412292d8b26498f707175904197badce7f5b5266c770c455"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 41, "chunk_start": 1, "chunk_summary": "The prompt defines abstract criteria for shot selection based on narrative and cinematic importance without scenario-specific pollution or brittle string-based classification rules.", "duration_ms": 6219, "findings": [], "path": "prompts/_base/shot_selection/2.202604151200/system.md", "scan_kind": "prompt", "sha256": "46072f0cdaf8f0146257cfd826851eb9023b8851d941379bfb0401688a5ee0df"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 15, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt provides generic shot selection guidelines using abstract placeholders without scenario pollution or brittle semantic classifiers.", "duration_ms": 3999, "findings": [], "path": "prompts/_base/shot_selection/3.202604181300/user.md", "scan_kind": "prompt", "sha256": "bf609f6b3d17164956ad029e9399bb51d2a5d379ffe6736f09d11e3c774789f3"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 51, "chunk_start": 1, "chunk_summary": "The system prompt defines abstract ROI criteria (Narrative Weight and Visual Expressibility) for shot selection using generic placeholders and logic, with no actionable scenario pollution or brittle string patterns.", "duration_ms": 9687, "findings": [], "path": "prompts/_base/shot_selection/3.202604181300/system.md", "scan_kind": "prompt", "sha256": "e164bf0a32ff4287aed21d6a4e3e16ebc708a478697794774feb375e4ba7a3ae"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 64, "chunk_start": 1, "chunk_summary": "The prompt uses brittle natural-language substring patterns to enforce temporal atomicity and contains scenario-specific tropes to define visual transformation boundaries.", "duration_ms": 34174, "findings": [{"category": "semantic_string_judgment", "evidence": "시간 연결어 절대 금지... ~하자, ~하면서, ~하며, ~하고, ~한 뒤, ~한 후, ~하고 나서... and then, while ~ing, after ~ing, as ~", "line_end": 19, "line_start": 14, "recommended_fix": "Define the 'still moment' requirement conceptually and provide positive/negative visual examples of atomic vs. sequential actions instead of blacklisting specific substrings.", "severity": "P1", "why_problematic": "The prompt defines a semantic classifier for 'mixed moments' based on a brittle list of natural language substrings. This forces the LLM to avoid specific linguistic patterns to satisfy a visual constraint, which is a form of pattern-based semantic judgment that can lead to unnatural descriptions or missed multi-moment detections."}, {"category": "scenario_dependent_prompt", "evidence": "외계인/귀신/돌연변이... 나이 변화, 변장/성형 전후, 빙의... 인간→동물, 인간→비인간형... 부상, 출혈, 창백해짐, 피멍, 화상... 눈 색, 비늘, 손톱/송곳니, 꼬리", "line_end": 51, "line_start": 35, "recommended_fix": "Replace specific genre tropes with abstract categories (e.g., 'structural identity changes' vs 'temporary physical states') and move concrete examples to a separate, scenario-specific configuration.", "severity": "P2", "why_problematic": "The prompt includes concrete scenario-specific tropes (aliens, ghosts, mutants, possession, specific injuries, fangs, etc.) to define the boundaries of 'humanoid' and 'transformation'. These examples pollute the base prompt with genre-specific assumptions that may bias the model's interpretation of arbitrary scenarios."}], "path": "prompts/_base/shot_extract/10.202604151200/system.md", "scan_kind": "prompt", "sha256": "56bf7f72f43848cfb87ac325aced74faf8004d1882b0647d368f0bbda5cbdf15"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 23, "chunk_start": 1, "chunk_summary": "The schema defines a structured output for shot selection with a reason field, containing a generic narrative example that does not constitute scenario pollution or brittle classification.", "duration_ms": 11838, "findings": [], "path": "prompts/_base/shot_selection/4.202604191600/selection_schema.json", "scan_kind": "prompt", "sha256": "b95a158c199c6e23b02de1744704f6b30a58d15bb787bb54b1c81c9fe9e28d82"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 60, "chunk_start": 1, "chunk_summary": "The prompt defines a complex semantic classifier for 'Transformations' versus 'States' to control description syntax and includes scenario-specific ethnicity examples for extras.", "duration_ms": 23801, "findings": [{"category": "llm_closed_list_instruction", "evidence": "변형이란 얼굴이 크게 달라지거나... 나이 변화, 변장/성형 전후, 빙의... 괄호 표기하지 않는 것: 부상, 출혈, 창백해짐, 피멍, 화상... 부분적 변화: 눈 색 변화, 비늘 올라옴...", "line_end": 42, "line_start": 31, "recommended_fix": "Move this classification logic to a structured field in the schema (e.g., an enum for 'visual_state_type') rather than relying on the LLM to apply complex semantic rules to format a natural language string.", "severity": "P1", "why_problematic": "This defines a semantic classifier that instructs the LLM to distinguish between 'Transformation' and 'State' based on a closed list of visual examples. This logic determines whether the output uses parentheses, which likely acts as a routing signal for downstream image generation or character consistency logic. It is brittle and subjective."}, {"category": "scenario_dependent_prompt", "evidence": "예: '한국인 경찰', '동양인 노파'", "line_end": 47, "line_start": 47, "recommended_fix": "Use abstract placeholders like '[Race/Nationality] [Occupation]' or a more diverse set of examples that cover various contexts.", "severity": "P2", "why_problematic": "The prompt uses specific ethnic and national examples ('Korean', 'Asian') for describing extras. This can bias the LLM towards these specific demographics even when the input scenario might be set in a different cultural or geographical context."}], "path": "prompts/_base/shot_extract/9.202604081200/user.md", "scan_kind": "prompt", "sha256": "fd860cd60cc3bd90c17398fba9de0f683c5eb966e224d630a14de49ba462e252"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 64, "chunk_start": 1, "chunk_summary": "The prompt defines semantic boundaries for 'still moments' and 'entity transformations' using brittle phrase lists and contains scenario-specific entity examples.", "duration_ms": 38835, "findings": [{"category": "llm_closed_list_instruction", "evidence": "\"~하자\", \"~하면서\", \"and then\", \"while ~ing\", \"after ~ing\", \"as ~\"", "line_end": 18, "line_start": 15, "recommended_fix": "Replace the phrase list with a semantic definition of temporal singularity (e.g., 'a single point in time with zero duration') and provide contrastive examples of static vs. dynamic descriptions.", "severity": "P1", "why_problematic": "The prompt defines the semantic concept of a 'still moment' (the core task) by blacklisting specific linguistic patterns. This is brittle because it relies on token-level matches to infer temporal duration/motion, which can lead to false positives or missed dynamic descriptions that use different phrasing."}, {"category": "llm_closed_list_instruction", "evidence": "\"나이 변화, 분장/변장 전후\", \"부상, 얼룩, 창백해짐, 멍, 화상\"", "line_end": 50, "line_start": 42, "recommended_fix": "Define 'transformation' semantically (e.g., 'fundamental change to the entity's base identity or species') and 'temporary state' (e.g., 'transient visual overlays') rather than relying on a manual list of allowed/disallowed words.", "severity": "P1", "why_problematic": "This section uses a hardcoded list of examples to define the semantic boundary between a 'transformation' (which requires special notation) and a 'temporary state'. This functions as a brittle classifier for a behavior-changing notation (parentheses) that likely affects downstream ID or outlook logic."}, {"category": "scenario_dependent_prompt", "evidence": "인간형(외계인/귀신/돌연변이 포함)이면 인종/국적을 반드시 포함", "line_end": 35, "line_start": 35, "recommended_fix": "Use abstract terms like 'humanoid entities' and instruct the LLM to include 'relevant physical or cultural identifiers' only when appropriate for the specific scenario context.", "severity": "P2", "why_problematic": "The prompt contains concrete scenario-specific examples (aliens, ghosts, mutants) and mandates attributes (race/nationality) that may not be applicable to all genres or scenarios, potentially biasing the LLM to invent irrelevant details."}], "path": "prompts/_base/shot_extract/11.202604201230/system.md", "scan_kind": "prompt", "sha256": "963688c68f300adfc58f94aaeb3969619e87a4673b23c8870becc55d2d107c09"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 80, "chunk_start": 1, "chunk_summary": "The prompt defines the semantic boundary of a 'Shot' and 'Transformation' using brittle phrase blacklists and scenario-specific examples (fantasy tropes and specific ethnicities).", "duration_ms": 43231, "findings": [{"category": "llm_closed_list_instruction", "evidence": "시간 연결어 절대 금지: '~하자' / '~하면서' / '~하며' / '~하고' / '~한 뒤' / '~한 후' / '~하고 나서', 영어 금지: 'and then', 'while ~ing', 'after ~ing', 'as ~', 'before ~', 진행형 묘사 금지: '당기고 있는' -> '쥔 채 멈춘'", "line_end": 20, "line_start": 18, "recommended_fix": "Replace the forbidden phrase list with a few-shot approach showing diverse examples of atomic vs. non-atomic shots, and instruct the LLM on the conceptual definition of a single camera frame.", "severity": "P1", "why_problematic": "The prompt uses a brittle list of linguistic tokens (conjunctions and progressive tense) to define the visual/temporal boundary of a 'Shot'. This forces the LLM to perform semantic classification based on surface-level string patterns rather than the underlying concept of a single moment, which may lead to false negatives or awkward phrasing."}, {"category": "scenario_dependent_prompt", "evidence": "빙의로 얼굴이 바뀜, 인간→동물, 비늘, 손톱/송곳니, 꼬리, 한국인 경찰, 동양인 노파", "line_end": 63, "line_start": 49, "recommended_fix": "Replace scenario-specific examples with abstract placeholders (e.g., 'Character A (Transformed)', 'Character B (Disguised)') or generic physical descriptions that do not imply a specific genre or ethnicity.", "severity": "P2", "why_problematic": "The prompt contains concrete scenario-specific examples (fantasy/horror tropes like 'possession' and 'scales', and specific ethnicities like 'Korean/Asian') within general rules for character transformation and unnamed character description. This biases the LLM towards specific genres and cultures in a base prompt intended for arbitrary scenarios."}], "path": "prompts/_base/shot_extract/10.202604151200/user.md", "scan_kind": "prompt", "sha256": "0be1caec39403c4af11874a53831d28579ed1a6b24c29c2363a18ed2f4add03e"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 78, "chunk_start": 1, "chunk_summary": "The prompt defines semantic exclusion rules for shot selection based on a closed list of scenario patterns and prescribes a brittle string-based justification format that acts as a logic gate.", "duration_ms": 27124, "findings": [{"category": "llm_closed_list_instruction", "evidence": "연결 순간 단독 선택 금지, 일상 이동 남용 금지, before+during+after 모두 선택 금지, 대사만 오가는 반복 정면 샷, 접촉 직전", "line_end": 65, "line_start": 54, "recommended_fix": "Move these semantic rules into a structured evaluation step where the LLM identifies shot attributes (e.g., 'is_transition', 'is_repetitive_dialogue') as boolean flags rather than relying on a list of prohibited scenario descriptions.", "severity": "P1", "why_problematic": "The prompt uses a closed list of semantic scenario patterns (e.g., 'approaching before contact', 'repetitive dialogue shots') as mandatory exclusion criteria. This is prompt-side semantic routing that attempts to classify open-world visual meaning through a fixed set of phrase-like categories."}, {"category": "schema_or_enum_drift", "evidence": "서사 High / 시각 High — <왜 이 순간이 서사 전환점인지>", "line_end": 76, "line_start": 71, "recommended_fix": "Separate the 'reason' field into structured enum fields (narrative_weight, visual_expressibility) and a separate natural language 'justification' field.", "severity": "P2", "why_problematic": "The prompt instructs the LLM to encode structured metadata (Narrative/Visual weight enums) into a natural language string field ('reason'). Line 76 further enforces this by telling the LLM to 'give up selection' if the reason cannot be formulated this way, creating a brittle string-based logic gate that drifts from a proper structured schema."}], "path": "prompts/_base/shot_selection/4.202604191600/system.md", "scan_kind": "prompt", "sha256": "1d8df13f0af94210131a5239840e497ddf3092a46e456e79b66ed659ea71893e"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 23, "chunk_start": 1, "chunk_summary": "The prompt defines a semantic classification system for shot importance used for filtering and output formatting without formal schema enforcement.", "duration_ms": 24568, "findings": [{"category": "schema_or_enum_drift", "evidence": "Low 서사 샷, reason: 서사 High 또는 Medium / 시각 High 또는 Medium", "line_end": 23, "line_start": 18, "recommended_fix": "Define 'narrative_importance' and 'visual_importance' as explicit enum fields in the output schema instead of embedding them in the 'reason' string.", "severity": "P2", "why_problematic": "The prompt mandates a closed-list semantic classification (Low/Medium/High) for narrative and visual importance. Line 18 uses 'Low' as a hard exclusion filter, and line 23 requires these labels to be embedded in a natural language string. This forces downstream consumers to use string parsing to extract structured priority data and creates a brittle contract between the prompt and the parser."}], "path": "prompts/_base/shot_selection/4.202604191600/user.md", "scan_kind": "prompt", "sha256": "a89e5594c73fbfa03694f12b69dbdd9361fb9f07228f57fb5623631c87860c27"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 103, "chunk_start": 1, "chunk_summary": "The schema uses an overloaded semantic channel for character states in gaze_target and lacks formal enum enforcement for several closed-category fields.", "duration_ms": 24605, "findings": [{"category": "semantic_string_judgment", "evidence": "\"gaze_target\": {\"type\": \"string\", \"description\": \"... 'unconscious', 'dead', 'severely_injured'\"}", "line_end": 25, "line_start": 25, "recommended_fix": "Move physical state indicators to a separate 'character_state' or 'status' field and use a formal enum for gaze targets.", "severity": "P1", "why_problematic": "The gaze_target field is used as an overloaded semantic channel to communicate character physical states (unconscious, dead, injured) rather than just spatial targets. This forces downstream logic to parse these states from a string field to determine character behavior or reference policy."}, {"category": "schema_or_enum_drift", "evidence": "perspective, perception_mode, angle", "line_end": 23, "line_start": 11, "recommended_fix": "Convert these string fields into formal JSON enums using the values listed in their descriptions.", "severity": "P2", "why_problematic": "These fields define specific allowed values (e.g., subjective_pov, direct, facing_camera) within their descriptions but are typed as generic strings. This creates a contract that is not enforced by the JSON schema validator, leading to potential drift between prompt instructions and code expectations."}], "path": "prompts/_base/shot_staging/10.202605141617/schema.json", "scan_kind": "prompt", "sha256": "8d5f6ec72e827987a68e155d2d0112e5458fc855379b83cee32d439eeb82e11e"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 68, "chunk_start": 1, "chunk_summary": "The schema defines several fields with closed-list semantic categories in descriptions rather than enums, and includes an overloaded semantic channel for character states.", "duration_ms": 23866, "findings": [{"category": "semantic_string_judgment", "evidence": "gaze_target: 'closed', 'unconscious', 'dead', 'severely_injured'", "line_end": 40, "line_start": 40, "recommended_fix": "Split physical state into a separate field or enum to avoid inferring biological status from gaze direction.", "severity": "P1", "why_problematic": "The gaze_target field is used as an overloaded semantic channel, carrying both spatial gaze information and physical/biological state. This forces downstream logic to parse gaze strings to determine character status, which is a brittle pattern-based judgment."}, {"category": "schema_or_enum_drift", "evidence": "perspective (line 13), perception_mode (line 21), angle (line 38)", "line_end": 38, "line_start": 11, "recommended_fix": "Convert these fields from type string to enum with the listed values to ensure schema-level validation.", "severity": "P2", "why_problematic": "These fields define specific semantic categories within the description text instead of using a JSON enum. This creates a brittle contract where downstream code depends on exact string matches that are not formally enforced by the schema."}], "path": "prompts/_base/shot_staging/6.202604151200/schema.json", "scan_kind": "prompt", "sha256": "a1309f9ee204f3c59147ca6606b725b242c3457b91ef808098e78be53a209964"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 108, "chunk_start": 1, "chunk_summary": "The schema defines several fields with expected string values in descriptions rather than enums, and uses the gaze_target field as an overloaded channel for character physical states.", "duration_ms": 26284, "findings": [{"category": "semantic_string_judgment", "evidence": "gaze_target: ..., 'unconscious', 'dead', 'severely_injured'", "line_end": 30, "line_start": 30, "recommended_fix": "Move physical state to a dedicated 'character_state' enum field and restrict 'gaze_target' to spatial targets or 'closed' eyes.", "severity": "P1", "why_problematic": "The gaze_target field is used as an overloaded semantic channel to communicate character physical states (unconscious, dead, injured) using magic strings. This likely drives downstream logic such as reference selection or pose enforcement through brittle string matching on a field intended for spatial orientation."}, {"category": "schema_or_enum_drift", "evidence": "perspective, perception_mode, angle", "line_end": 28, "line_start": 16, "recommended_fix": "Convert the listed values in the descriptions into formal JSON 'enum' arrays for each field.", "severity": "P2", "why_problematic": "These fields define a closed set of valid categories within their prose descriptions (e.g., 'subjective_pov', 'hallucination', 'facing_camera') but do not enforce them using the JSON 'enum' keyword. This creates a brittle contract where downstream code expects specific strings that are not validated by the schema itself."}], "path": "prompts/_base/shot_staging/11.202605150319/schema.json", "scan_kind": "prompt", "sha256": "563bb3a1f8e2fa6ff7915841c59e1a92c848206f06a407e58c093531aaa3ef1b"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 292, "chunk_start": 1, "chunk_summary": "The prompt defines several closed-list semantic classifiers for character states, object properties, and spatial logic, including an overloaded gaze field that carries physical state information.", "duration_ms": 40933, "findings": [{"category": "schema_or_enum_drift", "evidence": "gaze_target: distant, void, closed, unconscious, dead, severely_injured", "line_end": 138, "line_start": 131, "recommended_fix": "Separate physical state (e.g., character_status) from spatial gaze direction. Use a formal enum for status and ensure the gaze field only contains spatial targets or coordinates.", "severity": "P1", "why_problematic": "The gaze_target field is overloaded to carry both spatial directions and complex physical/medical states (dead, unconscious). It also uses multiple synonyms (distant/void) which suggests downstream code relies on exact string matching for semantic state, creating a brittle contract."}, {"category": "llm_closed_list_instruction", "evidence": "directionality_class: content_surface, reflective_surface, transparent_surface, directional_3d, non_directional", "line_end": 170, "line_start": 164, "recommended_fix": "Move this classification to a dedicated metadata lookup or allow the LLM to describe the object's visual properties in natural language for a more robust downstream processor.", "severity": "P2", "why_problematic": "This instruction forces the LLM to map arbitrary open-world objects into a closed set of technical categories based on their visual function. This is a semantic classification task that is brittle when applied to diverse props and backgrounds."}, {"category": "llm_closed_list_instruction", "evidence": "reason: movement_direction, points_to_anchor, looks_to_anchor, shared_space_relation, required_background_position, primary_subject_isolation", "line_end": 227, "line_start": 214, "recommended_fix": "Allow multiple reasons or use a more descriptive field that doesn't force a single-choice classification of spatial logic.", "severity": "P2", "why_problematic": "The LLM is required to categorize the complex spatial intent of a shot into a single enum value. This is a semantic classifier that may fail to capture nuanced or overlapping spatial requirements."}, {"category": "scenario_dependent_prompt", "evidence": "courtroom oath, funeral farewell, roll call, speech podium, wedding vow", "line_end": 99, "line_start": 99, "recommended_fix": "Replace specific scenario names with abstract criteria, such as 'formal ceremonies' or 'structured group formations'.", "severity": "P2", "why_problematic": "The prompt uses concrete, culturally specific scenario examples to define exceptions for a pose rule. This biases the LLM toward these specific tropes when deciding if a static pose is appropriate, potentially limiting creativity in other contexts."}], "path": "prompts/_base/shot_staging/10.202605141617/system.md", "scan_kind": "prompt", "sha256": "25b643418f6c0dfd17a291bf51b2ff4620ccf52b2042de11d73a50970d02bfc0"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 68, "chunk_start": 1, "chunk_summary": "The schema defines several fields with unenforced string enums in descriptions and overloads the gaze_target field with physical state semantics.", "duration_ms": 25407, "findings": [{"category": "semantic_string_judgment", "evidence": "gaze_target: ... 'unconscious', 'dead', 'severely_injured'", "line_end": 40, "line_start": 40, "recommended_fix": "Move physical states (dead, unconscious, injured) to a dedicated character_state field and keep gaze_target for spatial/entity targets.", "severity": "P1", "why_problematic": "The gaze_target field is overloaded to carry physical character states. This uses a specific string-based channel to communicate character status (dead/injured) instead of a dedicated state field, which downstream logic must then parse from a field intended for spatial orientation. This is a documented anti-pattern where a field name and its values carry divergent semantic meanings."}, {"category": "schema_or_enum_drift", "evidence": "perspective, perception_mode, angle", "line_end": 38, "line_start": 11, "recommended_fix": "Convert the lists of values in descriptions into formal JSON 'enum' arrays to ensure schema-level validation.", "severity": "P2", "why_problematic": "These fields define specific allowed values (e.g., subjective_pov, facing_camera) within the description string rather than using the JSON 'enum' property. This creates an unenforced contract that is prone to drift and requires manual string matching in downstream code, rather than relying on schema-level validation."}], "path": "prompts/_base/shot_staging/7.202604181200/schema.json", "scan_kind": "prompt", "sha256": "e36ce04980cfd7c8a26d7f8a7d8bfcde76b3683397e34b01a40da4229f8de226"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 120, "chunk_start": 1, "chunk_summary": "The prompt defines a structured staging logic for a DP role but introduces an overloaded semantic channel in the gaze_target field and uses a closed-list classifier for perception modes.", "duration_ms": 29775, "findings": [{"category": "semantic_string_judgment", "evidence": "gaze_target ... \"closed\" 또는 \"unconscious\" ... \"dead\" ... \"severely_injured\"", "line_end": 71, "line_start": 62, "recommended_fix": "Separate physical state (e.g., character_status: alive/injured/dead/unconscious) from visual gaze direction (e.g., gaze_direction: camera/object/character/void).", "severity": "P1", "why_problematic": "The gaze_target field is overloaded to carry physical state information (dead, injured, unconscious) which is semantically distinct from eye direction. This creates a brittle string-based contract where downstream logic must parse these specific words to understand character status, and it forces the LLM to use a single field for two different semantic concepts."}, {"category": "llm_closed_list_instruction", "evidence": "어떻게 보는가 (camera_direction에 반영): ... 환각/환영/꿈 ... 거울, 유리, 수면 ... CCTV, 휴대폰 화면 ... 기억, 회상, 투영", "line_end": 39, "line_start": 35, "recommended_fix": "Define a formal 'perception_mode' enum in the schema and map these categories to it, rather than instructing the LLM to reflect them indirectly in camera_direction prose.", "severity": "P2", "why_problematic": "The prompt instructs the LLM to classify the 'perception mode' from a closed list of semantic categories and reflect them in the camera_direction prose. This is a semantic classifier list that should be handled by a structured enum rather than natural language instructions."}], "path": "prompts/_base/shot_staging/6.202604151200/system.md", "scan_kind": "prompt", "sha256": "4d8afb513ec44b4b4f3321b9d5ecad19dd055c1617559cda5b0a753f6cb2f89d"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 194, "chunk_start": 1, "chunk_summary": "The prompt defines unenforced string enums for character angles and gaze targets, including semantic overloading of the gaze field with physical states, and requires embedding classification tokens in natural language prose.", "duration_ms": 33651, "findings": [{"category": "schema_or_enum_drift", "evidence": "angle: [facing_camera, ...], gaze_target: [..., \"dead\", \"severely_injured\"]", "line_end": 139, "line_start": 114, "recommended_fix": "Define 'angle' as a formal enum in the schema. Separate physical status into its own field (e.g., character_status) and use a formal enum for gaze_target directions.", "severity": "P2", "why_problematic": "The character_angles object uses unenforced string enums for 'angle' and 'gaze_target'. Furthermore, 'gaze_target' is semantically overloaded with physical states (dead, severely_injured) that are not gaze directions. This creates a brittle semantic channel where a single field carries disparate types of information that downstream code must parse via exact string matching."}, {"category": "llm_closed_list_instruction", "evidence": "camera_direction: ... 샷 타입 용어와 앵글 용어는 반드시 포함", "line_end": 189, "line_start": 189, "recommended_fix": "Extract shot_type and camera_angle into separate structured fields in the output schema instead of embedding them in the camera_direction prose.", "severity": "P2", "why_problematic": "The instruction forces the LLM to embed specific classification tokens (e.g., ECU, MS, low angle) within a natural language prose field. This establishes a contract for downstream regex-based parsing of generated descriptions to recover structured metadata, which is brittle compared to structured fields."}], "path": "prompts/_base/shot_staging/7.202604181200/system.md", "scan_kind": "prompt", "sha256": "2fabcde5001adb9f1a75f521e0635cdc2fd48518069742d128419e6b6f01f319"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 28, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 2734, "findings": [], "path": "prompts/_base/shot_validator/1.202604181200/validator_schema.json", "scan_kind": "prompt", "sha256": "862a49f67970651da50e3ec83673cdffa63f9f82720588b170c09b1cc79f691a"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 68, "chunk_start": 1, "chunk_summary": "The schema defines several categorical fields using string descriptions instead of enums and overloads the gaze_target field with physical state information, creating brittle contracts for downstream logic.", "duration_ms": 28881, "findings": [{"category": "schema_or_enum_drift", "evidence": "perspective, perception_mode, angle, gaze_target", "line_end": 40, "line_start": 11, "recommended_fix": "Use JSON Schema 'enum' for fields with a fixed set of values. For gaze_target, use 'anyOf' to allow both a fixed enum and arbitrary character/object names.", "severity": "P2", "why_problematic": "Categorical values for camera POV, perception mode, character angles, and gaze targets are defined only in descriptions rather than using the JSON Schema 'enum' keyword. This creates a brittle contract where downstream code (e.g., for visibility rules or reference selection) must use exact string matching on unenforced LLM outputs."}, {"category": "schema_or_enum_drift", "evidence": "gaze_target: ..., 'unconscious', 'dead', 'severely_injured'", "line_end": 40, "line_start": 40, "recommended_fix": "Move physical state indicators to a separate 'character_state' or 'status' field to decouple gaze direction from physical condition.", "severity": "P2", "why_problematic": "The gaze_target field is an overloaded semantic channel where physical state information (unconscious, dead, injured) is mixed with gaze direction. This forces downstream logic to parse the gaze field to determine character status or policy exemptions."}], "path": "prompts/_base/shot_staging/8.202604201230/schema.json", "scan_kind": "prompt", "sha256": "e36ce04980cfd7c8a26d7f8a7d8bfcde76b3683397e34b01a40da4229f8de226"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 68, "chunk_start": 1, "chunk_summary": "The prompt defines several brittle string patterns and phrase lists to classify entity visibility and off-camera status, which drives the core logic of visible entity membership.", "duration_ms": 110209, "findings": [{"category": "llm_closed_list_instruction", "evidence": "Gaze-target close-up 패턴 (X[를을] (응시하|...)), 명시적 off-camera/off-screen phrase, 차단(blocking) 패턴, Reaction-only 패턴", "line_end": 49, "line_start": 31, "recommended_fix": "Replace pattern-based instructions with high-level semantic criteria for visibility. Instead of providing regex-like strings, describe the visual logic (e.g., 'if the character is the subject of a close-up while looking at another, the target is off-camera') and allow the LLM to apply its reasoning.", "severity": "P1", "why_problematic": "The prompt instructs the LLM to use specific Korean and English string patterns and phrase lists to determine if an entity is physically visible in the frame. This turns semantic visual analysis into brittle keyword/pattern matching, which fails to capture the variety of natural language descriptions and biases the LLM towards specific phrasing."}], "path": "prompts/_base/shot_director/5.202605131800/system.md", "scan_kind": "prompt", "sha256": "95ea6973e6cdc22d2e6442dffe5405333a24d9b5e3fb354a82586cec7d09b041"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 28, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 3914, "findings": [], "path": "prompts/_base/shot_validator/2.202604201230/validator_schema.json", "scan_kind": "prompt", "sha256": "862a49f67970651da50e3ec83673cdffa63f9f82720588b170c09b1cc79f691a"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 278, "chunk_start": 1, "chunk_summary": "The prompt defines several closed-list semantic classifiers for visual and spatial properties and contains an overloaded semantic channel for character states.", "duration_ms": 61356, "findings": [{"category": "schema_or_enum_drift", "evidence": "\"closed\", \"unconscious\", \"dead\", \"severely_injured\"", "line_end": 123, "line_start": 121, "recommended_fix": "Separate character physical/biological state into a dedicated schema field and keep gaze_target strictly for spatial entities or directions.", "severity": "P2", "why_problematic": "The gaze_target field is overloaded to carry non-spatial semantic states. This forces downstream logic to parse a spatial target field for biological state information, which should be a separate semantic dimension."}, {"category": "llm_closed_list_instruction", "evidence": "content_surface, reflective_surface, transparent_surface, directional_3d, non_directional", "line_end": 155, "line_start": 150, "recommended_fix": "Move directionality classification to a persistent asset database or provide clearer visual examples to reduce classification ambiguity.", "severity": "P2", "why_problematic": "Asks the LLM to classify objects into technical categories based on their visual function in the shot. This is a semantic classifier that might be better handled by structured asset metadata rather than LLM inference from prose."}, {"category": "llm_closed_list_instruction", "evidence": "movement_direction, points_to_anchor, looks_to_anchor, shared_space_relation, required_background_position, primary_subject_isolation", "line_end": 213, "line_start": 202, "recommended_fix": "Allow a free-text reason field or expand the enum to cover a broader range of cinematic intents.", "severity": "P2", "why_problematic": "Forces the LLM to categorize the trigger for a spatial contract into a fixed list of semantic reasons. This can lead to inaccurate classification if the cinematic intent doesn't perfectly match the provided enum."}, {"category": "schema_or_enum_drift", "evidence": "target_id is an exception... must use C## / P##", "line_end": 225, "line_start": 225, "recommended_fix": "Unify the identification method across all prompt sections, preferably using the structured IDs required by the schema.", "severity": "P2", "why_problematic": "The prompt establishes a general rule to use natural language names for characters (Line 190), but the spatial contract section requires a manual override to use technical IDs to satisfy schema constraints. This creates inconsistent identification logic for the LLM."}, {"category": "llm_closed_list_instruction", "evidence": "none, points_to, reaches_for, looks_toward, moves_toward", "line_end": 238, "line_start": 236, "recommended_fix": "Use a more flexible action description or ensure the downstream consumer can handle natural language action descriptions.", "severity": "P2", "why_problematic": "Requires the LLM to map open-world character actions to a closed set of semantic labels for spatial constraints. This is a brittle classifier for complex physical interactions."}], "path": "prompts/_base/shot_staging/11.202605150319/system.md", "scan_kind": "prompt", "sha256": "8b681e3cbcd7e287aa4d96d09a39025aabe0d3ca290fae1fe055093d6fde82b9"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 28, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 5935, "findings": [], "path": "prompts/_base/shot_validator/3.202604301730/validator_schema.json", "scan_kind": "prompt", "sha256": "862a49f67970651da50e3ec83673cdffa63f9f82720588b170c09b1cc79f691a"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 194, "chunk_start": 1, "chunk_summary": "The prompt defines a complex set of instructions for a virtual DP, including rules for inheriting camera flow and diversifying body poses, but it introduces semantic debt by overloading the gaze_target field with physical states and requiring technical enums to be embedded in natural language prose.", "duration_ms": 37631, "findings": [{"category": "semantic_string_judgment", "evidence": "gaze_target ... \"closed\", \"unconscious\", \"dead\", \"severely_injured\"", "line_end": 138, "line_start": 129, "recommended_fix": "Separate physical character states (dead, injured, unconscious) into a dedicated 'character_status' or 'physical_state' field in the schema, keeping gaze_target strictly for spatial entities or directions.", "severity": "P1", "why_problematic": "The gaze_target field is used as an overloaded semantic channel. It mixes spatial targets (names, nouns, directions) with physical character states (death, injury, consciousness). This forces downstream logic to perform string-based classification to distinguish between where a character is looking and what their physical status is, which are fundamentally different semantic categories."}, {"category": "semantic_string_judgment", "evidence": "camera_direction: ... 샷 타입(ECU/CU/MS/WS 등) + 앵글(low/high/Dutch 등) ... 반드시 포함", "line_end": 189, "line_start": 189, "recommended_fix": "Define explicit 'shot_type' and 'shot_angle' fields in the JSON output schema and instruct the LLM to populate them with the canonical enum values, rather than embedding them in the prose description.", "severity": "P1", "why_problematic": "The prompt requires the LLM to embed technical shot type and angle enums into a 2-3 sentence English prose field (camera_direction). This creates a brittle contract where downstream consumers must use regex or substring matching to extract structured metadata from natural language descriptions, rather than relying on structured fields."}], "path": "prompts/_base/shot_staging/8.202604201230/system.md", "scan_kind": "prompt", "sha256": "6bb30298d30171e9739986b031673d04ed9a203d64406d3ffabc5031a0af9f4e"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 76, "chunk_start": 1, "chunk_summary": "The schema defines several fields with specific token vocabularies in descriptions rather than enums, and overloads the gaze_target field with character physical states.", "duration_ms": 29151, "findings": [{"category": "schema_or_enum_drift", "evidence": "\"gaze_target\": ... \"unconscious\", \"dead\", \"severely_injured\"", "line_end": 40, "line_start": 40, "recommended_fix": "Separate physical status into a dedicated field (e.g., physical_status) and use a formal enum for fixed gaze tokens like 'camera', 'up', 'down'.", "severity": "P1", "why_problematic": "This is an overloaded semantic channel. The field is intended for spatial gaze targets but is used to communicate high-level character physical states (death, injury, consciousness). This forces downstream logic to infer character status from a gaze field, and these states are listed in the description rather than enforced by a schema enum."}, {"category": "schema_or_enum_drift", "evidence": "perspective, perception_mode, angle", "line_end": 38, "line_start": 11, "recommended_fix": "Move the listed values from the description into a formal enum constraint in the JSON schema for each of these fields.", "severity": "P2", "why_problematic": "These fields define a specific vocabulary of allowed values in their descriptions (e.g., subjective_pov, hallucination, facing_camera) but do not use the JSON enum property. This creates a brittle contract where the LLM may produce variations that downstream string-matching logic will fail to recognize."}], "path": "prompts/_base/shot_staging/9.202605121441/schema.json", "scan_kind": "prompt", "sha256": "44994153c2f52d4664486a69bc901a4127e4dd1ade16d371a2a695b9812a3208"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 53, "chunk_start": 1, "chunk_summary": "The prompt defines a semantic classifier for temporal duration using a closed list of linguistic connectors to validate shot descriptions.", "duration_ms": 22633, "findings": [{"category": "llm_closed_list_instruction", "evidence": "시간 연결어 절대 금지: \"~하자\", \"~하면서\", \"~하며\", \"~하고\", \"~한 뒤\", \"~한 후\", \"~하고 나서\", \"~하려는 찰나\", \"~하기 직전\", \"~을 지으며\", \"and then\", \"while ~ing\", \"after ~ing\", \"as ~\"", "line_end": 15, "line_start": 11, "recommended_fix": "Replace the phrase-based blacklist with high-level semantic guidelines and few-shot examples that demonstrate the difference between a single moment and a sequence, allowing the LLM to use its reasoning capabilities rather than rigid pattern matching.", "severity": "P1", "why_problematic": "The prompt uses a closed list of linguistic patterns as a proxy for the open-world semantic concept of 'temporal sequence.' This forces the LLM to act as a brittle string-based classifier, which can lead to incorrect validation of natural language descriptions that are semantically valid but use forbidden connectors, or vice versa."}], "path": "prompts/_base/shot_validator/1.202604181200/system.md", "scan_kind": "prompt", "sha256": "897c56b4d93b85ede692fac15cd87c537b13236d10a70e6c483ca3a7e88ff8f2"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 204, "chunk_start": 1, "chunk_summary": "The prompt defines structured output fields for shot staging, including a gaze target field overloaded with physical states and a semantic classification system for background elements.", "duration_ms": 28896, "findings": [{"category": "schema_or_enum_drift", "evidence": "gaze_target ... \"unconscious\" ... \"dead\" ... \"severely_injured\"", "line_end": 139, "line_start": 129, "recommended_fix": "Separate physical_state or health_status into a distinct schema field instead of overloading the gaze_target field.", "severity": "P2", "why_problematic": "The gaze_target field is overloaded to carry physical/medical state information (dead, injured, unconscious) in addition to spatial gaze targets. This creates a multi-modal semantic channel where a single field must be parsed for both entity names and state constants, which is a known debt pattern in this pipeline."}, {"category": "llm_closed_list_instruction", "evidence": "directionality_class ... content_surface ... reflective_surface ... transparent_surface ... directional_3d ... non_directional", "line_end": 170, "line_start": 164, "recommended_fix": "If these classes drive specific rendering logic, consider moving the classification to a dedicated metadata lookup or a more robust vision-language model step.", "severity": "P2", "why_problematic": "The prompt instructs the LLM to classify arbitrary open-world objects into a closed list of 5 semantic categories based on complex natural-language judgment criteria (e.g., whether a surface has 'meaningful content' on one side). This forces the LLM to act as a semantic classifier for visual properties that may be better handled by technical metadata or vision models."}], "path": "prompts/_base/shot_staging/9.202605121441/system.md", "scan_kind": "prompt", "sha256": "c50794ebcd115531b25470b3f448fe88a1da533227d11dd0c698fa58a7a8e96a"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 53, "chunk_start": 1, "chunk_summary": "The prompt uses a closed list of temporal connectors and specific linguistic patterns as a semantic classifier to validate and rewrite shot descriptions.", "duration_ms": 17231, "findings": [{"category": "llm_closed_list_instruction", "evidence": "시간 연결어 절대 금지 (~하자, ~하면서, ~하며, ~하고, ~한 뒤, ~한 후, ~하고 나서, ~하려는 찰나, ~하기 직전, ~을 지으며, and then, while ~ing, after ~ing, as ~) and linguistic rules for ~한 채/~은 채", "line_end": 29, "line_start": 11, "recommended_fix": "Replace the phrase-based blacklist with a high-level semantic instruction to identify descriptions implying temporal progression or sequential actions, relying on the '1/1000s shutter' principle rather than specific keyword matches.", "severity": "P1", "why_problematic": "The prompt instructs the LLM to use a specific list of temporal connectors and grammatical patterns as a hard classifier for 'still moment' violations. This forces the LLM to act as a string matcher rather than evaluating the visual semantics of the scene, which can lead to brittle validation and inconsistent results if descriptions use synonyms or complex grammar not explicitly listed."}], "path": "prompts/_base/shot_validator/2.202604201230/system.md", "scan_kind": "prompt", "sha256": "28c26605172c1f961c834db04f18e77be2180fb843f729e2390b6fede68afcfb"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 16, "chunk_start": 1, "chunk_summary": "No actionable findings; the file contains a generic prompt template with abstract placeholders and no scenario-specific pollution or semantic classifiers.", "duration_ms": 2899, "findings": [], "path": "prompts/_base/t2i_composer/v1/user.md", "scan_kind": "prompt", "sha256": "81af21682d5f98b7f21ae45575b86c796400e419ed0d7465df66c1757c212882"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 32, "chunk_start": 1, "chunk_summary": "No actionable findings; the system prompt provides generic cinematic framing examples and formatting instructions without scenario pollution or brittle semantic classifiers.", "duration_ms": 7830, "findings": [], "path": "prompts/_base/t2i_composer/v1/system.md", "scan_kind": "prompt", "sha256": "c39f835ea9988a6962b8aefb08faafd0d9610bce33845981ab7d2aed217a1912"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 201, "chunk_start": 1, "chunk_summary": "The prompt defines several semantic classifiers for shot validation and entity mapping based on closed lists of Korean/English phrases and keywords.", "duration_ms": 11604, "findings": [{"category": "llm_closed_list_instruction", "evidence": "\"~하자\", \"~하면서\", \"and then\", \"while ~ing\", \"after ~ing\"", "line_end": 16, "line_start": 12, "recommended_fix": "Instruct the LLM to identify temporal progression or sequential logic conceptually rather than relying on a specific list of forbidden conjunctions.", "severity": "P1", "why_problematic": "The prompt uses a closed list of linguistic patterns to classify whether a description violates the 'still moment' principle, which is a semantic judgment over open-world natural language."}, {"category": "semantic_string_judgment", "evidence": "신체 부위 표현 (얼굴, 손, 다리...), 동작 동사 등장 (잡기, 보기, 말하기...)", "line_end": 161, "line_start": 157, "recommended_fix": "Define the requirement for character IDs based on the presence of any human agent or person-like entity in the scene context rather than a specific list of body parts and verbs.", "severity": "P1", "why_problematic": "This defines 'visible-human-action' using a brittle keyword list. This classification directly triggers a fail-fast validation rule (line 172) that enforces character ID presence."}, {"category": "semantic_string_judgment", "evidence": "entity name 정확 일치 또는 description 안 character 표현이 entity name substring 일치", "line_end": 81, "line_start": 79, "recommended_fix": "Encourage semantic mapping based on the provided entity traits and context rather than enforcing substring matching logic.", "severity": "P1", "why_problematic": "Instructs the LLM to perform entity mapping based on exact or substring matches between the description and the entity map. This is brittle for open-world character descriptions (e.g., 'the tall man' vs 'John')."}, {"category": "llm_closed_list_instruction", "evidence": "찌르기/베기: stabbing, slashing..., 타격: punching, striking...", "line_end": 117, "line_start": 111, "recommended_fix": "Describe the physical principles of active contact (force, resistance, impact) instead of providing a list of specific verbs.", "severity": "P2", "why_problematic": "Provides a closed vocabulary for classifying 'active contact' types. While labeled as a guide, it biases the LLM toward specific verb categories when deciding how to preserve 'mid-impact' semantics."}], "path": "prompts/_base/shot_validator/4.202605061408/system.md", "scan_kind": "prompt", "sha256": "376168b0e08ec20e48185adf92a96fab18f8349c34821e0a27f177ec851a3015"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 38, "chunk_start": 1, "chunk_summary": "The schema defines the structure for shot validation results without scenario-specific pollution or brittle string-based routing logic.", "duration_ms": 10554, "findings": [], "path": "prompts/_base/shot_validator/5.202605081700/validator_schema.json", "scan_kind": "prompt", "sha256": "0d269a0576fdd7f1b9eb1cf590b1b4ee71ba3fb68d1af49309fd1ff4ba9cfdc8"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 96, "chunk_start": 1, "chunk_summary": "The prompt defines semantic validation and rewrite rules for 'still moment' shots using closed lists of linguistic patterns and motion verb categories to drive classification behavior.", "duration_ms": 18522, "findings": [{"category": "llm_closed_list_instruction", "evidence": "아래 표현은 두 동작 사이의 시간 순서를 나타내므로 위반 — 재작성 대상: - \"~하자\", \"~하면서\", \"~하며\", \"~하고\", \"~한 뒤\", \"~한 후\", \"~하고 나서\" ... \"and then\", \"while ~ing\", \"after ~ing\", \"as ~\"", "line_end": 16, "line_start": 12, "recommended_fix": "Define the semantic requirement (e.g., 'no temporal progression or sequential actions') and provide diverse examples of violations rather than a 'forbidden' phrase list.", "severity": "P1", "why_problematic": "The prompt instructs the LLM to use a closed list of grammatical markers and conjunctions as a semantic classifier for temporal progression. This is brittle for open-world natural language where temporal sequence can be implied without these specific tokens, leading to inconsistent validation."}, {"category": "llm_closed_list_instruction", "evidence": "대상 동작 카테고리 (어휘는 다양 — 원문 언어에 따라 한국어든 영어든 가능): - locomotion: running / sprinting / walking / striding / climbing ... - chasing/fleeing: chasing, fleeing, escaping", "line_end": 42, "line_start": 36, "recommended_fix": "Instruct the LLM to identify any 'continuous physical displacement or high-momentum action' semantically, using the categories as illustrative examples rather than a trigger list.", "severity": "P1", "why_problematic": "The prompt uses a closed taxonomy of motion verbs to trigger the 'mid-action freeze' logic. This creates a semantic bottleneck where actions outside this list or described with different vocabulary might bypass the required visual preservation logic."}], "path": "prompts/_base/shot_validator/3.202604301730/system.md", "scan_kind": "prompt", "sha256": "9228ac56a603032a36f676e3844b5f61f13612156e99f0ea308ec358f636e412"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 38, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 15694, "findings": [], "path": "prompts/_base/shot_validator/4.202605061408/validator_schema.json", "scan_kind": "prompt", "sha256": "c1c4cf0621c3162a2e79183c04809bb894ec4ab0750d387f96a1175969f40372"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 23, "chunk_start": 1, "chunk_summary": "The prompt defines a contract for blind substring replacement (target/suggestion) on generated T2I prompts, which is a brittle mutation pattern.", "duration_ms": 8112, "findings": [{"category": "blind_string_mutation", "evidence": "target: T2I 프롬프트 원문에서 정확히 찾을 수 있는 문자열 / suggestion: target을 대체할 문자열", "line_end": 23, "line_start": 21, "recommended_fix": "Transition to structured prompt updates, such as full-field rewrites or a more robust AST-based modification system, rather than raw substring replacement.", "severity": "P1", "why_problematic": "This defines a contract for blind substring replacement on generated T2I prompt text. Substring-based mutation is prone to collisions and context-blind errors when modifying semantic prose."}], "path": "prompts/_base/t2i_review/2.202604301730/entity_system.md", "scan_kind": "prompt", "sha256": "c79668a8ab97b4ebf26f285cf54001935906c4a9888103ec25a773426fc4ece4"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 28, "chunk_start": 1, "chunk_summary": "The prompt defines a T2I review system that identifies semantic issues (nationality, cultural nuances) and provides exact substring replacement pairs for automated or semi-automated prompt mutation.", "duration_ms": 12483, "findings": [{"category": "blind_string_mutation", "evidence": "target: T2I 프롬프트 원문에서 정확히 찾을 수 있는 문자열 / suggestion: target을 대체할 문자열", "line_end": 28, "line_start": 26, "recommended_fix": "Instead of substring replacement, have the LLM output the full corrected prompt or use a structured template where specific fields (e.g., character_description, location_details) are updated independently.", "severity": "P1", "why_problematic": "This establishes a contract for blind substring replacement of generated T2I prompts. Downstream code or processes using these pairs will perform semantic mutations without structural awareness, risking collateral damage in the prompt prose."}, {"category": "semantic_string_judgment", "evidence": "1. 국적/인종 누락 ... 2. 고유명사 번역 ... 3. 원어 어색", "line_end": 17, "line_start": 14, "recommended_fix": "Move these semantic requirements into the primary generation prompt as constraints or use a structured visual context model that explicitly tracks nationality and cultural metadata for all entities.", "severity": "P1", "why_problematic": "The prompt instructs the LLM to act as a semantic classifier for open-world concepts like nationality, cultural paraphrasing, and proper noun translation. These judgments drive the brittle target/suggestion replacement mechanism."}], "path": "prompts/_base/t2i_review/1.202604051200/scene_system.md", "scan_kind": "prompt", "sha256": "8048a007d041cb810d4a54179483e3f9fc065507b8ccc7247e91cf44d267c8f8"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 24, "chunk_start": 1, "chunk_summary": "The prompt defines a contract for blind substring replacement in T2I prompts and contains a concrete location example that may bias proper noun handling.", "duration_ms": 15042, "findings": [{"category": "blind_string_mutation", "evidence": "target: T2I 프롬프트 원문에서 정확히 찾을 수 있는 문자열 ... suggestion: target을 대체할 문자열", "line_end": 24, "line_start": 22, "recommended_fix": "Use a structured edit format or return the entire corrected prompt rather than relying on exact substring matching.", "severity": "P1", "why_problematic": "This establishes a contract for the LLM to perform blind substring replacement on generated T2I prompts. This is brittle as it lacks structural context and can lead to corrupted prompts if the target string appears in multiple contexts or is partially matched."}, {"category": "scenario_dependent_prompt", "evidence": "(예: \"Incheon\" → \"인천\"이어야 함)", "line_end": 13, "line_start": 13, "recommended_fix": "Replace the concrete location with an abstract placeholder like [Location Name] or [Proper Noun].", "severity": "P2", "why_problematic": "The prompt uses a specific real-world location (Incheon) as a concrete example for a translation rule. This can bias the LLM towards specific regions or languages when evaluating proper nouns in arbitrary scenarios."}], "path": "prompts/_base/t2i_review/1.202604051200/entity_system.md", "scan_kind": "prompt", "sha256": "34225c1c41ebf7143c8ec08b1c334a417ed1961c809bca720ca529fd9d7ab00b"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 43, "chunk_start": 1, "chunk_summary": "The schema defines a contract for blind string mutation of T2I prompt text using unique substrings and replacement suggestions.", "duration_ms": 8362, "findings": [{"category": "blind_string_mutation", "evidence": "target: unique sub-string, suggestion: target을 대체할 문자열", "line_end": 29, "line_start": 28, "recommended_fix": "Instead of blind substring replacement, use structured prompt components or a more robust patching mechanism that operates on semantic tokens or structured fields rather than raw string search-and-replace.", "severity": "P1", "why_problematic": "The schema establishes a contract where an LLM identifies a semantic substring in generated T2I text for blind replacement. This is brittle as it relies on the LLM's ability to find a unique match and the code's blind application of the suggestion to natural language prose, which can lead to unintended side effects in the final image prompt."}], "path": "prompts/_base/t2i_review/2.202604301730/scene_schema.json", "scan_kind": "prompt", "sha256": "b481b4477ee4914863820fb5bf579a72c75c82ced97d42960de588671e2bcf9f"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 32, "chunk_start": 1, "chunk_summary": "The schema defines a contract for blind substring replacement in generated T2I prompts, which is a brittle semantic mutation pattern.", "duration_ms": 22489, "findings": [{"category": "blind_string_mutation", "evidence": "target (T2I 원문에서 정확히 찾을 수 있는 치환 대상), suggestion (target을 대체할 문자열)", "line_end": 18, "line_start": 17, "recommended_fix": "Transition to a structured prompt format where specific attributes are modified as discrete fields, or use a more robust patching mechanism that includes context anchors.", "severity": "P1", "why_problematic": "The schema establishes a contract for the LLM to perform blind substring replacement on natural-language T2I prompts. This is brittle because it relies on exact string matching in generated prose, which can lead to collisions or failed matches if the LLM output is slightly inconsistent with the source text."}], "path": "prompts/_base/t2i_review/1.202604051200/entity_schema.json", "scan_kind": "prompt", "sha256": "ce4e5fc5d797fe55a29afa2ad41803aae4f9bbf5c354c826da43f3eb79ca8067"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 33, "chunk_start": 1, "chunk_summary": "The schema defines a contract for blind substring replacement of generated T2I prompts, which is a brittle method for semantic mutation.", "duration_ms": 19597, "findings": [{"category": "blind_string_mutation", "evidence": "target: T2I 원문에서 정확히 찾을 수 있는 치환 대상, suggestion: target을 대체할 문자열", "line_end": 19, "line_start": 18, "recommended_fix": "Shift from substring replacement to whole-prompt regeneration or structured template updates where the LLM provides the full corrected field rather than a mutation pair.", "severity": "P1", "why_problematic": "The schema defines a contract for blind substring replacement within generated T2I prompts. This assumes the LLM can identify and provide an exact, unique substring for replacement, which is prone to collision or failure in natural language prose."}], "path": "prompts/_base/t2i_review/1.202604051200/scene_schema.json", "scan_kind": "prompt", "sha256": "8313e00221e938e3c4d6aa202f2de8a06b4aaf15430d28dd46b3ffc37afaae3e"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 32, "chunk_start": 1, "chunk_summary": "The schema defines a contract for blind string mutation of T2I prompts using target/suggestion pairs.", "duration_ms": 25271, "findings": [{"category": "blind_string_mutation", "evidence": "\"target\": {\"type\": \"string\", \"description\": \"T2I 원문에서 정확히 찾을 수 있는 치환 대상\"}, \"suggestion\": {\"type\": \"string\", \"description\": \"target을 대체할 문자열\"}", "line_end": 18, "line_start": 17, "recommended_fix": "Shift from substring replacement to a structured prompt generation or full-string rewrite. If specific entities need modification, use unique identifiers or a templating system rather than searching for natural language substrings.", "severity": "P1", "why_problematic": "The schema establishes a contract for the LLM to provide exact substrings for replacement in generated T2I prompts. This leads to blind semantic mutation where natural language prose is modified without context, risking corruption if the target string appears in multiple contexts or is part of a larger semantic unit."}], "path": "prompts/_base/t2i_review/2.202604301730/entity_schema.json", "scan_kind": "prompt", "sha256": "70626235b41084ce75cadea8f5fd5a67081c1eebd0c06388b9d628364f45b409"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 23, "chunk_start": 1, "chunk_summary": "The prompt defines a contract for blind substring replacement of T2I prompts, which constitutes blind semantic mutation debt.", "duration_ms": 13377, "findings": [{"category": "blind_string_mutation", "evidence": "target: T2I 프롬프트 원문에서 정확히 찾을 수 있는 문자열 / suggestion: target을 대체할 문자열", "line_end": 23, "line_start": 21, "recommended_fix": "Shift to a structured prompt reconstruction approach or use unique block identifiers for replacement instead of arbitrary substring matching.", "severity": "P1", "why_problematic": "This establishes a contract for blind substring replacement on generated T2I prompt text. LLM-generated targets are prone to collisions or partial matches that can corrupt the semantic meaning of the prompt during mutation if the target string appears in multiple contexts."}], "path": "prompts/_base/t2i_review/2.202605081200/entity_system.md", "scan_kind": "prompt", "sha256": "c79668a8ab97b4ebf26f285cf54001935906c4a9888103ec25a773426fc4ece4"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 32, "chunk_start": 1, "chunk_summary": "The schema defines a contract for blind substring replacement of T2I prompt text using LLM-generated target and suggestion strings.", "duration_ms": 15407, "findings": [{"category": "blind_string_mutation", "evidence": "\"target\": {\"type\": \"string\", \"description\": \"T2I 원문에서 정확히 찾을 수 있는 치환 대상\"}, \"suggestion\": {\"type\": \"string\", \"description\": \"target을 대체할 문자열\"}", "line_end": 18, "line_start": 17, "recommended_fix": "Replace blind substring mutation with a structured update mechanism. Instead of providing raw strings for replacement, the LLM should return the full corrected prompt or identify specific structured fields/entities to be modified.", "severity": "P1", "why_problematic": "The schema establishes a contract for blind substring replacement ('target' and 'suggestion') on generated T2I prompt prose. This is brittle as it relies on exact string matching within natural-language text, which can lead to incorrect mutations if the target string appears in multiple contexts or if the LLM fails to provide an exact match."}], "path": "prompts/_base/t2i_review/2.202605081200/entity_schema.json", "scan_kind": "prompt", "sha256": "70626235b41084ce75cadea8f5fd5a67081c1eebd0c06388b9d628364f45b409"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 201, "chunk_start": 1, "chunk_summary": "The prompt uses several closed-list phrase patterns and substring matching instructions to classify open-world semantic properties (temporal flow, physical impact, and human action) which drive validation, rewriting, and entity resolution behavior.", "duration_ms": 38395, "findings": [{"category": "llm_closed_list_instruction", "evidence": "시간 연결어 절대 금지 (~하자, ~하면서, and then, while ~ing), 대상 동작 카테고리 (locomotion, riding/driving, water/swim), Active contact freeze rule (stabbing, punching, pinning)", "line_end": 116, "line_start": 12, "recommended_fix": "Replace phrase lists with high-level semantic descriptions of the desired 'still moment' state and provide diverse examples of the transformation logic rather than a keyword-based classifier.", "severity": "P1", "why_problematic": "The prompt instructs the LLM to classify temporal flow and physical impact using closed lists of connectors and verbs. This is brittle for open-world scenario text and will fail to correctly transform shots if synonyms or complex phrasing are used."}, {"category": "llm_closed_list_instruction", "evidence": "visible-human-action 판정 기준 (얼굴, 손, 다리, 팔, face, hand, leg, arm, 잡기, 보기, 말하기, hold, look, talk)", "line_end": 161, "line_start": 157, "recommended_fix": "Instruct the LLM to identify human action based on the presence of any human entity or anatomical interaction described in the scene, rather than relying on a specific keyword list.", "severity": "P1", "why_problematic": "This section defines a semantic classifier for human presence/action based on a closed list of body parts and verbs. This classification directly drives a fail-fast/correction rule at line 172, creating a validation bypass risk if the description uses terms outside the list."}, {"category": "semantic_string_judgment", "evidence": "entity name substring 일치, name / stable_traits substring 매칭", "line_end": 86, "line_start": 80, "recommended_fix": "Instruct the LLM to perform semantic entity resolution based on the context and traits provided in the entity map, rather than enforcing a substring match contract.", "severity": "P1", "why_problematic": "The prompt explicitly instructs the LLM to use substring matching to resolve entity IDs from natural language descriptions. This is a brittle pattern-matching approach that fails to handle semantic synonyms, nicknames, or descriptive references that do not contain the exact name string."}], "path": "prompts/_base/shot_validator/5.202605081700/system.md", "scan_kind": "prompt", "sha256": "376168b0e08ec20e48185adf92a96fab18f8349c34821e0a27f177ec851a3015"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 53, "chunk_start": 1, "chunk_summary": "The schema defines a contract for blind string mutation of T2I prompts using substring replacement.", "duration_ms": 17918, "findings": [{"category": "blind_string_mutation", "evidence": "target: unique sub-string, suggestion: target을 대체할 문자열", "line_end": 39, "line_start": 38, "recommended_fix": "Transition to full-text regeneration or structured attribute updates instead of substring-based patching of generated prose.", "severity": "P1", "why_problematic": "The schema establishes a contract for the LLM to identify and replace substrings within generated natural-language prompt text. This blind mutation approach is brittle and prone to errors when the same substring appears in different contexts or when the LLM fails to provide an exact match in the generated prose."}], "path": "prompts/_base/t2i_review/2.202605081200/scene_schema.json", "scan_kind": "prompt", "sha256": "d598177de93e41da9cbb507e3f064450a97016639329dacc408740a12e76a223"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 101, "chunk_start": 1, "chunk_summary": "The prompt defines a review system that uses natural language phrase patterns to detect semantic issues (reference leakage, physical inconsistency) and instructs the system to perform blind substring mutations on generated T2I prompts.", "duration_ms": 15621, "findings": [{"category": "blind_string_mutation", "evidence": "target/suggestion 형태로 치환 정보를 제공하면 시스템이 자동으로 적용합니다 ... target: T2I 프롬프트 원문에서 정확히 찾을 수 있는 문자열 (sub-string 매치)", "line_end": 89, "line_start": 3, "recommended_fix": "Instead of raw substring replacement, use a structured edit format (e.g., identifying specific entity blocks or using a diff-based approach) or have the LLM regenerate the full prompt section.", "severity": "P1", "why_problematic": "The prompt establishes a contract for blind substring replacement of generated T2I prompt prose. This is brittle and can lead to malformed sentences or unintended side effects if the target string is not unique or contextually isolated."}, {"category": "semantic_string_judgment", "evidence": "camera_direction에 close-framing tag (`ECU`, `XCU`, ...)가 하나라도 포함된 경우 ... 검출 패턴: \"the existing X\", \"the reference X\", \"from the reference image\"", "line_end": 39, "line_start": 32, "recommended_fix": "Use structured metadata to track reference dependencies rather than searching for 'reference' or 'existing' keywords in natural language descriptions.", "severity": "P1", "why_problematic": "The prompt instructs the LLM to classify visual context (reference leakage) by matching specific natural language phrases against generated prompt prose. This relies on brittle string patterns to decide whether reference-based generation logic should be bypassed."}, {"category": "semantic_string_judgment", "evidence": "카메라 \"low at ground/floor/quay level\" + 묘사 \"<surface> visible behind subject's hands\"", "line_end": 56, "line_start": 52, "recommended_fix": "Define camera height and subject positioning using structured enums or numeric ranges that can be validated programmatically without relying on exact phrase matches.", "severity": "P1", "why_problematic": "This defines spatial/physical validity rules by matching specific natural language phrases in camera directions against phrases in the prompt description. This is a brittle way to enforce physical consistency that should be handled by structured spatial coordinates or higher-level scene logic."}], "path": "prompts/_base/t2i_review/2.202605081200/scene_system.md", "scan_kind": "prompt", "sha256": "fc75a0c93cea005c8c05ac5e668c5021624adc1615537900a46b594ff4bfd59b"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 53, "chunk_start": 1, "chunk_summary": "The schema defines a contract for blind substring replacement in T2I prompts, which is a brittle method for semantic mutation.", "duration_ms": 10952, "findings": [{"category": "blind_string_mutation", "evidence": "\"target\": ... \"unique sub-string\", \"suggestion\": ... \"target을 대체할 문자열\"", "line_end": 39, "line_start": 38, "recommended_fix": "Move away from substring replacement for prompt fixes. Use structured prompt fields or a more robust patch format that operates on semantic tokens rather than raw strings.", "severity": "P1", "why_problematic": "The schema establishes a contract for blind substring replacement in natural-language T2I prompts. This is brittle because it assumes the LLM can identify a unique, safe-to-replace substring in generated prose, which often leads to collisions or broken sentences during the mutation phase."}], "path": "prompts/_base/t2i_review/2.202605081600/scene_schema.json", "scan_kind": "prompt", "sha256": "e772190324d90ec45265b2eff9a613eeb44aabde279e42fef8ede2bd505481be"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 23, "chunk_start": 1, "chunk_summary": "The prompt defines a contract for blind string mutation by requiring exact substring targets and suggestions for prompt correction.", "duration_ms": 9005, "findings": [{"category": "blind_string_mutation", "evidence": "target: T2I 프롬프트 원문에서 정확히 찾을 수 있는 문자열 / suggestion: target을 대체할 문자열", "line_end": 23, "line_start": 21, "recommended_fix": "Replace blind substring mutation with a structured update mechanism, such as identifying specific prompt components or providing the full corrected prompt string.", "severity": "P1", "why_problematic": "This establishes a contract for blind substring replacement within generated T2I prompt prose. Relying on exact string matches for semantic updates is brittle and can lead to incorrect mutations if the target string appears in multiple contexts or if the LLM fails to provide a verbatim match."}], "path": "prompts/_base/t2i_review/3.202605121200/entity_system.md", "scan_kind": "prompt", "sha256": "c79668a8ab97b4ebf26f285cf54001935906c4a9888103ec25a773426fc4ece4"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 32, "chunk_start": 1, "chunk_summary": "The schema defines a contract for blind substring replacement of generated T2I prompts using target and suggestion fields.", "duration_ms": 24798, "findings": [{"category": "blind_string_mutation", "evidence": "target: {type: string, description: T2I 원문에서 정확히 찾을 수 있는 치환 대상}, suggestion: {type: string, description: target을 대체할 문자열}", "line_end": 18, "line_start": 17, "recommended_fix": "Shift from substring replacement to a structured update mechanism where the LLM provides the full corrected sentence or uses a more robust template-based approach.", "severity": "P1", "why_problematic": "This schema establishes a contract for blind substring replacement ('target' to 'suggestion') within generated T2I prompt text. This is brittle because it assumes the target string is unique and safe to replace without context, which can corrupt the prompt if the substring appears in multiple places or as part of other words."}], "path": "prompts/_base/t2i_review/2.202605081600/entity_schema.json", "scan_kind": "prompt", "sha256": "70626235b41084ce75cadea8f5fd5a67081c1eebd0c06388b9d628364f45b409"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 23, "chunk_start": 1, "chunk_summary": "The prompt defines a T2I quality review system that uses a blind substring replacement contract for suggesting fixes.", "duration_ms": 17720, "findings": [{"category": "blind_string_mutation", "evidence": "target: T2I 프롬프트 원문에서 정확히 찾을 수 있는 문자열 / suggestion: target을 대체할 문자열", "line_end": 23, "line_start": 21, "recommended_fix": "Transition to a structured entity-based update mechanism or use unique markers/IDs to identify the specific segment of the prompt being modified instead of relying on exact substring matches.", "severity": "P1", "why_problematic": "This defines a contract for blind substring replacement on generated prompt text. Downstream code likely uses string.replace() which can cause unintended side effects if the target string appears multiple times or in different contexts within the generated prose."}], "path": "prompts/_base/t2i_review/2.202605081600/entity_system.md", "scan_kind": "prompt", "sha256": "c79668a8ab97b4ebf26f285cf54001935906c4a9888103ec25a773426fc4ece4"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 94, "chunk_start": 1, "chunk_summary": "The prompt defines several semantic review rules that rely on brittle string patterns to detect physical contradictions, reference leakage, and missing demographic information, while also establishing a contract for blind substring replacement in generated T2I prompts.", "duration_ms": 34856, "findings": [{"category": "blind_string_mutation", "evidence": "target/suggestion 형태로 치환 정보를 제공하면 시스템이 자동으로 적용합니다. ... target: T2I 프롬프트 원문에서 정확히 찾을 수 있는 문자열 (sub-string 매치)", "line_end": 92, "line_start": 3, "recommended_fix": "Use a structured edit format (e.g., JSON with specific fields to update) or a more robust diffing mechanism rather than blind substring replacement.", "severity": "P1", "why_problematic": "The prompt establishes a contract for blind substring replacement on generated T2I prompt text. This is brittle as it depends on the LLM producing exact matches for its own previous output or the input prompt, which can fail due to minor variations in punctuation or spacing."}, {"category": "semantic_string_judgment", "evidence": "close_framing_existing_ref ... 검출 패턴 (camera_direction에 close-framing tag 있을 때만 적용) ... \"the existing X\" ... \"the reference X\"", "line_end": 39, "line_start": 31, "recommended_fix": "Pass framing and reference intent as structured metadata rather than inferring it from camera direction strings and prompt prose.", "severity": "P1", "why_problematic": "This rule uses a closed list of framing tags to decide whether to skip reference images and then uses specific phrase patterns to detect 'leakage' in the prompt. This is a brittle semantic classifier that attempts to infer visual reference logic from natural language substrings."}, {"category": "semantic_string_judgment", "evidence": "physical_inconsistency ... unshared_fg_bg_actors ... 검출 패턴 — 모순 조합 ... 카메라 \"low at ground/floor/quay level\" + 묘사 \"<surface> visible behind subject's hands\"", "line_end": 78, "line_start": 49, "recommended_fix": "Use structured spatial metadata or a formal layout schema to validate physical consistency rather than natural language pattern matching.", "severity": "P1", "why_problematic": "These rules attempt to validate physical/spatial consistency and connectivity by matching specific string patterns in the camera direction against specific phrase patterns in the scene description. This is a brittle way to enforce spatial logic and will fail to catch variations or produce false positives."}, {"category": "llm_closed_list_instruction", "evidence": "missing_ethnicity — 보통명사 인물의 국적/인종 누락 ... 보통명사 인물(직원, 경찰, 행인 등)", "line_end": 19, "line_start": 16, "recommended_fix": "Define a formal entity classification system where 'common nouns' requiring demographic attributes are explicitly tagged in the input data.", "severity": "P2", "why_problematic": "The prompt asks the LLM to classify 'common nouns' from an open-world scenario and enforce a specific semantic rule (adding ethnicity) based on a small example list."}], "path": "prompts/_base/t2i_review/2.202604301730/scene_system.md", "scan_kind": "prompt", "sha256": "c9a6b5c28305b18838dfd3e4b3ae6b3d928ea8bb384a8506b2c9aa99e158d8a2"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 101, "chunk_start": 1, "chunk_summary": "The prompt defines a T2I review system that uses the LLM to perform semantic string judgment via specific phrase patterns and then executes blind string mutations on generated T2I prompts using a target/suggestion protocol.", "duration_ms": 17137, "findings": [{"category": "blind_string_mutation", "evidence": "target/suggestion 형태로 치환 정보를 제공하면 시스템이 자동으로 적용합니다. ... target: T2I 프롬프트 원문에서 정확히 찾을 수 있는 문자열 (sub-string 매치)", "line_end": 89, "line_start": 3, "recommended_fix": "Instead of substring replacement, have the LLM return the full corrected prompt or use a structured edit format that operates on semantic blocks rather than raw strings.", "severity": "P1", "why_problematic": "The system uses the LLM to identify exact substrings in generated T2I prompts for automated replacement. This is a blind mutation mechanism that can lead to broken prompts or context loss if the substring is not unique or if the LLM hallucinates the exact text."}, {"category": "semantic_string_judgment", "evidence": "검출 패턴 (camera_direction에 close-framing tag 있을 때만 적용): \"the existing X\", \"the reference X\", \"from the reference image\"", "line_end": 39, "line_start": 34, "recommended_fix": "Use a more robust semantic check that evaluates the intent of the prompt relative to the framing, rather than searching for specific 'reference' keywords.", "severity": "P1", "why_problematic": "The prompt instructs the LLM to use a closed list of natural language phrase patterns to classify whether a prompt incorrectly assumes a reference image exists. This is brittle semantic judgment over open-world prose."}, {"category": "semantic_string_judgment", "evidence": "검출 패턴 — 모순 조합: 카메라 \"low at ground/floor/quay level\" + 묘사 \"<surface> visible behind subject's hands\"", "line_end": 55, "line_start": 52, "recommended_fix": "Define spatial constraints in a structured format (e.g., camera height vs. object height) and have the LLM validate against those constraints rather than matching specific phrases.", "severity": "P1", "why_problematic": "This defines physical/spatial consistency rules based on specific phrase combinations. It forces the LLM to act as a regex-like classifier for complex visual logic, which is prone to missing variations in natural language."}, {"category": "semantic_string_judgment", "evidence": "보통명사 인물(직원, 경찰, 행인 등)에 국적/인종이 빠진 경우. target: 인종 형용사가 누락된 보통명사 (예: \"a man in a security uniform\")", "line_end": 19, "line_start": 16, "recommended_fix": "Ensure all entities in the scene are typed in the input schema so the LLM can distinguish between registered characters and background actors without relying on noun-pattern heuristics.", "severity": "P1", "why_problematic": "The LLM is instructed to identify 'common nouns' and check for missing demographic descriptors. This is a semantic classifier that relies on the LLM's interpretation of what constitutes a 'common noun' versus a 'registered character'."}], "path": "prompts/_base/t2i_review/2.202605081600/scene_system.md", "scan_kind": "prompt", "sha256": "fc75a0c93cea005c8c05ac5e668c5021624adc1615537900a46b594ff4bfd59b"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 53, "chunk_start": 1, "chunk_summary": "The schema defines a contract for blind substring replacement of T2I prompts and includes a closed list of semantic issue types.", "duration_ms": 12582, "findings": [{"category": "blind_string_mutation", "evidence": "\"target\": {\"type\": \"string\", \"description\": \"T2I 원문에서 정확히 찾을 수 있는 치환 대상 (unique sub-string)\"}, \"suggestion\": {\"type\": \"string\", \"description\": \"target을 대체할 문자열\"}", "line_end": 39, "line_start": 38, "recommended_fix": "Replace the substring replacement logic with a structured update mechanism or have the LLM return the full corrected version of the specific prompt field.", "severity": "P1", "why_problematic": "The schema establishes a formal contract for blind substring replacement of generated T2I prompt text. This is brittle because it relies on the LLM correctly identifying a 'unique sub-string' in natural language prose, which can lead to unintended mutations or failed matches if the prompt text is slightly different or contains duplicate phrases."}], "path": "prompts/_base/t2i_review/3.202605121200/scene_schema.json", "scan_kind": "prompt", "sha256": "e772190324d90ec45265b2eff9a613eeb44aabde279e42fef8ede2bd505481be"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 32, "chunk_start": 1, "chunk_summary": "The schema defines a contract for blind substring replacement in generated T2I prompts, which is a brittle semantic mutation pattern.", "duration_ms": 20478, "findings": [{"category": "blind_string_mutation", "evidence": "target (T2I 원문에서 정확히 찾을 수 있는 치환 대상), suggestion (target을 대체할 문자열)", "line_end": 18, "line_start": 17, "recommended_fix": "Transition to a structured prompt representation where specific attributes (like ethnicity or proper nouns) are modified as data fields rather than through substring replacement on the final prose.", "severity": "P1", "why_problematic": "The schema instructs the LLM to provide an exact substring ('target') from the generated T2I prompt for replacement by a 'suggestion'. This establishes a contract for blind string mutation on natural language prose, which is prone to errors if the substring appears multiple times or if the LLM fails to provide an exact match."}], "path": "prompts/_base/t2i_review/3.202605121200/entity_schema.json", "scan_kind": "prompt", "sha256": "70626235b41084ce75cadea8f5fd5a67081c1eebd0c06388b9d628364f45b409"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 32, "chunk_start": 1, "chunk_summary": "The schema defines a contract for blind string mutation of generated T2I prompts using exact substring matching.", "duration_ms": 8672, "findings": [{"category": "blind_string_mutation", "evidence": "target: T2I 원문에서 정확히 찾을 수 있는 치환 대상, suggestion: target을 대체할 문자열", "line_end": 18, "line_start": 17, "recommended_fix": "Shift from raw substring replacement to a structured prompt assembly where specific attributes (like ethnicity or proper nouns) are tracked as metadata or separate fields, allowing for targeted updates without string searching.", "severity": "P1", "why_problematic": "The schema instructs the LLM to provide exact substrings for replacement in generated T2I prompts. This is a brittle 'blind' mutation pattern that can lead to incorrect replacements if the target string appears multiple times or in unintended contexts within the natural language prompt."}], "path": "prompts/_base/t2i_review/4.202605150957/entity_schema.json", "scan_kind": "prompt", "sha256": "70626235b41084ce75cadea8f5fd5a67081c1eebd0c06388b9d628364f45b409"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 53, "chunk_start": 1, "chunk_summary": "The schema defines a contract for blind substring replacement in generated T2I prompts, which is a high-risk semantic mutation pattern.", "duration_ms": 12286, "findings": [{"category": "blind_string_mutation", "evidence": "target: \"T2I 원문에서 정확히 찾을 수 있는 치환 대상 (unique sub-string)\", suggestion: \"target을 대체할 문자열\"", "line_end": 39, "line_start": 38, "recommended_fix": "Replace blind substring replacement with a structured prompt update mechanism or a more robust diff/patch format that operates on semantic tokens or specific prompt fields.", "severity": "P1", "why_problematic": "The schema establishes a protocol for blind substring replacement of generated T2I prompt text. This is brittle and can lead to semantic corruption or unintended mutations if the target string appears in multiple contexts or if the replacement disrupts the surrounding natural language structure."}], "path": "prompts/_base/t2i_review/4.202605150957/scene_schema.json", "scan_kind": "prompt", "sha256": "e772190324d90ec45265b2eff9a613eeb44aabde279e42fef8ede2bd505481be"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 23, "chunk_start": 1, "chunk_summary": "The prompt defines a quality review system for T2I prompts that uses a blind substring replacement mechanism (target/suggestion) to fix detected semantic issues.", "duration_ms": 13726, "findings": [{"category": "blind_string_mutation", "evidence": "target: T2I 프롬프트 원문에서 정확히 찾을 수 있는 문자열 / suggestion: target을 대체할 문자열", "line_end": 23, "line_start": 21, "recommended_fix": "Shift from substring replacement to a structured prompt reconstruction or use unique markers/IDs for segments that require modification.", "severity": "P1", "why_problematic": "This defines a contract for blind substring replacement of generated T2I prompt text. Relying on exact substring matches for semantic fixes in natural language is brittle and can lead to incorrect mutations if the target string appears in multiple contexts or as part of other words."}], "path": "prompts/_base/t2i_review/4.202605150957/entity_system.md", "scan_kind": "prompt", "sha256": "c79668a8ab97b4ebf26f285cf54001935906c4a9888103ec25a773426fc4ece4"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 101, "chunk_start": 1, "chunk_summary": "The prompt defines a T2I review system that uses blind substring mutation for prompt fixes and relies on closed phrase lists and natural-language framing tags to classify semantic issues and route pipeline behavior.", "duration_ms": 21541, "findings": [{"category": "blind_string_mutation", "evidence": "target/suggestion 형태로 치환 정보를 제공하면 시스템이 자동으로 적용합니다 ... target: T2I 프롬프트 원문에서 정확히 찾을 수 있는 문자열 (sub-string 매치)", "line_end": 92, "line_start": 3, "recommended_fix": "Transition to a structured edit model where the LLM rewrites specific prompt blocks or the entire prompt, rather than providing raw substrings for blind replacement.", "severity": "P1", "why_problematic": "The system uses raw substring replacement to apply LLM-suggested fixes to generated T2I prompts. This is brittle and prone to collisions or partial replacements in natural-language prose."}, {"category": "semantic_string_judgment", "evidence": "camera_direction에 close-framing tag (`ECU`, `XCU`, `extreme close-up`, `MCU`, `medium close-up`, `close-up`, `CU`)가 하나라도 포함된 경우, 합성 단계는 chain_bg reference image를 자동 skip합니다", "line_end": 32, "line_start": 31, "recommended_fix": "Use a structured framing enum in the shot schema and have the pipeline check the enum value instead of parsing natural-language strings.", "severity": "P1", "why_problematic": "Pipeline routing (skipping background references) is decided by searching for specific framing keywords within a natural-language camera direction field. This makes a critical visual behavior dependent on brittle string matching."}, {"category": "llm_closed_list_instruction", "evidence": "\"the existing X\", \"the reference X\", \"from the reference image\", \"preserving the same X perspective\"", "line_end": 39, "line_start": 34, "recommended_fix": "Instruct the LLM to identify the semantic intent of reference dependency rather than matching specific substrings.", "severity": "P1", "why_problematic": "The prompt instructs the LLM to classify whether a prompt incorrectly assumes a reference based on a closed list of specific phrase patterns. This is a brittle semantic classifier for open-world visual descriptions."}, {"category": "llm_closed_list_instruction", "evidence": "카메라 \"low at ground/floor/quay level\" + 묘사 \"<surface> visible behind subject's hands\"", "line_end": 56, "line_start": 52, "recommended_fix": "Use high-level spatial reasoning instructions or a dedicated spatial validator rather than phrase-based contradiction rules.", "severity": "P1", "why_problematic": "It uses specific string patterns to detect complex spatial and physical inconsistencies. This approach is brittle for validating open-world camera and staging logic."}, {"category": "llm_closed_list_instruction", "evidence": "보통명사 인물(직원, 경찰, 행인 등)에 국적/인종이 빠진 경우", "line_end": 19, "line_start": 16, "recommended_fix": "Generalize the rule to all non-registered human entities without relying on a specific list of example nouns.", "severity": "P2", "why_problematic": "The prompt uses a small list of example occupations as a trigger for a semantic requirement (ethnicity). This functions as a closed-list classifier for open-world character types."}], "path": "prompts/_base/t2i_review/3.202605121200/scene_system.md", "scan_kind": "prompt", "sha256": "2dd803f08f25f9eaf706987a34cbf0882152270a51a711909f911e3a7fd5910f"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 101, "chunk_start": 1, "chunk_summary": "The prompt defines a T2I review system that uses closed-list framing tags and natural-language patterns to detect semantic errors, which are then corrected via a blind substring mutation protocol.", "duration_ms": 16866, "findings": [{"category": "semantic_string_judgment", "evidence": "close-framing tag (`ECU`, `XCU`, `extreme close-up`, `MCU`, `medium close-up`, `close-up`, `CU`)", "line_end": 32, "line_start": 31, "recommended_fix": "Use a structured framing enum in the shot metadata that explicitly carries a 'skip_reference' boolean or similar flag rather than inferring it from string tags.", "severity": "P1", "why_problematic": "These specific string tags in the camera direction are used as a semantic classifier to trigger logic that skips reference images and activates specific prompt cleanup rules."}, {"category": "semantic_string_judgment", "evidence": "the existing X, the reference X, from the reference image, use the X from the reference", "line_end": 39, "line_start": 34, "recommended_fix": "Instead of post-hoc regex-like detection in the reviewer, ensure the T2I generator prompt explicitly forbids these phrases when the reference-skip flag is set.", "severity": "P1", "why_problematic": "The prompt instructs the LLM to identify 'reference leakage' by matching these specific natural-language phrase patterns in generated T2I prompts."}, {"category": "blind_string_mutation", "evidence": "target/suggestion 형태로 치환 정보를 제공하면 시스템이 자동으로 적용합니다 ... target: T2I 프롬프트 원문에서 정확히 찾을 수 있는 문자열", "line_end": 89, "line_start": 3, "recommended_fix": "Move from substring replacement to a structured rewrite where the LLM provides the full corrected prompt or uses a template-based approach with stable identifiers.", "severity": "P1", "why_problematic": "This establishes a contract for blind substring replacement of generated natural-language prompt prose. If the LLM selects a non-unique or slightly different substring, the mutation will fail or corrupt the prompt."}, {"category": "semantic_string_judgment", "evidence": "low at ground/floor/quay level + <surface> visible behind subject's hands", "line_end": 55, "line_start": 52, "recommended_fix": "Define spatial constraints (e.g., camera_height vs. visible_range) in the schema so that inconsistencies can be detected via coordinate/range logic rather than phrase matching.", "severity": "P1", "why_problematic": "The reviewer is instructed to detect physical inconsistencies by matching specific camera height phrases against visual description patterns, which is a brittle way to enforce spatial logic."}], "path": "prompts/_base/t2i_review/4.202605150957/scene_system.md", "scan_kind": "prompt", "sha256": "04722eef9c00a2548c604fff074d849a8b04cfd358ed8dd74d1ff385df58789e"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 19, "chunk_start": 1, "chunk_summary": "No actionable findings; the prompt defines standard document cleanup rules for screenplay formatting artifacts without scenario-specific pollution or semantic classifiers.", "duration_ms": 5251, "findings": [], "path": "prompts/_base/text_cleanup/1.202603231200/system.md", "scan_kind": "prompt", "sha256": "1f0e6a5f8a2b730e03543b26f06b0115d2d33a901754bd22a90a556e69aed4a5"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 6, "chunk_start": 1, "chunk_summary": "No actionable findings; the file is a generic prompt template using standard placeholders for scene metadata.", "duration_ms": 2814, "findings": [], "path": "prompts/_base/variation_recommender/v1/user.md", "scan_kind": "prompt", "sha256": "26ea9daa3ec839d9e40cddc474d9064b683c569ca0022b371336e5a0062268ba"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 30, "chunk_start": 1, "chunk_summary": "The prompt defines rules for T2I conversion but includes scenario-specific examples that may bias the model towards a specific sci-fi aesthetic.", "duration_ms": 22586, "findings": [{"category": "scenario_dependent_prompt", "evidence": "\"Soul Ride vehicle\", \"Dr. Nex's laboratory\", \"Club House\"", "line_end": 8, "line_start": 6, "recommended_fix": "Replace project-specific examples with generic, genre-neutral ones (e.g., 'The Hero's Sword' or 'The Secret Base') to illustrate the rule of replacing proper nouns with visual descriptions without biasing the aesthetic.", "severity": "P2", "why_problematic": "These examples contain concrete names and visual descriptions (futuristic, neon, underground) from a specific story world (TheRoad), which can bias the LLM's output style for unrelated scenarios even when used as negative examples."}], "path": "prompts/_base/t2i_visual_converter/v1/system.md", "scan_kind": "prompt", "sha256": "22e04b568a05dded27946c131181ffdbeaf9a219f0ec8841b81ab5e6e3ce4107"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 23, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 10809, "findings": [], "path": "prompts/_base/variation_recommender/v1/system.md", "scan_kind": "prompt", "sha256": "fca58f81e9c38c42201663b5f78b7e10aba0c78b8fc518ea6788c29f9ed4254f"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 88, "chunk_start": 1, "chunk_summary": "The prompt contains a closed-list semantic classifier for shot types and scenario-specific pollution in examples (sci-fi props and specific ethnicities).", "duration_ms": 25772, "findings": [{"category": "llm_closed_list_instruction", "evidence": "Three shot types only: 1. Establishing shot... 2. Relationship shot... 3. Action moment shot", "line_end": 18, "line_start": 15, "recommended_fix": "Change the instruction to suggest these as common examples rather than an exhaustive 'only' list, or expand the list to cover standard cinematic shot types.", "severity": "P2", "why_problematic": "This instruction forces the LLM to classify open-world visual meaning into a closed set of three semantic categories, which restricts the descriptive range for arbitrary scenes and functions as a semantic classifier."}, {"category": "scenario_dependent_prompt", "evidence": "Korean security officer, glowing human pods, mechanical devices on their necks", "line_end": 87, "line_start": 47, "recommended_fix": "Replace scenario-specific examples with generic placeholders or diverse, neutral examples (e.g., 'a person in uniform', 'a distinctive accessory', 'a modern office').", "severity": "P2", "why_problematic": "The base prompt contains concrete scenario-specific details (ethnicity, specific sci-fi props) that can bias the LLM's generation towards a specific story or genre even when the input screenplay differs."}], "path": "prompts/_base/t2i_visual_converter/v2/system.md", "scan_kind": "prompt", "sha256": "de33e55bab9b51c2a8589cea6b0a0c4b69f6949d5900e1ab1dd602b69007e788"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 67, "chunk_start": 1, "chunk_summary": "The prompt defines a T2I conversion strategy using entity markers for downstream replacement and provides concrete scenario examples that may bias generation.", "duration_ms": 24313, "findings": [{"category": "blind_string_mutation", "evidence": "이 마커는 나중에 실제 참조 이미지로 치환됩니다 ... [엔티티명] 마커를 반드시 포함하세요", "line_end": 67, "line_start": 17, "recommended_fix": "Pass entities as a structured list and have the LLM refer to them by index or ID in a separate field, rather than performing substring replacement on the final prompt prose.", "severity": "P1", "why_problematic": "The prompt establishes a contract where the LLM must embed specific entity names in brackets within natural language prose for later string replacement. This is blind semantic mutation that relies on the LLM's ability to maintain exact string matches within generated sentences, which is brittle and prone to grammatical or hallucination errors."}, {"category": "scenario_dependent_prompt", "evidence": "청록색 발광 ... 지하 극저온 저장 시설 ... [경비원]이 발광 장치들이 늘어선 어두운 시설 복도", "line_end": 49, "line_start": 19, "recommended_fix": "Replace concrete scenario examples with abstract placeholders (e.g., [Character A], [Location B]) or a wider variety of genre-neutral examples.", "severity": "P2", "why_problematic": "The prompt uses concrete sci-fi and industrial scenario examples (cryogenic facility, security guard, cyan glow) to illustrate formatting rules. These specific details can bias the model's output toward these tropes even when the input scenario is from a different genre or setting."}], "path": "prompts/_base/t2i_visual_converter/v3/system.md", "scan_kind": "prompt", "sha256": "ef3ffa834b6c9af453aea1efa068bd68622a45ec743ff156c0ebed61d2e106ee"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 28, "chunk_start": 1, "chunk_summary": "The schema defines the structure for visual world rules, but contains a concrete scenario-specific example in a field description.", "duration_ms": 9749, "findings": [{"category": "scenario_dependent_prompt", "evidence": "예: A가 B의 몸을 소울라이드 중이면 A는 물리적 존재가 아님", "line_end": 20, "line_start": 20, "recommended_fix": "Replace the specific 'soul-ride' example with a generic placeholder or a more universal concept, such as 'If a character is a hologram or a ghost, they are not a physical entity'.", "severity": "P2", "why_problematic": "The schema description for 'director_notes' contains a concrete, project-specific scenario example ('soul-ride' / 소울라이드). This functions as scenario pollution within a base schema definition and may bias the LLM's reasoning about physical presence in unrelated stories."}], "path": "prompts/_base/visual_world_rules/2.202603231200/rules_schema.json", "scan_kind": "prompt", "sha256": "46c17d2b62805067b29d8a682a27ff4899ea59712200b705bd466a0238654743"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 22, "chunk_start": 1, "chunk_summary": "The schema defines a world-rule structure where semantic categories are provided as prose examples in a string field rather than an enforced enum.", "duration_ms": 19471, "findings": [{"category": "schema_or_enum_drift", "evidence": "\"rule_type\": {\"type\": \"string\", \"description\": \"규칙 유형 (possession, transformation, ghost, time_period, costume, technology 등)\"}", "line_end": 9, "line_start": 9, "recommended_fix": "Define 'rule_type' as a JSON enum containing the canonical category strings to ensure structured validation and consistent downstream routing.", "severity": "P2", "why_problematic": "The schema specifies a set of semantic categories (possession, transformation, ghost, etc.) within a description string instead of using a formal JSON enum. This creates a contract for LLM classification that is not structurally enforced, leading to potential drift where the LLM produces synonyms or variations that downstream logic (expecting exact keys) cannot handle."}], "path": "prompts/_base/visual_world_rules/1.202603231200/rules_schema.json", "scan_kind": "prompt", "sha256": "f4e01be690df111c3eb600bf1433632e03937c4eefcf262fb4b2a7f882f93c1b"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 32, "chunk_start": 1, "chunk_summary": "The prompt defines a structured extraction process for visual world rules, using a closed list of semantic categories and providing culturally specific examples.", "duration_ms": 23756, "findings": [{"category": "llm_closed_list_instruction", "evidence": "rule_type은 다음 중 선택: possession, transformation, ghost, projection, superpower, body_deformation, time_period, costume, technology, other", "line_end": 28, "line_start": 28, "recommended_fix": "Define these categories in a shared schema and use the schema to validate LLM output. Ensure the pipeline handles 'other' or unknown types gracefully without failing.", "severity": "P2", "why_problematic": "The prompt forces open-world visual phenomena into a closed set of 10 semantic categories. This functions as a classifier that likely drives downstream logic (e.g., character ID swapping for 'possession'), creating a brittle link between natural language analysis and system behavior."}, {"category": "scenario_dependent_prompt", "evidence": "조선시대, 한복", "line_end": 22, "line_start": 16, "recommended_fix": "Replace culture-specific examples with more generic ones (e.g., 'Historical Era', 'Traditional Clothing') or move them to a scenario-specific configuration layer.", "severity": "P2", "why_problematic": "The prompt includes culture-specific examples (Joseon Dynasty, Hanbok) in a base rule extractor. These can bias the LLM toward Korean historical contexts even when analyzing scenarios from other cultures or eras."}], "path": "prompts/_base/visual_world_rules/1.202603231200/system.md", "scan_kind": "prompt", "sha256": "90dbd8a806ab24a0a4b7502a9f266d591305b8048c83c7eee00719f7167681aa"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 56, "chunk_start": 1, "chunk_summary": "The prompt defines a closed list of semantic categories for classifying open-world visual phenomena and includes a scenario-specific nationality bias in its instructions.", "duration_ms": 19404, "findings": [{"category": "llm_closed_list_instruction", "evidence": "rule_type은 다음 중 선택: possession, transformation, ghost, projection, superpower, body_deformation, time_period, costume, technology, other", "line_end": 28, "line_start": 28, "recommended_fix": "Allow the LLM to generate descriptive category names or move the enum definition to a shared schema that is dynamically injected based on the project type.", "severity": "P2", "why_problematic": "The LLM is instructed to classify open-world supernatural and technical phenomena into a closed set of semantic tokens. This creates a brittle interface where novel scenario types must be forced into existing categories or labeled as 'other', losing semantic precision."}, {"category": "scenario_dependent_prompt", "evidence": "인물의 기본 국적/인종 (예: \"All human characters are Korean unless stated otherwise.\")", "line_end": 52, "line_start": 52, "recommended_fix": "Replace the concrete example with a generic placeholder such as 'All human characters are [Nationality] unless stated otherwise.'", "severity": "P2", "why_problematic": "Hardcoding 'Korean' as the specific example for nationality in a base prompt can bias the LLM toward that nationality even when the scenario context differs, especially as it is part of a 'must include' instruction block."}], "path": "prompts/_base/visual_world_rules/2.202603231200/system.md", "scan_kind": "prompt", "sha256": "34f4794d17c562eaff205c234b292577955e5b36d355cceec322455d6b04f63e"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 28, "chunk_start": 1, "chunk_summary": "The schema defines visual world rules but contains scenario-specific examples in descriptions and unenforced semantic categories.", "duration_ms": 18114, "findings": [{"category": "scenario_dependent_prompt", "evidence": "A가 B의 몸을 소울라이드 중이면 A는 물리적 존재가 아님", "line_end": 20, "line_start": 20, "recommended_fix": "Replace the specific 'soul-ride' example with a generic physical state example, such as 'Character A is a hologram' or 'Character A is a reflection'.", "severity": "P2", "why_problematic": "The description contains a concrete story-specific concept ('soul-ride') as an example, which biases the model's logic for physical presence toward specific supernatural scenarios."}, {"category": "schema_or_enum_drift", "evidence": "possession, transformation, ghost, time_period, costume, technology", "line_end": 9, "line_start": 9, "recommended_fix": "Move these categories into a formal 'enum' field in the JSON schema to ensure valid and consistent output.", "severity": "P2", "why_problematic": "Semantic categories are listed in the description as examples rather than being enforced via a JSON 'enum' property, creating a brittle string-based contract for downstream logic."}], "path": "prompts/_base/visual_world_rules/3.202604161200/rules_schema.json", "scan_kind": "prompt", "sha256": "830f0847e0a6eb24d60fc073694e60db73610a983bae401101e2b3a2a4fee69f"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 67, "chunk_start": 1, "chunk_summary": "The prompt defines a T2I conversion process using a bracketed marker system for entity references and provides specific sci-fi examples that may bias generation.", "duration_ms": 42845, "findings": [{"category": "blind_string_mutation", "evidence": "제공된 엔티티 이름을 그대로 [] 안에 사용, [엔티티명] 마커를 반드시 포함하세요", "line_end": 67, "line_start": 16, "recommended_fix": "Use unique, language-agnostic IDs (e.g., [ENT_0], [ENT_1]) for markers and provide a separate mapping, or use a structured JSON output where entities and descriptions are separated.", "severity": "P1", "why_problematic": "The prompt establishes a contract for exact substring replacement of natural-language entity names within brackets. This is brittle because LLMs may alter the name, and in Korean, markers are often followed by grammatical particles (e.g., [경비원]이), which will remain after replacement (e.g., URL이), potentially corrupting the final T2I prompt."}, {"category": "scenario_dependent_prompt", "evidence": "지하 극저온 저장 시설, 투명 원통형 캡슐, 산업용 파이프, 발광 장치들이 늘어선 어두운 시설 복도", "line_end": 49, "line_start": 46, "recommended_fix": "Replace specific sci-fi examples with a broader set of generic examples across different genres (e.g., a park, a historical room, a modern street) to demonstrate the structural rules without biasing the content.", "severity": "P2", "why_problematic": "The examples use highly specific sci-fi/industrial scenario details. These concrete props and settings can bias the LLM's generation towards these tropes even when the input scenario is in a different genre or era."}], "path": "prompts/_base/t2i_visual_converter/v4/system.md", "scan_kind": "prompt", "sha256": "cfa07e3aa9b0fa723d4c1a5485c2716600c1227bbc446ad1f63a9a5423ff9a9c"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 63, "chunk_start": 1, "chunk_summary": "The prompt defines a closed-list semantic classifier for visual rules and includes a hardcoded ethnicity bias in the T2I context instructions.", "duration_ms": 28714, "findings": [{"category": "schema_or_enum_drift", "evidence": "rule_type은 다음 중 선택: possession, transformation, ghost, projection, superpower, body_deformation, time_period, costume, technology, other", "line_end": 28, "line_start": 28, "recommended_fix": "Define these categories in a shared schema (e.g., JSON Schema or a central Enum) and reference them in the prompt, or allow the LLM to generate descriptive tags instead of a closed list.", "severity": "P2", "why_problematic": "The prompt defines a closed list of semantic categories for the LLM to classify open-world scenario phenomena. This creates a contract that must be manually synchronized with downstream code and limits the LLM's ability to describe novel visual phenomena not covered by these 10 buckets."}, {"category": "scenario_dependent_prompt", "evidence": "All human characters are Korean unless stated otherwise.", "line_end": 52, "line_start": 52, "recommended_fix": "Move project-specific defaults like ethnicity or nationality to a configuration variable or a project-specific prompt layer rather than the base system prompt.", "severity": "P2", "why_problematic": "This hardcodes a specific ethnicity bias into a base prompt, which may not apply to all scenarios and can lead to incorrect visual generation for non-Korean contexts without explicit overrides."}], "path": "prompts/_base/visual_world_rules/3.202604161200/system.md", "scan_kind": "prompt", "sha256": "c88c8c3f17189939a56bec5ae58079d422534c132a079f8131ce736aaaf18717"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 29, "chunk_start": 1, "chunk_summary": "The schema contains project-specific scenario pollution in descriptions and unenforced semantic categories that should be enums.", "duration_ms": 18010, "findings": [{"category": "schema_or_enum_drift", "evidence": "rule_type\": {\"type\": \"string\", \"description\": \"규칙 유형 (possession, transformation, ghost, time_period, costume, technology 등)\"}", "line_end": 9, "line_start": 9, "recommended_fix": "Define 'rule_type' as an enum with the allowed values.", "severity": "P2", "why_problematic": "The description defines a set of semantic categories (possession, ghost, etc.) that likely drive downstream logic, but they are not enforced as a JSON enum, creating a risk of drift and invalid values."}, {"category": "scenario_dependent_prompt", "evidence": "예: A가 B의 몸을 소울라이드 중이면 A는 물리적 존재가 아님", "line_end": 20, "line_start": 20, "recommended_fix": "Use a generic example for non-physical presence, such as 'A is a ghost' or 'A is a reflection'.", "severity": "P2", "why_problematic": "The example uses 'soulride' (소울라이드), which is a specific plot concept from a particular story, polluting the base schema with scenario-specific logic."}], "path": "prompts/_base/visual_world_rules/5.202605011300/rules_schema.json", "scan_kind": "prompt", "sha256": "04aea29a6e849b637517dd37837136f5727a19898bb0e6b34c63640af9fb6879"}
{"candidate_reason": "python scope discovery", "chunk_end": 1, "chunk_start": 1, "chunk_summary": "No actionable findings; the file contains only a package docstring.", "duration_ms": 2044, "findings": [], "path": "prototype_ui/__init__.py", "scan_kind": "python", "sha256": "493fac3de22464f34f55a9b71a5c97cdf64c4cfde52ee5a5a776066ea7dd84b6"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 29, "chunk_start": 1, "chunk_summary": "The schema defines semantic rule types and director notes using descriptive strings rather than enums, and includes a scenario-specific example in a description.", "duration_ms": 27574, "findings": [{"category": "schema_or_enum_drift", "evidence": "rule_type: (possession, transformation, ghost, time_period, costume, technology 등)", "line_end": 9, "line_start": 9, "recommended_fix": "Define 'rule_type' as an enum containing the supported semantic categories to ensure strict validation and reliable downstream routing.", "severity": "P2", "why_problematic": "Semantic categories are listed in the description but not enforced as a JSON enum. Downstream logic likely relies on these exact strings to handle specific visual rules (e.g., ghost transparency or possession effects), creating a brittle contract between the LLM and the pipeline."}, {"category": "scenario_dependent_prompt", "evidence": "예: A가 B의 몸을 소울라이드 중이면 A는 물리적 존재가 아님", "line_end": 20, "line_start": 20, "recommended_fix": "Replace the specific 'soul-ride' example with a generic one, such as 'Character A is a hologram or a reflection'.", "severity": "P2", "why_problematic": "The example uses a specific story mechanic ('soul-ride') to explain a general concept of physical presence. This introduces scenario-specific pollution into a base schema that could bias the LLM's reasoning in unrelated genres or stories."}], "path": "prompts/_base/visual_world_rules/4.202604300936/rules_schema.json", "scan_kind": "prompt", "sha256": "04aea29a6e849b637517dd37837136f5727a19898bb0e6b34c63640af9fb6879"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 110, "chunk_start": 1, "chunk_summary": "The prompt defines a closed set of semantic categories (rule_type) and visibility rules (director_notes) to classify open-world scenario events, and contains a concrete ethnicity bias in the t2i_context instructions.", "duration_ms": 18094, "findings": [{"category": "llm_closed_list_instruction", "evidence": "rule_type: possession, transformation, ghost, projection, superpower, body_deformation", "line_end": 51, "line_start": 31, "recommended_fix": "Allow the LLM to describe visual requirements naturally or use a more flexible metadata structure that doesn't rely on a fixed semantic enum for visual routing.", "severity": "P1", "why_problematic": "The prompt forces the LLM to classify complex open-world scenario concepts into a closed list of semantic categories, each tied to hard-coded visual behaviors (e.g., always drawing the host's face for possession)."}, {"category": "semantic_string_judgment", "evidence": "환각/현시 대상은 다른 인물이 등장하는 씬에서는 화면에서 제거한다", "line_end": 72, "line_start": 68, "recommended_fix": "Replace natural-language visibility rules with structured entity-state flags (e.g., visibility: 'subjective_only') that can be processed by the pipeline without semantic interpretation.", "severity": "P1", "why_problematic": "These instructions ask the LLM to generate semantic rules that determine entity visibility and membership based on scenario context (e.g., hallucinations). This creates a natural-language contract for visual routing that is brittle and difficult to validate."}, {"category": "scenario_dependent_prompt", "evidence": "All human characters are Korean unless stated otherwise.", "line_end": 98, "line_start": 98, "recommended_fix": "Replace the concrete ethnicity with a placeholder like <default_ethnicity> or move this requirement to a scenario-specific configuration file.", "severity": "P2", "why_problematic": "This is a concrete scenario-specific bias (ethnicity/nationality) hard-coded into a base prompt, which may bias generation for non-Korean scenarios."}], "path": "prompts/_base/visual_world_rules/5.202605011300/system.md", "scan_kind": "prompt", "sha256": "5cfa36cdcea957d38284f66d947acad20b279b890f4757fabb1728f293c1abd3"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 31, "chunk_start": 1, "chunk_summary": "The prompt defines a three-system architecture (angle, composition, color) but contains significant inconsistencies in its classification logic and example sets, particularly regarding the boundary between camera position and framing.", "duration_ms": 47109, "findings": [{"category": "schema_or_enum_drift", "evidence": "Variation types: angle (camera position change), color (lighting/color grading), angle+color (both), or none (no variation needed).", "line_end": 6, "line_start": 6, "recommended_fix": "Update the variation types list to include 'composition' and all valid combinations (e.g., angle+composition, composition+color, etc.) to match the system architecture.", "severity": "P2", "why_problematic": "The list of allowed variation types omits 'composition', which is defined as one of the three primary systems in lines 21-26. This creates a drift between the top-level classification enum and the actual output fields available to the LLM, potentially leading to routing errors or missing recommendations."}, {"category": "llm_closed_list_instruction", "evidence": "Examples: \"tight close-up on face\", \"wide establishing shot\", \"over-shoulder framing\", \"low angle hero shot\"", "line_end": 23, "line_start": 23, "recommended_fix": "Refine the composition examples to exclude camera position and zoom properties. Use terms strictly related to framing and lens character that are not covered by the 3D angle parameters.", "severity": "P1", "why_problematic": "The examples for 'composition' contain terms that belong to the 'angle' system as defined in lines 14-19. Specifically, 'low angle' is a vertical tilt (line 16) and 'wide' is a zoom/focal length property (line 17). Including these in the composition text field contradicts the 'CRITICAL' separation rule (line 10, 22) and instructs the LLM to bypass the dedicated 3D angle system by putting spatial data into the i2i text prompt."}], "path": "prompts/_base/variation_recommender/v2/system.md", "scan_kind": "prompt", "sha256": "98946fbc57be41829e28f7666a113f8ebbbfc29537285cdc3b3544928afd8b4c"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 29, "chunk_start": 1, "chunk_summary": "The schema defines world rules and director notes with specific semantic categories and scenario-based examples that should be formalized or generalized.", "duration_ms": 19235, "findings": [{"category": "schema_or_enum_drift", "evidence": "rule_type: possession, transformation, ghost, time_period, costume, technology 등", "line_end": 9, "line_start": 9, "recommended_fix": "Change rule_type to an enum containing these categories to ensure structured classification and validation.", "severity": "P2", "why_problematic": "The rule_type field uses a string type but lists specific semantic categories in the description. This creates a contract where the LLM is expected to classify rules into a closed set of types without schema enforcement, leading to potential drift or parsing errors in downstream logic."}, {"category": "scenario_dependent_prompt", "evidence": "예: A의 영혼이 B의 몸에 전이된 경우 A는 물리적 존재가 아님", "line_end": 20, "line_start": 20, "recommended_fix": "Replace the specific soul-transfer example with a more abstract or generic logic example, such as 'if an entity is a hologram or a memory'.", "severity": "P2", "why_problematic": "The example provided for director_notes uses a highly specific supernatural scenario (soul transfer). While intended as an example, concrete scenario pollution in schema descriptions can bias the LLM's interpretation of physical presence rules toward specific tropes."}], "path": "prompts/_base/visual_world_rules/6.202605021400/rules_schema.json", "scan_kind": "prompt", "sha256": "c2d9af79cac5595c1a405bf3805e945791b8dbc25cecd56cb85e222e6a328849"}
{"candidate_reason": "python scope discovery", "chunk_end": 86, "chunk_start": 1, "chunk_summary": "No actionable findings; this is a technical utility script for managing prompt versioning and manifest updates.", "duration_ms": 4263, "findings": [], "path": "screenplay/prompts/create_version.py", "scan_kind": "python", "sha256": "aa9225404363cda2695e54cf40f61b0f294a5a61cd8ec3e268b56e8bc54044bf"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 75, "chunk_start": 1, "chunk_summary": "The prompt defines a closed list of semantic categories for visual rules and instructs the LLM to generate scenario-specific physical presence criteria using proper nouns and cultural examples.", "duration_ms": 30684, "findings": [{"category": "llm_closed_list_instruction", "evidence": "rule_type은 다음 중 선택: possession, transformation, ghost, projection, superpower, body_deformation, time_period, costume, technology, other", "line_end": 28, "line_start": 28, "recommended_fix": "Allow the LLM to provide a descriptive tag or use a more extensible schema that does not rely on a hardcoded list of semantic buckets.", "severity": "P2", "why_problematic": "This forces the LLM to map arbitrary visual phenomena from a scenario into a fixed set of semantic categories. This classification is likely used for downstream routing or visual policy enforcement, but the closed list cannot capture the full range of open-world visual concepts (e.g., glitch effects, abstract entities)."}, {"category": "scenario_dependent_prompt", "evidence": "작품 고유명사를 사용하되, 범용 규칙이 아닌 이 작품에서만 필요한 판단 기준을 작성하세요.", "line_end": 46, "line_start": 45, "recommended_fix": "Instruct the LLM to generate abstract physical presence rules based on entity roles or states rather than specific names, or move the logic to a centralized, scenario-agnostic validator.", "severity": "P2", "why_problematic": "The prompt explicitly instructs the LLM to generate judgment criteria for physical presence that include scenario-specific proper nouns. This creates a brittle logic block that is tightly coupled to a specific story, making it difficult to audit or generalize across different episodes or series."}, {"category": "scenario_dependent_prompt", "evidence": "All human characters are Korean unless stated otherwise.", "line_end": 64, "line_start": 64, "recommended_fix": "Use a more abstract placeholder like '[Nationality/Race]' or provide multiple diverse examples to avoid biasing the model toward a single cultural trope.", "severity": "P2", "why_problematic": "This is a concrete cultural/ethnic bias provided as a primary example for the visual style summary. Providing such a specific example can bias the LLM to enforce this nationality even when the scenario text is neutral or implies a different context."}], "path": "prompts/_base/visual_world_rules/4.202604300936/system.md", "scan_kind": "prompt", "sha256": "e63be2c9d268a106577abfb74b6e128a136cdd7b69740594dd970302e0896998"}
{"candidate_reason": "python scope discovery", "chunk_end": 166, "chunk_start": 1, "chunk_summary": "The script is a utility for generating a static HTML comparison viewer for a specific experiment and does not perform semantic string classification or prompt mutation.", "duration_ms": 5956, "findings": [], "path": "scripts/build_phase91_compare_viewer.py", "scan_kind": "python", "sha256": "6854d49e00f7e4794bc7aa4bcdd5f7468c2a05641bb8a414d7b56fdb2a32a29c"}
{"candidate_reason": "python scope discovery", "chunk_end": 696, "chunk_start": 1, "chunk_summary": "The file provides a FastAPI-based management UI for orchestrating screenplay processing pipelines and reviewing generated assets, with no actionable findings related to semantic string judgment or scenario pollution.", "duration_ms": 15877, "findings": [], "path": "prototype_ui/app.py", "scan_kind": "python", "sha256": "04d2c556662af2e50d3e8398a91b2e9ff141d9446be61dba6a0ad398f3b529d7"}
{"candidate_reason": "prompt scope discovery", "chunk_end": 110, "chunk_start": 1, "chunk_summary": "The prompt defines a system for extracting visual world rules from scenarios, using a closed list of semantic categories (rule_type) and generating natural-language 'director notes' to drive physical presence logic.", "duration_ms": 32058, "findings": [{"category": "llm_closed_list_instruction", "evidence": "rule_type: possession, transformation, ghost, projection, superpower, body_deformation, time_period, costume, technology, other", "line_end": 51, "line_start": 51, "recommended_fix": "Allow the LLM to describe the visual phenomenon naturally or use a more extensible schema that defines visual properties (transparency, facial identity, etc.) rather than narrative tropes.", "severity": "P1", "why_problematic": "This forces the LLM to map complex, open-world narrative tropes into a fixed set of semantic categories. These categories then trigger hardcoded visual logic (e.g., the possession rule in line 31), which is brittle when applied to diverse storytelling."}, {"category": "semantic_string_judgment", "evidence": "director_notes (물리적 존재 여부를 판단할 때 혼동할 수 있는 유형적 원칙)", "line_end": 73, "line_start": 57, "recommended_fix": "Define a structured 'visibility_policy' field with explicit flags (is_physical, is_visible_to_all, is_screen_only) rather than relying on generated 'notes' to guide the scene director.", "severity": "P1", "why_problematic": "The prompt instructs the LLM to generate natural-language rules (e.g., 'hallucinations are not physical') to resolve ambiguity in physical presence. This delegates core pipeline routing and visibility logic to generated prose, which is difficult to validate and prone to drift."}, {"category": "scenario_dependent_prompt", "evidence": "All human characters are <region-derived demonym> unless stated otherwise.", "line_end": 98, "line_start": 98, "recommended_fix": "Move demographic defaults to individual character metadata or allow the LLM to specify a distribution rather than a global override.", "severity": "P2", "why_problematic": "This instruction forces a global demographic bias into the t2i_context based on a single extracted 'region' string. It assumes a monolithic ethnicity/nationality for the entire scenario, which can lead to incorrect visual generation for multi-cultural or international stories."}], "path": "prompts/_base/visual_world_rules/6.202605021400/system.md", "scan_kind": "prompt", "sha256": "911f1af6897a9acde2ff8b3b295158bda139b9d20ef07df8af570f02730c4a42"}
{"candidate_reason": "python scope discovery", "chunk_end": 303, "chunk_start": 1, "chunk_summary": "no actionable findings", "duration_ms": 17648, "findings": [], "path": "scripts/canary/_g4_3_common.py", "scan_kind": "python", "sha256": "1e69c0ca34b679827a51b155a453c8b48c1cdf3d8bf236a69491f7c4d1d7ae24"}
{"candidate_reason": "python scope discovery", "chunk_end": 365, "chunk_start": 1, "chunk_summary": "No actionable findings; the file provides shared utilities for loading and validating structured JSON data and acts as an import bridge for constants defined in the backend.", "duration_ms": 16776, "findings": [], "path": "scripts/canary/_g4_4_common.py", "scan_kind": "python", "sha256": "1593f488a3f136878a569b58239ad98c694a7d20a049a80b1a08efca854a7d3e"}
{"candidate_reason": "python scope discovery", "chunk_end": 191, "chunk_start": 1, "chunk_summary": "No actionable findings. This script is a technical utility for measuring token count deltas in system prompt files using standard tokenization and does not perform semantic analysis or contain scenario pollution.", "duration_ms": 4458, "findings": [], "path": "scripts/canary/g4_2_token_count.py", "scan_kind": "python", "sha256": "f1f1828e6d072b262298c190d71090a8a0bcc1ab26ad19de0f11b897f9164764"}
{"candidate_reason": "python scope discovery", "chunk_end": 414, "chunk_start": 1, "chunk_summary": "The script uses regex patterns to validate the presence of camera-consistency wording in generated prompts, serving as a semantic validator for prompt engineering updates.", "duration_ms": 14029, "findings": [{"category": "semantic_string_judgment", "evidence": "CAMERA_WORDING_PATTERNS = [r\"match.*reference.*(camera|framing|position)\", ...]", "line_end": 54, "line_start": 48, "recommended_fix": "Instead of regex over generated prose, have the LLM emit a structured boolean or enum field indicating that camera consistency wording was applied, or use a more robust semantic similarity check.", "severity": "P1", "why_problematic": "The script uses brittle regex patterns to verify the presence of semantic camera-consistency instructions in generated T2I prompts. This result is used as a validation metric (degradation guard) for prompt engineering changes, making the pipeline's success dependent on specific phrasing rather than semantic intent."}], "path": "scripts/canary/g4_2_camera_wording.py", "scan_kind": "python", "sha256": "3d8b8f7b9068a07103627f52f690743310a4b3ea9113377f5bf72533e049473d"}
{"candidate_reason": "python scope discovery", "chunk_end": 433, "chunk_start": 1, "chunk_summary": "No actionable findings; the file provides infrastructure for strict JSON validation and centralized imports of semantic constants without performing semantic string matching or containing scenario-specific prompt text.", "duration_ms": 19211, "findings": [], "path": "scripts/canary/_g4_5a_common.py", "scan_kind": "python", "sha256": "aa7cf81eed28e03241a860be82d88749b9801bc6711be54a4ba00a52def30678"}
{"candidate_reason": "python scope discovery", "chunk_end": 344, "chunk_start": 1, "chunk_summary": "The file is a canary script that aggregates pre-computed metrics from scene checkpoints and contains no actionable semantic string debt or scenario pollution.", "duration_ms": 11147, "findings": [], "path": "scripts/canary/g4_2_owned_violations.py", "scan_kind": "python", "sha256": "640c312ebfb54682bd80c7fd74571f16b335b82db308c70e2900b57bbab397b1"}
{"candidate_reason": "python scope discovery", "chunk_end": 394, "chunk_start": 1, "chunk_summary": "The script implements a strict validation gate using regex patterns to detect forbidden natural-language phrases in generated T2I prompts.", "duration_ms": 18497, "findings": [{"category": "semantic_string_judgment", "evidence": "CLOSE_FORBIDDEN_PATTERNS used in scan_scene_forbidden to trigger exit 1", "line_end": 47, "line_start": 33, "recommended_fix": "Transition from regex-based prose scanning to structured output validation where the LLM explicitly flags applied constraints, or use a semantic model to verify the absence of forbidden concepts.", "severity": "P1", "why_problematic": "The script performs semantic classification of generated t2i_prompt text using brittle regex patterns like 'from the reference' or 'preserving the same room perspective'. This match result directly controls a fail-fast validation gate (exit code 1), making the system's integrity dependent on specific natural-language phrasing."}], "path": "scripts/canary/g4_2_close_forbidden.py", "scan_kind": "python", "sha256": "f7a04b4bc53a5e8190937521560d0dfb5a3511e0bde674f52f56a5d42b9f0d2a"}
{"candidate_reason": "python scope discovery", "chunk_end": 1327, "chunk_start": 1, "chunk_summary": "The file contains scenario-specific hardcoding for characters and locations, and uses semantic string matching over LLM-emitted relationship categories to drive image reference prioritization.", "duration_ms": 36360, "findings": [{"category": "scenario_dependent_code", "evidence": "SPECIAL_ENTITY_GUARDRAILS = { \"DR.NEX\": { ... }, \"한치호\": { ... }, \"은성\": { ... }, \"서현\": { ... }, \"오리엔티스\": { ... } }", "line_end": 108, "line_start": 57, "recommended_fix": "Move scenario-specific visual guardrails into a sidecar configuration file or include them in the entity metadata extracted from the screenplay.", "severity": "P1", "why_problematic": "Hardcodes specific character names and visual guardrails into the pipeline logic. This biases the prototype builder toward a specific story and prevents it from being used for arbitrary scenarios without manual code modification."}, {"category": "scenario_dependent_code", "evidence": "if entity[\"name\"] == \"DR.NEX\": return \"철제 가면을 쓴 인간 리더...\"", "line_end": 875, "line_start": 861, "recommended_fix": "Use the 'description' field from the entity record or a generic template instead of hardcoding specific character names in the logic.", "severity": "P1", "why_problematic": "Contains hardcoded logic and natural-language descriptions for a specific character ('DR.NEX'), creating a direct dependency on a single story scenario."}, {"category": "semantic_string_judgment", "evidence": "score += 6 if relation.get(\"relation_family\") in DIRECT_RELATION_FAMILIES else 3", "line_end": 638, "line_start": 624, "recommended_fix": "Define relation families as a formal enum in the schema and use the enum values for scoring, or have the LLM emit a numerical priority score directly.", "severity": "P1", "why_problematic": "Uses a closed list of semantic relationship categories ('kinship', 'conflict', 'social', etc.) to calculate a priority score. This score determines which entities are prioritized for reference images and prompt inclusion, directly affecting visual output based on LLM-emitted semantic strings."}, {"category": "schema_or_enum_drift", "evidence": "{\"critical\": 8, \"high\": 5, \"medium\": 3, \"low\": 1}.get(entity_record.get(\"continuity_priority\", \"medium\"), 3)", "line_end": 626, "line_start": 626, "recommended_fix": "Add 'continuity_priority' to the entity schema as an enum with these specific values.", "severity": "P2", "why_problematic": "The code relies on exact string matches for a 'continuity_priority' field that is not enforced by a JSON enum in the schema, creating a brittle contract with the LLM output."}, {"category": "scenario_dependent_code", "evidence": "cache_entity = SCRIPT_DIR / \"srd_part_1_entities_v5.json\"", "line_end": 420, "line_start": 418, "recommended_fix": "Pass cache paths as arguments or configuration rather than hardcoding them in the analysis logic.", "severity": "P2", "why_problematic": "Hardcodes paths to specific project data files ('srd part 1') for seeding analysis, which is scenario-specific behavior."}], "path": "screenplay/prototype_episode_novel.py", "scan_kind": "python", "sha256": "b951af70e9eb3186fcf1de2330ba35e4a8625df24957da2b2fb4e28564470509"}
{"candidate_reason": "python scope discovery", "chunk_end": 157, "chunk_start": 1, "chunk_summary": "No actionable findings. This script is a technical utility for measuring and comparing token counts of prompt files using tiktoken and does not perform semantic analysis or string-based routing.", "duration_ms": 3544, "findings": [], "path": "scripts/canary/g4_3_token_count.py", "scan_kind": "python", "sha256": "7bdb02e9183b29527a68722c34565b61f25296fe798eba6c7b3679ec48d6bb04"}
{"candidate_reason": "python scope discovery", "chunk_end": 1512, "chunk_start": 1, "chunk_summary": "The entity extraction pipeline relies on brittle string matching for identity resolution, relation deduplication, and semantic quality filtering of LLM-generated screenplay data.", "duration_ms": 43912, "findings": [{"category": "semantic_string_judgment", "evidence": "if entity_identifiers(item) & entity_identifiers(existing_item):", "line_end": 886, "line_start": 886, "recommended_fix": "Use a cross-chunk coreference resolution step where the LLM is provided with existing entities and asked to map new mentions to them, or use vector embeddings for fuzzy identity matching.", "severity": "P1", "why_problematic": "Entity identity resolution across chunks is performed by checking for any overlap in normalized name or alias strings. This brittle matching fails to account for semantic similarity, spelling variations, or nicknames not explicitly listed as aliases, leading to duplicate entities in the final extraction."}, {"category": "semantic_string_judgment", "evidence": "signature = \"||\".join([normalized[\"relation_family\"], normalized[\"relation_type\"], ...])", "line_end": 1034, "line_start": 1026, "recommended_fix": "Normalize relation types to a closed vocabulary or use an LLM-based consolidation pass to merge semantically equivalent relations.", "severity": "P1", "why_problematic": "Relation deduplication relies on a signature that includes 'relation_type', which is a free-form string generated by the LLM. Semantically identical relations (e.g., 'is the father of' vs 'father') will result in different signatures and fail to merge, creating redundant graph edges."}, {"category": "semantic_string_judgment", "evidence": "item[\"importance\"] in {\"major\", \"supporting\"} and has_reference_value(item)", "line_end": 839, "line_start": 818, "recommended_fix": "Move pruning logic to a separate review step or allow the LLM to provide a confidence score instead of using hard-coded string filters.", "severity": "P1", "why_problematic": "The code performs aggressive pruning of extracted entities based on hard-coded semantic labels ('importance', 'significance') and a heuristic trait count. This 'membership' decision can silently discard valid scenario data based on brittle LLM classifications or concise descriptions."}, {"category": "semantic_string_judgment", "evidence": "canonical_name = entity_lookup.get((entity_type, normalize_name(entity_name))); if not canonical_name: continue", "line_end": 975, "line_start": 973, "recommended_fix": "Implement fuzzy name matching or a second-pass LLM resolution to link relation participants to the entity registry.", "severity": "P1", "why_problematic": "Relation participants are dropped if their names do not exactly match (after normalization) an entity name or alias extracted in the same or previous chunks. This brittle lookup causes loss of relational data due to minor naming inconsistencies in LLM output."}], "path": "screenplay/extract_entities.py", "scan_kind": "python", "sha256": "ced37d522074f955edfd28eb9d87071bdb0373d430ae06d10612c5b1f5aaf60b"}
{"candidate_reason": "python scope discovery", "chunk_end": 259, "chunk_start": 1, "chunk_summary": "The script uses regex patterns to detect specific natural-language visual focus instructions in generated T2I prompts and triggers a validation failure if they are found.", "duration_ms": 15349, "findings": [{"category": "semantic_string_judgment", "evidence": "BODY_PART_FOCUS_PATTERN = re.compile(r\"\\b(?:\" + _TRIGGER_ALT + r\")\\s+C\\d{2}(?:O\\d{2})?'s\\s+\\w+\", re.IGNORECASE) ... if args.role == \"candidate\" and body_part_focus_count > 0: return 1", "line_end": 244, "line_start": 55, "recommended_fix": "The prompt generation logic should output structured metadata indicating when a body-part focus is intended. The canary should then validate this structured field instead of parsing the final natural-language prompt string.", "severity": "P1", "why_problematic": "The script classifies visual focus intent by matching natural-language trigger phrases (e.g., 'focus on', 'close on') followed by character IDs and body part words within the generated t2i_prompt. This match result directly causes the canary to fail (exit code 1), enforcing a semantic policy through brittle string matching over open-world prose."}], "path": "scripts/canary/g4_3_body_part_focus.py", "scan_kind": "python", "sha256": "0a700dbad8f8dd8017eb6a0bf7dcb9aac0dc4c70f80154a95ec6c53a896f786e"}
{"candidate_reason": "python scope discovery", "chunk_end": 318, "chunk_start": 1, "chunk_summary": "No actionable findings. This script performs technical token-count comparisons between prompt versions using tiktoken and does not infer scenario or visual meaning from the text content.", "duration_ms": 4187, "findings": [], "path": "scripts/canary/g4_4_token_count.py", "scan_kind": "python", "sha256": "b3aae8ceabb34ecce3feed5d768660436db7feb0344c0ba0c6774446517c99ff"}
{"candidate_reason": "python scope discovery", "chunk_end": 326, "chunk_start": 1, "chunk_summary": "The file implements a canary validator that uses brittle substring matching on generated T2I prompts to detect prohibited layout/furniture continuity tokens in atmosphere-reference shots.", "duration_ms": 9757, "findings": [{"category": "semantic_string_judgment", "evidence": "find_layout_imports(prompt) using _CONTINUITY_FURNITURE_LAYOUT_TOKENS", "line_end": 79, "line_start": 66, "recommended_fix": "Replace substring matching with a structured 'layout_preserved' boolean in the LLM output schema, or implement the LLM-based validator mentioned in the code's comments (Override O-17) to judge the prompt's intent.", "severity": "P1", "why_problematic": "This function performs case-insensitive literal substring matches for phrases like 'room layout', 'same chair', and 'wall position' within the generated 't2i_prompt'. The result directly determines the script's exit code and validation status, making it a brittle semantic classifier that cannot distinguish between natural descriptive prose and intentional layout imports."}, {"category": "schema_or_enum_drift", "evidence": "Detects 7 furniture / wall / layout tokens (`furniture` / `wall position` / `room layout` / `same chair` / `same table` / `same wall` / `same window`)", "line_end": 10, "line_start": 5, "recommended_fix": "Centralize these tokens into a formal enum shared by the prompt generator and the validator to prevent drift.", "severity": "P2", "why_problematic": "The list of prohibited tokens is defined as a set of natural language strings that must be synchronized between the prompt instructions and this detector. This creates a contract based on exact string matches for visual concepts rather than a structured enum."}], "path": "scripts/canary/g4_4_atmosphere_no_layout_import.py", "scan_kind": "python", "sha256": "68f0854faf90767f2d109f4bb87a1f63526ffda0807d5edef6259158ab71f695"}
{"candidate_reason": "python scope discovery", "chunk_end": 342, "chunk_start": 1, "chunk_summary": "The script uses a natural-language noun list to detect 'double-description' violations in generated T2I prompts via substring matching, which determines the success or failure of the canary validation.", "duration_ms": 8457, "findings": [{"category": "semantic_string_judgment", "evidence": "for noun in _CONTINUITY_GENERIC_PERSON_NOUNS: if noun.lower() in window: shot_count += 1", "line_end": 251, "line_start": 241, "recommended_fix": "Move this check into the T2I generation logic where entity metadata is structured, or use an LLM-based semantic reviewer to identify redundant descriptions rather than relying on a brittle substring window check against a noun list.", "severity": "P1", "why_problematic": "The script classifies a semantic violation ('double description') by searching for natural-language generic nouns within a character ID's proximity in the generated T2I prompt. This is brittle as it depends on an open-world list of nouns to enforce a visual/semantic constraint and directly impacts the validation pass/fail status."}], "path": "scripts/canary/g4_4_double_description.py", "scan_kind": "python", "sha256": "cce7b8dbf3fbb1ec3007dfef27b9f611b18652d15f1f749c85de733d7cd9a5a1"}
{"candidate_reason": "python scope discovery", "chunk_end": 340, "chunk_start": 1, "chunk_summary": "The script performs semantic validation on generated T2I prompts by using a keyword list to detect reproduction surfaces near technical IDs, leading to validation failure.", "duration_ms": 16470, "findings": [{"category": "semantic_string_judgment", "evidence": "find_reproduction_violations(prompt) using _ID_REPRODUCTION_SURFACES", "line_end": 127, "line_start": 65, "recommended_fix": "Instead of keyword matching on the final prompt, use structured metadata from the scene analysis phase or an LLM-based classifier to identify the presence of reproduction surfaces.", "severity": "P1", "why_problematic": "The function uses a list of natural-language keywords (e.g., mirror, screen) to infer the visual context of a generated T2I prompt. This result directly determines a validation pass/fail state (exit code 1 at line 324), making the pipeline's safety/policy enforcement dependent on brittle string matching over open-world prose."}], "path": "scripts/canary/g4_3_reproduction_surface.py", "scan_kind": "python", "sha256": "fc1825509f95546cbbb4126b62e2a4c986ab5247cd2b18e33a155811a0da359f"}
{"candidate_reason": "python scope discovery", "chunk_end": 1219, "chunk_start": 1, "chunk_summary": "The file handles screenplay scene still extraction, including entity resolution and cinematic term localization, using brittle string matching and blind replacements.", "duration_ms": 52769, "findings": [{"category": "semantic_string_judgment", "evidence": "similarity_score, left in right or right in left, visual_anchor_traits", "line_end": 480, "line_start": 450, "recommended_fix": "Use a more robust entity resolution strategy, such as LLM-based verification for ambiguous matches or a dedicated entity linking model that considers context beyond simple substring/token overlap.", "severity": "P1", "why_problematic": "The similarity_score function uses brittle substring checks and counts of overlapping natural-language traits to determine entity identity. This result directly controls visible-entity membership and entity_id assignment in the series memory, which in turn routes reference attachment and identity tags in the final image prompts."}, {"category": "blind_string_mutation", "evidence": "localize_cinematic_text, mapping.items(), localized.replace(english, translated)", "line_end": 712, "line_start": 701, "recommended_fix": "Replace blind string replacement with a structured approach where the LLM outputs canonical enums that are then mapped to localized strings, or use regex with word boundaries (\\b) to ensure only whole terms are translated.", "severity": "P1", "why_problematic": "The localization logic performs blind substring replacement on LLM-generated cinematic descriptions (camera and lighting blocks). This is brittle as it does not respect word boundaries and can lead to corrupted prose if technical terms overlap (e.g., 'Extreme' vs 'Extreme Close-Up') or appear as part of other words in the generated text."}], "path": "screenplay/extract_scene_stills.py", "scan_kind": "python", "sha256": "86366ecdfa4a9b6c4c4db1c77aa737d838b663fc0d4881ba9048b6625800c9b6"}
{"candidate_reason": "python scope discovery", "chunk_end": 286, "chunk_start": 1, "chunk_summary": "The script implements a canary validator that uses brittle substring matching of natural language phrases to enforce semantic constraints on generated visual prompts.", "duration_ms": 25866, "findings": [{"category": "semantic_string_judgment", "evidence": "find_forbidden_phrases uses _ID_CLOSE_FACE_FORBIDDEN_PHRASES to check t2i_prompt; if forbidden_total > 0: return 1", "line_end": 270, "line_start": 63, "recommended_fix": "Replace literal substring matching with a semantic classifier or LLM-based review that understands the visual intent of the prompt, or move the constraint enforcement into the structured schema validation if possible.", "severity": "P1", "why_problematic": "The script validates the semantic content of generated T2I prompts by checking for the presence of specific natural language phrases (e.g., 'his face fills the frame'). If any phrase is found, the canary fails. This is a brittle string-based classifier for open-world visual meaning that cannot handle semantic variations or context."}], "path": "scripts/canary/g4_3_close_framing_face_forbidden.py", "scan_kind": "python", "sha256": "9624919ccfa40373d76da9985eb3782a6b308651487995a83fc6286aad836642"}
{"candidate_reason": "python scope discovery", "chunk_end": 331, "chunk_start": 1, "chunk_summary": "The script uses keyword-based substring matching within generated T2I prompts to classify demographic descriptor presence, which drives a blocking canary metric.", "duration_ms": 26219, "findings": [{"category": "semantic_string_judgment", "evidence": "for ethnicity in _ID_ETHNICITY_COMPONENTS: if ethnicity.lower() in window: ... for age in _ID_AGE_BANDS: if age.lower() in window:", "line_end": 105, "line_start": 95, "recommended_fix": "Transition from post-hoc keyword searching to structured metadata tracking where demographic attributes are explicitly linked to character IDs during the prompt generation phase, or utilize an LLM-based evaluator for semantic verification.", "severity": "P1", "why_problematic": "The script performs semantic classification of open-world natural language (T2I prompts) by searching for specific demographic keywords in a ±50 character window around character IDs. The result directly influences a canary ratio used to block candidate releases, making the validation process brittle and insensitive to context, synonyms, or complex phrasing that doesn't match the exact keyword list."}], "path": "scripts/canary/g4_3_demographic_descriptor_present.py", "scan_kind": "python", "sha256": "861eb25c7736ab97614fca1766a55fa08f3243ea4c700d940cc9f63c90fdfbf4"}
{"candidate_reason": "python scope discovery", "chunk_end": 350, "chunk_start": 1, "chunk_summary": "The file uses natural-language verb lists and regex patterns to detect 'view-mixing' violations in generated prompts, which triggers validation failures.", "duration_ms": 14719, "findings": [{"category": "semantic_string_judgment", "evidence": "_VIEW_MIXING_FULL_BODY_VERBS, _BODY_PART_FOCUS_PATTERN, any(v in window for v in _VIEW_MIXING_FULL_BODY_VERBS)", "line_end": 150, "line_start": 67, "recommended_fix": "Replace the regex-based proximity check with an LLM-based visual consistency validator or use structured shot-composition metadata to detect conflicting framing instructions.", "severity": "P1", "why_problematic": "The script classifies visual composition (view-mixing) by searching for specific natural-language verbs (stands, seated, etc.) and body-part focus patterns within generated T2I prompts. This brittle matching determines validation pass/fail and pipeline exit codes."}], "path": "scripts/canary/g4_4_view_mixing.py", "scan_kind": "python", "sha256": "5d23431a948400cfd76c6c9927651d4686932d745a02470311e492e895644713"}
{"candidate_reason": "python scope discovery", "chunk_end": 299, "chunk_start": 1, "chunk_summary": "The script uses keyword-based substring matching on generated t2i_prompt text to classify spatial interactions and foreground/background separation for Rule G validation.", "duration_ms": 9142, "findings": [{"category": "semantic_string_judgment", "evidence": "_has_any_token(prompt, _SPATIAL_FG_BG_SEPARATION_TOKENS) ... _SPATIAL_INTERACTION_VERBS ... _SPATIAL_SHARED_ANCHOR_KEYWORDS", "line_end": 189, "line_start": 183, "recommended_fix": "Replace the keyword-based heuristic with a structured LLM-based validator that understands the semantic context of the prompt, as suggested in the file's own comment at line 19.", "severity": "P1", "why_problematic": "The script infers visual/spatial meaning (interaction, fg/bg separation, and shared anchors) from generated natural-language prompt prose using brittle substring checks. This classification determines whether a shot violates Rule G, directly affecting validation pass/fail behavior and the script's exit code."}], "path": "scripts/canary/g4_5a_fg_bg_shared_anchor.py", "scan_kind": "python", "sha256": "6969c350697873f9435c774a00914bbb90363bf6870fa902313252170e592ab3"}
{"candidate_reason": "python scope discovery", "chunk_end": 403, "chunk_start": 1, "chunk_summary": "This script is a technical utility for computing token count deltas between prompt versions using tiktoken and contains no actionable semantic string debt or scenario pollution.", "duration_ms": 6847, "findings": [], "path": "scripts/canary/g4_5a_token_count.py", "scan_kind": "python", "sha256": "cce2c438351ed385bf49a1f0611d47eb1675a43cd0ac07ce195c93985f003685"}
{"candidate_reason": "python scope discovery", "chunk_end": 172, "chunk_start": 1, "chunk_summary": "No actionable findings. This script is a technical canary that measures the presence of structured schema fields in a manifest file without performing semantic string judgment or scenario-specific analysis.", "duration_ms": 3989, "findings": [], "path": "scripts/canary/g4_6_shot_validator_character_ids_present.py", "scan_kind": "python", "sha256": "18b3785d8449ea6e4843eb30ebb9d7837fca706717039f37facee8e71ab375a1"}
{"candidate_reason": "python scope discovery", "chunk_end": 83, "chunk_start": 1, "chunk_summary": "No actionable findings; the script is a technical utility for database reporting using structured identifiers and technical metadata.", "duration_ms": 3342, "findings": [], "path": "scripts/g4_6_baseline_refs.py", "scan_kind": "python", "sha256": "61d46c477b6b42e0e9ba40695feea893a8fc2c9a09a317f347789f0fedad0ff2"}
{"candidate_reason": "python scope discovery", "chunk_end": 359, "chunk_start": 1, "chunk_summary": "The file is a canary script that validates entity continuity in zoom-in shots by extracting technical entity IDs (C##/P##) from generated prompts using regex, which is an allowed technical format check.", "duration_ms": 23645, "findings": [], "path": "scripts/canary/g4_4_zoom_in_detail_no_new_entity.py", "scan_kind": "python", "sha256": "448c1707fa6227a093cffe9dbc6fa99f06948495066545e61845da4942e96d8d"}
{"candidate_reason": "python scope discovery", "chunk_end": 333, "chunk_start": 1, "chunk_summary": "The script is a technical utility for capturing test fixtures from database rows and manifest files using structured identifiers and indices, with no actionable findings.", "duration_ms": 8711, "findings": [], "path": "scripts/g4_6_capture_fixtures.py", "scan_kind": "python", "sha256": "f360c02eac689a2b1134cae372e60b471bff70ffbbafb3a512be4b01a3addf02"}
{"candidate_reason": "python scope discovery", "chunk_end": 441, "chunk_start": 1, "chunk_summary": "The script implements a framing conflict detector (Rule J) using keyword-based semantic classification of generated T2I prompts to trigger validation failures.", "duration_ms": 22077, "findings": [{"category": "semantic_string_judgment", "evidence": "_SPATIAL_FRAMING_CLOSE_KEYWORDS, _ID_BODY_PART_TRIGGERS, _FULL_BODY_KEYWORDS", "line_end": 326, "line_start": 70, "recommended_fix": "Replace the keyword-based RO-8 algorithm with an LLM-based semantic judge (as suggested in the file's O-17 override comment) to evaluate framing conflicts in natural language prose.", "severity": "P1", "why_problematic": "The script uses brittle keyword lists (e.g., 'stands', '전신', 'focus on') to infer visual framing and body-part focus from natural language prompt text. This classification determines if a shot is in scope for Rule J and whether it contains a violation, directly causing the canary to fail (exit 1)."}], "path": "scripts/canary/g4_5a_primary_framing.py", "scan_kind": "python", "sha256": "65690d96b72dae9628e56e37f36a69bff1f6a2a63510b4747423f8364c9ff7b3"}
{"candidate_reason": "python scope discovery", "chunk_end": 387, "chunk_start": 1, "chunk_summary": "The script implements a validator that uses brittle substring matching and proximity windows over generated t2i_prompt text to detect semantic spatial contradictions, directly controlling validation pass/fail behavior.", "duration_ms": 26328, "findings": [{"category": "semantic_string_judgment", "evidence": "_LOW_CONTRADICTION_TOKENS and _detect_violations_in_window scanning t2i_prompt", "line_end": 160, "line_start": 78, "recommended_fix": "Replace the substring-based proximity check with an LLM-based semantic validator or a structured spatial verification step that does not rely on parsing generated natural language prose.", "severity": "P1", "why_problematic": "The script defines lists of natural-language keywords (e.g., 'chest', 'floor', 'ceiling', '가슴', '바닥') and uses them to perform semantic checks for spatial contradictions (Rule F) within a character window of the generated t2i_prompt. This brittle pattern-matching determines whether the validation passes or fails, which is prone to false positives/negatives in open-world scenarios."}], "path": "scripts/canary/g4_5a_camera_frame_consistency.py", "scan_kind": "python", "sha256": "9dbca1b9ee50a3a659c55a256a98bc33410d317cdca140e550e7ee6bd1af4340"}
{"candidate_reason": "python scope discovery", "chunk_end": 175, "chunk_start": 1, "chunk_summary": "No actionable findings; this is a canary test file using generic placeholders to verify a validator's contract logic without scenario-specific pollution.", "duration_ms": 17379, "findings": [], "path": "scripts/canary/g4_6_visible_entities_contract.py", "scan_kind": "python", "sha256": "26e188497ef362a7306562bd4365352cb6826b2dc9b3c846952bd4f30f8fd2d9"}
{"candidate_reason": "python scope discovery", "chunk_end": 73, "chunk_start": 1, "chunk_summary": "The canary script verifies a hotfix for reference label routing, revealing that the system uses natural language strings as semantic classifiers and is susceptible to misrouting based on visual framing substrings like 'face framing'.", "duration_ms": 22631, "findings": [{"category": "semantic_string_judgment", "evidence": "label = \"previous shot at same location (SAME ROOM) — use this background as-is.\"; if \"face framing\" not in label.lower(); if not any(\"BACKGROUND from a previous shot (SAME ROOM)\" in r for r in res.ref_roles)", "line_end": 66, "line_start": 37, "recommended_fix": "Replace natural language routing labels with a structured enum or a dedicated classification field. The router should operate on formal identifiers rather than performing substring searches on descriptive prose.", "severity": "P1", "why_problematic": "The system uses natural language prose as a routing key to determine reference roles (BACKGROUND vs CHARACTER). This script specifically tests a regression where visual framing terminology ('face framing') within a background description caused incorrect semantic classification by the downstream router."}], "path": "scripts/canary/g4_6_label_routing_face_substring_fix.py", "scan_kind": "python", "sha256": "1b61ec123c27253fcb73efa7ee82ef939b4013d13ad542392464b83c5f2b1eb1"}
{"candidate_reason": "python scope discovery", "chunk_end": 410, "chunk_start": 1, "chunk_summary": "The script uses a regex-based classifier to infer visual framing from natural language camera directions, which determines whether background references are attached to image generation jobs.", "duration_ms": 17361, "findings": [{"category": "semantic_string_judgment", "evidence": "_is_close_framing(camera_direction) ... _CLOSE_FRAMING_RE.search(camera_direction)", "line_end": 241, "line_start": 233, "recommended_fix": "Use a structured framing enum (e.g., CLOSE, MEDIUM, WIDE) in the shot manifest or database schema instead of performing regex searches on natural language descriptions.", "severity": "P1", "why_problematic": "The function uses a regex pattern to classify visual framing from natural language 'camera_direction' strings. This classification result is used at lines 308-314 to decide whether to inject or skip background reference images ('chain_bg'). This makes the reference attachment logic brittle to variations in how framing is described in prose."}], "path": "scripts/regen_phase91_with_model.py", "scan_kind": "python", "sha256": "d52417dadf361a3a2e1fa86d2e0a8df5001bacea669347a897a8f4349ab071bd"}
{"candidate_reason": "python scope discovery", "chunk_end": 444, "chunk_start": 1, "chunk_summary": "The script implements canary detectors for view-mixing and multi-face close-up rules by performing keyword-based proximity searches over generated natural-language prompts.", "duration_ms": 26685, "findings": [{"category": "semantic_string_judgment", "evidence": "_VIEW_MIXING_FULL_BODY_VERBS, _FACE_CLOSE_UP_KEYWORDS, _detect_g4_4_view_mixing, _detect_two_face_close_up", "line_end": 225, "line_start": 60, "recommended_fix": "Replace keyword-based detection with an LLM-based validator (as suggested in line 28) or utilize structured metadata emitted during the prompt generation phase to verify rule compliance.", "severity": "P1", "why_problematic": "The script infers visual semantics (framing conflicts and character focus) from generated natural-language prompts using brittle keyword lists and token-distance heuristics. This approach is prone to false negatives when prompts use synonyms or complex phrasing and requires manual synchronization with the prompt-generation logic. The code specifically notes that its face keyword list differs from the LLM-facing instructions, creating a drift risk."}], "path": "scripts/canary/g4_5a_view_mixing_extension.py", "scan_kind": "python", "sha256": "fabe6f32b444d9eacc6b1565a2d96c0e176f1434099e1716a51ed90b76bd6689"}
