@gobing-ai/knowledge-kit 0.1.11 → 0.1.13

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 (137) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/dist/index.js +2372 -1722
  3. package/package.json +1 -1
  4. package/plugins/generations/image-gen/README.md +108 -0
  5. package/plugins/generations/image-gen/assets/sample/cover__clean-webapp-ui.jpg +0 -0
  6. package/plugins/generations/image-gen/assets/sample/cover__cute.jpg +0 -0
  7. package/plugins/generations/image-gen/assets/sample/cover__daily-news.jpg +0 -0
  8. package/plugins/generations/image-gen/assets/sample/cover__editorial.jpg +0 -0
  9. package/plugins/generations/image-gen/assets/sample/cover__fresh.jpg +0 -0
  10. package/plugins/generations/image-gen/assets/sample/cover__minimalist.jpg +0 -0
  11. package/plugins/generations/image-gen/assets/sample/cover__photorealistic.jpg +0 -0
  12. package/plugins/generations/image-gen/assets/sample/cover__sketch.jpg +0 -0
  13. package/plugins/generations/image-gen/assets/sample/cover__technical-diagram.jpg +0 -0
  14. package/plugins/generations/image-gen/assets/sample/cover__vibrant.jpg +0 -0
  15. package/plugins/generations/image-gen/assets/sample/cover__warm.jpg +0 -0
  16. package/plugins/generations/image-gen/assets/sample/cover__xhs-knowledge.jpg +0 -0
  17. package/plugins/generations/image-gen/assets/sample/daily-news-cover__clean-webapp-ui.jpg +0 -0
  18. package/plugins/generations/image-gen/assets/sample/daily-news-cover__cute.jpg +0 -0
  19. package/plugins/generations/image-gen/assets/sample/daily-news-cover__daily-news.jpg +0 -0
  20. package/plugins/generations/image-gen/assets/sample/daily-news-cover__editorial.jpg +0 -0
  21. package/plugins/generations/image-gen/assets/sample/daily-news-cover__fresh.jpg +0 -0
  22. package/plugins/generations/image-gen/assets/sample/daily-news-cover__minimalist.jpg +0 -0
  23. package/plugins/generations/image-gen/assets/sample/daily-news-cover__photorealistic.jpg +0 -0
  24. package/plugins/generations/image-gen/assets/sample/daily-news-cover__sketch.jpg +0 -0
  25. package/plugins/generations/image-gen/assets/sample/daily-news-cover__technical-diagram.jpg +0 -0
  26. package/plugins/generations/image-gen/assets/sample/daily-news-cover__vibrant.jpg +0 -0
  27. package/plugins/generations/image-gen/assets/sample/daily-news-cover__warm.jpg +0 -0
  28. package/plugins/generations/image-gen/assets/sample/daily-news-cover__xhs-knowledge.jpg +0 -0
  29. package/plugins/generations/image-gen/assets/sample/free__clean-webapp-ui.jpg +0 -0
  30. package/plugins/generations/image-gen/assets/sample/free__cute.jpg +0 -0
  31. package/plugins/generations/image-gen/assets/sample/free__daily-news.jpg +0 -0
  32. package/plugins/generations/image-gen/assets/sample/free__editorial.jpg +0 -0
  33. package/plugins/generations/image-gen/assets/sample/free__fresh.jpg +0 -0
  34. package/plugins/generations/image-gen/assets/sample/free__minimalist.jpg +0 -0
  35. package/plugins/generations/image-gen/assets/sample/free__photorealistic.jpg +0 -0
  36. package/plugins/generations/image-gen/assets/sample/free__sketch.jpg +0 -0
  37. package/plugins/generations/image-gen/assets/sample/free__technical-diagram.jpg +0 -0
  38. package/plugins/generations/image-gen/assets/sample/free__vibrant.jpg +0 -0
  39. package/plugins/generations/image-gen/assets/sample/free__warm.jpg +0 -0
  40. package/plugins/generations/image-gen/assets/sample/free__xhs-knowledge.jpg +0 -0
  41. package/plugins/generations/image-gen/assets/sample/illustration__clean-webapp-ui.jpg +0 -0
  42. package/plugins/generations/image-gen/assets/sample/illustration__cute.jpg +0 -0
  43. package/plugins/generations/image-gen/assets/sample/illustration__daily-news.jpg +0 -0
  44. package/plugins/generations/image-gen/assets/sample/illustration__editorial.jpg +0 -0
  45. package/plugins/generations/image-gen/assets/sample/illustration__fresh.jpg +0 -0
  46. package/plugins/generations/image-gen/assets/sample/illustration__minimalist.jpg +0 -0
  47. package/plugins/generations/image-gen/assets/sample/illustration__photorealistic.jpg +0 -0
  48. package/plugins/generations/image-gen/assets/sample/illustration__sketch.jpg +0 -0
  49. package/plugins/generations/image-gen/assets/sample/illustration__technical-diagram.jpg +0 -0
  50. package/plugins/generations/image-gen/assets/sample/illustration__vibrant.jpg +0 -0
  51. package/plugins/generations/image-gen/assets/sample/illustration__warm.jpg +0 -0
  52. package/plugins/generations/image-gen/assets/sample/illustration__xhs-knowledge.jpg +0 -0
  53. package/plugins/generations/image-gen/assets/sample/xhs-card__clean-webapp-ui.jpg +0 -0
  54. package/plugins/generations/image-gen/assets/sample/xhs-card__cute.jpg +0 -0
  55. package/plugins/generations/image-gen/assets/sample/xhs-card__daily-news.jpg +0 -0
  56. package/plugins/generations/image-gen/assets/sample/xhs-card__editorial.jpg +0 -0
  57. package/plugins/generations/image-gen/assets/sample/xhs-card__fresh.jpg +0 -0
  58. package/plugins/generations/image-gen/assets/sample/xhs-card__minimalist.jpg +0 -0
  59. package/plugins/generations/image-gen/assets/sample/xhs-card__photorealistic.jpg +0 -0
  60. package/plugins/generations/image-gen/assets/sample/xhs-card__sketch.jpg +0 -0
  61. package/plugins/generations/image-gen/assets/sample/xhs-card__technical-diagram.jpg +0 -0
  62. package/plugins/generations/image-gen/assets/sample/xhs-card__vibrant.jpg +0 -0
  63. package/plugins/generations/image-gen/assets/sample/xhs-card__warm.jpg +0 -0
  64. package/plugins/generations/image-gen/assets/sample/xhs-card__xhs-knowledge.jpg +0 -0
  65. package/plugins/generations/image-gen/dist/index.js +102 -58
  66. package/plugins/generations/image-gen/scripts/compose-e2e-artifact.ts +5 -21
  67. package/plugins/generations/image-gen/scripts/gen-samples.ts +208 -0
  68. package/plugins/generations/image-gen/src/compose/chromium.ts +2 -3
  69. package/plugins/generations/image-gen/src/presets.ts +6 -3
  70. package/plugins/generations/image-gen/src/providers/errors.ts +16 -1
  71. package/plugins/generations/image-gen/src/providers/minimax.ts +46 -17
  72. package/plugins/ingestions/web-search/src/index.ts +1 -1
  73. package/plugins/kk/README.md +18 -0
  74. package/plugins/kk/commands/image-extract.md +1 -0
  75. package/plugins/kk/commands/image-generate.md +1 -0
  76. package/plugins/kk/commands/tell-me.md +1 -0
  77. package/plugins/kk/commands/workflow-run.md +7 -1
  78. package/plugins/kk/decisions/extract/it-topics.yaml +24 -0
  79. package/plugins/kk/decisions/kk-itc.yaml +6 -4
  80. package/plugins/kk/plugin.json +1 -1
  81. package/plugins/kk/publish-presets/daily-ai-voice-migration.json +146 -0
  82. package/plugins/kk/publish-presets/daily-ai-voice.json +15 -7
  83. package/plugins/kk/schedules/kk-collect.grok-bot.md.tmpl +69 -0
  84. package/plugins/kk/schedules/kk-daily-ai-voice3.cron.tmpl +18 -0
  85. package/plugins/kk/schedules/kk-daily-publish3-cn-peak.cron.tmpl +15 -5
  86. package/plugins/kk/schedules/kk-daily-publish3-overseas.cron.tmpl +9 -4
  87. package/plugins/kk/scripts/daily-scheduled-run.ts +91 -41
  88. package/plugins/kk/scripts/daily-stages.ts +394 -53
  89. package/plugins/kk/scripts/kk-workflow-stages.ts +190 -0
  90. package/plugins/kk/scripts/safety-artifact-check.ts +70 -28
  91. package/plugins/kk/scripts/voice3-publish-window.ts +202 -0
  92. package/plugins/kk/skills/article-adapt/SKILL.md +1 -0
  93. package/plugins/kk/skills/audio-authoring/SKILL.md +1 -0
  94. package/plugins/kk/skills/content-judge/SKILL.md +1 -0
  95. package/plugins/kk/skills/content-safety/SKILL.md +1 -0
  96. package/plugins/kk/skills/content-safety/references/platforms/podcast-salty.md +41 -0
  97. package/plugins/kk/skills/content-safety/references/platforms/surfdash.md +36 -0
  98. package/plugins/kk/skills/content-safety/references/platforms/xhs.md +39 -0
  99. package/plugins/kk/skills/explain-things/SKILL.md +1 -0
  100. package/plugins/kk/skills/image-authoring/SKILL.md +1 -0
  101. package/plugins/kk/skills/itc-generating/SKILL.md +1 -0
  102. package/plugins/kk/skills/publish/SKILL.md +1 -0
  103. package/plugins/kk/skills/smart-seo/SKILL.md +1 -0
  104. package/plugins/kk/skills/storm-research/SKILL.md +1 -0
  105. package/plugins/kk/skills/taste-unslop/SKILL.md +1 -0
  106. package/plugins/kk/skills/topic/SKILL.md +1 -0
  107. package/plugins/kk/skills/web-automation/SKILL.md +1 -0
  108. package/plugins/kk/skills/xhs-images/SKILL.md +1 -0
  109. package/plugins/kk/workflows/kk-collect.yaml +3 -3
  110. package/plugins/kk/workflows/kk-daily-ai-voice2.yaml +21 -19
  111. package/plugins/kk/workflows/kk-daily-ai-voice3.yaml +163 -63
  112. package/plugins/kk/workflows/kk-daily-publish3.yaml +82 -26
  113. package/plugins/kk/workflows/kk-daily-safety.yaml +39 -31
  114. package/plugins/kk/workflows/kk-itc-author.yaml +75 -0
  115. package/plugins/kk/workflows/kk-itc-publish-tail.yaml +25 -3
  116. package/plugins/kk/workflows/kk-itc.yaml +36 -4
  117. package/plugins/publishings/linkedin-pub/dist/index.js +21333 -0
  118. package/plugins/publishings/linkedin-pub/dist/profile-check.js +21005 -0
  119. package/plugins/publishings/linkedin-pub/package.json +19 -0
  120. package/plugins/publishings/linkedin-pub/plugin.json +12 -0
  121. package/plugins/publishings/linkedin-pub/src/index.ts +705 -0
  122. package/plugins/publishings/linkedin-pub/src/profile-check.ts +17 -0
  123. package/plugins/publishings/linkedin-pub/tsconfig.json +4 -0
  124. package/plugins/publishings/surfdash-pub/dist/index.js +53 -24
  125. package/plugins/publishings/surfdash-pub/src/index.ts +72 -25
  126. package/plugins/publishings/threads-pub/dist/index.js +7 -0
  127. package/plugins/publishings/threads-pub/src/index.ts +12 -0
  128. package/plugins/publishings/wechatmp-pub/dist/index.js +176 -32
  129. package/plugins/publishings/wechatmp-pub/src/flow.ts +298 -52
  130. package/plugins/publishings/weibo-pub/dist/index.js +100 -7
  131. package/plugins/publishings/weibo-pub/src/index.ts +111 -11
  132. package/plugins/publishings/x-pub/dist/index.js +7 -0
  133. package/plugins/publishings/x-pub/src/index.ts +11 -0
  134. package/plugins/publishings/xhs-pub/dist/index.js +164 -12
  135. package/plugins/publishings/xhs-pub/dist/profile-check.js +11 -1
  136. package/plugins/publishings/xhs-pub/src/flow.ts +194 -23
  137. package/plugins/publishings/xhs-pub/src/page.ts +26 -0
