codebee 0.1.95 → 0.1.97

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.
Files changed (144) hide show
  1. package/CHANGELOG.md +733 -720
  2. package/LICENSE +21 -21
  3. package/README.md +516 -509
  4. package/app/core/acceptance.py +100 -100
  5. package/app/core/agent_context.py +118 -0
  6. package/app/core/aiflavor.py +197 -197
  7. package/app/core/analytics.py +38 -38
  8. package/app/core/artifacts.py +148 -148
  9. package/app/core/assets.py +110 -110
  10. package/app/core/attachments.py +623 -623
  11. package/app/core/audit.py +30 -30
  12. package/app/core/backup.py +470 -470
  13. package/app/core/beekeeper.py +183 -183
  14. package/app/core/benchstore.py +102 -95
  15. package/app/core/board.py +246 -209
  16. package/app/core/bookmeta.py +1036 -1036
  17. package/app/core/bookmeta_catalog.py +180 -180
  18. package/app/core/branching.py +137 -137
  19. package/app/core/builtin_agent.py +2055 -1680
  20. package/app/core/capability.py +144 -144
  21. package/app/core/chaptersafe.py +32 -32
  22. package/app/core/checkpoints.py +648 -0
  23. package/app/core/cleanup.py +303 -303
  24. package/app/core/compaction.py +201 -201
  25. package/app/core/contracts.py +255 -255
  26. package/app/core/covergen.py +356 -356
  27. package/app/core/defectretro.py +43 -43
  28. package/app/core/diagnostics.py +114 -114
  29. package/app/core/dispatch.py +198 -191
  30. package/app/core/dispatch_log.py +128 -128
  31. package/app/core/env_scrub.py +85 -85
  32. package/app/core/errorlog.py +137 -137
  33. package/app/core/eval_matrix.py +82 -0
  34. package/app/core/evalbench.py +184 -91
  35. package/app/core/evaluation.py +174 -174
  36. package/app/core/failure_notify.py +290 -290
  37. package/app/core/flow_graph.py +33 -0
  38. package/app/core/goal_service.py +167 -167
  39. package/app/core/health.py +389 -389
  40. package/app/core/history.py +38 -38
  41. package/app/core/hooks.py +162 -162
  42. package/app/core/jobs.py +25 -4
  43. package/app/core/knowledge_pipeline.py +86 -0
  44. package/app/core/manager.py +2232 -2232
  45. package/app/core/mcp_client.py +200 -29
  46. package/app/core/mocks.py +64 -64
  47. package/app/core/notify.py +201 -201
  48. package/app/core/novel_quality.py +181 -189
  49. package/app/core/openapi.py +177 -154
  50. package/app/core/operations.py +228 -228
  51. package/app/core/paihang.py +145 -145
  52. package/app/core/pipeline.py +319 -59
  53. package/app/core/planner.py +17 -11
  54. package/app/core/policy.py +84 -0
  55. package/app/core/portguard.py +111 -111
  56. package/app/core/presence.py +77 -77
  57. package/app/core/preview.py +293 -293
  58. package/app/core/project_memory.py +139 -0
  59. package/app/core/prompt_guard.py +78 -78
  60. package/app/core/publish/__init__.py +7 -7
  61. package/app/core/publish/auto.py +106 -22
  62. package/app/core/publish/browser.py +694 -655
  63. package/app/core/publish/chaprows.py +138 -0
  64. package/app/core/publish/fanqie.py +212 -165
  65. package/app/core/publish/flow.py +832 -640
  66. package/app/core/publish/flows-fanqie-calibrated.json +361 -336
  67. package/app/core/publish/ledger.py +51 -2
  68. package/app/core/publish/manager.py +1150 -1118
  69. package/app/core/publish/qimao.py +176 -176
  70. package/app/core/publish/volumes.py +108 -0
  71. package/app/core/publish/ws.py +139 -139
  72. package/app/core/quality_gate.py +194 -194
  73. package/app/core/redact.py +38 -38
  74. package/app/core/repeat_guard.py +129 -129
  75. package/app/core/retrieval.py +137 -137
  76. package/app/core/router.py +398 -398
  77. package/app/core/runner.py +2239 -2238
  78. package/app/core/selfupdate.py +384 -384
  79. package/app/core/session_log.py +161 -161
  80. package/app/core/sessions.py +312 -312
  81. package/app/core/settings.py +33 -5
  82. package/app/core/settings_schema.py +282 -271
  83. package/app/core/share_page.py +114 -114
  84. package/app/core/skill_scan.py +139 -139
  85. package/app/core/skillpacks/fanqie-novel.md +8 -6
  86. package/app/core/skillpacks/market/character-bible.md +66 -66
  87. package/app/core/skillpacks/market/code-risk-checklist.md +58 -58
  88. package/app/core/skillpacks/market/git-workflow.md +57 -57
  89. package/app/core/skillpacks/market/release-notes.md +72 -72
  90. package/app/core/skillpacks/market/weekly-report.md +71 -71
  91. package/app/core/skillpacks/market/worldview-consistency.md +70 -70
  92. package/app/core/skillpacks/qimao-signing.md +14 -11
  93. package/app/core/skills.py +32 -21
  94. package/app/core/step_runner.py +132 -132
  95. package/app/core/store.py +24 -0
  96. package/app/core/story_tracking.py +275 -275
  97. package/app/core/task_compile.py +199 -199
  98. package/app/core/telemetry.py +292 -292
  99. package/app/core/tlsctx.py +64 -64
  100. package/app/core/token_meter.py +147 -147
  101. package/app/core/tool_outputs.py +107 -0
  102. package/app/core/tracing.py +207 -144
  103. package/app/core/upstream.py +41 -41
  104. package/app/core/usage.py +1038 -1038
  105. package/app/core/volumes.py +389 -389
  106. package/app/core/webhooks.py +89 -0
  107. package/app/core/wxdigest.py +865 -858
  108. package/app/core/zentao.py +2692 -2692
  109. package/app/main.py +179 -10
  110. package/app/mcp_server.py +244 -244
  111. package/app/pick_dialog.py +110 -110
  112. package/app/ui/app.js +563 -21
  113. package/app/ui/artdiff.js +74 -74
  114. package/app/ui/assets/community-qr.png +0 -0
  115. package/app/ui/assets/donate-alipay.jpg +0 -0
  116. package/app/ui/assets/donate-qr.jpg +0 -0
  117. package/app/ui/assets/workbench-reference.png +0 -0
  118. package/app/ui/board.css +451 -666
  119. package/app/ui/board.html +165 -162
  120. package/app/ui/board.js +509 -305
  121. package/app/ui/hive3d.js +242 -0
  122. package/app/ui/i18n.js +125 -9
  123. package/app/ui/icons/bee.svg +79 -79
  124. package/app/ui/index.html +60 -3
  125. package/app/ui/manifest.json +16 -16
  126. package/app/ui/qrcode.js +2297 -2297
  127. package/app/ui/style.css +189 -9
  128. package/bin/tutti.js +147 -147
  129. package/package.json +49 -48
  130. package/tools/wx_reader.py +261 -261
  131. package/app/.playwright-cli/console-2026-09-23T08-26-03-635Z.log +0 -88
  132. package/app/.playwright-cli/page-2026-09-23T08-26-03-845Z.yml +0 -126
  133. package/app/.playwright-cli/page-2026-09-23T08-29-44-203Z.png +0 -0
  134. package/app/.playwright-cli/page-2026-09-23T08-35-42-046Z.yml +0 -210
  135. package/app/.playwright-cli/page-2026-09-23T08-36-52-858Z.png +0 -0
  136. package/app/.playwright-cli/page-2026-09-23T08-37-33-938Z.png +0 -0
  137. package/app/.playwright-cli/run-detail-after.png +0 -0
  138. package/app/output/_createbook_body.json +0 -1
  139. package/app/output/_probe_fq_click.py +0 -50
  140. package/app/output/_probe_fq_form.py +0 -42
  141. package/app/output/_probe_fq_modal.py +0 -55
  142. package/app/output/_probe_fq_points.py +0 -71
  143. package/app/output/_probe_fq_submit.py +0 -34
  144. package/app/output/_probe_fq_watch.py +0 -62
