From fc6ff2248a76a4fea261061b1017e51a2f74bd53 Mon Sep 17 00:00:00 2001 From: calesthio Date: Sat, 4 Apr 2026 13:29:24 -0700 Subject: [PATCH] Add UAT guardrails to pipeline YAML and fix playbook test - animation.yaml: enforce audio architecture + provider comparison in proposal stage, Layer 3 skill gate + clip duration in assets stage - video-reference-analyst.md: Step 6 is now a hard redirect forcing stage-by-stage pipeline execution - Fix test_compatible_with_manifest for nested compatible_playbooks dict --- pipeline_defs/animation.yaml | 7 +++++++ skills/meta/video-reference-analyst.md | 24 ++++++++++++++++++++++-- tests/contracts/test_phase3_contracts.py | 5 ++++- 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/pipeline_defs/animation.yaml b/pipeline_defs/animation.yaml index 0d1e9e81..832beac1 100644 --- a/pipeline_defs/animation.yaml +++ b/pipeline_defs/animation.yaml @@ -95,10 +95,14 @@ stages: - Production plan reflects actual tool availability from preflight - Cost estimate is itemized and honest - Free/local tool options are highlighted where applicable + - "Audio architecture decided: single narrator / character dialogue / narrator+characters" + - "Provider choice presented as comparison table with costs — agent recommends but user decides" success_criteria: - Schema-valid proposal_packet with at least 3 concept_options - selected_concept includes animation_mode and reuse_strategy + - selected_concept includes audio_architecture (single_narrator | character_dialogue | narrator_plus_characters) - cost_estimate has itemized line_items with per-tool costs + - cost_estimate includes provider_comparison table with at least 2 provider options - approval.status is "approved" or "approved_with_changes" before proceeding sub_stages: - name: sample @@ -191,9 +195,12 @@ stages: - Reusable motifs and templates are prepared and referenced - Missing tool paths are surfaced honestly - Total cost within approved budget from proposal_packet + - "Layer 3 skills read for EVERY generation tool before writing prompts (check agent_skills field)" + - "Clip duration maximized (prefer 10s over 5s) to reduce API calls and cost" success_criteria: - Schema-valid asset_manifest artifact - All referenced asset files exist on disk + - layer3_skills_read list is present and includes all tools used for generation - name: edit skill: pipelines/animation/edit-director diff --git a/skills/meta/video-reference-analyst.md b/skills/meta/video-reference-analyst.md index 959d1605..6fd7b53e 100644 --- a/skills/meta/video-reference-analyst.md +++ b/skills/meta/video-reference-analyst.md @@ -327,13 +327,33 @@ adjust: voice, visual style, pacing, music, colors." Iterate on sample feedback until approved. Store samples at: `projects//assets/sample/sample_v{N}.mp4` -### Step 6: Enter Pipeline +### Step 6: Enter Pipeline (HARD REDIRECT) -After sample approval, enter the appropriate pipeline with: +After sample approval, the agent MUST enter the pipeline. This is not optional. + +**Mandatory steps:** +1. Read the pipeline manifest: `pipeline_defs/animation.yaml` (or whichever + pipeline matches the production type) +2. Execute **stage by stage** in order — research → proposal → script → + scene_plan → assets → edit → compose → publish +3. Before EACH stage, read its director skill from + `skills/pipelines//-director.md` +4. Produce the required artifacts at each stage +5. Hit every checkpoint where `checkpoint_required: true` +6. Get user approval where `human_approval_default: true` + +**Do NOT collapse stages.** Do not jump from "user approved proposal" to +"generate all assets." The pipeline stages exist to enforce quality gates, +artifact dependencies, and review checkpoints. Skipping them is a governance +violation. + +**Context to carry into the pipeline:** - VideoAnalysisBrief as grounding context in the research/proposal stage - User's chosen variant as the approved direction - Sample feedback incorporated into the brief - All creative differentiation decisions recorded in the decision_log +- Audio architecture and voice casting decisions from Step 3 +- Layer 3 skills already read from Step 4b The pipeline takes over from here. The VideoAnalysisBrief travels alongside the standard artifacts, providing reference grounding at every stage. diff --git a/tests/contracts/test_phase3_contracts.py b/tests/contracts/test_phase3_contracts.py index 11d26fa4..f420a93e 100644 --- a/tests/contracts/test_phase3_contracts.py +++ b/tests/contracts/test_phase3_contracts.py @@ -239,7 +239,10 @@ class TestStylePlaybooks: def test_compatible_with_manifest(self): manifest = load_pipeline("animated-explainer") available = list_playbooks() - for name in manifest.get("compatible_playbooks", []): + compat = manifest.get("compatible_playbooks", {}) + # compatible_playbooks is a dict with recommended/also_works lists + playbook_names = compat.get("recommended", []) + compat.get("also_works", []) + for name in playbook_names: assert name in available, f"Manifest references unavailable playbook: {name}"