@@ -0,0 +1,36 @@
1
+ # Salty Talk / Surfing (surfdash) — platform reference
2
+
3
+ `surfing.salty.vip` 是本项目自有的静态发布站点(Robin Min 自有域名,栏目「AI 乱炖」,zh/en/ja 三语)。
4
+ 这是**自有渠道**,不是第三方分发平台:没有平台审核队列、字级词表或 AI 标注接口可引用。
5
+ 本文件存在的意义是把「自有站点没有平台规则」这件事写清楚,避免审核流程把「无三方平台规则」
6
+ 误判成证据缺口并默认 BLOCK。
7
+
8
+ | Field | Value |
9
+ |-------|-------|
10
+ | Official source | 自有站点,无第三方协议页;本文件由站点维护者(Robin Min)本人核定 |
11
+ | Scope | `surfing.salty.vip` 文章页(正文、frontmatter 的 title/description/key_points/cover) |
12
+ | Effective date | 本文件创建日即生效(自有平台规则由维护者裁定) |
13
+ | Last verified | 2026-11-05(创建) |
14
+ | Evidence status | 维护者本人口径,非三方引用;无字级禁用词表 |
15
+
16
+ ## Evidence distinctions
17
+
18
+ - **维护者裁定(本文件的权威来源)**:站点是自有域名下的小型技术/资讯栏目,采用与本项目其他
19
+ 台一致的通用内容纪律;没有平台方提供的可引用条款。
20
+ - **通用纪律(沿用技能默认)**:披露/AI 声明、来源可靠性、隐私/PII、医疗/投资类内容红线全部
21
+ 沿用技能 default;本文件不新增平台规则。
22
+
23
+ ## Review items
24
+
25
+ | ID | Item | Grade |
26
+ |----|------|-------|
27
+ | SD-01 | 来源诚实性:对外引用(媒体/论文/Blog)须给出真实出处链接;「综述性转述未读原文」是 sourcing gap,按 note 记录并在站点正文保持既有 hedging;**不要**因为转述来自聚合页/未读原文而 block——这与 apple-podcasts 的 AP-06 严格度不同,自有站点由维护者自行判断并复核。 | note |
28
+ | SD-02 | 数字与事实核对:与源链接一致的数字/日期/机构名出现冲突时按技能通用规则处理(correctable → revise;冲突无解 → block)。 | note→judge |
29
+ | SD-03 | 可识别个人信息(听众或第三方的私人信息、联系方式、住址等) | desensitize→block if unfixable |
30
+ | SD-04 | roku/医疗/投资劝诱内容技能默认红线不变(本文件不放开任何默认红线)。 | default |
31
+
32
+ ## Open questions / escalation
33
+
34
+ - 自有站点无第三方审核 → 本文件不应产生 `evidenceGap: true` 类 BLOCK;任何「surfdash 无 reference
35
+ 文件」的发现都指向本文件缺失,而不是内容风险。
36
+ - 若未来站点引入广告或国家安全审查类规则,本文件需要更新。
@@ -0,0 +1,39 @@
1
+ # 小红书 (Xiaohongshu / xhs) — platform reference
2
+
3
+ Review-item IDs here are **this skill's bookkeeping numbers**, not official platform rule codes.
4
+ 与 xiaoyuzhou.md 同一格式约定:这是本技能基于操作者已核验证据的保守立场,不是平台条文。
5
+
6
+ | Field | Value |
7
+ |-------|-------|
8
+ | Official source | <https://www.xiaohongshu.com/community/>(社区公约/创作细则入口,多级页面) |
9
+ | Scope | 笔记(图文/视频长文)、封面图、话题标签、昵称简介 |
10
+ | Effective date | unknown(社区公约页面未标注可引用的版本生效日期) |
11
+ | Last verified | 2026-11-05(写本文件时按操作者已有账号审查经验整理,未逐字读官方更新后全文) |
12
+ | Evidence status | **未获官方逐字条文**;以下审核项是本技能的保守立场,不是平台条文;与小宇宙 0189 事件类似,任何具体下架理由以官方为主,本技能按保守项判断 |
13
+
14
+ ## Evidence distinctions
15
+
16
+ - **官方规则(已知存在,未逐字核对)**:小红书有《社区公约》与《创作规范》,对违法违规、医疗
17
+ 健康、财产投资、隐私、低质同质化、AI 生成内容有原则性条款;公开文本不提供逐字词表。
18
+ - **操作者经验(保守立场来源)**:账号为个人技术分享(栏目「AI 乱炖」衍生),非新闻机构、无
19
+ 医疗/金融资质、不带货;发帖以图文长文/播客预告为主。
20
+ - **编辑建议(本技能)**:以下审核项是本技能基于上述证据的保守立场,不是平台条文。
21
+
22
+ ## Review items
23
+
24
+ | ID | Item | Grade |
25
+ |----|------|-------|
26
+ | XH-01 | 资质口径:不得呈现「新闻资讯播报」形态或暗示持有新闻资质(技术/科普类分享不受影响;同 xiaoyuzhou.md XY-01 的操作者裁定 2026-10-10,按 note 记录,不逐集 escalate)。 | note |
27
+ | XH-02 | 医疗健康/药品/诊疗建议:以医疗结论、疗效、用药指导为主线的内容(本栏目主题为 AI 技术/产业资讯,正常不会触发;一旦触发按 block)。 | block |
28
+ | XH-03 | 投资/理财:以个股买卖建议、收益承诺为主线的内容(对 quadrature/Anthropic 等估值表述属于普通事实转述,不是建议;命中后再 judge)。 | block |
29
+ | XH-04 | AI 生成内容标识:平台对 AI 生成内容有标注要求(** 未逐字核对当前接口规则,按公共常见要求保守处理**)。本栏目发布为「AI 辅助创作」的播客预告/图文 —— 操作者已在账号简介披露 AI 辅助;单条内容不再逐条 escalate。 | note |
30
+ | XH-05 | 可识别个人信息(听众或第三方的私人信息、联系方式、住址等) | desensitize→block if unfixable |
31
+ | XH-06 | 时政/公共事务主线:同 xiaoyuzhou.md XY-02(政策管制、军事、公共政策争议为主线的内容按 block)。 | block |
32
+
33
+ ## Open questions / escalation
34
+
35
+ - 无官方字级词表 → 任何「词命中即下架」的断言都不成立;同理,无词表不等于安全。
36
+ - AI 标注、内容审核新规变化频繁 → 每次提审前按 XH-04 复核;`RISK` 或证据缺口一律人工复审
37
+ (`escalate: true`),不得静默 PASS。
38
+ - 资质口径、时政主线与个人信息的红线全部沿用技能默认,本文件只 diminute XH-04 的逐条 escalate
39
+ (业务上固定披露已存在)。
@@ -7,6 +7,7 @@ description: >-
7
7
  "how does X work", "ELI5", "like I'm 5", or "show me". Normal explanations are