@@ -1,71 +1,71 @@
1
- ---
2
- name: 周报晨报生成器守则
3
- note: 从任务与运行记录生成汇报:先取材再总结 / 晨报三段 / 周报四段 / 量化纪律与模板
4
- scopes:
5
- - "*"
6
- source: market
7
- market_id: weekly-report
8
- ---
9
-
10
- # 周报 / 晨报生成器守则(市场包)
11
-
12
- 适用:为个人或团队生成晨报(昨日 / 今日 / 阻塞)与周报(本周 / 风险 / 下周)。
13
- 第一原则:**先取材,再总结,不许凭印象编**。事实原料来自任务系统、运行记录、
14
- 提交历史与日志;生成器的工作是把原料提炼成「能支撑决策」的信息,不是文学创作。
15
-
16
- ## 一、取材清单(动笔前先收集)
17
- - 已完成:本周关闭的任务、成功结束的运行、合并的提交 / PR(git log --since 起止)。
18
- - 进行中:各任务当前状态、最近一次运行结论、卡在哪一步。
19
- - 信号类:评审打分、测试通过率、失败与重试次数、耗时的环比变化——量化的来源。
20
- - 未进系统的口头承诺 / 临时插活:单独列出并标注「口头事项」,不混进正式条目。
21
-
22
- ## 二、晨报结构(10 行以内,站着读完)
23
- - **昨日完成**:2-4 条,每条写一个**结果**(不是动作)。
24
- - **今日计划**:2-4 条,每条可验证(「提测搜索分页」,而不是「继续做搜索」)。
25
- - **阻塞**:0-2 条,每条带「需要谁 / 需要什么」;没有就写「无」,不硬凑。
26
-
27
- ## 三、周报结构
28
- 1. **本周一句话**:本周最重要的结果或结论。上级只读这一行也能掌握大局。
29
- 2. **关键进展**:按目标 / 项目分组,每组 1-3 条;每条 = 结果 + 量化 + 对照计划
30
- (提前 / 按期 / 延期几天)。流水账禁止——「周一做了 A,周二做了 B」是日志,
31
- 不是汇报。
32
- 3. **风险与阻塞**:每条 = 风险描述 + 影响面 + 需要的支持或缓解方案。
33
- **只报风险不给方案 = 把问题原样上交;报喜不报忧 = 把雷埋到下周。**
34
- 4. **下周计划**:2-5 条可验证的目标,与风险呼应,高风险项排前面。
35
-
36
- ## 四、写作纪律
37
- - **量化**:能带数字必带数字(章数、字数、通过率、耗时、条数);
38
- 「大量」「明显」「基本完成」这类模糊词出现即重写。
39
- - **结果导向**:写「完成了 X,达到 Y」;「在做 X」「推进中」放进计划或阻塞,不进步进展。
40
- - **动词开头、一条一意**:每条脱离上下文独立可懂。
41
- - **诚实纪律**:延期就写延期,附原因与新预计时间;数据缺失标注「缺」,不估算充数。
42
- - **篇幅纪律**:周报正文 ≤400 字(附录与链接不计);超了说明没提炼。
43
-
44
- ## 五、常见毛病对照(反例 → 正例)
45
- - 反例:「本周推进了 A 项目。」→ 正例:「A 项目完成搜索分页改造并提测,1 万条数据下翻页响应小于 200ms。」
46
- - 反例:「一切顺利。」→ 正例:「整体按期;联调依赖的 B 接口周三可用,已与对方确认。」
47
- - 反例:「风险:时间紧。」→ 正例:「风险:评审通过率低于阈值会触发返工,预计延期 2 天;已加排一轮预审。」
48
- - 反例:把 12 条流水账逐日列出 → 正例:归并成 3 条按目标分组的结果,逐日明细放附录链接。
49
-
50
- ## 六、周报模板(可直接复制)
51
- ```
52
- # 周报(MM.DD - MM.DD)
53
-
54
- 一句话:完成xxx,指标y环比+z%;主要风险:xxx。
55
-
56
- ## 关键进展
57
- - 【目标A】交付xxx(量化数据);对照计划:按期 / 延期n天
58
- - 【目标B】……
59
-
60
- ## 风险与阻塞
61
- - 风险:……;影响:……;需要:……(或已采取措施:……)
62
-
63
- ## 下周计划
64
- - ……
65
- ```
66
-
67
- ## 七、自检
68
- - [ ] 每个数字都能在任务 / 运行记录 / git log 里找到出处
69
- - [ ] 无「继续推进」「持续优化」这类无信息量条目
70
- - [ ] 风险条目全部带缓解方案或明确的求助对象
71
- - [ ] 下周计划每条都有可验证的完成标志
1
+ ---
2
+ name: 周报晨报生成器守则
3
+ note: 从任务与运行记录生成汇报:先取材再总结 / 晨报三段 / 周报四段 / 量化纪律与模板
4
+ scopes:
5
+ - "*"
6
+ source: market
7
+ market_id: weekly-report
8
+ ---
9
+
10
+ # 周报 / 晨报生成器守则(市场包)
11
+
12
+ 适用:为个人或团队生成晨报(昨日 / 今日 / 阻塞)与周报(本周 / 风险 / 下周)。
13
+ 第一原则:**先取材,再总结,不许凭印象编**。事实原料来自任务系统、运行记录、
14
+ 提交历史与日志;生成器的工作是把原料提炼成「能支撑决策」的信息,不是文学创作。
15
+
16
+ ## 一、取材清单(动笔前先收集)
17
+ - 已完成:本周关闭的任务、成功结束的运行、合并的提交 / PR(git log --since 起止)。
18
+ - 进行中:各任务当前状态、最近一次运行结论、卡在哪一步。
19
+ - 信号类:评审打分、测试通过率、失败与重试次数、耗时的环比变化——量化的来源。
20
+ - 未进系统的口头承诺 / 临时插活:单独列出并标注「口头事项」,不混进正式条目。
21
+
22
+ ## 二、晨报结构(10 行以内,站着读完)
23
+ - **昨日完成**:2-4 条,每条写一个**结果**(不是动作)。
24
+ - **今日计划**:2-4 条,每条可验证(「提测搜索分页」,而不是「继续做搜索」)。
25
+ - **阻塞**:0-2 条,每条带「需要谁 / 需要什么」;没有就写「无」,不硬凑。
26
+
27
+ ## 三、周报结构
28
+ 1. **本周一句话**:本周最重要的结果或结论。上级只读这一行也能掌握大局。
29
+ 2. **关键进展**:按目标 / 项目分组,每组 1-3 条;每条 = 结果 + 量化 + 对照计划
30
+ (提前 / 按期 / 延期几天)。流水账禁止——「周一做了 A,周二做了 B」是日志,
31
+ 不是汇报。
32
+ 3. **风险与阻塞**:每条 = 风险描述 + 影响面 + 需要的支持或缓解方案。
33
+ **只报风险不给方案 = 把问题原样上交;报喜不报忧 = 把雷埋到下周。**
34
+ 4. **下周计划**:2-5 条可验证的目标,与风险呼应,高风险项排前面。
35
+
36
+ ## 四、写作纪律
37
+ - **量化**:能带数字必带数字(章数、字数、通过率、耗时、条数);
38
+ 「大量」「明显」「基本完成」这类模糊词出现即重写。
39
+ - **结果导向**:写「完成了 X,达到 Y」;「在做 X」「推进中」放进计划或阻塞,不进步进展。
40
+ - **动词开头、一条一意**:每条脱离上下文独立可懂。
41
+ - **诚实纪律**:延期就写延期,附原因与新预计时间;数据缺失标注「缺」,不估算充数。
42
+ - **篇幅纪律**:周报正文 ≤400 字(附录与链接不计);超了说明没提炼。
43
+
44
+ ## 五、常见毛病对照(反例 → 正例)
45
+ - 反例:「本周推进了 A 项目。」→ 正例:「A 项目完成搜索分页改造并提测,1 万条数据下翻页响应小于 200ms。」
46
+ - 反例:「一切顺利。」→ 正例:「整体按期;联调依赖的 B 接口周三可用,已与对方确认。」
47
+ - 反例:「风险:时间紧。」→ 正例:「风险:评审通过率低于阈值会触发返工,预计延期 2 天;已加排一轮预审。」
48
+ - 反例:把 12 条流水账逐日列出 → 正例:归并成 3 条按目标分组的结果,逐日明细放附录链接。
49
+
50
+ ## 六、周报模板(可直接复制)
51
+ ```
52
+ # 周报(MM.DD - MM.DD)
53
+
54
+ 一句话:完成xxx,指标y环比+z%;主要风险:xxx。
55
+
56
+ ## 关键进展
57
+ - 【目标A】交付xxx(量化数据);对照计划:按期 / 延期n天
58
+ - 【目标B】……
59
+
60
+ ## 风险与阻塞
61
+ - 风险:……;影响:……;需要:……(或已采取措施:……)
62
+
63
+ ## 下周计划
64
+ - ……
65
+ ```
66
+
67
+ ## 七、自检
68
+ - [ ] 每个数字都能在任务 / 运行记录 / git log 里找到出处
69
+ - [ ] 无「继续推进」「持续优化」这类无信息量条目
70
+ - [ ] 风险条目全部带缓解方案或明确的求助对象
71
+ - [ ] 下周计划每条都有可验证的完成标志
@@ -1,70 +1,70 @@
1
- ---
2
- name: 世界观设定一致性台账守则
3
- note: 设定台账五件套 / 设定变更三步流程 / 高频吃书场景 / 章前查章后记闭环
4
- scopes:
5
- - novel
6
- - serial_novel
7
- source: market
8
- market_id: worldview-consistency
9
- ---
10
-
11
- # 世界观设定一致性台账守则(市场包)
12
-
13
- 适用:连载与长篇的设定管理。吃书(前后矛盾)是长篇差评第一来源,且几乎全部
14
- 源于**「没有台账」而不是「记性差」**——几十万字跨度下,任何人都记不住自己写过的
15
- 每个数字与专名。本包给出一套零工具依赖的台账纪律。
16
-
17
- ## 一、台账五件套(开书第一天建立,一个文件即可)
18
- 1. **规则体系**:力量 / 能力等级、代价与限制、禁忌(什么绝对做不到)。
19
- **限制比能力更重要**——能赢只是爽,不能做什么才产生剧情。
20
- 2. **地理与组织**:地名 / 势力名清单(含从属关系)。一地一名,写法逐字固定
21
- (定了「云州」就不能又写「云洲」)。
22
- 3. **时间线**:故事内历法 + 大事件年表(含「现在」的锚点日期);每章推进了
23
- 多长时间记一笔,跨章对表。
24
- 4. **专有名词表**:自造词、称谓、咒语、物品名,逐字锁定。
25
- 5. **数字台账**:金额、距离、年龄、队伍人数、库存——正文出现过的每个数字。
26
- 数字是最容易吃书的类别,因为最枯燥、最没人记。
27
-
28
- ## 二、铁律
29
- - **设定一经正文确认,不可静默更改。**要改,走三步:登记「改了什么 / 从哪章起
30
- 生效」→ 排查并修订前文旧描述(或用剧情解释)→ 更新台账。三步缺一不可。
31
- - 设定揭示分层:世界观全貌不必第一章交底,但**已揭示的部分永不反悔**。
32
- 未揭示的可以随时丰富——区分「未揭示」与「矛盾」:读者无从知晓的不算吃书。
33
- - 新设定入正文前先对台账查重:与既有规则冲突吗?冲突就要么改新、要么改旧,
34
- 不许「先写上再说」。
35
- - 跨书 / 跨卷沿用设定时,以台账为准重读一遍,不凭上一本的记忆。
36
-
37
- ## 三、高频吃书场景(评审时重点排查)
38
- - 时间线对不上:上一段还是「昨天」,三天后又被称作「昨天」;旅程三天的两头
39
- 都只过了一夜。
40
- - 能力凭空升级 / 降级:前面明确做不到的事,后面无解释做到了(或反之)。
41
- - 称谓漂移:同一人物 / 势力的称呼前后不一;称呼随剧情需要临时变化。
42
- - 死人复活 / 物品复用:已确认死亡的角色、已消耗或损毁的物品再次登场。
43
- - 年龄与亲缘错位:年龄推算矛盾、辈分关系前后颠倒。
44
-
45
- ## 四、闭环纪律:章前查、章后记
46
- - **章前查**:写 / 审每一章前,读一遍本章涉及的台账条目(出场地名、势力、规则、
47
- 上次时间锚点)。30 秒的事,防 30 万字后的大返工。
48
- - **章后记**:本章产生的任何新设定、新专名、新数字、时间推进,**当章写入台账,
49
- 不过夜**。攒三章再补 = 必漏。
50
- - 一致性评审给出的矛盾项,当轮修复并回填台账;同类矛盾出现第二次 = 台账结构
51
- 要补一类条目,而不是「下次更小心一点」。
52
-
53
- ## 五、台账文件模板(可直接复制)
54
- > ## 规则体系
55
- > - 等级:……;代价:……;禁忌(绝对做不到的事):……
56
- > ## 地理与组织
57
- > - 云州(州)> 落霞城(城);青岚宗(宗门,驻落霞城)
58
- > ## 时间线
59
- > - 第 1 章:启程日(春三月初七);第 2 章:+3 日 → 三月十一
60
- > ## 专有名词表
61
- > - 破妄瞳(术法名,逐字锁定);称「宗主」不写「掌门」
62
- > ## 数字台账
63
- > - 主角 16 岁;启程盘缠 3 两银;落霞城至云州城 700 里
64
-
65
- ## 六、交稿前自检
66
- - [ ] 本章新设定已查重并入台账,未与既有规则冲突
67
- - [ ] 时间推进已记账,与上一章锚点衔接无误
68
- - [ ] 数字(金额 / 距离 / 人数 / 年龄)与台账一致,新数字已登记
69
- - [ ] 专名写法与名词表逐字一致
70
- - [ ] 若改过既有设定:三步流程(登记 / 排查前文 / 更新台账)已走完
1
+ ---
2
+ name: 世界观设定一致性台账守则
3
+ note: 设定台账五件套 / 设定变更三步流程 / 高频吃书场景 / 章前查章后记闭环
4
+ scopes:
5
+ - novel
6
+ - serial_novel
7
+ source: market
8
+ market_id: worldview-consistency
9
+ ---
10
+
11
+ # 世界观设定一致性台账守则(市场包)
12
+
13
+ 适用:连载与长篇的设定管理。吃书(前后矛盾)是长篇差评第一来源,且几乎全部
14
+ 源于**「没有台账」而不是「记性差」**——几十万字跨度下,任何人都记不住自己写过的
15
+ 每个数字与专名。本包给出一套零工具依赖的台账纪律。
16
+
17
+ ## 一、台账五件套(开书第一天建立,一个文件即可)
18
+ 1. **规则体系**:力量 / 能力等级、代价与限制、禁忌(什么绝对做不到)。
19
+ **限制比能力更重要**——能赢只是爽,不能做什么才产生剧情。
20
+ 2. **地理与组织**:地名 / 势力名清单(含从属关系)。一地一名,写法逐字固定
21
+ (定了「云州」就不能又写「云洲」)。
22
+ 3. **时间线**:故事内历法 + 大事件年表(含「现在」的锚点日期);每章推进了
23
+ 多长时间记一笔,跨章对表。
24
+ 4. **专有名词表**:自造词、称谓、咒语、物品名,逐字锁定。
25
+ 5. **数字台账**:金额、距离、年龄、队伍人数、库存——正文出现过的每个数字。
26
+ 数字是最容易吃书的类别,因为最枯燥、最没人记。
27
+
28
+ ## 二、铁律
29
+ - **设定一经正文确认,不可静默更改。**要改,走三步:登记「改了什么 / 从哪章起
30
+ 生效」→ 排查并修订前文旧描述(或用剧情解释)→ 更新台账。三步缺一不可。
31
+ - 设定揭示分层:世界观全貌不必第一章交底,但**已揭示的部分永不反悔**。
32
+ 未揭示的可以随时丰富——区分「未揭示」与「矛盾」:读者无从知晓的不算吃书。
33
+ - 新设定入正文前先对台账查重:与既有规则冲突吗?冲突就要么改新、要么改旧,
34
+ 不许「先写上再说」。
35
+ - 跨书 / 跨卷沿用设定时,以台账为准重读一遍,不凭上一本的记忆。
36
+
37
+ ## 三、高频吃书场景(评审时重点排查)
38
+ - 时间线对不上:上一段还是「昨天」,三天后又被称作「昨天」;旅程三天的两头
39
+ 都只过了一夜。
40
+ - 能力凭空升级 / 降级:前面明确做不到的事,后面无解释做到了(或反之)。
41
+ - 称谓漂移:同一人物 / 势力的称呼前后不一;称呼随剧情需要临时变化。
42
+ - 死人复活 / 物品复用:已确认死亡的角色、已消耗或损毁的物品再次登场。
43
+ - 年龄与亲缘错位:年龄推算矛盾、辈分关系前后颠倒。
44
+
45
+ ## 四、闭环纪律:章前查、章后记
46
+ - **章前查**:写 / 审每一章前,读一遍本章涉及的台账条目(出场地名、势力、规则、
47
+ 上次时间锚点)。30 秒的事,防 30 万字后的大返工。
48
+ - **章后记**:本章产生的任何新设定、新专名、新数字、时间推进,**当章写入台账,
49
+ 不过夜**。攒三章再补 = 必漏。
50
+ - 一致性评审给出的矛盾项,当轮修复并回填台账;同类矛盾出现第二次 = 台账结构
51
+ 要补一类条目,而不是「下次更小心一点」。
52
+
53
+ ## 五、台账文件模板(可直接复制)
54
+ > ## 规则体系
55
+ > - 等级:……;代价:……;禁忌(绝对做不到的事):……
56
+ > ## 地理与组织
57
+ > - 云州(州)> 落霞城(城);青岚宗(宗门,驻落霞城)
58
+ > ## 时间线
59
+ > - 第 1 章:启程日(春三月初七);第 2 章:+3 日 → 三月十一
60
+ > ## 专有名词表
61
+ > - 破妄瞳(术法名,逐字锁定);称「宗主」不写「掌门」
62
+ > ## 数字台账
63
+ > - 主角 16 岁;启程盘缠 3 两银;落霞城至云州城 700 里
64
+
65
+ ## 六、交稿前自检
66
+ - [ ] 本章新设定已查重并入台账,未与既有规则冲突
67
+ - [ ] 时间推进已记账,与上一章锚点衔接无误
68
+ - [ ] 数字(金额 / 距离 / 人数 / 年龄)与台账一致,新数字已登记
69
+ - [ ] 专名写法与名词表逐字一致
70
+ - [ ] 若改过既有设定:三步流程(登记 / 排查前文 / 更新台账)已走完
@@ -7,6 +7,14 @@
7
7
 
