@oh-story/dsh 0.1.8 → 0.1.9
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 +11 -11
- package/lib/client.js +35 -14
- package/lib/client.js.map +2 -2
- package/lib/drama/manifest.json +165 -69
- package/lib/drama/skills/short-drama/SKILL.md +5 -1
- package/lib/drama/skills/short-drama/scripts/creator_markdown_check.py +126 -9
- package/lib/drama/skills/short-drama/scripts/project_tool.py +11 -0
- package/lib/drama/skills/short-drama-assets/references/character-and-look.md +18 -0
- package/lib/drama/skills/short-drama-assets/references/continuity-lock.md +10 -1
- package/lib/drama/skills/short-drama-edit/SKILL.md +148 -0
- package/lib/drama/skills/short-drama-edit/agents/openai.yaml +4 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/README.md +60 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/package.json +15 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/remotion.config.ts +6 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/src/Root.tsx +26 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/src/Subtitles.tsx +88 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/src/font.ts +46 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/src/index.ts +4 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/src/schema.ts +32 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/tsconfig.json +13 -0
- package/lib/drama/skills/short-drama-edit/assets//345/211/252/350/276/221/345/215/225.md +43 -0
- package/lib/drama/skills/short-drama-edit/references/cut-craft.md +81 -0
- package/lib/drama/skills/short-drama-edit/references/delivery-verify.md +58 -0
- package/lib/drama/skills/short-drama-edit/references/generated-footage.md +96 -0
- package/lib/drama/skills/short-drama-edit/references/sound-and-subtitles.md +113 -0
- package/lib/drama/skills/short-drama-edit/references/stage-contract.md +55 -0
- package/lib/drama/skills/short-drama-edit/scripts/edit_tool.py +1041 -0
- package/lib/drama/skills/short-drama-edit/scripts/selftest.py +456 -0
- package/lib/drama/skills/short-drama-image-prompts/assets/image-prompts.md +5 -0
- package/lib/drama/skills/short-drama-image-prompts/assets/lookdev-prompts.md +3 -0
- package/lib/drama/skills/short-drama-novel-analyze/references/aggregation-and-entities.md +2 -2
- package/lib/drama/skills/short-drama-novel-analyze/references/chapter-extraction.md +4 -1
- package/lib/drama/skills/short-drama-produce/SKILL.md +24 -3
- package/lib/drama/skills/short-drama-produce/references/adapter-contract.md +28 -0
- package/lib/drama/skills/short-drama-produce/references/providers/minimax-h3-video.md +24 -5
- package/lib/drama/skills/short-drama-produce/references/providers/seedance.md +7 -0
- package/lib/drama/skills/short-drama-produce/scripts/fixture_adapter.py +18 -1
- package/lib/drama/skills/short-drama-produce/scripts/production_tool.py +181 -2
- package/lib/drama/skills/short-drama-produce/scripts/provider_adapters.py +57 -2
- package/lib/drama/skills/short-drama-review/SKILL.md +3 -0
- package/lib/drama/skills/short-drama-review/references/production-quality-gates.md +20 -0
- package/lib/drama/skills/short-drama-review/references/rubric-visual-motion.md +36 -0
- package/lib/drama/skills/short-drama-storyboard/SKILL.md +7 -0
- package/lib/drama/skills/short-drama-storyboard/assets/keyframe-prompts.md +4 -0
- package/lib/drama/skills/short-drama-storyboard/references/shot-craft.md +39 -0
- package/lib/drama/skills/short-drama-storyboard/references/stage-contract.md +2 -0
- package/lib/drama/skills/short-drama-video-prompts/SKILL.md +7 -1
- package/lib/drama/skills/short-drama-video-prompts/references/minimax-h3.md +101 -6
- package/lib/drama/skills/short-drama-video-prompts/references/motion-recipe.md +7 -1
- package/lib/drama/skills/short-drama-video-prompts/references/performance-action-timing.md +35 -0
- package/lib/drama/skills/short-drama-video-prompts/references/production-prompt-grammar.md +3 -1
- package/lib/drama/skills/short-drama-video-prompts/references/seedance-2.0.md +13 -3
- package/lib/drama/skills/short-drama-video-prompts/references/seedance-2.5.md +35 -4
- package/lib/drama/skills/short-drama-video-prompts/references/stage-contract.md +1 -1
- package/lib/drama/skills/short-drama-write/SKILL.md +13 -2
- package/lib/drama/skills/short-drama-write/references/screenplay-format.md +6 -0
- package/lib/drama/skills/short-drama-write/references/stage-contract.md +1 -0
- package/lib/index.js +4 -2
- package/lib/index.js.map +2 -2
- package/lib/novel-to-game/VERSION +1 -1
- package/lib/novel-to-game/manifest.json +28 -28
- package/lib/novel-to-game/skills/game-art-direction/SKILL.md +6 -27
- package/lib/novel-to-game/skills/game-build/SKILL.md +12 -29
- package/lib/novel-to-game/skills/game-concept/SKILL.md +10 -26
- package/lib/novel-to-game/skills/game-qa/SKILL.md +5 -15
- package/lib/novel-to-game/skills/game-qa/references/test-design-method.md +1 -1
- package/lib/novel-to-game/skills/game-world-design/SKILL.md +19 -28
- package/lib/novel-to-game/skills/game-world-design/references/dialogue-design-method.md +1 -2
- package/lib/novel-to-game/skills/novel-game-analyze/SKILL.md +6 -9
- package/lib/novel-to-game/skills/novel-to-game/SKILL.md +6 -11
- package/lib/novel-to-game/skills/novel-to-game/references/intake-benchmark-reference.md +0 -4
- package/lib/novel-to-game/skills/novel-to-game/references/intake-method.md +1 -3
- package/lib/novel-to-game/skills/novel-to-game/references/pipeline-contract.md +3 -5
- package/lib/oh-story/manifest.json +292 -172
- package/lib/oh-story/roles/character-designer.md +1 -1
- package/lib/oh-story/roles/narrative-writer.md +56 -242
- package/lib/oh-story/roles/story-architect.md +1 -1
- package/lib/oh-story/skills/story/SKILL.md +1 -1
- package/lib/oh-story/skills/story/VERSION +1 -1
- package/lib/oh-story/skills/story/references/author-memory.md +10 -8
- package/lib/oh-story/skills/story-deslop/SKILL.md +20 -182
- package/lib/oh-story/skills/story-deslop/references/anti-ai-writing.md +19 -47
- package/lib/oh-story/skills/story-deslop/references/author-memory.md +10 -8
- package/lib/oh-story/skills/story-deslop/references/banned-words.md +3 -1
- package/lib/oh-story/skills/story-deslop/references/deslop-gates.md +154 -0
- package/lib/oh-story/skills/story-deslop/references/style-resolution.md +27 -0
- package/lib/oh-story/skills/story-deslop/scripts/check-ai-patterns.js +6 -1
- package/lib/oh-story/skills/story-deslop/scripts/check-degeneration.js +39 -20
- package/lib/oh-story/skills/story-deslop/scripts/normalize-punctuation.js +10 -5
- package/lib/oh-story/skills/story-deslop/scripts/style-whitelist.js +39 -0
- package/lib/oh-story/skills/story-import/SKILL.md +2 -2
- package/lib/oh-story/skills/story-import/references/format-and-structure.md +2 -2
- package/lib/oh-story/skills/story-import/references/tracking-initialization.md +31 -0
- package/lib/oh-story/skills/story-import/references/tracking-transaction.md +2 -29
- package/lib/oh-story/skills/story-import/scripts/check-outline-contract.js +176 -12
- package/lib/oh-story/skills/story-long-analyze/SKILL.md +1 -1
- package/lib/oh-story/skills/story-long-write/SKILL.md +20 -193
- package/lib/oh-story/skills/story-long-write/references/anti-ai-writing.md +19 -47
- package/lib/oh-story/skills/story-long-write/references/artifact-protocols.md +62 -7
- package/lib/oh-story/skills/story-long-write/references/author-memory.md +10 -8
- package/lib/oh-story/skills/story-long-write/references/banned-words.md +3 -1
- package/lib/oh-story/skills/story-long-write/references/benchmark-recall.md +20 -0
- package/lib/oh-story/skills/story-long-write/references/dialogue-mastery.md +6 -4
- package/lib/oh-story/skills/story-long-write/references/long-chapter-quality.md +2 -2
- package/lib/oh-story/skills/story-long-write/references/long-format.md +2 -0
- package/lib/oh-story/skills/story-long-write/references/outline-structure-theory.md +2 -0
- package/lib/oh-story/skills/story-long-write/references/project-files.md +108 -0
- package/lib/oh-story/skills/story-long-write/references/reference-index.md +87 -0
- package/lib/oh-story/skills/story-long-write/references/style-combat-face.md +1 -1
- package/lib/oh-story/skills/story-long-write/references/style-craft.md +9 -29
- 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 +27 -0
- package/lib/oh-story/skills/story-long-write/references/tracking-initialization.md +31 -0
- package/lib/oh-story/skills/story-long-write/references/tracking-transaction.md +2 -29
- package/lib/oh-story/skills/story-long-write/references/workflow-chapter.md +51 -52
- package/lib/oh-story/skills/story-long-write/references/workflow-daily.md +8 -7
- package/lib/oh-story/skills/story-long-write/references/workflow-setup.md +36 -15
- package/lib/oh-story/skills/story-long-write/references/writer-prompt-fallback.md +22 -0
- package/lib/oh-story/skills/story-long-write/references/writing-craft.md +69 -2
- package/lib/oh-story/skills/story-long-write/scripts/build_writer_prompt.py +410 -0
- package/lib/oh-story/skills/story-long-write/scripts/check-ai-patterns.js +6 -1
- package/lib/oh-story/skills/story-long-write/scripts/check-degeneration.js +39 -20
- package/lib/oh-story/skills/story-long-write/scripts/check-outline-contract.js +176 -12
- package/lib/oh-story/skills/story-long-write/scripts/check-outline-copy.js +90 -23
- package/lib/oh-story/skills/story-long-write/scripts/normalize-punctuation.js +10 -5
- package/lib/oh-story/skills/story-long-write/scripts/outline_view.py +283 -0
- package/lib/oh-story/skills/story-long-write/scripts/style-whitelist.js +39 -0
- package/lib/oh-story/skills/story-review/SKILL.md +13 -3
- package/lib/oh-story/skills/story-review/references/anti-ai-writing.md +19 -47
- package/lib/oh-story/skills/story-review/references/author-memory.md +10 -8
- package/lib/oh-story/skills/story-review/references/banned-words.md +3 -1
- package/lib/oh-story/skills/story-review/references/dialogue-mastery.md +6 -4
- package/lib/oh-story/skills/story-review/references/review-quality.md +2 -2
- package/lib/oh-story/skills/story-review/references/style-resolution.md +27 -0
- package/lib/oh-story/skills/story-review/references/tracking-initialization.md +31 -0
- package/lib/oh-story/skills/story-review/references/tracking-transaction.md +2 -29
- package/lib/oh-story/skills/story-review/scripts/check-ai-patterns.js +6 -1
- package/lib/oh-story/skills/story-review/scripts/check-degeneration.js +39 -20
- package/lib/oh-story/skills/story-review/scripts/normalize-punctuation.js +10 -5
- package/lib/oh-story/skills/story-review/scripts/style-whitelist.js +39 -0
- package/lib/oh-story/skills/story-setup/SKILL.md +17 -10
- package/lib/oh-story/skills/story-setup/references/agent-references/anti-ai-writing.md +19 -47
- package/lib/oh-story/skills/story-setup/references/agent-references/banned-words.md +3 -1
- package/lib/oh-story/skills/story-setup/references/agent-references/deslop-gates.md +154 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/dialogue-mastery.md +6 -4
- package/lib/oh-story/skills/story-setup/references/agent-references/format-and-structure.md +2 -2
- package/lib/oh-story/skills/story-setup/references/agent-references/short-genre-formulas.md +1 -1
- package/lib/oh-story/skills/story-setup/references/agent-references/style-combat-face.md +1 -1
- 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 +27 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/writing-craft.md +69 -2
- package/lib/oh-story/skills/story-setup/references/diagnostics.md +38 -0
- package/lib/oh-story/skills/story-short-analyze/references/analysis-writing-techniques.md +1 -1
- package/lib/oh-story/skills/story-short-analyze/references/source-story-quality.md +2 -2
- package/lib/oh-story/skills/story-short-write/SKILL.md +18 -186
- package/lib/oh-story/skills/story-short-write/references/author-memory.md +10 -8
- package/lib/oh-story/skills/story-short-write/references/banned-words.md +3 -1
- package/lib/oh-story/skills/story-short-write/references/benchmark-recall.md +60 -0
- package/lib/oh-story/skills/story-short-write/references/dialogue-mastery.md +6 -4
- package/lib/oh-story/skills/story-short-write/references/genre-styles//344/270/226/346/203/205/346/211/223/350/204/270.md +2 -2
- package/lib/oh-story/skills/story-short-write/references/genre-styles//345/217/214/347/224/267/344/270/273.md +1 -1
- package/lib/oh-story/skills/story-short-write/references/genre-styles//345/244/215/344/273/207/346/211/223/350/204/270.md +3 -3
- package/lib/oh-story/skills/story-short-write/references/genre-styles//345/256/205/346/226/227/345/256/253/346/226/227.md +3 -3
- package/lib/oh-story/skills/story-short-write/references/genre-styles//346/200/273/350/243/201/350/261/252/351/227/250.md +3 -3
- package/lib/oh-story/skills/story-short-write/references/genre-styles//346/202/254/347/226/221.md +5 -5
- package/lib/oh-story/skills/story-short-write/references/genre-styles//346/260/221/344/277/227/346/200/252/350/260/210.md +4 -4
- package/lib/oh-story/skills/story-short-write/references/genre-styles//347/224/234/345/256/240.md +5 -5
- 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 +3 -3
- package/lib/oh-story/skills/story-short-write/references/genre-writing-formulas.md +1 -1
- package/lib/oh-story/skills/story-short-write/references/genre-writing-techniques.md +1 -1
- package/lib/oh-story/skills/story-short-write/references/reference-index.md +53 -0
- package/lib/oh-story/skills/story-short-write/references/short-craft.md +12 -14
- package/lib/oh-story/skills/story-short-write/references/short-deslop.md +10 -10
- package/lib/oh-story/skills/story-short-write/references/short-format.md +3 -1
- package/lib/oh-story/skills/story-short-write/references/short-prose-quality.md +2 -2
- package/lib/oh-story/skills/story-short-write/references/style-resolution.md +27 -0
- package/lib/oh-story/skills/story-short-write/references/workflow-design.md +77 -0
- package/lib/oh-story/skills/story-short-write/references/writing-workflow.md +5 -5
- package/lib/oh-story/skills/story-short-write/scripts/check-ai-patterns.js +6 -1
- package/lib/oh-story/skills/story-short-write/scripts/check-degeneration.js +39 -20
- package/lib/oh-story/skills/story-short-write/scripts/check-delivery-contract.js +34 -5
- package/lib/oh-story/skills/story-short-write/scripts/check-outline-copy.js +90 -23
- package/lib/oh-story/skills/story-short-write/scripts/normalize-punctuation.js +10 -5
- package/lib/oh-story/skills/story-short-write/scripts/style-whitelist.js +39 -0
- package/lib/types/client/drama-production-view.d.ts.map +1 -1
- package/lib/types/client/index.d.ts.map +1 -1
- package/lib/types/client/production-prompts.d.ts.map +1 -1
- package/lib/types/client/production-runtime.d.ts +17 -0
- package/lib/types/client/production-runtime.d.ts.map +1 -1
- package/lib/types/skill-provider.d.ts.map +1 -1
- package/lib/video-recap/CHANGELOG.md +31 -1
- package/lib/video-recap/manifest.json +162 -162
- package/lib/video-recap/skills/video-assemble/scripts/artifacts.py +4 -9
- package/lib/video-recap/skills/video-assemble/scripts/assemble.py +47 -60
- package/lib/video-recap/skills/video-assemble/scripts/assembly_contract.py +77 -115
- package/lib/video-recap/skills/video-assemble/scripts/assembly_settings.py +41 -40
- package/lib/video-recap/skills/video-assemble/scripts/audio_automation.py +22 -32
- package/lib/video-recap/skills/video-assemble/scripts/audio_mix.py +102 -192
- package/lib/video-recap/skills/video-assemble/scripts/jianying_builders.py +14 -35
- package/lib/video-recap/skills/video-assemble/scripts/jianying_model.py +14 -12
- package/lib/video-recap/skills/video-assemble/scripts/jianying_optional.py +8 -9
- package/lib/video-recap/skills/video-assemble/scripts/jianying_schema.py +3 -14
- package/lib/video-recap/skills/video-assemble/scripts/jianying_timeline_contract.py +23 -12
- package/lib/video-recap/skills/video-assemble/scripts/jianying_tracks.py +1 -4
- package/lib/video-recap/skills/video-assemble/scripts/jianying_writer.py +24 -25
- package/lib/video-recap/skills/video-assemble/scripts/lib.py +31 -85
- package/lib/video-recap/skills/video-assemble/scripts/media.py +100 -144
- package/lib/video-recap/skills/video-assemble/scripts/narration_audio.py +101 -195
- package/lib/video-recap/skills/video-assemble/scripts/render_preflight.py +10 -21
- package/lib/video-recap/skills/video-assemble/scripts/source_subtitles.py +90 -169
- package/lib/video-recap/skills/video-assemble/scripts/subtitle_core.py +69 -122
- package/lib/video-recap/skills/video-assemble/scripts/subtitle_render.py +10 -17
- package/lib/video-recap/skills/video-assemble/scripts/timeline.py +33 -48
- package/lib/video-recap/skills/video-assemble/scripts/timeline_emit.py +14 -20
- package/lib/video-recap/skills/video-assemble/scripts/visual_render.py +135 -213
- package/lib/video-recap/skills/video-cut/scripts/cut_cli.py +49 -57
- package/lib/video-recap/skills/video-cut/scripts/cut_contract.py +38 -74
- package/lib/video-recap/skills/video-cut/scripts/cut_render.py +46 -95
- package/lib/video-recap/skills/video-cut/scripts/lib.py +23 -25
- package/lib/video-recap/skills/video-cut/scripts/media_geometry.py +70 -173
- package/lib/video-recap/skills/video-cut/scripts/narration_mapping.py +28 -53
- package/lib/video-recap/skills/video-cut/scripts/sentence_boundaries.py +162 -322
- package/lib/video-recap/skills/video-recap/references/timeline-and-jianying.md +6 -7
- package/lib/video-recap/skills/video-recap/scripts/doctor.py +104 -124
- package/lib/video-recap/skills/video-recap/scripts/final_qc.py +255 -412
- package/lib/video-recap/skills/video-recap/scripts/lib.py +30 -52
- package/lib/video-recap/skills/video-recap/scripts/materials.py +97 -120
- package/lib/video-recap/skills/video-recap/scripts/mimo_qc_client.py +7 -12
- package/lib/video-recap/skills/video-recap/scripts/mimo_qc_evidence.py +46 -97
- package/lib/video-recap/skills/video-recap/scripts/mimo_qc_observations.py +18 -36
- package/lib/video-recap/skills/video-recap/scripts/mimo_qc_payload.py +29 -47
- package/lib/video-recap/skills/video-recap/scripts/mimo_qc_report.py +43 -76
- package/lib/video-recap/skills/video-recap/scripts/mimo_qc_runner.py +2 -1
- package/lib/video-recap/skills/video-recap/scripts/qc_contract.py +2 -1
- package/lib/video-recap/skills/video-recap/scripts/recap_cli.py +2 -2
- package/lib/video-recap/skills/video-recap/scripts/recap_inspect.py +129 -145
- package/lib/video-recap/skills/video-recap/scripts/recap_review.py +27 -20
- package/lib/video-recap/skills/video-recap/scripts/recap_runner.py +20 -31
- package/lib/video-recap/skills/video-recap/scripts/recap_runtime.py +31 -106
- package/lib/video-recap/skills/video-recap/scripts/recap_stage_qc.py +43 -113
- package/lib/video-recap/skills/video-recap/scripts/recap_timeline.py +196 -377
- package/lib/video-recap/skills/video-script/scripts/agent_brief.py +1 -1
- package/lib/video-recap/skills/video-script/scripts/agent_text.py +63 -172
- package/lib/video-recap/skills/video-script/scripts/brief_context.py +80 -135
- package/lib/video-recap/skills/video-script/scripts/brief_inputs.py +125 -167
- package/lib/video-recap/skills/video-script/scripts/brief_timeline.py +93 -208
- package/lib/video-recap/skills/video-script/scripts/deslop_qc.py +20 -46
- package/lib/video-recap/skills/video-script/scripts/lib.py +30 -26
- package/lib/video-recap/skills/video-script/scripts/narration_lint.py +145 -140
- package/lib/video-recap/skills/video-script/scripts/review_response.py +12 -42
- package/lib/video-recap/skills/video-script/scripts/review_runner.py +0 -6
- package/lib/video-recap/skills/video-script/scripts/speech_ownership.py +39 -100
- package/lib/video-recap/skills/video-script/scripts/timeline_fusion.py +33 -124
- package/lib/video-recap/skills/video-understanding/scripts/agent_brief.py +1 -1
- package/lib/video-recap/skills/video-understanding/scripts/agent_text.py +63 -172
- package/lib/video-recap/skills/video-understanding/scripts/asr.py +1 -2
- package/lib/video-recap/skills/video-understanding/scripts/brief_context.py +80 -135
- package/lib/video-recap/skills/video-understanding/scripts/brief_inputs.py +125 -167
- package/lib/video-recap/skills/video-understanding/scripts/brief_timeline.py +93 -208
- package/lib/video-recap/skills/video-understanding/scripts/consolidate.py +1 -1
- package/lib/video-recap/skills/video-understanding/scripts/deslop_qc.py +20 -46
- package/lib/video-recap/skills/video-understanding/scripts/lib.py +31 -26
- package/lib/video-recap/skills/video-understanding/scripts/narration_lint.py +145 -140
- package/lib/video-recap/skills/video-understanding/scripts/speech_ownership.py +39 -100
- package/lib/video-recap/skills/video-understanding/scripts/timeline_fusion.py +33 -124
- package/lib/video-recap/skills/video-understanding/scripts/vlm.py +1 -4
- package/lib/video-recap/skills/video-voiceover/scripts/dub.py +7 -13
- package/lib/video-recap/skills/video-voiceover/scripts/fish_audio.py +12 -30
- package/lib/video-recap/skills/video-voiceover/scripts/lib.py +98 -131
- package/lib/video-recap/skills/video-voiceover/scripts/tts_audio.py +17 -28
- package/lib/video-recap/skills/video-voiceover/scripts/voiceover.py +151 -240
- package/package.json +41 -41
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
## 叙述腔调
|
|
9
9
|
|
|
10
|
-
第一人称在场亲历者,常带行当身份(接阴人 / 扎纸匠 / 冥婚媒婆 / 捞尸人 /
|
|
10
|
+
第一人称在场亲历者,常带行当身份(接阴人 / 扎纸匠 / 冥婚媒婆 / 捞尸人 / 法医),开口先自报行当和铁规矩。口吻冷静克制、白描见鬼:恐惧落在异常线索、禁忌和进退选择上,必要时可以直写或用有作用的身体反应,不喊不哭诉,与追妻系的成段宣泄正好相反。乡土口语加行话打底:十里八乡、邪性、晦气、脏东西、讲究、忌讳、吉时、脏了手。
|
|
11
11
|
|
|
12
12
|
两种主导腔调,按主角站位选一:
|
|
13
13
|
|
|
@@ -50,9 +50,9 @@
|
|
|
50
50
|
|
|
51
51
|
## 情绪烈度与模式(烈度 7)
|
|
52
52
|
|
|
53
|
-
|
|
53
|
+
恐惧型烈度:意象狠、叙述稳。避免长段心理自剖,恐惧可以通过感知、判断或选择呈现。
|
|
54
54
|
|
|
55
|
-
-
|
|
55
|
+
- 恐惧以直写为主;体感(后颈发凉 / 如坠冰窟)全篇两三处,一句到位不叠形容。
|
|
56
56
|
- 恐怖靠熟悉物变样,不靠血浆:《黄仙噬骨》那件蓝布棉袄挂在仓房里,「每逢雪夜就窸窸窣窣地响,像有东西在里头…试衣裳。」
|
|
57
57
|
- 悚然的最高级是轻描淡写:《一梳梳到头》妻子吊死在梁上,他只皱皱眉:「晦气,埋了吧。」
|
|
58
58
|
- 惨烈描写只给破戒者遭报的时刻(肚子胀成水缸、人只剩一张皮),此处放开写,其余时候收着。
|
|
@@ -143,7 +143,7 @@
|
|
|
143
143
|
|
|
144
144
|
本题材额外要避免的:
|
|
145
145
|
|
|
146
|
-
-
|
|
146
|
+
- 主角成段心理独白和情绪自剖(简短判断或直写恐惧可以)。
|
|
147
147
|
- 自造玄学体系。民俗名词用现成的:头七、往生咒、糯米、黄符、生辰八字、讨封、点睛。
|
|
148
148
|
- 意象无限堆叠的梦核升级(一节一个新怪物、符咒套符咒),规矩线会被冲散。
|
|
149
149
|
- 结尾说教升华与「科普腔」解读。仍要避免的通用 AI 味:映入眼帘、心中暗道、沉声道、一丝寒意涌上心头。
|
package/lib/oh-story/skills/story-short-write/references/genre-styles//347/224/234/345/256/240.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
## 叙述腔调
|
|
9
9
|
|
|
10
|
-
第一人称「我」(多为女主)主导,轻快、自嘲、口语。主引擎是**内心吐槽小剧场**:表面言行与心理活动的反差制造喜感,嘴上「关你什么事」,心里「这人今天是怎么了?吃错药了?」。允许沙雕自称(本小姐 / 本公主 /
|
|
10
|
+
第一人称「我」(多为女主)主导,轻快、自嘲、口语。主引擎是**内心吐槽小剧场**:表面言行与心理活动的反差制造喜感,嘴上「关你什么事」,心里「这人今天是怎么了?吃错药了?」。允许沙雕自称(本小姐 / 本公主 / 本喵)。心动瞬间可以切慢镜头,放大关系变化或有信息的细节。
|
|
11
11
|
|
|
12
12
|
先虐后甜 / 救赎支线的前段换压抑克制腔:留白、不解释(《贪心》「没有。」我,撒了谎。他,没有回头。)。糖是熬出来的奖赏,一进糖区就切回轻快。
|
|
13
13
|
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
|
|
46
46
|
## 情绪烈度与模式(烈度 6)
|
|
47
47
|
|
|
48
|
-
|
|
48
|
+
日常轻快,心动瞬间拉高再速降。峰值可落在关系试探、意外回应或有信息的身体细节上。以下体感是语料用法,不是固定配方:
|
|
49
49
|
|
|
50
50
|
- 心跳系:《心上樱》我心跳轻轻乱了一拍,没好意思再接话。/《误拨给死对头后》我愣在原地,心跳瞬间漏了一拍。
|
|
51
51
|
- 温度系:《心上樱》耳朵瞬间烫得要命,我几乎是从床上跳了下来。/《公主嫁到》我呆呆地站在原地,耳朵突然火一般热。
|
|
@@ -93,7 +93,7 @@
|
|
|
93
93
|
| 强制同框 | 赐婚 / 提亲 / 陪护,把两人锁进一个空间 | 《公主嫁到》「景天,从今日起,你就是平遥的驸马,给朕好好管教她!」我两眼一黑 |
|
|
94
94
|
| 撩拨反杀 | 女主长期撩不动,男主某天突然接招反压 | 《一遇沦陷》「不是想摸腹肌吗?或者还有其他地方?」「你自己来,还是我教你?」 |
|
|
95
95
|
| 吃醋修罗场 | 情敌 / 前任出现,男主发疯或秒变委屈 | 《财神爷》【呵呵,拿了我的钱,还想去泡仔,天下能有这么好的事?】 |
|
|
96
|
-
| 心动打卡 |
|
|
96
|
+
| 心动打卡 | 身体微反应记录心动进度,不连续两节用同一处 | 《心上樱》我心跳轻轻乱了一拍,没好意思再接话 |
|
|
97
97
|
| 危机见真心 | 挡箭 / 发烧 / 受伤,行动戳破嘴硬 | 《人间渡》霍翀翻过身来,把我整个人压在了他身下,宽背挡住了从背后射来的箭 |
|
|
98
98
|
| 认知错位萌 | 非人 / 天真视角误读人类常识,糖从误读里长 | 《人间渡》「给你切瘤子啊。」/《皇帝饲主的日常》「这只猫怎么这么重?」 |
|
|
99
99
|
| 马甲揭穿名场面 | 面具 / 身份当众掉落,糖与爽同发 | 《财神爷》面具应声而落……「秦晓晓??」老板颤抖着声音,表情一丝丝裂开,「你就是森森???」 |
|
|
@@ -136,10 +136,10 @@ HE 是硬约束:不开放式、不 BE、不留第三者复活的口子。
|
|
|
136
136
|
|
|
137
137
|
- **内心吐槽小剧场 / 自问自答**(「吃错药了?」「几个意思?」):保留,这是喜感与代入的主引擎。
|
|
138
138
|
- **网络语与流行梗**(已读乱回、I 人、磕 CP、PTSD):现代篇保留,是口语质感的一部分;古代篇禁用,换成「本小姐」式的俏皮自称。
|
|
139
|
-
- **心动微反应重复打卡**(耳朵红 /
|
|
139
|
+
- **心动微反应重复打卡**(耳朵红 / 心跳漏拍):保留复现,这是读者的打卡点;密度低于情绪直写,不连续两节用同一处。
|
|
140
140
|
- **男主金句式短台词**:保留「一句收网」,哪怕显得戏剧化;别为自然感把它稀释成长段解释。
|
|
141
141
|
|
|
142
|
-
仍要避免的真·AI 味:映入眼帘、嘴角微扬、眼底闪过一丝、宠溺地笑、心中暗道、论文体连词(不难看出 /
|
|
142
|
+
仍要避免的真·AI 味:映入眼帘、嘴角微扬、眼底闪过一丝、宠溺地笑、心中暗道、论文体连词(不难看出 / 由此可见),以及空转的心动总结句(一股甜蜜涌上心头)。
|
|
143
143
|
|
|
144
144
|
> 标点:本题材范例为示意保留了原貌;落到正文按 `short-craft.md` 第 8 节执行(不出 `……` / `——`,停顿用短句 / 动作 / 换行)。
|
|
145
145
|
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
前半直白宣泄 + 撞破真相后冷静审判(钝刀转冷刀)。
|
|
46
46
|
|
|
47
47
|
- 直接命名情绪并加重:心如死灰、心彻底凉透、伤心欲绝、泪如雨下、如遭雷劈,通篇高频直给。
|
|
48
|
-
-
|
|
48
|
+
- 情绪可以直白浓烈;已有背叛与处境支撑时直接写,不固定叠加身体反应。
|
|
49
49
|
- 内脏 / 心脏拟痛:「巨大的悲痛在一点点啃食我的心脏,痛到不能呼吸」。
|
|
50
50
|
- 心死后转冷反衬:「这些话出自最亲密的人之口,却已经激不起我任何波澜」。
|
|
51
51
|
|
|
@@ -127,12 +127,12 @@
|
|
|
127
127
|
|
|
128
128
|
这些在别的语境是 AI 味,在本题材是卖点,**别误删**:
|
|
129
129
|
|
|
130
|
-
- **直写情绪成语**(心如死灰 /
|
|
130
|
+
- **直写情绪成语**(心如死灰 / 泪如雨下):有上下文支撑就保留,不强配动作或物件,也不替换成纯动作。
|
|
131
131
|
- **第一人称成段宣泄独白 + 连环反问**:保留,这是代入与共鸣的主引擎。
|
|
132
132
|
- **火葬场前瞻预告 / 结果倒序简介**:保留这类有意识的向前剧透;只删「泄了悬念又不吊读」的随手上帝腔。
|
|
133
133
|
- **审判金句 / 心死式章尾**:保留;只删空洞哲理升华。
|
|
134
134
|
|
|
135
|
-
仍要避免的真·AI 味:映入眼帘、心中暗道、沉声道、嘴角微扬、目光如炬、论文体连词(不难看出 /
|
|
135
|
+
仍要避免的真·AI 味:映入眼帘、心中暗道、沉声道、嘴角微扬、目光如炬、论文体连词(不难看出 / 由此可见)、空泛无落点的情绪总结句(一丝悲伤涌上心头)。
|
|
136
136
|
|
|
137
137
|
> 标点:本题材范例为示意保留了原貌;落到正文按 `short-craft.md` 第 8 节执行(不出 `……` / `——`,停顿用短句 / 动作 / 换行)。
|
|
138
138
|
|
|
@@ -183,7 +183,7 @@
|
|
|
183
183
|
| 开头100字内冲突 | 第一句就是信息炸弹 | "在一个阳光明媚的早晨..." |
|
|
184
184
|
| 对白服从场景功能 | 改变信息、策略、权力、关系或行动 | 为抬高占比补问答、复述或无效狠话 |
|
|
185
185
|
| 段落服从戏剧单元 | 一件事、一个镜头或一条推理链完成再断段 | 按句数强拆,形成提纲体或电报体 |
|
|
186
|
-
|
|
|
186
|
+
| 情绪直写与场景支撑 | 按 short-craft 第2节看上下文,不要求情绪词后接动作;身体细节有功能时保留 | 《为给白月光出气,男友群发我私密照》我紧紧抿着嘴唇,直到尝到血腥味 |
|
|
187
187
|
| 场景产生真实变化 | 改变风险、信息、关系、资源、决定、行动或读者理解之一 | 为凑多功能添加旁人反应、回忆或独立障碍 |
|
|
188
188
|
| 结尾用动作/对话 | 不升华、不总结、不感慨 | "从此以后她明白了..." |
|
|
189
189
|
| 主角有辨识度 | 冷静落在取证、选择、延迟回应或资源调度上;用本篇独有的动作,不套通用标志 | 端水杯、整理西装、转笔等通用动作当必备项,或全篇无辨识度 |
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# 短篇参考资料索引
|
|
2
|
+
|
|
3
|
+
## 参考资料
|
|
4
|
+
|
|
5
|
+
按当前阶段 Reference Gate 和写前准备加载必需文件,其余按需:
|
|
6
|
+
|
|
7
|
+
| 文件 | 何时加载 |
|
|
8
|
+
|------|----------|
|
|
9
|
+
| [references/short-format.md](short-format.md) | 写作前必读(短篇正文格式,两平台模板) |
|
|
10
|
+
| [references/submission-craft.md](submission-craft.md) | 投稿前必读(平台基调 知乎/小程序/番茄 · 导语门面 · 付费点断点) |
|
|
11
|
+
| [references/short-craft.md](short-craft.md) | 写作全程参考(短篇通用底座:情绪直写与场景支撑、在场叙述、超短章节制) |
|
|
12
|
+
| [references/genre-styles/](genre-styles/) | **定方向后必读**:按题材加载对应风格包(追妻火葬场 / 世情打脸 / 复仇打脸 / 总裁豪门 / 宅斗宫斗 / 民俗怪谈 / 悬疑 / 甜宠 / 双男主 / 沙雕脑洞),正文风格随之切换 |
|
|
13
|
+
| [references/short-deslop.md](short-deslop.md) | 去AI味时必读(短篇专属,只杀真·AI腔,不杀情绪烈度) |
|
|
14
|
+
| [references/workflow-design.md](workflow-design.md) | Phase 2 构思、设计字段、Agent 调用与完成门禁;Phase 3/4 不预加载 |
|
|
15
|
+
| [references/writing-workflow.md](writing-workflow.md) | Phase 2 设计任务 + Phase 4 精修 |
|
|
16
|
+
| [references/genre-writing-formulas.md](genre-writing-formulas.md) | 冷门题材结构骨架补充(核心 10 题材直接用 genre-styles/) |
|
|
17
|
+
| [references/genre-writing-techniques.md](genre-writing-techniques.md) | 跨题材通用技法(震惊场景/三翻四震/感情线四阶段/喜剧flag) |
|
|
18
|
+
| [references/emotional-methods.md](emotional-methods.md) | 设计情感时 |
|
|
19
|
+
| [references/hooks-chapter.md](hooks-chapter.md) | 章节钩子设计 |
|
|
20
|
+
| [references/short-suspense.md](short-suspense.md) | 短篇悬念设计 |
|
|
21
|
+
| [references/hooks-paragraph.md](hooks-paragraph.md) | 段落钩子技巧 |
|
|
22
|
+
| [references/villain-and-reveal.md](villain-and-reveal.md) | Phase 2 设计反派时 |
|
|
23
|
+
| [references/short-reversal.md](short-reversal.md) | 设计短篇反转时 |
|
|
24
|
+
| [references/short-prose-quality.md](short-prose-quality.md) | 精修检查时 |
|
|
25
|
+
| [references/banned-words.md](banned-words.md) | 禁用词表 |
|
|
26
|
+
| [scripts/normalize-punctuation.js](../scripts/normalize-punctuation.js) | Phase 4 文件模式确定性标点收尾 |
|
|
27
|
+
| [scripts/check-ai-patterns.js](../scripts/check-ai-patterns.js) | Phase 3 完成门槛与 Phase 4 复扫;报告高危 AI 句式、破折号、碎句号、长段落、微动作复读、套式反应细节、抽象总结、套词/比喻密度、解释链、系统公告腔、提纲感短段、低连接密度 |
|
|
28
|
+
| [scripts/check-degeneration.js](../scripts/check-degeneration.js) | Phase 3 完成门槛与 Phase 4 复扫;报告模型退化(复读/截断/工程词泄漏),blocking 需重新生成 |
|
|
29
|
+
| [scripts/check-phase2-contract.js](../scripts/check-phase2-contract.js) | Phase 2 产物确定性验收;返回具名失败与最小 repair_scope |
|
|
30
|
+
| [scripts/check-delivery-contract.js](../scripts/check-delivery-contract.js) | 最终交付确定性验收;按用户参数检查非空白字符、节数与小节格式 |
|
|
31
|
+
| [references/dialogue-mastery.md](dialogue-mastery.md) | 写对话时 |
|
|
32
|
+
| [references/output-contract.md](output-contract.md) | Phase 2 对标上下文加载时(理解 analyze 产出格式与消费规范) |
|
|
33
|
+
|
|
34
|
+
### 按主题快速定位(横切主题)
|
|
35
|
+
|
|
36
|
+
有些主题散在多个文件里。下表给每个主题一个**权威文件**(先读它,通常够用),配套文件只在需要那个角度时再加载。括号是该文件里对应的小节。
|
|
37
|
+
|
|
38
|
+
| 主题 | 权威文件(先读) | 配套文件(按角度补充) |
|
|
39
|
+
|------|-----------------|----------------------|
|
|
40
|
+
| 情绪落地(怎么写情绪) | **`references/short-craft.md` 第2节**(情绪直写、场景支撑与重复说明取舍) | 各 `genre-styles/` 包的「情绪烈度与模式」 |
|
|
41
|
+
| 情绪设计(情感结构) | **`references/emotional-methods.md`**(情感三板斧 + 拉扯节奏 + 失败模式) | `references/genre-writing-techniques.md`(情绪操控核心法则 / 情绪三层次) |
|
|
42
|
+
| 反转 | **`references/short-reversal.md`**(反转类型 / 铺垫 / 揭示位置 / 有效性自检) | `references/villain-and-reveal.md`(真相揭露机制 / 反转有效性自检) |
|
|
43
|
+
| 反派揭露 | **`references/villain-and-reveal.md`**(反派模板 / 揭露机制 / 报应设计) | `references/short-reversal.md` |
|
|
44
|
+
| 人物 | **各 `genre-styles/{题材}.md` 的「对话风格」「招式库」**(受害者-复仇者主角声线、白月光软刀、施害者道德绑架人设,corpus-grounded) | `references/villain-and-reveal.md`(反派/揭露)· `references/genre-writing-techniques.md`(三层标签反差 / 人设从缺点开始)· `references/dialogue-mastery.md`(声线差异) |
|
|
45
|
+
| 钩子 | **`references/hooks-chapter.md`**(章节/开篇钩子类型) | `references/hooks-paragraph.md`(段落钩子)· `references/short-suspense.md`(悬念设计) |
|
|
46
|
+
| 女频写作 | **对应 `genre-styles/{题材}.md`**(追妻火葬场 / 总裁豪门 / 宅斗宫斗 / 甜宠 / 世情打脸的题材声线、虐爽比例、招式) | `references/genre-writing-techniques.md`(女频读者心理与写作技法 / 感情线四阶段推进法)· `references/emotional-methods.md`(情绪拉扯) |
|
|
47
|
+
| 题材风格 | **`references/genre-styles/{题材}.md`**(核心 10 题材的腔调/开篇/钩子/情绪烈度/招式/收尾,corpus-grounded) | `references/genre-writing-formulas.md`(冷门题材结构骨架)· `references/genre-writing-techniques.md`(核心梗 / 卖点 / 通用技法) |
|
|
48
|
+
| 开头 | **各 `genre-styles/{题材}.md` 的「开篇范式」**(关系锚 + 全弧剧透导语 + 火葬场预告,真实开篇范例)+ `short-craft.md` 第12节(开头事件密度) | `references/hooks-chapter.md`(开篇钩子类型)· `references/hooks-paragraph.md`(段钩密度) |
|
|
49
|
+
| 格式与节奏 | **`references/short-format.md`**(短篇正文格式,两平台模板) | `references/short-craft.md`(情绪落地/三维度揉进/疏密)· `references/writing-workflow.md`(设计/精修工作流) |
|
|
50
|
+
| 对话 | **`references/dialogue-mastery.md`**(对话技法主文件:差异化/潜台词/对话节奏) | `references/short-craft.md`(三类台词与对话权力博弈)· 各 `genre-styles/` 包的真实金句库 |
|
|
51
|
+
| 去AI味 | **`references/short-deslop.md`**(短篇专属:只杀真·AI腔,不杀情绪烈度/审判句/火葬场预告) | `references/banned-words.md`(禁用词扫描)· `scripts/check-ai-patterns.js`(AI句式复扫)· `references/short-prose-quality.md`(成稿检查) |
|
|
52
|
+
|
|
53
|
+
---
|
|
@@ -20,29 +20,27 @@
|
|
|
20
20
|
|
|
21
21
|
---
|
|
22
22
|
|
|
23
|
-
## 2.
|
|
23
|
+
## 2. 情绪落地:直接写情绪词,四个落点任选
|
|
24
24
|
|
|
25
25
|
短篇最核心的写法,也是和长篇审美冲突最大的一条。
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
真实番茄里,情绪词(心如死灰、心如刀绞、几欲作呕、眼泪不争气)就是直接写出来的,密度接近长篇两倍——这是卖点,不是 AI 味。情绪词落在下面任一处都成立,不必每处都配动作或物件:
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
| 落点 | 原文 |
|
|
30
|
+
|------|------|
|
|
31
|
+
| 融进动作句作状语 | 《把我送给富婆33次后,女友后悔了》听着她冷漠的声音,我绝望地闭上了双眼。 |
|
|
32
|
+
| 当对话提示语 | 《无用婚姻》我无奈道:「那我只好起诉你了,理由就是你长期未履行婚姻义务。」 |
|
|
33
|
+
| 情绪句到此结束,下一句直接换事 | 《年年负却花期》三千六百多个日日夜夜,三分之二的时间我都在崩溃。 |
|
|
34
|
+
| 后接此刻手里、眼前的具体东西 | 《闻笙有两意》摸到那碗凉掉的排骨汤时,我的心更冰冷了。上面还浮着凝固的油,根本喝不了。 |
|
|
30
35
|
|
|
31
|
-
|
|
32
|
-
- 《为给白月光出气,男友群发我私密照》我紧紧抿着嘴唇,直到尝到血腥味,才勉强找回一丝清明。
|
|
33
|
-
- 《被凌辱后,我把他们送上法庭》我在一旁看得心如刀绞,几欲作呕。
|
|
34
|
-
- 《闻笙有两意》摸到那碗凉掉的排骨汤时,我的心更冰冷了。上面还浮着凝固的油,根本喝不了。
|
|
35
|
-
- 《和闺蜜死遁后,文武状元悔疯了》怒火和心痛在胸腔翻涌。我鼻头一酸,将玉佩摔得支离破碎。
|
|
36
|
-
- 《为讨真千金欢心》我紧紧攥着衣角,颤抖着问。
|
|
36
|
+
通用生理反应(攥衣角、咬唇、鼻头一酸、指甲掐掌心)全篇不超过三五处,不当情绪词的固定尾巴;只有带来后果时才留——伤势、动作失败、人物习惯。
|
|
37
37
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
情绪后面接的不一定只是物件,也可以是任务卡点:主角要办一件眼下必须办成的事,却在这一步被卡住。短篇里的任务卡点必须短、狠、贴情绪:卡住救命钱、卡住证据、卡住离场、卡住求救、卡住反击。目的不是写流程,也不是为了显得自然,而是让读者立刻感到“更难堪 / 更绝望 / 更该反击”。
|
|
38
|
+
情绪也可以由任务卡点承载:主角要办一件眼下必须办成的事,却在这一步被卡住。短篇里的任务卡点必须短、狠、贴情绪:卡住救命钱、卡住证据、卡住离场、卡住求救、卡住反击。目的不是写流程,也不是为了显得自然,而是让读者立刻感到“更难堪 / 更绝望 / 更该反击”。
|
|
41
39
|
|
|
42
40
|
**要删的两种:**
|
|
43
41
|
|
|
44
|
-
1.
|
|
45
|
-
2.
|
|
42
|
+
1. 脱离上下文、没有新增信息的空泛情绪总结句(「一丝悲伤涌上心头」「仿佛整个世界失去了颜色」)。
|
|
43
|
+
2. 同一个情绪反复写、写完再补一句解释它多疼。情绪已成立就往下走,不为直写补反应。
|
|
46
44
|
|
|
47
45
|
---
|
|
48
46
|
|
|
@@ -7,13 +7,13 @@
|
|
|
7
7
|
|
|
8
8
|
## 根本立场:短篇是情绪产品
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
短篇靠直白共鸣留人,不靠克制留白。情绪处理按 `short-craft.md` 第 2 节:**删空泛与重复说明,留有上下文支撑的直写和有功能的反应。**
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
短篇要保留的三类写法(不能套用其他题材的偏好误删):
|
|
13
13
|
|
|
14
|
-
|
|
|
14
|
+
| 容易被误删的写法 | 短篇留 | 短篇只删 |
|
|
15
15
|
|---|---|---|
|
|
16
|
-
| 直接写情绪词(心如死灰 / 眼泪不争气) | 留:这是招牌句 |
|
|
16
|
+
| 直接写情绪词(心如死灰 / 眼泪不争气) | 留:这是招牌句 | 删:脱离上下文或重复说明的空泛总结,不按有无后接反应判定 |
|
|
17
17
|
| 第一人称审判句 / 剧透 / 火葬场预告 | 留:在场叙述是爽感来源 | 删:和角色情绪无关、纯交代的作者讲解 |
|
|
18
18
|
| 审判金句 / 心死式章尾 | 留:读者会截图传播 | 删:空洞哲理升华(人生就是这样 / 她终于明白了) |
|
|
19
19
|
|
|
@@ -21,14 +21,14 @@
|
|
|
21
21
|
|
|
22
22
|
---
|
|
23
23
|
|
|
24
|
-
##
|
|
24
|
+
## 一、情绪怎么写:保留直写,删空泛与重复
|
|
25
25
|
|
|
26
26
|
短篇不禁直接写情绪词(心如死灰、心如刀绞、几欲作呕、眼泪不争气都行,真实番茄用得很密)。**正面怎么写、真实原文范例,见 `short-craft.md` 第 2 节。** 这里只管删什么。
|
|
27
27
|
|
|
28
28
|
删两种:
|
|
29
29
|
|
|
30
|
-
1.
|
|
31
|
-
2.
|
|
30
|
+
1. 脱离上下文或重复解释的空泛情绪总结句:「一丝悲伤涌上心头」「仿佛整个世界失去了颜色」。不能只因情绪后没有动作就删。
|
|
31
|
+
2. 只标注情绪、不增加信息的通用生理反应。删后不影响人物、行动或后果就删,不换部位、不补物件凑数;有功能的身体细节保留。
|
|
32
32
|
|
|
33
33
|
一个情绪写一次就往下走,不要写完再补一句解释它多疼。
|
|
34
34
|
|
|
@@ -103,9 +103,9 @@
|
|
|
103
103
|
| 书面连词泛滥 | 于是乎 / 与此同时 / 诚然 / 从而 / 因而 | 口语化或删 |
|
|
104
104
|
| 弱化副词扎堆 | 微微 / 淡淡 / 缓缓 / 轻轻(每千字超过 3 个) | 删到 3 个以内 |
|
|
105
105
|
| 万能比喻 | 像潮水般 / 如闪电般 / 仿佛春风 | 删,或换生活化比喻 |
|
|
106
|
-
| 空泛情绪总结 | 一丝 X 涌上心头 / 感到深深的 X / 一股 X 笼罩全身 |
|
|
106
|
+
| 空泛情绪总结 | 一丝 X 涌上心头 / 感到深深的 X / 一股 X 笼罩全身 | 按第一节看语境与功能,删空泛或重复说明,不补反应凑数 |
|
|
107
107
|
|
|
108
|
-
>
|
|
108
|
+
> 情绪词本身(心如死灰)不在黑名单里。按 `short-craft.md` 第 2 节看上下文与功能,不以是否后接反应决定删留。
|
|
109
109
|
|
|
110
110
|
---
|
|
111
111
|
|
|
@@ -117,7 +117,7 @@
|
|
|
117
117
|
|
|
118
118
|
## 短篇去 AI 自检清单(写完每节逐项扫)
|
|
119
119
|
|
|
120
|
-
- [ ]
|
|
120
|
+
- [ ] **情绪有上下文支撑**,无重复解释或无功能反应;不要求每个情绪词后再接动作
|
|
121
121
|
- [ ] **没有空泛情绪总结句**(一丝 X 涌上心头 / 感到深深的 X / 仿佛世界失去颜色)
|
|
122
122
|
- [ ] **一个情绪只写一次**,没有写完再补一句解释它多疼
|
|
123
123
|
- [ ] **在场叙述保留**:第一人称审判句 / 剧透 / 火葬场预告在,没误删
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
# 短篇正文格式
|
|
2
2
|
|
|
3
|
+
> 表达与文件结构分开:标点、对话落法等默认建议服从 [style-resolution.md](style-resolution.md);文件名、标题/小节结构与字数验收仍按本协议。
|
|
4
|
+
|
|
3
5
|
> 写正文前必读。只管交付排版:章节标记、段落形态、对话、标点、元信息禁令。
|
|
4
|
-
>
|
|
6
|
+
> 写法(情绪落地、钩子密度、反转、收尾)见 `short-craft.md` 与题材包,不在此重复。
|
|
5
7
|
> 这是当前仓库默认交付格式;用户或目标平台另有明确要求时,以用户 / 平台要求覆盖。
|
|
6
8
|
|
|
7
9
|
---
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
- [ ] 没有空洞的抒情段落
|
|
50
50
|
- [ ] 没有连续多段同一情绪
|
|
51
51
|
- [ ] 对话符合人物身份(不同人说话方式不同)
|
|
52
|
-
- [ ]
|
|
52
|
+
- [ ] 情绪词有落点(融进动作句、当对话提示语、结句后直接换事或接场内物件),不是接更多情绪
|
|
53
53
|
|
|
54
54
|
### 连载连续性
|
|
55
55
|
- [ ] 没有遗忘之前的承诺/伏笔
|
|
@@ -109,7 +109,7 @@
|
|
|
109
109
|
| 空泛总结 | 「他终于明白了」「一切尽在不言中」 | 删掉,用行动代替 |
|
|
110
110
|
| 套路修辞 | 「命运仿佛在和他开玩笑」 | 删掉或换成具体描述 |
|
|
111
111
|
| 比喻堆叠 | 连续多处「像/好像/仿佛/如同」,每个画面都靠比喻解释 | 只留最有叙事功能的少数比喻,其余改成动作、物件、声音或后果 |
|
|
112
|
-
|
|
|
112
|
+
| 空转情绪句 | 「他感到一阵悲伤」,无落点 | 删,或写他此刻做不成的事;直写本身不算缺陷 |
|
|
113
113
|
| 心理描写空转 | 内心独白无新信息、重复同一情绪或复述读者已知 | 只压缩空转部分;带新信息、决断或情绪转折的独白不按句数压缩 |
|
|
114
114
|
|
|
115
115
|
### 维度 5:逻辑连贯
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# 文风与参考冲突裁决
|
|
2
|
+
|
|
3
|
+
写正文、改写、去 AI 味和审稿都先做这一步;inline 与 agent 用同一份裁决。无需另建画像或要求作者填写配置。
|
|
4
|
+
|
|
5
|
+
## 按维度取值,不把整份文件互相覆盖
|
|
6
|
+
|
|
7
|
+
表达选择按以下顺序取第一个明确、适用的要求:**当前请求 > 本书文风/设定 > 本书 active 作者记忆 > 题材、流程、全局 active 记忆 > 主对标文风 > 题材包与通用 references 默认值**。未声明的维度才向下补齐;本书例外不撤销全局习惯,临时要求不写回长期记忆。
|
|
8
|
+
|
|
9
|
+
句长、视角、标点、对话落法、情绪直写、修辞、叙述者评论和收尾方式都是表达维度。reference 中的“必须”“禁用”“最高优先级”、示例和检测阈值不使默认写法升级为作者不可覆盖的规则。主对标的低置信观察不压过作者的明确选择。
|
|
10
|
+
|
|
11
|
+
事实与表达分开裁决:文风不能改变细纲事件、已知事实、信息揭露边界、用户字数范围、改写范围、文件结构或追踪协议;有限全知允许换视角,不等于可提前揭底。转限知时可暂不叙述该人物无从得知的信息,事实本身不变;不得补出“早已知道”“后来发现”或新观察经历来保全原文信息。审稿照常评价因果、可读性与情绪效果,不能仅因使用了作者选定的写法就判错,也不能因为作者喜欢就忽略真实缺陷。
|
|
12
|
+
|
|
13
|
+
## 加载与传递
|
|
14
|
+
|
|
15
|
+
1. 从本次正文路径确定书目录(长篇为 `正文/` 的父目录,短篇为 `正文.md` 所在目录)。读该书 `设定/文风.md`;短篇同时读 `设定.md` 的文风约定。无文件就继续,不创建占位文件、不猜其他书。文风无最低字数限制,一句可执行的偏好也有效;空白、纯标题、待补充不算。
|
|
16
|
+
2. `_文风摘要.md` 只能辅助定位,不能独立替代全文。当前会话已读全文时无需反复读;摘要与全文不一致用全文,不让旧摘要压过作者的新修改。
|
|
17
|
+
3. 作者记忆 query 显式传当前书名、已知题材和流程以及需要的 kind,避免只取到 global。只用 active;同一维度窄范围覆盖宽范围,不拼成同时满足的清单。无法判定的同范围冲突才问作者,已能按优先级解决的不询问。
|
|
18
|
+
4. 在现有 prompt 填 `style_resolution`:本次生效的表达要求及来源、被覆盖的默认条款、必须保留的事实/信息边界;只列与任务有关的冲突,无冲突可写“按本书文风”。原样传给正文、去味和文字 reviewer,并传文风全文路径。同一批次复用,当前请求或文风变动时更新。单独调用去味/审稿也执行本步骤,不能靠上一次会话的记忆。
|
|
19
|
+
|
|
20
|
+
## 检测器如何服从裁决
|
|
21
|
+
|
|
22
|
+
检测器不理解作者意图。保留现有默认检查;明确采用且有功能的命中,复用**书目录**下的 `.deslop-whitelist`:UTF-8,一行一个原文字面片段,空行和以 `#` 开头的整行注释忽略,不支持正则或通配符。不向父目录找,避免跨书继承。
|
|
23
|
+
|
|
24
|
+
- 本书文风明确允许某种停顿标点时,可登记 `——` 或 `……`;具体修辞登记完整的获准原句,不能登记“不是”“没有”等泛词来关闭整类检查。
|
|
25
|
+
- 每项用上一行 `# 来源:…;用途:…` 说明当前请求或文风依据。只为执行作者已明确的选择登记,不因脚本报警自动放行。当前请求禁止某写法时移除相冲突的豁免;一次性保留只登记该句,不推断长期习惯。
|
|
26
|
+
- 深扫、标点整理和写后/下一章检查读取同一白名单。豁免只影响对应字面片段的风格检查;同一行其他问题照报,事实、字数、占位、工程词、截断和文件结构检查不豁免。
|
|
27
|
+
- 所选 Gate 仍执行:检查该写法是否重复、冗余、破坏节奏或越过信息边界;有这些具体问题才改。裁决与发现可简短写在正常交付报告中,不写进小说正文。
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Phase 2:短篇构思与设计
|
|
2
|
+
|
|
3
|
+
#### Agent 调用:story-architect
|
|
4
|
+
|
|
5
|
+
构思阶段,如果项目已部署 story-architect agent(查找顺序见 [SKILL.md](../SKILL.md)),可 spawn `Agent(subagent_type: "story-architect", prompt: "项目目录:{dir}\n任务类型:短篇构思\n查询参数:{情绪目标+题材方向}")` 辅助框架设计。如 agent 不可用,由主线程直接执行。
|
|
6
|
+
|
|
7
|
+
帮用户确定短篇的核心框架:
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
## 短篇核心框架
|
|
11
|
+
|
|
12
|
+
### 基本信息
|
|
13
|
+
- 标题(暂定):{}
|
|
14
|
+
- 目标字数:{} 字(短篇通常 8000-20000 字)
|
|
15
|
+
- 目标平台:{知乎盐选 / 小程序 / 番茄短篇}(三选一)
|
|
16
|
+
- 情绪目标:{读者读完的感受}
|
|
17
|
+
|
|
18
|
+
### 一句话梗概
|
|
19
|
+
{主角 + 困境 + 反转 + 情绪落点}
|
|
20
|
+
|
|
21
|
+
### 核心支点
|
|
22
|
+
- 类型:{身份/视角/动机/时间线/信息/认知反转,或无反转}
|
|
23
|
+
- 核心兑现:{一句话描述主揭示;无反转时写报应或关系兑现}
|
|
24
|
+
- 铺垫/期待:{关键铺垫点;无反转时写读者等待兑现的因果或关系节拍}
|
|
25
|
+
|
|
26
|
+
### 情绪设计
|
|
27
|
+
- 开头情绪:{}(强度 {1-10})
|
|
28
|
+
- 中段情绪:{}(强度 {1-10})
|
|
29
|
+
- 反转情绪:{}(强度 {1-10},峰值维持 ≥2 节)
|
|
30
|
+
- 结尾情绪:{}(强度 {1-10})
|
|
31
|
+
- 反转高潮不要骤降:反转前 1 节开始升温,反转节达到峰值,反转后 1 节维持峰值不骤降
|
|
32
|
+
|
|
33
|
+
### 人设速写
|
|
34
|
+
- 主角:{一句话人设}
|
|
35
|
+
- 关键角色:{一句话人设}
|
|
36
|
+
- 关系:{他们之间的关系}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
框架确定后,完成设计任务,然后在工作目录下创建文件。
|
|
40
|
+
|
|
41
|
+
#### 设计任务(框架确定后执行)
|
|
42
|
+
|
|
43
|
+
详细步骤和模板见 `references/writing-workflow.md`。构思时从目标情绪反推剧情,不是从灵感正向构建。按顺序完成:
|
|
44
|
+
|
|
45
|
+
1. 定平台基调 + 加载题材风格包 → 先读 `references/submission-craft.md` 定投稿平台(知乎/小程序/番茄),正文视角、矛盾烈度、章末落点随之切换;再读 `references/genre-styles/{题材}.md`(核心 10 题材)+ 通用底座 `references/short-craft.md`,从招式库选 2-3 个核心招式(如追妻的白月光触发链 / 信物翻转 / 火葬场预告),写入 设定.md「题材招式」区,全程照此招式与腔调写
|
|
46
|
+
2. 设计反派(如有)→ 加载 `villain-and-reveal.md`
|
|
47
|
+
3. 确定揭露方式 → 同上
|
|
48
|
+
4. 编写 小节大纲.md(格式见 writing-workflow.md):短篇只做轻量蓝图,每节包含结构段/五段功能、人物/关系或其他状态变化、因果/逻辑链、结尾承接/钩子,不套长篇完整章节蓝图。**标出付费点卡在哪一节末**(见 `submission-craft.md`「付费点」:用未完成动作、身份/证据变化或两难选择形成真实断点);用反推法先想透付费点那一节,再倒排前后。每节可选一个任务卡点,但必须服务情绪升级、证据推进、关系撕裂、反转铺垫或反击动作;没有就不强补
|
|
49
|
+
5. 反转信息差验证(公式见 writing-workflow.md)
|
|
50
|
+
6. 伏笔回查清单(标准见 writing-workflow.md)
|
|
51
|
+
|
|
52
|
+
`设定.md` 必须包含以下机器可验收字段(内容本身也是后续写作依据,不是读文件回执):
|
|
53
|
+
|
|
54
|
+
```markdown
|
|
55
|
+
## Phase 2 设计校验
|
|
56
|
+
- 题材参考:`references/genre-styles/{题材}.md`(冷门题材写 `references/genre-writing-formulas.md`)
|
|
57
|
+
- 核心招式:{招式一};{招式二}[;{招式三}]
|
|
58
|
+
- 反派设计:不适用({原因})
|
|
59
|
+
- 反转类型:{身份/视角/动机/时间线/信息/认知/无反转}
|
|
60
|
+
- 反转位置:第 {X} 节 ÷ 共 {Y} 节 = {Z}%
|
|
61
|
+
- 付费点:第 {N} 节末
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
有反派时用 `villain-and-reveal.md` 的身份、动机、作恶方式、致命弱点、报应五字段替换“不适用”。`short-reversal.md` 判断确属无反转题材时,写 `反转类型:无反转` 和 `反转位置:不适用({报应兑现/甜度递进等原因})`,不要硬编节号。`小节大纲.md` 必须使用 `writing-workflow.md` 规定的固定 12 列 Markdown 表格,并在对应节末明确标出“付费点”。
|
|
65
|
+
|
|
66
|
+
#### Phase 2 完成门禁
|
|
67
|
+
|
|
68
|
+
两份文件生成后、向用户声明构思完成或进入 Phase 3 前,运行 `node scripts/check-phase2-contract.js --json {短篇目录}`:
|
|
69
|
+
|
|
70
|
+
- exit 0:Phase 2 机械契约通过,才可进入下一阶段;这不替代故事质量判断
|
|
71
|
+
- exit 1:只把 `repair_scope` 中的检查 ID、证据、期望、reference 路径和修复范围交给本轮 writer;只改失败字段,再运行同一命令
|
|
72
|
+
- 最多做 2 轮定向 repair;仍失败则停止并报告剩余检查 ID,不得声称 Phase 2 已完成
|
|
73
|
+
- exit 2、脚本缺失或不可执行:报告 verifier 不可用,不得用泛化“自检”替代后继续
|
|
74
|
+
|
|
75
|
+
#### Agent 调用:character-designer
|
|
76
|
+
|
|
77
|
+
设计任务完成后,如果项目已部署 character-designer agent(查找顺序见 [SKILL.md](../SKILL.md)),可 spawn `Agent(subagent_type: "character-designer", prompt: "项目目录:{dir}\n任务类型:角色设定\n查询参数:{人设速写+关系}")` 辅助角色设定和语言风格档案。如 agent 不可用,由主线程直接执行。
|
|
@@ -57,9 +57,9 @@
|
|
|
57
57
|
|
|
58
58
|
`设定.md` 写入 `## Phase 2 设计校验`,至少包含:一个真实的题材 reference 路径、2-3 个核心招式、反派五字段或带原因的不适用声明、反转类型、`反转位置:第 X 节 ÷ 共 Y 节 = Z%`、`付费点:第 N 节末`。`short-reversal.md` 判为无反转时,位置改写为带原因的“不适用”。付费点同时写入 `小节大纲.md` 对应节的“结尾承接/钩子”单元格。
|
|
59
59
|
|
|
60
|
-
生成两份文件后按
|
|
60
|
+
生成两份文件后按 `workflow-design.md` 的 Phase 2 完成门禁运行 `node scripts/check-phase2-contract.js --json {短篇目录}`。失败时只按 JSON 的 `repair_scope` 做最小修改并复验,不做无目标整稿重写。
|
|
61
61
|
|
|
62
|
-
###
|
|
62
|
+
### 写作前加载
|
|
63
63
|
|
|
64
64
|
- 必读:`short-format.md`(正文格式)+ `short-craft.md`(通用底座)
|
|
65
65
|
- 必读:`short-deslop.md`(写作时自检 AI 腔)
|
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
|
|
69
69
|
### 工作目录结构
|
|
70
70
|
|
|
71
|
-
工作目录结构见 [Phase 2:构思核心框架](../SKILL.md#phase-2构思核心框架)。设定.md 内容构成:核心框架 + 人设 + 反转铺垫 + 贯穿道具(含三次出现追踪表)+ 反派设计 + 对标摘要。小节大纲.md 每节 1 行,格式以 [设计任务(框架确定后执行)](
|
|
71
|
+
工作目录结构见 [Phase 2:构思核心框架](../SKILL.md#phase-2构思核心框架)。设定.md 内容构成:核心框架 + 人设 + 反转铺垫 + 贯穿道具(含三次出现追踪表)+ 反派设计 + 对标摘要。小节大纲.md 每节 1 行,格式以 [设计任务(框架确定后执行)](workflow-design.md#设计任务框架确定后执行) 第 4 步为准。
|
|
72
72
|
|
|
73
73
|
### 操作原则
|
|
74
74
|
|
|
@@ -120,12 +120,12 @@
|
|
|
120
120
|
|
|
121
121
|
### AI 腔
|
|
122
122
|
- [ ] 无禁止比喻:「命运的齿轮」「如潮水般」「仿佛春风」「心猛地一沉」「眼眶泛红」
|
|
123
|
-
- [ ]
|
|
123
|
+
- [ ] 重复的身体/情绪描写按功能取舍:无新增信息就删,不换部位或同义动作凑数
|
|
124
124
|
- [ ] 「像」使用频率:全文不超 10 处(含「像是」「不像」)
|
|
125
125
|
- [ ] 完整 AI 腔黑名单见 short-deslop.md
|
|
126
126
|
|
|
127
127
|
### 技法
|
|
128
|
-
- [ ]
|
|
128
|
+
- [ ] 情绪落地:按 `short-craft.md` 第 2 节检查上下文支撑,保留准确直写,清理空泛与重复说明
|
|
129
129
|
- [ ] 信物(若用):意义翻转是否完整?(查设定.md追踪表)
|
|
130
130
|
- [ ] 场景引擎:每节是否通过行动、证据、任务、对话、物件、等待或关系选择改变了至少一项状态?
|
|
131
131
|
- [ ] 开头密度:前 100 字事件 ≥ 3?
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
const fs = require('fs');
|
|
5
|
+
const { loadStyleWhitelist, maskStyleText } = require('./style-whitelist.js');
|
|
5
6
|
const path = require('path');
|
|
6
7
|
|
|
7
8
|
const USAGE = `Usage: node check-ai-patterns.js [--check] [--json] [--fail-on=blocking|all] <file...>
|
|
@@ -30,6 +31,7 @@ Detect high-risk AI-flavor prose patterns that need human rewrite:
|
|
|
30
31
|
- 章尾状态总结体 (文末窗口 这一夜注定/这一切都结束了/新的人生才刚刚开始/命运的齿轮)
|
|
31
32
|
- 引号强调滥用 (叙述里 1-4 字短词加引号强调,密度型)
|
|
32
33
|
|
|
34
|
+
Book-local .deslop-whitelist literal spans are excluded from style scanning (no regex or ancestor inheritance).
|
|
33
35
|
Each finding carries severity: blocking by default for generation/deslop cleanup (not-is-comparison / em-dash / voice-contrast / negation-parade / reverse-not-is / trailer-ending / trailer-summary). This is a local style/readability gate, not an AIGC detector score; functional human text can be marked for review instead of hard-edited for a detector.
|
|
34
36
|
或 advisory (period-stutter / long-paragraph / micro-action-tic / stock-reaction-tic / action-list-tic / abstract-summary-tic / cliche-density-tic / metaphor-density-tic / reasoning-chain-tic / system-notice-formality-tic / overcompressed-prose-tic / low-connective-density-tic / quote-emphasis-tic / formulaic-parallelism,是提示,justified 的长推理/氛围段可保留)。
|
|
35
37
|
--fail-on=blocking 只在出现 blocking finding 时退出 1;默认 --fail-on=all 有任何 finding 即退出 1。
|
|
@@ -308,7 +310,10 @@ for (const file of options.files) {
|
|
|
308
310
|
continue;
|
|
309
311
|
}
|
|
310
312
|
|
|
311
|
-
|
|
313
|
+
let whitelist;
|
|
314
|
+
try { whitelist = loadStyleWhitelist(fullPath); }
|
|
315
|
+
catch (error) { die(`${file}: unable to read .deslop-whitelist (${error.message})`); }
|
|
316
|
+
const findings = scanDocument(maskStyleText(input, whitelist)).map((finding) => ({ file, ...finding }));
|
|
312
317
|
allFindings.push(...findings);
|
|
313
318
|
}
|
|
314
319
|
|
|
@@ -43,6 +43,17 @@ const PLACEHOLDER_PATTERNS = [
|
|
|
43
43
|
{ re: /我(无法|不能)(继续(写|创作|生成|下去)|生成(内容|文本|正文)?|创作|续写|完成(这个|本)?(章|篇|创作|请求))/, label: '元信息泄漏(生成拒绝语)', hard: false },
|
|
44
44
|
];
|
|
45
45
|
|
|
46
|
+
const QUOTED_SPAN_PATTERNS = [
|
|
47
|
+
/「[^」]*」/g,
|
|
48
|
+
/『[^』]*』/g,
|
|
49
|
+
/【[^】]*】/g,
|
|
50
|
+
/“[^”]*”/g,
|
|
51
|
+
// 单引号须成对;词内撇号(don't、O’Connor)不作为开闭引号。
|
|
52
|
+
/(?<![A-Za-z0-9_])‘(?:[^’]|(?<=[A-Za-z0-9_])’(?=[A-Za-z0-9_]))*(?!(?<=[A-Za-z0-9_])’[A-Za-z0-9_])’/g,
|
|
53
|
+
/"[^"]*"/g,
|
|
54
|
+
/(?<![A-Za-z0-9_])'(?:[^']|(?<=[A-Za-z0-9_])'(?=[A-Za-z0-9_]))*(?!(?<=[A-Za-z0-9_])'[A-Za-z0-9_])'/g,
|
|
55
|
+
];
|
|
56
|
+
|
|
46
57
|
// 工程词泄漏(正文元信息扫描的确定性版):弱模型把写作工程词漏进正文,破坏代入感
|
|
47
58
|
// (DeepSeek-v4 这类会在对话里冒「该到下一章了」)。漏词的模型自己发现不了,靠脚本兜。
|
|
48
59
|
// tier1 = 纯写作流水线术语,正文里几乎永不合法;tier2 = 章节结构/歧义词,角色在故事内
|
|
@@ -150,21 +161,23 @@ function isContent(trimmed) {
|
|
|
150
161
|
return trimmed && !trimmed.startsWith('#') && !/^-{3,}$/.test(trimmed);
|
|
151
162
|
}
|
|
152
163
|
|
|
153
|
-
|
|
154
|
-
|
|
164
|
+
// 等长遮住成对引号内的内容以保留列号;未闭合引号不豁免。
|
|
165
|
+
function maskQuotedSpans(text) {
|
|
166
|
+
let masked = text;
|
|
167
|
+
for (const pattern of QUOTED_SPAN_PATTERNS) {
|
|
168
|
+
masked = masked.replace(pattern, (match) => ' '.repeat(match.length));
|
|
169
|
+
}
|
|
170
|
+
return masked;
|
|
155
171
|
}
|
|
156
172
|
|
|
157
173
|
// 去掉成对引号内的片段(台词/系统词/引用物件),只留引号外叙述。复读判定用:重复台词是体裁
|
|
158
174
|
// 手法(豁免),但「叙述 + 引号内物件/短台词」混合行里引号外叙述的复读仍是退化,不能整行豁免。
|
|
159
175
|
function stripQuoted(text) {
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
.replace(
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
.replace(/‘[^’]*’/g, '')
|
|
166
|
-
.replace(/"[^"]*"/g, '')
|
|
167
|
-
.replace(/'[^']*'/g, '');
|
|
176
|
+
let stripped = text;
|
|
177
|
+
for (const pattern of QUOTED_SPAN_PATTERNS) {
|
|
178
|
+
stripped = stripped.replace(pattern, '');
|
|
179
|
+
}
|
|
180
|
+
return stripped;
|
|
168
181
|
}
|
|
169
182
|
|
|
170
183
|
function visibleLength(text) {
|
|
@@ -253,18 +266,19 @@ function findPlaceholders(content) {
|
|
|
253
266
|
const findings = [];
|
|
254
267
|
for (const { trimmed, lineNo } of content) {
|
|
255
268
|
if (!isContent(trimmed)) continue;
|
|
256
|
-
const
|
|
269
|
+
const outsideQuotes = maskQuotedSpans(trimmed);
|
|
257
270
|
for (const { re, label, hard } of PLACEHOLDER_PATTERNS) {
|
|
258
|
-
|
|
259
|
-
const m = re.exec(trimmed);
|
|
271
|
+
// hard 信号仍扫描整行;soft 自指/拒绝语只扫描成对引号外,且遮罩等长以保留列号。
|
|
272
|
+
const m = re.exec(hard ? trimmed : outsideQuotes);
|
|
260
273
|
if (m) {
|
|
274
|
+
const index = m.index || 0;
|
|
261
275
|
findings.push({
|
|
262
276
|
line: lineNo,
|
|
263
|
-
column:
|
|
277
|
+
column: index + 1,
|
|
264
278
|
type: 'placeholder-leak',
|
|
265
279
|
severity: 'blocking',
|
|
266
280
|
message: `${label}:正文混入元信息/拒绝语/占位符,重写本段干净落地。`,
|
|
267
|
-
excerpt: compact(trimmed.slice(Math.max(0,
|
|
281
|
+
excerpt: compact(trimmed.slice(Math.max(0, index - 4), index + 20)),
|
|
268
282
|
});
|
|
269
283
|
break; // one finding per line is enough
|
|
270
284
|
}
|
|
@@ -283,17 +297,22 @@ function findMetaLeak(content) {
|
|
|
283
297
|
// 标题行(第N章 章名,无 ## 前缀时也算)属「标题行以外的正文」之外,排除
|
|
284
298
|
if (/^第[一二三四五六七八九十百千万两0-9]+章/.test(trimmed)) continue;
|
|
285
299
|
}
|
|
286
|
-
const
|
|
287
|
-
let m = META_TIER1_RE.exec(
|
|
300
|
+
const outsideQuotes = maskQuotedSpans(trimmed);
|
|
301
|
+
let m = META_TIER1_RE.exec(outsideQuotes);
|
|
302
|
+
let quotedTier1 = false;
|
|
303
|
+
if (!m) {
|
|
304
|
+
m = META_TIER1_RE.exec(trimmed);
|
|
305
|
+
quotedTier1 = Boolean(m);
|
|
306
|
+
}
|
|
288
307
|
if (m) {
|
|
289
308
|
// tier1 纯工程词正文里几乎永不合法→blocking;但写手/编剧题材里角色在故事内真讨论创作,
|
|
290
|
-
//
|
|
309
|
+
// 且命中实际位于成对引号内时可能合法,降级为 advisory。同一行别处出现引号不影响判定。
|
|
291
310
|
findings.push({
|
|
292
311
|
line: lineNo,
|
|
293
312
|
column: m.index + 1,
|
|
294
313
|
type: 'meta-leak',
|
|
295
|
-
severity:
|
|
296
|
-
message: `工程词泄漏:「${m[0]}」是写作流水线术语,正文里不该出现;改成角色/场景内表达。${
|
|
314
|
+
severity: quotedTier1 ? 'advisory' : 'blocking',
|
|
315
|
+
message: `工程词泄漏:「${m[0]}」是写作流水线术语,正文里不该出现;改成角色/场景内表达。${quotedTier1 ? '例外:角色为作者/编剧、在故事内真实讨论创作时,台词里可能合法。' : ''}`,
|
|
297
316
|
excerpt: compact(trimmed.slice(Math.max(0, m.index - 6), m.index + 18)),
|
|
298
317
|
});
|
|
299
318
|
continue; // tier1 命中即可,不再叠 tier2
|