8
8
  concise inline views; the ELI5 register is opt-in. This is not for content authoring,
9
9
  research, judging, publishing, or package/code review workflows.
10
+ requires: [local-fs]
10
11
  ---
11
12
 
12
13
  # explain-things
@@ -7,6 +7,7 @@ description: >-
7
7
  "list the image formats and styles". Three operations — generate,
8
8
  extract-style, list-presets — over named format and style presets, with a
9
9
  confirmation gate before any paid generation.
10
+ requires: [cli:kk, cli:spur, local-fs]
10
11
  ---
11
12
 
12
13
  # image-authoring — image generation agent surface (generate | extract-style | list-presets)
@@ -7,6 +7,7 @@ description: >-
7
7
  writing method", "generate an IT technical draft on X", "create a technical
8
8
  article for WeChat/English platforms". Orchestrates topic (outline + draft),
9
9
  optional storm-research, and optional content-judge without enlarging those skills.
10
+ requires: [cli:kk, local-fs]
10
11
  ---
11
12
 
12
13
  # itc-generating — IT technical draft generation (method + orchestration)
@@ -6,6 +6,7 @@ description: >-
6
6
  `kk executor run` / `kk fanout` for file-cli and script channels; sequences
7
7
  agent-default CMS channels as workflow `agent.run` steps. Does not own