8
8
  > 这是写作参考与自检清单,不是平台官方规则或过签预测;按当前频道与后台要求核实。
9
9
 
10
+ ## 使用顺序(覆盖下方历史口诀的绝对化表述)
11
+
12
+ 遇到作品“不过”先确认具体结果:内容/合规审核、建书字段校验、签约质量评估、发布章节审核或读者数据表现,不混称“审核”。优先记录平台原文、日期、频道、提交版本和评估范围;没有明确平台意见时,标注为内部诊断,不推断政策原因、AI 检测或算法权重。
13
+
14
+ 诊断依次分开报告:①文本问题(引用可定位原文);②该频道/受众的适配假设(说明依据与替代解释);③当前政策核验(引用当前后台/公告或标为未核实)。经验口诀只能生成检查问题,不能充当评分标准或自动拒稿门槛。未读正文不能判定通过;有风险也要说明严重度、影响及可逆的改法。
15
+
16
+ 拒稿反馈到修改必须形成闭环:`原反馈 → 可观察的正文问题 → 结构/措辞/政策中的改动层级 → 小样本复验方式`。若意见是切入点/设定常规,先比较不同事件机制、主角选择与代价,不仅润色原句;若是文风/流畅,才定位句段层问题。改稿不能只加冲突、爽点、钩子或特写来迎合清单。
17
+
10
18
  ## 证据等级与使用边界(2026-09-30 更新)
