@oh-story/dsh 0.1.9 → 0.1.11
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/README.md +14 -14
- package/lib/client.js +209 -73
- package/lib/client.js.map +3 -3
- package/lib/drama/manifest.json +248 -168
- package/lib/drama/skills/short-drama/SKILL.md +16 -4
- package/lib/drama/skills/short-drama/assets/project-template/short-drama.json +3 -0
- package/lib/drama/skills/short-drama/references/creator-documents.md +3 -0
- package/lib/drama/skills/short-drama/references/knowhow-index.md +15 -0
- package/lib/drama/skills/short-drama/scripts/creator_markdown_check.py +14 -0
- package/lib/drama/skills/short-drama/scripts/project_tool.py +131 -0
- package/lib/drama/skills/short-drama-assets/SKILL.md +2 -1
- package/lib/drama/skills/short-drama-assets/references/asset-review-checklist.md +2 -0
- package/lib/drama/skills/short-drama-assets/references/character-and-look.md +10 -0
- package/lib/drama/skills/short-drama-assets/references/continuity-lock.md +6 -9
- package/lib/drama/skills/short-drama-assets/references/era-anchors.md +37 -0
- package/lib/drama/skills/short-drama-assets/references/stage-contract.md +2 -0
- package/lib/drama/skills/short-drama-assets/references/voice-direction.md +28 -0
- package/lib/drama/skills/short-drama-develop/SKILL.md +10 -4
- package/lib/drama/skills/short-drama-develop/assets/adaptation-map.example.jsonl +1 -1
- package/lib/drama/skills/short-drama-develop/assets/creative-brief.md +8 -0
- package/lib/drama/skills/short-drama-develop/references/adaptation-craft.md +80 -13
- package/lib/drama/skills/short-drama-develop/references/episode-design.md +95 -12
- package/lib/drama/skills/short-drama-develop/references/genre-and-hook-playbook.md +9 -5
- package/lib/drama/skills/short-drama-develop/references/genre-cards//345/244/215/344/273/207/346/211/223/350/204/270.md +1 -1
- package/lib/drama/skills/short-drama-develop/references/genre-cards//347/263/273/347/273/237/346/265/201.md +51 -0
- package/lib/drama/skills/short-drama-develop/references/genre-cards//351/200/206/350/242/255.md +51 -0
- package/lib/drama/skills/short-drama-develop/references/genre-cards//351/207/215/347/224/237/347/251/277/350/266/212.md +51 -0
- package/lib/drama/skills/short-drama-develop/references/genre-cards.md +10 -7
- package/lib/drama/skills/short-drama-develop/references/premise-devices.md +15 -9
- package/lib/drama/skills/short-drama-develop/references/serial-character-and-memory.md +3 -2
- package/lib/drama/skills/short-drama-develop/references/stage-contract.md +14 -7
- package/lib/drama/skills/short-drama-develop/references/story-craft.md +7 -3
- package/lib/drama/skills/short-drama-edit/SKILL.md +65 -44
- package/lib/drama/skills/short-drama-edit/assets/remotion/README.md +49 -13
- package/lib/drama/skills/short-drama-edit/assets/remotion/package.json +4 -2
- package/lib/drama/skills/short-drama-edit/assets/remotion/src/Overlay.tsx +31 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/src/Root.tsx +5 -5
- package/lib/drama/skills/short-drama-edit/assets/remotion/src/Subtitles.tsx +68 -69
- package/lib/drama/skills/short-drama-edit/assets/remotion/src/font.ts +39 -29
- package/lib/drama/skills/short-drama-edit/assets/remotion/src/rules.mjs +188 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/src/schema.ts +26 -13
- package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/Card.tsx +72 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/CornerChip.tsx +39 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/ScreenText.tsx +36 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/SystemPanel.tsx +44 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/TaskPanel.tsx +100 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/chrome.tsx +197 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/tokens.ts +62 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/tsconfig.json +1 -0
- package/lib/drama/skills/short-drama-edit/assets//345/211/252/350/276/221/345/215/225.md +6 -4
- package/lib/drama/skills/short-drama-edit/references/cut-craft.md +26 -67
- package/lib/drama/skills/short-drama-edit/references/delivery-verify.md +31 -56
- package/lib/drama/skills/short-drama-edit/references/generated-footage.md +42 -78
- package/lib/drama/skills/short-drama-edit/references/sound-and-subtitles.md +44 -92
- package/lib/drama/skills/short-drama-edit/references/stage-contract.md +14 -16
- package/lib/drama/skills/short-drama-edit/scripts/edit_tool.py +1272 -125
- package/lib/drama/skills/short-drama-edit/scripts/selftest.py +113 -9
- package/lib/drama/skills/short-drama-image-prompts/SKILL.md +2 -0
- package/lib/drama/skills/short-drama-image-prompts/references/common-recipe.md +11 -0
- package/lib/drama/skills/short-drama-novel-analyze/SKILL.md +3 -3
- package/lib/drama/skills/short-drama-novel-analyze/assets/episode-candidate.example.jsonl +2 -2
- package/lib/drama/skills/short-drama-novel-analyze/references/adaptation-triage.md +8 -4
- package/lib/drama/skills/short-drama-novel-analyze/references/adaptation-value.md +10 -3
- package/lib/drama/skills/short-drama-novel-analyze/references/aggregation-and-entities.md +25 -1
- package/lib/drama/skills/short-drama-novel-analyze/references/stage-contract.md +1 -0
- package/lib/drama/skills/short-drama-produce/SKILL.md +5 -1
- package/lib/drama/skills/short-drama-produce/references/adapter-contract.md +14 -20
- package/lib/drama/skills/short-drama-produce/references/providers/minimax-h3-video.md +8 -26
- package/lib/drama/skills/short-drama-produce/references/providers/minimax-speech.md +41 -0
- package/lib/drama/skills/short-drama-produce/scripts/provider_adapters.py +142 -1
- package/lib/drama/skills/short-drama-review/SKILL.md +4 -5
- package/lib/drama/skills/short-drama-review/references/production-quality-gates.md +6 -19
- package/lib/drama/skills/short-drama-review/references/review-method.md +6 -1
- package/lib/drama/skills/short-drama-review/references/rubric-assets-prompts.md +11 -0
- package/lib/drama/skills/short-drama-review/references/rubric-story-script.md +77 -3
- package/lib/drama/skills/short-drama-review/references/rubric-visual-motion.md +24 -35
- package/lib/drama/skills/short-drama-review/references/stage-contract.md +3 -0
- package/lib/drama/skills/short-drama-storyboard/SKILL.md +23 -11
- package/lib/drama/skills/short-drama-storyboard/references/blocking-playbooks.md +1 -1
- package/lib/drama/skills/short-drama-storyboard/references/lighting-craft.md +39 -0
- package/lib/drama/skills/short-drama-storyboard/references/production-shot-grammar.md +2 -2
- package/lib/drama/skills/short-drama-storyboard/references/shot-craft.md +139 -34
- package/lib/drama/skills/short-drama-storyboard/references/stage-contract.md +5 -3
- package/lib/drama/skills/short-drama-video-prompts/SKILL.md +15 -12
- package/lib/drama/skills/short-drama-video-prompts/references/camera-audio-continuity.md +29 -0
- package/lib/drama/skills/short-drama-video-prompts/references/delivery-profile.md +4 -5
- package/lib/drama/skills/short-drama-video-prompts/references/generability.md +4 -2
- package/lib/drama/skills/short-drama-video-prompts/references/minimax-h3.md +52 -39
- package/lib/drama/skills/short-drama-video-prompts/references/motion-recipe.md +24 -21
- package/lib/drama/skills/short-drama-video-prompts/references/performance-action-timing.md +9 -23
- package/lib/drama/skills/short-drama-video-prompts/references/production-prompt-grammar.md +14 -26
- package/lib/drama/skills/short-drama-video-prompts/references/review-and-fixtures.md +1 -1
- package/lib/drama/skills/short-drama-video-prompts/references/seedance-2.0.md +2 -3
- package/lib/drama/skills/short-drama-video-prompts/references/seedance-2.5.md +34 -9
- package/lib/drama/skills/short-drama-video-prompts/references/stage-contract.md +3 -2
- package/lib/drama/skills/short-drama-video-prompts/references/target-model-profile.md +8 -1
- package/lib/drama/skills/short-drama-video-prompts/references/wan-3.0.md +103 -0
- package/lib/drama/skills/short-drama-video-prompts/scripts/motion_timing_check.py +8 -7
- package/lib/drama/skills/short-drama-write/SKILL.md +10 -7
- package/lib/drama/skills/short-drama-write/references/dialogue-craft.md +1 -1
- package/lib/drama/skills/short-drama-write/references/script-craft.md +56 -3
- package/lib/drama/skills/short-drama-write/references/stage-contract.md +4 -0
- package/lib/drama/skills/short-drama-write/scripts/duration_estimate.py +48 -2
- package/lib/index.js +346 -98
- package/lib/index.js.map +4 -4
- package/lib/novel-to-game/README.md +299 -59
- package/lib/novel-to-game/README_ZH.md +299 -56
- package/lib/novel-to-game/VERSION +1 -1
- package/lib/novel-to-game/examples/jin-ping-mei/build/BUILD_BRIEF.md +3 -1
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/RUN.md +11 -3
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/css/new-guofeng.css +397 -8
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/css/style.css +0 -31
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/data.js +71 -73
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/engine.js +78 -89
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/main.js +37 -14
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/text.js +5 -5
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/package.json +2 -1
- package/lib/novel-to-game/examples/jin-ping-mei/qa/README.md +11 -16
- package/lib/novel-to-game/examples/jin-ping-mei/qa/verification.json +11 -11
- package/lib/novel-to-game/examples/jin-ping-mei/qa/verify_playable_model.mjs +23 -0
- package/lib/novel-to-game/manifest.json +77 -87
- package/lib/novel-to-game/skills/game-art-direction/SKILL.md +7 -12
- package/lib/novel-to-game/skills/game-art-direction/references/art-direction-method.md +27 -106
- package/lib/novel-to-game/skills/game-build/SKILL.md +13 -14
- package/lib/novel-to-game/skills/game-build/references/blender-asset-workflow.md +24 -0
- package/lib/novel-to-game/skills/game-build/references/build-brief-contract.md +45 -82
- package/lib/novel-to-game/skills/game-build/references/generative-media-pipeline.md +14 -45
- package/lib/novel-to-game/skills/game-build/references/playable-model-contract.md +30 -65
- package/lib/novel-to-game/skills/game-build/references/tts-production-contract.md +13 -27
- package/lib/novel-to-game/skills/game-concept/SKILL.md +13 -15
- package/lib/novel-to-game/skills/game-concept/references/concept-method.md +28 -75
- package/lib/novel-to-game/skills/game-qa/SKILL.md +6 -7
- package/lib/novel-to-game/skills/game-qa/references/test-design-method.md +9 -5
- package/lib/novel-to-game/skills/game-world-design/SKILL.md +12 -16
- package/lib/novel-to-game/skills/game-world-design/references/narrative-design-method.md +23 -72
- package/lib/novel-to-game/skills/game-world-design/references/numeric-design-method.md +14 -48
- package/lib/novel-to-game/skills/game-world-design/references/world-design-method.md +36 -103
- package/lib/novel-to-game/skills/novel-game-analyze/SKILL.md +4 -10
- package/lib/novel-to-game/skills/novel-game-analyze/references/gameability-protocol.md +4 -4
- package/lib/novel-to-game/skills/novel-to-game/SKILL.md +9 -21
- package/lib/novel-to-game/skills/novel-to-game/references/intake-method.md +5 -4
- package/lib/novel-to-game/skills/novel-to-game/references/pipeline-contract.md +5 -8
- package/lib/oh-story/manifest.json +607 -327
- package/lib/oh-story/roles/chapter-extractor.md +177 -237
- package/lib/oh-story/roles/character-designer.md +1 -2
- package/lib/oh-story/roles/consistency-checker.md +15 -13
- package/lib/oh-story/roles/narrative-writer.md +36 -38
- package/lib/oh-story/roles/story-architect.md +9 -61
- package/lib/oh-story/roles/story-explorer.md +20 -125
- package/lib/oh-story/roles/story-researcher.md +0 -1
- package/lib/oh-story/skills/story/SKILL.md +15 -9
- package/lib/oh-story/skills/story/VERSION +1 -1
- package/lib/oh-story/skills/story/references/author-memory-maintenance.md +75 -0
- package/lib/oh-story/skills/story/references/author-memory.md +46 -94
- package/lib/oh-story/skills/story/scripts/author_memory_commit.py +934 -170
- package/lib/oh-story/skills/story-cover/SKILL.md +10 -1
- package/lib/oh-story/skills/story-deslop/SKILL.md +59 -73
- package/lib/oh-story/skills/story-deslop/references/agent-calls.md +5 -0
- package/lib/oh-story/skills/story-deslop/references/anti-ai-writing.md +12 -11
- package/lib/oh-story/skills/story-deslop/references/author-memory-maintenance.md +75 -0
- package/lib/oh-story/skills/story-deslop/references/author-memory.md +46 -94
- package/lib/oh-story/skills/story-deslop/references/banned-words.md +2 -2
- package/lib/oh-story/skills/story-deslop/references/deslop-gates.md +22 -5
- package/lib/oh-story/skills/story-deslop/references/style-resolution.md +4 -4
- package/lib/oh-story/skills/story-deslop/scripts/author_memory_commit.py +934 -170
- package/lib/oh-story/skills/story-deslop/scripts/check-ai-patterns.js +155 -8
- package/lib/oh-story/skills/story-import/SKILL.md +64 -584
- package/lib/oh-story/skills/story-import/references/character-state-reverse.md +1 -1
- package/lib/oh-story/skills/story-import/references/deep-analysis.md +47 -0
- package/lib/oh-story/skills/story-import/references/format-and-structure.md +1 -1
- package/lib/oh-story/skills/story-import/references/import-report.md +64 -0
- package/lib/oh-story/skills/story-import/references/import-special-cases.md +34 -0
- package/lib/oh-story/skills/story-import/references/import-tracking.md +95 -0
- package/lib/oh-story/skills/story-import/references/length-routing.md +1 -1
- package/lib/oh-story/skills/story-import/references/outline-reverse-rules.md +79 -0
- package/lib/oh-story/skills/story-import/references/outline-reverse.md +24 -0
- package/lib/oh-story/skills/story-import/references/state-tracking.md +4 -69
- package/lib/oh-story/skills/story-import/references/structure-mapping-long.md +98 -92
- package/lib/oh-story/skills/story-import/references/structure-mapping-short.md +24 -12
- package/lib/oh-story/skills/story-import/references/tracking-initialization.md +1 -1
- package/lib/oh-story/skills/story-import/references/tracking-transaction.md +15 -11
- package/lib/oh-story/skills/story-import/scripts/build_outline_brief.py +332 -0
- package/lib/oh-story/skills/story-import/scripts/check-outline-contract.js +132 -27
- package/lib/oh-story/skills/story-import/scripts/tracking_commit.py +478 -15
- package/lib/oh-story/skills/story-import/scripts/wordcount_core.py +182 -23
- package/lib/oh-story/skills/story-long-analyze/SKILL.md +81 -270
- package/lib/oh-story/skills/story-long-analyze/references/author-facing.md +252 -0
- package/lib/oh-story/skills/story-long-analyze/references/deconstruction-notes.md +3 -3
- package/lib/oh-story/skills/story-long-analyze/references/final-checks.md +19 -0
- package/lib/oh-story/skills/story-long-analyze/references/index-rebuild.md +11 -0
- package/lib/oh-story/skills/story-long-analyze/references/inspiration-library.md +105 -0
- package/lib/oh-story/skills/story-long-analyze/references/pipeline-ops.md +138 -64
- package/lib/oh-story/skills/story-long-analyze/references/semantic-acceptance-fixtures.md +84 -0
- package/lib/oh-story/skills/story-long-analyze/references/stage1-golden-chapters.md +128 -0
- package/lib/oh-story/skills/story-long-analyze/references/stage2-extraction.md +229 -0
- package/lib/oh-story/skills/story-long-analyze/references/stage3-plot-rhythm.md +480 -0
- package/lib/oh-story/skills/story-long-analyze/references/stage4-characters-settings.md +195 -0
- package/lib/oh-story/skills/story-long-analyze/references/stage5-report.md +33 -0
- package/lib/oh-story/skills/story-long-analyze/references/style-profile-generator.md +55 -128
- package/lib/oh-story/skills/story-long-analyze/references/style-profile-protocol.md +6 -6
- package/lib/oh-story/skills/story-long-analyze/references/synthesis-inputs.md +39 -0
- package/lib/oh-story/skills/story-long-analyze/scripts/build_chapter_index.py +466 -0
- package/lib/oh-story/skills/story-long-analyze/scripts/inspect_existing_assets.py +702 -0
- package/lib/oh-story/skills/story-long-analyze/scripts/inspiration_index.py +864 -0
- package/lib/oh-story/skills/story-long-analyze/scripts/manage_analysis_run.py +1145 -0
- package/lib/oh-story/skills/story-long-analyze/scripts/render_relation_chart.py +425 -0
- package/lib/oh-story/skills/story-long-scan/SKILL.md +45 -194
- package/lib/oh-story/skills/story-long-scan/references/platform-ciweimao.md +19 -0
- package/lib/oh-story/skills/story-long-scan/references/platform-fanqie.md +45 -0
- package/lib/oh-story/skills/story-long-scan/references/platform-jjwxc.md +28 -0
- package/lib/oh-story/skills/story-long-scan/references/platform-qidian.md +35 -0
- package/lib/oh-story/skills/story-long-scan/references/platform-qimao.md +27 -0
- package/lib/oh-story/skills/story-long-scan/references/topic-decision.md +6 -2
- package/lib/oh-story/skills/story-long-write/SKILL.md +49 -81
- package/lib/oh-story/skills/story-long-write/references/agent-calls.md +47 -0
- package/lib/oh-story/skills/story-long-write/references/anti-ai-writing.md +12 -11
- package/lib/oh-story/skills/story-long-write/references/artifact-protocols.md +24 -202
- package/lib/oh-story/skills/story-long-write/references/author-memory-maintenance.md +75 -0
- package/lib/oh-story/skills/story-long-write/references/author-memory.md +46 -94
- package/lib/oh-story/skills/story-long-write/references/banned-words.md +2 -2
- package/lib/oh-story/skills/story-long-write/references/benchmark-recall.md +7 -11
- package/lib/oh-story/skills/story-long-write/references/character-relations.md +49 -1
- package/lib/oh-story/skills/story-long-write/references/cross-book-recall.md +26 -0
- package/lib/oh-story/skills/story-long-write/references/deslop-gates.md +171 -0
- package/lib/oh-story/skills/story-long-write/references/dialogue-mastery.md +4 -0
- package/lib/oh-story/skills/story-long-write/references/emotion-on-page.md +116 -0
- package/lib/oh-story/skills/story-long-write/references/emotional-arc-design.md +1 -114
- package/lib/oh-story/skills/story-long-write/references/emotional-methods.md +2 -2
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards.md +1 -1
- package/lib/oh-story/skills/story-long-write/references/long-chapter-quality.md +7 -15
- package/lib/oh-story/skills/story-long-write/references/long-format.md +0 -8
- package/lib/oh-story/skills/story-long-write/references/long-genre-catalog.md +1 -1
- package/lib/oh-story/skills/story-long-write/references/long-genre-mechanics.md +3 -3
- package/lib/oh-story/skills/story-long-write/references/opening-design.md +2 -2
- package/lib/oh-story/skills/story-long-write/references/outline-conflict.md +4 -4
- package/lib/oh-story/skills/story-long-write/references/outline-methods.md +7 -7
- package/lib/oh-story/skills/story-long-write/references/outline-rhythm.md +3 -3
- package/lib/oh-story/skills/story-long-write/references/outline-structure-theory.md +14 -69
- package/lib/oh-story/skills/story-long-write/references/plot-frameworks.md +1 -1
- package/lib/oh-story/skills/story-long-write/references/plot-special-topics.md +2 -2
- package/lib/oh-story/skills/story-long-write/references/project-files.md +19 -13
- package/lib/oh-story/skills/story-long-write/references/reader-contract-and-progression.md +13 -5
- package/lib/oh-story/skills/story-long-write/references/reference-index.md +5 -6
- package/lib/oh-story/skills/story-long-write/references/stop-and-fix.md +9 -0
- package/lib/oh-story/skills/story-long-write/references/style-combat-face.md +1 -58
- package/lib/oh-story/skills/story-long-write/references/style-genre-modules.md +1 -1
- package/lib/oh-story/skills/story-long-write/references/style-resolution.md +4 -4
- package/lib/oh-story/skills/story-long-write/references/tracking-initialization.md +1 -1
- package/lib/oh-story/skills/story-long-write/references/tracking-transaction.md +15 -11
- package/lib/oh-story/skills/story-long-write/references/workflow-chapter.md +81 -121
- package/lib/oh-story/skills/story-long-write/references/workflow-daily.md +41 -139
- package/lib/oh-story/skills/story-long-write/references/workflow-outline.md +157 -0
- package/lib/oh-story/skills/story-long-write/references/workflow-revision.md +57 -67
- package/lib/oh-story/skills/story-long-write/references/workflow-setup.md +112 -253
- package/lib/oh-story/skills/story-long-write/references/workflow-volume.md +142 -0
- package/lib/oh-story/skills/story-long-write/references/writer-prompt-fallback.md +6 -4
- package/lib/oh-story/skills/story-long-write/references/writing-craft.md +19 -65
- package/lib/oh-story/skills/story-long-write/scripts/author_memory_commit.py +934 -170
- package/lib/oh-story/skills/story-long-write/scripts/build_architect_brief.py +260 -0
- package/lib/oh-story/skills/story-long-write/scripts/build_writer_prompt.py +226 -25
- package/lib/oh-story/skills/story-long-write/scripts/check-ai-patterns.js +155 -8
- package/lib/oh-story/skills/story-long-write/scripts/check-outline-contract.js +132 -27
- package/lib/oh-story/skills/story-long-write/scripts/check-outline-copy.js +7 -2
- package/lib/oh-story/skills/story-long-write/scripts/outline_view.py +7 -4
- package/lib/oh-story/skills/story-long-write/scripts/storyctl.py +304 -46
- package/lib/oh-story/skills/story-long-write/scripts/tracking_commit.py +478 -15
- package/lib/oh-story/skills/story-long-write/scripts/wordcount_core.py +182 -23
- package/lib/oh-story/skills/story-review/SKILL.md +31 -302
- package/lib/oh-story/skills/story-review/references/agent-prompts.md +184 -0
- package/lib/oh-story/skills/story-review/references/anti-ai-writing.md +12 -11
- package/lib/oh-story/skills/story-review/references/author-memory-maintenance.md +75 -0
- package/lib/oh-story/skills/story-review/references/author-memory.md +46 -94
- package/lib/oh-story/skills/story-review/references/banned-words.md +2 -2
- package/lib/oh-story/skills/story-review/references/batch-review.md +19 -0
- package/lib/oh-story/skills/story-review/references/character-relations.md +49 -1
- package/lib/oh-story/skills/story-review/references/dialogue-mastery.md +4 -0
- package/lib/oh-story/skills/story-review/references/review-quality.md +6 -11
- package/lib/oh-story/skills/story-review/references/review-tracking.md +10 -0
- package/lib/oh-story/skills/story-review/references/solo.md +52 -0
- package/lib/oh-story/skills/story-review/references/style-resolution.md +4 -4
- package/lib/oh-story/skills/story-review/references/tracking-initialization.md +1 -1
- package/lib/oh-story/skills/story-review/references/tracking-transaction.md +15 -11
- package/lib/oh-story/skills/story-review/scripts/author_memory_commit.py +934 -170
- package/lib/oh-story/skills/story-review/scripts/check-ai-patterns.js +155 -8
- package/lib/oh-story/skills/story-review/scripts/tracking_commit.py +478 -15
- package/lib/oh-story/skills/story-review/scripts/wordcount_core.py +182 -23
- package/lib/oh-story/skills/story-setup/SKILL.md +71 -452
- package/lib/oh-story/skills/story-setup/references/agent-references/agent-quality.md +4 -4
- package/lib/oh-story/skills/story-setup/references/agent-references/anti-ai-writing.md +12 -11
- package/lib/oh-story/skills/story-setup/references/agent-references/banned-words.md +2 -2
- package/lib/oh-story/skills/story-setup/references/agent-references/benchmark-style-load.md +107 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/character-relations.md +49 -1
- package/lib/oh-story/skills/story-setup/references/agent-references/deslop-gates.md +22 -5
- package/lib/oh-story/skills/story-setup/references/agent-references/dialogue-mastery.md +4 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/emotion-on-page.md +116 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/emotional-arc-design.md +1 -114
- package/lib/oh-story/skills/story-setup/references/agent-references/format-and-structure.md +1 -1
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards.md +1 -1
- package/lib/oh-story/skills/story-setup/references/agent-references/long-emotional-methods.md +2 -2
- package/lib/oh-story/skills/story-setup/references/agent-references/long-genre-catalog.md +1 -1
- package/lib/oh-story/skills/story-setup/references/agent-references/long-genre-mechanics.md +3 -3
- package/lib/oh-story/skills/story-setup/references/agent-references/long-quality.md +7 -5
- package/lib/oh-story/skills/story-setup/references/agent-references/opening-design.md +2 -2
- package/lib/oh-story/skills/story-setup/references/agent-references/outline-conflict.md +4 -4
- package/lib/oh-story/skills/story-setup/references/agent-references/outline-methods.md +7 -7
- package/lib/oh-story/skills/story-setup/references/agent-references/outline-rhythm.md +3 -3
- package/lib/oh-story/skills/story-setup/references/agent-references/short-emotional-methods.md +1 -1
- package/lib/oh-story/skills/story-setup/references/agent-references/short-genre-formulas.md +0 -15
- package/lib/oh-story/skills/story-setup/references/agent-references/short-reversal.md +1 -1
- package/lib/oh-story/skills/story-setup/references/agent-references/style-combat-face.md +1 -58
- package/lib/oh-story/skills/story-setup/references/agent-references/style-genre-modules.md +1 -1
- package/lib/oh-story/skills/story-setup/references/agent-references/style-resolution.md +4 -4
- package/lib/oh-story/skills/story-setup/references/agent-references/writing-craft.md +19 -65
- package/lib/oh-story/skills/story-setup/references/diagnostics.md +4 -4
- package/lib/oh-story/skills/story-short-analyze/SKILL.md +56 -110
- package/lib/oh-story/skills/story-short-analyze/references/analysis-character-relations.md +1 -1
- package/lib/oh-story/skills/story-short-analyze/references/analysis-method.md +42 -0
- package/lib/oh-story/skills/story-short-analyze/references/optional-modules.md +97 -0
- package/lib/oh-story/skills/story-short-analyze/references/output-contract.md +9 -47
- package/lib/oh-story/skills/story-short-analyze/references/quality-checklist.md +80 -0
- package/lib/oh-story/skills/story-short-analyze/references/source-story-quality.md +4 -4
- package/lib/oh-story/skills/story-short-analyze/references/stage2-3-structure-emotion.md +308 -0
- package/lib/oh-story/skills/story-short-analyze/references/stage4-6-reversal-summary.md +611 -0
- package/lib/oh-story/skills/story-short-scan/SKILL.md +35 -65
- package/lib/oh-story/skills/story-short-scan/references/manual-rank-input.md +36 -0
- package/lib/oh-story/skills/story-short-scan/references/platform-dianzhong.md +24 -0
- package/lib/oh-story/skills/story-short-scan/references/platform-heiyan.md +21 -0
- package/lib/oh-story/skills/story-short-scan/references/topic-match.md +38 -0
- package/lib/oh-story/skills/story-short-write/SKILL.md +23 -175
- package/lib/oh-story/skills/story-short-write/references/agent-calls.md +13 -0
- package/lib/oh-story/skills/story-short-write/references/author-memory-maintenance.md +75 -0
- package/lib/oh-story/skills/story-short-write/references/author-memory.md +46 -94
- package/lib/oh-story/skills/story-short-write/references/banned-words.md +2 -2
- package/lib/oh-story/skills/story-short-write/references/benchmark-recall.md +1 -21
- package/lib/oh-story/skills/story-short-write/references/dialogue-mastery.md +4 -0
- package/lib/oh-story/skills/story-short-write/references/emotional-methods.md +1 -1
- package/lib/oh-story/skills/story-short-write/references/genre-writing-formulas.md +0 -15
- package/lib/oh-story/skills/story-short-write/references/output-contract.md +9 -47
- package/lib/oh-story/skills/story-short-write/references/reference-index.md +17 -47
- package/lib/oh-story/skills/story-short-write/references/scene-craft.md +40 -0
- package/lib/oh-story/skills/story-short-write/references/short-craft.md +7 -43
- package/lib/oh-story/skills/story-short-write/references/short-format.md +3 -3
- package/lib/oh-story/skills/story-short-write/references/short-prose-quality.md +2 -1
- package/lib/oh-story/skills/story-short-write/references/short-reversal.md +1 -1
- package/lib/oh-story/skills/story-short-write/references/style-resolution.md +4 -4
- package/lib/oh-story/skills/story-short-write/references/submission-craft.md +1 -1
- package/lib/oh-story/skills/story-short-write/references/villain-and-reveal.md +5 -10
- package/lib/oh-story/skills/story-short-write/references/workflow-design.md +21 -13
- package/lib/oh-story/skills/story-short-write/references/workflow-draft.md +116 -0
- package/lib/oh-story/skills/story-short-write/references/workflow-revision.md +99 -0
- package/lib/oh-story/skills/story-short-write/references/writing-workflow.md +7 -119
- package/lib/oh-story/skills/story-short-write/scripts/author_memory_commit.py +934 -170
- package/lib/oh-story/skills/story-short-write/scripts/check-ai-patterns.js +155 -8
- package/lib/oh-story/skills/story-short-write/scripts/check-outline-copy.js +7 -2
- package/lib/types/client/drama-production-view.d.ts.map +1 -1
- package/lib/types/client/file-activity.d.ts +19 -1
- package/lib/types/client/file-activity.d.ts.map +1 -1
- package/lib/types/client/index.d.ts.map +1 -1
- package/lib/types/client/production-prompts.d.ts +7 -0
- package/lib/types/client/production-prompts.d.ts.map +1 -1
- package/lib/types/client/production-runtime.d.ts +16 -0
- package/lib/types/client/production-runtime.d.ts.map +1 -1
- package/lib/types/client/video-studio.d.ts.map +1 -1
- package/lib/types/drama-adapters.d.ts +5 -3
- package/lib/types/drama-adapters.d.ts.map +1 -1
- package/lib/types/native-hooks.d.ts +53 -1
- package/lib/types/native-hooks.d.ts.map +1 -1
- package/lib/types/role-identity.d.ts +17 -0
- package/lib/types/role-identity.d.ts.map +1 -0
- package/lib/types/role-tool.d.ts.map +1 -1
- package/lib/types/skill-provider.d.ts.map +1 -1
- package/lib/types/video-project.d.ts.map +1 -1
- package/lib/types/workspace-route.d.ts.map +1 -1
- package/lib/video-recap/CHANGELOG.md +60 -1
- package/lib/video-recap/README.en.md +348 -137
- package/lib/video-recap/README.md +340 -136
- package/lib/video-recap/manifest.json +406 -251
- package/lib/video-recap/skills/video-assemble/SKILL.md +30 -15
- package/lib/video-recap/skills/video-assemble/references/audio-modes.md +63 -0
- package/lib/video-recap/skills/video-assemble/references/explicit-audio-mix.md +75 -0
- package/lib/video-recap/skills/video-assemble/references/foreground-compose.md +118 -0
- package/lib/video-recap/skills/video-assemble/references/narration-adoption.md +103 -0
- package/lib/video-recap/skills/video-assemble/references/packaging.md +45 -0
- package/lib/video-recap/skills/video-assemble/references/pair-media.md +74 -0
- package/lib/video-recap/skills/video-assemble/references/source-score.md +147 -0
- package/lib/video-recap/skills/video-assemble/references/subtitle-track.md +202 -0
- package/lib/video-recap/skills/video-assemble/scripts/adoption/__init__.py +1 -0
- package/lib/video-recap/skills/video-assemble/scripts/adoption/audio_mix_binding.py +279 -0
- package/lib/video-recap/skills/video-assemble/scripts/adoption/frozen_audio.py +187 -0
- package/lib/video-recap/skills/video-assemble/scripts/adoption/narration_binding.py +323 -0
- package/lib/video-recap/skills/video-assemble/scripts/adoption/strict_inputs.py +109 -0
- package/lib/video-recap/skills/video-assemble/scripts/adoption/strict_publish.py +130 -0
- package/lib/video-recap/skills/video-assemble/scripts/artifacts.py +10 -46
- package/lib/video-recap/skills/video-assemble/scripts/assemble.py +378 -119
- package/lib/video-recap/skills/video-assemble/scripts/assemble_constants.py +29 -12
- package/lib/video-recap/skills/video-assemble/scripts/assembly_contract.py +95 -44
- package/lib/video-recap/skills/video-assemble/scripts/assembly_settings.py +75 -32
- package/lib/video-recap/skills/video-assemble/scripts/audio_mix.py +11 -11
- package/lib/video-recap/skills/video-assemble/scripts/compose_foreground.py +293 -0
- package/lib/video-recap/skills/video-assemble/scripts/export_jianying.py +71 -78
- package/lib/video-recap/skills/video-assemble/scripts/jianying/__init__.py +1 -0
- package/lib/video-recap/skills/video-assemble/scripts/{jianying_builders.py → jianying/builders.py} +39 -67
- package/lib/video-recap/skills/video-assemble/scripts/{jianying_model.py → jianying/model.py} +3 -11
- package/lib/video-recap/skills/video-assemble/scripts/{jianying_optional.py → jianying/optional.py} +1 -1
- package/lib/video-recap/skills/video-assemble/scripts/jianying/schema.py +53 -0
- package/lib/video-recap/skills/video-assemble/scripts/{jianying_templates.py → jianying/templates.py} +1 -1
- package/lib/video-recap/skills/video-assemble/scripts/{jianying_timeline_contract.py → jianying/timeline_contract.py} +34 -13
- package/lib/video-recap/skills/video-assemble/scripts/{jianying_writer.py → jianying/writer.py} +7 -17
- package/lib/video-recap/skills/video-assemble/scripts/lib.py +37 -4
- package/lib/video-recap/skills/video-assemble/scripts/media.py +12 -21
- package/lib/video-recap/skills/video-assemble/scripts/narration_audio.py +64 -34
- package/lib/video-recap/skills/video-assemble/scripts/packaging.py +122 -0
- package/lib/video-recap/skills/video-assemble/scripts/pair_media.py +216 -0
- package/lib/video-recap/skills/video-assemble/scripts/render_preflight.py +1 -3
- package/lib/video-recap/skills/video-assemble/scripts/source_score.py +469 -0
- package/lib/video-recap/skills/video-assemble/scripts/source_subtitles.py +25 -9
- package/lib/video-recap/skills/video-assemble/scripts/subtitles/__init__.py +1 -0
- package/lib/video-recap/skills/video-assemble/scripts/{subtitle_core.py → subtitles/core.py} +13 -6
- package/lib/video-recap/skills/video-assemble/scripts/{subtitle_render.py → subtitles/render.py} +5 -4
- package/lib/video-recap/skills/video-assemble/scripts/subtitles/track.py +324 -0
- package/lib/video-recap/skills/video-assemble/scripts/subtitles/track_binding.py +200 -0
- package/lib/video-recap/skills/video-assemble/scripts/timeline.py +30 -46
- package/lib/video-recap/skills/video-assemble/scripts/timeline_emit.py +91 -7
- package/lib/video-recap/skills/video-assemble/scripts/visual_render.py +22 -8
- package/lib/video-recap/skills/video-cut/SKILL.md +34 -16
- package/lib/video-recap/skills/video-cut/references/shot-review.md +50 -0
- package/lib/video-recap/skills/video-cut/scripts/cut.py +2 -28
- package/lib/video-recap/skills/video-cut/scripts/cut_cli.py +58 -62
- package/lib/video-recap/skills/video-cut/scripts/cut_contract.py +21 -106
- package/lib/video-recap/skills/video-cut/scripts/cut_render.py +14 -9
- package/lib/video-recap/skills/video-cut/scripts/lib.py +39 -0
- package/lib/video-recap/skills/video-cut/scripts/narration_mapping.py +2 -155
- package/lib/video-recap/skills/video-cut/scripts/narrative_selection.py +244 -0
- package/lib/video-recap/skills/video-cut/scripts/shot_review.py +357 -0
- package/lib/video-recap/skills/video-recap/SKILL.md +86 -42
- package/lib/video-recap/skills/video-recap/references/audio-routing.md +126 -0
- package/lib/video-recap/skills/video-recap/references/config-playbook.md +12 -8
- package/lib/video-recap/skills/video-recap/references/data-schema.md +44 -33
- package/lib/video-recap/skills/video-recap/references/resource-library.md +151 -0
- package/lib/video-recap/skills/video-recap/references/shift-left-qc-schema.md +1 -1
- package/lib/video-recap/skills/video-recap/scripts/doctor.py +123 -30
- package/lib/video-recap/skills/video-recap/scripts/final_qc.py +22 -75
- package/lib/video-recap/skills/video-recap/scripts/lib.py +3 -3
- package/lib/video-recap/skills/video-recap/scripts/library.py +509 -0
- package/lib/video-recap/skills/video-recap/scripts/materials.py +63 -91
- package/lib/video-recap/skills/video-recap/scripts/mimo_qc.py +8 -70
- package/lib/video-recap/skills/video-recap/scripts/project_binding.py +286 -0
- package/lib/video-recap/skills/video-recap/scripts/qc/__init__.py +1 -0
- package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_client.py → qc/mimo_client.py} +1 -1
- package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_evidence.py → qc/mimo_evidence.py} +33 -66
- package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_observations.py → qc/mimo_observations.py} +3 -11
- package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_payload.py → qc/mimo_payload.py} +4 -7
- package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_report.py → qc/mimo_report.py} +17 -28
- package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_runner.py → qc/mimo_runner.py} +2 -2
- package/lib/video-recap/skills/video-recap/scripts/qc_contract.py +0 -19
- package/lib/video-recap/skills/video-recap/scripts/recap_cli.py +119 -50
- package/lib/video-recap/skills/video-recap/scripts/recap_inspect.py +32 -114
- package/lib/video-recap/skills/video-recap/scripts/recap_review.py +9 -23
- package/lib/video-recap/skills/video-recap/scripts/recap_runner.py +387 -334
- package/lib/video-recap/skills/video-recap/scripts/recap_runtime.py +23 -23
- package/lib/video-recap/skills/video-recap/scripts/recap_source.py +278 -0
- package/lib/video-recap/skills/video-recap/scripts/recap_stage_qc.py +25 -12
- package/lib/video-recap/skills/video-recap/scripts/recap_timeline.py +59 -52
- package/lib/video-recap/skills/video-recap/scripts/resource_lock.py +162 -0
- package/lib/video-recap/skills/video-script/SKILL.md +16 -13
- package/lib/video-recap/skills/video-script/references/creative-editing-playbook.md +9 -5
- package/lib/video-recap/skills/video-script/references/promotional-copy.md +68 -0
- package/lib/video-recap/skills/video-script/references/research-guide.md +1 -1
- package/lib/video-recap/skills/video-script/scripts/evidence_bundle.py +24 -76
- package/lib/video-recap/skills/video-script/scripts/lib.py +10 -87
- package/lib/video-recap/skills/video-script/scripts/narration_lint.py +63 -39
- package/lib/video-recap/skills/video-script/scripts/review.py +0 -2
- package/lib/video-recap/skills/video-script/scripts/review_grounding.py +35 -59
- package/lib/video-recap/skills/video-script/scripts/review_response.py +66 -128
- package/lib/video-recap/skills/video-script/scripts/review_runner.py +12 -20
- package/lib/video-recap/skills/video-script/scripts/speech_ownership.py +4 -4
- package/lib/video-recap/skills/video-script/scripts/validate.py +53 -42
- package/lib/video-recap/skills/video-understanding/SKILL.md +6 -4
- package/lib/video-recap/skills/video-understanding/references/data-schema.md +50 -156
- package/lib/video-recap/skills/video-understanding/references/research-guide.md +4 -4
- package/lib/video-recap/skills/video-understanding/scripts/asr.py +85 -65
- package/lib/video-recap/skills/video-understanding/scripts/asr_timing_evidence.py +270 -0
- package/lib/video-recap/skills/video-understanding/scripts/brief.py +2 -5
- package/lib/video-recap/skills/video-understanding/scripts/briefing/__init__.py +1 -0
- package/lib/video-recap/skills/{video-script/scripts/agent_brief.py → video-understanding/scripts/briefing/builder.py} +38 -35
- package/lib/video-recap/skills/video-understanding/scripts/{brief_context.py → briefing/context.py} +4 -35
- package/lib/video-recap/skills/{video-script/scripts/brief_inputs.py → video-understanding/scripts/briefing/inputs.py} +9 -31
- package/lib/video-recap/skills/{video-script/scripts/brief_timeline.py → video-understanding/scripts/briefing/timeline.py} +5 -6
- package/lib/video-recap/skills/video-understanding/scripts/consolidate.py +65 -116
- package/lib/video-recap/skills/video-understanding/scripts/detect.py +31 -40
- package/lib/video-recap/skills/video-understanding/scripts/lib.py +30 -86
- package/lib/video-recap/skills/video-understanding/scripts/narration_lint.py +63 -39
- package/lib/video-recap/skills/video-understanding/scripts/speech_ownership.py +4 -4
- package/lib/video-recap/skills/video-understanding/scripts/storyboard.py +17 -79
- package/lib/video-recap/skills/video-understanding/scripts/understanding_brief.py +14 -40
- package/lib/video-recap/skills/video-understanding/scripts/understanding_cache.py +64 -46
- package/lib/video-recap/skills/video-understanding/scripts/understanding_runner.py +31 -11
- package/lib/video-recap/skills/video-understanding/scripts/understanding_storyboard.py +19 -14
- package/lib/video-recap/skills/video-understanding/scripts/vlm.py +80 -108
- package/lib/video-recap/skills/video-voiceover/SKILL.md +29 -19
- package/lib/video-recap/skills/video-voiceover/references/index-tts.md +31 -0
- package/lib/video-recap/skills/video-voiceover/scripts/approved_text_policy.py +123 -0
- package/lib/video-recap/skills/video-voiceover/scripts/dub.py +51 -59
- package/lib/video-recap/skills/video-voiceover/scripts/lib.py +8 -44
- package/lib/video-recap/skills/video-voiceover/scripts/providers/__init__.py +1 -0
- package/lib/video-recap/skills/video-voiceover/scripts/providers/index_tts.py +184 -0
- package/lib/video-recap/skills/video-voiceover/scripts/voiceover.py +212 -134
- package/package.json +45 -45
- package/lib/novel-to-game/skills/game-world-design/references/dialogue-design-method.md +0 -58
- package/lib/novel-to-game/skills/game-world-design/references/game-writing-craft.md +0 -53
- package/lib/novel-to-game/skills/novel-to-game/references/intake-benchmark-reference.md +0 -38
- package/lib/oh-story/skills/story-long-analyze/references/material-decomposition.md +0 -530
- package/lib/oh-story/skills/story-long-analyze/references/output-templates.md +0 -559
- package/lib/oh-story/skills/story-long-scan/references/scan-output-format.md +0 -207
- package/lib/oh-story/skills/story-long-write/references/state-tracking.md +0 -108
- package/lib/oh-story/skills/story-short-analyze/references/material-decomposition.md +0 -678
- package/lib/oh-story/skills/story-short-analyze/references/output-templates.md +0 -561
- package/lib/video-recap/skills/video-assemble/scripts/jianying_schema.py +0 -98
- package/lib/video-recap/skills/video-recap/references/creative-editing-playbook.md +0 -225
- package/lib/video-recap/skills/video-recap/references/research-guide.md +0 -74
- package/lib/video-recap/skills/video-recap/references/timeline-and-jianying.md +0 -250
- package/lib/video-recap/skills/video-script/scripts/brief_context.py +0 -348
- package/lib/video-recap/skills/video-script/scripts/narration.py +0 -12
- package/lib/video-recap/skills/video-understanding/scripts/agent_brief.py +0 -399
- package/lib/video-recap/skills/video-understanding/scripts/brief_inputs.py +0 -290
- package/lib/video-recap/skills/video-understanding/scripts/brief_timeline.py +0 -327
- /package/lib/video-recap/skills/video-assemble/scripts/{jianying_tracks.py → jianying/tracks.py} +0 -0
- /package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_contract.py → qc/mimo_contract.py} +0 -0
- /package/lib/video-recap/skills/video-voiceover/scripts/{fish_audio.py → providers/fish_audio.py} +0 -0
|
@@ -41,13 +41,21 @@ MAX_ERROR_BODY_BYTES = 64 * 1024
|
|
|
41
41
|
TERMINAL_FAILURES = {"failed", "cancelled", "canceled", "timeout", "expired"}
|
|
42
42
|
SEEDANCE_RATIOS = {"adaptive", "1:1", "3:4", "4:3", "9:16", "16:9", "21:9"}
|
|
43
43
|
SEEDANCE_REFERENCE_ROLES = {
|
|
44
|
+
"first_frame": "image_url",
|
|
45
|
+
"last_frame": "image_url",
|
|
44
46
|
"reference_image": "image_url",
|
|
45
47
|
"reference_video": "video_url",
|
|
46
48
|
"reference_audio": "audio_url",
|
|
47
49
|
}
|
|
50
|
+
# One opening frame and one closing frame, because each names a single position
|
|
51
|
+
# in the take. Note what is deliberately absent: the sibling adapter forbids
|
|
52
|
+
# mixing frame conditioning with reference conditioning, and that rule belongs
|
|
53
|
+
# to that provider's reference, not to this one. Do not carry it across.
|
|
54
|
+
SEEDANCE_SINGULAR_ROLES = {"first_frame", "last_frame"}
|
|
48
55
|
MINIMAX_VIDEO_RATIOS = {"adaptive", "1:1", "3:4", "4:3", "9:16", "16:9", "21:9"}
|
|
49
56
|
MINIMAX_VIDEO_RESOLUTIONS = {"480P", "768P", "2K"}
|
|
50
57
|
MINIMAX_VIDEO_PROMPT_LIMIT = 7000
|
|
58
|
+
MINIMAX_SPEECH_TEXT_LIMIT = 5000
|
|
51
59
|
MINIMAX_VIDEO_ROLES = {
|
|
52
60
|
"first_frame": "image_url",
|
|
53
61
|
"last_frame": "image_url",
|
|
@@ -369,10 +377,18 @@ def compile_seedance_payload(
|
|
|
369
377
|
counters = {"image_url": 0, "video_url": 0, "audio_url": 0}
|
|
370
378
|
labels = {"image_url": "图片", "video_url": "视频", "audio_url": "音频"}
|
|
371
379
|
reference_tokens: list[str] = []
|
|
380
|
+
singular_seen: set[str] = set()
|
|
372
381
|
for role in reference_roles:
|
|
373
382
|
field = SEEDANCE_REFERENCE_ROLES.get(role)
|
|
374
383
|
if field is None:
|
|
375
384
|
raise ValueError(f"unsupported Seedance reference role: {role}")
|
|
385
|
+
if role in SEEDANCE_SINGULAR_ROLES:
|
|
386
|
+
if role in singular_seen:
|
|
387
|
+
raise ValueError(f"Seedance accepts one {role} reference")
|
|
388
|
+
singular_seen.add(role)
|
|
389
|
+
# A frame role still occupies a picture slot, so it keeps counting: the
|
|
390
|
+
# tokens are positional, and skipping one would point every later
|
|
391
|
+
# `@图片N` in the prose at the wrong picture.
|
|
376
392
|
counters[field] += 1
|
|
377
393
|
reference_tokens.append(f"@{labels[field]}{counters[field]}")
|
|
378
394
|
if task_type in {"edit", "extend"} and "reference_video" not in reference_roles:
|
|
@@ -738,6 +754,82 @@ def compile_gpt_image_2_payload(job: Mapping[str, Any]) -> dict[str, Any]:
|
|
|
738
754
|
}
|
|
739
755
|
|
|
740
756
|
|
|
757
|
+
MINIMAX_SPEECH_EMOTIONS = {
|
|
758
|
+
"happy", "sad", "angry", "fearful", "disgusted", "surprised", "neutral",
|
|
759
|
+
}
|
|
760
|
+
|
|
761
|
+
|
|
762
|
+
def compile_minimax_speech_payload(job: Mapping[str, Any]) -> dict[str, Any]:
|
|
763
|
+
"""Compile a tts job into the official MiniMax speech JSON body.
|
|
764
|
+
|
|
765
|
+
The voice catalogue is deliberately not enumerated here. Which preset voices
|
|
766
|
+
an account can reach depends on the model and the account, no published list
|
|
767
|
+
is authoritative for both, and a list frozen into this file would either
|
|
768
|
+
refuse a voice that works or vouch for one that does not. The document owns
|
|
769
|
+
the value and a reviewer reads it; the adapter only checks its shape.
|
|
770
|
+
"""
|
|
771
|
+
|
|
772
|
+
text, parameters = _require_job(job, "tts")
|
|
773
|
+
parameters = _take(
|
|
774
|
+
parameters,
|
|
775
|
+
{"model", "voice_id", "speed", "vol", "pitch", "emotion",
|
|
776
|
+
"sample_rate", "bitrate", "format"},
|
|
777
|
+
)
|
|
778
|
+
model = parameters.pop("model", "")
|
|
779
|
+
if not isinstance(model, str) or not model.strip():
|
|
780
|
+
raise ValueError("MiniMax speech model must be explicitly configured")
|
|
781
|
+
voice_id = parameters.pop("voice_id", "")
|
|
782
|
+
if not isinstance(voice_id, str) or not voice_id.strip() or voice_id != voice_id.strip():
|
|
783
|
+
raise ValueError("MiniMax speech requires a confirmed voice_id")
|
|
784
|
+
if len(text) > MINIMAX_SPEECH_TEXT_LIMIT:
|
|
785
|
+
raise ValueError("MiniMax speech text exceeds the provider limit")
|
|
786
|
+
|
|
787
|
+
target_format = Path(job["outputs"][0]).suffix.casefold().lstrip(".")
|
|
788
|
+
requested_format = parameters.pop("format", target_format)
|
|
789
|
+
if requested_format != target_format or requested_format not in {"mp3", "wav"}:
|
|
790
|
+
raise ValueError("MiniMax output format must match a supported target extension")
|
|
791
|
+
sample_rate = parameters.pop("sample_rate", 32000)
|
|
792
|
+
bitrate = parameters.pop("bitrate", 128000)
|
|
793
|
+
if sample_rate not in {16000, 24000, 32000, 44100}:
|
|
794
|
+
raise ValueError("unsupported MiniMax sample rate")
|
|
795
|
+
if bitrate not in {32000, 64000, 128000, 256000}:
|
|
796
|
+
raise ValueError("unsupported MiniMax bitrate")
|
|
797
|
+
|
|
798
|
+
voice_setting: dict[str, Any] = {"voice_id": voice_id}
|
|
799
|
+
emotion = parameters.pop("emotion", None)
|
|
800
|
+
if emotion is not None:
|
|
801
|
+
if emotion not in MINIMAX_SPEECH_EMOTIONS:
|
|
802
|
+
raise ValueError("unsupported MiniMax speech emotion")
|
|
803
|
+
voice_setting["emotion"] = emotion
|
|
804
|
+
for name, low, high in (("speed", 0.5, 2.0), ("vol", 0.1, 10.0)):
|
|
805
|
+
value = parameters.pop(name, None)
|
|
806
|
+
if value is None:
|
|
807
|
+
continue
|
|
808
|
+
if isinstance(value, bool) or not isinstance(value, (int, float)):
|
|
809
|
+
raise ValueError(f"MiniMax speech {name} must be a number")
|
|
810
|
+
if not low <= float(value) <= high:
|
|
811
|
+
raise ValueError(f"MiniMax speech {name} is outside the supported range")
|
|
812
|
+
voice_setting[name] = float(value)
|
|
813
|
+
pitch = parameters.pop("pitch", None)
|
|
814
|
+
if pitch is not None:
|
|
815
|
+
if isinstance(pitch, bool) or not isinstance(pitch, int) or not -12 <= pitch <= 12:
|
|
816
|
+
raise ValueError("MiniMax speech pitch is outside the supported range")
|
|
817
|
+
voice_setting["pitch"] = pitch
|
|
818
|
+
|
|
819
|
+
return {
|
|
820
|
+
"model": model.strip(),
|
|
821
|
+
"text": text,
|
|
822
|
+
"stream": False,
|
|
823
|
+
"output_format": "hex",
|
|
824
|
+
"voice_setting": voice_setting,
|
|
825
|
+
"audio_setting": {
|
|
826
|
+
"sample_rate": sample_rate,
|
|
827
|
+
"bitrate": bitrate,
|
|
828
|
+
"format": requested_format,
|
|
829
|
+
},
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
|
|
741
833
|
def compile_minimax_music_payload(job: Mapping[str, Any]) -> dict[str, Any]:
|
|
742
834
|
"""Compile an audio job into the official MiniMax Music 3.0 JSON body."""
|
|
743
835
|
prompt, parameters = _require_job(job, "music")
|
|
@@ -1372,6 +1464,44 @@ def _run_minimax(job: Mapping[str, Any]) -> tuple[Path, str | None]:
|
|
|
1372
1464
|
)
|
|
1373
1465
|
|
|
1374
1466
|
|
|
1467
|
+
def _run_minimax_speech(job: Mapping[str, Any]) -> tuple[Path, str | None]:
|
|
1468
|
+
token = _credential("MINIMAX_API_KEY")
|
|
1469
|
+
body = compile_minimax_speech_payload(job)
|
|
1470
|
+
base = _base_url("MINIMAX_BASE_URL", MINIMAX_BASE_URL)
|
|
1471
|
+
result, _ = _request_json(
|
|
1472
|
+
f"{base}/t2a_v2",
|
|
1473
|
+
provider="minimax-speech",
|
|
1474
|
+
body=body,
|
|
1475
|
+
token=token,
|
|
1476
|
+
)
|
|
1477
|
+
base_resp = result.get("base_resp")
|
|
1478
|
+
if not isinstance(base_resp, Mapping) or base_resp.get("status_code") != 0:
|
|
1479
|
+
raise AdapterFailure(
|
|
1480
|
+
"MiniMax speech synthesis failed",
|
|
1481
|
+
code=_provider_code(result) or "generation_failed",
|
|
1482
|
+
request_id=_safe_token(result.get("trace_id")),
|
|
1483
|
+
)
|
|
1484
|
+
data = result.get("data")
|
|
1485
|
+
audio = data.get("audio") if isinstance(data, Mapping) else None
|
|
1486
|
+
if not isinstance(audio, str) or not audio:
|
|
1487
|
+
raise AdapterFailure(
|
|
1488
|
+
"MiniMax did not return audio data",
|
|
1489
|
+
code="missing_audio",
|
|
1490
|
+
request_id=_safe_token(result.get("trace_id")),
|
|
1491
|
+
)
|
|
1492
|
+
try:
|
|
1493
|
+
content = bytes.fromhex(audio)
|
|
1494
|
+
except ValueError as exc:
|
|
1495
|
+
raise AdapterFailure("MiniMax returned invalid audio data") from exc
|
|
1496
|
+
if not content:
|
|
1497
|
+
raise AdapterFailure("MiniMax returned empty audio data")
|
|
1498
|
+
trace_id = result.get("trace_id")
|
|
1499
|
+
return (
|
|
1500
|
+
_temporary_output(job, job["outputs"][0], content),
|
|
1501
|
+
trace_id if isinstance(trace_id, str) else None,
|
|
1502
|
+
)
|
|
1503
|
+
|
|
1504
|
+
|
|
1375
1505
|
def _run_minimax_video(job: Mapping[str, Any]) -> tuple[Path, str]:
|
|
1376
1506
|
token = _credential("MINIMAX_API_KEY")
|
|
1377
1507
|
base = _base_url("MINIMAX_VIDEO_BASE_URL", MINIMAX_VIDEO_BASE_URL)
|
|
@@ -1484,8 +1614,15 @@ def _selftest() -> None:
|
|
|
1484
1614
|
"modality": "music", "prompt": "cinematic", "references": [],
|
|
1485
1615
|
"outputs": ["制作成果/a.mp3"], "parameters": {"lyrics": "[Verse]\nHello"},
|
|
1486
1616
|
}
|
|
1617
|
+
speech = {
|
|
1618
|
+
"modality": "tts", "prompt": "你们做了多久?", "references": [],
|
|
1619
|
+
"outputs": ["制作成果/a.mp3"],
|
|
1620
|
+
"parameters": {"model": "configured-speech-model", "voice_id": "a-preset"},
|
|
1621
|
+
}
|
|
1487
1622
|
if compile_gpt_image_2_payload(image)["model"] != OPENAI_MODEL:
|
|
1488
1623
|
raise RuntimeError("GPT Image 2 self-test failed")
|
|
1624
|
+
if compile_minimax_speech_payload(speech)["voice_setting"]["voice_id"] != "a-preset":
|
|
1625
|
+
raise RuntimeError("MiniMax speech self-test failed")
|
|
1489
1626
|
seedance = compile_seedance_payload(
|
|
1490
1627
|
video,
|
|
1491
1628
|
model="configured-model",
|
|
@@ -1553,7 +1690,10 @@ def main() -> int:
|
|
|
1553
1690
|
parser.add_argument(
|
|
1554
1691
|
"provider",
|
|
1555
1692
|
nargs="?",
|
|
1556
|
-
choices=(
|
|
1693
|
+
choices=(
|
|
1694
|
+
"seedance", "gpt-image-2", "minimax-music", "minimax-h3",
|
|
1695
|
+
"minimax-speech",
|
|
1696
|
+
),
|
|
1557
1697
|
)
|
|
1558
1698
|
parser.add_argument("--selftest", action="store_true")
|
|
1559
1699
|
args = parser.parse_args()
|
|
@@ -1571,6 +1711,7 @@ def main() -> int:
|
|
|
1571
1711
|
"gpt-image-2": _run_openai,
|
|
1572
1712
|
"minimax-music": _run_minimax,
|
|
1573
1713
|
"minimax-h3": _run_minimax_video,
|
|
1714
|
+
"minimax-speech": _run_minimax_speech,
|
|
1574
1715
|
}
|
|
1575
1716
|
path, provider_job_id = runners[args.provider](job)
|
|
1576
1717
|
response: dict[str, Any] = {
|
|
@@ -49,8 +49,8 @@ license: MIT
|
|
|
49
49
|
只读对应资料,不预加载整个项目:
|
|
50
50
|
|
|
51
51
|
- 原著分析:[原著分析审查表](references/rubric-source-analysis.md)
|
|
52
|
-
-
|
|
53
|
-
-
|
|
52
|
+
- 故事、场景、行动与对白,改编是否守住原著人物与主线,已接受节奏档案的核对,开场、结尾与中段的局部检查:[故事剧本审查表](references/rubric-story-script.md)
|
|
53
|
+
- 身份、变体、连续性、时代与图片提示词:[资产提示词审查表](references/rubric-assets-prompts.md)
|
|
54
54
|
- 原文落实、镜头、关键帧与视频运动:[视觉运动审查表](references/rubric-visual-motion.md)
|
|
55
55
|
- 完整审查方法:[审查方法](references/review-method.md)
|
|
56
56
|
- 制作端常见缺陷:[生产质量门](references/production-quality-gates.md)
|
|
@@ -71,9 +71,8 @@ license: MIT
|
|
|
71
71
|
- 剧本对白、动作、声音、画面文字是否都有画面/声音承载;
|
|
72
72
|
- 人物、地点、道具状态和镜头起止是否连续;
|
|
73
73
|
- 提示词是否从准确起点到准确终点;
|
|
74
|
-
-
|
|
75
|
-
|
|
76
|
-
[视觉运动审查表](references/rubric-visual-motion.md));
|
|
74
|
+
- 目标模型画音同轨时,声音内容、时序和发声边界是否与来源一致;无对白镜是否交代底声或静默
|
|
75
|
+
(`VID-22`、`VID-23`,见 [视觉运动审查表](references/rubric-visual-motion.md));
|
|
77
76
|
- 私有输入、凭据、绝对路径或内部流程文字是否泄漏。
|
|
78
77
|
|
|
79
78
|
缺少必要输入时只停止依赖它的判断,其他问题可以继续汇总。
|
|
@@ -71,25 +71,12 @@
|
|
|
71
71
|
- 角色名/资产引用进入台词内文;
|
|
72
72
|
- 音效、环境底噪与对白方向没有来源或相互遮蔽。
|
|
73
73
|
|
|
74
|
-
目标模型画音同轨时(`VID-23
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
**空形式本身就是合规写法**:`non_diegetic_music: N/A` 是「本镜没有非画内配乐」的正面陈述,
|
|
81
|
-
不是待填占位符。只有整行不存在时才报,永远不要要求 owner 删掉已经写好的空形式;
|
|
82
|
-
- 用排除句代替声轨描述:正文出现 `No dialogue`、`无对白` 而没有正面写出这条声轨由什么组成、
|
|
83
|
-
覆盖多长——问题在于正文没交代本镜该有什么声音,不在于"否定会招来它";
|
|
84
|
-
- 完整性声明枚举了本镜没有的层:无对白镜写出
|
|
85
|
-
`The audio timeline is complete after the listed ambience, effects and timed dialogue.`
|
|
86
|
-
是一句与本镜事实不符的话;
|
|
87
|
-
- 无对白镜从没说清声轨**是什么**:既没有覆盖全时长的底声构成,也没给在场人物一个可见的
|
|
88
|
-
不说话状态(嘴唇闭合)。
|
|
89
|
-
|
|
90
|
-
中间两条同时出现时按一个 finding 报,证据引这两句话本身:它们互相矛盾,本身就是声音契约
|
|
91
|
-
没写清。修订要求写成正面声轨,不能是"再加一句不要对白"。本套件实测未观察到这组写法导致
|
|
92
|
-
模型补出台词,报 finding 时不要这样断言。
|
|
74
|
+
目标模型画音同轨时(`VID-23`),检查声音内容、时序、发声边界是否符合来源,
|
|
75
|
+
总结是否错误地引入不存在的声音层。无对白镜也应交代需要的底声或静默。
|
|
76
|
+
H3 无非画内配乐时,`non_diegetic_music: N/A` 是有效的空形式。
|
|
77
|
+
|
|
78
|
+
按实际遗漏、矛盾与影响报告问题,不因出现 `No dialogue` 或第二个否定句判错,
|
|
79
|
+
不把 H3 的小样本表现套到所有同轨模型上。相关证据指向同一个问题时合并报告。
|
|
93
80
|
|
|
94
81
|
### 5. 负面补丁淹没动作
|
|
95
82
|
|
|
@@ -71,7 +71,12 @@ Resolve upstream meaning first; do not polish prompt wording when the shot or as
|
|
|
71
71
|
## Revision and re-review
|
|
72
72
|
|
|
73
73
|
Group duplicate findings and route them to the owning skill. A revision request states the target outcome, preserve
|
|
74
|
-
set and review scope to rerun.
|
|
74
|
+
set and review scope to rerun.
|
|
75
|
+
|
|
76
|
+
`REV-14`: a revision request is a patch, not a rewrite. It names the smallest change at a cited location; local
|
|
77
|
+
findings never add up to a request to rewrite the episode. When the review compares a revision with the version before
|
|
78
|
+
it, any strong hook, payoff line, or comic beat that polishing removed is listed under `## 被删的强钩子` with its prior
|
|
79
|
+
location and a short quote, so the owner can restore it. The reviewer lists it; the owner decides. On a later explicit re-review request, read the current version, confirm the finding is addressed, check the
|
|
75
80
|
preserve set and close or retain each affected finding. A different reviewer is useful but not mechanically required.
|
|
76
81
|
|
|
77
82
|
## Anti-template review
|
|
@@ -72,6 +72,17 @@ validity.
|
|
|
72
72
|
|
|
73
73
|
Fail when a prop teleports, changes scale/material, or readable evidence is erased.
|
|
74
74
|
|
|
75
|
+
## Era
|
|
76
|
+
|
|
77
|
+
The era comes from source facts: devices, platforms, slang, stated years. Fail
|
|
78
|
+
when the era shown in `视觉设定.md`, `图片提示词.md` or `视频提示词.md` contradicts
|
|
79
|
+
them, or when a retro or aged descriptor (旧/老式/复古/褪色/斑驳, old, worn, dusty,
|
|
80
|
+
period, CRT) has neither a source basis nor an explicit creator choice (`AST-14`).
|
|
81
|
+
This is the visual layer of the source-fidelity check (`STY-07`): cite the source
|
|
82
|
+
fact and the conflicting line. A visual direction with
|
|
83
|
+
no era anchors, or entries that leave the era-specific form unstated, is a craft
|
|
84
|
+
note (`AST-15`).
|
|
85
|
+
|
|
75
86
|
## Prompt recipe review
|
|
76
87
|
|
|
77
88
|
All prompt types need purpose, exact binding, identifying facts, current variant,
|
|
@@ -5,9 +5,12 @@
|
|
|
5
5
|
- [Promise](#story-promise-and-engine)
|
|
6
6
|
- [Episode](#episode-shape)
|
|
7
7
|
- [Entry and serial memory](#entry-character-and-serial-memory)
|
|
8
|
+
- [Adaptation fidelity](#adaptation-fidelity)
|
|
8
9
|
- [Scene](#scene-test)
|
|
9
10
|
- [Action](#action-and-production-meaning)
|
|
10
11
|
- [Dialogue](#dialogue)
|
|
12
|
+
- [Rhythm profile](#rhythm-profile-rev-12)
|
|
13
|
+
- [Local passes](#local-passes-rev-13)
|
|
11
14
|
- [Findings](#common-findings)
|
|
12
15
|
|
|
13
16
|
## Story promise and engine
|
|
@@ -55,8 +58,9 @@
|
|
|
55
58
|
A capacity estimate (`STY-16`) is informational, never a blocking finding. If a
|
|
56
59
|
planned episode's shot/duration magnitude is far from the project's own accepted
|
|
57
60
|
ratios, note it as an advisory observation with the sampled basis, and leave the
|
|
58
|
-
resolution to the creator.
|
|
59
|
-
|
|
61
|
+
resolution to the creator. Do not derive a word, line, or shot quota from it. The only
|
|
62
|
+
numbers a review checks are the ones in an accepted rhythm profile
|
|
63
|
+
([below](#rhythm-profile-rev-12)), and never another project's numbers.
|
|
60
64
|
|
|
61
65
|
When the premise grants foreknowledge or externally authorized ability (`STY-17`), keep
|
|
62
66
|
two layers apart and cite each from its own place:
|
|
@@ -117,7 +121,28 @@ What is reportable:
|
|
|
117
121
|
A breathing scene should process a consequence rather than suspend the story.
|
|
118
122
|
|
|
119
123
|
Do not require a fixed hook type, beat count, reversal, climax timestamp, or
|
|
120
|
-
dialogue quota.
|
|
124
|
+
dialogue quota beyond what an accepted rhythm profile declares.
|
|
125
|
+
|
|
126
|
+
## Adaptation fidelity
|
|
127
|
+
|
|
128
|
+
Active only when the project adapts a source. Read the source span each mapping in
|
|
129
|
+
`项目开发/adaptation-map.jsonl` cites, then the episode record and screenplay.
|
|
130
|
+
|
|
131
|
+
- For each core source character: is their stance toward the protagonist, their way of
|
|
132
|
+
acting, and their relationships the same on screen as in the source (`STY-07`)?
|
|
133
|
+
Pressure made louder or spoken aloud is fine; a supportive figure turned oppressor,
|
|
134
|
+
or a relationship reversed, is a finding unless the creator accepted the change.
|
|
135
|
+
Cite the source fact and the conflicting screenplay line (`REV-03`).
|
|
136
|
+
- Does the main line still run the source's way, and does any invented detail
|
|
137
|
+
contradict a source fact?
|
|
138
|
+
- Is every character, scene, or opponent the source lacks registered as its own `add`
|
|
139
|
+
mapping, with the function it serves, why existing source material cannot carry it,
|
|
140
|
+
the source facts checked against it, and a line in the brief for the creator (`STY-30`)?
|
|
141
|
+
An addition hidden inside `change_carrier`, `merge`, or `move_earlier` notes is a
|
|
142
|
+
`craft_default` finding; an unregistered addition that also contradicts the source
|
|
143
|
+
is a `STY-07` finding.
|
|
144
|
+
- When an episode's opponent was manufactured to meet `opposed_reversals_per_episode_min`,
|
|
145
|
+
say so: the profile deviation is the honest outcome, not a new antagonist.
|
|
121
146
|
|
|
122
147
|
## Scene test
|
|
123
148
|
|
|
@@ -197,6 +222,54 @@ them fit this checklist. A loud scene can fail when nothing changes.
|
|
|
197
222
|
Silence, interruption, slang, narration, and sentence length are creator options,
|
|
198
223
|
not universal scoring ratios.
|
|
199
224
|
|
|
225
|
+
## Rhythm profile (`REV-12`)
|
|
226
|
+
|
|
227
|
+
Active only when `short-drama.json#/creator_authority/rhythm_profile` has `status`
|
|
228
|
+
`accepted`. A missing, `unset`, or `proposed` profile means nothing here is checked.
|
|
229
|
+
The review does arithmetic on the accepted values against the current screenplay and
|
|
230
|
+
nothing else:
|
|
231
|
+
|
|
232
|
+
| Field | What the reviewer measures |
|
|
233
|
+
|---|---|
|
|
234
|
+
| `first_hook_seconds` | Seconds from the episode start to the first hook: crisis, conflict, anomaly, or promised spectacle already happening on screen. |
|
|
235
|
+
| `beat_interval_seconds_max` | The longest gap between consecutive emotional touchpoints: a conflict line, a situation-changing action, or new information. |
|
|
236
|
+
| `opposed_reversals_per_episode_min` | Reversals driven or suffered by a human opponent with an agenda; changes completed by a system, a number, or the environment alone do not count. |
|
|
237
|
+
| `end_on_peak` | Whether the last beat sits on or just before the peak, with no afterglow, summary, or quiet coda after it. |
|
|
238
|
+
| `reprise_previous_last_beat` | Whether the opening replays the previous episode's last beat. Not applicable to the first episode. |
|
|
239
|
+
| `vo_share_max` | `[VO]` spoken characters as a share of all spoken characters; `$short-drama-write`'s duration estimate reports it when run with the project file. |
|
|
240
|
+
| `first_major_payoff_by_episode` | Series review only: the episode in which the first major payoff lands. |
|
|
241
|
+
|
|
242
|
+
Seconds come from the project's declared pacing, or from a real-time read-through
|
|
243
|
+
labelled as a text estimate; state which. A deviation is a `craft_default` finding that
|
|
244
|
+
cites the field, the accepted value, the measured value, and the location. Severity
|
|
245
|
+
follows audience impact and is never `blocker`; the creator may keep the episode with a
|
|
246
|
+
stated reason. Storyboard fields (`target_avg_shot_seconds`, `close_shot_share_min`)
|
|
247
|
+
are measured in the [visual rubric](rubric-visual-motion.md#rhythm-profile-shots).
|
|
248
|
+
|
|
249
|
+
## Local passes (`REV-13`)
|
|
250
|
+
|
|
251
|
+
After the whole-episode read, run three passes that each read one part only. A whole
|
|
252
|
+
read lets a strong middle excuse a flat opening; a part read cannot.
|
|
253
|
+
|
|
254
|
+
1. **Opening hook**: read only the first segment, up to `first_hook_seconds` or, with
|
|
255
|
+
no accepted profile, the first scene. Would a viewer who saw only this stay? Name
|
|
256
|
+
the hook and say whether it is happening or only being set up. Then read the first
|
|
257
|
+
beat alone, the opening frame: does it raise a question by itself,
|
|
258
|
+
or does it need on-screen text read, a character recognized, or the next line heard
|
|
259
|
+
first (`SCR-22`)? A still image that poses its own question passes. For a first
|
|
260
|
+
episode, also check that the brief compared the entry candidates on that same image
|
|
261
|
+
(`STY-25`).
|
|
262
|
+
2. **Ending suspense**: read only the last segment, the final scene's closing beats.
|
|
263
|
+
What question is left open? Does it grow out of this episode's result? Is it a line
|
|
264
|
+
hook (an unfinished question, an identity hint) or an image hook (a door half open,
|
|
265
|
+
an envelope half torn)? Does it stop before the answer?
|
|
266
|
+
3. **Mid-episode reversal density**: read only the middle. List each reversal with its
|
|
267
|
+
location and the person driving or suffering it; flag long stretches with no
|
|
268
|
+
touchpoint and reversals bunched at the end.
|
|
269
|
+
|
|
270
|
+
Each finding cites its own segment. The passes apply with or without a profile; only
|
|
271
|
+
the numeric comparisons need one.
|
|
272
|
+
|
|
200
273
|
## Replaceable realization (`SCR-10`)
|
|
201
274
|
|
|
202
275
|
Only for beats the creator marked. **An unmarked beat leaves this section
|
|
@@ -230,6 +303,7 @@ the benefit is not, and the mark exists precisely so the strong version can stay
|
|
|
230
303
|
- cliffhanger withholds all payoff;
|
|
231
304
|
- episode pauses an unfinished action without producing a local result (`STY-13`);
|
|
232
305
|
- first episode dumps the backstory reservoir instead of selecting an active entry;
|
|
306
|
+
- an adaptation hardens a source character or invents an opponent without an `add` mapping or creator acceptance;
|
|
233
307
|
- a declared character arc has no pressure test, choice, cost, or changed strategy;
|
|
234
308
|
- serial summary omits an information permission or unpaid setup obligation;
|
|
235
309
|
- generic emotion adjectives replace visible performance;
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
- [Keyframe](#frozen-keyframe)
|
|
8
8
|
- [Motion](#motion)
|
|
9
9
|
- [Continuity](#cross-shot-continuity)
|
|
10
|
+
- [Rhythm profile](#rhythm-profile-shots)
|
|
10
11
|
- [Findings](#common-findings)
|
|
11
12
|
- [Production risks and authorized observations](#production-risk-and-authorized-observation-checklist-rev-08)
|
|
12
13
|
|
|
@@ -31,6 +32,11 @@
|
|
|
31
32
|
- Why is this a new shot?
|
|
32
33
|
- Do framing and camera behavior serve attention, alignment, pressure, reveal, or
|
|
33
34
|
rhythm rather than decorate the prose?
|
|
35
|
+
- Does each shot's `运镜` line state a behavior and a reason chosen from the shot's
|
|
36
|
+
purpose (`SHT-04`)? A stated lock-off with its reason passes. An episode locked on
|
|
37
|
+
nearly every shot while its peak gets no movement is a finding; so is a missing line,
|
|
38
|
+
which leaves the choice to the video-prompt stage; a bare 「运镜:固定」 with no reason
|
|
39
|
+
is also a finding.
|
|
34
40
|
- Are Location/View, axis, screen direction, eyelines, entrances, positions,
|
|
35
41
|
hands, and props coherent?
|
|
36
42
|
- Are exact asset variants bound?
|
|
@@ -39,6 +45,15 @@
|
|
|
39
45
|
- Do crop, occlusion, focus, back view, and offscreen space serve that information
|
|
40
46
|
permission rather than accidentally reveal or conceal it?
|
|
41
47
|
|
|
48
|
+
## Rhythm profile: shots
|
|
49
|
+
|
|
50
|
+
Under the `REV-12` conditions in the [story rubric](rubric-story-script.md#rhythm-profile-rev-12),
|
|
51
|
+
measure two storyboard fields: the average shot length per scene (scene duration divided
|
|
52
|
+
by its shot count) against `target_avg_shot_seconds`, and the share of close-range shots
|
|
53
|
+
across the episode, as the profile field defines them, against `close_shot_share_min`. The average is a
|
|
54
|
+
scene-level target; one long or short shot is not a finding. Also report durations folded
|
|
55
|
+
from screenplay word counts instead of the scene's sound timeline (`SHT-28`).
|
|
56
|
+
|
|
42
57
|
## Frozen keyframe
|
|
43
58
|
|
|
44
59
|
- Can all described facts exist in one still instant?
|
|
@@ -86,41 +101,15 @@
|
|
|
86
101
|
- Does each media reference state its exact purpose, what may be copied, and what
|
|
87
102
|
must not be copied, rather than treating all visible pixels as authority?
|
|
88
103
|
|
|
89
|
-
For a copyable body,
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
rendered — did not reproduce in this suite's probes, so cite the body's own clarity,
|
|
99
|
-
not that mechanism, when you raise this.)
|
|
100
|
-
- When the target model generates audio in the same pass (`VID-23`), is the sound written
|
|
101
|
-
as a closed positive event set — what the track consists of, and across what span —
|
|
102
|
-
rather than a list of what must not be heard? Check three failures by name:
|
|
103
|
-
- an exclusion clause (`No dialogue`, `无对白`, `no music`) standing in for a positive
|
|
104
|
-
soundscape, so the body never says what this shot sounds like;
|
|
105
|
-
- a completeness declaration that enumerates a layer this shot does not have. "The audio
|
|
106
|
-
timeline is complete after the listed ambience, effects and timed dialogue" on a shot
|
|
107
|
-
with no lines states something untrue of this shot. Read the declaration against the
|
|
108
|
-
shot's actual layers, not against a template;
|
|
109
|
-
- a shot that leaves the non-diegetic music layer unstated. This is the one sound defect
|
|
110
|
-
with measured consequences: bodies that omitted the layer came back with an invented
|
|
111
|
-
score. **The dialect's empty form satisfies this** — for H3 that is the literal line
|
|
112
|
-
`non_diegetic_music: N/A`, which is a correct statement of "no non-diegetic music",
|
|
113
|
-
not a placeholder. Raise this only when the layer is missing from the body altogether;
|
|
114
|
-
never ask an owner to delete a present empty form;
|
|
115
|
-
- a shot with no lines whose body never says what the track *is* for the full duration,
|
|
116
|
-
and never gives the on-screen performers a visible non-speaking state.
|
|
117
|
-
Report a contradictory pair — an exclusion clause plus a declaration that enumerates the
|
|
118
|
-
excluded layer — as one finding against the body's sound contract, and quote both
|
|
119
|
-
sentences. Raise it as an internally inconsistent sound contract, which it is; do not
|
|
120
|
-
assert that it makes the model invent lines, which this suite has probed and not seen.
|
|
121
|
-
|
|
122
|
-
These two apply to a body the review itself is about to ask an owner to rewrite. A revision
|
|
123
|
-
request that removes a defect by adding `no ...` has moved the defect, not fixed it.
|
|
104
|
+
For a copyable body (`VID-22`, `VID-23`), check that actions and sound match the
|
|
105
|
+
source and that the timeline accounts for the intended ambience or silence.
|
|
106
|
+
A summary must not introduce a layer absent from the shot. H3's
|
|
107
|
+
`non_diegetic_music: N/A` is a valid empty music layer.
|
|
108
|
+
|
|
109
|
+
Report a concrete contradiction, omission or ambiguity. A negative clause is
|
|
110
|
+
not a defect by itself; do not impose a clause count or assume that negation
|
|
111
|
+
causes the model to generate the excluded content. Keep model-specific
|
|
112
|
+
observations scoped to their tested model and execution path.
|
|
124
113
|
|
|
125
114
|
For a pickup or alternate, ask these separately:
|
|
126
115
|
|
|
@@ -22,6 +22,9 @@
|
|
|
22
22
|
| REV-09 | reviewed_invariant | After prompt revision or repackaging, recheck source coverage and every applicable accepted directive; correct asset bindings alone do not prove compliance. |
|
|
23
23
|
| REV-10 | reviewed_invariant | A project-calibration finding distinguishes input-reference from generated-result observation, binds the exact project, the prompt/spec records it observed, stable reference slots, production configuration, method and limits, and—when its disposition calls for a change (see REV-11)—proposes the smallest owner-routed one with a preserve set; it does not generalize across projects or infer quality from task state. |
|
|
24
24
|
| REV-11 | reviewed_invariant | A calibration finding carries `disposition` (keep, post_production, targeted_edit, resubmit, rewrite) and `disposition_rationale` before any revision text, justified by whether the defect is text-controllable and whether it has already recurred. Dispositions that call for no change leave `required_change` empty rather than inventing one. Resubmitting identical text and appending quality adjectives are not repairs; a recurring defect routes to a structural change instead. Findings outside project calibration use `not_applicable`. |
|
|
25
|
+
| REV-12 | craft_default | When the project's rhythm profile has status `accepted`, review checks the episode against it by arithmetic on the accepted values only and reports a deviation as a non-blocking finding citing field, accepted value, measured value, and location; the creator may keep the episode with a stated reason. A missing or proposed profile leaves the check inactive, and no finding compares against another project's or a suite-wide number. |
|
|
26
|
+
| REV-13 | craft_default | Beyond the whole-episode read, three local passes each read one part only: an opening-hook pass on the first segment, which also reads the first beat alone as the opening frame, an ending-suspense pass on the last segment, and a reversal-density pass on the middle. |
|
|
27
|
+
| REV-14 | craft_default | A revision request is a patch at a cited location with a preserve set, never a whole-episode rewrite; a strong hook, payoff line, or comic beat removed by polishing is logged with its prior location and quote so the owner can restore it. |
|
|
25
28
|
|
|
26
29
|
规则分级由高到低:`structural_invariant`(结构缺陷,阻断)、
|
|
27
30
|
`reviewed_invariant`(需证据判断)、`craft_default`(常用做法,可覆盖)、
|
|
@@ -7,7 +7,8 @@ license: MIT
|
|
|
7
7
|
# 短剧分镜与冻结关键帧
|
|
8
8
|
|
|
9
9
|
把剧本和视觉事实转成有镜头职责、空间连续性和可冻结起点的 `剧集/<EP>/分镜.md`。
|
|
10
|
-
每镜使用二级标题 `## SHOT-...`,同镜下用 `### 冻结关键帧提示词`
|
|
10
|
+
每镜使用二级标题 `## SHOT-...`,同镜下用 `### 冻结关键帧提示词` 写起始帧正文;
|
|
11
|
+
需要时另加 `### 收尾关键帧提示词` 写终点正文。
|
|
11
12
|
|
|
12
13
|
## Quick Start
|
|
13
14
|
|
|
@@ -25,6 +26,9 @@ license: MIT
|
|
|
25
26
|
分配镜头时长前读取
|
|
26
27
|
`short-drama.json#/creator_authority/production_profile/choices/native_duration_seconds`。已声明目标模型但
|
|
27
28
|
没有原生时长时先补这一个选择;目标模型也未声明时照常按叙事节奏设计,不猜供应商限制。
|
|
29
|
+
同时读取 `short-drama.json#/creator_authority/rhythm_profile`:`status` 为 `accepted` 时,镜长按
|
|
30
|
+
[镜长从哪来](references/shot-craft.md#镜长从哪来-sht-28) 由声音事件与 `target_avg_shot_seconds` 推出,
|
|
31
|
+
全集近景类镜头占比不低于 `close_shot_share_min`;档案缺失或未接受时不核对这些数值。
|
|
28
32
|
|
|
29
33
|
冻结关键帧写完之前,谁会出现在这一格画面里还没有定下来。所以三条依据都在关键帧之后回填,
|
|
30
34
|
读的是成稿画面,不是镜头意图。
|
|
@@ -47,12 +51,17 @@ license: MIT
|
|
|
47
51
|
2. 确定观众何时知道什么、对齐谁、空间如何揭示、转折落在哪个可见动作。
|
|
48
52
|
剧本或 Brief 用“前半段 / 后半段 / 前三分之一 / 最后 N 秒”等相对时间限定首次出现、释放或禁止时,
|
|
49
53
|
先用已接受集长换成明确时间边界再分镜;例如 60 秒作品的“后半段首次出现”不得早于 30 秒。
|
|
50
|
-
3.
|
|
54
|
+
3. 每镜写清唯一职责、来源、时长、景别/机位、运镜、起点、唯一主要动作、终点和声音;用
|
|
51
55
|
`起点 → 唯一动作 → 终点` 直接说明人物、双手与持物怎样完成本镜状态转换。三条依据留到第 6 步。
|
|
56
|
+
「运镜」按本镜目的逐镜选,写行为和理由,固定也写理由,见 [运镜逐镜选](references/shot-craft.md#运镜逐镜选-sht-04)。
|
|
52
57
|
有对白、VO 或 OS 时,先按原文和人物说话方式估算完整发声时间,再安排不能重叠的动作、停顿与
|
|
53
58
|
末尾反应;把估时依据简写在本镜「声音」里。具体做法见 [对白估时](references/shot-craft.md#对白估时)。
|
|
59
|
+
对白场先按 [对白覆盖默认](references/shot-craft.md#对白场怎么切-sht-29) 放切点;镜长不按剧本字数折算。
|
|
54
60
|
4. 锁定人物朝向、位置、视线、持物、出入口、屏幕方向和必要状态;上游已有会限制动作空间的持续关系时,把关系投影进本镜起点与终点。
|
|
55
61
|
5. 冻结关键帧只投影镜头起点;删除终点才出现的文字、动作、姿态或道具状态。
|
|
62
|
+
镜头的职责落在收尾那一下时,另写 `### 收尾关键帧提示词` 投影**终点**——同一格画面的
|
|
63
|
+
另一端,规则完全对称:删除起点才有、终点已经不在的东西。它是可选的,写法与取舍见
|
|
64
|
+
[首尾成对](references/shot-craft.md#首尾成对)。
|
|
56
65
|
6. 关键帧成稿后,先从成稿正文读出这一格里需要保持身份、造型或地理的人物、地点和道具,
|
|
57
66
|
再用同一份清单一次填满三条依据:
|
|
58
67
|
|
|
@@ -71,22 +80,24 @@ license: MIT
|
|
|
71
80
|
|
|
72
81
|
- 每镜有唯一职责、明确来源、可见起止状态和合理时长。「来源」以《剧本.md》里真实存在的场景 ID 开头,
|
|
73
82
|
ID 之后可以跟必要短引文,跨场次的镜头用 `、` 连写多条;`creator_markdown_check.py` 会核对每个 ID 都解析得到。
|
|
74
|
-
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
确实看不见就在「视觉依据」末尾写 `;画外:<类别>「<名称>」`,机械核对认这个写法。
|
|
83
|
+
- 「来源」短引文应对应本镜承担的动作或声音。正文提到画外人物时,可在视觉依据写
|
|
84
|
+
`;画外:<类别>「<名称>」`;这只声明其不在画面,不能代替必要动作的落实。
|
|
85
|
+
需要看见的动作应另有镜头承载,或说明为何省略。
|
|
86
|
+
|
|
79
87
|
- 剧本里的每个场景都要有镜头承载。确实决定不拍某一场时,在《分镜.md》正文开头写一行
|
|
80
88
|
`- 未拍场次:<场景 ID>(理由:……)`,多项用 `;` 连接。SHT-01 一直允许带理由的省略,
|
|
81
89
|
但省略和漏拍在成稿文档里长得一模一样,所以理由要写下来,而不是留在对话里。
|
|
82
|
-
-
|
|
83
|
-
|
|
90
|
+
- 已声明原生时长时,每镜照常有自己的唯一职责、起止边界和冻结关键帧,镜长先按叙事需要定。短于最短秒数
|
|
91
|
+
的镜头,向创作者提议把同场相邻的几镜装进一个多镜容器,在交付档案里声明;目标方言要求时,容器的每一切
|
|
92
|
+
都要有已接受的关键帧图片,能否装、怎么装由 `$short-drama-video-prompts` 的方言决定。创作者没有声明
|
|
93
|
+
多镜容器、或方言不支持时,镜头落在最短秒数内,动作完成后保持终点。长于上限的动作按可见状态闭合点拆镜,
|
|
94
|
+
拆出的每镜仍各有唯一职责与可信交界。
|
|
84
95
|
- 「唯一动作」写从本镜起点到终点的那条可见状态链;涉及交接、换手、放置或取回时,把接触者、
|
|
85
96
|
接触方式和物件落点写在同一链里,不能让合法终点之间靠镜外瞬移衔接。
|
|
86
97
|
- 切镜必须带来信息、权力、情绪、空间或节奏变化;同义重复镜头删掉。
|
|
87
98
|
- 相对时间词约束的是事件首次可见或可听的时刻,不因前置动作已经完成就提前释放;分镜时间轴直接
|
|
88
99
|
写出该边界,不把“稍后”“交接后”等叙事顺序当成数值时间的替代。
|
|
89
|
-
-
|
|
100
|
+
- 同一动作不跨镜重复发生,峰值处声明过的[冲击重复](references/shot-craft.md#动作落实表)除外;终点应能成为下一镜可信起点。
|
|
90
101
|
- 关键信息的可读性优先于装饰性运镜,竖屏构图优先保证主体和反应可见。
|
|
91
102
|
- 复杂群戏先锁空间锚点和屏幕方向,再决定景别变化。
|
|
92
103
|
- 起终边界除了逐人姿态,还要写清本镜依赖的身体—物件—空间关系。关系在镜内不变时两端都保留;确需改变时,过程与终点必须有剧本依据。
|
|
@@ -140,11 +151,12 @@ license: MIT
|
|
|
140
151
|
默认只读本 SKILL、当前剧本和必要视觉事实。遇到对应问题时只打开一份:
|
|
141
152
|
|
|
142
153
|
- 阶段边界与规则分级:[阶段契约](references/stage-contract.md)
|
|
143
|
-
-
|
|
154
|
+
- 镜头职责、切镜理由、镜长推导、对白覆盖和边界:[镜头手艺](references/shot-craft.md)
|
|
144
155
|
- 实际制作所需的镜头语法:[生产镜头语法](references/production-shot-grammar.md)
|
|
145
156
|
- 关键场次比较导演方案:[场次视觉计划](references/scene-visual-plan.md)
|
|
146
157
|
- 检查原文是否都有画面承载:[Coverage Audition](references/coverage-audition.md)
|
|
147
158
|
- 多人、群体和复杂空间调度:[调度手册](references/blocking-playbooks.md)
|
|
159
|
+
- 谁被照亮、怎么写才执行得出:[光的设计](references/lighting-craft.md)
|
|
148
160
|
- 冻结瞬间、注意中心和可读性:[关键帧手艺](references/keyframe-craft.md)
|
|
149
161
|
- 漫剧/二维漫画形态的共享画风词汇:[漫剧关键帧词表](references/comic-keyframe-lexicon.md)
|
|
150
162
|
- 剧本事实到关键帧的完整示例:[剧本到关键帧](references/screenplay-to-keyframe-example.md)
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
- 先保证进出方向和视线连续,再用近景强化选择。
|
|
25
25
|
|
|
26
26
|
可以按以下顺序设计:空间锚点与入口 → 每人的行动目标和筹码 → 群体注意中心 →
|
|
27
|
-
关键动作前后的站位 → 哪些同时反应必须留在全景中 →
|
|
27
|
+
关键动作前后的站位 → 哪些同时反应必须留在全景中 → 再按[对白覆盖默认](shot-craft.md#对白场怎么切-sht-29)切到说话者、听者和插入镜。
|
|
28
28
|
|
|
29
29
|
常见问题:每句台词都切一个头像近景;站位只为填满画面;背景人物在切镜后无原因换边;
|
|
30
30
|
重要人物一直被前景遮住,但剧情并未利用这种遮挡。
|