8
8
  transport.
9
+ requires: [cli:kk, local-fs]
9
10
  ---
10
11
 
11
12
  # publish — leftover channel operator surface
@@ -6,6 +6,7 @@ description: >-
6
6
  this saved audit", "explain these SEO findings", or "check GEO readiness". Read-only results: no
7
7
  site mutation, no ranking and no citation promises.
8
8
  version: 0.1.0
9
+ requires: [cli:kk, cli:spur, local-fs]
9
10
  ---
10
11
 
11
12
  # smart-seo — evidence-grounded SEO/GEO audits
@@ -8,6 +8,7 @@ description: >-
8
8
  (prepare → ingest → generate → render) over the 0056 works layout. Research is separate from
9
9
  authoring: topic owns init→outline→draft and this skill never merges into topic.
10
10
  version: 0.1.0
11
+ requires: [cli:kk, local-fs]
11
12
  ---
12
13
 
13
14
  # storm-research — STORM daily research (topic sentence XOR markdown file → content.md)
@@ -5,6 +5,7 @@ description: >-
5
5
  voice and substance — "make this sound human", "remove the AI tells", "audit this
6
6
  copy for canned patterns", "restore my voice after AI editing". Not for code,
7
7
  translation-only work, or proofreading that must preserve style.
8
+ requires: [local-fs]
8
9
  ---