11
19
 
12
20
  - **A级:当前平台事实**:只接受作家助手/合同/官方公告中当前可见的规则;投稿、独家、更新和内容红线必须回到原页面核对,历史材料不能代替政策。
@@ -31,8 +39,8 @@
31
39
  - **前 600 字**:观察眼前困境是否具体(退婚/背叛/陷害/侮辱/破产/误会/灾难/生死危机),而非只铺垫。
32
40
  - **前 2000 字**:观察核心吸引点是否实际展示(字数位置本身不证明吸引力)。
33
41
  - **第三章前**:观察主线是否明确(主角要干什么,像“鸣人要当火影”一样清楚)。
34
- - 第一章具名人物尽量少(五人只是阅读负担参考,不是硬门槛);前三章要有实质局面变化;
35
- 反转必须由前文条件引发,不为口诀机械加死亡/背叛。
42
+ - 第一章具名人物尽量少(五人只是阅读负担参考,不是硬门槛);观察前三章是否出现对故事理解或人物处境有意义的变化;
43
+ 反转若出现,应由前文条件引发,不为口诀机械加死亡/背叛。
36
44
  - 可复用的一种开篇节奏:**第一章建立冲突并留后续问题 → 第二章让核心能力/设定影响行动 → 第三章完成第一次阶段性兑现**;具体次序服务于本稿题材与因果。
