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
This commit is contained in:
calesthio
2026-04-04 13:29:24 -07:00
parent 93de8effbe
commit fc6ff2248a
3 changed files with 33 additions and 3 deletions

View File

@@ -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

View File

@@ -327,13 +327,33 @@ adjust: voice, visual style, pacing, music, colors."
Iterate on sample feedback until approved. Store samples at:
`projects/<name>/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/<pipeline>/<stage>-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.

View File

@@ -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}"