9
10
 
10
11
  # taste-unslop
@@ -7,6 +7,7 @@ description: >-
7
7
  Runs the topic-core authoring loop (init → outline → draft) through four
8
8
  operations with explicit operator gates and safe resume. knowledge-kit's
9
9
  cohesive topic-authoring core, harvested from the WT 7-stage wrappers.
10
+ requires: [cli:kk, cli:spur, local-fs]
10
11
  ---
11
12
 
12
13
  # topic — topic-core authoring (create | init | outline | draft)
@@ -9,6 +9,7 @@ description: >-
9
9
  web-automation skill. Owns method and evidence; transport stays in kk
10
10
  plugins; orchestration is a @gobing-ai/ts-dual-workflow-engine
11
11
  transition-flow (see docs/design/web-automation-engine.md).
12
+ requires: [cli:spur, local-fs]
12
13
  ---
13
14
 
14
15
  # web-automation — discover, enhance, automate with a real browser
@@ -7,6 +7,7 @@ description: >-
7
7
  closing) grounded in the source, renders them through the image-gen executor
8
8
  with the xhs-card/xhs-knowledge presets, packages a publishable Content, and
9
9
  hands off to kk:publish channel xhs. Never publishes directly.
10
+ requires: [cli:kk, local-fs]
10
11
  ---