37
45
  - 三幕式可以作为结构草图:开端(危机/目标)→发展(行动/代价)→转折(新信息/选择),不要求每稿套“金手指/背叛”等桥段。
38
46
  - 历史经验帖常提醒检查设定、世界观、环境和人物关系是否挤占事件;倒叙、群像或配角戏份本身不是禁写项,重点是读者能否跟住主线。
@@ -66,24 +74,19 @@
66
74
  - 开篇视角应让读者容易定位人物、信息来源和情绪距离;第三人称全知等视角不是禁项,需看执行是否清楚。
67
75
  例:×"昏暗的房间里,一个男人把南笙按在沙发上" → √"好痒……南笙迷迷糊糊苏醒,感觉腿上一阵瘙痒,
68
76
  随后一只粗糙的大手便摸上了她的大腿"。
69
- - 开篇即入主角视角,不用旁白自我介绍;读者未对主角产生好感前,不铺大篇幅受伤/惨状。
77
+ - 视角选择服务于本稿;第一人称、限知、全知或多视角都可用,检查信息归属是否清楚、切换是否有意图。
70
78
  - 避免直白叙述:"她哭得很伤心" × → "她蜷缩在墙角,指甲掐进掌心,喉咙里溢出压抑的呜咽" √。
71
- - 用最少的文字描绘最真实的画面,追求"准确";心理描写用动作替代;对话要有信息量。
79
+ - 追求准确、有辨识度且适合叙述者的语言;心理描写不必一律替换为动作,对话也可承担停顿、重复、闲谈等真实功能。
72
80
  - 段落短,适配手机阅读;少错别字病句。
