OUTPUT #628 | 34905 karakter | 324 satır
========== YENİ KOMUT | 16.09.2026 15:26:26 ==========

/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-13-_LOCK = threading.Lock()
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-14-_VISION_SEEN: set[str] = set()
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-15-_CANONICAL_READS: set[tuple[str, str]] = set()
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-16-_CREATIVE_CHILDREN: dict[str, str] = {}
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-17-
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py:18:_CREATIVE_CONTRACT_DIR = Path.home() / ".hermes" / "cache" / "shorts-production-guard" / "creative-contracts"
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-19-_CREATIVE_CONTRACT_SCHEMA = {
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-20-    "type": "object",
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-21-    "additionalProperties": False,
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-22-    "properties": {
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-23-        "contract_version": {"type": "integer", "const": 1},
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-24-        "creative_thesis": {"type": "string", "minLength": 1},
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-25-        "visual_strategy": {"type": "string", "minLength": 1},
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py:26:        "source_strategy": {"type": "string", "minLength": 1},
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-27-        "visual_arc": {
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-28-            "type": "array", "minItems": 1, "maxItems": 4,
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-29-            "items": {"type": "string", "minLength": 1},
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-30-        },
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-31-        "payoff": {"type": "string", "minLength": 1},
--
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-35-        },
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-36-        "fallback": {"type": "string"},
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-37-    },
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-38-    "required": [
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-39-        "contract_version", "creative_thesis", "visual_strategy",
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py:40:        "source_strategy", "visual_arc", "payoff",
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-41-    ],
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-42-}
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-43-
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-44-_CANONICAL_IMPLEMENTATION_NAMES = {
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-45-    "shorts_fast_pipeline.py",
--
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-185-    low = str(text or "").lower()
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-186-    is_video = any(x in low for x in _VIDEO_WORDS)
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-187-    is_production = any(x in low for x in _PRODUCTION_WORDS)
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-188-    alternate_method = any(x in low for x in _ALT_METHOD_WORDS)
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-189-    explicit_system_change = any(x in low for x in _EXPLICIT_SYSTEM_WORDS)
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py:190:    # Turkish/English engineering briefs must retain source, test and dependency
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-191-    # access. Requiring one engineering phrase plus one system-quality phrase
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-192-    # avoids turning an ordinary "make the video better" prompt into a bypass.
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-193-    engineering = any(x in low for x in (
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-194-        "engineering", "mühendislik", "regression harness", "case-vid",
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-195-        "regresyon harness", "regresyon", "kök neden", "root cause", "runtime/architecture",
--
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-208-def _production_context(session_id: str) -> tuple[bool, bool, bool]:
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-209-    return _classify_context_text(_recent_real_user_text(session_id))
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-210-
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-211-
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-212-def _canonical_rediscovery_target(tool_name: str, args: dict) -> Optional[str]:
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py:213:    """Identify source/reference inspection, not canonical script execution."""
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-214-    payload = json.dumps(args, ensure_ascii=False, sort_keys=True)
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-215-    names = _CANONICAL_IMPLEMENTATION_NAMES | _CANONICAL_REFERENCE_NAMES
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-216-    target = next((name for name in names if name in payload), None)
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-217-    if not target:
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-218-        return None
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py:219:    if tool_name in {"read_file", "search_files"}:
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-220-        return target
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-221-    if tool_name == "skill_view" and args.get("file_path"):
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-222-        return target
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-223-    if tool_name == "execute_code":
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-224-        low = str(args.get("code") or "").lower()
--
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-244-    # this function at its caller.
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-245-    if target in _CANONICAL_IMPLEMENTATION_NAMES or key in _CANONICAL_READS:
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-246-        return _block(
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-247-            "Shorts production guard: normal production must use the documented interface "
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-248-            f"instead of re-reading {target} to rediscover schema. Run the canonical "
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py:249:            "preflight/proof-check/pipeline command. Source and tests remain readable in an "
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-250-            "explicit engineering/system-change task."
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-251-        )
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-252-    _CANONICAL_READS.add(key)
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-253-    return None
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-254-
--
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-258-
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-259-def _runtime_proof_fingerprint(data: dict) -> str:
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-260-    """Mirror the canonical proof fingerprint so accepted proof can be frozen at runtime."""
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-261-    creative = data.get("creative_intent") or {}
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-262-    gate = data.get("proof_gate") or {}
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py:263:    candidates = gate.get("candidates") or []
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-264-
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-265-    normalized = []
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py:266:    for c in candidates:
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-267-        if not isinstance(c, dict):
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-268-            normalized.append(c)
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-269-            continue
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-270-        item = dict(c)
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-271-        src = item.get("src")
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-272-        if isinstance(src, str) and src.strip():
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-273-            path = Path(src).expanduser()
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-274-            if path.exists():
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-275-                st = path.stat()
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py:276:                item["_source_identity"] = {
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-277-                    "path": str(path.resolve()),
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-278-                    "size": st.st_size,
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-279-                    "mtime_ns": st.st_mtime_ns,
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-280-                }
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-281-            else:
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py:282:                item["_source_identity"] = {"path": str(path), "missing": True}
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-283-        normalized.append(item)
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-284-
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-285-    selected_casting = []
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-286-    for index, shot in enumerate(data.get("shots") or []):
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-287-        if not isinstance(shot, dict):
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-288-            continue
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-289-        kind = str(shot.get("type") or "").lower()
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py:290:        origin = str(shot.get("source_origin") or "").strip().lower()
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-291-        src_value = shot.get("src")
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py:292:        footage_backed = (
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py:293:            "footage" in kind
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-294-            or (
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-295-                shot.get("materialized") is True
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-296-                and bool(origin)
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-297-                and not origin.startswith(("generated:", "synthetic:", "ai-generated:"))
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-298-                and isinstance(src_value, str)
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-299-                and Path(src_value).expanduser().suffix.lower() in {".mp4", ".mov", ".mkv", ".webm", ".m4v"}
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-300-            )
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-301-        )
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py:302:        if not footage_backed:
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-303-            continue
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-304-        item = {
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-305-            "shot": index,
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-306-            "src": shot.get("src"),
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py:307:            "source_origin": shot.get("source_origin"),
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-308-            "visual_goal": shot.get("visual_goal"),
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-309-            "in": shot.get("in", 0),
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-310-            "duration": shot.get("duration"),
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-311-            "casting": shot.get("casting"),
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-312-        }
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-313-        src = item.get("src")
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-314-        if isinstance(src, str) and src.strip():
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-315-            path = Path(src).expanduser()
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-316-            if path.exists():
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-317-                st = path.stat()
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py:318:                item["_source_identity"] = {
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-319-                    "path": str(path.resolve()),
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-320-                    "size": st.st_size,
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-321-                    "mtime_ns": st.st_mtime_ns,
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-322-                }
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-323-            else:
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py:324:                item["_source_identity"] = {"path": str(path), "missing": True}
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-325-        selected_casting.append(item)
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-326-
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-327-    payload = {
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-328-        "creative_intent": {
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-329-            "promise": creative.get("promise"),
--
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-331-            "hook_visual_goal": creative.get("hook_visual_goal"),
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-332-            "payoff": creative.get("payoff"),
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-333-        },
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-334-        "proof_gate": {
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-335-            "mode": gate.get("mode"),
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py:336:            "candidates": normalized,
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-337-        },
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-338-        "selected_casting": selected_casting,
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-339-    }
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-340-    return hashlib.sha256(
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-341-        json.dumps(payload, sort_keys=True, ensure_ascii=False).encode("utf-8")
--
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-413-
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-414-        prospective = json.loads(prospective_text)
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-415-        if _runtime_proof_fingerprint(prospective) != current_fp:
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-416-            return _block(
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-417-                "Shorts production guard: PROOF_FREEZE — accepted proof is locked. "
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py:418:                "Do not change creative_intent, proof candidates, or selected footage/casting "
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-419-                "after Vision PASS. Continue with TTS/render/final QA using the accepted plan. "
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-420-                "A genuine proof failure must be handled before acceptance, not by reopening "
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-421-                "the proof loop after PASS."
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-422-            )
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-423-    except Exception:
--
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-462-
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-463-
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-464-def _direct_render_bypass(tool_name: str, args: dict) -> bool:
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-465-    """Block manual TTS/final assembly during normal Shorts production.
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-466-
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py:467:    Asset inspection, proof generation and deterministic QA remain available.
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-468-    Final production must go through the canonical shorts_fast_pipeline.
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-469-    """
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-470-    if tool_name == "terminal":
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-471-        cmd = str(args.get("command") or "")
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-472-        low = cmd.lower()
--
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-541-    prefix = "HERMES_PROOF_GATE::"
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-542-    return token[len(prefix):] if token.startswith(prefix) else token
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-543-
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-544-
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-545-def _proof_verdict_accepted(verdict: Any, token: str) -> bool:
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py:546:    """Accept proof only when every selected footage role is unambiguous."""
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-547-    return bool(
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-548-        isinstance(verdict, dict)
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-549-        and verdict.get("verdict") == "PASS"
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-550-        and verdict.get("verifier") == "vision_analyze"
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-551-        and verdict.get("primary_visual_proof") is True
--
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-617-    if tool_name == "skill_view" and not alternate_method:
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-618-        name = str(args.get("name") or "")
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-619-        if name and name != "shorts-core":
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-620-            return _block(
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-621-                "Shorts production guard: shorts-core is the sole production authority "
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py:622:                "for this footage-based Shorts/Reels turn. Do not load another production, "
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-623-                "debug, installation, or QA skill. Continue with shorts-core and the canonical pipeline."
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-624-            )
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-625-
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-626-    # Vision policy: do not impose arbitrary call counts.
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-627-    # The agent may re-evaluate when the evidence or question genuinely changes.
--
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-638-        question = str(args.get("question") or "").strip()
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-639-        raw = image_url[7:] if image_url.startswith("file://") else image_url
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-640-        image_path = Path(raw).expanduser()
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-641-
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-642-        # Normal production gets exactly the two canonical visual judgment surfaces:
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py:643:        # proof/casting before render and final semantic QA after render. Source-sheet,
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py:644:        # range-sheet and ad-hoc asset-sheet inspections duplicate evidence and create
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-645-        # expensive main-agent loops. This block does not abort the job; the agent
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-646-        # continues with deterministic discovery and the canonical proof sheet.
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-647-        if (
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-648-            not alternate_method
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-649-            and not explicit_system_change
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-650-            and image_path.name not in {"proof_contact_sheet.jpg", "final_contact_sheet.jpg"}
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-651-        ):
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-652-            return _block(
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-653-                "Shorts production guard: AD_HOC_VISION_SKIPPED_FOR_TURN_ECONOMY — "
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py:654:                "do not open a separate source/range/asset Vision review. Select candidates "
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-655-                "from metadata and the creative contract, build the manifest, then use the "
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-656-                "single canonical proof_contact_sheet which already reviews hook, proof, "
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-657-                "setup, insert and payoff casting. Continue the production; do not stop."
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-658-            )
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-659-
--
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-675-                and proof_state.get("last_fingerprint") == current_fingerprint
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-676-            ):
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-677-                return _block(
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-678-                    "Shorts production guard: PROOF_STRATEGY_EXHAUSTED — this proof strategy "
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-679-                    "already failed initial review plus one repair. Do not retry Vision on the "
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py:680:                    "same accepted candidates/casting. Materially change the proof footage or "
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-681-                    "casting, rerun proof-check, and continue the production autonomously."
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-682-                )
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-683-
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-684-        # Content identity matters more than filename: a repaired final_contact_sheet
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-685-        # at the same path is new evidence and must be allowed to be judged again.
--
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-702-
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-703-        with _LOCK:
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-704-            if signature in _VISION_SEEN:
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-705-                return _block(
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-706-                    "Shorts production guard: this exact visual evidence has already been "
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py:707:                    "asked the same question. Reuse the existing result. If evidence was repaired "
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-708-                    "or the verification question genuinely needs correction, change the evidence "
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-709-                    "or question rather than repeating the same call."
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-710-                )
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-711-        return None
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-712-
--
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-744-                    "Shorts production guard: proof state is runtime-owned. "
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-745-                    "Do not create, edit, copy, delete, or inspect proof receipt/pending files "
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-746-                    "through terminal commands during production."
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-747-                )
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-748-            if (
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py:749:                _INSTALL_RE.search(cmd)
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-750-                or "local-vlm" in low
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-751-                or ("transformers" in low and "install" in low)
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-752-                or ("torch" in low and "install" in low)
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-753-            ):
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-754-                return _block(
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-755-                    "Shorts production guard: installing packages/models or creating a local VLM "
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-756-                    "during video production is blocked. Do not build a new QA/tool stack; continue "
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-757-                    "with the canonical installed pipeline."
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-758-                )
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py:759:            if _PROTECTED_MUTATION_RE.search(cmd):
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-760-                return _block(
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-761-                    "Shorts production guard: production-time mutation of the Hermes runtime/toolchain "
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-762-                    "is blocked. Use existing tools without modifying them."
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-763-                )
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-764-
--
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-875-    question = str(args.get("question") or "")
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-876-    if not image_url:
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-877-        return
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-878-
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-879-    # A provider failure is not reviewed evidence. Mark only completed Vision
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py:880:    # calls as seen so the provider's explicit retry can reuse the exact sheet
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-881-    # and question instead of forcing a meaningless evidence mutation.
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-882-    raw_identity = image_url[7:] if image_url.startswith("file://") else image_url
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-883-    try:
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-884-        image_identity = _sha_file(Path(raw_identity).expanduser().resolve())
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-885-    except Exception:
--
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-965-    try:
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-966-        receipt = Path(str(pending["receipt"])).expanduser().resolve()
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-967-        receipt.parent.mkdir(parents=True, exist_ok=True)
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-968-        obj = {
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-969-            "pass": True,
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py:970:            "receipt_source": "shorts-production-guard/post_tool_call",
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-971-            "verifier": "vision_analyze",
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-972-            "fingerprint": pending["fingerprint"],
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-973-            "contact_sheet": str(image_path),
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-974-            "contact_sheet_sha256": pending["contact_sheet_sha256"],
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-975-            "verdict": verdict,
--
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-1034-    sid = str(session_id or "")
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-1035-    if not sid:
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-1036-        return None
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-1037-    try:
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-1038-        con = sqlite3.connect(str(_DB), timeout=1)
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py:1039:        row = con.execute("SELECT source FROM sessions WHERE id=? LIMIT 1", (sid,)).fetchone()
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-1040-        con.close()
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-1041-        if row and str(row[0] or "") in {"subagent", "tool"}:
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-1042-            return None
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-1043-    except Exception:
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-1044-        pass
--
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-1048-    compact = json.dumps(contract, ensure_ascii=False, separators=(",", ":"))
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-1049-    return {
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-1050-        "context": (
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-1051-            "HERMES_CREATIVE_CONTRACT_ACTIVE: This Astra-approved creative direction is the "
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-1052-            "current production contract. Preserve its visual intent while choosing concrete "
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py:1053:            "assets and executing the canonical pipeline. Do not silently replace it. "
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-1054-            f"CONTRACT={compact}"
/home/hermes/.hermes/plugins/shorts-production-guard/__init__.py-1055-        )
root@213-238-170-219:~#