@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
|
@@ -37,8 +37,8 @@ license: MIT
|
|
|
37
37
|
现成剧本可直接拆资产;已有视觉事实可直接写图片提示词或分镜;已有分镜可直接写视频提示词。
|
|
38
38
|
不要为补齐名义流水线伪造上游。
|
|
39
39
|
|
|
40
|
-
|
|
41
|
-
|
|
40
|
+
五份创作文档记录剧本、视觉与提示词;剪辑单在素材生产后记录取舍和后期处理。
|
|
41
|
+
修改故事、镜头职责或上游时长声明时,回到负责该内容的文档。
|
|
42
42
|
|
|
43
43
|
## 执行请求
|
|
44
44
|
|
|
@@ -91,7 +91,7 @@ python3 {技能目录}/scripts/project_tool.py set-authority <project> \
|
|
|
91
91
|
--decision-ref "创作者决策/production-profile.jsonl#CD-H3"
|
|
92
92
|
```
|
|
93
93
|
|
|
94
|
-
各字段取值由命中的模型方言给出:`$short-drama-video-prompts` 的 MiniMax H3 / Seedance 方言文件都写了
|
|
94
|
+
各字段取值由命中的模型方言给出:`$short-drama-video-prompts` 的 MiniMax H3 / Seedance / Wan 3.0 方言文件都写了
|
|
95
95
|
推荐档案。写完用 `status` 复核 `video_model_profile` 是否已经出现。
|
|
96
96
|
|
|
97
97
|
项目定位与安全写入见 [运行预检](references/runtime-preflight.md)。用户明确要求 Dashboard 时运行:
|
|
@@ -112,13 +112,25 @@ python3 {技能目录}/scripts/dashboard_server.py --workspace <workspace> --sto
|
|
|
112
112
|
同一 workspace 已有在跑的 Dashboard 时,再次启动只会打印同一个链接,不再开第二个端口;确实要换
|
|
113
113
|
端口或换令牌时加 `--restart`。不加 `--detach` 时行为不变:前台运行,Ctrl-C 结束。
|
|
114
114
|
|
|
115
|
-
Dashboard
|
|
115
|
+
Dashboard 按阶段展示项目:全剧页给出下一步和分集进度,每集分剧本、设定、分镜、提示词、成片、审查
|
|
116
|
+
六个视图,⌘K 搜索全剧。结构视图只读,改动在「编辑原文」里保存 Markdown。画面只认文档里的绑定:
|
|
117
|
+
缩略图是分镜里 `用途:起始帧` 的 `REF-...`,每镜素材是剪辑单的「来源」,成片是剪辑输出;没有绑定
|
|
118
|
+
就显示空位,不按文件名配图。它不负责工作流编排或媒体生产,需要写作或生成的地方只复制一句请求交回对话。
|
|
119
|
+
每集目标时长取自 `status` 的 `format`,节奏对照只用已接受的 `rhythm_profile`。
|
|
116
120
|
|
|
117
121
|
## 项目级创作决定
|
|
118
122
|
|
|
119
123
|
制作形态、视觉方向、播放面和集长目标确实约束多个阶段时,展示选择及影响后由用户决定。
|
|
120
124
|
Look Development 是可选分支,不是进入图片提示词或分镜的固定门槛。
|
|
121
125
|
|
|
126
|
+
节奏数值(首钩秒数、情绪触点间隔、反转次数、VO 占比、平均镜长等)住在
|
|
127
|
+
`creator_authority.rhythm_profile`。字段与默认值由 `$short-drama-develop` 按制作形态提出,
|
|
128
|
+
创作者接受或改写后,按上文三步写入:决策的 `accepted_value` 是完整档案对象,`--field`
|
|
129
|
+
写 `/creator_authority/rhythm_profile`;档案已接受后,单改一个值时 `--field` 指向该字段。
|
|
130
|
+
`set-authority` 只校验类型与范围,缺字段、越界或多出未知字段都拒绝写入。下游只按 `status` 为 `accepted` 的档案做算术核对,缺失、`unset` 或
|
|
131
|
+
`proposed` 都表示「未声明,不核对」。写完用 `status` 复核 `rhythm_profile`;手改后档案不合法时
|
|
132
|
+
它返回空档案,问题列在 `rhythm_profile_problems`。
|
|
133
|
+
|
|
122
134
|
按问题只读取一份相关知识:
|
|
123
135
|
|
|
124
136
|
- 规则分级与 owner 路由:[规则与路由索引](references/knowhow-index.md)
|
|
@@ -56,6 +56,7 @@
|
|
|
56
56
|
- 时长:4s
|
|
57
57
|
- 目的:先让观众看见他不敢进门,再揭示门内争吵。
|
|
58
58
|
- 景别/机位:中近景,门框外侧,轻微低机位。
|
|
59
|
+
- 运镜:固定;他收手的那一下要自己被看见,机位不抢。
|
|
59
60
|
- 起点:江辰右手悬在门把上方。
|
|
60
61
|
- 唯一动作:门内玻璃落地声触发江辰收回右手,视线从门把转向门缝。
|
|
61
62
|
- 终点:江辰右手垂回身侧,视线落在门缝。
|
|
@@ -67,6 +68,8 @@
|
|
|
67
68
|
> 按项目提示词语言编写的冻结瞬间正文……
|
|
68
69
|
```
|
|
69
70
|
|
|
71
|
+
「运镜」写行为和理由,固定也要写理由,如「运镜:固定;这句话没有落到谁身上」。
|
|
72
|
+
|
|
70
73
|
只写有镜头职责的镜头。关键帧提示词必须与该镜“起点”一致;终点才出现的文字、动作或状态不得
|
|
71
74
|
提前进入静帧,也不要把整段动作塞进静帧。
|
|
72
75
|
|
|
@@ -22,27 +22,38 @@
|
|
|
22
22
|
| 故事承诺与冲突引擎 | `$short-drama-develop` | 从点子建立可持续压力与回报 | 不用题材词直接生成剧情 |
|
|
23
23
|
| 单集契约与集尾交接 | `$short-drama-develop` | 规划进入状态、局部结果与出去压力 | 不代替剧本场景执行 |
|
|
24
24
|
| 单元里被反复运行的机制与耗尽 | `$short-drama-develop` | 单元故事靠同一套机制反复兑现,或中段开始重复、越写越薄 | 不规定运行次数与换代位置;不替单集决定怎么写 |
|
|
25
|
+
| 爽点排名与开篇替换点 | `$short-drama-novel-analyze` | 选段与切候选集之前,按观众收益给全书情节点排名 | 排名是候选;从哪里开篇、提前哪段由创作者与 develop 定 |
|
|
26
|
+
| 项目节奏档案 | `$short-drama-develop` | 按制作形态提出首钩、触点间隔、反转、VO 占比、镜长等项目数值 | 只提起点值;创作者接受后下游只做算术核对,未声明不核对 |
|
|
25
27
|
| 单集容量可行性 | `$short-drama-develop` | 进入场景化前估算各集镜头与时长量级 | 用项目自身比例,不设跨项目门槛,不阻断交付 |
|
|
26
28
|
| 连载人物与恢复记忆 | `$short-drama-develop` | 跨集人物策略、信息权限与铺垫债务较重 | 单场任务不必建立全量记忆 |
|
|
27
29
|
| 长材料改编 | `$short-drama-develop` | 压缩、合并或把说明转成屏幕载体 | 不复制原句或文风到新剧本 |
|
|
30
|
+
| 改编守住人物与新增登记 | `$short-drama-develop` | 改编时想新增人物、场景或对手,或想改一个原著人物的立场与关系 | 核心人物立场、核心关系与主线不改;新增登记为 `add` 交创作者确认 |
|
|
28
31
|
| 题材条件与钩子 | `$short-drama-develop` | 需要按压力机制比较题材写法 | 不把案例节拍、数字或标签当公式 |
|
|
29
32
|
| 单题材执行细节 | `$short-drama-develop` | 已确定题材、要落到场面颗粒与打法 | 一次只读一张卡;卡片不产生可阻断约束 |
|
|
30
33
|
| 前提装置(先知或外部授权) | `$short-drama-develop` | 主角带着已知结果开局,或获得一套外部规则给的能力 | 装置叠加在题材之上,不替代题材卡,也不新建题材 |
|
|
31
34
|
| 单形态执行细节 | `$short-drama` | 已确定制作形态、要按表定位一张形态卡 | 一次只读一张卡;形态不改写身份与地理 |
|
|
32
35
|
| Look Development 与风格帧 | `$short-drama` | 把视觉方向变成人物、地点和高压力代表帧的可观察规则 | `$short-drama-image-prompts` 只投影提示词;风格不接管身份、地理或剧情 |
|
|
33
36
|
| 场景与可表演行动 | `$short-drama-write` | 把单集节拍落实成场景 | 不决定分镜景别和运镜 |
|
|
37
|
+
| 开场第一拍 | `$short-drama-write` | 写每集第一段动作描写,也就是观众开场第一帧的画面 | 静止画面自己能提出问题也算;不规定第一拍必须动 |
|
|
34
38
|
| 对白行动与人物声音 | `$short-drama-write` | 写、改或诊断对白 | 不按句长、口癖数量判权力 |
|
|
35
39
|
| 多人场次的可辨识度与主角缺席场 | `$short-drama-write` | 一场里人多到分不清谁在与谁交手,或某场/某集不给主角 | 不决定站位、景别与镜头切换;那属于分镜 |
|
|
36
40
|
| 场次声音戏剧 | `$short-drama-write` | 声源、留白或 sound bridge 承担故事信息与压力 | 不替逐镜实现或混音,不让配乐替代表演 |
|
|
37
41
|
| 剧本生产标签 | `$short-drama-write` | 规范化对白、动作、VO/OS、文字与连续性 | 不借格式补造剧情 |
|
|
42
|
+
| 节奏档案落地 | `$short-drama-write` | 项目已接受节奏档案,要让首钩、触点间隔、有对手的反转与集尾落在档案数值内 | 只读档案、不改档案;数值是上下限不是节拍模板;未接受不核对 |
|
|
43
|
+
| 旁白占比与能演的不说 | `$short-drama-write` | 旁白复述已演出的信息、内心独白过多,或痛点只被说出没被演出 | 占比只按已接受档案核对 |
|
|
44
|
+
| 对白初稿回读删句 | `$short-drama-write` | 对白初稿写完回读,删掉不承担动作或冲突、演不出来的句子 | 不修剪创作者提供的原文 |
|
|
38
45
|
| 有限行动单位与精确时限 | `$short-drama-write` | 题面明确给出可核对的次数、轮次、节拍或字面死线 | 按完成状态与题面约定检查,不把定性压力升级为数字或主动增加计数结构 |
|
|
39
46
|
| 资产出现证据 | `$short-drama-assets` | 从剧本拆角色、地点、道具与状态 | 不用名词/人名匹配直接建资产 |
|
|
40
47
|
| 身份、变体与复用 | `$short-drama-assets` | 决定复用、新变体、新身份或未决 | 相机角度通常不是资产变体 |
|
|
41
48
|
| 原著自带的真实品牌与现实实体 | `$short-drama-assets` | 剧本沿用了原著专名,且该专名指向现实存在的品牌、商标、机构或人物 | 不判断合规、不给禁令、不内置清单;只把选择交给创作者并留痕 |
|
|
49
|
+
| 时代锚点 | `$short-drama-assets` | 定项目时代,或场所、设备、制服要落到某个年代的形制 | 时代从原著事实定;旧、老式、复古要有原著依据或创作者选择 |
|
|
42
50
|
| 资产图片提示词 | `$short-drama-image-prompts` | 把已接受资产投影为单帧可见规格 | 不承载有先后顺序的剧情动作 |
|
|
43
51
|
| 场景板光线与跨 View 一致 | `$short-drama-image-prompts` | 同一地点要拆多个观察方向、且这些板会被互相剪接 | 朝向造成的逆光/落影差异不需拉平 |
|
|
44
52
|
| 图片提示词定点修改 | `$short-drama-image-prompts` | 修改局部并冻结 preserve set | 不把重写整图伪装成局部编辑 |
|
|
45
53
|
| 镜头目的与覆盖 | `$short-drama-storyboard` | 从剧本建立有动机的镜头 | 不为景别多样性硬拆镜 |
|
|
54
|
+
| 逐镜运镜 | `$short-drama-storyboard` | 每镜决定摄影机动不动、怎么动、为什么 | 按本镜目的选,固定也写出来;执行端术语归视频提示词方言 |
|
|
55
|
+
| 镜长推导与对白覆盖 | `$short-drama-storyboard` | 定镜长,决定一句台词给说话人还是听者、要不要反应镜与正反打 | 镜长不按剧本字数折算;平均镜长是场级目标,不是逐镜配额 |
|
|
56
|
+
| 峰值强调与冲击重复 | `$short-drama-storyboard` | 情绪爆发或重大反转要推近、定格、闪白,或把同一关键动作从两三个角度重复 | 只用在峰值;冲击重复要声明主镜,状态只变一次 |
|
|
46
57
|
| 场次视觉计划与 Coverage Audition | `$short-drama-storyboard` | 关键场次需先比较观众立场、信息时机、空间、摄影与声音运动 | 可选中间层,不拥有剧本事实或 shot 边界,不规定宫格/镜头数 |
|
|
47
58
|
| 冻结关键帧 | `$short-drama-storyboard` | 写镜头起点的可冻结瞬间 | 不写动作链或镜头终态 |
|
|
48
59
|
| 漫剧关键帧视觉词表 | `$short-drama-storyboard` | 视觉方向已接受为漫剧/二维漫画形态,要为关键帧稳定投影共享画风与当前可读性约束 | 全部是 `taste_option` 选项,不设质量门槛,不替代身份、地理与边界事实 |
|
|
@@ -51,12 +62,16 @@
|
|
|
51
62
|
| 交付容器与分段算术 | `$short-drama-video-prompts` | 项目声明了分段或多镜打包的交付方式 | 打包方式不改写镜头边界与可审查性 |
|
|
52
63
|
| 交付路由与执行触发词 | `$short-drama-video-prompts` | 项目声明了逐镜以外的路由,或某路由要求固定字样 | 触发词与路由都由创作者档案声明,本套件不自造字样,续接不产生第二个起点权威 |
|
|
53
64
|
| 表演动作与时长 | `$short-drama-video-prompts` | 动作、台词与落点可能超载 | 不用每秒动作数设通用阈值 |
|
|
65
|
+
| 表演强度按形态与题材 | `$short-drama-video-prompts` | 导演没定表演强度,漫剧或爽文峰值需要外放、AI 真人需要可读的表演 | 仍写成常见的全身动作,不让剧情压在微表情上 |
|
|
54
66
|
| 摄影机、声音与相连边界 | `$short-drama-video-prompts` | 写运镜、环境运动、口型或声音方向 | 不添加无来源的音乐/事件 |
|
|
55
67
|
| 目标执行端能力档案 | `$short-drama-video-prompts` | 执行端的时长、参考方式、声音同轨或长度上限会改变正文写法 | 能力由创作者声明不由推断;不内置模型清单,不因收敛改写已接受边界 |
|
|
56
68
|
| 跨场与跨镜连续性 | `$short-drama-assets` | 状态变化会传给下一场/镜/集 | 不复制整本 设定集 到每镜 |
|
|
57
69
|
| 跨镜可见事实上锁 | `$short-drama-assets` | 服装、道具的颜色/材质在镜与镜之间漂移,参考图管不到 | 锁不变事实,不锁状态、姿势与镜头瞬态;锁面不替创作者选颜色 |
|
|
58
70
|
| 制作形态翻译 | `$short-drama` | 把实拍、二维、三维、水墨等方向投影到各阶段 | 风格名或模型代码不是生产决策 |
|
|
59
71
|
| 独立证据审查 | `$short-drama-review` | 冻结目标后写 finding 与 verdict | reviewer 不编辑 owner 来源 |
|
|
72
|
+
| 节奏档案算术核对 | `$short-drama-review` | 项目已接受节奏档案,要按档案数值核对单集 | 只做已接受值上的算术,偏差不阻断;不拿别的项目或套件数字比较 |
|
|
73
|
+
| 三道局部检查 | `$short-drama-review` | 整集通读之外,分别只读开场、结尾与中段,看钩子、悬念与反转密度 | 每道只读自己那一段,不替代整集判断 |
|
|
74
|
+
| 只打补丁与被删强钩子回收 | `$short-drama-review` | 提修改要求,或润色删掉了强钩子、兑现台词或喜剧反应 | 修改是带保留集的定点补丁,不整集重写 |
|
|
60
75
|
| 项目生产观察与校准 | `$short-drama-review` | 有授权文字观察且需定位到准确 prompt/spec/reference/config | 只在当前项目和版本有效;未观察结果保持未知 |
|
|
61
76
|
| 结果处置判断 | `$short-drama-review` | 已有诊断,要决定保留、后期、局部编辑、重新提交还是改写 | 处置先于修订;重复提交同一文本与追加形容词都不算修复 |
|
|
62
77
|
| 模板感诊断 | `$short-drama-review` | 至少两个位置出现同构机制或表达损失 | 不用禁词或单次类型惯例定罪 |
|
|
@@ -1284,6 +1284,20 @@ def validate_episode(episode: Path, project_root: Optional[Path] = None) -> list
|
|
|
1284
1284
|
_check_named_coverage(
|
|
1285
1285
|
keyframe, shot_id, "冻结关键帧提示词", basis, visual_entries, errors
|
|
1286
1286
|
)
|
|
1287
|
+
# The closing keyframe is optional — many shots end where they began —
|
|
1288
|
+
# but a heading that is present and malformed is a defect, not a shot
|
|
1289
|
+
# that quietly has no closing frame.
|
|
1290
|
+
if re.search(r"^### 收尾关键帧提示词\s*$", shot_body, re.MULTILINE):
|
|
1291
|
+
closing = _copyable_prompt(shot_body, heading=r"收尾关键帧提示词")
|
|
1292
|
+
if closing is None:
|
|
1293
|
+
errors.append(
|
|
1294
|
+
f"{shot_id}: 收尾关键帧提示词不是唯一且非空的可复制正文"
|
|
1295
|
+
+ _copyable_prompt_cause(shot_body, heading=r"收尾关键帧提示词")
|
|
1296
|
+
)
|
|
1297
|
+
elif basis.parsed:
|
|
1298
|
+
_check_named_coverage(
|
|
1299
|
+
closing, shot_id, "收尾关键帧提示词", basis, visual_entries, errors
|
|
1300
|
+
)
|
|
1287
1301
|
if basis.parsed and source_value:
|
|
1288
1302
|
# A shot's 来源 is its claim on the screenplay: whatever it quotes,
|
|
1289
1303
|
# this shot is the one that films it. Quoting an action performed by
|
|
@@ -120,6 +120,23 @@ PACING_POINTER = "/format/pacing"
|
|
|
120
120
|
# are read by the write stage to turn a screenplay into seconds, so leaving them
|
|
121
121
|
# out of set-authority left hand-editing short-drama.json as the only way in.
|
|
122
122
|
FORMAT_POINTERS = (EPISODE_LENGTH_POINTER, PACING_POINTER)
|
|
123
|
+
RHYTHM_PROFILE_TOKENS = [AUTHORITY_ROOT_TOKEN, "rhythm_profile"]
|
|
124
|
+
# The project rhythm profile: what develop proposes and the creator accepts, so
|
|
125
|
+
# that later stages can do arithmetic on accepted numbers. Only types and ranges
|
|
126
|
+
# are checked here; which values suit a project is the creator's call.
|
|
127
|
+
RHYTHM_PROFILE_FORMS = ("ai_live_action", "motion_comic")
|
|
128
|
+
RHYTHM_PROFILE_FIELDS = {
|
|
129
|
+
"form": "form",
|
|
130
|
+
"first_hook_seconds": "seconds",
|
|
131
|
+
"beat_interval_seconds_max": "seconds",
|
|
132
|
+
"opposed_reversals_per_episode_min": "count",
|
|
133
|
+
"end_on_peak": "boolean",
|
|
134
|
+
"reprise_previous_last_beat": "boolean",
|
|
135
|
+
"vo_share_max": "share",
|
|
136
|
+
"target_avg_shot_seconds": "seconds",
|
|
137
|
+
"close_shot_share_min": "share",
|
|
138
|
+
"first_major_payoff_by_episode": "episode",
|
|
139
|
+
}
|
|
123
140
|
|
|
124
141
|
class ProjectConflictError(RuntimeError):
|
|
125
142
|
"""A file changed while a guarded operation was in progress."""
|
|
@@ -258,6 +275,96 @@ def project_video_model_profile(project: Mapping[str, Any]) -> dict[str, Any]:
|
|
|
258
275
|
return {field: choices[field] for field in fields if field in choices}
|
|
259
276
|
|
|
260
277
|
|
|
278
|
+
def project_format(project: Mapping[str, Any]) -> dict[str, Any]:
|
|
279
|
+
"""The episode shape the creator set: count, length and frame.
|
|
280
|
+
|
|
281
|
+
Only well-formed values are reported, so a reader can do arithmetic on
|
|
282
|
+
them without re-validating; anything else in the format block (pacing
|
|
283
|
+
rates, prompt language) is working detail the status does not repeat.
|
|
284
|
+
"""
|
|
285
|
+
block = project.get("format")
|
|
286
|
+
if not isinstance(block, Mapping):
|
|
287
|
+
return {}
|
|
288
|
+
result: dict[str, Any] = {}
|
|
289
|
+
count = block.get("episode_count")
|
|
290
|
+
if isinstance(count, int) and not isinstance(count, bool) and count > 0:
|
|
291
|
+
result["episode_count"] = count
|
|
292
|
+
seconds = block.get("target_seconds_per_episode")
|
|
293
|
+
if (
|
|
294
|
+
isinstance(seconds, (int, float))
|
|
295
|
+
and not isinstance(seconds, bool)
|
|
296
|
+
and math.isfinite(seconds)
|
|
297
|
+
and seconds > 0
|
|
298
|
+
):
|
|
299
|
+
result["target_seconds_per_episode"] = seconds
|
|
300
|
+
ratio = block.get("aspect_ratio")
|
|
301
|
+
if isinstance(ratio, str) and ratio.strip():
|
|
302
|
+
result["aspect_ratio"] = ratio.strip()
|
|
303
|
+
return result
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
def rhythm_profile_problems(profile: Any) -> list[str]:
|
|
307
|
+
"""Type and range problems in a rhythm profile block; empty when usable.
|
|
308
|
+
|
|
309
|
+
A profile is complete or it is not a profile: a downstream stage doing
|
|
310
|
+
arithmetic on it cannot tell a field left out from a field meant as zero.
|
|
311
|
+
"""
|
|
312
|
+
if not isinstance(profile, Mapping):
|
|
313
|
+
return ["rhythm_profile must be an object"]
|
|
314
|
+
problems: list[str] = []
|
|
315
|
+
for name in sorted(set(profile) - set(RHYTHM_PROFILE_FIELDS) - {"status"}):
|
|
316
|
+
problems.append(
|
|
317
|
+
f"rhythm_profile has no field {name}; fields are "
|
|
318
|
+
f"{', '.join(RHYTHM_PROFILE_FIELDS)}"
|
|
319
|
+
)
|
|
320
|
+
for name, kind in RHYTHM_PROFILE_FIELDS.items():
|
|
321
|
+
if name not in profile:
|
|
322
|
+
problems.append(f"rhythm_profile.{name} is missing")
|
|
323
|
+
continue
|
|
324
|
+
value = profile[name]
|
|
325
|
+
number = isinstance(value, (int, float)) and not isinstance(value, bool)
|
|
326
|
+
whole = isinstance(value, int) and not isinstance(value, bool)
|
|
327
|
+
if kind == "form":
|
|
328
|
+
ok = value in RHYTHM_PROFILE_FORMS
|
|
329
|
+
expected = " or ".join(RHYTHM_PROFILE_FORMS)
|
|
330
|
+
elif kind == "boolean":
|
|
331
|
+
ok = isinstance(value, bool)
|
|
332
|
+
expected = "true or false"
|
|
333
|
+
elif kind == "seconds":
|
|
334
|
+
ok = number and math.isfinite(value) and value > 0
|
|
335
|
+
expected = "a positive number of seconds"
|
|
336
|
+
elif kind == "share":
|
|
337
|
+
ok = number and 0 <= value <= 1
|
|
338
|
+
expected = "a share between 0 and 1"
|
|
339
|
+
elif kind == "count":
|
|
340
|
+
ok = whole and value >= 0
|
|
341
|
+
expected = "a whole number of 0 or more"
|
|
342
|
+
else:
|
|
343
|
+
ok = whole and value >= 1
|
|
344
|
+
expected = "an episode number of 1 or more"
|
|
345
|
+
if not ok:
|
|
346
|
+
problems.append(f"rhythm_profile.{name} must be {expected}, not {value!r}")
|
|
347
|
+
return problems
|
|
348
|
+
|
|
349
|
+
|
|
350
|
+
def project_rhythm_profile(project: Mapping[str, Any]) -> tuple[dict[str, Any], list[str]]:
|
|
351
|
+
"""The accepted rhythm profile values and the problems that void them.
|
|
352
|
+
|
|
353
|
+
A missing, unset or merely proposed profile is undeclared: nothing
|
|
354
|
+
downstream checks against it. An accepted profile that no longer passes
|
|
355
|
+
validation (a hand edit) is reported with its problems and declares
|
|
356
|
+
nothing either, since arithmetic on a bad value is a wrong number.
|
|
357
|
+
"""
|
|
358
|
+
authority = project.get("creator_authority")
|
|
359
|
+
profile = authority.get("rhythm_profile") if isinstance(authority, Mapping) else None
|
|
360
|
+
if not isinstance(profile, Mapping) or profile.get("status") != "accepted":
|
|
361
|
+
return {}, []
|
|
362
|
+
problems = rhythm_profile_problems(profile)
|
|
363
|
+
if problems:
|
|
364
|
+
return {}, problems
|
|
365
|
+
return {name: profile[name] for name in RHYTHM_PROFILE_FIELDS}, []
|
|
366
|
+
|
|
367
|
+
|
|
261
368
|
def initialize_project(
|
|
262
369
|
path: Path,
|
|
263
370
|
*,
|
|
@@ -911,6 +1018,7 @@ def _build_status(
|
|
|
911
1018
|
ownership[output] = owner
|
|
912
1019
|
languages = project_languages(project)
|
|
913
1020
|
video_model_profile = project_video_model_profile(project)
|
|
1021
|
+
rhythm_profile, rhythm_problems = project_rhythm_profile(project)
|
|
914
1022
|
return {
|
|
915
1023
|
"project_id": project.get("project_id"),
|
|
916
1024
|
"title": project.get("title"),
|
|
@@ -918,6 +1026,9 @@ def _build_status(
|
|
|
918
1026
|
"prompt_language": languages["prompt_language"],
|
|
919
1027
|
"video_prompt_language": languages["video_prompt_language"],
|
|
920
1028
|
"video_model_profile": video_model_profile,
|
|
1029
|
+
"format": project_format(project),
|
|
1030
|
+
"rhythm_profile": rhythm_profile,
|
|
1031
|
+
"rhythm_profile_problems": rhythm_problems,
|
|
921
1032
|
"project_root": project_root,
|
|
922
1033
|
"last_action": state.get("last_action"),
|
|
923
1034
|
"layout": dict(layout),
|
|
@@ -1548,7 +1659,27 @@ def set_creator_authority(
|
|
|
1548
1659
|
project = json.loads(project_path.read_text(encoding="utf-8"))
|
|
1549
1660
|
if not isinstance(project, dict):
|
|
1550
1661
|
raise ValueError("project manifest must be an object")
|
|
1662
|
+
rhythm = tokens[:2] == RHYTHM_PROFILE_TOKENS
|
|
1663
|
+
authority = project.get(AUTHORITY_ROOT_TOKEN)
|
|
1664
|
+
if rhythm and len(tokens) > 2:
|
|
1665
|
+
# Writing one field accepts the block it sits in, so a leaf write
|
|
1666
|
+
# into a proposed or unset profile would promote numbers nobody
|
|
1667
|
+
# accepted. A single value can only change an accepted profile.
|
|
1668
|
+
current = authority.get("rhythm_profile") if isinstance(authority, dict) else None
|
|
1669
|
+
if not isinstance(current, Mapping) or current.get("status") != "accepted":
|
|
1670
|
+
raise ValueError(
|
|
1671
|
+
"rhythm_profile is not accepted; accept the whole profile "
|
|
1672
|
+
"before changing one of its fields"
|
|
1673
|
+
)
|
|
1674
|
+
if rhythm and isinstance(authority, dict) and "rhythm_profile" not in authority:
|
|
1675
|
+
# The project template declares this slot as unset; a manifest made
|
|
1676
|
+
# from an older template lacks it, so a whole-profile write adds it.
|
|
1677
|
+
authority["rhythm_profile"] = {"status": "unset"}
|
|
1551
1678
|
written = _write_authority_value(project, tokens, value)
|
|
1679
|
+
if rhythm:
|
|
1680
|
+
problems = rhythm_profile_problems(project[AUTHORITY_ROOT_TOKEN]["rhythm_profile"])
|
|
1681
|
+
if problems:
|
|
1682
|
+
raise ValueError("; ".join(problems))
|
|
1552
1683
|
if field == PACING_POINTER:
|
|
1553
1684
|
# Check what the manifest will hold, not what the decision said: an
|
|
1554
1685
|
# object slot is merged, so a half decision leaves the other rate at
|
|
@@ -26,7 +26,7 @@ license: MIT
|
|
|
26
26
|
|
|
27
27
|
## 工作流
|
|
28
28
|
|
|
29
|
-
1.
|
|
29
|
+
1. 只读当前范围的剧本和已决定的视觉方向;视觉方向还没有时代锚点时,先按原著事实定时代。
|
|
30
30
|
2. 逐场找实体、可见描述、状态变化和含混指代,先不创建资产。
|
|
31
31
|
3. 对每项决定新建、复用、增加变体或标记未决;含混指代不猜。
|
|
32
32
|
4. 写最小可识别设定:统一使用 `识别锚点`、本集状态和变化原因;会持续限制后续动作的身体—物件—空间关系写进有生效范围的状态,不当成一次姿势略过。
|
|
@@ -55,6 +55,7 @@ license: MIT
|
|
|
55
55
|
默认只读本 SKILL、当前剧本和视觉方向。遇到对应问题时只打开一份:
|
|
56
56
|
|
|
57
57
|
- 阶段边界与规则分级:[阶段契约](references/stage-contract.md)
|
|
58
|
+
- 定时代、写时代锚点,或想把场所、设备、服装写旧:[时代锚点](references/era-anchors.md)
|
|
58
59
|
- 从剧本找真正的资产出现证据:[出现提取](references/occurrence-extraction.md)
|
|
59
60
|
- 新身份、复用、变体或未决:[身份与变体](references/identity-vs-variant.md)
|
|
60
61
|
- 人物识别与造型层次:[人物与造型](references/character-and-look.md)
|
|
@@ -34,6 +34,7 @@
|
|
|
34
34
|
- [ ] Prop 形制/功能身份没有因 owner、开合、破损、内容或文字状态被复制。
|
|
35
35
|
- [ ] 每个新 asset 有不能复用的持久证据;每个 variant 说明 base 什么保持不变。
|
|
36
36
|
- [ ] 提取没有凭空补脸、品牌、门窗、内容物、伤势、灯光或可读文字。
|
|
37
|
+
- [ ] 时代不与原著事实矛盾;旧、老式、复古一类词有原著依据或创作者选择(`AST-14`)。
|
|
37
38
|
- [ ] transfer、伤势、换装、停电、天气/光态和知识变化都有足以支持的剧情原因。
|
|
38
39
|
- [ ] occurrence 的 production disposition 合理:提及不被误当出镜,关键操作物不被
|
|
39
40
|
降成普通布景。
|
|
@@ -48,6 +49,7 @@ Reviewer finding 应含文件与标题 ID、证据、影响、修订结果、own
|
|
|
48
49
|
- [ ] 设定集 只保留识别、复用、prompt、镜头和连续性所需事实。
|
|
49
50
|
- [ ] Location 先有地理/入口/固定锚点,再有氛围;Prop 有尺度/形制/材料/功能;
|
|
50
51
|
Character 有可观察的区分锚点。
|
|
52
|
+
- [ ] 项目视觉方向写了时代锚点,地点、造型、道具条目写出时代形制(`AST-15`)。
|
|
51
53
|
- [ ] outgoing 精简但足以让下一场/集无脑内补全地继续。
|
|
52
54
|
|
|
53
55
|
Creator 可用制作原因覆盖,例如需要逐件审批背景陈设;记录 override,而非改成硬规则。
|
|
@@ -128,6 +128,16 @@ Character 拥有,换鞋、加厚外套、盘发都不改写它(那些属于
|
|
|
128
128
|
| 剪影与线条 | 轮廓与肩背重心、发型剪影与发际形状、固定配饰外形、服装廓形、步态负重 | 细微的五官不对称、浅色小痣、依赖真实皮肤纹理的痕迹 |
|
|
129
129
|
| 材质与表面 | 皮肤/毛发/布料的可比较表面状态、长期使用痕迹 | 需要柔和过渡才能读出的体积差 |
|
|
130
130
|
|
|
131
|
+
### 写实细节与身份连续性
|
|
132
|
+
|
|
133
|
+
**`craft_default`**:写实项目可以在稳定识别特征之外,补充皮肤纹理、自然不对称或使用痕迹。
|
|
134
|
+
远景中不易读出的细节,不宜单独承担跨镜识别。
|
|
135
|
+
|
|
136
|
+
痣、疤和牙齿形态等如果是人物既定特征,仍须保持;不能因它们难生成就允许随镜变化。
|
|
137
|
+
毛孔、细纹等微观纹理不必逐像素一致。是否需要这些细节由画面尺度与已接受风格决定。
|
|
138
|
+
|
|
139
|
+
**`taste_option`**:偶像化、漫画或其他风格可采用更平滑的表面,不以写实程度判错。
|
|
140
|
+
|
|
131
141
|
### 边界:形态选通道,身份定事实
|
|
132
142
|
|
|
133
143
|
- **`reviewed_invariant`**:形态可以改变锚点的**表达通道与颗粒度**,不得改写身份事实本身。
|
|
@@ -42,15 +42,12 @@
|
|
|
42
42
|
|
|
43
43
|
- 锁面必须**逐字出现在它管到的每一份可复制正文里**。校验器会在三处查同一个字符串:
|
|
44
44
|
图片提示词正文、冻结关键帧提示词、视频提示词正文。
|
|
45
|
-
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
- 确实需要自然语言描述时,把锁的 `镜头:` / `图片:` 范围收窄到语言一致的那些正文,
|
|
52
|
-
另一侧的同一事实另立一条锁,不要用一条锁去跨语言。
|
|
53
|
-
因为它要落进可复制正文,不是落进创作者说明;
|
|
45
|
+
- 图片与冻结关键帧使用 `format/prompt_language`,视频可能使用另选的 `video_prompt_language`。
|
|
46
|
+
语言不同时,优先使用确实适合各份正文的共同色值、型号或专名。
|
|
47
|
+
当前 `镜头:` 同时约束本镜首帧与视频正文,不能靠拆成两把锁分别约束两种语言。
|
|
48
|
+
没有合适共同词组时,在视觉设定中保留事实并报告此限制,暂不声明这把逐字锁;
|
|
49
|
+
不缩小事实实际出现的镜头范围来绕过检查,也不自行改变用户选择的正文语言。
|
|
50
|
+
|
|
54
51
|
- 只保留最小可辨识名词短语,通常是「颜色 + 材质/形制 + 物体」,例如
|
|
55
52
|
`pale blue chunky knit wool sweater`;
|
|
56
53
|
- 不含句号、动作、状态、数量、镜头信息和剧情;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# 时代锚点
|
|
2
|
+
|
|
3
|
+
## 时代从原著事实来
|
|
4
|
+
|
|
5
|
+
拆资产之前先定时代。能定时代的是原著与剧本里的事实:设备(智能手机、U 盘、液晶屏)、平台与传播方式
|
|
6
|
+
(热搜、短视频账号、直播带货)、流行语、写明的年份,或能从年龄与事件推出的年代。按这些事实在
|
|
7
|
+
`视觉设定.md` 顶部的项目视觉方向写一行时代锚点:先写年份或年代,再写设备、制服、家具和灯光在这个
|
|
8
|
+
年代长什么样。
|
|
9
|
+
|
|
10
|
+
```markdown
|
|
11
|
+
- 时代锚点:当下(2020 年代);设备:全面屏智能手机、笔记本电脑、液晶显示器;制服:现行常服;陈设:白色工位桌、网面办公椅;光:嵌入式 LED 面板灯,冷白。
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
原著没有能定时代的事实时,把时代标为「需创作者决定」,不默认成过去。
|
|
15
|
+
|
|
16
|
+
## 旧要有来源
|
|
17
|
+
|
|
18
|
+
部队办公室、机关、学校、医院这类机构场所,模型和写作者都会顺手写成旧的:老式显示器、积灰的主机、
|
|
19
|
+
褪色的墙、旧款手机。原著写的是智能手机和短视频账号,画面却回到二三十年前,观众第一眼就出戏。
|
|
20
|
+
|
|
21
|
+
**`reviewed_invariant` AST-14**:`视觉设定.md` 与从它投影出的提示词所呈现的时代,不与原著事实矛盾。
|
|
22
|
+
「旧」「老式」「复古」「褪色」「斑驳」,以及 old、worn、dusty、period、CRT 这类让画面变旧的词,要有原著依据
|
|
23
|
+
或创作者明确的选择;两样都没有就删掉,改用时代锚点里的写法。原著写某件东西旧,旧是这件物的状态,
|
|
24
|
+
写在它自己的条目里,不把整个地点带回过去。
|
|
25
|
+
|
|
26
|
+
## 条目带上时代形制
|
|
27
|
+
|
|
28
|
+
**`craft_default` AST-15**:项目视觉方向写出时代锚点;地点、造型和道具条目在年代会改变外观的地方写具体
|
|
29
|
+
形制——写液晶显示器,不写显示器;写现行常服,不写军装。图片和视频提示词照条目写,时代线索就随地点、
|
|
30
|
+
服装和道具进入下游。
|
|
31
|
+
|
|
32
|
+
## 合成例
|
|
33
|
+
|
|
34
|
+
原著:主角刷热搜、开短视频账号、用 U 盘拷资料,故事发生在部队宣传部门的办公室。
|
|
35
|
+
|
|
36
|
+
- 错:「老旧的机关办公室,老式显示器,旧款智能手机」——原著里没有一处支撑。
|
|
37
|
+
- 对:时代锚点写当下;办公室条目写液晶显示器、嵌入式 LED 面板灯、网面办公椅;手机写全面屏智能手机。
|
|
@@ -25,6 +25,8 @@
|
|
|
25
25
|
| AST-11 | reviewed_invariant | Characters designed together are not bound to confusable references; each names the audible trait telling it apart from its nearest neighbour, and names that character. |
|
|
26
26
|
| AST-12 | craft_default | Selection criteria are few, audible and counter-exampled; they judge a candidate reference or a clone result, they do not stand in for one. |
|
|
27
27
|
| AST-13 | structural_invariant | When the project's prompt language is not the language of the entry headings, every 人物 entry a shot's 视觉依据 references reaches a stated conclusion: `画面代称` carrying the exact spelling prompt bodies use, or `画面代称:无` when no body names it. One accepted name uses one spelling, case included. 地点/道具 declare one only when a body names them. |
|
|
28
|
+
| AST-14 | reviewed_invariant | The era shown in `视觉设定.md` and in the prompts projected from it does not contradict source facts—devices, platforms, slang, stated years. A retro or aged descriptor (旧/老式/复古/褪色/斑驳, old, worn, dusty, period, CRT) cites a source basis or an explicit creator choice. |
|
|
29
|
+
| AST-15 | craft_default | The project visual direction states explicit era anchors: the year or decade, and how devices, uniforms, furniture and lighting look in it. Location, costume and prop entries carry the era-specific form that image and video prompts copy. |
|
|
28
30
|
|
|
29
31
|
### `CON`
|
|
30
32
|
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
## 目录
|
|
4
4
|
|
|
5
5
|
- [参考音频是载体](#参考音频是载体)
|
|
6
|
+
- [参考可以是合成出来的](#参考可以是合成出来的)
|
|
6
7
|
- [身份与表演的界线](#身份与表演的界线)
|
|
7
8
|
- [一段参考音频可以决定什么](#一段参考音频可以决定什么)
|
|
8
9
|
- [绑定不等于听过](#绑定不等于听过)
|
|
@@ -27,6 +28,20 @@
|
|
|
27
28
|
`reference: null` 并写明「待选型」——**不要用一段文字描述冒充音色身份**。
|
|
28
29
|
下游拿着一段形容词去找声音,找回来的每次都不一样,而记录看起来是完整的。
|
|
29
30
|
|
|
31
|
+
### 参考可以是合成出来的
|
|
32
|
+
|
|
33
|
+
使用声音库时,确认所选音色及其使用范围符合供应商提供的许可。
|
|
34
|
+
项目没有配音演员、也不打算克隆谁的时候,这条路是让 `reference` 从 `待选型` 变成实际路径的
|
|
35
|
+
办法——**挑一个预置音色,合成一条,绑上去**。合成由 `$short-drama-produce` 的 `tts` 模态执行。
|
|
36
|
+
|
|
37
|
+
合成出来的参考和录音来的参考在本文档里受同样的约束:它一样要写用途边界,一样要有
|
|
38
|
+
`admission_status`,一样不能用形容词代替。差别只有一处——**它的选型判据是拿来挑预置音色的,
|
|
39
|
+
不是拿来判克隆像不像的**,所以「与谁最易混」这条要在同一批预置音色里回答,而不是在角色之间
|
|
40
|
+
凭空回答。预置库里两个音色听起来就是同一个人时,换一个,不要靠判据文字假装区分。
|
|
41
|
+
|
|
42
|
+
音色 ID 本身写进 `reference` 那一行,和路径、用途边界一起。它是创作决定:同一个角色在两集之间
|
|
43
|
+
换 ID 就是换人说话,这件事必须在文档里看得见、diff 里查得出。
|
|
44
|
+
|
|
30
45
|
## 身份与表演的界线
|
|
31
46
|
|
|
32
47
|
一句话判定:**这个特征在角色安静地坐着说一句无关紧要的话时还在吗**?
|
|
@@ -115,6 +130,15 @@ CHAR-A 与 CHAR-B 最易混:两条参考同为中低音区、语速偏慢。
|
|
|
115
130
|
|
|
116
131
|
角色多时按易混组分批选型,而不是按出场顺序。
|
|
117
132
|
|
|
133
|
+
### 对比选择预置音色
|
|
134
|
+
|
|
135
|
+
用同一组有代表性的台词试听候选,比较角色间是否易混,以及同一角色在不同情绪下是否稳定。
|
|
136
|
+
音色名称仅供检索,选择依据是实际声音。
|
|
137
|
+
|
|
138
|
+
需要测量时,F0 和谱特征可辅助定位近似音色;同一候选应有多句样本,才能估计自身变化。
|
|
139
|
+
不把音高间距或「组间距离大于组内极差」设为通用门槛。最终按角色需求与回听结果选择,
|
|
140
|
+
不为追求数字分离而改变已接受的声音方向。
|
|
141
|
+
|
|
118
142
|
## 专名发音
|
|
119
143
|
|
|
120
144
|
已接受的专名发音只能有一种拼法(`AST-10`)。
|
|
@@ -149,3 +173,7 @@ CHAR-A 与 CHAR-B 最易混:两条参考同为中低音区、语速偏慢。
|
|
|
149
173
|
|
|
150
174
|
临时情绪、呼吸、重音、音量和空间混响仍由剧本/镜头/视频提示词拥有。声音方向是生产输入,不是
|
|
151
175
|
合成结果保证;实际 TTS 仍由 `$short-drama-produce` 在精确预览并显式确认后执行。
|
|
176
|
+
|
|
177
|
+
参考音频落地之后,它在下游有两个去处:作为视频模型的音色参考绑定(见目标模型的方言文档),
|
|
178
|
+
以及作为配音本的实际人声。配音使用同一已选音色逐句合成;参考音频用于选型或模型绑定,不能直接充当不同台词的成品音轨。
|
|
179
|
+
是否保持角色声音,仍需在生成后回听确认。
|
|
@@ -86,7 +86,11 @@ python3 {技能目录}/scripts/episode_intake.py index <多集整稿> --out <epi
|
|
|
86
86
|
读取 [episode-design.md](references/episode-design.md),再复制 [episode-map.jsonl](assets/episode-map.jsonl)。每一集记录进入状态、开场、当集追求、阻力、方向性转折、当集结果、信息释放、出去的压力以及下一集必须继承的事实。
|
|
87
87
|
|
|
88
88
|
先保证每集产生局部戏剧结果、相邻集能精确交接,再讨论外部压力/情感负荷的双轨
|
|
89
|
-
|
|
89
|
+
节奏。第 1 集入口先比较收益入口与冷开;改编项目先读原著分析的爽点表,把高光排到观众
|
|
90
|
+
最早能拿到的位置。集数、钩子类型、是否反转和高潮位置由创作者与项目决定。
|
|
91
|
+
|
|
92
|
+
制作形态一定下,就按分集设计里的默认值提出项目节奏档案,写进创作简报交创作者接受;
|
|
93
|
+
接受后由 `$short-drama` 写入 `creator_authority.rhythm_profile`。
|
|
90
94
|
|
|
91
95
|
### 5. 做所有者检查并交接
|
|
92
96
|
|
|
@@ -96,6 +100,7 @@ python3 {技能目录}/scripts/episode_intake.py index <多集整稿> --out <epi
|
|
|
96
100
|
- 候选确实改变机制,选定方向贯穿简报、引擎与分集地图;
|
|
97
101
|
- 每次升级能指出权力、信息、关系、暴露、资源、时间或代价的变化;
|
|
98
102
|
- 每集先兑现一部分当集承诺,再留下具体的决定、危险或问题;
|
|
103
|
+
- 改编项目里核心人物的立场、核心关系和主线没有被改写;原著没有的新增内容都登记为 `add`,并列在简报里;
|
|
99
104
|
- 没有把格式偏好冒充普遍规律。
|
|
100
105
|
|
|
101
106
|
这些是所有者自检,不是终审。展示创作者可读的新增/修改摘要,请创作者接受后再作为下游来源;
|
|
@@ -112,7 +117,8 @@ python3 {技能目录}/scripts/episode_intake.py index <多集整稿> --out <epi
|
|
|
112
117
|
- **`craft_default`**:通常有帮助的做法;创作者说明理由后可覆盖。
|
|
113
118
|
- **`taste_option`**:钩子、弧线、视角、结局气质等选择;不得单独阻断。
|
|
114
119
|
|
|
115
|
-
|
|
120
|
+
不要用固定的情节点、转折时刻、篇幅比例或数量配方替代因果判断;节奏数值只以创作者接受的
|
|
121
|
+
项目节奏档案出现。
|
|
116
122
|
|
|
117
123
|
## 产物与边界
|
|
118
124
|
|
|
@@ -133,12 +139,12 @@ python3 {技能目录}/scripts/episode_intake.py index <多集整稿> --out <epi
|
|
|
133
139
|
## 按需加载
|
|
134
140
|
|
|
135
141
|
- **承诺、引擎、人物压力、升级与铺垫兑现**:[story-craft.md](references/story-craft.md)
|
|
136
|
-
-
|
|
142
|
+
- **分集契约、因果节拍、集间交接、首集入口、门槛集与项目节奏档案**:[episode-design.md](references/episode-design.md)
|
|
137
143
|
- **已有多集完整剧本/散稿,要避免整稿进入上下文并可中断续跑**:
|
|
138
144
|
[multi-episode-intake.md](references/multi-episode-intake.md)
|
|
139
145
|
- **人物驱动力、前史与切入、跨集变化、信息权限、双轨节奏与恢复记忆**:
|
|
140
146
|
[serial-character-and-memory.md](references/serial-character-and-memory.md)
|
|
141
|
-
-
|
|
147
|
+
- **有原材料、需要按爽点压缩、提前或冷开后文、合并人物场景、把信息视觉化**:
|
|
142
148
|
[adaptation-craft.md](references/adaptation-craft.md)
|
|
143
149
|
- **创作者提供对标作品、样例剧本或提示词,希望学习机制而非仿写表达**:
|
|
144
150
|
[creative-reference-intake.md](references/creative-reference-intake.md)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"example_only":true,"destination":"项目开发/adaptation-map.jsonl","schema_version":"1.0.0-draft","record_type":"adaptation_mapping","mapping_id":"ADAPT-EXAMPLE","status":"candidate","source_ref":{"owner":"creator","artifact":"输入/original-source.txt"},"source_span":{"byte_start":120,"byte_end":268,"line_start":8,"line_end":14},"function_summary":"一次旧选择使两名角色对当前证据承担不同风险;摘要不复制来源原句","mentioned_entities":[{"source_label":"称谓甲","proposed_identity":"CHAR-CANDIDATE-A","resolution":"unresolved"}],"adaptation_decision":{"disposition":"preserve | merge | change_carrier | compress | omit | unresolved","candidate_episode":"EP-CANDIDATE","new_carrier":"可见行动/证据/空间/对白策略或 unresolved","preserved_functions":["关系压力"],"lost_or_changed":[]},"creator_acceptance":{"status":"pending","decision_ref":null}}
|
|
1
|
+
{"example_only":true,"destination":"项目开发/adaptation-map.jsonl","schema_version":"1.0.0-draft","record_type":"adaptation_mapping","mapping_id":"ADAPT-EXAMPLE","status":"candidate","source_ref":{"owner":"creator","artifact":"输入/original-source.txt"},"source_span":{"byte_start":120,"byte_end":268,"line_start":8,"line_end":14},"function_summary":"一次旧选择使两名角色对当前证据承担不同风险;摘要不复制来源原句","mentioned_entities":[{"source_label":"称谓甲","proposed_identity":"CHAR-CANDIDATE-A","resolution":"unresolved"}],"adaptation_decision":{"disposition":"preserve | merge | change_carrier | compress | omit | move_earlier | cold_open | add | unresolved","candidate_episode":"EP-CANDIDATE","new_carrier":"可见行动/证据/空间/对白策略或 unresolved","preserved_functions":["关系压力"],"lost_or_changed":[],"causal_compensation":"null;move_earlier / cold_open 时写:依赖的铺垫在哪一集以什么载体先出现,或观众靠什么定位时间,以及原位置怎样处理","addition_rationale":"null;add 时写:为什么原著已有的人和事承担不了这个功能,核对过哪些原著事实、逐条说明不矛盾"},"creator_acceptance":{"status":"pending","decision_ref":null}}
|
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
- 【事实 → 落在 EPxxx,观众看到的是:〈可见载体〉;或:延后到 EPxxx;没有则写“暂无”】
|
|
13
13
|
- **允许改编/探索的范围**:
|
|
14
14
|
- 【填写】
|
|
15
|
+
- **原著没有、本轮新增的内容**:新增的人物、场景、对手,或提议改变的人物立场与关系,逐条交创作者确认。
|
|
16
|
+
- 【新增什么 → 承担什么功能;为什么原著已有的人和事承担不了;核对过的原著事实;没有则写“暂无”】
|
|
15
17
|
|
|
16
18
|
## 2. 创作者契约
|
|
17
19
|
|
|
@@ -30,6 +32,11 @@
|
|
|
30
32
|
- **可用角色与场景规模**:【填写】
|
|
31
33
|
- **难以承受的制作元素**:【填写】
|
|
32
34
|
- **必须保留的视觉/声音特征**:【填写】
|
|
35
|
+
- **项目节奏档案(候选)**:【按制作形态从分集设计的默认值起步;改了哪项写一句理由。创作者接受后写入项目配置】
|
|
36
|
+
|
|
37
|
+
```json
|
|
38
|
+
{"status": "proposed", "form": "ai_live_action", "first_hook_seconds": 5, "beat_interval_seconds_max": 30, "opposed_reversals_per_episode_min": 1, "end_on_peak": true, "reprise_previous_last_beat": true, "vo_share_max": 0.3, "target_avg_shot_seconds": 2.5, "close_shot_share_min": 0.45, "first_major_payoff_by_episode": 1}
|
|
39
|
+
```
|
|
33
40
|
|
|
34
41
|
## 4. 戏剧承诺(工作版)
|
|
35
42
|
|
|
@@ -92,6 +99,7 @@
|
|
|
92
99
|
|
|
93
100
|
- **故事切入前已经运行的压力**:【填写】
|
|
94
101
|
- **叙事切入窗口**:【从哪个必须行动的时刻开始】
|
|
102
|
+
- **第 1 集入口候选**:【至少三个:时序入口、收益入口、后文高潮提前的冷开;每个写开场第一帧观众看见的那一格画面和它提出的问题,再写整集收益;写选了哪个、为什么】
|
|
95
103
|
- **为什么不更早/更晚开始**:【更早会变成什么准备;更晚会丢掉哪个选择】
|
|
96
104
|
- **开场可见证据**:【让观众从行为、物件、关系或异常结果反推前因】
|
|
97
105
|
- **观众现在必须知道**:【只列当前行动所需】
|