73
81
 
74
82
  ### 编辑高频驳回话术拆解(实测复盘,动笔/改稿时逐条对照)
75
83
  以下三条是所汇编材料中反复出现的"文笔类"反馈,可转成自查问题;不代表所有频道或拒稿的完整原因:
76
84
 
77
- - **"风格不够统一"**:叙述语域/句式长短/人称距离在一章内忽高忽低(半文半白 + 网络梗 + 书面长句混用),
78
- 或切场景/切视角时文风跟着变。**修法**:全篇定一个文风锚(如"短句 + 白描 + 口语但不过火"),
79
- 换场不换笔调;网络用语、方言、专有名词只允许一种强度,通篇统一。
85
+ - **"风格不够统一"**:叙述语域/句式/人称距离无意跳变且影响阅读。**修法**:以作者确定的风格目标和叙述者声音为锚,检查跳变是否有意图;不要求全篇同一语速、句长或语域。
80
86
  - **"不够流畅"**:读出声会卡——长定语/多重倒装、连续多句都以同一主语开头(她…她…她…)、
81
87
  动作与反应被拆碎、段与段之间没有承接。**修法**:一句一动作,主谓宾贴紧;
82
88
  相邻句换用不同句式与长度;段尾留半句承上启下;写完逐段读出声,卡顿处即病句,就地删改。
