@oh-story/dsh 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +38 -0
- package/cordis.patch.yml +3 -0
- package/lib/client.js +1201 -0
- package/lib/client.js.map +7 -0
- package/lib/drama/LICENSE.upstream +21 -0
- package/lib/drama/manifest.json +1012 -0
- package/lib/drama/skills/short-drama/SKILL.md +153 -0
- package/lib/drama/skills/short-drama/agents/openai.yaml +4 -0
- package/lib/drama/skills/short-drama/assets/creator-decision.example.jsonl +4 -0
- package/lib/drama/skills/short-drama/assets/production-observation.example.jsonl +2 -0
- package/lib/drama/skills/short-drama/assets/project-template/short-drama.json +36 -0
- package/lib/drama/skills/short-drama/assets/reference-observation.example.jsonl +2 -0
- package/lib/drama/skills/short-drama/references/audience-reveal.md +74 -0
- package/lib/drama/skills/short-drama/references/contract-and-ownership.md +94 -0
- package/lib/drama/skills/short-drama/references/creator-workflow.md +82 -0
- package/lib/drama/skills/short-drama/references/form-cards/Q/347/211/210/350/241/250/350/276/276.md +73 -0
- package/lib/drama/skills/short-drama/references/form-cards//344/272/214/347/273/264/345/212/250/346/200/201/346/274/253.md +74 -0
- package/lib/drama/skills/short-drama/references/form-cards//345/233/275/346/274/253/344/272/214/346/254/241/345/205/203.md +79 -0
- package/lib/drama/skills/short-drama/references/form-cards//345/256/236/346/213/215.md +75 -0
- package/lib/drama/skills/short-drama/references/form-cards//346/260/264/345/242/250/347/254/224/350/247/246.md +85 -0
- package/lib/drama/skills/short-drama/references/form-cards//351/243/216/346/240/274/345/214/226/344/270/211/347/273/264.md +72 -0
- package/lib/drama/skills/short-drama/references/knowhow-index.md +80 -0
- package/lib/drama/skills/short-drama/references/lifecycle-commands.md +130 -0
- package/lib/drama/skills/short-drama/references/look-development.md +52 -0
- package/lib/drama/skills/short-drama/references/pickup-and-alternate.md +58 -0
- package/lib/drama/skills/short-drama/references/production-form-profiles.md +126 -0
- package/lib/drama/skills/short-drama/references/reference-roles.md +142 -0
- package/lib/drama/skills/short-drama/references/runtime-preflight.md +27 -0
- package/lib/drama/skills/short-drama/scripts/project_tool.py +1963 -0
- package/lib/drama/skills/short-drama/scripts/selftest.py +287 -0
- package/lib/drama/skills/short-drama-assets/SKILL.md +187 -0
- package/lib/drama/skills/short-drama-assets/agents/openai.yaml +4 -0
- package/lib/drama/skills/short-drama-assets/assets/character-look.example.jsonl +3 -0
- package/lib/drama/skills/short-drama-assets/assets/continuity.example.jsonl +4 -0
- package/lib/drama/skills/short-drama-assets/assets/decisions.example.jsonl +5 -0
- package/lib/drama/skills/short-drama-assets/assets/location-view.example.jsonl +3 -0
- package/lib/drama/skills/short-drama-assets/assets/occurrences.example.jsonl +5 -0
- package/lib/drama/skills/short-drama-assets/assets/prop-state.example.jsonl +3 -0
- package/lib/drama/skills/short-drama-assets/examples/minimal/characters.jsonl +2 -0
- package/lib/drama/skills/short-drama-assets/examples/minimal/looks.jsonl +2 -0
- package/lib/drama/skills/short-drama-assets/references/asset-review-checklist.md +89 -0
- package/lib/drama/skills/short-drama-assets/references/character-and-look.md +164 -0
- package/lib/drama/skills/short-drama-assets/references/continuity-delta.md +123 -0
- package/lib/drama/skills/short-drama-assets/references/identity-vs-variant.md +146 -0
- package/lib/drama/skills/short-drama-assets/references/location-and-view.md +84 -0
- package/lib/drama/skills/short-drama-assets/references/occurrence-extraction.md +111 -0
- package/lib/drama/skills/short-drama-assets/references/prop-and-state.md +107 -0
- package/lib/drama/skills/short-drama-assets/references/stage-contract.md +136 -0
- package/lib/drama/skills/short-drama-assets/references/voice-direction.md +171 -0
- package/lib/drama/skills/short-drama-assets/scripts/asset_check.py +267 -0
- package/lib/drama/skills/short-drama-assets/scripts/selftest.py +89 -0
- package/lib/drama/skills/short-drama-develop/SKILL.md +157 -0
- package/lib/drama/skills/short-drama-develop/agents/openai.yaml +4 -0
- package/lib/drama/skills/short-drama-develop/assets/adaptation-map.example.jsonl +1 -0
- package/lib/drama/skills/short-drama-develop/assets/creative-brief.md +120 -0
- package/lib/drama/skills/short-drama-develop/assets/episode-map.jsonl +1 -0
- package/lib/drama/skills/short-drama-develop/assets/story-engine.md +181 -0
- package/lib/drama/skills/short-drama-develop/references/adaptation-craft.md +219 -0
- package/lib/drama/skills/short-drama-develop/references/creative-reference-intake.md +57 -0
- package/lib/drama/skills/short-drama-develop/references/director-brief-craft.md +113 -0
- package/lib/drama/skills/short-drama-develop/references/episode-design.md +509 -0
- package/lib/drama/skills/short-drama-develop/references/genre-and-hook-playbook.md +240 -0
- package/lib/drama/skills/short-drama-develop/references/genre-cards//344/272/262/345/255/220/351/232/220/347/247/230.md +112 -0
- package/lib/drama/skills/short-drama-develop/references/genre-cards//344/273/231/344/276/240/344/277/256/347/234/237.md +51 -0
- package/lib/drama/skills/short-drama-develop/references/genre-cards//345/212/250/344/275/234/344/273/273/345/212/241.md +51 -0
- package/lib/drama/skills/short-drama-develop/references/genre-cards//345/217/244/350/243/205/346/235/203/350/260/213.md +51 -0
- package/lib/drama/skills/short-drama-develop/references/genre-cards//345/244/215/344/273/207/346/211/223/350/204/270.md +51 -0
- package/lib/drama/skills/short-drama-develop/references/genre-cards//345/256/266/345/272/255/345/205/263/347/263/273.md +51 -0
- package/lib/drama/skills/short-drama-develop/references/genre-cards//346/202/254/347/226/221/350/247/204/345/210/231.md +51 -0
- package/lib/drama/skills/short-drama-develop/references/genre-cards//347/224/237/346/264/273/346/265/201.md +51 -0
- package/lib/drama/skills/short-drama-develop/references/genre-cards//347/240/264/351/225/234/351/207/215/345/234/206.md +109 -0
- package/lib/drama/skills/short-drama-develop/references/genre-cards//350/201/214/345/234/272/345/226/234/345/211/247.md +51 -0
- package/lib/drama/skills/short-drama-develop/references/genre-cards//350/261/252/351/227/250/345/251/232/346/201/213.md +51 -0
- package/lib/drama/skills/short-drama-develop/references/genre-cards//350/272/253/344/273/275/351/224/231/344/275/215.md +51 -0
- package/lib/drama/skills/short-drama-develop/references/genre-cards.md +92 -0
- package/lib/drama/skills/short-drama-develop/references/mechanism-loop.md +282 -0
- package/lib/drama/skills/short-drama-develop/references/multi-episode-intake.md +128 -0
- package/lib/drama/skills/short-drama-develop/references/premise-devices.md +211 -0
- package/lib/drama/skills/short-drama-develop/references/reveal-reversal-payoff.md +99 -0
- package/lib/drama/skills/short-drama-develop/references/serial-character-and-memory.md +293 -0
- package/lib/drama/skills/short-drama-develop/references/stage-contract.md +88 -0
- package/lib/drama/skills/short-drama-develop/references/story-craft.md +359 -0
- package/lib/drama/skills/short-drama-develop/scripts/episode_intake.py +699 -0
- package/lib/drama/skills/short-drama-develop/scripts/selftest.py +47 -0
- package/lib/drama/skills/short-drama-image-prompts/SKILL.md +181 -0
- package/lib/drama/skills/short-drama-image-prompts/agents/openai.yaml +4 -0
- package/lib/drama/skills/short-drama-image-prompts/assets/image-prompt-spec.jsonl.md +187 -0
- package/lib/drama/skills/short-drama-image-prompts/assets/image-prompts.md +37 -0
- package/lib/drama/skills/short-drama-image-prompts/assets/lookdev-frame-spec.jsonl.md +128 -0
- package/lib/drama/skills/short-drama-image-prompts/assets/lookdev-prompts.md +31 -0
- package/lib/drama/skills/short-drama-image-prompts/examples/minimal-image-prompt-specs.jsonl +2 -0
- package/lib/drama/skills/short-drama-image-prompts/references/character-and-look.md +154 -0
- package/lib/drama/skills/short-drama-image-prompts/references/common-recipe.md +231 -0
- package/lib/drama/skills/short-drama-image-prompts/references/edit-and-revision.md +122 -0
- package/lib/drama/skills/short-drama-image-prompts/references/location-plate.md +152 -0
- package/lib/drama/skills/short-drama-image-prompts/references/look-and-state-variant.md +96 -0
- package/lib/drama/skills/short-drama-image-prompts/references/lookdev-frame.md +38 -0
- package/lib/drama/skills/short-drama-image-prompts/references/production-sheet-recipes.md +177 -0
- package/lib/drama/skills/short-drama-image-prompts/references/prop-plate.md +140 -0
- package/lib/drama/skills/short-drama-image-prompts/references/review-and-fixtures.md +92 -0
- package/lib/drama/skills/short-drama-image-prompts/references/stage-contract.md +89 -0
- package/lib/drama/skills/short-drama-image-prompts/scripts/image_prompt_check.py +443 -0
- package/lib/drama/skills/short-drama-image-prompts/scripts/selftest.py +93 -0
- package/lib/drama/skills/short-drama-novel-analyze/SKILL.md +245 -0
- package/lib/drama/skills/short-drama-novel-analyze/agents/openai.yaml +4 -0
- package/lib/drama/skills/short-drama-novel-analyze/assets/episode-candidate.example.jsonl +3 -0
- package/lib/drama/skills/short-drama-novel-analyze/references/adaptation-triage.md +116 -0
- package/lib/drama/skills/short-drama-novel-analyze/references/adaptation-value.md +124 -0
- package/lib/drama/skills/short-drama-novel-analyze/references/aggregation-and-entities.md +155 -0
- package/lib/drama/skills/short-drama-novel-analyze/references/chapter-extraction.md +141 -0
- package/lib/drama/skills/short-drama-novel-analyze/references/stage-contract.md +67 -0
- package/lib/drama/skills/short-drama-novel-analyze/scripts/novel_index.py +651 -0
- package/lib/drama/skills/short-drama-novel-analyze/scripts/selftest.py +51 -0
- package/lib/drama/skills/short-drama-produce/SKILL.md +103 -0
- package/lib/drama/skills/short-drama-produce/agents/openai.yaml +4 -0
- package/lib/drama/skills/short-drama-produce/references/adapter-contract.md +140 -0
- package/lib/drama/skills/short-drama-produce/references/providers/gpt-image-2.md +24 -0
- package/lib/drama/skills/short-drama-produce/references/providers/minimax-music.md +25 -0
- package/lib/drama/skills/short-drama-produce/references/providers/seedance.md +40 -0
- package/lib/drama/skills/short-drama-produce/scripts/fixture_adapter.py +60 -0
- package/lib/drama/skills/short-drama-produce/scripts/production_tool.py +1635 -0
- package/lib/drama/skills/short-drama-produce/scripts/provider_adapters.py +964 -0
- package/lib/drama/skills/short-drama-produce/scripts/selftest.py +134 -0
- package/lib/drama/skills/short-drama-review/SKILL.md +178 -0
- package/lib/drama/skills/short-drama-review/agents/openai.yaml +4 -0
- package/lib/drama/skills/short-drama-review/assets/finding-template.jsonl +2 -0
- package/lib/drama/skills/short-drama-review/assets/supersession-decision.example.json +42 -0
- package/lib/drama/skills/short-drama-review/assets/verdict-template.json +32 -0
- package/lib/drama/skills/short-drama-review/examples/minimal-findings.jsonl +2 -0
- package/lib/drama/skills/short-drama-review/examples/minimal-verdict.json +34 -0
- package/lib/drama/skills/short-drama-review/references/anti-template-repair.md +114 -0
- package/lib/drama/skills/short-drama-review/references/production-quality-gates.md +270 -0
- package/lib/drama/skills/short-drama-review/references/project-calibration.md +85 -0
- package/lib/drama/skills/short-drama-review/references/review-method.md +82 -0
- package/lib/drama/skills/short-drama-review/references/rubric-assets-prompts.md +115 -0
- package/lib/drama/skills/short-drama-review/references/rubric-source-analysis.md +108 -0
- package/lib/drama/skills/short-drama-review/references/rubric-story-script.md +164 -0
- package/lib/drama/skills/short-drama-review/references/rubric-visual-motion.md +166 -0
- package/lib/drama/skills/short-drama-review/references/stage-contract.md +87 -0
- package/lib/drama/skills/short-drama-review/scripts/review_check.py +325 -0
- package/lib/drama/skills/short-drama-review/scripts/selftest.py +87 -0
- package/lib/drama/skills/short-drama-storyboard/SKILL.md +264 -0
- package/lib/drama/skills/short-drama-storyboard/agents/openai.yaml +4 -0
- package/lib/drama/skills/short-drama-storyboard/assets/coverage-audition.example.jsonl +2 -0
- package/lib/drama/skills/short-drama-storyboard/assets/coverage-template.json +49 -0
- package/lib/drama/skills/short-drama-storyboard/assets/keyframe-prompts.md +32 -0
- package/lib/drama/skills/short-drama-storyboard/assets/keyframe-template.jsonl +2 -0
- package/lib/drama/skills/short-drama-storyboard/assets/revision-lineage.fragment.json +12 -0
- package/lib/drama/skills/short-drama-storyboard/assets/scene-visual-plan.example.jsonl +2 -0
- package/lib/drama/skills/short-drama-storyboard/assets/shot-template.jsonl +2 -0
- package/lib/drama/skills/short-drama-storyboard/references/blocking-playbooks.md +241 -0
- package/lib/drama/skills/short-drama-storyboard/references/coverage-audition.md +39 -0
- package/lib/drama/skills/short-drama-storyboard/references/keyframe-craft.md +169 -0
- package/lib/drama/skills/short-drama-storyboard/references/production-shot-grammar.md +264 -0
- package/lib/drama/skills/short-drama-storyboard/references/review-and-fixtures.md +70 -0
- package/lib/drama/skills/short-drama-storyboard/references/scene-visual-plan.md +39 -0
- package/lib/drama/skills/short-drama-storyboard/references/screenplay-to-keyframe-example.md +157 -0
- package/lib/drama/skills/short-drama-storyboard/references/shot-craft.md +192 -0
- package/lib/drama/skills/short-drama-storyboard/references/shot-revision-identity.md +29 -0
- package/lib/drama/skills/short-drama-storyboard/references/stage-contract.md +110 -0
- package/lib/drama/skills/short-drama-storyboard/scripts/selftest.py +191 -0
- package/lib/drama/skills/short-drama-storyboard/scripts/storyboard_check.py +824 -0
- package/lib/drama/skills/short-drama-video-prompts/SKILL.md +245 -0
- package/lib/drama/skills/short-drama-video-prompts/agents/openai.yaml +4 -0
- package/lib/drama/skills/short-drama-video-prompts/assets/coverage-scope.fragment.json +21 -0
- package/lib/drama/skills/short-drama-video-prompts/assets/delivery-container.jsonl.md +101 -0
- package/lib/drama/skills/short-drama-video-prompts/assets/motion-spec.jsonl.md +212 -0
- package/lib/drama/skills/short-drama-video-prompts/assets/motion-terminal.example.jsonl +2 -0
- package/lib/drama/skills/short-drama-video-prompts/assets/music-spec.jsonl.md +31 -0
- package/lib/drama/skills/short-drama-video-prompts/assets/performance.fragment.json +38 -0
- package/lib/drama/skills/short-drama-video-prompts/assets/video-prompts.md +46 -0
- package/lib/drama/skills/short-drama-video-prompts/examples/minimal-music-specs.jsonl +2 -0
- package/lib/drama/skills/short-drama-video-prompts/references/camera-audio-continuity.md +240 -0
- package/lib/drama/skills/short-drama-video-prompts/references/delivery-profile.md +255 -0
- package/lib/drama/skills/short-drama-video-prompts/references/generability.md +93 -0
- package/lib/drama/skills/short-drama-video-prompts/references/motion-recipe.md +304 -0
- package/lib/drama/skills/short-drama-video-prompts/references/performance-action-timing.md +191 -0
- package/lib/drama/skills/short-drama-video-prompts/references/production-prompt-grammar.md +312 -0
- package/lib/drama/skills/short-drama-video-prompts/references/review-and-fixtures.md +168 -0
- package/lib/drama/skills/short-drama-video-prompts/references/stage-contract.md +110 -0
- package/lib/drama/skills/short-drama-video-prompts/scripts/container_check.py +329 -0
- package/lib/drama/skills/short-drama-video-prompts/scripts/motion_timing_check.py +450 -0
- package/lib/drama/skills/short-drama-video-prompts/scripts/music_spec_check.py +327 -0
- package/lib/drama/skills/short-drama-video-prompts/scripts/selftest.py +82 -0
- package/lib/drama/skills/short-drama-write/SKILL.md +284 -0
- package/lib/drama/skills/short-drama-write/agents/openai.yaml +4 -0
- package/lib/drama/skills/short-drama-write/assets/beats.jsonl +2 -0
- package/lib/drama/skills/short-drama-write/assets/episode-card-standalone.json +120 -0
- package/lib/drama/skills/short-drama-write/assets/episode-card.json +55 -0
- package/lib/drama/skills/short-drama-write/assets/screenplay.md +36 -0
- package/lib/drama/skills/short-drama-write/assets/voice-record-sheet.jsonl.md +89 -0
- package/lib/drama/skills/short-drama-write/references/dialogue-craft.md +519 -0
- package/lib/drama/skills/short-drama-write/references/production-format-dialect.md +273 -0
- package/lib/drama/skills/short-drama-write/references/scene-handoff-capsule.md +51 -0
- package/lib/drama/skills/short-drama-write/references/scene-sound-dramaturgy.md +43 -0
- package/lib/drama/skills/short-drama-write/references/screenplay-format.md +260 -0
- package/lib/drama/skills/short-drama-write/references/script-craft.md +558 -0
- package/lib/drama/skills/short-drama-write/references/stage-contract.md +94 -0
- package/lib/drama/skills/short-drama-write/references/substitutable-realization.md +107 -0
- package/lib/drama/skills/short-drama-write/scripts/duration_estimate.py +309 -0
- package/lib/drama/skills/short-drama-write/scripts/screenplay_index.py +1091 -0
- package/lib/drama/skills/short-drama-write/scripts/selftest.py +229 -0
- package/lib/drama/skills/short-drama-write/scripts/voice_sheet_check.py +416 -0
- package/lib/index.js +756 -0
- package/lib/index.js.map +7 -0
- package/lib/oh-story/LICENSE.upstream +21 -0
- package/lib/oh-story/manifest.json +1351 -0
- package/lib/oh-story/roles/chapter-extractor.md +314 -0
- package/lib/oh-story/roles/character-designer.md +169 -0
- package/lib/oh-story/roles/consistency-checker.md +190 -0
- package/lib/oh-story/roles/narrative-writer.md +294 -0
- package/lib/oh-story/roles/story-architect.md +195 -0
- package/lib/oh-story/roles/story-explorer.md +364 -0
- package/lib/oh-story/roles/story-researcher.md +304 -0
- package/lib/oh-story/skills/browser-cdp/SKILL.md +175 -0
- package/lib/oh-story/skills/story/SKILL.md +116 -0
- package/lib/oh-story/skills/story/VERSION +1 -0
- package/lib/oh-story/skills/story-cover/SKILL.md +327 -0
- package/lib/oh-story/skills/story-cover/references/cover-styles.md +210 -0
- package/lib/oh-story/skills/story-deslop/SKILL.md +445 -0
- package/lib/oh-story/skills/story-deslop/references/anti-ai-writing.md +582 -0
- package/lib/oh-story/skills/story-deslop/references/banned-words.md +147 -0
- package/lib/oh-story/skills/story-deslop/scripts/check-ai-patterns.js +1371 -0
- package/lib/oh-story/skills/story-deslop/scripts/check-degeneration.js +330 -0
- package/lib/oh-story/skills/story-deslop/scripts/check-outline-copy.js +241 -0
- package/lib/oh-story/skills/story-deslop/scripts/normalize-punctuation.js +410 -0
- package/lib/oh-story/skills/story-import/SKILL.md +634 -0
- package/lib/oh-story/skills/story-import/references/character-state-reverse.md +82 -0
- package/lib/oh-story/skills/story-import/references/format-and-structure.md +169 -0
- package/lib/oh-story/skills/story-import/references/length-routing.md +134 -0
- package/lib/oh-story/skills/story-import/references/state-tracking.md +108 -0
- package/lib/oh-story/skills/story-import/references/structure-mapping-long.md +442 -0
- package/lib/oh-story/skills/story-import/references/structure-mapping-short.md +175 -0
- package/lib/oh-story/skills/story-import/references/tracking-transaction.md +161 -0
- package/lib/oh-story/skills/story-import/scripts/tracking_commit.py +1139 -0
- package/lib/oh-story/skills/story-long-analyze/SKILL.md +329 -0
- package/lib/oh-story/skills/story-long-analyze/references/deconstruction-notes.md +270 -0
- package/lib/oh-story/skills/story-long-analyze/references/material-decomposition.md +530 -0
- package/lib/oh-story/skills/story-long-analyze/references/output-templates.md +559 -0
- package/lib/oh-story/skills/story-long-analyze/references/pipeline-ops.md +80 -0
- package/lib/oh-story/skills/story-long-analyze/references/style-profile-generator.md +149 -0
- package/lib/oh-story/skills/story-long-analyze/references/style-profile-protocol.md +133 -0
- package/lib/oh-story/skills/story-long-scan/SKILL.md +342 -0
- package/lib/oh-story/skills/story-long-scan/references/genre-trends.md +197 -0
- package/lib/oh-story/skills/story-long-scan/references/publishing-guide.md +114 -0
- package/lib/oh-story/skills/story-long-scan/references/reader-profiling.md +105 -0
- package/lib/oh-story/skills/story-long-scan/references/scan-output-format.md +207 -0
- package/lib/oh-story/skills/story-long-scan/references/topic-decision.md +78 -0
- package/lib/oh-story/skills/story-long-write/SKILL.md +327 -0
- package/lib/oh-story/skills/story-long-write/references/anti-ai-writing.md +582 -0
- package/lib/oh-story/skills/story-long-write/references/artifact-protocols.md +302 -0
- package/lib/oh-story/skills/story-long-write/references/banned-words.md +147 -0
- package/lib/oh-story/skills/story-long-write/references/character-basics.md +445 -0
- package/lib/oh-story/skills/story-long-write/references/character-design-methods.md +428 -0
- package/lib/oh-story/skills/story-long-write/references/character-relations.md +385 -0
- package/lib/oh-story/skills/story-long-write/references/commercial-core-methods.md +502 -0
- package/lib/oh-story/skills/story-long-write/references/cross-book-recall.md +62 -0
- package/lib/oh-story/skills/story-long-write/references/dialogue-mastery.md +282 -0
- package/lib/oh-story/skills/story-long-write/references/emotional-arc-design.md +426 -0
- package/lib/oh-story/skills/story-long-write/references/emotional-methods.md +209 -0
- package/lib/oh-story/skills/story-long-write/references/female-audience-writing.md +188 -0
- package/lib/oh-story/skills/story-long-write/references/format-and-structure.md +169 -0
- package/lib/oh-story/skills/story-long-write/references/genre-catalog.md +480 -0
- package/lib/oh-story/skills/story-long-write/references/genre-core-mechanics.md +415 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//344/270/234/346/226/271/344/273/231/344/276/240.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//344/274/240/347/273/237/347/216/204/345/271/273.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//345/216/206/345/217/262/345/217/244/344/273/243.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//345/216/206/345/217/262/350/204/221/346/264/236.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//345/217/214/347/224/267/344/270/273.md +53 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//345/217/244/350/250/200/350/204/221/346/264/236.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//345/217/244/351/243/216/344/270/226/346/203/205.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//345/245/263/351/242/221/346/202/254/347/226/221.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//345/245/263/351/242/221/347/247/215/347/224/260.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//345/256/253/346/226/227/345/256/205/346/226/227.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//345/271/264/344/273/243.md +53 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//345/277/253/347/251/277.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//346/202/254/347/226/221/347/201/265/345/274/202.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//346/202/254/347/226/221/350/204/221/346/264/236.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//346/210/230/347/245/236/350/265/230/345/251/277.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//346/212/227/346/210/230/350/260/215/346/210/230.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//346/230/237/345/205/211/347/222/200/347/222/250.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//346/260/221/345/233/275/350/250/200/346/203/205.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//346/270/270/346/210/217/344/275/223/350/202/262.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//347/216/204/345/271/273/350/204/221/346/264/236.md +53 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//347/216/204/345/271/273/350/250/200/346/203/205.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//347/216/260/350/250/200/350/204/221/346/264/236.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//347/247/221/345/271/273/346/234/253/344/270/226.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//350/201/214/345/234/272/345/251/232/346/201/213.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//350/245/277/346/226/271/345/245/207/345/271/273.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//350/261/252/351/227/250/346/200/273/350/243/201.md +53 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//351/203/275/345/270/202/344/277/256/347/234/237.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//351/203/275/345/270/202/346/227/245/345/270/270.md +53 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//351/203/275/345/270/202/347/247/215/347/224/260.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//351/203/275/345/270/202/350/204/221/346/264/236.md +53 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//351/203/275/345/270/202/351/253/230/346/255/246.md +53 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards//351/235/222/346/230/245/347/224/234/345/256/240.md +51 -0
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards.md +91 -0
- package/lib/oh-story/skills/story-long-write/references/genre-readers.md +235 -0
- package/lib/oh-story/skills/story-long-write/references/genre-writing-formulas.md +444 -0
- package/lib/oh-story/skills/story-long-write/references/hooks-chapter.md +225 -0
- package/lib/oh-story/skills/story-long-write/references/hooks-paragraph.md +146 -0
- package/lib/oh-story/skills/story-long-write/references/hooks-suspense.md +352 -0
- package/lib/oh-story/skills/story-long-write/references/opening-design.md +349 -0
- package/lib/oh-story/skills/story-long-write/references/outline-conflict.md +457 -0
- package/lib/oh-story/skills/story-long-write/references/outline-methods.md +287 -0
- package/lib/oh-story/skills/story-long-write/references/outline-rhythm.md +389 -0
- package/lib/oh-story/skills/story-long-write/references/outline-structure-theory.md +326 -0
- package/lib/oh-story/skills/story-long-write/references/plot-core-methods.md +522 -0
- package/lib/oh-story/skills/story-long-write/references/plot-emotion-system.md +354 -0
- package/lib/oh-story/skills/story-long-write/references/plot-frameworks.md +711 -0
- package/lib/oh-story/skills/story-long-write/references/plot-special-topics.md +622 -0
- package/lib/oh-story/skills/story-long-write/references/quality-checklist.md +184 -0
- package/lib/oh-story/skills/story-long-write/references/reader-contract-and-progression.md +109 -0
- package/lib/oh-story/skills/story-long-write/references/reversal-toolkit.md +349 -0
- package/lib/oh-story/skills/story-long-write/references/state-tracking.md +108 -0
- package/lib/oh-story/skills/story-long-write/references/style-combat-face.md +409 -0
- package/lib/oh-story/skills/story-long-write/references/style-craft.md +347 -0
- package/lib/oh-story/skills/story-long-write/references/style-genre-modules.md +510 -0
- package/lib/oh-story/skills/story-long-write/references/tracking-transaction.md +161 -0
- package/lib/oh-story/skills/story-long-write/references/workflow-chapter.md +140 -0
- package/lib/oh-story/skills/story-long-write/references/workflow-daily.md +171 -0
- package/lib/oh-story/skills/story-long-write/references/workflow-revision.md +99 -0
- package/lib/oh-story/skills/story-long-write/references/workflow-setup.md +284 -0
- package/lib/oh-story/skills/story-long-write/references/writing-craft.md +421 -0
- package/lib/oh-story/skills/story-long-write/scripts/check-ai-patterns.js +1371 -0
- package/lib/oh-story/skills/story-long-write/scripts/check-degeneration.js +330 -0
- package/lib/oh-story/skills/story-long-write/scripts/check-outline-copy.js +241 -0
- package/lib/oh-story/skills/story-long-write/scripts/normalize-punctuation.js +410 -0
- package/lib/oh-story/skills/story-long-write/scripts/tracking_commit.py +1139 -0
- package/lib/oh-story/skills/story-review/SKILL.md +483 -0
- package/lib/oh-story/skills/story-review/references/anti-ai-writing.md +582 -0
- package/lib/oh-story/skills/story-review/references/banned-words.md +147 -0
- package/lib/oh-story/skills/story-review/references/character-relations.md +385 -0
- package/lib/oh-story/skills/story-review/references/dialogue-mastery.md +282 -0
- package/lib/oh-story/skills/story-review/references/plot-core-methods.md +522 -0
- package/lib/oh-story/skills/story-review/references/quality-checklist.md +250 -0
- package/lib/oh-story/skills/story-review/references/quality-rubric.md +55 -0
- package/lib/oh-story/skills/story-review/references/rubrics/fanqie.md +18 -0
- package/lib/oh-story/skills/story-review/references/rubrics/qidian.md +19 -0
- package/lib/oh-story/skills/story-review/references/rubrics/zhihu.md +20 -0
- package/lib/oh-story/skills/story-review/references/tracking-transaction.md +161 -0
- package/lib/oh-story/skills/story-review/scripts/check-ai-patterns.js +1371 -0
- package/lib/oh-story/skills/story-review/scripts/check-degeneration.js +330 -0
- package/lib/oh-story/skills/story-review/scripts/normalize-punctuation.js +410 -0
- package/lib/oh-story/skills/story-review/scripts/tracking_commit.py +1139 -0
- package/lib/oh-story/skills/story-setup/SKILL.md +495 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/anti-ai-writing.md +582 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/banned-words.md +147 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/character-basics.md +445 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/character-design-methods.md +428 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/character-relations.md +385 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/dialogue-mastery.md +282 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/emotional-arc-design.md +426 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/emotional-methods.md +179 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/format-and-structure.md +169 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-catalog.md +480 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-core-mechanics.md +415 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//344/270/234/346/226/271/344/273/231/344/276/240.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//344/274/240/347/273/237/347/216/204/345/271/273.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//345/216/206/345/217/262/345/217/244/344/273/243.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//345/216/206/345/217/262/350/204/221/346/264/236.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//345/217/214/347/224/267/344/270/273.md +53 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//345/217/244/350/250/200/350/204/221/346/264/236.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//345/217/244/351/243/216/344/270/226/346/203/205.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//345/245/263/351/242/221/346/202/254/347/226/221.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//345/245/263/351/242/221/347/247/215/347/224/260.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//345/256/253/346/226/227/345/256/205/346/226/227.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//345/271/264/344/273/243.md +53 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//345/277/253/347/251/277.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//346/202/254/347/226/221/347/201/265/345/274/202.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//346/202/254/347/226/221/350/204/221/346/264/236.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//346/210/230/347/245/236/350/265/230/345/251/277.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//346/212/227/346/210/230/350/260/215/346/210/230.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//346/230/237/345/205/211/347/222/200/347/222/250.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//346/260/221/345/233/275/350/250/200/346/203/205.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//346/270/270/346/210/217/344/275/223/350/202/262.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//347/216/204/345/271/273/350/204/221/346/264/236.md +53 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//347/216/204/345/271/273/350/250/200/346/203/205.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//347/216/260/350/250/200/350/204/221/346/264/236.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//347/247/221/345/271/273/346/234/253/344/270/226.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//350/201/214/345/234/272/345/251/232/346/201/213.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//350/245/277/346/226/271/345/245/207/345/271/273.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//350/261/252/351/227/250/346/200/273/350/243/201.md +53 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//351/203/275/345/270/202/344/277/256/347/234/237.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//351/203/275/345/270/202/346/227/245/345/270/270.md +53 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//351/203/275/345/270/202/347/247/215/347/224/260.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//351/203/275/345/270/202/350/204/221/346/264/236.md +53 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//351/203/275/345/270/202/351/253/230/346/255/246.md +53 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards//351/235/222/346/230/245/347/224/234/345/256/240.md +51 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards.md +91 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-readers.md +235 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-writing-formulas.md +444 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/hooks-chapter.md +225 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/hooks-suspense.md +352 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/opening-design.md +349 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/outline-conflict.md +457 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/outline-methods.md +287 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/outline-rhythm.md +389 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/plot-core-methods.md +522 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/quality-checklist.md +247 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/reversal-toolkit.md +349 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/style-combat-face.md +409 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/style-genre-modules.md +510 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/writing-craft.md +421 -0
- package/lib/oh-story/skills/story-short-analyze/SKILL.md +278 -0
- package/lib/oh-story/skills/story-short-analyze/references/anti-ai-writing.md +582 -0
- package/lib/oh-story/skills/story-short-analyze/references/banned-words.md +147 -0
- package/lib/oh-story/skills/story-short-analyze/references/character-basics.md +453 -0
- package/lib/oh-story/skills/story-short-analyze/references/character-design-methods.md +438 -0
- package/lib/oh-story/skills/story-short-analyze/references/character-relations.md +395 -0
- package/lib/oh-story/skills/story-short-analyze/references/deconstruction-examples.md +79 -0
- package/lib/oh-story/skills/story-short-analyze/references/genre-catalog.md +490 -0
- package/lib/oh-story/skills/story-short-analyze/references/genre-core-mechanics.md +425 -0
- package/lib/oh-story/skills/story-short-analyze/references/genre-readers.md +245 -0
- package/lib/oh-story/skills/story-short-analyze/references/genre-writing-formulas.md +453 -0
- package/lib/oh-story/skills/story-short-analyze/references/genre-writing-techniques.md +475 -0
- package/lib/oh-story/skills/story-short-analyze/references/hooks-chapter.md +225 -0
- package/lib/oh-story/skills/story-short-analyze/references/hooks-paragraph.md +146 -0
- package/lib/oh-story/skills/story-short-analyze/references/hooks-suspense.md +352 -0
- package/lib/oh-story/skills/story-short-analyze/references/material-decomposition.md +685 -0
- package/lib/oh-story/skills/story-short-analyze/references/output-contract.md +165 -0
- package/lib/oh-story/skills/story-short-analyze/references/output-templates.md +561 -0
- package/lib/oh-story/skills/story-short-analyze/references/quality-checklist.md +242 -0
- package/lib/oh-story/skills/story-short-analyze/references/real-market-data.md +90 -0
- package/lib/oh-story/skills/story-short-analyze/references/zhihu-style.md +54 -0
- package/lib/oh-story/skills/story-short-scan/SKILL.md +212 -0
- package/lib/oh-story/skills/story-short-scan/references/real-market-data.md +90 -0
- package/lib/oh-story/skills/story-short-write/SKILL.md +433 -0
- package/lib/oh-story/skills/story-short-write/references/banned-words.md +147 -0
- package/lib/oh-story/skills/story-short-write/references/cross-book-recall.md +62 -0
- package/lib/oh-story/skills/story-short-write/references/dialogue-mastery.md +282 -0
- package/lib/oh-story/skills/story-short-write/references/emotional-methods.md +179 -0
- package/lib/oh-story/skills/story-short-write/references/genre-styles//344/270/226/346/203/205/346/211/223/350/204/270.md +159 -0
- package/lib/oh-story/skills/story-short-write/references/genre-styles//345/217/214/347/224/267/344/270/273.md +156 -0
- package/lib/oh-story/skills/story-short-write/references/genre-styles//345/244/215/344/273/207/346/211/223/350/204/270.md +163 -0
- package/lib/oh-story/skills/story-short-write/references/genre-styles//345/256/205/346/226/227/345/256/253/346/226/227.md +167 -0
- package/lib/oh-story/skills/story-short-write/references/genre-styles//346/200/273/350/243/201/350/261/252/351/227/250.md +178 -0
- package/lib/oh-story/skills/story-short-write/references/genre-styles//346/202/254/347/226/221.md +166 -0
- package/lib/oh-story/skills/story-short-write/references/genre-styles//346/260/221/344/277/227/346/200/252/350/260/210.md +159 -0
- package/lib/oh-story/skills/story-short-write/references/genre-styles//346/262/231/351/233/225/350/204/221/346/264/236.md +151 -0
- package/lib/oh-story/skills/story-short-write/references/genre-styles//347/224/234/345/256/240.md +153 -0
- package/lib/oh-story/skills/story-short-write/references/genre-styles//350/277/275/345/246/273/347/201/253/350/221/254/345/234/272.md +210 -0
- package/lib/oh-story/skills/story-short-write/references/genre-writing-formulas.md +444 -0
- package/lib/oh-story/skills/story-short-write/references/genre-writing-techniques.md +488 -0
- package/lib/oh-story/skills/story-short-write/references/hooks-chapter.md +225 -0
- package/lib/oh-story/skills/story-short-write/references/hooks-paragraph.md +146 -0
- package/lib/oh-story/skills/story-short-write/references/hooks-suspense.md +352 -0
- package/lib/oh-story/skills/story-short-write/references/output-contract.md +165 -0
- package/lib/oh-story/skills/story-short-write/references/quality-checklist.md +222 -0
- package/lib/oh-story/skills/story-short-write/references/reversal-toolkit.md +349 -0
- package/lib/oh-story/skills/story-short-write/references/short-craft.md +185 -0
- package/lib/oh-story/skills/story-short-write/references/short-deslop.md +133 -0
- package/lib/oh-story/skills/story-short-write/references/short-format.md +167 -0
- package/lib/oh-story/skills/story-short-write/references/submission-craft.md +35 -0
- package/lib/oh-story/skills/story-short-write/references/villain-and-reveal.md +158 -0
- package/lib/oh-story/skills/story-short-write/references/writing-workflow.md +153 -0
- package/lib/oh-story/skills/story-short-write/scripts/check-ai-patterns.js +1371 -0
- package/lib/oh-story/skills/story-short-write/scripts/check-degeneration.js +330 -0
- package/lib/oh-story/skills/story-short-write/scripts/check-outline-copy.js +241 -0
- package/lib/oh-story/skills/story-short-write/scripts/normalize-punctuation.js +410 -0
- package/lib/types/client/file-activity.d.ts +30 -0
- package/lib/types/client/file-activity.d.ts.map +1 -0
- package/lib/types/client/file-tree.d.ts +20 -0
- package/lib/types/client/file-tree.d.ts.map +1 -0
- package/lib/types/client/index.d.ts +12 -0
- package/lib/types/client/index.d.ts.map +1 -0
- package/lib/types/client/jsonl-preview.d.ts +15 -0
- package/lib/types/client/jsonl-preview.d.ts.map +1 -0
- package/lib/types/client/markdown-preview.d.ts +38 -0
- package/lib/types/client/markdown-preview.d.ts.map +1 -0
- package/lib/types/index.d.ts +25 -0
- package/lib/types/index.d.ts.map +1 -0
- package/lib/types/native-hooks.d.ts +16 -0
- package/lib/types/native-hooks.d.ts.map +1 -0
- package/lib/types/role-provider.d.ts +6 -0
- package/lib/types/role-provider.d.ts.map +1 -0
- package/lib/types/role-tool.d.ts +10 -0
- package/lib/types/role-tool.d.ts.map +1 -0
- package/lib/types/skill-provider.d.ts +15 -0
- package/lib/types/skill-provider.d.ts.map +1 -0
- package/lib/types/workspace-request-trust.d.ts +13 -0
- package/lib/types/workspace-request-trust.d.ts.map +1 -0
- package/lib/types/workspace-route.d.ts +10 -0
- package/lib/types/workspace-route.d.ts.map +1 -0
- package/lib/types/workspace-security.d.ts +9 -0
- package/lib/types/workspace-security.d.ts.map +1 -0
- package/package.json +107 -0
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Offline self-test for the standalone project lifecycle."""
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import json
|
|
7
|
+
import tempfile
|
|
8
|
+
import sys
|
|
9
|
+
from collections.abc import Iterator
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
from typing import Any, NamedTuple
|
|
12
|
+
|
|
13
|
+
from project_tool import initialize_project, project_status, publish_candidate
|
|
14
|
+
|
|
15
|
+
MINIMUM_PYTHON = (3, 9)
|
|
16
|
+
if sys.version_info < MINIMUM_PYTHON:
|
|
17
|
+
raise SystemExit("selftest.py requires Python 3.9 or newer")
|
|
18
|
+
|
|
19
|
+
SKILL_ROOT = Path(__file__).resolve().parent.parent
|
|
20
|
+
EXAMPLE_RECORDS = (
|
|
21
|
+
"assets/creator-decision.example.jsonl",
|
|
22
|
+
"assets/production-observation.example.jsonl",
|
|
23
|
+
"assets/reference-observation.example.jsonl",
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
# ---------------------------------------------------------------------------
|
|
27
|
+
# REFERENCE RESOLVER -- reference implementation.
|
|
28
|
+
#
|
|
29
|
+
# Each skill carries its own copy of this block. The suite has no shared
|
|
30
|
+
# library on purpose: a skill must stay runnable after copying only its own
|
|
31
|
+
# directory, so duplicating these few lines across skills is the correct shape.
|
|
32
|
+
# Copy the block verbatim; do not import it.
|
|
33
|
+
# ---------------------------------------------------------------------------
|
|
34
|
+
|
|
35
|
+
SOURCES_RECORD_TYPE = "sources"
|
|
36
|
+
SOURCES_SCHEMA_VERSION = "1.0.0"
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class ResolvedRef(NamedTuple):
|
|
40
|
+
"""An upstream reference with its snapshot resolved, whichever form it used."""
|
|
41
|
+
|
|
42
|
+
owner: str
|
|
43
|
+
artifact: str
|
|
44
|
+
record_id: str | None
|
|
45
|
+
field: str | None
|
|
46
|
+
authority: str | None
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class RefFinding(NamedTuple):
|
|
50
|
+
"""A structural defect in a reference object."""
|
|
51
|
+
|
|
52
|
+
code: str
|
|
53
|
+
location: str
|
|
54
|
+
detail: str
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def load_sources(document: Any) -> dict[str, dict[str, Any]]:
|
|
58
|
+
"""Return the ``sources`` declaration of a parsed file, or ``{}`` if absent.
|
|
59
|
+
|
|
60
|
+
Accepts a parsed ``.json`` document (a dict) or the parsed record list of a
|
|
61
|
+
``.jsonl`` file, whose declaration lives on the first record.
|
|
62
|
+
"""
|
|
63
|
+
if isinstance(document, list):
|
|
64
|
+
document = document[0] if document else None
|
|
65
|
+
if not isinstance(document, dict):
|
|
66
|
+
return {}
|
|
67
|
+
declared = document.get("sources")
|
|
68
|
+
if not isinstance(declared, dict):
|
|
69
|
+
return {}
|
|
70
|
+
return {key: value for key, value in declared.items() if isinstance(value, dict)}
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def resolve_ref(
|
|
74
|
+
ref: Any, sources: dict[str, dict[str, Any]], location: str
|
|
75
|
+
) -> tuple[ResolvedRef | None, RefFinding | None]:
|
|
76
|
+
"""Resolve a reference object written in either the compact or expanded form."""
|
|
77
|
+
if not isinstance(ref, dict):
|
|
78
|
+
return None, RefFinding("REF_IS_NOT_AN_OBJECT", location, f"got {type(ref).__name__}")
|
|
79
|
+
src = ref.get("src")
|
|
80
|
+
if isinstance(src, str):
|
|
81
|
+
entry = sources.get(src)
|
|
82
|
+
if entry is None:
|
|
83
|
+
return None, RefFinding(
|
|
84
|
+
"REF_SRC_IS_NOT_DECLARED", location, f"src {src!r} has no sources entry"
|
|
85
|
+
)
|
|
86
|
+
owner, artifact = entry.get("owner"), entry.get("artifact")
|
|
87
|
+
if not (isinstance(owner, str) and isinstance(artifact, str)):
|
|
88
|
+
return None, RefFinding(
|
|
89
|
+
"SOURCE_ENTRY_IS_INCOMPLETE",
|
|
90
|
+
location,
|
|
91
|
+
f"sources[{src!r}] needs owner/artifact",
|
|
92
|
+
)
|
|
93
|
+
elif all(isinstance(ref.get(key), str) for key in ("owner", "artifact")):
|
|
94
|
+
owner, artifact = ref["owner"], ref["artifact"]
|
|
95
|
+
else:
|
|
96
|
+
return None, RefFinding(
|
|
97
|
+
"REF_HAS_NO_UPSTREAM_BINDING", location, "needs src, or owner+artifact"
|
|
98
|
+
)
|
|
99
|
+
optional = {
|
|
100
|
+
key: ref[key] for key in ("record_id", "field", "authority") if isinstance(ref.get(key), str)
|
|
101
|
+
}
|
|
102
|
+
return (
|
|
103
|
+
ResolvedRef(
|
|
104
|
+
owner,
|
|
105
|
+
artifact,
|
|
106
|
+
optional.get("record_id"),
|
|
107
|
+
optional.get("field"),
|
|
108
|
+
optional.get("authority"),
|
|
109
|
+
),
|
|
110
|
+
None,
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
# ---------------------------------------------------------------------------
|
|
115
|
+
# END REFERENCE RESOLVER
|
|
116
|
+
# ---------------------------------------------------------------------------
|
|
117
|
+
|
|
118
|
+
# A reference lives under a slot named by convention. `target_locators` is the
|
|
119
|
+
# creator-decision carrier that predates the suffix rule.
|
|
120
|
+
REF_CARRIER_SUFFIXES = ("_ref", "_refs")
|
|
121
|
+
EXTRA_REF_CARRIERS = ("target_locators",)
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def is_ref_carrier(key: str) -> bool:
|
|
125
|
+
return key.endswith(REF_CARRIER_SUFFIXES) or key in EXTRA_REF_CARRIERS
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def iter_refs(node: Any, location: str) -> Iterator[tuple[Any, str]]:
|
|
129
|
+
"""Yield every reference object carried anywhere inside a record."""
|
|
130
|
+
if isinstance(node, list):
|
|
131
|
+
for index, item in enumerate(node):
|
|
132
|
+
yield from iter_refs(item, f"{location}[{index}]")
|
|
133
|
+
return
|
|
134
|
+
if not isinstance(node, dict):
|
|
135
|
+
return
|
|
136
|
+
for key, value in node.items():
|
|
137
|
+
where = f"{location}/{key}"
|
|
138
|
+
if is_ref_carrier(key) and value is not None:
|
|
139
|
+
if isinstance(value, list):
|
|
140
|
+
for index, ref in enumerate(value):
|
|
141
|
+
yield ref, f"{where}[{index}]"
|
|
142
|
+
else:
|
|
143
|
+
yield value, where
|
|
144
|
+
continue
|
|
145
|
+
yield from iter_refs(value, where)
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def read_records(path: Path) -> list[Any]:
|
|
149
|
+
return [
|
|
150
|
+
json.loads(line) for line in path.read_text(encoding="utf-8").splitlines() if line.strip()
|
|
151
|
+
]
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def check_records(records: list[Any], name: str) -> tuple[int, list[RefFinding]]:
|
|
155
|
+
"""Resolve every reference in a .jsonl file through its own declaration."""
|
|
156
|
+
sources = load_sources(records)
|
|
157
|
+
resolved = 0
|
|
158
|
+
findings: list[RefFinding] = []
|
|
159
|
+
for number, record in enumerate(records, 1):
|
|
160
|
+
if isinstance(record, dict) and record.get("record_type") == SOURCES_RECORD_TYPE:
|
|
161
|
+
continue
|
|
162
|
+
for ref, where in iter_refs(record, f"{name}:{number}"):
|
|
163
|
+
found, finding = resolve_ref(ref, sources, where)
|
|
164
|
+
if finding is not None:
|
|
165
|
+
findings.append(finding)
|
|
166
|
+
if found is not None:
|
|
167
|
+
resolved += 1
|
|
168
|
+
return resolved, findings
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
CHECKS = 0
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
def require(condition: bool, message: str) -> None:
|
|
175
|
+
global CHECKS
|
|
176
|
+
if not condition:
|
|
177
|
+
raise AssertionError(message)
|
|
178
|
+
CHECKS += 1
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
def main() -> int:
|
|
182
|
+
for relative in EXAMPLE_RECORDS:
|
|
183
|
+
path = SKILL_ROOT / relative
|
|
184
|
+
records = read_records(path)
|
|
185
|
+
declared = load_sources(records)
|
|
186
|
+
require(bool(declared), f"{relative} declares its upstream snapshots")
|
|
187
|
+
resolved, findings = check_records(records, path.name)
|
|
188
|
+
require(not findings, f"{relative} reference findings: {findings}")
|
|
189
|
+
require(resolved > 0, f"{relative} carries at least one resolvable reference")
|
|
190
|
+
|
|
191
|
+
sources = {"screenplay": {"owner": "short-drama-write", "artifact": "a.md", "hash": "0" * 64}}
|
|
192
|
+
_, undeclared = resolve_ref({"src": "missing", "record_id": "BLK-1"}, sources, "synthetic")
|
|
193
|
+
require(
|
|
194
|
+
undeclared is not None and undeclared.code == "REF_SRC_IS_NOT_DECLARED",
|
|
195
|
+
"a src without a sources entry is a structural finding",
|
|
196
|
+
)
|
|
197
|
+
_, unbound = resolve_ref({"record_id": "BLK-1"}, sources, "synthetic")
|
|
198
|
+
require(
|
|
199
|
+
unbound is not None and unbound.code == "REF_HAS_NO_UPSTREAM_BINDING",
|
|
200
|
+
"a reference binding neither way is a structural finding",
|
|
201
|
+
)
|
|
202
|
+
expanded, finding = resolve_ref(
|
|
203
|
+
{
|
|
204
|
+
"owner": "short-drama-write",
|
|
205
|
+
"artifact": "剧集/EP001/screenplay-index.jsonl",
|
|
206
|
+
"hash": "a" * 64,
|
|
207
|
+
"record_id": "BLK-EP001-SC001-A01",
|
|
208
|
+
},
|
|
209
|
+
{},
|
|
210
|
+
"synthetic",
|
|
211
|
+
)
|
|
212
|
+
require(
|
|
213
|
+
finding is None and expanded is not None and expanded.record_id == "BLK-EP001-SC001-A01",
|
|
214
|
+
"a project written before the declaration still resolves",
|
|
215
|
+
)
|
|
216
|
+
|
|
217
|
+
with tempfile.TemporaryDirectory() as directory:
|
|
218
|
+
root = Path(directory) / "project"
|
|
219
|
+
created = initialize_project(
|
|
220
|
+
root,
|
|
221
|
+
title="Self-test",
|
|
222
|
+
language="zh-CN",
|
|
223
|
+
prompt_language="en",
|
|
224
|
+
aspect_ratio="9:16",
|
|
225
|
+
)
|
|
226
|
+
require(created["project"]["title"] == "Self-test", "project title")
|
|
227
|
+
require(
|
|
228
|
+
project_status(root)["project_id"] == created["project"]["project_id"],
|
|
229
|
+
"project discovery",
|
|
230
|
+
)
|
|
231
|
+
|
|
232
|
+
published = publish_candidate(
|
|
233
|
+
root,
|
|
234
|
+
owner="selftest",
|
|
235
|
+
artifact_id="SELFTEST-001",
|
|
236
|
+
outputs={"剧集/EP001/screenplay.md": "# EP001\n"},
|
|
237
|
+
)
|
|
238
|
+
require(published["state"] == "needs_confirmation", "publication state")
|
|
239
|
+
|
|
240
|
+
header = json.dumps(
|
|
241
|
+
{
|
|
242
|
+
"record_type": SOURCES_RECORD_TYPE,
|
|
243
|
+
"schema_version": SOURCES_SCHEMA_VERSION,
|
|
244
|
+
"sources": {
|
|
245
|
+
"screenplay": {
|
|
246
|
+
"owner": "short-drama-write",
|
|
247
|
+
"artifact": "剧集/EP001/screenplay.md",
|
|
248
|
+
"hash": "a" * 64,
|
|
249
|
+
}
|
|
250
|
+
},
|
|
251
|
+
},
|
|
252
|
+
ensure_ascii=False,
|
|
253
|
+
)
|
|
254
|
+
record = json.dumps(
|
|
255
|
+
{"shot_id": "SHOT-001", "source_ref": {"src": "screenplay", "record_id": "BLK-1"}},
|
|
256
|
+
ensure_ascii=False,
|
|
257
|
+
)
|
|
258
|
+
declared_publication = publish_candidate(
|
|
259
|
+
root,
|
|
260
|
+
owner="selftest",
|
|
261
|
+
artifact_id="SELFTEST-002",
|
|
262
|
+
outputs={"剧集/EP001/storyboard/shots.jsonl": f"{header}\n{record}\n"},
|
|
263
|
+
)
|
|
264
|
+
require(
|
|
265
|
+
declared_publication["state"] == "needs_confirmation",
|
|
266
|
+
"a file declaring its upstream snapshots publishes",
|
|
267
|
+
)
|
|
268
|
+
|
|
269
|
+
try:
|
|
270
|
+
publish_candidate(
|
|
271
|
+
root,
|
|
272
|
+
owner="selftest",
|
|
273
|
+
artifact_id="SELFTEST-UNSAFE",
|
|
274
|
+
outputs={"../escape.md": "unsafe"},
|
|
275
|
+
)
|
|
276
|
+
except ValueError:
|
|
277
|
+
rejected = True
|
|
278
|
+
else:
|
|
279
|
+
rejected = False
|
|
280
|
+
require(rejected, "unsafe publication path was accepted")
|
|
281
|
+
|
|
282
|
+
print(f"{CHECKS} self-tests passed")
|
|
283
|
+
return 0
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
if __name__ == "__main__":
|
|
287
|
+
raise SystemExit(main())
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: short-drama-assets
|
|
3
|
+
description: "从短剧剧本拆解并统筹角色/造型、场景/视图、道具/状态、可选的角色声音方向和跨场连续性。用户说‘拆角色/场景/道具’、‘做资产表/角色表/场景表/道具表’、‘判断复用还是新变体’、‘更新造型/道具状态’、‘给角色定声音/音色/绑定参考音频/做配音选角表’,或拿现成剧本直接做视觉资产准备时使用;本 skill 不写资产图提示词,不生成图片或视频,也不合成音频、不调用任何语音服务。"
|
|
4
|
+
license: MIT
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 短剧资产拆解
|
|
8
|
+
|
|
9
|
+
把剧本文字变成**可追溯、可复用、能接续状态**的生产资产。重点不是数出
|
|
10
|
+
多少人名和名词,而是回答:屏幕上具体需要什么、它与已有资产是不是同一个、
|
|
11
|
+
此刻是哪种造型/视图/状态,以及变化怎样传到下一场和下一集。
|
|
12
|
+
|
|
13
|
+
## 开始前
|
|
14
|
+
|
|
15
|
+
本技能可独立安装和执行。先读取用户明确提供的剧本、既有资产与本任务直接输入;若当前目录
|
|
16
|
+
是 `short-drama` 项目且项目工具可用,可以读取 `status` 并使用其发布生命周期,但缺少 core
|
|
17
|
+
或任何其他技能都不是资产拆解的阻断条件。[阶段契约](references/stage-contract.md) 给出
|
|
18
|
+
本阶段边界、制作形态输入与规则表,无需读取其他技能的文件。
|
|
19
|
+
|
|
20
|
+
## Quick Start
|
|
21
|
+
|
|
22
|
+
先复制 `examples/minimal/` 的原生 Character/Look JSONL,再修改为当前资产。发布前运行:
|
|
23
|
+
|
|
24
|
+
```text
|
|
25
|
+
python3 {技能目录}/scripts/asset_check.py \
|
|
26
|
+
--characters examples/minimal/characters.jsonl \
|
|
27
|
+
--looks examples/minimal/looks.jsonl
|
|
28
|
+
python3 {技能目录}/scripts/selftest.py
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
校验器只检查稳定 ID、引用能否解析到本文件首行 `sources` 声明的快照、创作者接受状态与
|
|
32
|
+
Look → Character 绑定;身份是否可信、差异是否有戏剧依据仍由创作者和 reviewer 判断。
|
|
33
|
+
输入路径不存在于当前目录时,会相对本技能目录解析。
|
|
34
|
+
|
|
35
|
+
## 边界
|
|
36
|
+
|
|
37
|
+
- 资产事实只来自已接受剧本、已有 设定集、连续性和创作者补充;不擅改剧情。
|
|
38
|
+
- 项目存在时读取 `short-drama.json#/creator_authority/{visual_direction,production_profile}`
|
|
39
|
+
中状态为 `accepted` 的视觉方向与制作形态;独立运行时使用创作者直接提供的等价约束,未提供
|
|
40
|
+
就保持 `unset`。形态决定哪些身份锚点在本项目里根本可被表达——以剪影为
|
|
41
|
+
识别通道的形态与以面部结构为识别通道的形态需要不同的锚点集合;若状态为 `unset`,就向
|
|
42
|
+
创作者给出选择,不从对话记忆补造。形态可以改变锚点的表达通道与颗粒度,不得反过来改写
|
|
43
|
+
已接受的身份、地理、持物归属、可读文字政策或故事状态。
|
|
44
|
+
- 只拥有 Character/Look、Location/View、Prop/State、occurrence reconciliation
|
|
45
|
+
和资产状态 delta。知识/信念/目标/关系/情绪等 story-state 可以在连续性
|
|
46
|
+
ledger 中被追踪,但只是带 write/develop source pointer 的投影,不是 assets
|
|
47
|
+
的第二份真相。剧本语义归 `short-drama-write`,镜头手位/走位归
|
|
48
|
+
`short-drama-storyboard`,图片提示词归 `short-drama-image-prompts`。
|
|
49
|
+
- 可直接接收现成剧本,不强迫补创意开发、故事引擎或集纲。
|
|
50
|
+
- 只产出文本/JSONL;不调用图片、视频、音频模型或 provider API。
|
|
51
|
+
- 创作者可读的产物在项目内跟随 `short-drama.json#/language`,独立运行时跟随用户使用的
|
|
52
|
+
语言。本阶段不产生送给生成器的
|
|
53
|
+
提示词正文,与 `#/format/prompt_language` 无关;角色实际说什么语言来自
|
|
54
|
+
`voice_direction.language`,与两者都无关。
|
|
55
|
+
|
|
56
|
+
所有权边界见 [阶段契约](references/stage-contract.md);只在需要时加载
|
|
57
|
+
下列专项参考,不要一次读完所有文件。
|
|
58
|
+
|
|
59
|
+
## 入口判断
|
|
60
|
+
|
|
61
|
+
1. **已有已接受的 `screenplay.md` 与 index**:直接拆解。
|
|
62
|
+
2. **已有资产 设定集,只需补集内出现与状态**:读取旧 ID,先判复用,再提新项。
|
|
63
|
+
3. **只有非 canonical 的中文剧本**:保留原字节到 `输入/`;调用 write owner
|
|
64
|
+
产生最小规范化预览、语义 diff 和未映射片段。创作者接受前不发布
|
|
65
|
+
`screenplay.md`,拒绝也不改变原稿。接受后直接回来拆资产,不虚构 development。
|
|
66
|
+
4. **用户只要局部结果**(如“拆本场道具”):仍执行 occurrence → decision,
|
|
67
|
+
但只呈现所问范围及它依赖的连续性,不用强迫走完整项目流程。
|
|
68
|
+
|
|
69
|
+
缺少 index 时,不凭行号冒充稳定来源;先请 write owner 对剧本建立 block ID。
|
|
70
|
+
|
|
71
|
+
## 每轮的工作单元
|
|
72
|
+
|
|
73
|
+
一轮处理一个明确的来源场次/块范围。整集请求按来源边界拆成若干轮,每轮:
|
|
74
|
+
|
|
75
|
+
1. 只读这个范围的直接输入,拆出它的资产事实,跑本地结构检查;
|
|
76
|
+
2. 落盘这个范围,其余范围保持原样;
|
|
77
|
+
3. 报告已覆盖范围、剩余范围、未决 occurrence 和下一个值得做的范围;
|
|
78
|
+
4. 交还控制权,等创作者的下一次请求。
|
|
79
|
+
|
|
80
|
+
图片提示词、分镜和审查各自是独立的工作单元,由创作者明确请求时开始。
|
|
81
|
+
|
|
82
|
+
## 工作流
|
|
83
|
+
|
|
84
|
+
### 1. 先读事实边界
|
|
85
|
+
|
|
86
|
+
读取本集剧本/index、已有 设定集、上集 outgoing、创作者参考与文本政策,以及已接受的
|
|
87
|
+
视觉方向与制作形态。标记哪个版本已被接受。不要把旧 prompt、旧分镜或文件名当成资产真相。
|
|
88
|
+
|
|
89
|
+
### 2. 逐块提 occurrence,暂不创建资产
|
|
90
|
+
|
|
91
|
+
按 source block 收集出镜或生产必需的角色、地点、道具及其显式状态:造型、伤污、
|
|
92
|
+
所有者、持物手、位置、损坏、内容物、开闭、可读文字、时段、天气、光态和剧情作用。
|
|
93
|
+
每条 occurrence 先保持“剧本怎样写”的颗粒度,再与资产表对齐。
|
|
94
|
+
|
|
95
|
+
- 不猜“她”“那个人”“另一把钥匙”指谁;保留原称谓和证据,状态设为 unresolved。
|
|
96
|
+
- 区分出镜、画外声、屏幕/照片呈现、仅被提及;被提及不等于要做视觉资产。
|
|
97
|
+
- 不把每个名词都建档。只保留影响识别、复用、提示词、镜头或连续性的事实。
|
|
98
|
+
- 未来的 decisions 先用 locator 指位;decision 建立后由它单向引用 occurrence 的
|
|
99
|
+
exact snapshot。
|
|
100
|
+
|
|
101
|
+
方法与反例见 `references/occurrence-extraction.md`,记录形状见
|
|
102
|
+
`assets/occurrences.example.jsonl`。
|
|
103
|
+
|
|
104
|
+
### 3. 再做身份判断
|
|
105
|
+
|
|
106
|
+
把 occurrence 与已有 设定集 逐项比对,只给四种提案:
|
|
107
|
+
|
|
108
|
+
- `reuse`:持续身份和本次所需变体均已存在;
|
|
109
|
+
- `new_variant`:同一身份,新增 Look/View/State;
|
|
110
|
+
- `new_asset`:持续身份、空间地理或物体功能/形制确实不同;
|
|
111
|
+
- `unresolved`:证据不足或多个候选都成立,等待创作者选择。
|
|
112
|
+
|
|
113
|
+
先问“同一个东西什么没变”,再问“这次什么变了、为何变、何时有效”。服装、伤势、
|
|
114
|
+
湿污、灯光、道具开合通常不是新身份;相机角度和瞬时姿势通常连新变体都不是。
|
|
115
|
+
不要为了少建记录而合并真正不同的资产。详见
|
|
116
|
+
`references/identity-vs-variant.md` 与 `assets/decisions.example.jsonl`。
|
|
117
|
+
|
|
118
|
+
### 4. 写最小可识别 设定集
|
|
119
|
+
|
|
120
|
+
按类别沉淀,身份锚点与临时状态绝不混写:
|
|
121
|
+
|
|
122
|
+
- Character / Look:`references/character-and-look.md`;例见
|
|
123
|
+
`assets/character-look.example.jsonl`
|
|
124
|
+
- 声音方向(可选,项目需要跨集保持声音时):`references/voice-direction.md`;
|
|
125
|
+
音色载体是参考音频;该文件同时说明 `设定集/voice-casting.md` 怎么渲染。只在处理声音时加载
|
|
126
|
+
- Location / View:`references/location-and-view.md`;例见
|
|
127
|
+
`assets/location-view.example.jsonl`
|
|
128
|
+
- Prop / State:`references/prop-and-state.md`;例见
|
|
129
|
+
`assets/prop-state.example.jsonl`
|
|
130
|
+
|
|
131
|
+
每个新变体记录 base、变化、原因与有效范围。只写能帮助再次认出、复用、提示词
|
|
132
|
+
编写或连续性检查的事实;不堆砌“高级、精致、电影感”等泛化修饰。
|
|
133
|
+
|
|
134
|
+
### 5. 写变化,不复制整本 设定集
|
|
135
|
+
|
|
136
|
+
为交接所需的资产状态变化记录 before、after、剧本原因、开始/结束边界和受影响 binding。
|
|
137
|
+
重点检查造型/伤势、持物/所有权、道具状态、地点时段/天气/光态以及跨集 outgoing。
|
|
138
|
+
若为审查需要把知识或关系状态放进 ledger,只保存指向权威字段的引用(`src` 加
|
|
139
|
+
`record_id`、`field`)及必要投影;修订仍路由到 develop/write owner。
|
|
140
|
+
镜头内部姿势、视线、左右手和站位由 storyboard 边界拥有;资产记录只引用,不抢写。
|
|
141
|
+
|
|
142
|
+
详见 `references/continuity-delta.md` 与 `assets/continuity.example.jsonl`。
|
|
143
|
+
|
|
144
|
+
### 6. 给创作者看“决定”,而非只给清单
|
|
145
|
+
|
|
146
|
+
提交接受预览,按以下顺序呈现:
|
|
147
|
+
|
|
148
|
+
1. 建议复用(为什么是同一个);
|
|
149
|
+
2. 建议新增变体(没变什么、变了什么、原因与有效期);
|
|
150
|
+
3. 建议新增身份(区分它的持久证据);
|
|
151
|
+
4. 未决项(原文证据、候选、每个选择的下游影响);
|
|
152
|
+
5. 连续性变化与需带入下一集的 outgoing。
|
|
153
|
+
|
|
154
|
+
创作者可逐项接受、改名、合并、拆分或暂缓。**creator acceptance 是独立事实**:
|
|
155
|
+
抽取完成、结构校验通过、review 通过都不能替代创作者接受。只发布被接受的身份和
|
|
156
|
+
变体;任何 unresolved 都不得编译到图片提示词或分镜 binding。
|
|
157
|
+
若用户要求一次查看全链而中间没有接受回合,可生成待确认的候选预览;不得伪造创作者决定,且不得交付。
|
|
158
|
+
|
|
159
|
+
### 7. 发布与修订
|
|
160
|
+
|
|
161
|
+
发布至 `设定集/*.jsonl` 及 `剧集/<EP>/assets/{occurrences,decisions,continuity}.jsonl`。
|
|
162
|
+
项目记录了 `voice_direction` 时,`设定集/voice-casting.md` 由已接受记录重新渲染——
|
|
163
|
+
它是派生文本,手改不会改变任何身份,下一次渲染就会被覆盖。参考音频本身留在 `输入/`。
|
|
164
|
+
每个文件在首行 `sources` 里声明一次它引用到的上游快照,引用本身写 `src` 加稳定 ID/field,
|
|
165
|
+
形状见[阶段契约](references/stage-contract.md#跨产物引用)。资产修改后只列出直接读取该
|
|
166
|
+
ID/variant 的提示词、镜头和 review,由相应 owner 按需刷新;不要重写无关资产或 screenplay。
|
|
167
|
+
|
|
168
|
+
## 规则分类与阻断
|
|
169
|
+
|
|
170
|
+
- `structural_invariant`:occurrence 必有已声明的来源快照与 block ID;decision 必属四类;
|
|
171
|
+
variant 有 base/cause/validity;binding 必须解析到已接受 ID。可机械阻断。
|
|
172
|
+
- `reviewed_invariant`:不可猜含混指代;不可把临时状态混入身份;delta 的剧情原因
|
|
173
|
+
必须由证据支持。reviewer 引用证据判定,owner 负责修改。
|
|
174
|
+
- `craft_default`:身份不变时优先复用/变体;只跟踪下游有用事实。创作者可说明覆盖。
|
|
175
|
+
- `taste_option`:群演建为个体还是群组、同址空间拆分颗粒度、蒙太奇式跳变方式,
|
|
176
|
+
由制作策略选择,不单独阻断。
|
|
177
|
+
|
|
178
|
+
## 完成条件
|
|
179
|
+
|
|
180
|
+
完成当前有界范围前使用 `references/asset-review-checklist.md`:来源和引用可解析;每个
|
|
181
|
+
occurrence 有明确 decision;未决项保持未决;身份/变体边界可信;连续性能够从
|
|
182
|
+
incoming 走到 outgoing;创作者已经接受本次变更。本 skill 只修订自己拥有的资产事实;
|
|
183
|
+
需要 delivery verdict 时另行请求 `short-drama-review`,不得从这里自动启动。
|
|
184
|
+
|
|
185
|
+
创作者要求实际合成声音时,把已接受的声音身份、参考音频和录音表交给
|
|
186
|
+
`$short-drama-produce`。该技能会先展示精确任务预览并等待创作者明确确认;本技能不调用
|
|
187
|
+
语音服务,也不把资产接受状态当作生产授权。
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
{"record_type":"sources","schema_version":"1.0.0","sources":{"guhe-audition-02":{"owner":"creator","artifact":"输入/voice-refs/guhe-audition-02.wav"},"reference-observations":{"owner":"creator","artifact":"创作者决策/reference-observations.jsonl"},"screenplay-index":{"owner":"short-drama-write","artifact":"剧集/EP003/screenplay-index.jsonl"},"cd-char-001":{"owner":"creator","artifact":"创作者决策/cd-char-001.json"},"characters":{"owner":"short-drama-assets","artifact":"设定集/characters.jsonl"},"cd-look-001":{"owner":"creator","artifact":"创作者决策/cd-look-001.json"}}}
|
|
2
|
+
{"example_only":true,"destination":"设定集/characters.jsonl","schema_version":"1.0.0-draft","record_type":"character","character_id":"CHAR-GUHE","display_name":"顾禾","aliases":["小顾"],"identity_anchors":["窄长脸","左眉尾短缺口","自然卷黑发","肩背略前倾"],"persistent_performance_facts":["说话前常先观察对方手里的物件"],"voice_direction":{"language":"zh-CN","reference":{"slot_id":"VREF-GUHE-01","artifact_ref":{"src":"guhe-audition-02"},"role":"timbre","may_control":["音色质感","年龄与体量印象"],"must_not_control":["这条试音稿里的克制情绪","录音棚的混响与话筒距离","背景底噪"],"admission_status":"creator_described","reference_observation_ref":{"src":"reference-observations","record_id":"OBS-VREF-GUHE-01"},"unresolved_risks":[]},"selection_criteria":[{"kind":"register","text":"中低音区,比同剧其他成年男性低半档","counter_example":"低到需要压喉才发得出,就过头了"},{"kind":"rhythm","text":"句尾常收住而不拖长","counter_example":"每句都硬切断,听起来像念稿"}],"distinction":{"nearest_character_id":"CHAR-LINSHU","distinguishing_trait":"顾禾句尾收住;林舒句尾常带一段下滑的余音"},"pronunciation_notes":[{"term":"顾禾","accepted_reading":"Gù Hé"}],"not_voice_identity":["本场因淋雨造成的短暂气息不稳","某句台词的临时音量"]},"not_identity":["本集橙色雨衣","右肩湿痕","瞬时低头"],"source_refs":[{"src":"screenplay-index","record_id":"BLK-EP003-SC004-A01"}],"creator_acceptance":{"status":"accepted","decision_ref":{"src":"cd-char-001","record_id":"CD-CHAR-001"}}}
|
|
3
|
+
{"example_only":true,"destination":"设定集/looks.jsonl","schema_version":"1.0.0-draft","record_type":"look","look_id":"LOOK-GUHE-RAIN","character_ref":{"src":"characters","record_id":"CHAR-GUHE"},"base_look_id":"LOOK-GUHE-WORK","differences":{"wardrobe_layers":["工作装外加橙色旧雨衣"],"hair_styling":["低束,兜帽放下"],"makeup":[],"injury":[],"weathering":[]},"cause_ref":{"src":"screenplay-index","record_id":"BLK-EP003-SC004-A01"},"validity":{"from":"EP003/SC004/BLK-EP003-SC004-A01","until":"EP003/SC006/BLK-EP003-SC006-A03"},"creator_acceptance":{"status":"accepted","decision_ref":{"src":"cd-look-001","record_id":"CD-LOOK-001"}}}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
{"record_type":"sources","schema_version":"1.0.0","sources":{"props":{"owner":"short-drama-assets","artifact":"设定集/props.jsonl"},"prop-states":{"owner":"short-drama-assets","artifact":"设定集/prop-states.jsonl"},"screenplay-index":{"owner":"short-drama-write","artifact":"剧集/EP003/screenplay-index.jsonl"},"locations":{"owner":"short-drama-assets","artifact":"设定集/locations.jsonl"}}}
|
|
2
|
+
{"example_only":true,"schema_version":"1.0.0-draft","delta_id":"DELTA-TIN-OPEN","episode_id":"EP003","scene_id":"SC004","subject_ref":{"src":"props","record_id":"PROP-TIN-CASE"},"state_field":"condition.open","before":{"value":"closed","state_ref":{"src":"prop-states","record_id":"PSTATE-TIN-CLOSED-BADGE-IN"}},"after":{"value":"open","proposed_state_id":"PSTATE-TIN-OPEN-EMPTY"},"cause_ref":{"src":"screenplay-index","record_id":"BLK-EP003-SC004-A03"},"effective_range":{"from":"EP003/SC004/BLK-EP003-SC004-A03","until":"open_ended"},"reconciliation":{"next_linked_start":"EP003/SC005/start","status":"must_match_or_revise"},"creator_acceptance":{"status":"proposed","decision_ref":null},"affected_binding_refs":[{"src":"props","record_id":"PROP-TIN-CASE"}],"affected_binding_locators":[{"owner":"short-drama-storyboard","artifact":"剧集/EP003/storyboard/shots.jsonl","selector":{"asset_or_variant_ids":["PROP-TIN-CASE","PROP-CERAMIC-BADGE-017"]},"status":"future_until_shots_exist"}],"destination":"剧集/EP003/assets/continuity.jsonl"}
|
|
3
|
+
{"example_only":true,"schema_version":"1.0.0-draft","delta_id":"DELTA-BADGE-TRANSFER","episode_id":"EP003","scene_id":"SC004","subject_ref":{"src":"props","record_id":"PROP-CERAMIC-BADGE-017"},"state_field":"custody","before":{"owner":"CHAR-GUHE","holder":"CHAR-GUHE","hand":"right"},"after":{"owner":"CHAR-WEISHU","holder":"CHAR-WEISHU","hand":"right"},"cause_ref":{"src":"screenplay-index","record_id":"BLK-EP003-SC004-A04"},"effective_range":{"from":"EP003/SC004/BLK-EP003-SC004-A04","until":"open_ended"},"reconciliation":{"next_linked_start":"EP003/SC005/start","status":"must_match_or_revise"},"creator_acceptance":{"status":"proposed","decision_ref":null},"affected_binding_refs":[{"src":"props","record_id":"PROP-CERAMIC-BADGE-017"}],"affected_binding_locators":[{"owner":"short-drama-storyboard","artifact":"剧集/EP003/storyboard/shots.jsonl","selector":{"asset_or_variant_ids":["PROP-CERAMIC-BADGE-017","CHAR-GUHE","CHAR-WEISHU"]},"status":"future_until_shots_exist"}],"destination":"剧集/EP003/assets/continuity.jsonl"}
|
|
4
|
+
{"example_only":true,"schema_version":"1.0.0-draft","delta_id":"DELTA-OFFICE-BLACKOUT","episode_id":"EP003","scene_id":"SC004","subject_ref":{"src":"locations","record_id":"LOC-FERRY-OFFICE"},"state_field":"active_view","before":{"value":"VIEW-FERRY-OFFICE-NORTH-NIGHT"},"after":{"value":"VIEW-FERRY-OFFICE-NORTH-BLACKOUT"},"cause_ref":{"src":"screenplay-index","record_id":"BLK-EP003-SC004-A04"},"effective_range":{"from":"EP003/SC004/BLK-EP003-SC004-A04","until":"open_ended"},"reconciliation":{"next_linked_start":"EP003/SC005/start","status":"must_match_or_revise"},"creator_acceptance":{"status":"proposed","decision_ref":null},"affected_binding_refs":[{"src":"locations","record_id":"LOC-FERRY-OFFICE"}],"affected_binding_locators":[{"owner":"short-drama-storyboard","artifact":"剧集/EP003/storyboard/shots.jsonl","selector":{"asset_or_variant_ids":["LOC-FERRY-OFFICE","VIEW-FERRY-OFFICE-NORTH-BLACKOUT"]},"status":"future_until_shots_exist"}],"destination":"剧集/EP003/assets/continuity.jsonl"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
{"record_type":"sources","schema_version":"1.0.0","sources":{"occurrences":{"owner":"short-drama-assets","artifact":"剧集/EP003/assets/occurrences.jsonl"},"characters":{"owner":"short-drama-assets","artifact":"设定集/characters.jsonl"},"screenplay-index":{"owner":"short-drama-write","artifact":"剧集/EP003/screenplay-index.jsonl"},"location-views":{"owner":"short-drama-assets","artifact":"设定集/location-views.jsonl"}}}
|
|
2
|
+
{"example_only":true,"schema_version":"1.0.0-draft","decision_id":"DEC-OCC-001","occurrence_refs":[{"src":"occurrences","record_id":"OCC-EP003-SC004-001","authority":"candidate"}],"decision_kind":"new_variant","asset_kind":"character","proposed_binding":{"identity_id":"CHAR-GUHE","variant_id":"LOOK-GUHE-RAIN"},"base_ref":{"src":"characters","record_id":"CHAR-GUHE"},"persistent_evidence":["剧本沿用顾禾的身份和关系","已有永久识别锚点未改变"],"differences":["在工作装外加橙色旧雨衣","兜帽放下"],"cause_ref":{"src":"screenplay-index","record_id":"BLK-EP003-SC004-A01"},"validity":{"from":"EP003/SC004/BLK-EP003-SC004-A01","until":"EP003/SC006/BLK-EP003-SC006-A03"},"rationale":"人物持续身份不变;跨场服装需要精确绑定","creator_acceptance":{"status":"proposed","decision_ref":null},"downstream_impact":["character_image_prompt","affected_storyboard_bindings"],"destination":"剧集/EP003/assets/decisions.jsonl"}
|
|
3
|
+
{"example_only":true,"schema_version":"1.0.0-draft","decision_id":"DEC-OCC-002","occurrence_refs":[{"src":"occurrences","record_id":"OCC-EP003-SC004-002","authority":"candidate"}],"decision_kind":"reuse","asset_kind":"location","proposed_binding":{"identity_id":"LOC-FERRY-OFFICE","variant_id":"VIEW-FERRY-OFFICE-NORTH-NIGHT"},"base_ref":{"src":"location-views","record_id":"VIEW-FERRY-OFFICE-NORTH-NIGHT"},"persistent_evidence":["北门、河窗和柜台的地理与已有 View 一致"],"differences":[],"cause_ref":null,"validity":{"from":"EP003/SC004","until":"EP003/SC004/BLK-EP003-SC004-A04"},"rationale":"同一空间、同一可复用方向与正常夜间光态","creator_acceptance":{"status":"proposed","decision_ref":null},"downstream_impact":["affected_storyboard_bindings"],"destination":"剧集/EP003/assets/decisions.jsonl"}
|
|
4
|
+
{"example_only":true,"schema_version":"1.0.0-draft","decision_id":"DEC-OCC-003","occurrence_refs":[{"src":"occurrences","record_id":"OCC-EP003-SC004-003","authority":"candidate"}],"decision_kind":"new_asset","asset_kind":"prop","proposed_binding":{"identity_id":"PROP-TIN-CASE","variant_id":"PSTATE-TIN-CLOSED-BADGE-IN"},"base_ref":null,"persistent_evidence":["扁长黑铁匣","铰链盖","右前角永久凹陷","用于保存号牌"],"differences":[],"cause_ref":{"src":"screenplay-index","record_id":"BLK-EP003-SC004-A02"},"validity":{"from":"EP003/SC004","until":"open_ended"},"rationale":"现有 设定集 无同时匹配形制、唯一凹陷和叙事功能的 Prop","creator_acceptance":{"status":"proposed","decision_ref":null},"downstream_impact":["prop_image_prompt","affected_storyboard_bindings","continuity"],"destination":"剧集/EP003/assets/decisions.jsonl"}
|
|
5
|
+
{"example_only":true,"schema_version":"1.0.0-draft","decision_id":"DEC-OCC-004","occurrence_refs":[{"src":"occurrences","record_id":"OCC-EP003-SC004-004","authority":"candidate"}],"decision_kind":"unresolved","asset_kind":"character","proposed_binding":null,"candidate_bindings":[{"identity_id":"CHAR-GUHE","support":"此前顾禾靠近北门","conflict":"最近动作主语已切换"},{"identity_id":"CHAR-WEISHU","support":"最近一句台词属于魏叔","conflict":"未写他走向北门"}],"persistent_evidence":[],"differences":[],"cause_ref":null,"validity":null,"rationale":"代词没有唯一先行项;不得以距离或最近姓名猜测","creator_question":"从北门离开的‘她’具体是谁?若为新人物,请补可识别称谓。","creator_acceptance":{"status":"pending_choice","decision_ref":null},"downstream_impact":["blocks_character_binding","blocks_dependent_storyboard"],"destination":"剧集/EP003/assets/decisions.jsonl"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
{"record_type":"sources","schema_version":"1.0.0","sources":{"screenplay-index":{"owner":"short-drama-write","artifact":"剧集/EP003/screenplay-index.jsonl"},"cd-loc-001":{"owner":"creator","artifact":"创作者决策/cd-loc-001.json"},"locations":{"owner":"short-drama-assets","artifact":"设定集/locations.jsonl"},"cd-view-001":{"owner":"creator","artifact":"创作者决策/cd-view-001.json"}}}
|
|
2
|
+
{"example_only":true,"destination":"设定集/locations.jsonl","schema_version":"1.0.0-draft","record_type":"location","location_id":"LOC-FERRY-OFFICE","display_name":"旧渡站值班室","spatial_identity":{"shape":"狭长室内","zones":["柜台内工作区","柜台外等候区"],"entrances":[{"id":"north_door","connects_to":"LOC-FERRY-HALL"}],"fixed_anchors":["东侧河窗","西侧整面旧柜台","柜台后墙配电箱"],"materials":["磨损木柜台","灰白粉刷墙","旧金属窗框"]},"not_identity":["夜间","停电","顾禾站在北门","低机位"],"source_refs":[{"src":"screenplay-index","record_id":"BLK-EP003-SC004-H01"}],"creator_acceptance":{"status":"accepted","decision_ref":{"src":"cd-loc-001","record_id":"CD-LOC-001"}}}
|
|
3
|
+
{"example_only":true,"destination":"设定集/location-views.jsonl","schema_version":"1.0.0-draft","record_type":"location_view","view_id":"VIEW-FERRY-OFFICE-NORTH-BLACKOUT","location_ref":{"src":"locations","record_id":"LOC-FERRY-OFFICE"},"base_view_id":"VIEW-FERRY-OFFICE-NORTH-NIGHT","orientation":{"from_zone":"柜台内工作区","toward":"北门","visible_fixed_anchors":["北门","东侧河窗","柜台后墙配电箱"]},"state_differences":{"dressing":[],"time":"night","weather":"heavy_rain_outside","light":["顶灯熄灭","河窗冷光保留"]},"cause_ref":{"src":"screenplay-index","record_id":"BLK-EP003-SC004-A04"},"validity":{"from":"EP003/SC004/BLK-EP003-SC004-A04","until":"open_ended"},"creator_acceptance":{"status":"accepted","decision_ref":{"src":"cd-view-001","record_id":"CD-VIEW-001"}}}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
{"record_type":"sources","schema_version":"1.0.0","sources":{"screenplay-index":{"owner":"short-drama-write","artifact":"剧集/EP003/screenplay-index.jsonl"}}}
|
|
2
|
+
{"example_only":true,"schema_version":"1.0.0-draft","occurrence_id":"OCC-EP003-SC004-001","episode_id":"EP003","scene_id":"SC004","asset_kind":"character","surface_form":"顾禾","presence":"on_screen","source_ref":{"src":"screenplay-index","record_id":"BLK-EP003-SC004-A01"},"source_blocks":["BLK-EP003-SC004-A01"],"extracted_projection":{"role":"derived_projection","visible_facts":["外穿橙色旧雨衣","兜帽放下"],"explicit_state":{"look_hint":"rain_shell","wetness":"dry_at_entry"}},"story_function":["enters_location","carries_case"],"production_disposition":"visual_asset_required","proposed_binding":{"character_id":"CHAR-GUHE","look_id":"LOOK-GUHE-RAIN"},"reconciliation":{"role":"derived_annotation","decision_locator":{"owner":"short-drama-assets","artifact":"剧集/EP003/assets/decisions.jsonl","selector":{"occurrence_id":"OCC-EP003-SC004-001"},"status":"future_until_decision_exists"},"status":"proposed"},"continuity_delta_ref":null,"destination":"剧集/EP003/assets/occurrences.jsonl"}
|
|
3
|
+
{"example_only":true,"schema_version":"1.0.0-draft","occurrence_id":"OCC-EP003-SC004-002","episode_id":"EP003","scene_id":"SC004","asset_kind":"location","surface_form":"旧渡站值班室","presence":"on_screen","source_ref":{"src":"screenplay-index","record_id":"BLK-EP003-SC004-H01"},"source_blocks":["BLK-EP003-SC004-H01","BLK-EP003-SC004-A01"],"extracted_projection":{"role":"derived_projection","visible_facts":["北门通向候船厅","东侧河窗","夜间顶灯亮"],"explicit_state":{"time":"night","light":"ceiling_light_on"}},"story_function":["action_space","later_blackout_setup"],"production_disposition":"visual_asset_required","proposed_binding":{"location_id":"LOC-FERRY-OFFICE","view_id":"VIEW-FERRY-OFFICE-NORTH-NIGHT"},"reconciliation":{"role":"derived_annotation","decision_locator":{"owner":"short-drama-assets","artifact":"剧集/EP003/assets/decisions.jsonl","selector":{"occurrence_id":"OCC-EP003-SC004-002"},"status":"future_until_decision_exists"},"status":"proposed"},"continuity_delta_ref":null,"destination":"剧集/EP003/assets/occurrences.jsonl"}
|
|
4
|
+
{"example_only":true,"schema_version":"1.0.0-draft","occurrence_id":"OCC-EP003-SC004-003","episode_id":"EP003","scene_id":"SC004","asset_kind":"prop","surface_form":"铁皮匣","presence":"on_screen","source_ref":{"src":"screenplay-index","record_id":"BLK-EP003-SC004-A02"},"source_blocks":["BLK-EP003-SC004-A02"],"extracted_projection":{"role":"derived_projection","visible_facts":["顾禾将匣放上柜台","匣起初闭合"],"explicit_state":{"condition":"closed","holder":"CHAR-GUHE","location":"counter"}},"story_function":["contains_reveal_object","supports_readable_text_reveal"],"production_disposition":"hero_prop_required","proposed_binding":{"prop_id":"PROP-TIN-CASE","state_id":"PSTATE-TIN-CLOSED-BADGE-IN"},"reconciliation":{"role":"derived_annotation","decision_locator":{"owner":"short-drama-assets","artifact":"剧集/EP003/assets/decisions.jsonl","selector":{"occurrence_id":"OCC-EP003-SC004-003"},"status":"future_until_decision_exists"},"status":"proposed"},"destination":"剧集/EP003/assets/occurrences.jsonl","continuity_delta_locator":{"owner":"short-drama-assets","artifact":"剧集/EP003/assets/continuity.jsonl","selector":{"source_occurrence_id":"OCC-EP003-SC004-003"},"status":"future_until_delta_exists"}}
|
|
5
|
+
{"example_only":true,"schema_version":"1.0.0-draft","occurrence_id":"OCC-EP003-SC004-004","episode_id":"EP003","scene_id":"SC004","asset_kind":"character","surface_form":"她","presence":"on_screen","source_ref":{"src":"screenplay-index","record_id":"BLK-EP003-SC004-A05"},"source_blocks":["BLK-EP003-SC004-A05"],"extracted_projection":{"role":"derived_projection","visible_facts":["从北门离开"],"explicit_state":{}},"story_function":["exits_with_unknown_identity"],"production_disposition":"identity_resolution_required","proposed_binding":null,"candidate_bindings":["CHAR-GUHE","CHAR-WEISHU"],"ambiguity":"block 内无唯一先行项,两个已出场角色均可能","reconciliation":{"role":"derived_annotation","decision_locator":{"owner":"short-drama-assets","artifact":"剧集/EP003/assets/decisions.jsonl","selector":{"occurrence_id":"OCC-EP003-SC004-004"},"status":"future_until_decision_exists"},"status":"unresolved"},"continuity_delta_ref":null,"destination":"剧集/EP003/assets/occurrences.jsonl"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
{"record_type":"sources","schema_version":"1.0.0","sources":{"screenplay-index":{"owner":"short-drama-write","artifact":"剧集/EP003/screenplay-index.jsonl"},"cd-prop-001":{"owner":"creator","artifact":"创作者决策/cd-prop-001.json"},"props":{"owner":"short-drama-assets","artifact":"设定集/props.jsonl"},"cd-pstate-001":{"owner":"creator","artifact":"创作者决策/cd-pstate-001.json"}}}
|
|
2
|
+
{"example_only":true,"destination":"设定集/props.jsonl","schema_version":"1.0.0-draft","record_type":"prop","prop_id":"PROP-TIN-CASE","display_name":"黑铁皮匣","identity_anchors":{"scale":"手掌至小臂长度的扁长匣","form":"铰链盖,长方体,右前角凹陷","materials":["黑色旧铁皮"],"function":"保存渡站号牌","permanent_marks":["右前角永久凹陷"]},"text_policy":{"mode":"exact_readable","text":"潮位 7","placement":"匣盖内侧","source_ref":{"src":"screenplay-index","record_id":"BLK-EP003-SC004-A03"}},"source_refs":[{"src":"screenplay-index","record_id":"BLK-EP003-SC004-A02"}],"creator_acceptance":{"status":"accepted","decision_ref":{"src":"cd-prop-001","record_id":"CD-PROP-001"}}}
|
|
3
|
+
{"example_only":true,"destination":"设定集/prop-states.jsonl","schema_version":"1.0.0-draft","record_type":"prop_state","state_id":"PSTATE-TIN-CLOSED-BADGE-IN","prop_ref":{"src":"props","record_id":"PROP-TIN-CASE"},"condition":{"open":"closed","damage":"right_front_dent_only","powered":"not_applicable"},"custody":{"owner":"CHAR-GUHE","holder":"CHAR-GUHE","hand":null,"location":"under_ferry_office_counter"},"contents":["PROP-CERAMIC-BADGE-017"],"text_visibility":"hidden_while_closed","validity":{"from":"EP003/SC004/start","until":"EP003/SC004/BLK-EP003-SC004-A03"},"cause_ref":{"src":"screenplay-index","record_id":"BLK-EP003-SC004-A02"},"creator_acceptance":{"status":"accepted","decision_ref":{"src":"cd-pstate-001","record_id":"CD-PSTATE-001"}}}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
{"record_type":"sources","schema_version":"1.0.0","sources":{"input-script":{"owner":"creator","artifact":"input-script.md"},"decisions":{"owner":"creator","artifact":"decisions.json"}}}
|
|
2
|
+
{"schema_version":"1.0.0-draft","record_type":"character","character_id":"CHAR-LIN","display_name":"林岚","aliases":[],"identity_anchors":["齐下颌黑发","左眉尾浅疤","站立时重心偏右"],"persistent_performance_facts":["回答前先看向出口"],"not_identity":["本场湿外套"],"source_refs":[{"src":"input-script","record_id":"SC001-A01"}],"creator_acceptance":{"status":"accepted","decision_ref":{"src":"decisions","record_id":"CD-CHAR-LIN"}}}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
{"record_type":"sources","schema_version":"1.0.0","sources":{"characters":{"owner":"short-drama-assets","artifact":"characters.jsonl"},"input-script":{"owner":"creator","artifact":"input-script.md"},"decisions":{"owner":"creator","artifact":"decisions.json"}}}
|
|
2
|
+
{"schema_version":"1.0.0-draft","record_type":"look","look_id":"LOOK-LIN-RAIN","character_ref":{"src":"characters","record_id":"CHAR-LIN"},"base_look_id":"LOOK-LIN-BASE","differences":{"wardrobe_layers":["深蓝旧雨衣"],"weathering":["肩部雨水加深"]},"cause_ref":{"src":"input-script","record_id":"SC001-A01"},"validity":{"from":"SC001/A01","until":"SC002/end"},"creator_acceptance":{"status":"accepted","decision_ref":{"src":"decisions","record_id":"CD-LOOK-LIN-RAIN"}}}
|