11
12
 
12
13
  # xhs-images — source-grounded XHS card series (plan → render → package → handoff)
@@ -48,10 +48,10 @@ states:
48
48
  onEnter:
49
49
  - kind: shell
50
50
  options:
51
- # Reporting only: a ledger failure must never abort a tick before the lock is even taken.
52
- onError: continue
53
51
  command: >-
54
52
  kk ledger sync --workflow kk-collect
53
+ # Reporting only: a ledger failure must never abort a tick before the lock is even taken.
54
+ onError: continue
55
55
  - kind: shell
56
56
  options:
57
57
  # stamp: the pinned var, else the UTC minute (R4). work_dir: `.works/kk-collect/<stamp>` (R4),
@@ -92,13 +92,13 @@ states:
92
92
  # revocation warns (captured:false) and only disables Board previews.
93
93
  # onError: continue keeps the lock-releasing failure path intact instead of a hard abort.
94
94
  options:
95
- onError: continue
96
95
  command: >-
97
96
  kk board capture --workflow kk-collect --run "${vars.__runId}"
98
97
  --work-dir "${vars.work_dir}" --stamp "${vars.stamp}"
99
98
  --definition-digest "${vars.__definitionDigest}"
100
99
  --setting "limit=${vars.limit}" --setting "horizon_hours=${vars.horizon_hours}"
101
100
  > "${vars.work_dir}/board-capture.json"
101
+ onError: continue
102
102
  - kind: shell
103
103
  # onError: continue on both ingestion actions, with the artifact guard below as the positive
104
104
  # success contract: a state-machine aborts the run on a failed action without taking a
@@ -221,10 +221,10 @@ nodes:
221
221
  action:
222
222
  kind: shell
223
223
  options:
224
- onError: continue
225
224
  command: >-
226
225
  kk plugin check wechatmp-pub xhs-pub --timeout 60000
227
226
  || echo "session-preflight: a publish channel's saved session was refused — fix it before this run's publish step with: bun plugins/publishings/<channel>-pub/src/profile-check.ts login (wechatmp or xhs)"
227
+ onError: continue
228
228
 
229
229
  - id: extract
230
230
  description: >-
@@ -509,7 +509,7 @@ nodes:
509
509
  # 0238 R3: reads 21-plan/<date>_03_plan_plan.json, so it must not start before the plan
510
510
  # producers settle. `script-style` stays first in the list: a done dependency in the mix keeps
511
511
  # this node runnable when the plan-authoring nodes are disabled (all-skipped deps skip a node).
512
- dependsOn: [script-style, plan-translate, plan-translate-retry]
512
+ dependsOn: [script-style, plan-translate, plan-translate-retry, article]
513
513
  condition:
514
514
  kind: shell
515
515
  options:
@@ -620,8 +620,8 @@ nodes:
620
620
  kk store pool-count "${vars.work_dir}/21-plan/${vars.run_date}_04_quality-control-content_candidates.json" --min 1
621
621
  action:
622
622
  kind: shell
623
+ onError: continue
623
624
  options:
624
- onError: continue
625
625
  command: >-