83
- - **"细节刻画力度稍弱"**:核心冲突/情绪爆点被一句话带过(该"放慢给特写"的地方按了快进),
84
- 打压—反击缺生理与环境反应,爽点"打不满"。**修法**:每个爽点/反转标记为"特写镜头",
85
- 用五感 + 微动作 + 环境反馈把这几秒写"厚"(心跳、指节、周围人的呼吸与目光),
86
- 铺垫在前、放大在中、余波在后;场景篇幅按叙事重要性调整,不把"特写"固定套给每个爽点。
89
+ - **"细节刻画力度稍弱"**:关键情绪变化被一笔带过。**修法**:选择适合本稿的细节、动作、对话或留白呈现;特写与留白都可以,场景篇幅按叙事重要性调整,不把五感、生理反应或环境反馈列为必填项。
87
90
 
88
91
  ## 六、题材、书名、简介
89
92
  - 题材 = 个人兴趣 × 市场需求的最大公约数;风格要匹配题材。
@@ -88,11 +88,11 @@ BUILTIN_PACKS = [
88
88
  {"id": "qimao-signing", "name": "七猫签约标准与写作规范",
89
89
  "file": "qimao-signing.md",
90
90
  "scopes": ["novel", "serial_novel"],
91
- "note": "黄金一章、爽点纪律、期待感三源、人物红线、自检清单"},
91
+ "note": "七猫经验边界、拒稿证据诊断、开篇与故事单元自检;非过签预测"},
92
92
  {"id": "fanqie-novel", "name": "番茄小说写作与流量守则",
93
93
  "file": "fanqie-novel.md",
94
94
  "scopes": ["novel", "serial_novel"],
95
- "note": "算法流量池/完读追读、黄金三章整体验、题材标签匹配、更新纪律、合同要点"},
95
+ "note": "番茄经验边界、阅读数据假设、故事单元自检与后台规则核验;非算法预测"},
96
96
  ]
97
97
 
98
98
  # ---------------------------------------------------------------- 用户自建包(3A)
@@ -484,7 +484,7 @@ def upsert_lesson(scope, title, content, source="", category=None, dim=None):
484
484
  "created_at": _now(),
485
485
  # 稳定 token(procedure=程序性做法 / lesson=规避性教训);
486
486
  # 展示层 view() 翻译成「做法/教训」,持久层不用中文防改文案伤数据
487
- "kind": ("procedure" if title.startswith("做法:") else "lesson")}
487
+ "kind": ("procedure" if title.startswith(("做法:", "候选做法:")) else "lesson")}
488
488
  it.update({k: rev[k] for k in ("revision_id", "content_sha256")})
489
489
  items.append(it)
490
490
  _save(data)
@@ -726,17 +726,17 @@ def block_for(task, scope_override=None, *, stable_order=False, run_id=None):
726
726
  # run 内稳定:won 只在 run 收尾回写,任务中途字节不变。
727
727
  karma = ""
728
728
  if int(x.get("won") or 0) >= 2:
729
- karma = "(已验证有效 %d 次)" % int(x.get("won") or 0)
729
+ karma = "(同类维度达标关联 %d 次,非因果证明)" % int(x.get("won") or 0)
730
730
  lines.append("- [%s] **%s**%s:%s" % (x["id"], x["title"], karma, x["content"]))
731
731
  used.append(x["id"])
732
732
  lesson_ids.append(x["id"])
