import re import logging logger = logging.getLogger(__name__) class ScriptVerifier: """수정된 스크립트가 원본의 필수 구조/데이터(파라미터 placeholder)를 유지하는지 검증. 구 N-profiling/script_verifier.py 이식 (로직 동일, 외부 의존성 없음). """ def verify_script(self, original_script: list, modified_script: list) -> bool: if not isinstance(modified_script, list): logger.warning("Verification Failed: Modified script is not a list.") return False original_params = self._extract_params(original_script) modified_params = self._extract_params(modified_script) # 원본의 모든 파라미터가 수정본에 존재해야 한다(데이터 주입 보장). missing_params = original_params - modified_params if missing_params: logger.warning(f"Verification Failed: Missing parameters {missing_params}") return False # 환각으로 추가된 파라미터(원본에 없던 변수) 금지. added_params = modified_params - original_params if added_params: logger.warning(f"Verification Failed: Added unknown parameters {added_params}") return False return True def _extract_params(self, script: list) -> set: """스크립트 구조에서 {param_name} 형태 파라미터를 추출한다.""" params = set() for block in script: if not isinstance(block, dict): continue children = block.get("children", []) for child in children: text = child.get("text", "") matches = re.findall(r"\{([^}]+)\}", text) for match in matches: params.add(match) return params