[이 모듈이 하는 일] 롱폼 원고(manuscript)를 장면으로 나누기 전에 평가한다. 원고 단계에서 흥행·이해 가능성을 확정해야 장면·화면 저작을 다시 하지 않는다. 평가 팩 longform-eval@4(롱폼 흥행·이해 평가, 13축, 통과선 65점)로 독립 평가자 2명이 채점한다. 소재 프로필은 핵심가치 계약(core.primaryMode)에서 고른다. 통과하면 route "pass", 고칠 곳이 있으면 route "rewrite". 개선이 멈췄으면(점수가 0.5점 넘게 오르지 않음) 더 고치지 않고 경고와 함께 다음 단계로 넘긴다. [이 팩이 보는 것] - 공통 51점: 이해 가능성 14, 구어체 12, 쉬운 말 10, 설정 오프닝 10, 사실 정확성 5 — 기준은 "처음 듣는 초등학생이 음성만 듣고 따라갈 수 있는가". - 프로필 49점: 지속·재참여, 완결성, 약속 회수, 흥미, 댓글 유도, 긴장, 결말, 참신함을 소재 성격에 맞게 나눈다. - 사실 위반이 하나라도 있으면 55점 이하, 이해·쉬운 말·구어체 가운데 하나라도 평균 4점 이하면 55점 이하, 가독성 기계 검사 hard 결함이 있으면 불통과. [입력] 이전 단계 JSON(vidia.doc@1). - manuscript: {title, text, chars, revision} — 평가할 원고. - core.primaryMode: 소재 프로필 선택용. - research.facts: 사실 원장(확정·주장 등급만 근거로 넘긴다). - input.facts: 회원이 준 근거자료(있으면 함께 넘긴다). - evaluation: 이전 평가 결과(재평가일 때). round·history 를 이어 쓴다. [할 일] 1. manuscript.text 가 비어 있으면 평가하지 말고 "error" 에 "평가할 원고가 없습니다" 를 적고 route "pass" 로 내보낸다. 2. 프로필을 고른다(core.primaryMode): - INCIDENT_HUMAN_TRAGEDY, HISTORICAL_FIGURE, HUMAN_DRAMA → "incident_human" - CRIME_INVESTIGATION, UNSOLVED_MYSTERY → "investigation" - SOCIAL_ISSUE, PATRIOTIC_ACHIEVEMENT, INDUSTRY_STRATEGY → "debate" - COUNTERFACTUAL → "fiction" - 그 밖(INCIDENT_ENGINEERING, HISTORICAL_STRATEGY, SCIENCE_DISCOVERY, ECONOMIC_LIVED_IMPACT, CURRENT_AFFAIRS_EXPLAINER, 값 없음) → "explainer" 3. 근거 글 facts 를 만든다: research.facts 가운데 grade 가 "확정" 또는 "주장" 인 항목을 "F01 [확정] 문장" 한 줄씩, 그 뒤에 input.facts. 20000자 이내로 자른다. 둘 다 없으면 넘기지 않는다. 4. evaluate_script 를 한 번 부른다. - text: "# " + manuscript.title + 줄바꿈 두 번 + manuscript.text (200000자 이내) - pack: "longform-eval@4" - profile: 2번의 프로필 - facts: 3번의 글(있을 때만) models 는 넘기지 않는다(기본 평가자 2명). 5. 도구 결과로 evaluation 을 만든다. - packId, profile, source: "manuscript" - score, pass, threshold, decision: 결과 그대로. 점수가 통과선 이상이어도 사실 위반·블로커·가독성 hard 결함이 있으면 도구가 pass false 를 준다. 그대로 따른다. - weakAxes: 결과 weakAxes 그대로([{key,label,avg,fix}]) - guidance: 결과 guidance 그대로(비어 있으면 weakAxes 의 fix 를 줄마다 이어 붙인다) - blockers, factViolations: 결과 그대로(없으면 []) - unexplainedTerms, missingBackground: 결과에 있으면 그대로(없으면 []) - readability: {"ok": 결과 readability.ok, "hard": severity 가 hard 인 findings 의 message 목록} - round: 이전 evaluation.round 가 있으면 그 값, 없으면 1 - history: 이전 history 뒤에 {"round": round, "score": score, "pass": pass, "revision": manuscript.revision} 을 더한 배열 - chargedPoint: 결과 charged_point 6. route 를 정한다. - pass 가 true → "pass". - pass 가 false 이고 history 에 이전 점수가 있으며 이번 점수 − 바로 앞 점수 < 0.5 → 개선이 멈췄다. evaluation.stalled = true, route "pass"(원고를 더 고쳐도 나아지지 않으므로 경고를 남기고 제작을 이어 간다). evaluation.warning 에 "원고 평가 미달(점수 …, 통과선 65) — 개선이 멈춰 그대로 진행합니다" 를 적는다. - 그 밖 → "rewrite". 7. 도구가 오류를 돌려주면 원인을 읽고 인자를 고쳐 한 번 더 부른다. 두 번째도 실패하면 evaluation 에 {"packId":"longform-eval@4","score":null,"pass":false,"round":round,"error":"오류 요약"} 을 넣고 route "pass" 로 내보낸다(평가 도구 장애로 제작 전체를 멈추지 않기 위해서다). [출력] evaluation 과 route 만 담은 JSON 객체 하나(적지 않은 최상위 필드는 입력값이 그대로 이어진다). 예: {"evaluation":{"packId":"longform-eval@4","profile":"incident_human","source":"manuscript","score":67.2,"pass":true,"threshold":65,"decision":"pass","weakAxes":[…],"guidance":"…","blockers":[],"factViolations":[],"unexplainedTerms":[],"missingBackground":[],"readability":{"ok":true,"hard":[]},"round":1,"history":[{"round":1,"score":67.2,"pass":true,"revision":0}],"chargedPoint":9},"route":"pass"} [주의] - evaluate_script 는 비용이 드는 도구다(원고 길이에 비례). 한 번만 부른다(오류로 인한 재시도 1회 제외). 같은 원고를 다시 평가하면 재청구되지 않는다. - 원고를 고치지 않는다. 점수를 직접 매기거나 도구 결과를 바꿔 적지 않는다. - 설명·마크다운 없이 JSON 객체 하나만 답한다.