733
- lesson_part = ("### 【本项目已沉淀的教训(历史评审反复出现,务必规避;方括号内为教训编号)】\n"
733
+ lesson_part = ("### 【本项目经验记录(证据强度以条目标注为准;先结合当前正文判断,不要机械套用;方括号内为编号)】\n"
734
734
  + "\n".join(lines))
735
735
 
736
736
  if not parts and not lesson_part:
737
737
  return "", []
738
738
 
739
- header = "## 经验库(写作/工程规范 + 历史教训,必须遵守)\n\n"
739
+ header = "## 经验库(写作/工程规范 + 过往经验记录;按证据强度参考)\n\n"
740
740
  budget = max(600, MAX_INJECT_CHARS - len(lesson_part))
741
741
  body = "\n\n".join(parts)
742
742
  if len(body) > budget:
@@ -814,16 +814,17 @@ def bump_hits(ids):
814
814
 
815
815
  LEARN_PROMPT = """你是编排系统的复盘官。下面是刚结束的一次任务运行的评审结果与主要问题。
816
816
  请把**可复用到下次同类任务**的经验提炼出来(不要复述本次剧情,不要写泛泛的套话)。
817
- 两类都要看:①需要规避的教训(来自问题);②**已验证有效的做法**(mengram 程序性
818
- 记忆借鉴:任务一次通过且分数高时,把「这次做对了什么」提炼成可复用步骤,title
819
- 以「做法:」开头,如「做法:先列评分点再逐条应答」)。
817
+ 两类都要看:①待复核的问题观察(来自本次问题);②候选做法(mengram 程序性记忆
818
+ 借鉴:任务一次通过且分数高时,可提炼「这次可能做对了什么」,title 以「候选做法:」
819
+ 开头,如「候选做法:先列评分点再逐条应答」。单次运行不能称为已验证,也不能据此
820
+ 推断因果;只有跨运行重复观察后,才可作为更强证据。经验仅适用于当前任务类型,避免升格成跨题材硬规则。
820
821
  只输出一个 ```json 代码块,不要输出其他内容。JSON 结构:
821
- {"lessons": [{"title": "≤14 字的归类(教训直接写;有效做法以「做法:」开头)", "category": "问题分类", "content": "下次必须怎么做/避免什么(≤120 字,具体可执行)", "violates": ["sk-xxxxxx"]}]}
822
+ {"lessons": [{"title": "≤14 字的归类(观察以「本次观察:」开头;做法以「候选做法:」开头)", "category": "问题分类", "content": "本次证据及适用边界(≤120 字,不写成普遍定律)", "violates": ["sk-xxxxxx"]}]}
822
823
  violates:本次问题**戳穿了下面「本次已注入的历史教训」中的哪几条**(那几条已在提示词里却没防住),
823
824
  只能填下面列出的编号原值,不确定或没有对应就填 []。
824
825
  category 必须从以下固定枚举中选一个(贴合评审维度,不要自创类别):
825
826
  __CATEGORIES__
826
- 最多 5 条,只保留反复出现或影响过稿/验收的关键项;一次通过的高分运行优先提炼「做法」;没有值得沉淀的就返回空数组。
827
+ 最多 5 条,只保留本次证据明确且影响较大的观察;单次成功只能提炼「候选做法」;没有值得沉淀的就返回空数组。不要用「反复」「总是」「必须」描述单次运行证据。
827
828
 
828
829
  ## 任务类型
829
830
  __TYPE__
@@ -939,7 +940,7 @@ def _attribute(registered, by_id, issues, strengths):
939
940
 
940
941
 
941
942
  def _fallback_lessons(task, run):
942
- """无编排者时的确定性兜底:按维度把反复出现的问题聚成教训。"""
943
+ """无编排者时的确定性兜底:只记录本次观察,不把单次结果泛化成规律。"""
943
944
  v = run.get("verdict") or {}
944
945
  out = []
945
946
  weak = {}
@@ -950,15 +951,15 @@ def _fallback_lessons(task, run):
950
951
  for d, lst in sorted(weak.items(), key=lambda kv: -len(kv[1]))[:3]:
951
952
  chs = "、".join("第 %s 章(%.1f)" % (c, s) for c, s in lst[:4])
952
953
  out.append({"dim": d,
953
- "title": "%s 维度反复不达标" % d,
954
- "content": "历史运行中 %s 的「%s」多次低于阈值(%s)。写这一维度前先对照经验包自检,"
955
- "宁可少写事件也要把该维度做扎实。" % (task.get("type"), d, chs)})
954
+ "title": "本次观察:%s偏弱" % d,
955
+ "content": "单次运行%s的评审中,「%s」在%s低于阈值;这是待复核信号,不代表题材通用规律。"
956
+ "后续先检查对应文本证据与任务目标,再决定是否调整。" % (task.get("type"), d, chs)})
956
957
  for d, s in (v.get("global_scores") or {}).items():
957
958
  if float(s) < float(v.get("threshold") or 7.0):
958
959
  out.append({"dim": d,
959
- "title": "全书「%s」被一致性评审扣分" % d,
960
- "content": "单章达标但全书「%s」仅 %.1f 分。下一部作品在章纲阶段就要规划该维度的"
961
- "整体曲线(而不是逐章各写各的)。" % (d, float(s))})
960
+ "title": "本次观察:全书%s偏弱" % d,
961
+ "content": "单次运行的一致性评审中,全书「%s」得 %.1f 分;这是待复核信号。先查看评审证据,"
962
+ "确认问题确由全书结构造成后,再决定是否在后续大纲中规划整体曲线。" % (d, float(s))})
962
963
  return out[:5]
963
964
 
964
965
 
@@ -1007,13 +1008,21 @@ def learn_from_run(run_id, use_orchestrator=True):
1007
1008
  task = store.get_task(run.get("task_id")) if run.get("task_id") else None
1008
1009
  if not task:
1009
1010
  return 0
1011
+ # 只有正常完成的运行才可沉淀;failed/cancelled/timeout 即便残留 verdict,
1012
+ # 也可能是半成品或基础设施故障,不能当作内容质量证据。
1013
+ if (run.get("status") or "") != "done":
1014
+ return 0
1010
1015
  # mock 运行不沉淀(没有真实评审信号)
1011
- if all((s.get("agent") or "").startswith("mock") for s in (run.get("steps") or [])):
1016
+ steps = run.get("steps") or []
1017
+ if not steps or all((s.get("agent") or "").startswith("mock") for s in steps):
1012
1018
  return 0
1013
1019
  v = verdict
1014
1020
  if not v:
1015
1021
  return 0
1022
+ if outcome is None and not (v.get("chapter_scores") or v.get("global_scores")):
1023
+ return 0 # 仅有摘要/执行状态但无明确结论或评分,不作为质量信号
1016
1024
  lessons = []
1025
+ model_returned_lessons = False
1017
1026
  if use_orchestrator:
1018
1027
  try:
1019
1028
  from . import modelhub, runner
@@ -1038,15 +1047,17 @@ def learn_from_run(run_id, use_orchestrator=True):
1038
1047
  data = runner.extract_json(res.get("text") or "")
1039
1048
  raw = (data or {}).get("lessons") if isinstance(data, dict) else None
1040
1049
  if isinstance(raw, list):
1050
+ model_returned_lessons = True
1041
1051
  for x in raw[:5]:
1042
- if isinstance(x, dict) and x.get("title") and x.get("content"):
1052
+ if (isinstance(x, dict) and x.get("title") and x.get("content")
1053
+ and str(x["title"]).strip().startswith(("本次观察:", "候选做法:"))):
1043
1054
  lessons.append({"title": str(x["title"]), "content": str(x["content"]),
1044
1055
  "category": x.get("category")})
1045
1056
  for lid in (x.get("violates") or [])[:MAX_LESSONS_INJECT]:
1046
1057
  cited.add(str(lid).strip())
1047
1058
  except Exception:
1048
1059
  lessons = []
1049
- if not lessons:
1060
+ if not lessons and not model_returned_lessons:
1050
1061
  lessons = _fallback_lessons(task, run)
1051
1062
  n = 0
1052
1063
  for x in lessons: