Implementation spec: governance, decision intelligence, theme system, and E2E bug fixes
Implements the 2026-04-02 transformation spec (Phases 1-8) and fixes all critical bugs found during 5-pipeline E2E testing. Governance & Decision Intelligence: - Pipeline-specific stage order in checkpoint (replaces global STAGES list) - Provider scoring engine (lib/scoring.py) with 7-dimension weighted ranking - Decision log artifact enforced at proposal/idea stage across all 10 pipelines - Delivery promise classifier prevents silent motion-to-still downgrades - Structured shot language in scene_plan schema (camera, lens, lighting, DOF) - Variation checker and slideshow risk scorer block samey output before render - Creative intake, capability extension, and creative-intake meta skills - Final self-review artifact with 5 mandatory checks before presenting output - Source media review contract for user-supplied footage Render & Theme System: - Remotion AnimatedBackground now derives colors from playbook (no more hardcoded dark blue fintech gradient on every video) - video_compose builds custom ThemeConfig from playbook YAML colors/fonts — custom playbooks flow through to Remotion automatically - Explainer component wires theme to all child components (charts, cards, etc.) - resolveAsset() handles absolute paths on Windows/Unix via file:// URIs - RENDERER_FAMILY_MAP synced with actual Remotion compositions Critical Bug Fixes: - Windows npx subprocess: run_command() resolves .cmd wrappers via shutil.which() - Silent renderer downgrade: Remotion failure now returns explicit error with options instead of silently falling back to FFmpeg - .env inline comment parsing strips trailing # comments from API keys - concat_path UnboundLocalError in video_compose finally block - audio_mixer and showcase_card capture=True kwarg bug - Selector estimate_cost() calls fixed (_select_tool -> _select_best_tool) - asset_manifest schema expanded with provider, license, subtype fields - screen-demo subtitle_gen moved from required to optional tools - Duration drift detection in post-render final review (>25% warns)
This commit is contained in:
+18
-2
@@ -10,6 +10,7 @@ import hashlib
|
||||
import inspect
|
||||
import json
|
||||
import os
|
||||
import platform
|
||||
import subprocess
|
||||
import shutil
|
||||
from abc import ABC, abstractmethod
|
||||
@@ -37,6 +38,12 @@ def _load_dotenv() -> None:
|
||||
key, _, value = line.partition("=")
|
||||
key = key.strip()
|
||||
value = value.strip().strip("'\"")
|
||||
# Strip inline comments: VAR=value # comment
|
||||
# But only if the # is preceded by whitespace (avoid stripping from values like colors)
|
||||
if " #" in value:
|
||||
value = value[:value.index(" #")].rstrip()
|
||||
elif "\t#" in value:
|
||||
value = value[:value.index("\t#")].rstrip()
|
||||
if key and key not in os.environ:
|
||||
os.environ[key] = value
|
||||
|
||||
@@ -294,9 +301,18 @@ class BaseTool(ABC):
|
||||
timeout: Optional[int] = None,
|
||||
cwd: Optional[Path] = None,
|
||||
) -> subprocess.CompletedProcess:
|
||||
"""Run a subprocess command with standard error handling."""
|
||||
"""Run a subprocess command with standard error handling.
|
||||
|
||||
On Windows, resolves .cmd/.bat wrappers (e.g. npx, npm) via
|
||||
shutil.which() so subprocess.run() can find them without shell=True.
|
||||
"""
|
||||
resolved_cmd = list(cmd)
|
||||
if platform.system() == "Windows" and resolved_cmd:
|
||||
exe = shutil.which(resolved_cmd[0])
|
||||
if exe:
|
||||
resolved_cmd[0] = exe
|
||||
return subprocess.run(
|
||||
cmd,
|
||||
resolved_cmd,
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=timeout,
|
||||
|
||||
Reference in New Issue
Block a user