@cloud411716/fancy-webnovel 1.0.46 → 3.0.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/client.js +369 -0
- package/cordis.patch.yml +4 -13
- package/docs/douyin-plugin.md +118 -0
- package/docs/material-library/README.md +404 -0
- package/docs/material-library/import.js +437 -0
- package/docs/material-library/prompt.md +370 -0
- package/docs/material-library/queries.surql +94 -0
- package/docs/material-library/sample.jsonl +14 -0
- package/docs/material-library/schema.surql +46 -0
- package/docs/mcp-profile.example.yml +24 -0
- package/docs/story-graph-design.md +602 -0
- package/docs/story-graph-validation.md +81 -0
- package/docs/workspace-mcp.md +284 -0
- package/index.js +26 -38
- package/lib/atomic-write.js +109 -0
- package/lib/chapter-order.js +100 -0
- package/lib/chinese-num.js +111 -0
- package/lib/confirmation.js +80 -0
- package/lib/db-init.js +123 -0
- package/lib/deployed-state.js +141 -0
- package/lib/direction-labels.js +265 -0
- package/lib/error-codes.js +104 -0
- package/lib/infra.js +594 -0
- package/lib/llm-wiki.js +109 -0
- package/lib/material-db.js +149 -0
- package/lib/path-guard.js +150 -0
- package/lib/projects.js +400 -0
- package/lib/scraper-utils.js +305 -0
- package/lib/surreal-server.js +338 -0
- package/lib/topic-decision.js +860 -0
- package/lib/topic-fields.js +251 -0
- package/lib/topic-schema.js +225 -0
- package/lib/workspace.js +501 -0
- package/package.json +62 -5
- package/plugins/fancy-analyze/analyze-definitions.md +519 -0
- package/plugins/fancy-analyze/command-input.js +65 -0
- package/plugins/fancy-analyze/index.js +2024 -0
- package/plugins/fancy-analyze/ingest-coverage.js +107 -0
- package/plugins/fancy-analyze/schema-analyze.md +627 -0
- package/plugins/fancy-analyze/schema-write.md +178 -0
- package/plugins/fancy-analyze/scripts/append-summary-chapter.js +612 -0
- package/plugins/fancy-analyze/scripts/split_source.js +292 -0
- package/plugins/fancy-analyze/summary-progress.js +495 -0
- package/plugins/fancy-analyze/templates.js +1179 -0
- package/plugins/fancy-bootstrap/index.js +313 -0
- package/plugins/fancy-bootstrap/scripts/init.js +177 -0
- package/plugins/fancy-bootstrap/scripts/path-utils.js +21 -0
- package/plugins/fancy-bootstrap/templates.js +71 -0
- package/plugins/fancy-db/index.js +172 -0
- package/plugins/fancy-douyin/deploy.js +134 -0
- package/plugins/fancy-douyin/index.js +551 -0
- package/plugins/fancy-douyin/prompts/01-analysis-prompt.md +84 -0
- package/plugins/fancy-douyin/scripts/crawl-note.cjs +194 -0
- package/plugins/fancy-douyin/scripts/lib.cjs +197 -0
- package/plugins/fancy-douyin/scripts/scan-account.cjs +128 -0
- package/plugins/fancy-douyin/scripts/start-chrome.cjs +203 -0
- package/plugins/fancy-douyin/state.js +197 -0
- package/plugins/fancy-douyin/templates.js +127 -0
- package/plugins/fancy-export/exporter.js +805 -0
- package/plugins/fancy-export/index.js +63 -0
- package/plugins/fancy-import/import-core.js +1118 -0
- package/plugins/fancy-import/import-driver.js +604 -0
- package/plugins/fancy-import/index.js +738 -0
- package/plugins/fancy-import/prompts/01-import-prompt.md +131 -0
- package/plugins/fancy-import/templates.js +58 -0
- package/plugins/fancy-material/exporter.js +153 -0
- package/plugins/fancy-material/genres.js +256 -0
- package/plugins/fancy-material/index.js +835 -0
- package/plugins/fancy-material/inventory.js +143 -0
- package/plugins/fancy-material/kinds.js +313 -0
- package/plugins/fancy-material/queue.js +55 -0
- package/plugins/fancy-material/scripts/query.js +254 -0
- package/plugins/fancy-material/templates.js +258 -0
- package/plugins/fancy-material/tool-deploy.js +138 -0
- package/plugins/fancy-material/validate.js +149 -0
- package/plugins/fancy-project/index.js +133 -0
- package/plugins/fancy-scan/existing-block.js +100 -0
- package/plugins/fancy-scan/index.js +708 -0
- package/plugins/fancy-scan/prompts/01-analysis-prompt.md +302 -0
- package/plugins/fancy-scan/scripts/append-block.js +725 -0
- package/plugins/fancy-scan/scripts/report-validate.js +824 -0
- package/plugins/fancy-scan/scripts/run-scan.js +667 -0
- package/plugins/fancy-scan/scripts/scrapers/fanqie-rank-scraper.js +923 -0
- package/plugins/fancy-scan/scripts/scrapers/jjwxc-rank-scraper.js +469 -0
- package/plugins/fancy-scan/scripts/scrapers/qimao-rank-scraper.js +629 -0
- package/plugins/fancy-scan/templates/blocks.js +155 -0
- package/plugins/fancy-scan/templates/platforms.js +372 -0
- package/plugins/fancy-scan/templates/report-schema.js +90 -0
- package/plugins/fancy-scan/templates.js +694 -0
- package/plugins/fancy-scan/tool-deploy.js +335 -0
- package/plugins/fancy-scan/wait-turn.js +46 -0
- package/plugins/fancy-story-builder/db/README.md +106 -0
- package/plugins/fancy-story-builder/db/client.js +228 -0
- package/plugins/fancy-story-builder/db/commands.js +145 -0
- package/plugins/fancy-story-builder/db/ids.js +39 -0
- package/plugins/fancy-story-builder/db/import.js +798 -0
- package/plugins/fancy-story-builder/db/project.js +299 -0
- package/plugins/fancy-story-builder/db/query.js +361 -0
- package/plugins/fancy-story-builder/db/schema.js +417 -0
- package/plugins/fancy-story-builder/db/stage-sync.js +238 -0
- package/plugins/fancy-story-builder/deploy-manifest.js +239 -0
- package/plugins/fancy-story-builder/deslop-driver.js +821 -0
- package/plugins/fancy-story-builder/flesh-output.js +168 -0
- package/plugins/fancy-story-builder/index.js +6861 -0
- package/plugins/fancy-story-builder/patch-driver.js +390 -0
- package/plugins/fancy-story-builder/prompts/01-skeleton-prompt.md +563 -0
- package/plugins/fancy-story-builder/prompts/02-flesh-prompt.md +602 -0
- package/plugins/fancy-story-builder/prompts/03-rhythm-prompt.md +539 -0
- package/plugins/fancy-story-builder/prompts/04-writing-prompt.md +225 -0
- package/plugins/fancy-story-builder/prompts/05-deslop-prompt.md +96 -0
- package/plugins/fancy-story-builder/purpose-template.md +83 -0
- package/plugins/fancy-story-builder/references/formulas-rhythm.json +302 -0
- package/plugins/fancy-story-builder/references/formulas-skeleton.json +402 -0
- package/plugins/fancy-story-builder/references/genre-profiles.json +3514 -0
- package/plugins/fancy-story-builder/references/glossary.md +594 -0
- package/plugins/fancy-story-builder/references/index.md +581 -0
- package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/00-index.md +174 -0
- package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/01-scene.md +150 -0
- package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/02-chapter-workflow.md +99 -0
- package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/03-opening-chapter.md +104 -0
- package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/04-dialogue-mastery.md +274 -0
- package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/05-genre-formulas.md +432 -0
- package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/06-tone-ensemble.md +259 -0
- package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/07-ledger-audit.md +222 -0
- package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/08-diagnosis-revision.md +205 -0
- package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/09-reading-power.md +135 -0
- package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/10-deslop.md +129 -0
- package/plugins/fancy-story-builder/references//350/212/202/345/245/217/346/214/207/345/257/274/00-index.md +98 -0
- package/plugins/fancy-story-builder/references//350/212/202/345/245/217/346/214/207/345/257/274/01-upgrade-rhythm.md +300 -0
- package/plugins/fancy-story-builder/references//350/212/202/345/245/217/346/214/207/345/257/274/02-arc-rhythm.md +168 -0
- package/plugins/fancy-story-builder/references//350/212/202/345/245/217/346/214/207/345/257/274/03-highpoint-hooks.md +189 -0
- package/plugins/fancy-story-builder/references//350/212/202/345/245/217/346/214/207/345/257/274/04-satisfaction.md +226 -0
- package/plugins/fancy-story-builder/references//350/212/202/345/245/217/346/214/207/345/257/274/05-foreshadow-density.md +195 -0
- package/plugins/fancy-story-builder/references//350/212/202/345/245/217/346/214/207/345/257/274/06-chapter-outline.md +226 -0
- package/plugins/fancy-story-builder/references//350/212/202/345/245/217/346/214/207/345/257/274/07-audit.md +181 -0
- package/plugins/fancy-story-builder/references//350/241/200/350/202/211/346/214/207/345/257/274/00-index.md +100 -0
- package/plugins/fancy-story-builder/references//350/241/200/350/202/211/346/214/207/345/257/274/01-character.md +243 -0
- package/plugins/fancy-story-builder/references//350/241/200/350/202/211/346/214/207/345/257/274/02-worldbuilding.md +245 -0
- package/plugins/fancy-story-builder/references//350/241/200/350/202/211/346/214/207/345/257/274/03-relations.md +185 -0
- package/plugins/fancy-story-builder/references//350/241/200/350/202/211/346/214/207/345/257/274/04-emotion-methods.md +286 -0
- package/plugins/fancy-story-builder/references//350/241/200/350/202/211/346/214/207/345/257/274/05-audit.md +187 -0
- package/plugins/fancy-story-builder/references//351/252/250/346/236/266/346/214/207/345/257/274/00-index.md +91 -0
- package/plugins/fancy-story-builder/references//351/252/250/346/236/266/346/214/207/345/257/274/01-positioning.md +209 -0
- package/plugins/fancy-story-builder/references//351/252/250/346/236/266/346/214/207/345/257/274/02-packaging.md +135 -0
- package/plugins/fancy-story-builder/references//351/252/250/346/236/266/346/214/207/345/257/274/03-entities.md +305 -0
- package/plugins/fancy-story-builder/references//351/252/250/346/236/266/346/214/207/345/257/274/04-conflict.md +328 -0
- package/plugins/fancy-story-builder/references//351/252/250/346/236/266/346/214/207/345/257/274/05-quota.md +187 -0
- package/plugins/fancy-story-builder/references//351/252/250/346/236/266/346/214/207/345/257/274/06-audit.md +160 -0
- package/plugins/fancy-story-builder/rhythm-output.js +140 -0
- package/plugins/fancy-story-builder/schema-setting.json +1100 -0
- package/plugins/fancy-story-builder/schema-setting.md +232 -0
- package/plugins/fancy-story-builder/scripts/ai-patterns.js +619 -0
- package/plugins/fancy-story-builder/scripts/brief-validate.js +164 -0
- package/plugins/fancy-story-builder/scripts/check-guide-compliance.js +289 -0
- package/plugins/fancy-story-builder/scripts/content-quality.js +416 -0
- package/plugins/fancy-story-builder/scripts/deslop-validate.js +143 -0
- package/plugins/fancy-story-builder/scripts/error-classes.js +112 -0
- package/plugins/fancy-story-builder/scripts/flesh-validate.js +1312 -0
- package/plugins/fancy-story-builder/scripts/formula-engine.js +112 -0
- package/plugins/fancy-story-builder/scripts/graph-utils.js +1484 -0
- package/plugins/fancy-story-builder/scripts/label-coverage.js +171 -0
- package/plugins/fancy-story-builder/scripts/prompt-drift-check.js +441 -0
- package/plugins/fancy-story-builder/scripts/reading-power.js +298 -0
- package/plugins/fancy-story-builder/scripts/reference-log.js +110 -0
- package/plugins/fancy-story-builder/scripts/rhythm-validate.js +1312 -0
- package/plugins/fancy-story-builder/scripts/schema-pages.js +2668 -0
- package/plugins/fancy-story-builder/scripts/semantic-lint.js +381 -0
- package/plugins/fancy-story-builder/scripts/skeleton-quota.js +145 -0
- package/plugins/fancy-story-builder/scripts/skeleton-validate.js +1973 -0
- package/plugins/fancy-story-builder/scripts/stage-batches.js +1405 -0
- package/plugins/fancy-story-builder/scripts/stage-contract.js +429 -0
- package/plugins/fancy-story-builder/scripts/story-artifacts.js +933 -0
- package/plugins/fancy-story-builder/scripts/upstream-query.js +198 -0
- package/plugins/fancy-story-builder/scripts/v2/baseline.js +112 -0
- package/plugins/fancy-story-builder/scripts/v2/cast.js +517 -0
- package/plugins/fancy-story-builder/scripts/v2/context.js +434 -0
- package/plugins/fancy-story-builder/scripts/v2/contracts.js +493 -0
- package/plugins/fancy-story-builder/scripts/v2/core.js +419 -0
- package/plugins/fancy-story-builder/scripts/v2/engine.js +1068 -0
- package/plugins/fancy-story-builder/scripts/v2/export-markdown.js +794 -0
- package/plugins/fancy-story-builder/scripts/v2/genre.js +195 -0
- package/plugins/fancy-story-builder/scripts/v2/knowledge.js +321 -0
- package/plugins/fancy-story-builder/scripts/v2/macro.js +409 -0
- package/plugins/fancy-story-builder/scripts/v2/manifest.js +538 -0
- package/plugins/fancy-story-builder/scripts/v2/migrate.js +137 -0
- package/plugins/fancy-story-builder/scripts/v2/prompts.js +1335 -0
- package/plugins/fancy-story-builder/scripts/v2/rhythm.js +618 -0
- package/plugins/fancy-story-builder/scripts/v2/scale.js +843 -0
- package/plugins/fancy-story-builder/scripts/v2/snapshot.js +121 -0
- package/plugins/fancy-story-builder/scripts/v2/stages.js +273 -0
- package/plugins/fancy-story-builder/scripts/v2/writing.js +216 -0
- package/plugins/fancy-story-builder/scripts/writing-rules.js +167 -0
- package/plugins/fancy-story-builder/scripts/writing-validate.js +682 -0
- package/plugins/fancy-story-builder/skeleton-output.js +199 -0
- package/plugins/fancy-story-builder/stage-driver.js +1049 -0
- package/plugins/fancy-story-builder/storydb/README.md +271 -0
- package/plugins/fancy-story-builder/storydb/cli.js +458 -0
- package/plugins/fancy-story-builder/storydb/client.js +351 -0
- package/plugins/fancy-story-builder/storydb/compile.js +452 -0
- package/plugins/fancy-story-builder/storydb/context.js +288 -0
- package/plugins/fancy-story-builder/storydb/definitions.js +699 -0
- package/plugins/fancy-story-builder/storydb/driver.js +106 -0
- package/plugins/fancy-story-builder/storydb/dsh-tools.js +313 -0
- package/plugins/fancy-story-builder/storydb/export.js +175 -0
- package/plugins/fancy-story-builder/storydb/ids.js +31 -0
- package/plugins/fancy-story-builder/storydb/impact.js +170 -0
- package/plugins/fancy-story-builder/storydb/import.js +559 -0
- package/plugins/fancy-story-builder/storydb/mcp.js +99 -0
- package/plugins/fancy-story-builder/storydb/prompts.js +952 -0
- package/plugins/fancy-story-builder/storydb/stage-command.js +379 -0
- package/plugins/fancy-story-builder/storydb/stage.js +426 -0
- package/plugins/fancy-story-builder/storydb/store.js +891 -0
- package/plugins/fancy-story-builder/storydb/tools.js +592 -0
- package/plugins/fancy-story-builder/storydb/validation.js +183 -0
- package/plugins/fancy-story-builder/templates/v2/10-scale/scale-template.json +144 -0
- package/plugins/fancy-story-builder/templates/v2/20-macro/emotion-template.json +15 -0
- package/plugins/fancy-story-builder/templates/v2/20-macro/endings-template.json +16 -0
- package/plugins/fancy-story-builder/templates/v2/20-macro/lines-template.json +28 -0
- package/plugins/fancy-story-builder/templates/v2/20-macro/roles-template.json +10 -0
- package/plugins/fancy-story-builder/templates/v2/20-macro/story-template.json +19 -0
- package/plugins/fancy-story-builder/templates/v2/20-macro/volumes-template.json +24 -0
- package/plugins/fancy-story-builder/templates/v2/20-macro/world-template.json +24 -0
- package/plugins/fancy-story-builder/templates/v2/30-cast/characters-template.json +49 -0
- package/plugins/fancy-story-builder/templates/v2/30-cast/climaxes-template.json +14 -0
- package/plugins/fancy-story-builder/templates/v2/30-cast/conflicts-template.json +30 -0
- package/plugins/fancy-story-builder/templates/v2/30-cast/factions-template.json +18 -0
- package/plugins/fancy-story-builder/templates/v2/30-cast/foreshadows-template.json +29 -0
- package/plugins/fancy-story-builder/templates/v2/30-cast/information-template.json +29 -0
- package/plugins/fancy-story-builder/templates/v2/30-cast/items-template.json +13 -0
- package/plugins/fancy-story-builder/templates/v2/30-cast/locations-template.json +12 -0
- package/plugins/fancy-story-builder/templates/v2/30-cast/payoffs-template.json +16 -0
- package/plugins/fancy-story-builder/templates/v2/30-cast/relations-template.json +44 -0
- package/plugins/fancy-story-builder/templates/v2/40-rhythm/chapter-map-template.json +81 -0
- package/plugins/fancy-story-builder/templates/v2/40-rhythm/outline-template.json +162 -0
- package/plugins/fancy-story-builder/templates/v2/50-writing/ledger-template.json +46 -0
- package/plugins/fancy-story-builder/templates/v2/60-deslop/report-template.json +10 -0
- package/plugins/fancy-story-builder/templates//350/212/202/345/245/217//346/227/266/345/272/217/346/230/240/345/260/204/346/250/241/346/235/277.json +427 -0
- package/plugins/fancy-story-builder/templates//350/212/202/345/245/217//347/253/240/350/212/202/347/273/206/347/272/262/346/250/241/346/235/277.json +34 -0
- package/plugins/fancy-story-builder/templates//350/212/202/345/245/217//347/253/240/350/212/202/350/247/204/345/210/222/346/250/241/346/235/277.json +24 -0
- package/plugins/fancy-story-builder/templates//350/212/202/345/245/217//350/212/202/345/245/217/345/217/202/346/225/260/346/250/241/346/235/277.json +27 -0
- package/plugins/fancy-story-builder/templates//350/241/200/350/202/211//344/270/226/347/225/214/350/247/202/350/247/204/345/210/231/346/250/241/346/235/277.json +168 -0
- package/plugins/fancy-story-builder/templates//350/241/200/350/202/211//345/205/263/351/224/256/351/201/223/345/205/267/346/250/241/346/235/277.json +184 -0
- package/plugins/fancy-story-builder/templates//350/241/200/350/202/211//345/205/266/344/273/226/345/256/236/344/275/223/346/250/241/346/235/277.json +62 -0
- package/plugins/fancy-story-builder/templates//350/241/200/350/202/211//345/206/262/347/252/201/346/250/241/346/235/277.json +131 -0
- package/plugins/fancy-story-builder/templates//350/241/200/350/202/211//345/211/247/346/203/205/346/250/241/346/235/277.json +85 -0
- package/plugins/fancy-story-builder/templates//350/241/200/350/202/211//345/212/277/345/212/233/346/250/241/346/235/277.json +103 -0
- package/plugins/fancy-story-builder/templates//350/241/200/350/202/211//345/234/260/347/202/271/346/250/241/346/235/277.json +68 -0
- package/plugins/fancy-story-builder/templates//350/241/200/350/202/211//347/273/223/345/261/200/346/250/241/346/235/277.json +142 -0
- package/plugins/fancy-story-builder/templates//350/241/200/350/202/211//350/247/222/350/211/262/346/250/241/346/235/277.json +292 -0
- package/plugins/fancy-story-builder/templates//351/252/250/346/236/266//345/205/263/347/263/273/346/250/241/346/235/277.json +266 -0
- package/plugins/fancy-story-builder/templates//351/252/250/346/236/266//345/256/236/344/275/223/346/250/241/346/235/277.json +336 -0
- package/plugins/fancy-story-builder/templates//351/252/250/346/236/266//345/261/202/347/272/247/346/250/241/346/235/277.json +65 -0
- package/plugins/fancy-story-builder/templates//351/252/250/346/236/266//346/241/206/346/236/266/346/250/241/346/235/277.json +308 -0
- package/plugins/fancy-story-builder/templates.js +1446 -0
- package/plugins/fancy-story-builder/wiki-references.js +540 -0
- package/plugins/fancy-story-builder/writing-driver.js +1388 -0
- package/plugins/fancy-topic/index.js +1057 -0
- package/plugins/fancy-topic/prompts/01-exploration-prompt.md +115 -0
- package/plugins/fancy-topic/scripts/save-suggestion.js +219 -0
- package/plugins/fancy-topic/scripts/select-topic.js +317 -0
- package/plugins/fancy-topic/templates.js +476 -0
- package/plugins/fancy-topic/tool-deploy.js +200 -0
- package/commands/bootstrap/index.js +0 -164
- package/commands/bootstrap/init-project.js +0 -121
- package/commands/scan/index.js +0 -283
- package/commands/scan/platforms/fanqie.js +0 -146
- package/commands/scan/platforms/jinjiang.js +0 -143
- package/commands/scan/platforms/qidian.js +0 -102
- package/commands/scan/platforms/qimao.js +0 -127
- package/commands/scan/scraper.js +0 -195
- package/infra.js +0 -160
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
# 矛盾与结构
|
|
2
|
+
|
|
3
|
+
> 骨架阶段第 4 份。在实体格局基础上,建主线矛盾、双线、死亡赌注、黏结剂。
|
|
4
|
+
> 本文件只讲方法论,不讲数量(→ formulas),不讲结构(→ 模板),不讲验证(→ 脚本)。
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 一、决策路由
|
|
9
|
+
|
|
10
|
+
| 你在设计什么 | 用哪节 |
|
|
11
|
+
|---|---|
|
|
12
|
+
| 确定主线矛盾 | §2 矛盾设计 |
|
|
13
|
+
| 搭建主线结构 | §3 结构方法 |
|
|
14
|
+
| 设计冲突 | §4 冲突设计 |
|
|
15
|
+
| 设计对抗 | §5 对抗设计 |
|
|
16
|
+
| 设计循环/核心梗 | §6 循环设计 |
|
|
17
|
+
| 设计动机/困境 | §7 动机与困境 |
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## 二、矛盾设计
|
|
22
|
+
|
|
23
|
+
### 2.1 矛盾四重递进(可裁剪)
|
|
24
|
+
|
|
25
|
+
按顺序递进:人与自我 → 人与自然 → 人与人 → 人与世界。
|
|
26
|
+
|
|
27
|
+
裁剪规则:
|
|
28
|
+
- 言情/职场/宅斗:跳过"人与自然",用"人与自我 → 人与人 → 人与世界"
|
|
29
|
+
- 末世/灾难:用"人与自然 → 人与人 → 人与世界"
|
|
30
|
+
- 悬疑/推理:用"人与自我 → 人与人"(世界层可选)
|
|
31
|
+
- 正剧/历史:四层全用
|
|
32
|
+
|
|
33
|
+
### 2.2 底层矛盾建设世界
|
|
34
|
+
|
|
35
|
+
从最根源、最不可调和的矛盾开始架设世界观。确保核心梗不偏离,否则中期订阅下降。
|
|
36
|
+
|
|
37
|
+
示例:修行者每突破一境消耗一座灵矿,灵矿不可再生 → 高阶修行者必须争夺低阶修行者的灵矿 → 宗门战争的根本动机。这能推导出至少三个具体冲突。
|
|
38
|
+
|
|
39
|
+
**判断标准**:世界本质必须能推导出至少三个具体冲突。写不出 = 世界本质太虚。
|
|
40
|
+
|
|
41
|
+
### 2.3 三种动机来源
|
|
42
|
+
|
|
43
|
+
| 来源 | 操作方式 |
|
|
44
|
+
|---|---|
|
|
45
|
+
| 世界背景 | 设定环境迫使主角变强(妖魔乱世 → 没实力就没自保之力) |
|
|
46
|
+
| 金手指 | 利用金手指机制产生利益驱动(斩妖获得实力) |
|
|
47
|
+
| 人物关系 | 通过亲朋遭遇制造情感驱动(被欺负/被杀 → 复仇/救人) |
|
|
48
|
+
|
|
49
|
+
主角至少占两种动机来源。
|
|
50
|
+
|
|
51
|
+
### 2.4 动机变化过渡
|
|
52
|
+
|
|
53
|
+
- 危机解除后,立即通过配角/反派强调"更强力量才能生存",自然过渡到下一阶段
|
|
54
|
+
- 生死危机不适合所有题材——调整困难烈度匹配题材边界
|
|
55
|
+
- 上一个危机解决时必须埋下下一个危机的伏笔
|
|
56
|
+
|
|
57
|
+
### 2.5 矛盾来源分类
|
|
58
|
+
|
|
59
|
+
| 来源 | 适用场景 |
|
|
60
|
+
|---|---|
|
|
61
|
+
| 资源/利益 | 通用 |
|
|
62
|
+
| 阵营/种族 | 奇幻、玄幻 |
|
|
63
|
+
| 超凡途径 | 诡秘类 |
|
|
64
|
+
| 信仰/宗教 | 西幻、历史 |
|
|
65
|
+
| 政教之争 | 中世纪、权谋 |
|
|
66
|
+
| 理念/三观 | 所有题材 |
|
|
67
|
+
|
|
68
|
+
### 2.6 死亡赌注(贯穿全书选一种)
|
|
69
|
+
|
|
70
|
+
| 赌注类型 | 适用场景 | 操作要点 |
|
|
71
|
+
|---|---|---|
|
|
72
|
+
| 肉体死亡 | 恐怖诡异文 | 主角过强时赌注必须转为事业死亡,否则全书崩溃 |
|
|
73
|
+
| 事业死亡 | 职场竞争、修仙门派争斗 | 失败 = 一切归零 |
|
|
74
|
+
| 心理死亡 | 感情崩塌、信念毁灭 | 情绪冲击最深,优先用于感情线 |
|
|
75
|
+
|
|
76
|
+
选一种作为主要赌注贯穿全书,其他辅助推动情节。
|
|
77
|
+
|
|
78
|
+
### 2.7 黏结剂(对立双方无法轻易脱身)
|
|
79
|
+
|
|
80
|
+
四种黏结剂:
|
|
81
|
+
- **杀人理由**:序列唯一性必然冲突
|
|
82
|
+
- **工作职责**:职责所在,不能退出
|
|
83
|
+
- **道德责任**:亲人遇险,无法撒手
|
|
84
|
+
- **实体场所**:副本密室,被困一处
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## 三、结构方法
|
|
89
|
+
|
|
90
|
+
### 3.1 高潮逆推法
|
|
91
|
+
|
|
92
|
+
步骤:
|
|
93
|
+
1. 先确定一句话结局
|
|
94
|
+
2. 从结局逆推各级目标,层级由小到大:家庭 → 村 → 镇 → 县 → 市 → 省 → 国 → 世界
|
|
95
|
+
3. 大主线拆为中主线,中主线拆为小主线,不断细化
|
|
96
|
+
4. 小主线完成后,中主线变为新的小主线,循环推进
|
|
97
|
+
|
|
98
|
+
逆推方向:结局 → 最后一战 → 决战前需要什么 → 需要什么资源/盟友/能力 → 逐个拆解
|
|
99
|
+
|
|
100
|
+
### 3.2 主线 = 冲突驱动
|
|
101
|
+
|
|
102
|
+
主线故事 = 解决冲突。将大冲突拆分为多个小冲突形成故事线。每个阶段必须有一个无法解决的核心冲突。
|
|
103
|
+
|
|
104
|
+
### 3.3 支线 = 完成主线的手段
|
|
105
|
+
|
|
106
|
+
按此逻辑组织支线:赚钱(主线)→ 怎么赚(支线)→ 用什么赚(金手指确认)。支线最终必须汇聚为主线。
|
|
107
|
+
|
|
108
|
+
### 3.4 双线结构法
|
|
109
|
+
|
|
110
|
+
明线与暗线:
|
|
111
|
+
- **明线**:主角线(读者直接看到的行动和成长)
|
|
112
|
+
- **暗线**:反派线/隐藏元素线(目的:衔接、铺垫、嵌套后续剧情)
|
|
113
|
+
- 暗线后期必须与明线交汇,形成卷内高潮
|
|
114
|
+
|
|
115
|
+
四象限结构:
|
|
116
|
+
|
|
117
|
+
| | 明线 | 暗线 |
|
|
118
|
+
|--|------|------|
|
|
119
|
+
| 主线 | 主角能力升级+核心剧情推进 | 反派暗中行动/隐藏信息线 |
|
|
120
|
+
| 支线 | 资源线、人脉线、地位线 | 配角暗线 |
|
|
121
|
+
|
|
122
|
+
性价比最高的结构:明线有主线+支线("二带一"),暗线只有主线。
|
|
123
|
+
高潮阶段:暗线与明线融合,支线融合到主线或暂时放下。
|
|
124
|
+
|
|
125
|
+
**注**:AB 交织法(升级线 + 剧情线交织)属于节奏阶段,不在骨架阶段展开。
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## 四、冲突设计
|
|
130
|
+
|
|
131
|
+
### 4.1 设门槛拉长剧情法
|
|
132
|
+
|
|
133
|
+
| 门槛类型 | 操作方式 |
|
|
134
|
+
|---|---|
|
|
135
|
+
| 系统门槛 | 第一次免费升级,第二次需要资源,后续分普通/超级两档 |
|
|
136
|
+
| 目标门槛 | 考进顶级院校需要气血值+灭杀战绩+比赛排名,逐个完成 |
|
|
137
|
+
| 收集门槛 | 突破境界需要收集多个物品,逐个寻找 |
|
|
138
|
+
| 消耗门槛 | 资源太多时提高门槛消耗掉 |
|
|
139
|
+
|
|
140
|
+
### 4.2 三大驱动力反推剧情法
|
|
141
|
+
|
|
142
|
+
| 驱动力 | 操作方式 |
|
|
143
|
+
|---|---|
|
|
144
|
+
| 戏剧性 | 设计意外收获、阴差阳错 |
|
|
145
|
+
| 矛盾 | 设计无法避免的冲突/灾难 |
|
|
146
|
+
| 欲望/恐惧 | 利用想得到什么/害怕失去什么 |
|
|
147
|
+
|
|
148
|
+
操作步骤:先确定主角阶段性成长(金手指升级/武力提升/CP 好感/宝具/大佬人脉/金钱/地位),给每个成长尝试三种驱动力反设计剧情。
|
|
149
|
+
|
|
150
|
+
### 4.3 冲突设计要点
|
|
151
|
+
|
|
152
|
+
- 冲突必须升级:言语 → 行动 → 激烈对抗 → 决定胜负
|
|
153
|
+
- 冲突必须有明确结果
|
|
154
|
+
- 本质是"有人阻止主角得到他想要的东西"
|
|
155
|
+
- **矛盾 vs 冲突**:矛盾是一级结构(全书/全卷层面),冲突是二级结构(具体场景层面)。矛盾决定主线方向,冲突是具体表现
|
|
156
|
+
|
|
157
|
+
### 4.4 第一幕陷阱
|
|
158
|
+
|
|
159
|
+
主角在解决第一个冲突的过程中,为导致下一个冲突爆发而埋伏笔。功能:让故事自然衔接。
|
|
160
|
+
|
|
161
|
+
### 4.5 超额收获技巧
|
|
162
|
+
|
|
163
|
+
经典模式:Boss 爆三样东西——1. 主角接着就能用的;2. 可以送人拉关系的;3. 暂时用不到但一看就很厉害的。
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## 五、对抗设计
|
|
168
|
+
|
|
169
|
+
### 5.1 压势不压人
|
|
170
|
+
|
|
171
|
+
反派不针对主角个人,而是针对一个地区/阶层/群体的规划,客观上导致主角陷入困境。
|
|
172
|
+
|
|
173
|
+
操作步骤:
|
|
174
|
+
1. 给反派设定自己的目的(如打压某地区修行者)
|
|
175
|
+
2. 让主角身处被压迫环境
|
|
176
|
+
3. 主角推翻反派后,底层人依旧麻木
|
|
177
|
+
4. 底层人也可能利用主角善意攫取利益 → 新冲突
|
|
178
|
+
|
|
179
|
+
避免读者憋屈:给一个被帮者的正面反馈,或给主角一个私人收获(不让主角白干)。
|
|
180
|
+
|
|
181
|
+
### 5.2 反派视角与信息差
|
|
182
|
+
|
|
183
|
+
功能:转视角到反派密谋,制造读者知道而主角不知道的信息差:深化反派人设、拉期待感、让读者期待反派被打脸。
|
|
184
|
+
|
|
185
|
+
写法:不要谜语人——大大方方写出反派计划。信息差 = 提前让读者知道部分信息,制造期待。
|
|
186
|
+
|
|
187
|
+
### 5.3 主角行动力三维度
|
|
188
|
+
|
|
189
|
+
| 维度 | 含义 | 示例 |
|
|
190
|
+
|---|---|---|
|
|
191
|
+
| 做别人不敢做的事 | 反抗权威,挑战强者 | 斩上司 |
|
|
192
|
+
| 做别人做不到的事 | 死里逃生,超越极限 | 必死局面生还 |
|
|
193
|
+
| 做别人没想到可以这么做的事 | 阴差阳错,曲线救国 | 用烤肠秘籍凑收藏 |
|
|
194
|
+
|
|
195
|
+
戏剧性是展现行动力的方法,人设是行动的缘由。不能为了意外崩人设。
|
|
196
|
+
|
|
197
|
+
### 5.4 逼格反应正反判定
|
|
198
|
+
|
|
199
|
+
| 情况 | 判定 |
|
|
200
|
+
|---|---|
|
|
201
|
+
| 高实力轻描淡写 | 对 |
|
|
202
|
+
| 高实力暴怒反击 | 掉逼格 |
|
|
203
|
+
| 低实力隐忍蓄力 | 对 |
|
|
204
|
+
| 低实力轻描淡写 | 装逼过度,需铺垫 |
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
## 六、循环设计
|
|
209
|
+
|
|
210
|
+
### 6.1 循环设计
|
|
211
|
+
|
|
212
|
+
核心创意点 → 挖掘核心卖点 → 定主线 → 金手指配合主线衍生。
|
|
213
|
+
|
|
214
|
+
### 6.2 核心梗三分法
|
|
215
|
+
|
|
216
|
+
核心梗的分类见 `01-positioning.md` §6。这里补充运行节奏:
|
|
217
|
+
|
|
218
|
+
- **第一个一级结构中必须运行一次核心梗**(或完成首次铺垫)
|
|
219
|
+
- 连续多个一级结构不运行 = 读者弃书
|
|
220
|
+
- **双线构思法**:布两条线——一条重复运行核心梗,另一条不重复,交替推进
|
|
221
|
+
|
|
222
|
+
### 6.3 按题材设计循环核心
|
|
223
|
+
|
|
224
|
+
| 题材 | 循环核心 | 持续条件 |
|
|
225
|
+
|---|---|---|
|
|
226
|
+
| 肝熟练度/低位开局 | 地图(训练场/地头蛇/破坏者) | 地图不崩 |
|
|
227
|
+
| 长生 | 社会变迁 | 社会一直在变 |
|
|
228
|
+
| 无限游戏 | 副本与现实 | 副本现实不崩 |
|
|
229
|
+
| 公路文 | 人际交往 | 人物不崩 |
|
|
230
|
+
| 无敌流 | 敌人 | 敌人不崩 |
|
|
231
|
+
| 种田/签到/囤积 | 外部环境破坏 | 外部持续被破坏 |
|
|
232
|
+
| 脑洞文 | 核心卖点循环 | 核心卖点不偏 |
|
|
233
|
+
|
|
234
|
+
警告:循环偏离核心卖点 = 失去差异化竞争力。
|
|
235
|
+
|
|
236
|
+
---
|
|
237
|
+
|
|
238
|
+
## 七、动机与困境
|
|
239
|
+
|
|
240
|
+
### 7.1 给人物一个梦想
|
|
241
|
+
|
|
242
|
+
| 概念 | 特征 | 示例 |
|
|
243
|
+
|---|---|---|
|
|
244
|
+
| 动机 | 外力推动,趋向物质 | 因为穷 → 想买大房子 |
|
|
245
|
+
| 梦想 | 内在驱动,追求精神 | 想当伟大的作家 |
|
|
246
|
+
|
|
247
|
+
操作:除了外在压迫/利益驱动,再给人物一个"梦想"。两个层次结合,人物自然鲜活。
|
|
248
|
+
|
|
249
|
+
人物目标必须结合人设——杂役弟子梦想拯救宗门缺乏说服力,宗门圣女拯救宗门就合理。
|
|
250
|
+
|
|
251
|
+
### 7.2 困境循环结构(极道流)
|
|
252
|
+
|
|
253
|
+
```
|
|
254
|
+
困境(环境压迫)→ 行动(运行金手指)→ 转折(更大困境)→ 行动(更强实力突围)
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
核心:不停给主角上强度,主角始终主动解决问题。搭配扮猪吃虎 + 情绪拉扯 + 装逼打脸。
|
|
258
|
+
|
|
259
|
+
要点:压迫有度,让读者觉得主角有破局希望;后期压力必须高于前期。
|
|
260
|
+
|
|
261
|
+
### 7.3 设定推演剧情法
|
|
262
|
+
|
|
263
|
+
核心公式:环境 + 人物 = 情节。
|
|
264
|
+
|
|
265
|
+
步骤:
|
|
266
|
+
1. 给出环境(时间/地点/情境)
|
|
267
|
+
2. 给出人物(身份/关系/动机/弱点/梦想/过往)
|
|
268
|
+
3. 每增加一个设定点,扮演法做逻辑推演
|
|
269
|
+
4. 筛选最符合核心情绪的设定组合
|
|
270
|
+
|
|
271
|
+
### 7.4 噱头-主线-核心爽点框架
|
|
272
|
+
|
|
273
|
+
| 类型 | 特点 | 开篇写法 |
|
|
274
|
+
|---|---|---|
|
|
275
|
+
| 事件噱头 | 书名就是事件 | 一上来就进入事件(可与黄金五章并行) |
|
|
276
|
+
| 金手指噱头 | 分布在全文,前期多后期少 | 先描写主角 → 困境 → 目标 → 金手指施展 → 少许成果 |
|
|
277
|
+
| 人设噱头 | 人设直接影响剧情 | 人设本身产生戏剧性 |
|
|
278
|
+
|
|
279
|
+
事件结束后立马嫁接主角目标。也可以在事件进行中就铺垫目标。
|
|
280
|
+
核心爽点 = 切在主线上的爽点。偏离主线的装逼是偏移爽点,不是核心爽点。
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
## 八、示例
|
|
285
|
+
|
|
286
|
+
一本都市复仇文的矛盾设计:
|
|
287
|
+
|
|
288
|
+
- **矛盾四重**:人与自我(主角是否要跨越法律)→ 人与人(主角 vs 园区)→ 人与世界(个人复仇 vs 法治秩序)
|
|
289
|
+
- **底层矛盾**:缅北园区的电诈利润支撑当地军阀,军阀又反过来保护园区 → 无法通过正常渠道瓦解
|
|
290
|
+
- **三种动机来源**:世界背景(园区的存在本身就是犯罪)+ 人物关系(妹妹被害)
|
|
291
|
+
- **死亡赌注**:事业死亡(主角如果不复仇,他会一生无法原谅自己)
|
|
292
|
+
- **黏结剂**:道德责任(妹妹的尸骨在园区里)
|
|
293
|
+
|
|
294
|
+
---
|
|
295
|
+
|
|
296
|
+
## 九、常见反例
|
|
297
|
+
|
|
298
|
+
| 反例 | 为什么错 | 正确做法 |
|
|
299
|
+
|---|---|---|
|
|
300
|
+
| 矛盾只到"人与人" | 层次单一,深度不够 | 按题材裁剪,至少到"人与自我" |
|
|
301
|
+
| 世界本质写"弱肉强食" | 空话,推导不出具体冲突 | 写具体规则("灵矿不可再生") |
|
|
302
|
+
| 死亡赌注每次换 | 读者感受不到真正的威胁 | 全书贯穿一种 |
|
|
303
|
+
| 黏结剂缺失 | 对立双方随时可以退出 | 补一种黏结剂 |
|
|
304
|
+
| 反派没有独立目的 | 反派成为工具人 | 给反派设定自己的目标 |
|
|
305
|
+
| 压人而非压势 | 读者憋屈 | 压势不压人 |
|
|
306
|
+
|
|
307
|
+
---
|
|
308
|
+
|
|
309
|
+
## 十、与其他文件的关系
|
|
310
|
+
|
|
311
|
+
| 本文件输出 | 落到哪个字段 | 参考哪个公式 | 由哪个脚本验证 |
|
|
312
|
+
|---|---|---|---|
|
|
313
|
+
| 核心冲突 | `实体.json` 的 `conflicts`(type = 核心) | `fixed.conflict_elements.core_conflict_count`(固定 1) | `skeleton-validate.js` 的 `QUANTITY_MISMATCH`(warning) |
|
|
314
|
+
| 阶段/交织冲突 | `实体.json` 的 `conflicts` | `conflict_elements.phase_conflict_count` / `conflict_elements.branch_conflict_count` | 同上 |
|
|
315
|
+
| 冲突参与方 | `关系.json` 的 `conflict_participants` | 无公式 | `skeleton-validate.js` 的 `SKELETON_REF_MISSING` |
|
|
316
|
+
| 势力间矛盾 | `关系.json` 的 `faction_relations` | `faction_elements.faction_relation_count`(理论上限) | `G_REL_ONE_WAY` / `G_REL_ASYMMETRIC` |
|
|
317
|
+
| 双线结构 | 不落入骨架 JSON(属于血肉阶段的"冲突内容") | 无公式 | 无 |
|
|
318
|
+
| 死亡赌注 / 黏结剂 | 不落入骨架 JSON(属于血肉阶段的内容描述) | 无公式 | 无 |
|
|
319
|
+
| 反派四层 | `实体.json` 的 `characters`(type 用 `贯穿级核心反派` / `卷级反派`) | `character_elements.core_antagonist_count` / `volume_antagonist_count` | `QUANTITY_MISMATCH`(warning) |
|
|
320
|
+
|
|
321
|
+
---
|
|
322
|
+
|
|
323
|
+
## 十一、版本记录
|
|
324
|
+
|
|
325
|
+
| 版本 | 变更 |
|
|
326
|
+
|---|---|
|
|
327
|
+
| v1.0 | 从原 01-05 §1-2 精简。删除"AB 交织法"(移到节奏阶段);删除"感情线四阶段"(比例属于节奏阶段);删除"救赎文八法"(属血肉阶段的细化,不在骨架展开);删除所有检查清单;新增"与其他文件的关系"节 |
|
|
328
|
+
| v1.1 | 按合规检查修订:§2.2 "至少 3 个具体冲突" → "至少三个具体冲突";"推导出至少 3 个" → "推导出至少三个" |
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
# 数量决策
|
|
2
|
+
|
|
3
|
+
> 骨架阶段第 5 份。在公式区间内选定各实体数量。
|
|
4
|
+
> 本文件只讲"怎么选",不写"区间是多少"(→ `formulas-skeleton.json`),不写"JSON 怎么写"(→ `模板/骨架/框架模板.json`)。
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 一、决策路由
|
|
9
|
+
|
|
10
|
+
| 你在做什么 | 用哪节 |
|
|
11
|
+
|---|---|
|
|
12
|
+
| 理解数量从哪来 | §2 数量来源 |
|
|
13
|
+
| 在区间内选终值 | §3 选值原则 |
|
|
14
|
+
| 偏离区间时写理由 | §4 偏离记录 |
|
|
15
|
+
| 检查 derivations 完整性 | §5 完整性要求 |
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## 二、数量来源
|
|
20
|
+
|
|
21
|
+
所有数量的**区间**由 `references/formulas-skeleton.json` 定义。每条公式有:
|
|
22
|
+
- `formula`:公式文本
|
|
23
|
+
- `expr_low` / `expr_high`:区间上下界
|
|
24
|
+
- `applies_to_field`:管哪个 JSON 字段
|
|
25
|
+
- `note`:为什么是这个区间
|
|
26
|
+
|
|
27
|
+
**你要做的不是"算公式"**(脚本会算),**而是"在区间内选一个终值"**,并在 `derivations` 中记录。
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## 三、选值原则
|
|
32
|
+
|
|
33
|
+
### 3.1 选值区间
|
|
34
|
+
|
|
35
|
+
每个字段都有 `[low, high]` 区间。你需要在区间内选一个整数(或指定的小数)。
|
|
36
|
+
|
|
37
|
+
- **短篇(T 小)**:倾向选下界,避免实体过多
|
|
38
|
+
- **长篇(T 大)**:倾向选中间,保证有足够多样性
|
|
39
|
+
- **超长篇(T 超大)**:倾向选接近上界但不超过绝对上限
|
|
40
|
+
|
|
41
|
+
### 3.2 核心实体优先
|
|
42
|
+
|
|
43
|
+
某些实体是"骨架必须有"的,选值时优先保证它们:
|
|
44
|
+
- 主角:必须有 1 个
|
|
45
|
+
- 核心冲突:固定 1 个
|
|
46
|
+
- 主线:固定 1 条
|
|
47
|
+
- 全书级结局:必须有 1 个
|
|
48
|
+
|
|
49
|
+
其他实体(配角/反派/支线/道具/伏笔/高潮/爽点/地点)可以在区间内灵活选。
|
|
50
|
+
|
|
51
|
+
### 3.3 相互依赖关系
|
|
52
|
+
|
|
53
|
+
部分字段之间有依赖关系(公式里的 `V` 依赖 `volume_count`,`BC` 依赖 `branch_count`):
|
|
54
|
+
- **先选 Level 1 字段**(只依赖 T 或固定值)
|
|
55
|
+
- **再选 Level 2 字段**(依赖 V)
|
|
56
|
+
- **最后选 Level 3 字段**(依赖其他实体数)
|
|
57
|
+
|
|
58
|
+
**顺序错乱会导致依赖链断裂**。按 `prompts/01-skeleton-prompt.md` 的 6.3 拓扑顺序逐个选。
|
|
59
|
+
|
|
60
|
+
### 3.4 题材适配
|
|
61
|
+
|
|
62
|
+
公式只给区间,不给终值。终值应与题材匹配:
|
|
63
|
+
- **升级流**:配角数偏上界(需要大量单元对手),反派数偏上界(每个阶段一个对手)
|
|
64
|
+
- **言情**:核心配角数偏下界(关系集中),反派数偏下界(聚焦感情线)
|
|
65
|
+
- **群像**:配角数偏上界,势力数偏上界
|
|
66
|
+
- **悬疑**:地点数偏上界(多个案发现场),反派数居中(避免"凶手太多")
|
|
67
|
+
|
|
68
|
+
这些是"选值倾向",不是"硬性规则"。脚本只校验区间,不校验倾向。
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## 四、偏离记录
|
|
73
|
+
|
|
74
|
+
### 4.1 何时可以偏离
|
|
75
|
+
|
|
76
|
+
如果某个字段的实际值**超出**公式区间,必须在 `derivations[公式名].note` 写明理由。超区间会产生 `QUANTITY_MISMATCH` warning(**不阻塞**)。
|
|
77
|
+
|
|
78
|
+
**可以偏离的场景**:
|
|
79
|
+
- 题材有特殊要求(如"无限流"天然需要更多副本=更多地点)
|
|
80
|
+
- 用户硬门禁要求(如"必须 3 个主角")
|
|
81
|
+
- 叙事需要(如"每个卷 2 个反派,共 6 卷 → 12 个反派"超过上界)
|
|
82
|
+
|
|
83
|
+
**不可以偏离的场景**:
|
|
84
|
+
- 懒得算,随便填个数
|
|
85
|
+
- 不读公式,凭感觉
|
|
86
|
+
- 想让 LLM"自由发挥"
|
|
87
|
+
|
|
88
|
+
### 4.2 note 的写法
|
|
89
|
+
|
|
90
|
+
好的 note:
|
|
91
|
+
- "题材为无限流,需要更多副本场景,地点数超出上限"
|
|
92
|
+
- "用户要求三主角并列,与公式的最大值 2 不一致"
|
|
93
|
+
- "共 6 卷,每卷 2 个反派,共 12 个,公式上限 15 未超"
|
|
94
|
+
|
|
95
|
+
坏的 note:
|
|
96
|
+
- "数字大一点好看"
|
|
97
|
+
- "没算"
|
|
98
|
+
- "随意"
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## 五、derivations 完整性要求
|
|
103
|
+
|
|
104
|
+
`derivations` 必须包含 `formulas-skeleton.json` 的**全部 30 条记录**(含 `fixed.*` 固定值),不多不少。
|
|
105
|
+
|
|
106
|
+
每条记录的格式:
|
|
107
|
+
```
|
|
108
|
+
"derivations": {
|
|
109
|
+
"<公式名>": {
|
|
110
|
+
"formula": "<逐字复制 formulas-skeleton.json 的 formula>",
|
|
111
|
+
"range_low": <数字>,
|
|
112
|
+
"range_high": <数字>,
|
|
113
|
+
"note": "<可选字符串>"
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
**关键**:
|
|
119
|
+
- `formula` 必须逐字一致(`DERIVATION_FORMULA_TEXT` warning 会检查)
|
|
120
|
+
- `range_low` / `range_high` 必须与公式计算结果一致(`DERIVATION_RANGE_MISMATCH` error 会检查)
|
|
121
|
+
- 缺 key 报 `DERIVATION_MISSING`
|
|
122
|
+
- 多 key 报 `DERIVATION_EXTRA`
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## 六、示例
|
|
127
|
+
|
|
128
|
+
假设 T = 300,选 V = 5。公式计算:
|
|
129
|
+
|
|
130
|
+
```
|
|
131
|
+
structure.volume_count:max(1, ceil(300/120)) ~ max(max(1, ceil(300/120)), min(max(1, ceil(300/40)), 30)) = 3 ~ 8
|
|
132
|
+
structure.branch_count:max(1, ceil(5/2), ceil(floor(300*0.3)/30)) ~ max(max(1, ceil(5/2), ceil(floor(300*0.3)/30)), min(floor(ceil(300*0.5)/3), max(5*3, 15, ceil(floor(300*0.3)/30)))) = 3 ~ 15
|
|
133
|
+
character_elements.volume_supporting_count:5*3 ~ min(5*5, 30) = 15 ~ 25
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
选值:
|
|
137
|
+
- V = 5(区间 3~8,选中间)
|
|
138
|
+
- branch_count = 6(区间 3~15,选偏下,因为要写紧凑)
|
|
139
|
+
- volume_supporting = 18(区间 15~25,选偏下)
|
|
140
|
+
|
|
141
|
+
对应 derivations:
|
|
142
|
+
```
|
|
143
|
+
"structure.volume_count": {
|
|
144
|
+
"formula": "max(1, ceil(T/120)) ~ max(max(1, ceil(T/120)), min(max(1, ceil(T/40)), 30))",
|
|
145
|
+
"range_low": 3,
|
|
146
|
+
"range_high": 8,
|
|
147
|
+
"note": "T=300,选 5 卷,每卷 60 章"
|
|
148
|
+
},
|
|
149
|
+
"structure.branch_count": {
|
|
150
|
+
"formula": "max(1, ceil(V/2), ceil(floor(T*0.3)/30)) ~ max(max(1, ceil(V/2), ceil(floor(T*0.3)/30)), min(floor(ceil(T*0.5)/3), max(V*3, 15, ceil(floor(T*0.3)/30))))",
|
|
151
|
+
"range_low": 3,
|
|
152
|
+
"range_high": 15,
|
|
153
|
+
"note": "选 6 条,每条平均 15 章"
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## 七、常见反例
|
|
160
|
+
|
|
161
|
+
| 反例 | 为什么错 | 正确做法 |
|
|
162
|
+
|---|---|---|
|
|
163
|
+
| derivations 缺某条 | `DERIVATION_MISSING` 报错 | 补齐全部 30 条 |
|
|
164
|
+
| range 与公式不符 | `DERIVATION_RANGE_MISMATCH` 报错 | 用公式重算 |
|
|
165
|
+
| formula 文本不一致 | `DERIVATION_FORMULA_TEXT` warning | 逐字复制 |
|
|
166
|
+
| 偏离区间但不写 note | 读者/审阅者不知道原因 | 写清理由 |
|
|
167
|
+
| 选值完全不看题材 | 产出同质化 | 按 §3.4 适配 |
|
|
168
|
+
| Level 3 字段先选 | 依赖链断裂 | 按拓扑顺序选 |
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
## 八、与其他文件的关系
|
|
173
|
+
|
|
174
|
+
| 本文件输出 | 落到哪个字段 | 参考哪个公式 | 由哪个脚本验证 |
|
|
175
|
+
|---|---|---|---|
|
|
176
|
+
| 数量配额 | `框架.json` 的 `quota` 各字段 | `formulas-skeleton.json` 的 30 条公式 | `skeleton-validate.js` 的 `QUANTITY_MISMATCH`(warning)/ `DERIVATION_*` |
|
|
177
|
+
| 卷级章数比例 | `框架.json` 的 `volume_ratio` | 无公式(但 length 应等于 `quota.volume_count`,sum 应等于 1.0) | `VOLUME_RATIO_LENGTH` / `VOLUME_RATIO_SUM` |
|
|
178
|
+
| 推导记录 | `框架.json` 的 `derivations` | `formulas-skeleton.json` | `DERIVATION_MISSING` / `DERIVATION_EXTRA` / `DERIVATION_RANGE_MISMATCH` / `DERIVATION_FORMULA_TEXT` |
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## 九、版本记录
|
|
183
|
+
|
|
184
|
+
| 版本 | 变更 |
|
|
185
|
+
|---|---|
|
|
186
|
+
| v1.0 | 从原 01-07 §2 提取重组。将"伏笔密度公式"从指导文件移出(现在在 formulas-skeleton.json);本文件只保留"怎么选"的方法论;新增"与其他文件的关系"节 |
|
|
187
|
+
| v1.1 | 修正 30 条公式的表述(原版写 27 条,与 formulas-skeleton.json v1.1 的 30 条不一致);§五 与 §七 两处 "27 条" → "30 条" |
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
# 骨架验证
|
|
2
|
+
|
|
3
|
+
> 骨架阶段最后一份。横向验证流程与问题记录。**所有验证由脚本执行,本文件不写检查清单。**
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 一、验证流程
|
|
8
|
+
|
|
9
|
+
骨架阶段的验证分两级:
|
|
10
|
+
|
|
11
|
+
1. **单文件校验**:每个文件生成后立即跑(见提示词的"七、每文件生成循环")
|
|
12
|
+
2. **全量校验**:4 个文件全部单检通过后跑
|
|
13
|
+
|
|
14
|
+
本文件不重复单文件校验的流程(那在 `prompts/01-skeleton-prompt.md` 的"七"),只讲**全量校验失败后怎么处理**。
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 二、全量校验后的处理
|
|
19
|
+
|
|
20
|
+
全量校验返回 `status: 1` 时,按以下流程:
|
|
21
|
+
|
|
22
|
+
### 2.1 按文件分组
|
|
23
|
+
|
|
24
|
+
`errors[]` 每条有 `path` 字段,指向骨架内部的字段路径。按"根因文件"分组:
|
|
25
|
+
|
|
26
|
+
| 错误的根因 | 应回改的文件 |
|
|
27
|
+
|---|---|
|
|
28
|
+
| `EXTRA_FIELD`(框架相关字段) | 框架.json |
|
|
29
|
+
| `DERIVATION_*` | 框架.json |
|
|
30
|
+
| `VOLUME_RATIO_*` | 框架.json |
|
|
31
|
+
| `CAPACITY_MISMATCH` | 框架.json |
|
|
32
|
+
| `PATTERN` / `ENUM` / `TYPE` / `REQUIRED` | 看 `path` 前缀 |
|
|
33
|
+
| `SKELETON_REF_MISSING`(关系.json 的引用) | 关系.json |
|
|
34
|
+
| `G_ISOLATED`(某节点) | 实体.json(补实体)或 关系.json(补关系) |
|
|
35
|
+
| `G_DISCONNECTED` | 关系.json(补核心子图连接) |
|
|
36
|
+
| `G_REL_ONE_WAY` / `G_REL_ASYMMETRIC` | 关系.json |
|
|
37
|
+
| `SPAN_LENGTH_MISMATCH` | 层级.json |
|
|
38
|
+
|
|
39
|
+
### 2.2 改根因文件
|
|
40
|
+
|
|
41
|
+
一次只改一类错误:
|
|
42
|
+
- 先修 error,再修 warning
|
|
43
|
+
- 同类错误一起修
|
|
44
|
+
- 不顺手改其他字段(防止修 A 破坏 B)
|
|
45
|
+
|
|
46
|
+
### 2.3 重跑受影响文件的单检
|
|
47
|
+
|
|
48
|
+
改完某个文件后,只跑该文件的单检:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
node references/skeleton-validate.js \
|
|
52
|
+
--input=设定/raw/sources/骨架/<文件名>.json \
|
|
53
|
+
--template=模板/骨架/<文件名>模板.json \
|
|
54
|
+
--file=<类型> \
|
|
55
|
+
--upstream=设定/raw/sources/骨架
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
**单检的返回怎么判**(返回是 JSON,判定看 `status`,**没有 `ok` 字段**):
|
|
59
|
+
|
|
60
|
+
| status | 含义 | 怎么办 |
|
|
61
|
+
|---|---|---|
|
|
62
|
+
| `0` | 这个文件过了 | 接着做下一个文件;4 个都过了才重跑全量 |
|
|
63
|
+
| `1` | 这个文件的内容有问题 | 看 `errors[]`:按 `path` 定位字段、按 `hint` 改,**只改 `errors` 指出的字段**,改完重跑这条单检 |
|
|
64
|
+
| `2` | **脚本自己没跑完,不是这个文件的问题** | 看 **stdout** 的 `errors[0].message`(**stderr 是空的**):多半是 `--template` 路径错、`--upstream` 目录不存在。**改命令,不要改文件** |
|
|
65
|
+
|
|
66
|
+
**`status:2` 的原因不在 stderr** —— 这是最容易踩的坑:
|
|
67
|
+
stderr 里什么都没有,模型就容易以为自己写错了文件,
|
|
68
|
+
去改本来正确的产物,越改越坏。
|
|
69
|
+
|
|
70
|
+
**`--upstream` 不能省**:省掉的话,关系引用完整性、支线挂主线的覆盖度、
|
|
71
|
+
层级卷数与引用这三项跨文件检查会被**静默跳过**(拿不到上游就直接返回),
|
|
72
|
+
而脚本**照样报 `status:0`** —— 那是一次**假通过**。
|
|
73
|
+
|
|
74
|
+
单检通过后,才重跑全量。**单检过 ≠ 阶段过**:单检只查这一个文件,
|
|
75
|
+
跨文件的问题要全量校验才查得出来。
|
|
76
|
+
|
|
77
|
+
### 2.4 重跑全量
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
node references/skeleton-validate.js \
|
|
81
|
+
--stage-dir=设定/raw/sources/骨架 \
|
|
82
|
+
--template-dir=模板/骨架 \
|
|
83
|
+
--all
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### 2.5 最多 3 轮
|
|
87
|
+
|
|
88
|
+
全量最多跑 3 轮。第 3 轮仍失败时,按 `prompts/01-skeleton-prompt.md` 的 BLOCKED 格式输出,附第 3 轮完整 errors。
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## 三、跨文件错误的特殊处理
|
|
93
|
+
|
|
94
|
+
### 3.1 图连通性错误
|
|
95
|
+
|
|
96
|
+
`G_ISOLATED` 表示某实体在骨架图里没有入边或出边。修复方向:
|
|
97
|
+
|
|
98
|
+
- **角色孤立**:没有 `faction_membership`、没有 `conflict_participants`、没有 `character_relations` → 补关系,或从 `实体.json` 删掉这个角色
|
|
99
|
+
- **冲突孤立**:没有 `conflict_participants` 引用它 → 补参与方,或删冲突
|
|
100
|
+
- **势力孤立**:没有 `faction_membership` 或 `faction_relations` → 补成员/关系,或删势力
|
|
101
|
+
- **地点孤立**:没有 `location_conflict` → 补关联冲突,或删地点
|
|
102
|
+
- **道具孤立**:没有 `item_owner` → 补归属,或删道具
|
|
103
|
+
- **支线孤立**:没有 `branch_protagonist` → 补主角,或删支线
|
|
104
|
+
|
|
105
|
+
### 3.2 势力关系单向/不对称
|
|
106
|
+
|
|
107
|
+
`G_REL_ONE_WAY`:A→B 是"对立"但 B→A 没声明 → 补 B→A。
|
|
108
|
+
`G_REL_ASYMMETRIC`:A→B 是"对立"但 B→A 是"合作" → 统一为同一关系,或改一侧。
|
|
109
|
+
|
|
110
|
+
### 3.3 卷比例不匹配
|
|
111
|
+
|
|
112
|
+
`SPAN_LENGTH_MISMATCH`:`main_line_span[i].volume_ratio` 长度不等于 `volume_count` → 补或删数组元素。
|
|
113
|
+
|
|
114
|
+
`VOLUME_RATIO_SUM`:`volume_ratio[].chapter_ratio` 之和不等于 1.0 → 调整各卷比例。
|
|
115
|
+
|
|
116
|
+
`VOLUME_RATIO_LENGTH`:`volume_ratio` 数组长度不等于 `volume_count` → 增删条目。
|
|
117
|
+
|
|
118
|
+
`VOLUME_RATIO_RANGE`:`volume_ratio[].chapter_ratio` 不在 [0,1] 内(负数或大于 1)→ 按各卷实际章数重新分配比例。
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## 四、问题记录
|
|
123
|
+
|
|
124
|
+
全量校验失败时,用以下模板记录(**不对外展示,只作为工作记录**):
|
|
125
|
+
|
|
126
|
+
| # | 错误代码 | path | 问题描述 | 根因文件 | 修改动作 | 状态 |
|
|
127
|
+
|---|---|---|---|---|---|---|
|
|
128
|
+
| 1 | G_ISOLATED | C005 | 角色 C005 孤立 | 关系.json | 补 faction_membership | open |
|
|
129
|
+
| 2 | G_REL_ONE_WAY | F001→F002 | 势力 F001→F002 单向 | 关系.json | 补 F002→F001 | open |
|
|
130
|
+
|
|
131
|
+
全部 `open` 转 `resolved` 后,重跑全量。
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## 五、输出确认
|
|
136
|
+
|
|
137
|
+
全量校验返回 `status: 0` 后,按 `prompts/01-skeleton-prompt.md` 的"九、输出交付格式"输出交付摘要。
|
|
138
|
+
|
|
139
|
+
**这是唯一允许报告"完成"的场景**。其他场景(单文件通过、中间轮次)不得输出"通过/完成/PASS"。
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## 六、与其他文件的关系
|
|
144
|
+
|
|
145
|
+
| 本文件作用 | 引用 |
|
|
146
|
+
|---|---|
|
|
147
|
+
| 全量校验失败后的处理流程 | `prompts/01-skeleton-prompt.md` 的"七、7.8" |
|
|
148
|
+
| 错误代码的修复方向 | `prompts/01-skeleton-prompt.md` 的"十二、常见错误代码速查" |
|
|
149
|
+
| 输出确认 | `prompts/01-skeleton-prompt.md` 的"九、输出交付格式" |
|
|
150
|
+
|
|
151
|
+
**本文件本身不直接输出到任何 JSON**,它是验证阶段的工作手册。
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## 七、版本记录
|
|
156
|
+
|
|
157
|
+
| 版本 | 变更 |
|
|
158
|
+
|---|---|
|
|
159
|
+
| v1.0 | 从原 01-08 精简。删除所有 `- [ ]` 检查清单(验证归脚本);删除 §2-§8 的验证项(转化为脚本的检查逻辑);保留验证流程、问题清单模板、输出确认;新增"与其他文件的关系"节 |
|
|
160
|
+
| v1.1 | §2.3 补单检的返回判定:`status` 0/1/2 各自的含义与判据;补 `status:2` 的处置(原因在 stdout 的 `errors[0].message`,stderr 是空的,**改命令不要改文件**);补 `--upstream` 不能省的理由(不带会静默跳过三类跨文件检查仍报 status:0 假通过);补"单检过 ≠ 阶段过" |
|