@event4u/agent-config 14.10.0 → 14.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.augment-plugin/marketplace.json +3 -3
- package/.augment-plugin/plugin.json +1 -1
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +161 -208
- package/README.md +1 -1
- package/dist/agent-src/commands/design.md +88 -0
- package/dist/agent-src/commands/project/analyze.md +47 -0
- package/dist/agent-src/commands/review/changes.md +67 -6
- package/dist/agent-src/commands/roadmap/create.md +49 -0
- package/dist/agent-src/commands/roadmap/next.md +27 -11
- package/dist/agent-src/commands/roadmap/process-full.md +14 -0
- package/dist/agent-src/commands/video/from-script.md +60 -3
- package/dist/agent-src/commands/video/stitch.md +14 -0
- package/dist/agent-src/contexts/communication/rules-auto/guidelines-mechanics.md +1 -0
- package/dist/agent-src/contexts/execution/evidence-discipline.md +26 -0
- package/dist/agent-src/contexts/execution/roadmap-process-loop.md +154 -2
- package/dist/agent-src/rules/active-remediation.md +3 -3
- package/dist/agent-src/rules/code-provenance.md +2 -2
- package/dist/agent-src/rules/context-hygiene.md +13 -33
- package/dist/agent-src/rules/council-availability.md +2 -2
- package/dist/agent-src/rules/decision-revisit-gate.md +3 -1
- package/dist/agent-src/rules/design-fidelity.md +18 -0
- package/dist/agent-src/rules/design-review-after-ui-write.md +2 -2
- package/dist/agent-src/rules/evaluator-independence.md +56 -44
- package/dist/agent-src/rules/fix-what-you-see.md +9 -1
- package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +1 -1
- package/dist/agent-src/rules/minimal-safe-diff.md +14 -20
- package/dist/agent-src/rules/missing-skill-recovery.md +13 -1
- package/dist/agent-src/rules/playbook-precedence.md +105 -0
- package/dist/agent-src/rules/recurring-criticism.md +3 -1
- package/dist/agent-src/rules/roadmap-progress-sync.md +14 -13
- package/dist/agent-src/rules/scale-discipline.md +24 -0
- package/dist/agent-src/rules/security-sensitive-stop.md +2 -2
- package/dist/agent-src/rules/settings-ask-protocol.md +2 -2
- package/dist/agent-src/rules/ui-audit-gate.md +27 -15
- package/dist/agent-src/rules/untrusted-input-defense.md +2 -2
- package/dist/agent-src/skills/accessibility-auditor/SKILL.md +19 -0
- package/dist/agent-src/skills/adr-create/SKILL.md +7 -0
- package/dist/agent-src/skills/agents-md-thin-root/SKILL.md +33 -0
- package/dist/agent-src/skills/ai-council/references/advanced-modes.md +17 -3
- package/dist/agent-src/skills/ai-council/references/output-and-synthesis.md +31 -0
- package/dist/agent-src/skills/ai-council/references/procedure.md +19 -0
- package/dist/agent-src/skills/alerting-doctrine/SKILL.md +225 -0
- package/dist/agent-src/skills/authz-review/SKILL.md +0 -1
- package/dist/agent-src/skills/blast-radius-analyzer/SKILL.md +32 -0
- package/dist/agent-src/skills/brand/SKILL.md +3 -0
- package/dist/agent-src/skills/brand-asset-generation/SKILL.md +3 -0
- package/dist/agent-src/skills/brand-audit/SKILL.md +3 -0
- package/dist/agent-src/skills/brand-identity/SKILL.md +3 -0
- package/dist/agent-src/skills/brand-strategy/SKILL.md +3 -0
- package/dist/agent-src/skills/brand-to-tokens/SKILL.md +3 -0
- package/dist/agent-src/skills/check-refs/SKILL.md +3 -0
- package/dist/agent-src/skills/code-refactoring/SKILL.md +45 -1
- package/dist/agent-src/skills/code-review/SKILL.md +75 -5
- package/dist/agent-src/skills/command-routing/SKILL.md +6 -0
- package/dist/agent-src/skills/command-writing/SKILL.md +35 -0
- package/dist/agent-src/skills/condense-memory/SKILL.md +3 -0
- package/dist/agent-src/skills/context-authoring/SKILL.md +1 -1
- package/dist/agent-src/skills/conventional-commits-writing/SKILL.md +3 -0
- package/dist/agent-src/skills/copilot-agents-optimization/SKILL.md +10 -0
- package/dist/agent-src/skills/corpus-grounding/SKILL.md +3 -0
- package/dist/agent-src/skills/design-intelligence/SKILL.md +3 -0
- package/dist/agent-src/skills/design-intelligence/data/landing.csv +36 -35
- package/dist/agent-src/skills/design-intelligence/data/stacks/threejs.csv +1 -0
- package/dist/agent-src/skills/design-review/SKILL.md +79 -1
- package/dist/agent-src/skills/design-review/references/verification-automation.md +41 -0
- package/dist/agent-src/skills/design-system-capture/SKILL.md +35 -40
- package/dist/agent-src/skills/design-system-capture/references/import-procedure.md +50 -0
- package/dist/agent-src/skills/design-tokens/SKILL.md +3 -0
- package/dist/agent-src/skills/design-variations/SKILL.md +3 -0
- package/dist/agent-src/skills/developer-like-execution/SKILL.md +3 -0
- package/dist/agent-src/skills/estimate-ticket/SKILL.md +3 -0
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +28 -4
- package/dist/agent-src/skills/fe-design/SKILL.md +74 -41
- package/dist/agent-src/skills/fe-design/references/craft-floor.md +52 -0
- package/dist/agent-src/skills/fe-design/references/source-led-port.md +36 -0
- package/dist/agent-src/skills/file-editor/SKILL.md +5 -0
- package/dist/agent-src/skills/finishing-a-development-branch/SKILL.md +2 -2
- package/dist/agent-src/skills/git-workflow/SKILL.md +3 -0
- package/dist/agent-src/skills/html-deck/SKILL.md +3 -0
- package/dist/agent-src/skills/iconography/SKILL.md +3 -0
- package/dist/agent-src/skills/image-editing/SKILL.md +3 -0
- package/dist/agent-src/skills/image-generation/SKILL.md +3 -0
- package/dist/agent-src/skills/image-provider-routing/SKILL.md +3 -0
- package/dist/agent-src/skills/incident-commander/SKILL.md +10 -0
- package/dist/agent-src/skills/js-library-packaging/SKILL.md +173 -0
- package/dist/agent-src/skills/js-library-packaging/scripts/check_package_surface.ts +270 -0
- package/dist/agent-src/skills/laravel-migration/SKILL.md +3 -0
- package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +3 -0
- package/dist/agent-src/skills/lint-skills/SKILL.md +3 -0
- package/dist/agent-src/skills/llm-provider-knowledge/SKILL.md +3 -0
- package/dist/agent-src/skills/logging-monitoring/SKILL.md +234 -51
- package/dist/agent-src/skills/logo-generation/SKILL.md +3 -0
- package/dist/agent-src/skills/md-language-check/SKILL.md +3 -0
- package/dist/agent-src/skills/monorepo-workspace/SKILL.md +149 -0
- package/dist/agent-src/skills/motion-choreographer/SKILL.md +6 -0
- package/dist/agent-src/skills/multi-tenancy/SKILL.md +4 -0
- package/dist/agent-src/skills/operational-readiness/SKILL.md +184 -0
- package/dist/agent-src/skills/override-management/SKILL.md +3 -0
- package/dist/agent-src/skills/persona-improvement/SKILL.md +3 -0
- package/dist/agent-src/skills/pest-testing/SKILL.md +3 -0
- package/dist/agent-src/skills/playbook-authoring/SKILL.md +162 -0
- package/dist/agent-src/skills/playwright-testing/SKILL.md +3 -0
- package/dist/agent-src/skills/privacy-review/SKILL.md +3 -0
- package/dist/agent-src/skills/project-analysis-core/SKILL.md +23 -0
- package/dist/agent-src/skills/prompt-engineering-image/SKILL.md +3 -0
- package/dist/agent-src/skills/quality-tools/SKILL.md +5 -0
- package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +81 -33
- package/dist/agent-src/skills/readme-reviewer/SKILL.md +3 -0
- package/dist/agent-src/skills/readme-writing/SKILL.md +3 -0
- package/dist/agent-src/skills/readme-writing-package/SKILL.md +3 -0
- package/dist/agent-src/skills/receiving-code-review/SKILL.md +2 -2
- package/dist/agent-src/skills/refine-prompt/SKILL.md +3 -0
- package/dist/agent-src/skills/refine-ticket/SKILL.md +3 -0
- package/dist/agent-src/skills/requesting-code-review/SKILL.md +2 -2
- package/dist/agent-src/skills/review-routing/SKILL.md +2 -2
- package/dist/agent-src/skills/roadmap-writing/SKILL.md +23 -41
- package/dist/agent-src/skills/roadmap-writing/references/follow-up-roadmap-shape.md +47 -0
- package/dist/agent-src/skills/rtk-output-filtering/SKILL.md +22 -6
- package/dist/agent-src/skills/runway-cognition/SKILL.md +3 -0
- package/dist/agent-src/skills/scene-expander/scene-blueprint.schema.yaml +26 -0
- package/dist/agent-src/skills/secrets-management/SKILL.md +4 -0
- package/dist/agent-src/skills/server-hardening/SKILL.md +159 -0
- package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +3 -0
- package/dist/agent-src/skills/skill-management/SKILL.md +3 -0
- package/dist/agent-src/skills/skill-reviewer/SKILL.md +3 -0
- package/dist/agent-src/skills/skill-writing/SKILL.md +6 -0
- package/dist/agent-src/skills/skill-writing/references/procedure.md +24 -2
- package/dist/agent-src/skills/spreadsheet-authoring/SKILL.md +3 -0
- package/dist/agent-src/skills/storybook-workshop/SKILL.md +203 -0
- package/dist/agent-src/skills/storybook-workshop/scripts/story_contrast_floor.ts +134 -0
- package/dist/agent-src/skills/subagent-orchestration/SKILL.md +1 -1
- package/dist/agent-src/skills/subagent-orchestration/prompts/README.md +25 -0
- package/dist/agent-src/skills/supply-chain-intake/SKILL.md +12 -0
- package/dist/agent-src/skills/systematic-debugging/SKILL.md +1 -1
- package/dist/agent-src/skills/terraform/SKILL.md +3 -0
- package/dist/agent-src/skills/test-driven-development/SKILL.md +1 -1
- package/dist/agent-src/skills/threat-modeling/SKILL.md +0 -3
- package/dist/agent-src/skills/token-optimizer/SKILL.md +3 -0
- package/dist/agent-src/skills/typography-system/SKILL.md +3 -0
- package/dist/agent-src/skills/ui-component-architect/SKILL.md +17 -1
- package/dist/agent-src/skills/upstream-contribute/SKILL.md +3 -0
- package/dist/agent-src/skills/validate-feature-fit/SKILL.md +3 -0
- package/dist/agent-src/skills/verify-completion-evidence/SKILL.md +2 -2
- package/dist/agent-src/skills/wireframe/SKILL.md +3 -0
- package/dist/agent-src/skills/wireframe/references/story-beat-ledger.schema.json +115 -0
- package/dist/agent-src/skills/workspace-link/SKILL.md +131 -0
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/playbook.md +75 -0
- package/dist/agent-src/templates/roadmaps.md +37 -0
- package/dist/agent-src/templates/scripts/check_playbook_invokes.ts +231 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +24 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/polish.ts +2 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/review.ts +216 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +159 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/stack_bundles.ts +73 -4
- package/dist/agent-src/templates/scripts/work_engine/stack/detect.ts +325 -40
- package/dist/cli/commands/uiAudit.js +221 -0
- package/dist/cli/commands/uiRender.js +206 -0
- package/dist/cli/main.js +22 -1
- package/dist/cli/mcp/content.js +64 -1
- package/dist/cli/mcp/dispatch.js +175 -10
- package/dist/cli/registry.js +3 -0
- package/dist/cli-delegate/{chunk-G23AT6GD.js → chunk-DMSZHXZS.js} +57 -1
- package/dist/cli-delegate/{chunk-77GR3VD4.js → chunk-FF7WAFMR.js} +58 -3
- package/dist/cli-delegate/{chunk-YM4GZDJG.js → chunk-JCW7ZLHK.js} +10 -0
- package/dist/cli-delegate/{chunk-H4VIVD4C.js → chunk-JJA2QEWA.js} +413 -391
- package/dist/cli-delegate/{chunk-PLSG6UL5.js → chunk-K4FFODTS.js} +341 -204
- package/dist/cli-delegate/{chunk-B2ERU2VA.js → chunk-WOKWX5PL.js} +1 -1
- package/dist/cli-delegate/cmd_brand_status.js +8 -6
- package/dist/cli-delegate/cmd_conformance.js +3 -3
- package/dist/cli-delegate/cmd_doctor.js +3 -3
- package/dist/cli-delegate/cmd_export.js +4 -4
- package/dist/cli-delegate/cmd_handoff.js +1 -1
- package/dist/cli-delegate/cmd_preflight.js +2 -2
- package/dist/cli-delegate/cmd_prune.js +4 -4
- package/dist/cli-delegate/cmd_session_recycle.js +70 -9
- package/dist/cli-delegate/cmd_settings_migrate.js +4 -4
- package/dist/cli-delegate/cmd_settings_set.js +1 -1
- package/dist/cli-delegate/cmd_sync.js +4 -4
- package/dist/cli-delegate/cmd_uninstall.js +4 -4
- package/dist/cli-delegate/cmd_validate.js +4 -4
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +362 -127
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +4 -4
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +18 -8
- package/dist/discovery/trust-report.md +3 -3
- package/dist/discovery/workspaces.json +16 -6
- package/dist/hooks/dispatch.js +2575 -1472
- package/dist/install/install.mjs +800 -708
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +1685 -1250
- package/dist/router.json +1 -1
- package/dist/scripts/_lib/lean_projection_mode.js +40 -0
- package/dist/scripts/_lib/scoped_projection.js +84 -0
- package/dist/scripts/_lib/ui_surface.js +89 -0
- package/dist/scripts/condense.js +6 -10
- package/dist/scripts/project_thin_rules.js +40 -2
- package/dist/server/schemas/settings.js +6 -0
- package/dist/shared/skillRanking.js +159 -0
- package/docs/contracts/provider-lifecycle.md +47 -18
- package/docs/contracts/settings-classes.md +35 -5
- package/docs/guidelines/agent-infra/context-hygiene-mechanics.md +49 -0
- package/docs/guidelines/agent-infra/downstream-changes-mechanics.md +91 -0
- package/docs/guidelines/agent-infra/evaluator-independence-mechanics.md +92 -0
- package/docs/guidelines/agent-infra/minimal-safe-diff-mechanics.md +45 -1
- package/docs/guidelines/agent-infra/roadmap-deferred-resolution-provenance.md +54 -0
- package/docs/guidelines/code-clarity.md +21 -0
- package/docs/guidelines/design-antipatterns.md +4 -2
- package/docs/guidelines/design-asset-discipline.md +38 -0
- package/docs/guidelines/design-fidelity-mechanics.md +45 -29
- package/docs/guidelines/design-handover-extraction.md +35 -5
- package/docs/guidelines/design-modes.md +41 -1
- package/docs/guidelines/monorepo-antipatterns.md +141 -0
- package/docs/guidelines/redundancy-taxonomy.md +180 -0
- package/llms.txt +50 -39
- package/package.json +6 -2
- package/src/agent-src/templates/scripts/check_playbook_invokes.ts +231 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +24 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui/polish.ts +2 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui/review.ts +216 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +159 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui/stack_bundles.ts +73 -4
- package/src/agent-src/templates/scripts/work_engine/stack/detect.ts +325 -40
- package/src/config/agent-settings.template.yml +44 -0
- package/src/config/assurance-capability-registry.json +223 -0
- package/src/config/assurance-threshold-budget.json +65 -0
- package/src/config/budgets.yml +19 -0
- package/src/config/ci-local-parity.yml +29 -0
- package/src/config/discovery/prompt-patterns.yml +56 -0
- package/src/config/discovery/unassigned-artefacts.yml +2 -0
- package/src/config/dispatch-economy-metrics.json +4 -2
- package/src/config/estate-count-budget.json +8 -3
- package/src/config/evaluator-budgets.json +14 -14
- package/src/config/gate-coverage.yml +392 -8
- package/src/config/gate-violation-baselines.json +76 -72
- package/src/config/hook-latency-budget.json +1 -0
- package/src/config/hook-token-budget.json +137 -125
- package/src/config/pack-size-budget.json +39 -10
- package/src/config/preamble-payload-budget.json +97 -71
- package/src/config/quorum-attendance-budget.json +12 -4
- package/src/config/routing-coverage-seed.json +29 -0
- package/src/config/rule-activation-census.json +7 -3
- package/src/config/rule-enforcement-baseline.json +0 -1
- package/src/config/rule-stub-ceilings.json +112 -91
- package/src/config/suggestion-capture.json +28 -0
- package/src/config/surface-matrix.yml +21 -2
- package/src/config/web-launch-readiness.json +188 -0
- package/src/scripts/_cli/cmd_doctor.ts +15 -16
- package/src/scripts/_cli/doctor_install_mode.ts +49 -0
- package/src/scripts/_cli/doctor_overrides.ts +154 -0
- package/src/scripts/_dispatch.bash +17 -0
- package/src/scripts/_lib/as_of.ts +412 -0
- package/src/scripts/_lib/exec_evidence.ts +7 -0
- package/src/scripts/_lib/gate_baseline.ts +150 -1
- package/src/scripts/_lib/hook_settings.ts +33 -0
- package/src/scripts/_lib/host_listing_model.ts +192 -0
- package/src/scripts/_lib/lean_projection_mode.ts +44 -0
- package/src/scripts/_lib/mcp_bridge.ts +199 -0
- package/src/scripts/_lib/review_independence.ts +62 -10
- package/src/scripts/_lib/rule_injection.ts +239 -0
- package/src/scripts/_lib/run_checkpoint.ts +54 -1
- package/src/scripts/_lib/scoped_projection.ts +96 -0
- package/src/scripts/_lib/session_register.ts +44 -2
- package/src/scripts/_lib/skill_catalogue.ts +38 -2
- package/src/scripts/_lib/skill_estate.ts +115 -0
- package/src/scripts/_lib/transcript_reads.ts +207 -0
- package/src/scripts/_lib/ui_authority.ts +343 -0
- package/src/scripts/ai-video/adapters/fal.sh +8 -3
- package/src/scripts/ai-video/adapters/gemini-veo.sh +10 -0
- package/src/scripts/ai-video/adapters/higgsfield.sh +10 -2
- package/src/scripts/ai-video/adapters/kling.sh +10 -0
- package/src/scripts/ai-video/adapters/sora.sh +10 -0
- package/src/scripts/ai-video/lib/calibrate-cost.sh +145 -0
- package/src/scripts/ai-video/lib/model-capabilities/README.md +53 -7
- package/src/scripts/ai-video/lib/model-capabilities/comfyui.json +15 -3
- package/src/scripts/ai-video/lib/model-capabilities/fal.json +36 -6
- package/src/scripts/ai-video/lib/model-capabilities/gemini-veo.json +23 -0
- package/src/scripts/ai-video/lib/model-capabilities/higgsfield.json +23 -0
- package/src/scripts/ai-video/lib/model-capabilities/kling.json +23 -0
- package/src/scripts/ai-video/lib/model-capabilities/musetalk.json +8 -2
- package/src/scripts/ai-video/lib/model-capabilities/replicate.json +36 -6
- package/src/scripts/ai-video/lib/model-capabilities/sora.json +45 -0
- package/src/scripts/ai-video/lib/model-capabilities/syncso.json +8 -2
- package/src/scripts/ai-video/lib/parse-blueprint.sh +52 -5
- package/src/scripts/ai-video/lib/resume-scan.sh +92 -3
- package/src/scripts/ai-video/lib/seam-plan.sh +212 -0
- package/src/scripts/ai-video/smoke-trace.sh +450 -2
- package/src/scripts/ai-video/stitch.sh +191 -10
- package/src/scripts/ai-video/test-pipeline.sh +84 -6
- package/src/scripts/ai_council/argument_exhaustion.ts +130 -0
- package/src/scripts/ai_council/cli_agency_bounds.ts +139 -0
- package/src/scripts/ai_council/cli_least_agency_canary.ts +347 -0
- package/src/scripts/ai_council/clients.ts +3 -2
- package/src/scripts/ai_council/consensus.ts +63 -6
- package/src/scripts/ai_council/events_log.ts +46 -1
- package/src/scripts/ai_council/orchestrator.ts +103 -108
- package/src/scripts/ai_council/orchestrator_results.ts +166 -0
- package/src/scripts/ai_council/prompts.ts +12 -5
- package/src/scripts/ai_council/quorum.ts +82 -1
- package/src/scripts/ai_council/quorum_wiring.ts +82 -5
- package/src/scripts/ai_council/stance_tally.ts +22 -0
- package/src/scripts/bench_hook_latency.ts +62 -0
- package/src/scripts/build_proof.ts +12 -1
- package/src/scripts/capture_skill_catalogue.ts +21 -0
- package/src/scripts/check_always_budget.ts +2 -1
- package/src/scripts/check_augmentignore.ts +2 -1
- package/src/scripts/check_beta_review_markers.ts +2 -1
- package/src/scripts/check_bundle_path_leakage.ts +162 -7
- package/src/scripts/check_command_examples.ts +557 -0
- package/src/scripts/check_composite_arming.ts +364 -0
- package/src/scripts/check_corpus_staleness.ts +2 -1
- package/src/scripts/check_council_pin_staleness.ts +3 -1
- package/src/scripts/check_enforcement_coverage.ts +116 -3
- package/src/scripts/check_enforcement_denominator.ts +365 -0
- package/src/scripts/check_estate_count.ts +122 -3
- package/src/scripts/check_gate_coverage.ts +2 -1
- package/src/scripts/check_hook_bundle_freshness.ts +13 -1
- package/src/scripts/check_knowledge_cards.ts +2 -1
- package/src/scripts/check_knowledge_pages.ts +3 -2
- package/src/scripts/check_memory.ts +2 -1
- package/src/scripts/check_no_automerge_key.ts +287 -0
- package/src/scripts/check_pack_conformance_fixture.ts +565 -0
- package/src/scripts/check_preamble_payload_budget.ts +30 -3
- package/src/scripts/check_proposal.ts +2 -1
- package/src/scripts/check_reach_staleness.ts +2 -1
- package/src/scripts/check_release_adjacent_health.ts +2 -1
- package/src/scripts/check_release_pr_shape.ts +5 -0
- package/src/scripts/check_review_schema.ts +34 -1
- package/src/scripts/check_roadmap_trackable.ts +48 -3
- package/src/scripts/check_routing_coverage.ts +352 -0
- package/src/scripts/check_score_contract.ts +505 -0
- package/src/scripts/check_skill_admissions.ts +514 -0
- package/src/scripts/check_source_size_budget.ts +2 -1
- package/src/scripts/check_standing_payload_delta.ts +505 -0
- package/src/scripts/check_trigger_evals.ts +2 -1
- package/src/scripts/check_web_launch_readiness.ts +705 -0
- package/src/scripts/classify_change_risk.ts +281 -0
- package/src/scripts/compute_skill_tiers.ts +186 -0
- package/src/scripts/condense.ts +8 -13
- package/src/scripts/council_attendance_metrics.ts +183 -0
- package/src/scripts/council_cli.ts +10 -8
- package/src/scripts/council_parse_rate.ts +116 -0
- package/src/scripts/derive_playbooks.ts +406 -0
- package/src/scripts/description_route_check.ts +494 -0
- package/src/scripts/design_slop_rules.ts +56 -2
- package/src/scripts/dispatch_r2_reviewer.ts +16 -0
- package/src/scripts/frontend_corpus_hash.ts +116 -0
- package/src/scripts/grade_target_readiness.ts +478 -0
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +124 -16
- package/src/scripts/hooks/concern_registry.ts +6 -0
- package/src/scripts/hooks/design_pass_hook.ts +356 -0
- package/src/scripts/hooks/rtk_wrap_hook.ts +30 -7
- package/src/scripts/hooks/rule_inject_hook.ts +318 -0
- package/src/scripts/hooks/suggestion_capture_hook.ts +368 -0
- package/src/scripts/hot_context_hook.ts +74 -7
- package/src/scripts/install.ts +40 -89
- package/src/scripts/lint_adapter_tier.ts +663 -0
- package/src/scripts/lint_archived_skills.ts +93 -0
- package/src/scripts/lint_budget_ownership.ts +56 -5
- package/src/scripts/lint_deterministic_time.ts +470 -0
- package/src/scripts/lint_framework_leakage.ts +5 -0
- package/src/scripts/lint_handoffs.ts +525 -1
- package/src/scripts/lint_judge_prompt_expectation.ts +155 -0
- package/src/scripts/lint_marketplace.ts +88 -0
- package/src/scripts/lint_media_policy_linkage.ts +140 -1
- package/src/scripts/lint_one_off_age.ts +6 -1
- package/src/scripts/lint_override_kernel_guard.ts +87 -5
- package/src/scripts/lint_roadmap_complexity.ts +56 -0
- package/src/scripts/lint_rule_enforcement_declaration.ts +24 -7
- package/src/scripts/lint_rule_norm_pin.ts +321 -0
- package/src/scripts/lint_skill_trigger_corpus.ts +349 -0
- package/src/scripts/lint_spawn_payload.ts +42 -5
- package/src/scripts/lint_symptom_intake.ts +2 -1
- package/src/scripts/mcp_parity_smoke.ts +30 -4
- package/src/scripts/mcp_render.ts +66 -1
- package/src/scripts/mcp_tool_fingerprint.ts +241 -0
- package/src/scripts/measure_risk_class_drift.ts +140 -0
- package/src/scripts/measure_skill_ranker_baseline.ts +212 -0
- package/src/scripts/media/lib/adapter-common.sh +211 -1
- package/src/scripts/media/lib/adapter-contract.md +74 -6
- package/src/scripts/model_rule_injection.ts +907 -0
- package/src/scripts/pack_install_smoke.ts +363 -0
- package/src/scripts/pr_conflict_census.ts +187 -0
- package/src/scripts/project_thin_rules.ts +45 -2
- package/src/scripts/release.ts +66 -860
- package/src/scripts/release_drill.ts +59 -3
- package/src/scripts/release_env.ts +298 -0
- package/src/scripts/release_publication.ts +720 -0
- package/src/scripts/report_pack_delta.ts +204 -0
- package/src/scripts/roadmap_context.ts +778 -0
- package/src/scripts/schemas/fidelity-measurement-sheet.schema.json +169 -0
- package/src/scripts/schemas/rule.schema.json +24 -2
- package/src/scripts/schemas/skill.schema.json +39 -0
- package/src/scripts/schemas/ui-authority.schema.json +114 -0
- package/src/scripts/select_analysis_mode.ts +112 -0
- package/src/scripts/session_register_hook.ts +29 -3
- package/src/scripts/sessions_cli.ts +67 -3
- package/src/scripts/skill_tools/score_skill_relevance.ts +36 -53
- package/src/scripts/sync_pr_branch.ts +40 -1
- package/src/scripts/token_sink_report.ts +239 -0
- package/src/scripts/trigger_coverage.ts +122 -3
- package/src/scripts/update_counts.ts +7 -3
- package/src/scripts/validate_frontmatter.ts +66 -0
- package/src/server/schemas/settings.ts +10 -0
- package/src/shared/skillRanking.ts +183 -0
- package/dist/agent-src/skills/accessibility-auditor/evals/evals.json +0 -15
- package/dist/agent-src/skills/agent-security-review/evals/triggers.json +0 -52
- package/dist/agent-src/skills/ai-code-blindspots/evals/triggers.json +0 -52
- package/dist/agent-src/skills/analysis-skill-router/evals/evals.json +0 -13
- package/dist/agent-src/skills/brand/evals/triggers.json +0 -17
- package/dist/agent-src/skills/brand-asset-generation/evals/triggers.json +0 -17
- package/dist/agent-src/skills/brand-audit/evals/triggers.json +0 -17
- package/dist/agent-src/skills/brand-identity/evals/triggers.json +0 -17
- package/dist/agent-src/skills/brand-strategy/evals/triggers.json +0 -17
- package/dist/agent-src/skills/brand-to-tokens/evals/triggers.json +0 -17
- package/dist/agent-src/skills/bug-analyzer/evals/evals.json +0 -13
- package/dist/agent-src/skills/canvas-design/evals/triggers.json +0 -17
- package/dist/agent-src/skills/character-consistency/evals/evals.json +0 -16
- package/dist/agent-src/skills/code-intelligence/evals/triggers.json +0 -52
- package/dist/agent-src/skills/code-review/evals/evals.json +0 -100
- package/dist/agent-src/skills/command-routing/evals/evals.json +0 -14
- package/dist/agent-src/skills/complexity-first-planning/evals/triggers.json +0 -17
- package/dist/agent-src/skills/contract-review/evals/triggers.json +0 -17
- package/dist/agent-src/skills/conventional-commits-writing/evals/evals.json +0 -15
- package/dist/agent-src/skills/corpus-grounding/evals/triggers.json +0 -17
- package/dist/agent-src/skills/dashboard-design/evals/evals.json +0 -16
- package/dist/agent-src/skills/dcf-modeling/evals/domain-truth.json +0 -29
- package/dist/agent-src/skills/dcf-modeling/evals/evals.json +0 -20
- package/dist/agent-src/skills/decision-record/evals/evals.json +0 -20
- package/dist/agent-src/skills/decision-record/evals/triggers.json +0 -87
- package/dist/agent-src/skills/design-intelligence/evals/evals.json +0 -14
- package/dist/agent-src/skills/design-intelligence/evals/triggers.json +0 -17
- package/dist/agent-src/skills/design-system-capture/evals/evals.json +0 -15
- package/dist/agent-src/skills/design-tokens/evals/triggers.json +0 -17
- package/dist/agent-src/skills/design-variations/evals/triggers.json +0 -17
- package/dist/agent-src/skills/developer-like-execution/evals/evals.json +0 -16
- package/dist/agent-src/skills/doc-coauthoring/evals/evals.json +0 -16
- package/dist/agent-src/skills/doc-coauthoring/evals/triggers.json +0 -17
- package/dist/agent-src/skills/docx-authoring/evals/triggers.json +0 -52
- package/dist/agent-src/skills/dpa-review/evals/triggers.json +0 -17
- package/dist/agent-src/skills/editorial-calendar/evals/domain-truth.json +0 -16
- package/dist/agent-src/skills/editorial-calendar/evals/evals.json +0 -16
- package/dist/agent-src/skills/eloquent/evals/triggers.json +0 -17
- package/dist/agent-src/skills/estimate-ticket/evals/evals.json +0 -16
- package/dist/agent-src/skills/estimate-ticket/evals/output-schema.yml +0 -20
- package/dist/agent-src/skills/estimate-ticket/evals/triggers.json +0 -19
- package/dist/agent-src/skills/evaluate-llm-feature/evals/triggers.json +0 -52
- package/dist/agent-src/skills/existing-ui-audit/evals/triggers.json +0 -47
- package/dist/agent-src/skills/experiment-loop/evals/output-schema.yml +0 -27
- package/dist/agent-src/skills/experiment-loop/evals/triggers.json +0 -17
- package/dist/agent-src/skills/fe-design/evals/triggers.json +0 -55
- package/dist/agent-src/skills/forecasting/evals/domain-truth.json +0 -29
- package/dist/agent-src/skills/forecasting/evals/evals.json +0 -20
- package/dist/agent-src/skills/forensics-report/evals/triggers.json +0 -17
- package/dist/agent-src/skills/frontend-render-security/evals/triggers.json +0 -52
- package/dist/agent-src/skills/fundraising-narrative/evals/domain-truth.json +0 -16
- package/dist/agent-src/skills/fundraising-narrative/evals/evals.json +0 -16
- package/dist/agent-src/skills/gated-reach/evals/triggers.json +0 -72
- package/dist/agent-src/skills/github-ci/evals/evals.json +0 -25
- package/dist/agent-src/skills/history-design/evals/triggers.json +0 -17
- package/dist/agent-src/skills/html-deck/evals/triggers.json +0 -17
- package/dist/agent-src/skills/humanizer/evals/strip_fixtures.json +0 -57
- package/dist/agent-src/skills/humanizer/evals/triggers.json +0 -17
- package/dist/agent-src/skills/iconography/evals/triggers.json +0 -17
- package/dist/agent-src/skills/image-analyser/evals/triggers.json +0 -17
- package/dist/agent-src/skills/image-creator/evals/triggers.json +0 -17
- package/dist/agent-src/skills/image-editing/evals/triggers.json +0 -17
- package/dist/agent-src/skills/image-generation/evals/triggers.json +0 -17
- package/dist/agent-src/skills/image-provider-routing/evals/triggers.json +0 -17
- package/dist/agent-src/skills/incident-commander/evals/domain-truth.json +0 -16
- package/dist/agent-src/skills/incident-commander/evals/evals.json +0 -20
- package/dist/agent-src/skills/judge-artifact-completeness/evals/triggers.json +0 -17
- package/dist/agent-src/skills/judge-injection-defense/evals/triggers.json +0 -17
- package/dist/agent-src/skills/judge-synthesis/evals/triggers.json +0 -17
- package/dist/agent-src/skills/launch-readiness/evals/evals.json +0 -21
- package/dist/agent-src/skills/learning-tutor/evals/triggers.json +0 -52
- package/dist/agent-src/skills/legal-intake-triage/evals/triggers.json +0 -17
- package/dist/agent-src/skills/legal-practice-profile/evals/triggers.json +0 -17
- package/dist/agent-src/skills/license-compliance-audit/evals/triggers.json +0 -52
- package/dist/agent-src/skills/license-compliance-borrow-check/evals/triggers.json +0 -52
- package/dist/agent-src/skills/license-compliance-credits/evals/triggers.json +0 -52
- package/dist/agent-src/skills/llm-provider-knowledge/evals/triggers.json +0 -20
- package/dist/agent-src/skills/logging-monitoring/evals/evals.json +0 -16
- package/dist/agent-src/skills/logo-generation/evals/triggers.json +0 -17
- package/dist/agent-src/skills/messaging-architecture/evals/domain-truth.json +0 -16
- package/dist/agent-src/skills/messaging-architecture/evals/evals.json +0 -16
- package/dist/agent-src/skills/nda-triage/evals/triggers.json +0 -17
- package/dist/agent-src/skills/pdf-tools/evals/triggers.json +0 -52
- package/dist/agent-src/skills/perf-feedback-craft/evals/evals.json +0 -16
- package/dist/agent-src/skills/persona-improvement/evals/triggers.json +0 -52
- package/dist/agent-src/skills/php-coder/evals/triggers.json +0 -17
- package/dist/agent-src/skills/prediction-pool-optimizer/evals/triggers.json +0 -21
- package/dist/agent-src/skills/prompt-engineering-image/evals/triggers.json +0 -17
- package/dist/agent-src/skills/prompt-engineering-patterns/evals/evals.json +0 -16
- package/dist/agent-src/skills/prompt-validator/evals/triggers.json +0 -17
- package/dist/agent-src/skills/quality-tools/evals/evals.json +0 -15
- package/dist/agent-src/skills/reasoning-orchestrator/evals/triggers.json +0 -17
- package/dist/agent-src/skills/refine-prompt/evals/evals.json +0 -16
- package/dist/agent-src/skills/refine-ticket/evals/evals.json +0 -16
- package/dist/agent-src/skills/refine-ticket/evals/output-schema.yml +0 -16
- package/dist/agent-src/skills/refine-ticket/evals/triggers.json +0 -17
- package/dist/agent-src/skills/release-comms/evals/evals.json +0 -16
- package/dist/agent-src/skills/rice-prioritization/evals/evals.json +0 -20
- package/dist/agent-src/skills/runway-cognition/evals/domain-truth.json +0 -29
- package/dist/agent-src/skills/runway-cognition/evals/evals.json +0 -20
- package/dist/agent-src/skills/scenario-modeling/evals/domain-truth.json +0 -29
- package/dist/agent-src/skills/scenario-modeling/evals/evals.json +0 -20
- package/dist/agent-src/skills/schema-review/evals/triggers.json +0 -17
- package/dist/agent-src/skills/screenshot-hygiene/evals/triggers.json +0 -52
- package/dist/agent-src/skills/security-maturity-assessment/evals/triggers.json +0 -52
- package/dist/agent-src/skills/skill-writing/evals/triggers.json +0 -17
- package/dist/agent-src/skills/spreadsheet-authoring/evals/triggers.json +0 -47
- package/dist/agent-src/skills/subagent-orchestration/evals/evals.json +0 -60
- package/dist/agent-src/skills/supply-chain-intake/evals/triggers.json +0 -52
- package/dist/agent-src/skills/systematic-debugging/evals/evals.json +0 -20
- package/dist/agent-src/skills/test-case-discovery/evals/triggers.json +0 -52
- package/dist/agent-src/skills/test-driven-development/evals/evals.json +0 -16
- package/dist/agent-src/skills/threat-modeling/evals/evals.json +0 -21
- package/dist/agent-src/skills/typography-system/evals/evals.json +0 -14
- package/dist/agent-src/skills/typography-system/evals/triggers.json +0 -17
- package/dist/agent-src/skills/unit-economics-modeling/evals/domain-truth.json +0 -40
- package/dist/agent-src/skills/unit-economics-modeling/evals/evals.json +0 -24
- package/dist/agent-src/skills/verify-completion-evidence/evals/evals.json +0 -16
- package/dist/agent-src/skills/verify-repair-loop/evals/output-schema.yml +0 -20
- package/dist/agent-src/skills/verify-repair-loop/evals/triggers.json +0 -17
- package/dist/agent-src/skills/vision-articulation/evals/evals.json +0 -16
- package/dist/agent-src/skills/voice-and-tone-design/evals/evals.json +0 -16
- package/dist/agent-src/skills/wireframe/evals/triggers.json +0 -17
- package/dist/agent-src/skills/worktree-lifecycle/evals/evals.json +0 -38
- package/dist/agent-src/skills/worktree-lifecycle/evals/triggers.json +0 -52
- package/dist/cli/agent-config.js.map +0 -1
- package/dist/cli/bash/runBash.js.map +0 -1
- package/dist/cli/commands/commands.js.map +0 -1
- package/dist/cli/commands/config.js.map +0 -1
- package/dist/cli/commands/doctorShell.js.map +0 -1
- package/dist/cli/commands/mcpServer.js.map +0 -1
- package/dist/cli/commands/packs.js.map +0 -1
- package/dist/cli/commands/profiles.js.map +0 -1
- package/dist/cli/commands/recordTriggerEval.js.map +0 -1
- package/dist/cli/commands/rtkDetect.js.map +0 -1
- package/dist/cli/commands/settings.js.map +0 -1
- package/dist/cli/commands/uiServe.js.map +0 -1
- package/dist/cli/commands/versions.js.map +0 -1
- package/dist/cli/commands/workspaces.js.map +0 -1
- package/dist/cli/configRoot.js.map +0 -1
- package/dist/cli/discovery/loadManifest.js.map +0 -1
- package/dist/cli/firstRunNotice.js.map +0 -1
- package/dist/cli/help.js.map +0 -1
- package/dist/cli/initRouting.js.map +0 -1
- package/dist/cli/log/logger.js.map +0 -1
- package/dist/cli/main.js.map +0 -1
- package/dist/cli/mcp/content.js.map +0 -1
- package/dist/cli/mcp/dispatch.js.map +0 -1
- package/dist/cli/mcp/stdio.js.map +0 -1
- package/dist/cli/paths.js.map +0 -1
- package/dist/cli/python/knowledge_ingest.js.map +0 -1
- package/dist/cli/python/workspace_analytics.js.map +0 -1
- package/dist/cli/python/workspace_crypto.js.map +0 -1
- package/dist/cli/python/workspace_documents.js.map +0 -1
- package/dist/cli/python/workspace_drive.js.map +0 -1
- package/dist/cli/python/workspace_drive_health.js.map +0 -1
- package/dist/cli/python/workspace_explain.js.map +0 -1
- package/dist/cli/python/workspace_hosts.js.map +0 -1
- package/dist/cli/python/workspace_inbox.js.map +0 -1
- package/dist/cli/python/workspace_render.js.map +0 -1
- package/dist/cli/python/workspace_roles.js.map +0 -1
- package/dist/cli/python/workspace_secrets.js.map +0 -1
- package/dist/cli/python/workspace_sessions.js.map +0 -1
- package/dist/cli/python/workspace_skills.js.map +0 -1
- package/dist/cli/registry.js.map +0 -1
- package/dist/install/agentSwitchDetection.js.map +0 -1
- package/dist/install/agentSwitchProfile.js.map +0 -1
- package/dist/install/atomic.js.map +0 -1
- package/dist/install/claudePathsPlan.js.map +0 -1
- package/dist/install/conflict.js.map +0 -1
- package/dist/install/detect.js.map +0 -1
- package/dist/install/emit_host_rules_cli.js.map +0 -1
- package/dist/install/globalRuleLayers.js.map +0 -1
- package/dist/install/hostLayerFingerprint.js.map +0 -1
- package/dist/install/partitionEligibility.js.map +0 -1
- package/dist/install/paths.js.map +0 -1
- package/dist/install/plan.js.map +0 -1
- package/dist/install/preflight.js.map +0 -1
- package/dist/install/rtkDetection.js.map +0 -1
- package/dist/install/ruleInScope.js.map +0 -1
- package/dist/install/ruleLayerPartition.js.map +0 -1
- package/dist/install/rule_scope.js.map +0 -1
- package/dist/install/rule_scope_cli.js.map +0 -1
- package/dist/install/selectedTools.js.map +0 -1
- package/dist/install/toolDetection.js.map +0 -1
- package/dist/install/txlog.js.map +0 -1
- package/dist/install/types.js.map +0 -1
- package/dist/install/wizard-plan.js.map +0 -1
- package/dist/install/wizardDismissals.js.map +0 -1
- package/dist/scripts/_lib/agent_settings.js.map +0 -1
- package/dist/scripts/_lib/agent_src.js.map +0 -1
- package/dist/scripts/_lib/claude_builtin_names.js.map +0 -1
- package/dist/scripts/_lib/claude_plugin.js.map +0 -1
- package/dist/scripts/_lib/claude_settings_hooks.js.map +0 -1
- package/dist/scripts/_lib/compile_time_toggles.js.map +0 -1
- package/dist/scripts/_lib/environment_detector.js.map +0 -1
- package/dist/scripts/_lib/host_launch.js.map +0 -1
- package/dist/scripts/_lib/install_layout.js.map +0 -1
- package/dist/scripts/_lib/installed_lock.js.map +0 -1
- package/dist/scripts/_lib/model_tier.js.map +0 -1
- package/dist/scripts/_lib/prune_empty_dirs.js.map +0 -1
- package/dist/scripts/_lib/scoped_projection.js.map +0 -1
- package/dist/scripts/_lib/script_output.js.map +0 -1
- package/dist/scripts/_lib/spawn_env.js.map +0 -1
- package/dist/scripts/_lib/surface_tiers.js.map +0 -1
- package/dist/scripts/_lib/token_count.js.map +0 -1
- package/dist/scripts/_lib/trigger_eval_floors.js.map +0 -1
- package/dist/scripts/_lib/user_global_paths.js.map +0 -1
- package/dist/scripts/ai_council/modes.js.map +0 -1
- package/dist/scripts/ai_council/transport_resolver.js.map +0 -1
- package/dist/scripts/condense.js.map +0 -1
- package/dist/scripts/project_thin_rules.js.map +0 -1
- package/dist/server/app.js.map +0 -1
- package/dist/server/io/atomicMultiWrite.js.map +0 -1
- package/dist/server/io/atomicWrite.js.map +0 -1
- package/dist/server/io/sharedWriteCheck.js.map +0 -1
- package/dist/server/io/substituteTemplate.js.map +0 -1
- package/dist/server/io/yamlIO.js.map +0 -1
- package/dist/server/nicknameResolver.js.map +0 -1
- package/dist/server/port.js.map +0 -1
- package/dist/server/routes/discovery.js.map +0 -1
- package/dist/server/routes/install.js.map +0 -1
- package/dist/server/routes/ping.js.map +0 -1
- package/dist/server/routes/schema.js.map +0 -1
- package/dist/server/routes/settings.js.map +0 -1
- package/dist/server/routes/settingsChanges.js.map +0 -1
- package/dist/server/routes/userMd.js.map +0 -1
- package/dist/server/routes/wizard.js.map +0 -1
- package/dist/server/routes/workspace.js.map +0 -1
- package/dist/server/schemas/settings.js.map +0 -1
- package/dist/server/serverInfo.js.map +0 -1
- package/dist/server/token.js.map +0 -1
- package/dist/server/writeRoot.js.map +0 -1
- package/dist/shared/capabilities.js.map +0 -1
- package/dist/shared/interactiveContext.js.map +0 -1
- package/dist/shared/nicknamePrefill.js.map +0 -1
- package/dist/shared/settingsAsks.js.map +0 -1
- package/dist/shared/settingsCarveOut.js.map +0 -1
- package/dist/shared/settingsClasses.js.map +0 -1
- package/dist/shared/settingsConsent.js.map +0 -1
- package/dist/shared/settingsSurface.js.map +0 -1
- package/dist/shared/userMd/formAdapter.js.map +0 -1
- package/dist/shared/userMd/schema.js.map +0 -1
- package/dist/shared/userMd/utils.js.map +0 -1
- package/dist/ui/assets/index-Cxgy63kz.js.map +0 -1
- package/src/scripts/_lib/adr_frontmatter.test.ts +0 -365
- package/src/scripts/_lib/adversarial_council_gate.test.ts +0 -112
- package/src/scripts/_lib/adversarial_reconcile.test.ts +0 -197
- package/src/scripts/_lib/auto_dispatch.corpus.test.ts +0 -150
- package/src/scripts/_lib/secret_detector.test.ts +0 -108
- package/src/scripts/_lib/secret_detector_adversarial.test.ts +0 -116
- package/src/scripts/_lib/untrusted_content.test.ts +0 -175
- package/src/scripts/check_secret_leak.test.ts +0 -90
- package/src/scripts/design_slop_rules.test.ts +0 -239
- package/src/scripts/self_review_gate.test.ts +0 -296
- package/src/shared/capabilities.test.ts +0 -43
|
@@ -8,12 +8,53 @@
|
|
|
8
8
|
#
|
|
9
9
|
# Usage:
|
|
10
10
|
# stitch.sh <manifest.json> <output.mp4>
|
|
11
|
+
# [--mode cut|handoff]
|
|
12
|
+
# [--xfade <seconds>]
|
|
11
13
|
# [--skip-scene <id> ...]
|
|
12
14
|
# [--abort-on-missing | --continue]
|
|
13
15
|
#
|
|
14
|
-
#
|
|
15
|
-
#
|
|
16
|
-
#
|
|
16
|
+
# Modes:
|
|
17
|
+
# --mode cut (DEFAULT) `ffmpeg -f concat -c copy`. Stream copy, no
|
|
18
|
+
# generation loss, no filtergraph. Byte-for-byte the
|
|
19
|
+
# behaviour this script has always had; passing the flag
|
|
20
|
+
# explicitly changes nothing.
|
|
21
|
+
# --mode handoff Re-encode path (`libx264 -crf 20 -g 8 +faststart -an`)
|
|
22
|
+
# for continuity chains, where clip i+1 was conditioned on
|
|
23
|
+
# the rendered last frame of clip i. Video only: `-an`
|
|
24
|
+
# DROPS every audio track, which is stated on stderr on
|
|
25
|
+
# every run rather than discovered in the output.
|
|
26
|
+
#
|
|
27
|
+
# --xfade <s> Only valid with `--mode handoff`; ceiling 0.25 s. A short
|
|
28
|
+
# fade applied ONLY at seams whose manifest row says
|
|
29
|
+
# `continuity: handoff|connector` — insurance against a
|
|
30
|
+
# visible pop, never a transition effect. Cut seams in the
|
|
31
|
+
# same run stay hard cuts. Offsets are computed from
|
|
32
|
+
# ffprobe'd durations, not from the manifest's declared
|
|
33
|
+
# ones: the accumulated-length-minus-fade arithmetic is the
|
|
34
|
+
# classic trap here and a declared duration that is 40 ms
|
|
35
|
+
# off silently shifts every later seam.
|
|
36
|
+
#
|
|
37
|
+
# NOT a flag: --crossfade. It is parsed and REFUSED (exit 2) in EVERY mode.
|
|
38
|
+
# See "Refused flags" below — it is listed so a caller who read the old usage
|
|
39
|
+
# line gets an error instead of a hard cut. `--mode handoff --xfade <s>` is
|
|
40
|
+
# the supported way to ask for a fade.
|
|
41
|
+
#
|
|
42
|
+
# port_invariants — what must survive a re-implementation:
|
|
43
|
+
# 1. hard-cut default — `--mode cut` is the default and stream-copies
|
|
44
|
+
# (`-c copy`); a port that re-encodes by default has changed the output
|
|
45
|
+
# of every existing caller without telling anyone.
|
|
46
|
+
# 2. refusal over silent downgrade — an unimplemented or out-of-bounds
|
|
47
|
+
# request exits non-zero BEFORE any work, and never falls through to a
|
|
48
|
+
# near-miss (`--crossfade`, `--xfade` above 0.25 s, `--xfade` in cut
|
|
49
|
+
# mode, an unknown flag, a missing clip). Reporting success for output
|
|
50
|
+
# the caller did not ask for is the one failure this script exists to
|
|
51
|
+
# not have.
|
|
52
|
+
# 3. handoff frame = rendered frame — a handoff seam joins clips where the
|
|
53
|
+
# later one was conditioned on the earlier one's RENDERED last frame,
|
|
54
|
+
# never on its own still. A port that re-conditions from the source
|
|
55
|
+
# still produces a plausible-looking chain that does not actually
|
|
56
|
+
# continue the shot.
|
|
57
|
+
# Contract: docs/contracts/skill-bundled-assets.md § Port invariants.
|
|
17
58
|
#
|
|
18
59
|
# Failure semantics:
|
|
19
60
|
# - Missing clip → fail loud with scene_id and re-render hint
|
|
@@ -40,6 +81,10 @@
|
|
|
40
81
|
# only --skip-scene and --continue and rejects anything else. So the
|
|
41
82
|
# honest state is a refusal, not a silent downgrade and not a
|
|
42
83
|
# filtergraph shipped into a script with no test harness.
|
|
84
|
+
# The re-encode path this refusal used to ask for now exists as
|
|
85
|
+
# `--mode handoff` (+ optional `--xfade <s>`), with a test harness
|
|
86
|
+
# under tests/scripts/. The refusal stays: `--crossfade` named a
|
|
87
|
+
# transition on the stream-copy path, which is still impossible.
|
|
43
88
|
|
|
44
89
|
set -euo pipefail
|
|
45
90
|
|
|
@@ -58,27 +103,59 @@ esac
|
|
|
58
103
|
MANIFEST="${1:-}"
|
|
59
104
|
OUTPUT="${2:-}"
|
|
60
105
|
[ -n "${MANIFEST}" ] && [ -n "${OUTPUT}" ] \
|
|
61
|
-
|| aiv_die 2 "usage: stitch.sh <manifest.json> <output.mp4> [--skip-scene <id>] [--abort-on-missing|--continue]"
|
|
106
|
+
|| aiv_die 2 "usage: stitch.sh <manifest.json> <output.mp4> [--mode cut|handoff] [--xfade <seconds>] [--skip-scene <id>] [--abort-on-missing|--continue]"
|
|
62
107
|
[ -r "${MANIFEST}" ] || aiv_die 2 "manifest not readable: ${MANIFEST}"
|
|
63
108
|
shift 2 || true
|
|
64
109
|
|
|
65
110
|
SKIP_IDS=""
|
|
66
111
|
MISSING_POLICY="abort"
|
|
112
|
+
MODE="cut"
|
|
113
|
+
XFADE=""
|
|
114
|
+
XFADE_MAX="0.25"
|
|
67
115
|
while [ "$#" -gt 0 ]; do
|
|
68
116
|
case "$1" in
|
|
69
117
|
--skip-scene) SKIP_IDS="${SKIP_IDS} ${2:-}"; shift 2 ;;
|
|
70
118
|
--abort-on-missing) MISSING_POLICY="abort"; shift ;;
|
|
71
119
|
--continue) MISSING_POLICY="continue"; shift ;;
|
|
120
|
+
--mode) MODE="${2:-}"; shift 2 ;;
|
|
121
|
+
--xfade) XFADE="${2:-}"; shift 2 ;;
|
|
72
122
|
--crossfade)
|
|
73
123
|
# Refused HERE — before the dry-run branch, before ffmpeg, before any
|
|
74
124
|
# output. The old code warned after the dry-run exit and then concatenated
|
|
75
125
|
# anyway, so a caller asking for a crossfade got a hard cut and exit 0.
|
|
76
|
-
aiv_die 2 "stitch.sh: --crossfade is not implemented and will not be silently downgraded. The output path is 'ffmpeg -f concat -c copy', and stream copy precludes any filtergraph, so xfade/acrossfade
|
|
126
|
+
aiv_die 2 "stitch.sh: --crossfade is not implemented and will not be silently downgraded. The output path of --mode cut is 'ffmpeg -f concat -c copy', and stream copy precludes any filtergraph, so xfade/acrossfade cannot exist there. Re-run without --crossfade for a hard-cut concat, or use '--mode handoff --xfade <seconds>' (ceiling ${XFADE_MAX}s) for the re-encode path, which applies the fade only at seams whose manifest row says continuity: handoff|connector."
|
|
77
127
|
;;
|
|
78
128
|
*) aiv_die 2 "stitch.sh: unknown flag '$1'" ;;
|
|
79
129
|
esac
|
|
80
130
|
done
|
|
81
131
|
|
|
132
|
+
case "${MODE}" in
|
|
133
|
+
cut|handoff) ;;
|
|
134
|
+
*) aiv_die 2 "stitch.sh: unknown --mode '${MODE}' (expected cut|handoff)" ;;
|
|
135
|
+
esac
|
|
136
|
+
|
|
137
|
+
if [ -n "${XFADE}" ]; then
|
|
138
|
+
# Refused, never ignored: an --xfade the run cannot honour would otherwise
|
|
139
|
+
# deliver a hard cut and report success — the exact shape of the --crossfade
|
|
140
|
+
# defect above.
|
|
141
|
+
[ "${MODE}" = "handoff" ] \
|
|
142
|
+
|| aiv_die 2 "stitch.sh: --xfade requires '--mode handoff' — the cut path is 'ffmpeg -f concat -c copy' and stream copy precludes a filtergraph. Re-run with --mode handoff, or drop --xfade for a hard-cut concat."
|
|
143
|
+
printf '%s' "${XFADE}" | grep -Eq '^[0-9]+(\.[0-9]+)?$' \
|
|
144
|
+
|| aiv_die 2 "stitch.sh: --xfade must be a non-negative number of seconds, got '${XFADE}'"
|
|
145
|
+
awk -v x="${XFADE}" -v m="${XFADE_MAX}" 'BEGIN { exit !(x > 0 && x <= m) }' \
|
|
146
|
+
|| aiv_die 2 "stitch.sh: --xfade ${XFADE}s is outside the allowed range (0 < s <= ${XFADE_MAX}) — a longer fade is a transition effect, not seam insurance"
|
|
147
|
+
fi
|
|
148
|
+
|
|
149
|
+
# The plan/success JSON gains a `mode` key ONLY in handoff mode. Even an
|
|
150
|
+
# additive key changes the stdout every existing caller reads, and "cut behaves
|
|
151
|
+
# as it does today" is the invariant that path is held to. Absent means cut.
|
|
152
|
+
MODE_JSON=""
|
|
153
|
+
if [ "${MODE}" = "handoff" ]; then
|
|
154
|
+
MODE_JSON=',"mode":"handoff"'
|
|
155
|
+
printf 'stitch: --mode handoff RE-ENCODES (libx264 -crf 20 -g 8 +faststart -an) — the cut path stream-copies. Audio is dropped by -an; mux a bed afterwards if the chain needs one.\n' >&2
|
|
156
|
+
[ "${DRYRUN_FLAG}" -eq 0 ] && aiv_require_cmd ffprobe
|
|
157
|
+
fi
|
|
158
|
+
|
|
82
159
|
skip_match() {
|
|
83
160
|
local id="$1" s
|
|
84
161
|
for s in ${SKIP_IDS}; do
|
|
@@ -92,6 +169,11 @@ WORK_DIR="$(mktemp -d -t aiv-stitch-XXXXXX)"
|
|
|
92
169
|
trap 'rm -rf "${WORK_DIR}"' EXIT
|
|
93
170
|
CONCAT_LIST="${WORK_DIR}/concat.txt"
|
|
94
171
|
: > "${CONCAT_LIST}"
|
|
172
|
+
# Ordered `<continuity>\t<validated path>` rows — the handoff filtergraph needs
|
|
173
|
+
# to know WHICH seams may fade, and the concat demuxer list cannot carry that.
|
|
174
|
+
# Written only in handoff mode, so the cut path is untouched.
|
|
175
|
+
SEQ_LIST="${WORK_DIR}/seq.tsv"
|
|
176
|
+
: > "${SEQ_LIST}"
|
|
95
177
|
|
|
96
178
|
# Accept both bare-array manifests and the documented object shape
|
|
97
179
|
# (`{ "scenes": [...] }`). Field names tolerate the legacy
|
|
@@ -107,6 +189,14 @@ while IFS= read -r row; do
|
|
|
107
189
|
clip_path="$(printf '%s' "${row}" | jq -r '.clip_path // .expected_clip')"
|
|
108
190
|
audio_embedded="$(printf '%s' "${row}" | jq -r '.audio_embedded // false')"
|
|
109
191
|
audio_path="$(printf '%s' "${row}" | jq -r '.audio_path // empty')"
|
|
192
|
+
continuity="cut"
|
|
193
|
+
if [ "${MODE}" = "handoff" ]; then
|
|
194
|
+
continuity="$(printf '%s' "${row}" | jq -r '.continuity // "cut"')"
|
|
195
|
+
case "${continuity}" in
|
|
196
|
+
cut|handoff|connector) ;;
|
|
197
|
+
*) aiv_die 2 "stitch.sh: scene=${scene_id} unknown continuity '${continuity}' (expected cut|handoff|connector)" ;;
|
|
198
|
+
esac
|
|
199
|
+
fi
|
|
110
200
|
|
|
111
201
|
case "${clip_path}" in
|
|
112
202
|
/*) ;;
|
|
@@ -155,8 +245,14 @@ while IFS= read -r row; do
|
|
|
155
245
|
-c:v copy -c:a aac -shortest "${muxed}" >/dev/null \
|
|
156
246
|
|| aiv_die 8 "ffmpeg mux failed for scene=${scene_id}"
|
|
157
247
|
printf "file '%s'\n" "${muxed}" >> "${CONCAT_LIST}"
|
|
248
|
+
if [ "${MODE}" = "handoff" ]; then
|
|
249
|
+
printf '%s\t%s\n' "${continuity}" "${muxed}" >> "${SEQ_LIST}"
|
|
250
|
+
fi
|
|
158
251
|
else
|
|
159
252
|
printf "file '%s'\n" "${clip_path}" >> "${CONCAT_LIST}"
|
|
253
|
+
if [ "${MODE}" = "handoff" ]; then
|
|
254
|
+
printf '%s\t%s\n' "${continuity}" "${clip_path}" >> "${SEQ_LIST}"
|
|
255
|
+
fi
|
|
160
256
|
fi
|
|
161
257
|
count=$((count + 1))
|
|
162
258
|
done <<EOF
|
|
@@ -168,12 +264,97 @@ EOF
|
|
|
168
264
|
if [ "${DRYRUN_FLAG}" -eq 1 ]; then
|
|
169
265
|
printf 'stitch: dry-run plan (output=%s, scenes=%d):\n' "${OUTPUT}" "${count}" >&2
|
|
170
266
|
printf '%b' "${plan}" >&2
|
|
171
|
-
printf '{"output":"%s","scenes":%d,"missing":0,"dry_run":true}\n'
|
|
267
|
+
printf '{"output":"%s","scenes":%d,"missing":0,"dry_run":true%s}\n' \
|
|
268
|
+
"${OUTPUT}" "${count}" "${MODE_JSON}"
|
|
172
269
|
exit 0
|
|
173
270
|
fi
|
|
174
271
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
272
|
+
# The re-encode settings are one constant, used by both handoff branches, so a
|
|
273
|
+
# port cannot drift them apart.
|
|
274
|
+
HANDOFF_VCODEC="libx264"
|
|
275
|
+
HANDOFF_ARGS="-crf 20 -g 8 -pix_fmt yuv420p -movflags +faststart -an"
|
|
276
|
+
|
|
277
|
+
_probe_duration() {
|
|
278
|
+
ffprobe -v error -show_entries format=duration -of csv=p=0 "$1" 2>/dev/null \
|
|
279
|
+
| head -1
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
if [ "${MODE}" = "handoff" ]; then
|
|
283
|
+
seq_count="$(wc -l < "${SEQ_LIST}" | tr -d ' ')"
|
|
284
|
+
[ "${seq_count}" -gt 0 ] || aiv_die 7 "stitch: handoff mode found no usable clips"
|
|
285
|
+
|
|
286
|
+
if [ -z "${XFADE}" ] || [ "${seq_count}" -eq 1 ]; then
|
|
287
|
+
# No fade requested (or nothing to fade across): the seams stay hard cuts,
|
|
288
|
+
# the only difference from --mode cut is the re-encode. Same concat demuxer,
|
|
289
|
+
# so clip order and skip handling are shared with the cut path.
|
|
290
|
+
# shellcheck disable=SC2086
|
|
291
|
+
ffmpeg -loglevel error -y -f concat -safe 0 -i "${CONCAT_LIST}" \
|
|
292
|
+
-c:v "${HANDOFF_VCODEC}" ${HANDOFF_ARGS} "${OUTPUT}" >/dev/null \
|
|
293
|
+
|| aiv_die 8 "ffmpeg handoff re-encode failed (manifest=${MANIFEST}, output=${OUTPUT})"
|
|
294
|
+
else
|
|
295
|
+
# Filtergraph path. Every input is normalised to the FIRST clip's frame
|
|
296
|
+
# rate and to yuv420p/SAR 1 — xfade refuses mismatched inputs, and a
|
|
297
|
+
# mismatch here would surface as an opaque filter error rather than as the
|
|
298
|
+
# source-clip problem it is.
|
|
299
|
+
first_clip="$(sed -n '1p' "${SEQ_LIST}" | cut -f2)"
|
|
300
|
+
rate="$(ffprobe -v error -select_streams v:0 -show_entries stream=r_frame_rate \
|
|
301
|
+
-of csv=p=0 "${first_clip}" 2>/dev/null | head -1)"
|
|
302
|
+
[ -n "${rate}" ] || aiv_die 8 "stitch: cannot read frame rate of ${first_clip}"
|
|
303
|
+
|
|
304
|
+
ff_inputs=""
|
|
305
|
+
filter=""
|
|
306
|
+
i=0
|
|
307
|
+
while [ "${i}" -lt "${seq_count}" ]; do
|
|
308
|
+
line_no=$((i + 1))
|
|
309
|
+
p="$(sed -n "${line_no}p" "${SEQ_LIST}" | cut -f2)"
|
|
310
|
+
ff_inputs="${ff_inputs} -i ${p}"
|
|
311
|
+
filter="${filter}[${i}:v]fps=${rate},format=yuv420p,setsar=1,settb=AVTB[n${i}];"
|
|
312
|
+
i=$((i + 1))
|
|
313
|
+
done
|
|
314
|
+
|
|
315
|
+
acc_label="[n0]"
|
|
316
|
+
acc_dur="$(_probe_duration "$(sed -n '1p' "${SEQ_LIST}" | cut -f2)")"
|
|
317
|
+
[ -n "${acc_dur}" ] || aiv_die 8 "stitch: cannot read duration of the first clip"
|
|
318
|
+
faded=0
|
|
319
|
+
i=1
|
|
320
|
+
while [ "${i}" -lt "${seq_count}" ]; do
|
|
321
|
+
line_no=$((i + 1))
|
|
322
|
+
cont="$(sed -n "${line_no}p" "${SEQ_LIST}" | cut -f1)"
|
|
323
|
+
p="$(sed -n "${line_no}p" "${SEQ_LIST}" | cut -f2)"
|
|
324
|
+
dur="$(_probe_duration "${p}")"
|
|
325
|
+
[ -n "${dur}" ] || aiv_die 8 "stitch: cannot read duration of ${p}"
|
|
326
|
+
if [ "${cont}" = "handoff" ] || [ "${cont}" = "connector" ]; then
|
|
327
|
+
# offset = accumulated length so far MINUS the fade; the fade eats the
|
|
328
|
+
# tail of the accumulated stream, so the total shortens by exactly one
|
|
329
|
+
# xfade per faded seam.
|
|
330
|
+
offset="$(awk -v a="${acc_dur}" -v x="${XFADE}" 'BEGIN { printf "%.6f", a - x }')"
|
|
331
|
+
awk -v o="${offset}" 'BEGIN { exit !(o > 0) }' \
|
|
332
|
+
|| aiv_die 7 "stitch: --xfade ${XFADE}s does not fit before seam ${i} (accumulated length ${acc_dur}s)"
|
|
333
|
+
filter="${filter}${acc_label}[n${i}]xfade=transition=fade:duration=${XFADE}:offset=${offset}[x${i}];"
|
|
334
|
+
acc_dur="$(awk -v a="${acc_dur}" -v d="${dur}" -v x="${XFADE}" 'BEGIN { printf "%.6f", a + d - x }')"
|
|
335
|
+
faded=$((faded + 1))
|
|
336
|
+
else
|
|
337
|
+
filter="${filter}${acc_label}[n${i}]concat=n=2:v=1:a=0[x${i}];"
|
|
338
|
+
acc_dur="$(awk -v a="${acc_dur}" -v d="${dur}" 'BEGIN { printf "%.6f", a + d }')"
|
|
339
|
+
fi
|
|
340
|
+
acc_label="[x${i}]"
|
|
341
|
+
i=$((i + 1))
|
|
342
|
+
done
|
|
343
|
+
filter="${filter%;}"
|
|
344
|
+
|
|
345
|
+
printf 'stitch: handoff filtergraph — %d clip(s), %d faded seam(s) at %ss, %d hard cut(s)\n' \
|
|
346
|
+
"${seq_count}" "${faded}" "${XFADE}" "$((seq_count - 1 - faded))" >&2
|
|
347
|
+
|
|
348
|
+
# shellcheck disable=SC2086
|
|
349
|
+
ffmpeg -loglevel error -y ${ff_inputs} -filter_complex "${filter}" \
|
|
350
|
+
-map "${acc_label}" -c:v "${HANDOFF_VCODEC}" ${HANDOFF_ARGS} "${OUTPUT}" >/dev/null \
|
|
351
|
+
|| aiv_die 8 "ffmpeg handoff xfade failed (manifest=${MANIFEST}, output=${OUTPUT})"
|
|
352
|
+
fi
|
|
353
|
+
else
|
|
354
|
+
ffmpeg -loglevel error -y -f concat -safe 0 -i "${CONCAT_LIST}" \
|
|
355
|
+
-c copy "${OUTPUT}" >/dev/null \
|
|
356
|
+
|| aiv_die 8 "ffmpeg concat failed (manifest=${MANIFEST}, output=${OUTPUT})"
|
|
357
|
+
fi
|
|
178
358
|
|
|
179
|
-
printf '{"output":"%s","scenes":%d,"missing":%d}\n'
|
|
359
|
+
printf '{"output":"%s","scenes":%d,"missing":%d%s}\n' \
|
|
360
|
+
"${OUTPUT}" "${count}" "${missing}" "${MODE_JSON}"
|
|
@@ -19,6 +19,10 @@
|
|
|
19
19
|
# PNG magic; pairwise NCC ≥ 0.95 when `compare` is available.
|
|
20
20
|
# When unavailable, asserts byte-identity (the three frames are
|
|
21
21
|
# committed identical for the offline path).
|
|
22
|
+
# 7. end_image refusal: an adapter handed `end_image` for a model whose
|
|
23
|
+
# model-capabilities entry answers `end_frame: null` exits non-zero
|
|
24
|
+
# and names the model — it never drops the image (adapter-contract.md
|
|
25
|
+
# § end_image, exit 12).
|
|
22
26
|
#
|
|
23
27
|
# Exit 0 = all assertions pass; 1 = at least one failure (counted +
|
|
24
28
|
# summarized at the end).
|
|
@@ -47,7 +51,7 @@ require jq || exit 1
|
|
|
47
51
|
printf '\n== test-pipeline.sh — banana-arc golden run (offline) ==\n\n'
|
|
48
52
|
|
|
49
53
|
# ---------------------------------------------------------------- 1
|
|
50
|
-
printf '[1/
|
|
54
|
+
printf '[1/8] parse-blueprint vs. expected.json\n'
|
|
51
55
|
SCENES="01-simple 02-dialogue-native-audio 03-edge-duration"
|
|
52
56
|
for s in $SCENES; do
|
|
53
57
|
actual="$(bash "$ROOT/src/scripts/ai-video/lib/parse-blueprint.sh" "$PROJECT/scenes/$s/blueprint.txt" 2>/dev/null \
|
|
@@ -63,7 +67,7 @@ for s in $SCENES; do
|
|
|
63
67
|
done
|
|
64
68
|
|
|
65
69
|
# ---------------------------------------------------------------- 2
|
|
66
|
-
printf '\n[2/
|
|
70
|
+
printf '\n[2/8] character.json descriptors verbatim in prompt.subject\n'
|
|
67
71
|
SILHOUETTE="$(jq -r '.characters[0].silhouette' "$PROJECT/character.json")"
|
|
68
72
|
PALETTE="$(jq -r '.characters[0].palette' "$PROJECT/character.json")"
|
|
69
73
|
WARDROBE="$(jq -r '.characters[0].wardrobe' "$PROJECT/character.json")"
|
|
@@ -84,7 +88,7 @@ for s in $SCENES; do
|
|
|
84
88
|
done
|
|
85
89
|
|
|
86
90
|
# ---------------------------------------------------------------- 3
|
|
87
|
-
printf '\n[3/
|
|
91
|
+
printf '\n[3/8] audio.* branching matches manifest\n'
|
|
88
92
|
for entry in 01-simple:false 02-dialogue-native-audio:true 03-edge-duration:false; do
|
|
89
93
|
s="${entry%%:*}"
|
|
90
94
|
want="${entry##*:}"
|
|
@@ -98,7 +102,7 @@ for entry in 01-simple:false 02-dialogue-native-audio:true 03-edge-duration:fals
|
|
|
98
102
|
done
|
|
99
103
|
|
|
100
104
|
# ---------------------------------------------------------------- 4
|
|
101
|
-
printf '\n[4/
|
|
105
|
+
printf '\n[4/8] adapter capability declarations\n'
|
|
102
106
|
declare_caps() {
|
|
103
107
|
local adapter="$1"; local expected="$2"
|
|
104
108
|
local out got
|
|
@@ -116,7 +120,7 @@ declare_caps sora "native"
|
|
|
116
120
|
declare_caps kling "none"
|
|
117
121
|
|
|
118
122
|
# ---------------------------------------------------------------- 5
|
|
119
|
-
printf '\n[5/
|
|
123
|
+
printf '\n[5/8] stitch.sh dry-run returns manifest output path\n'
|
|
120
124
|
STITCH_OUT="$(jq -r '.stitch_output' "$PROJECT/manifest.json")"
|
|
121
125
|
stitch_log="$(AIV_DRYRUN=true bash "$ROOT/src/scripts/ai-video/stitch.sh" \
|
|
122
126
|
"$PROJECT/manifest.json" "$PROJECT/$STITCH_OUT" 2>&1 || true)"
|
|
@@ -126,7 +130,7 @@ case "$stitch_log" in
|
|
|
126
130
|
esac
|
|
127
131
|
|
|
128
132
|
# ---------------------------------------------------------------- 6
|
|
129
|
-
printf '\n[6/
|
|
133
|
+
printf '\n[6/8] visual regression (locked.png pairwise)\n'
|
|
130
134
|
PNG_MAGIC="$(printf '\x89PNG\r\n\x1a\n')"
|
|
131
135
|
prev=""
|
|
132
136
|
have_compare=0
|
|
@@ -160,6 +164,80 @@ for s in $SCENES; do
|
|
|
160
164
|
prev="$f"
|
|
161
165
|
done
|
|
162
166
|
|
|
167
|
+
# ---------------------------------------------------------------- 7
|
|
168
|
+
printf '\n[7/8] end_image is refused, never dropped\n'
|
|
169
|
+
END_ADAPTER="kling"
|
|
170
|
+
END_MODEL="kling-v2-master"
|
|
171
|
+
END_MANIFEST="$ROOT/src/scripts/ai-video/lib/model-capabilities/$END_ADAPTER.json"
|
|
172
|
+
|
|
173
|
+
# Precondition: the entry must actually answer end_frame:null, or this case
|
|
174
|
+
# proves nothing. A probed `true` here would make the refusal wrong, not this
|
|
175
|
+
# assertion stale — so it is checked, not assumed.
|
|
176
|
+
end_declared="$(jq -r --arg m "$END_MODEL" \
|
|
177
|
+
'.models[$m] // {} | .end_frame | if . == null then "null" else tostring end' \
|
|
178
|
+
"$END_MANIFEST" 2>/dev/null || echo missing)"
|
|
179
|
+
if [ "$end_declared" = "null" ]; then
|
|
180
|
+
ok "$END_ADAPTER/$END_MODEL declares end_frame=null (unknown)"
|
|
181
|
+
else
|
|
182
|
+
fail "$END_ADAPTER/$END_MODEL declares end_frame=$end_declared — expected null for this case"
|
|
183
|
+
fi
|
|
184
|
+
|
|
185
|
+
end_stdin='{"prompt":{"subject":"a lone figure","action":"turns toward the door"},"duration":5,"end_image":"/tmp/aiv-end-frame.png"}'
|
|
186
|
+
end_out="$(printf '%s' "$end_stdin" \
|
|
187
|
+
| AIV_DRYRUN=true AIV_MODEL="$END_MODEL" \
|
|
188
|
+
bash "$ROOT/src/scripts/ai-video/adapters/$END_ADAPTER.sh" submit 2>&1)"
|
|
189
|
+
end_rc=$?
|
|
190
|
+
|
|
191
|
+
if [ "$end_rc" -eq 0 ]; then
|
|
192
|
+
fail "$END_ADAPTER: end_image was accepted (exit 0) — the image was dropped silently"
|
|
193
|
+
else
|
|
194
|
+
case "$end_out" in
|
|
195
|
+
*"$END_MODEL"*end_frame*|*end_frame*"$END_MODEL"*)
|
|
196
|
+
ok "$END_ADAPTER: end_image refused with exit $end_rc, naming $END_MODEL and end_frame";;
|
|
197
|
+
*)
|
|
198
|
+
fail "$END_ADAPTER: exit $end_rc but the message names neither the model nor the field (got: $end_out)";;
|
|
199
|
+
esac
|
|
200
|
+
fi
|
|
201
|
+
|
|
202
|
+
# ---------------------------------------------------------------- 8
|
|
203
|
+
printf '\n[8/8] cost calibration prints modeled-vs-charged and does not re-confirm on null\n'
|
|
204
|
+
CAL_PROJECT="$(mktemp -d -t aiv-cal-XXXXXX)"
|
|
205
|
+
mkdir -p "$CAL_PROJECT/scenes/0001"
|
|
206
|
+
printf '{"duration":5}\n' > "$CAL_PROJECT/scenes/0001/prompt.json"
|
|
207
|
+
CAL_ADAPTER="fal"
|
|
208
|
+
CAL_MODEL="fal-ai/ltx-2/text-to-video"
|
|
209
|
+
|
|
210
|
+
# No cost.json: nothing has been charged. This is the dry-run shape, and it is
|
|
211
|
+
# the case that matters most — `charged: null` must extrapolate nothing and must
|
|
212
|
+
# NOT halt, because treating an absent charge as 0 would make every future
|
|
213
|
+
# estimate quietly cheaper.
|
|
214
|
+
cal_out="$(bash "$ROOT/src/scripts/ai-video/lib/calibrate-cost.sh" \
|
|
215
|
+
"$CAL_PROJECT" 0001 --adapter "$CAL_ADAPTER" --model "$CAL_MODEL" \
|
|
216
|
+
--scenes 4 --no-append 2>&1)" && cal_rc=0 || cal_rc=$?
|
|
217
|
+
|
|
218
|
+
case "$cal_out" in
|
|
219
|
+
*"modeled \$"*"charged null"*) ok "calibration line prints modeled vs charged with charged: null" ;;
|
|
220
|
+
*) fail "calibration line missing or malformed (got: $cal_out)" ;;
|
|
221
|
+
esac
|
|
222
|
+
if [ "$cal_rc" -eq 0 ]; then
|
|
223
|
+
ok "charged: null does not re-confirm (exit 0)"
|
|
224
|
+
else
|
|
225
|
+
fail "charged: null re-confirmed with exit $cal_rc — an absent charge is not an overrun"
|
|
226
|
+
fi
|
|
227
|
+
|
|
228
|
+
# Sensitivity: the halt must actually fire when a charge genuinely overruns, or
|
|
229
|
+
# the exit-0 assertion above would pass against a script that never halts.
|
|
230
|
+
printf '{"charged_usd":1.60}\n' > "$CAL_PROJECT/scenes/0001/cost.json"
|
|
231
|
+
cal_over="$(bash "$ROOT/src/scripts/ai-video/lib/calibrate-cost.sh" \
|
|
232
|
+
"$CAL_PROJECT" 0001 --adapter "$CAL_ADAPTER" --model "$CAL_MODEL" \
|
|
233
|
+
--scenes 4 --no-append 2>&1)" && cal_over_rc=0 || cal_over_rc=$?
|
|
234
|
+
if [ "$cal_over_rc" -eq 13 ]; then
|
|
235
|
+
ok "a charge over the tolerance halts with exit 13 for re-confirmation"
|
|
236
|
+
else
|
|
237
|
+
fail "an overrun exited $cal_over_rc, expected 13 (got: $cal_over)"
|
|
238
|
+
fi
|
|
239
|
+
rm -rf "$CAL_PROJECT"
|
|
240
|
+
|
|
163
241
|
# ----------------------------------------------------------------
|
|
164
242
|
printf '\n----------------\nresult: %d passed · %d failed\n' "$PASS" "$FAIL"
|
|
165
243
|
if [ "$FAIL" -gt 0 ]; then
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The argument-exhaustion stop predicate, with the ordering encoded.
|
|
3
|
+
*
|
|
4
|
+
* `road-to-inbox-harvest-2026-08-e-council-topology-evidence` Phase 6.2, and the
|
|
5
|
+
* resolution of its `early-stop-vs-dissent-ordering` blocker.
|
|
6
|
+
*
|
|
7
|
+
* ## The ordering IS the substance
|
|
8
|
+
*
|
|
9
|
+
* Anti-conformity repair must fire **before** the cost stop, because
|
|
10
|
+
* **convergence may be conformity collapse rather than solution stability**. A
|
|
11
|
+
* round where everyone agrees because nobody pushed back looks, to a cost meter,
|
|
12
|
+
* exactly like a round where the argument is genuinely finished — and stopping
|
|
13
|
+
* there reports the collapse as consensus. That is the failure Phase 6 exists to
|
|
14
|
+
* prevent, so `dissentRepairAttempted` is a **required conjunct of the
|
|
15
|
+
* predicate**, not a soft check somewhere upstream that the predicate hopes ran.
|
|
16
|
+
*
|
|
17
|
+
* Encoding it as a conjunct rather than as call-order discipline is deliberate:
|
|
18
|
+
* a caller that forgets the order produces a wrong answer silently, while a
|
|
19
|
+
* caller that forgets to set the field produces `false` — the safe direction,
|
|
20
|
+
* and a visible one.
|
|
21
|
+
*
|
|
22
|
+
* ## Why all four, and why none of them is majority size
|
|
23
|
+
*
|
|
24
|
+
* A stop fires only when **every** condition holds:
|
|
25
|
+
*
|
|
26
|
+
* 1. `roundsCompleted >= MIN_ROUNDS` — one round is an opening statement, not an
|
|
27
|
+
* argument. There is nothing to be exhausted yet.
|
|
28
|
+
* 2. `dissentRepairAttempted` — the conformity defence got its chance.
|
|
29
|
+
* 3. every present member is a self-near-duplicate of their own prior round —
|
|
30
|
+
* the members have stopped adding, judged by the novelty logic that already
|
|
31
|
+
* exists rather than by a new similarity measure.
|
|
32
|
+
* 4. no unresolved adversarial trigger — an open objection is unfinished
|
|
33
|
+
* argument whatever the novelty numbers say.
|
|
34
|
+
*
|
|
35
|
+
* **Majority size is absent on purpose** (6.3). Unanimity is the single most
|
|
36
|
+
* available signal and the single least trustworthy one here: it is exactly what
|
|
37
|
+
* conformity collapse produces. A predicate that read it would stop soonest in
|
|
38
|
+
* precisely the case it must not.
|
|
39
|
+
*
|
|
40
|
+
* Everything here is pure and reads already-paid outputs — no model call, which
|
|
41
|
+
* is 6.1's contract and the reason this can be evaluated after every round for
|
|
42
|
+
* free.
|
|
43
|
+
*/
|
|
44
|
+
|
|
45
|
+
/** One round is an opening statement; exhaustion needs an exchange. */
|
|
46
|
+
export const MIN_ROUNDS = 2;
|
|
47
|
+
|
|
48
|
+
export interface StopInputs {
|
|
49
|
+
/** Rounds completed so far. */
|
|
50
|
+
roundsCompleted: number;
|
|
51
|
+
/**
|
|
52
|
+
* Whether anti-conformity repair ran for the round under judgement.
|
|
53
|
+
*
|
|
54
|
+
* The ordering conjunct. `false` when repair was skipped, deferred, or
|
|
55
|
+
* never reached — all three are the same thing to this predicate, because
|
|
56
|
+
* all three leave conformity collapse untested.
|
|
57
|
+
*/
|
|
58
|
+
dissentRepairAttempted: boolean;
|
|
59
|
+
/**
|
|
60
|
+
* Per present member: did this round near-duplicate that member's own prior
|
|
61
|
+
* round? Absent members contribute no entry rather than a `false`.
|
|
62
|
+
*/
|
|
63
|
+
selfNearDuplicate: readonly boolean[];
|
|
64
|
+
/** Adversarial triggers raised and not yet resolved. */
|
|
65
|
+
unresolvedAdversarialTriggers: number;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export type StopBlocker =
|
|
69
|
+
| 'too-few-rounds'
|
|
70
|
+
| 'dissent-repair-not-attempted'
|
|
71
|
+
| 'members-still-adding'
|
|
72
|
+
| 'unresolved-adversarial-trigger'
|
|
73
|
+
| 'no-members-present';
|
|
74
|
+
|
|
75
|
+
export interface StopVerdict {
|
|
76
|
+
stop: boolean;
|
|
77
|
+
/** Every condition that failed, not just the first — a caller acting on one
|
|
78
|
+
* reason at a time would re-evaluate N times to learn N blockers. */
|
|
79
|
+
blockers: StopBlocker[];
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export function evaluateStop(x: StopInputs): StopVerdict {
|
|
83
|
+
const blockers: StopBlocker[] = [];
|
|
84
|
+
|
|
85
|
+
if (x.roundsCompleted < MIN_ROUNDS) blockers.push('too-few-rounds');
|
|
86
|
+
|
|
87
|
+
// The ordering conjunct. Deliberately evaluated as its own condition rather
|
|
88
|
+
// than folded into a caller-side guard: see the module docstring.
|
|
89
|
+
if (!x.dissentRepairAttempted) blockers.push('dissent-repair-not-attempted');
|
|
90
|
+
|
|
91
|
+
if (x.selfNearDuplicate.length === 0) {
|
|
92
|
+
// No present member is not "everyone is done" — it is no evidence at
|
|
93
|
+
// all. `every()` over an empty array is vacuously true, which would
|
|
94
|
+
// make an empty council the easiest one to stop.
|
|
95
|
+
blockers.push('no-members-present');
|
|
96
|
+
} else if (!x.selfNearDuplicate.every((d) => d)) {
|
|
97
|
+
blockers.push('members-still-adding');
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if (x.unresolvedAdversarialTriggers > 0) blockers.push('unresolved-adversarial-trigger');
|
|
101
|
+
|
|
102
|
+
return { stop: blockers.length === 0, blockers };
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* The rendering contract for a stopped run (6.4).
|
|
107
|
+
*
|
|
108
|
+
* A stopped run must be **textually distinguishable** from a full one. The
|
|
109
|
+
* failure this prevents is quiet and expensive: an artifact that reads as though
|
|
110
|
+
* all configured rounds executed, when three of five did, is a claim about
|
|
111
|
+
* deliberation depth that nobody made on purpose.
|
|
112
|
+
*/
|
|
113
|
+
export interface StopRender {
|
|
114
|
+
roundsCompleted: number;
|
|
115
|
+
roundsConfigured: number;
|
|
116
|
+
savedCalls: number;
|
|
117
|
+
savedCostUsd: number;
|
|
118
|
+
exhaustedMembers: readonly string[];
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export function renderStop(r: StopRender): string {
|
|
122
|
+
return [
|
|
123
|
+
`council: STOPPED EARLY — round ${String(r.roundsCompleted)} of ${String(r.roundsConfigured)}.`,
|
|
124
|
+
' reason: argument exhaustion — every present member near-duplicated their own',
|
|
125
|
+
' prior round, after anti-conformity repair had already been attempted.',
|
|
126
|
+
` exhausted: ${r.exhaustedMembers.length > 0 ? r.exhaustedMembers.join(', ') : '(none named)'}`,
|
|
127
|
+
` saved: ${String(r.savedCalls)} call(s), $${r.savedCostUsd.toFixed(4)}`,
|
|
128
|
+
' NOT a full run: the remaining configured rounds did not execute.',
|
|
129
|
+
].join('\n');
|
|
130
|
+
}
|