626
626
  OMNIVOICE_SPEED=1.06 kk stage daily-generate "${vars.work_dir}" "${vars.run_date}" "${vars.plugins_path}" "${vars.transcode_mp3}" "${vars.vdriver}" "1" "${vars.episode_max_minutes}" "${vars.episode_min_minutes}"
627
627
 
@@ -641,8 +641,8 @@ nodes:
641
641
  && ! jq -e '(.metadata.generator == "kk:voxcpm-tts" or .metadata.generator == "kk:gemini-tts") and .metadata.qc.passed == true' "${vars.work_dir}/30-audio/${vars.run_date}_11_generate_content.json"
642
642
  action:
643
643
  kind: shell
644
+ onError: continue
644
645
  options:
645
- onError: continue
646
646
  command: >-
647
647
  kk stage daily-generate "${vars.work_dir}" "${vars.run_date}" "${vars.plugins_path}" "${vars.transcode_mp3}" "gemini" "1" "${vars.episode_max_minutes}" "${vars.episode_min_minutes}"
648
648
 
@@ -689,7 +689,7 @@ nodes:
689
689
  options:
690
690
  command: >-
691
691
  kk stage daily-voice-audit "${vars.work_dir}" "${vars.run_date}" "${vars.plugins_path}"
692
- onError: continue
692
+ onError: continue
693
693
 
694
694
  - id: duration
695
695
  description: "Measured duration gate: under episode_min_minutes the run refuses and closes as no-content (refusal artifact + emptied candidates, exit 0 — 0266); above episode_max_minutes it still fails loud. Duration is authoritative."
@@ -829,7 +829,9 @@ nodes:
829
829
 
830
830
  - id: translate
831
831
  description: >-
832
- Agent translates both scaffolded locale drafts in place. The two draft paths are read from the
832
+ Agent translates both scaffolded locale drafts into <run_date>_21_translate_<locale>.md under the
833
+ work dir (2026-11-04: both executor sandboxes refuse writes into the Surfdash checkout, and the
834
+ step still exits 0); translate-refine installs them over the drafts. The two draft paths are read from the
833
835
  marker files at their fixed paths (no var projection after the fan-out: concurrent setVars is
834
836
  last-writer-wins, design §6), and an empty marker means that locale is absent. The local
835
837
  validation node gates final Surfdash publish so its strict all-locale CMS policy is met.
@@ -837,15 +839,6 @@ nodes:
837
839
  action:
838
840
  kind: agent.run
839
841
  options:
840
- # 20261012 hardening: this is the LAST agent step and a translation failure must not abort
841
- # the overall report/podcast close, yet the step carried no tolerance and no retry sibling — a stochastic
842
- # executor failure here aborted the DAG *after* surfdash and podcast had published, so
843
- # publish-classify, mark-published, run-report and ledger never ran for an otherwise complete
844
- # day. Tolerating the failure is safe because a scaffold is an unpublished draft: the prompt
845
- # below is what flips `draft: true` → `draft: false`, so an untranslated locale stays off the
846
- # site, and `daily-publish-completeness` now reads that flag and reports the locale as failed
847
- # instead of calling a scaffold `done`.
848
- onError: continue
849
842
  role: scribe
850
843
  agent: ${vars.agent}
851
844
  timeoutMs: 600000
@@ -856,11 +849,20 @@ nodes:
856
849
  Translate the en/ja draft posts of the zh article. Read the two marker files at these fixed paths — each holds one draft path, or is empty when that locale was not scaffolded:
857
850
  English: ${vars.work_dir}/31-publish/${vars.run_date}_20_translate-localize_en-post-path.txt
858
851
  Japanese: ${vars.work_dir}/31-publish/${vars.run_date}_20_translate-localize_ja-post-path.txt
859
- For each: if the marker is empty or unreadable, skip that locale. Otherwise edit the named file in place — translate the frontmatter title and the whole markdown body to natural English/Japanese respectively. Keep frontmatter keys, dates, URLs, code, and the assets/ image reference untouched. Set draft: false (the translated post publishes to the site) and remove any canonical: frontmatter line pointing at a different locale's URL.
852
+ For each: if the marker is empty or unreadable, skip that locale. Otherwise read the named draft but do NOT edit it (it sits in the Surfdash checkout, outside your writable workspace): write the complete translated file — frontmatter and body — to ${vars.work_dir}/31-publish/${vars.run_date}_21_translate_en.md (English) or ${vars.work_dir}/31-publish/${vars.run_date}_21_translate_ja.md (Japanese); a later stage installs it over the draft. Translate the frontmatter title and the whole markdown body to natural English/Japanese respectively. Keep frontmatter keys, dates, URLs, code, and the assets/ image reference untouched. Set draft: false (the translated post publishes to the site) and remove any canonical: frontmatter line pointing at a different locale's URL.
860
853
  Also translate these frontmatter values into the target locale, keeping all other keys untouched: description, seo_title, seo_description, and each key_points item. Each stays one coherent standalone sentence that summarizes the same story as the zh source — never splice fragments from different items or stories into one, and key_points must keep exactly the same number of items as the zh post. The 2026-10-23 run failed this: spliced description/key_points had to be hand-repaired before sync.
