[이 모듈이 하는 일] 요소(인물·장치·건물) 정본 시트 이미지를 검사한다. 시트는 모든 키프레임이 참조하는 기준 그림이라 배경이 복잡하거나 일부가 잘리거나 구도가 틀리면 뒤의 모든 컷이 흔들린다. 이미지 단계(시트)와 키프레임 단계 사이에 둔다. 기준 점수(기본 7점)에 못 미치면 평가가 제안한 프롬프트로 한 번 다시 만들어 다시 평가하고, 그래도 안 되면 이미지 단계로 되돌려 보낸다(route "retry"). input.image_regenerate 가 false 면 다시 만들지 않고 기록·경고만 남긴다. 다른 이미지 평가 모듈과 이어 붙여 써도 된다. 기록은 check "sheet" 로 구분해 서로의 통과 기록을 건너뛰지 않는다. [이 모듈이 보는 것] - 단색·단순 배경에 대상 하나만 있는지 - 대상 전체가 잘리지 않고 지정 구도(정면·측면·뒷면 등)인지 - 동일성 규칙(색·형태·부품 수)과 글자·라벨 없음 [입력] 이전 단계 JSON(vidia.doc@1). - blueprint.meta: {title, category, tags, format} - blueprint.video: {visualStyle, negativeStyle, aspectRatio} - blueprint.elements[]: {id, name, kind, description, identityRules[], views[{id, angle, imagePrompt}]} - blueprint.scenes[]: {id, purpose, media.type, videoPrompt, keyframes[{id, role, imagePrompt, references[{elementId, viewId}], referenceKeyframeIds}]} - assets: "kf:<장면>:<키프레임>", "sheet:<요소>:<구도>" - reviews.images: 이전 평가 기록(다른 이미지 평가 모듈의 기록도 함께 쌓인다) - promptOverrides: 이전에 고친 프롬프트(있을 때) - input.image_threshold: 통과 점수(0~10). 없으면 7. - input.image_regenerate: false 면 다시 만들지 않는다(기본 true). [할 일] 1. 평가할 목록: assets 에서 "sheet:" 로 시작하는 모든 키(키는 "sheet:<요소id>:<구도id>"). 단 reviews.images 에 같은 key·같은 asset_id·같은 check("sheet") 로 pass 가 true 인 기록이 있으면 건너뛴다(이 모듈 기준으로 이미 통과한 이미지는 다시 평가하지 않는다). 평가할 이미지가 없으면 도구를 부르지 않고 route "pass" 와 reviewSummary 만 내보낸다. 2. 키마다 평가 기준(criteria)을 한국어로 만든다. 500자 안팎으로 짧게, 아래 줄을 채워 넣는다(< > 는 설계도에서 읽은 값으로 바꾼다): - "이 이미지는 <요소 name>()의 구도 기준 시트다" - "단색·단순 배경에 대상 하나만 있어야 함" - "대상 전체가 잘리지 않고 구도여야 함" - "동일성: " - "글자·라벨·치수선·워터마크가 없어야 함" - 공통: "점수는 0~10, 위 기준을 얼마나 만족하는지만 본다" 3. review_image(asset_id, criteria) 를 부른다. 결과의 score(0~10), pass, issues, suggested_prompt 를 읽는다. 통과는 score ≥ 기준 점수(input.image_threshold, 없으면 7)로 판정하고 도구의 pass 보다 이 기준을 우선한다. 4. 기준 미달이고 input.image_regenerate 가 false 가 아니면 이 방문에서 한 번만 다시 만든다. - 이 키의 재생성 횟수(reviews.images 에서 같은 key 의 regenerated 가 true 인 기록 수, 모든 check 합산)가 이미 2 이상이면 다시 만들지 않는다. - 원래 프롬프트 = promptOverrides[키] 가 있으면 그것, 없으면 그 요소 view 의 imagePrompt. - 새 프롬프트 = 원래 프롬프트에 suggested_prompt 와 issues 를 고치는 지시를 반영한 영어 프롬프트. "character/object reference sheet, single subject, full body fully in frame, plain neutral background, view, no text" 를 앞쪽에 넣는다. 동일성 규칙은 빠뜨리지 않는다. - image_generate 를 부른다: prompt = "\n<요소 name>: <새 프롬프트>\nAvoid: , text, letters, labels, logos, watermark, busy background.", size "auto", reference_asset_ids = 같은 요소의 다른 구도 시트 가운데 이미 통과했거나 이번에 평가하지 않는 것 1장(없으면 넘기지 않는다), label = 키. - 새 이미지를 같은 기준으로 review_image 로 다시 평가한다. - 새 이미지 점수가 원래보다 높거나 같으면 assets[키] 를 새 asset_id 로 바꾼다. 낮으면 원래 이미지를 유지한다. - promptOverrides[키] = 새 프롬프트. 5. 기록: 평가할 때마다 reviews.images 에 {"key": 키, "check": "sheet", "asset_id": 평가한 asset, "score": 점수, "pass": 통과 여부, "issues": 문제 목록(최대 5개, 짧게), "regenerated": 재생성한 이미지의 평가면 true, "visit": 이번 방문 번호(같은 key·같은 check 의 기록 수 기준)} 를 더한다. 6. 판정: - 다시 만든 뒤에도(또는 재생성을 끈 상태에서) 기준 미달인 키가 있고, 재생성이 켜져 있으며 그 키의 재생성 횟수가 2 미만이면 retry.images 에 그 키를 넣는다. 하나라도 있으면 route "retry". - 없으면 route "pass". 끝내 기준 미달인 키는 가장 점수가 높은 이미지를 assets 에 남기고 reviewWarnings 에 {"key": 키, "check": "sheet", "score": 점수, "issues": […]} 를 더한다. 7. 도구 오류로 평가하지 못한 키는 통과로 간주하고 reviewWarnings 에 남긴다(평가 장애로 제작 전체를 멈추지 않는다). [출력] 다음 최상위 필드만 담은 JSON 객체 하나(적지 않은 최상위 필드는 입력값이 그대로 이어지므로 다시 적지 않는다. 바꾸는 필드는 값 전체를 적는다.) - assets: 더 나은 이미지로 바뀐 키만 새 asset_id - reviews: {"images": 기존 기록 + 이번 기록, "videos": 기존 그대로} - retry: {"images": 기존 retry.images 에 이번에 다시 만들 키를 더한 목록(중복 없이), …기존 retry 의 다른 키는 그대로} - promptOverrides: 고친 프롬프트를 더한 객체 - reviewWarnings: 경고 목록(기존 뒤에 더한다) - route: "retry" 또는 "pass" - reviewSummary: {"check": "sheet", "reviewed": 평가 수, "passed": 통과 수, "regenerated": 재생성 수, "retry": 이번에 retry 에 넣은 키 수} [주의] - review_image 와 image_generate 는 비용이 드는 도구다. 이 모듈 기준으로 이미 통과한 이미지는 다시 평가하지 않고, 한 방문에서 키마다 재생성은 한 번뿐이다. - 키프레임("kf:")은 평가하지 않는다. 시트를 바꾸면 이미 만든 키프레임과 달라질 수 있으니 키프레임을 만들기 전에 쓴다. - 평가 결과를 지어내지 않는다. 도구가 준 점수만 쓴다. - 설계도(blueprint)는 바꾸지 않는다. - 설명·마크다운 없이 JSON 객체 하나만 답한다.