861
854
  Series names are fixed product identity, never invented or freely translated: the en series name is "Daily AI Stew" (show "Salty Talk"); the ja series name is "デイリーAIシチュー" (show "咸話咸説"). Never emit 毎日AIブレンド, ごった煮, "Daily AI Medley", "hodgepodge", "Daily AI Briefing", or the zh name 每日AI乱炖 in en/ja prose or link text (a URL keeps whatever it contains). Openers: en "Your Daily AI Stew from Robin, on Salty Talk."; ja "咸話咸説のデイリーAIシチュー、Robin がお届けします。" Listen links: en "[listen to Daily AI Stew · <date>](<url>)", ja "[デイリーAIシチュー · <date> を聴く](<url>)". In each key_points item keep the "Label — sentence" shape: the label before " — " stays a short phrase of at most 14 characters (ja) / 28 (en), never truncated with "…". The local translate-validate stage rewrites known retired names deterministically and fails the publish gate on leftovers.
862
855
  Keep frontmatter valid YAML: double-quote any value containing ': '. Read the surfdash translator glossary if present at the surfdash checkout root under .agents/skills/surfdash-translator/glossary.md and apply its terminology.
863
- Do not wait for operator confirmation. Each edited file must end fully in its target language.
856
+ Do not wait for operator confirmation. Each written file must end fully in its target language.
857
+ # 20261012 hardening: this is the LAST agent step and a translation failure must not abort
858
+ # the overall report/podcast close, yet the step carried no tolerance and no retry sibling — a stochastic
859
+ # executor failure here aborted the DAG *after* surfdash and podcast had published, so
860
+ # publish-classify, mark-published, run-report and ledger never ran for an otherwise complete
861
+ # day. Tolerating the failure is safe because a scaffold is an unpublished draft: the prompt
862
+ # above is what flips `draft: true` → `draft: false`, so an untranslated locale stays off the
863
+ # site, and `daily-publish-completeness` now reads that flag and reports the locale as failed
864
+ # instead of calling a scaffold `done`.
865
+ onError: continue
864
866
 
865
867
  # 2026-10-24: the locale translation carried `onError: continue` with NO retry sibling, so a
866
868
  # failed executor left the en/ja drafts untranslated and the old sync stage could not distinguish
@@ -874,15 +876,15 @@ nodes:
874
876
  options:
875
877
  command: >-
876
878
  test "$(cat "${vars.work_dir}/31-publish/${vars.run_date}_20_translate-localize_zh-post-path.txt" 2>/dev/null)" != ""
877
- && { for L in en ja; do M="${vars.work_dir}/31-publish/${vars.run_date}_20_translate-localize_$L-post-path.txt"; P="$(cat "$M" 2>/dev/null)"; [ -z "$P" ] && continue; grep -q '^draft: *false' "$P" || { echo "untranslated: $L ($P)"; exit 0; }; done; exit 1; }
879
+ && { for L in en ja; do M="${vars.work_dir}/31-publish/${vars.run_date}_20_translate-localize_$L-post-path.txt"; P="$(cat "$M" 2>/dev/null)"; [ -z "$P" ] && continue; O="${vars.work_dir}/31-publish/${vars.run_date}_21_translate_$L.md"; grep -q '^draft: *false' "$O" || { echo "untranslated: $L ($O)"; exit 0; }; done; exit 1; }
878
880
  action:
879
881
  kind: agent.run
880
882
  options:
881
- onError: continue
882
883
  role: reviewer
883
884
  agent: ${vars.agent_retry}
884
885
  timeoutMs: 600000
885
886
  input: *translate-input
887
+ onError: continue
886
888
 
887
889
  - id: translate-refine
888
890
  description: "Run the Surfdash-owned refine pass over zh/en/ja locally before the locale fingerprint is admitted; no CMS, git, or remote side effect"