@gobing-ai/knowledge-kit 0.1.13 → 0.1.15
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/.claude-plugin/marketplace.json +1 -1
- package/dist/index.js +796 -176
- package/package.json +1 -1
- package/plugins/generations/content-gen/dist/index.js +2 -2
- package/plugins/generations/core-facts-gen/dist/index.js +2 -2
- package/plugins/generations/daily-article-gen/dist/index.js +2 -2
- package/plugins/generations/dailynews-gen/dist/index.js +72 -9
- package/plugins/generations/dailynews-gen/src/index.ts +23 -1
- package/plugins/generations/dailynews-gen/src/script-plan.ts +103 -5
- package/plugins/generations/episode-plan-gen/dist/index.js +2 -2
- package/plugins/generations/gemini-tts/dist/index.js +2 -2
- package/plugins/generations/image-gen/dist/index.js +2 -2
- package/plugins/generations/news-report-gen/dist/index.js +2 -2
- package/plugins/generations/voice-gen/dist/index.js +2 -2
- package/plugins/generations/voxcpm-tts/dist/index.js +2 -2
- package/plugins/ingestions/aihot-ingest/dist/index.js +2 -2
- package/plugins/ingestions/horizon-ingest/dist/index.js +2 -2
- package/plugins/ingestions/last30days-ingest/dist/index.js +2 -2
- package/plugins/ingestions/web-search/dist/index.js +2 -2
- package/plugins/kk/plugin.json +1 -1
- package/plugins/kk/scripts/daily-scheduled-run.ts +53 -5
- package/plugins/kk/scripts/daily-stages.ts +476 -12
- package/plugins/kk/scripts/kk-workflow-stages.ts +20 -4
- package/plugins/kk/skills/content-judge/SKILL.md +5 -4
- package/plugins/kk/skills/content-judge/references/rubrics.md +14 -0
- package/plugins/kk/skills/news-editorial/SKILL.md +122 -0
- package/plugins/kk/skills/news-editorial/references/selection.md +47 -0
- package/plugins/kk/skills/news-editorial/references/style-contract.zh.md +99 -0
- package/plugins/kk/skills/publish/SKILL.md +3 -3
- package/plugins/kk/skills/web-automation/SKILL.md +229 -77
- package/plugins/kk/skills/web-automation/references/browser-launch.md +127 -36
- package/plugins/kk/workflows/kk-daily-ai-voice2.yaml +4 -6
- package/plugins/kk/workflows/kk-daily-ai-voice3.yaml +183 -222
- package/plugins/kk/workflows/kk-daily-publish3.yaml +16 -8
- package/plugins/publishings/bilibili-pub/dist/index.js +5 -3
- package/plugins/publishings/bilibili-pub/dist/profile-check.js +3 -1
- package/plugins/publishings/cnblogs-pub/dist/index.js +5 -3
- package/plugins/publishings/cnblogs-pub/dist/profile-check.js +3 -1
- package/plugins/publishings/csdn-pub/dist/index.js +5 -3
- package/plugins/publishings/csdn-pub/dist/profile-check.js +5 -3
- package/plugins/publishings/emdash-pub/dist/index.js +2 -2
- package/plugins/publishings/infoq-pub/dist/index.js +5 -3
- package/plugins/publishings/infoq-pub/dist/profile-check.js +5 -3
- package/plugins/publishings/jike-pub/dist/index.js +5 -3
- package/plugins/publishings/jike-pub/dist/profile-check.js +5 -3
- package/plugins/publishings/juejin-pub/dist/index.js +5 -3
- package/plugins/publishings/juejin-pub/dist/profile-check.js +5 -3
- package/plugins/publishings/linkedin-pub/dist/index.js +5 -3
- package/plugins/publishings/linkedin-pub/dist/profile-check.js +5 -3
- package/plugins/publishings/medium-pub/dist/index.js +2 -2
- package/plugins/publishings/podcast-pub/dist/index.js +147 -4
- package/plugins/publishings/podcast-pub/src/index.ts +71 -2
- package/plugins/publishings/podcast-pub/src/map.ts +3 -0
- package/plugins/publishings/podcast-pub/src/transcript.ts +195 -0
- package/plugins/publishings/qiita-pub/dist/index.js +2 -2
- package/plugins/publishings/shipinhao-pub/dist/index.js +5 -3
- package/plugins/publishings/shipinhao-pub/dist/profile-check.js +3 -1
- package/plugins/publishings/sspai-pub/dist/index.js +5 -3
- package/plugins/publishings/sspai-pub/dist/profile-check.js +3 -1
- package/plugins/publishings/substack-pub/dist/index.js +5 -3
- package/plugins/publishings/substack-pub/dist/profile-check.js +5 -3
- package/plugins/publishings/surfdash-pub/dist/index.js +2 -2
- package/plugins/publishings/threads-pub/dist/index.js +2 -2
- package/plugins/publishings/wechatmp-pub/dist/index.js +52 -33
- package/plugins/publishings/wechatmp-pub/dist/profile-check.js +5 -3
- package/plugins/publishings/wechatmp-pub/src/flow.ts +70 -33
- package/plugins/publishings/weibo-pub/dist/index.js +21 -6
- package/plugins/publishings/weibo-pub/dist/profile-check.js +5 -3
- package/plugins/publishings/weibo-pub/src/index.ts +31 -7
- package/plugins/publishings/x-pub/dist/index.js +5 -3
- package/plugins/publishings/x-pub/dist/profile-check.js +5 -3
- package/plugins/publishings/xhs-pub/dist/index.js +5 -3
- package/plugins/publishings/xhs-pub/dist/profile-check.js +5 -3
- package/plugins/publishings/xiaoyuzhou-pub/dist/index.js +5 -3
- package/plugins/publishings/xiaoyuzhou-pub/dist/profile-check.js +3 -1
- package/plugins/publishings/zenn-pub/dist/index.js +2 -2
- package/plugins/kk/scripts/daily-voice-style.zh.md +0 -70
|
@@ -61,10 +61,11 @@ export const SCRIPTS_DIR = import.meta.dir;
|
|
|
61
61
|
export const VALIDATE_SIDECAR = 'validate-voicescript.ts';
|
|
62
62
|
const WRAP_SIDECAR = 'wrap-voicescript-doc.ts';
|
|
63
63
|
const RENDER_SIDECAR = 'render-md.ts';
|
|
64
|
-
//
|
|
65
|
-
//
|
|
66
|
-
//
|
|
67
|
-
export const
|
|
64
|
+
// ADR-045: daily-news editorial policy lives in the kk:news-editorial skill, shipped beside this
|
|
65
|
+
// scripts dir in the same package. Its style contract is what the `write` mode reads (via the run
|
|
66
|
+
// snapshot) and dailynews-gen validates against (DAILYNEWS_STYLE_FILE).
|
|
67
|
+
export const EDITORIAL_SKILL_DIR = join(SCRIPTS_DIR, '..', 'skills', 'news-editorial');
|
|
68
|
+
export const STYLE_CONTRACT = join(EDITORIAL_SKILL_DIR, 'references', 'style-contract.zh.md');
|
|
68
69
|
const REVISE_COUNT = '.revise-count';
|
|
69
70
|
/** Bounded draft-remediation counter for the daily safety loop (20261005). */
|
|
70
71
|
export const SAFETY_REVISE_COUNT = '.safety-revise-count';
|
|
@@ -1877,6 +1878,21 @@ if (import.meta.main)
|
|
|
1877
1878
|
dailyScriptStyle(rest);
|
|
1878
1879
|
break;
|
|
1879
1880
|
}
|
|
1881
|
+
case 'daily-script-check': {
|
|
1882
|
+
const { dailyScriptCheck } = await loadDailyStages();
|
|
1883
|
+
dailyScriptCheck(rest);
|
|
1884
|
+
break;
|
|
1885
|
+
}
|
|
1886
|
+
case 'daily-curate-check': {
|
|
1887
|
+
const { dailyCurateCheck } = await loadDailyStages();
|
|
1888
|
+
dailyCurateCheck(rest);
|
|
1889
|
+
break;
|
|
1890
|
+
}
|
|
1891
|
+
case 'daily-editorial-render': {
|
|
1892
|
+
const { dailyEditorialRender } = await loadDailyStages();
|
|
1893
|
+
dailyEditorialRender(rest);
|
|
1894
|
+
break;
|
|
1895
|
+
}
|
|
1880
1896
|
case 'daily-script': {
|
|
1881
1897
|
const { dailyScript } = await loadDailyStages();
|
|
1882
1898
|
dailyScript(rest);
|
|
@@ -21,7 +21,7 @@ LLM-as-judge is **not** a knowledge-kit plugin kind (ADR-007 amdt 2026-08-07). I
|
|
|
21
21
|
|
|
22
22
|
- A spur workflow needs a quality gate between `generate` and `publish`.
|
|
23
23
|
- A user asks to "judge", "evaluate", "quality-check", or "gate" generated content.
|
|
24
|
-
- A workflow or skill names a rubric (`tech-accuracy` / `brand-tone` / `compliance` / `general`).
|
|
24
|
+
- A workflow or skill names a rubric (`tech-accuracy` / `brand-tone` / `compliance` / `news-balance` / `general`).
|
|
25
25
|
|
|
26
26
|
## Verdict output contract
|
|
27
27
|
|
|
@@ -99,7 +99,7 @@ and `escalate` flag; treat `LOW` as a signal to demand human review before publi
|
|
|
99
99
|
1. **Read the Content** from the path given in the evaluation request (the `content.json` written
|
|
100
100
|
by the preceding `kk executor run <generator>` step).
|
|
101
101
|
2. **Select the rubric** — named in the request (`tech-accuracy`, `brand-tone`,
|
|
102
|
-
`compliance`, `general`). Default: `general`.
|
|
102
|
+
`compliance`, `news-balance`, `general`). Default: `general`.
|
|
103
103
|
3. **Evaluate each criterion** in the rubric. For each, produce a `pass` / `fail` / `warn` status
|
|
104
104
|
backed by a specific, quotable evidence reference (quote, section, claim).
|
|
105
105
|
4. **Score** — weighted aggregate per the rubric's scoring rules. `score` is 0.0–1.0.
|
|
@@ -127,7 +127,7 @@ and `escalate` flag; treat `LOW` as a signal to demand human review before publi
|
|
|
127
127
|
|
|
128
128
|
## Rubrics
|
|
129
129
|
|
|
130
|
-
|
|
130
|
+
Five built-in rubrics. Full definitions, weights, and thresholds live in
|
|
131
131
|
`references/rubrics.md`. The skill body intentionally stays lean — load the reference when
|
|
132
132
|
evaluating.
|
|
133
133
|
|
|
@@ -137,6 +137,7 @@ evaluating.
|
|
|
137
137
|
| `tech-accuracy` | Technical content | factual correctness vs. sources, no fabricated citations, code correctness |
|
|
138
138
|
| `brand-tone` | Published voice | tone consistency, banned-phrase compliance, audience fit |
|
|
139
139
|
| `compliance` | Sensitive content | no prohibited claims, disclosure presence, jurisdictional rules |
|
|
140
|
+
| `news-balance` | Daily news script plan | news-first, commentary-share, no-restatement |
|
|
140
141
|
|
|
141
142
|
## Prompt template
|
|
142
143
|
|
|
@@ -147,7 +148,7 @@ Use this template when the skill is invoked by an `agent.run` step. The workflow
|
|
|
147
148
|
You are an LLM-as-judge evaluating generated content for the knowledge-kit pipeline.
|
|
148
149
|
|
|
149
150
|
Content to evaluate: {{content_path}}
|
|
150
|
-
Rubric: {{rubric}} # general | tech-accuracy | brand-tone | compliance
|
|
151
|
+
Rubric: {{rubric}} # general | tech-accuracy | brand-tone | compliance | news-balance
|
|
151
152
|
Output verdict to: {{verdict_path}}
|
|
152
153
|
|
|
153
154
|
Load the rubric definition from plugins/kk/skills/content-judge/references/rubrics.md (section: {{rubric}}).
|
|
@@ -100,6 +100,20 @@ Thresholds: `pass_threshold = 0.85`
|
|
|
100
100
|
- `data-handling`: scan for PII that may have been carried through from input Docs (emails,
|
|
101
101
|
phone numbers, national IDs). Leakage is a `fail`.
|
|
102
102
|
|
|
103
|
+
## news-balance
|
|
104
|
+
|
|
105
|
+
For daily news episode script plans (`kk-daily-ai-voice3` advisory `editorial-judge` sensor, task 0345 R11). Evaluates the balance of news reporting, commentary, and technical depth against `kk:news-editorial`.
|
|
106
|
+
|
|
107
|
+
| Criterion | Weight | Must-pass |
|
|
108
|
+
|-----------|--------|-----------|
|
|
109
|
+
| `news-first` — `intro` and every `lead` name concrete actors and actions, not abstract essay themes | 0.30 | yes |
|
|
110
|
+
| `commentary-share` — each `insight` is ≤⅓ of the item's spoken length and contains no generic methodology or shopping-list advice | 0.25 | yes |
|
|
111
|
+
| `no-restatement` — `insight` adds judgement rather than repeating the body's facts or numbers | 0.20 | yes |
|
|
112
|
+
| `tech-depth` — mechanisms are explained in 1–2 sentences without textbook primers | 0.15 | no |
|
|
113
|
+
| `ordering` — items are ordered by news weight (urgency × impact), with the strongest concrete news item leading | 0.10 | no |
|
|
114
|
+
|
|
115
|
+
Thresholds: `pass_threshold = 0.80`
|
|
116
|
+
|
|
103
117
|
## Adding a custom rubric
|
|
104
118
|
|
|
105
119
|
1. Add a section to this file with a unique heading and a criteria table matching the schema
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: news-editorial
|
|
3
|
+
description: >-
|
|
4
|
+
Use the news-editorial skill for the editorial judgement of a daily news episode — "curate today's
|
|
5
|
+
news pool", "write the episode script plan", "fix the script plan against these validator errors",
|
|
6
|
+
"apply the daily news style contract". Owns selection and topic boundary, ordering, the balance of
|
|
7
|
+
news, opinion and technical detail, and the style contract. Modes: curate | write | write --fix.
|
|
8
|
+
requires: [cli:kk, local-fs]
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# news-editorial — daily news editorial policy (curate | write | write --fix)
|
|
12
|
+
|
|
13
|
+
## Purpose
|
|
14
|
+
|
|
15
|
+
This skill holds every editorial judgement for a daily news episode: which items to keep, in what order, how
|
|
16
|
+
much opinion and technical detail each gets, and how the spoken words read. Everything deterministic stays
|
|
17
|
+
in code and is **out of scope**: collection and store extraction (`kk store extract`, `decisions/extract/*.yaml`),
|
|
18
|
+
score thresholds (`daily-qc-content`), the VoiceScript builder (fixed greeting and sign-off), validators,
|
|
19
|
+
duration gates, TTS, images and publishing (ADR-045).
|
|
20
|
+
|
|
21
|
+
A workflow reaches this skill through the run snapshot `<work_dir>/20-editorial/news-editorial/` (written by
|
|
22
|
+
`kk stage daily-script-style`). Read files relative to the `SKILL.md` you were pointed at; do not rely on skill
|
|
23
|
+
discovery.
|
|
24
|
+
|
|
25
|
+
## Invocation contract
|
|
26
|
+
|
|
27
|
+
`<mode> [--fix <errors.json>] --in <input> --out <output>`. The calling prompt supplies the paths. Write only
|
|
28
|
+
`--out`, as a single valid file (JSON with no comments or trailing commas). Never edit the input.
|
|
29
|
+
|
|
30
|
+
| Mode | Input → output | Status |
|
|
31
|
+
|---|---|---|
|
|
32
|
+
| `curate` | QC candidates `Doc[]` → kept translated `Doc[]` (`--out-plan`) + exclusions (`--out-excluded`) | Wired (`curate`, policy: `references/selection.md`) |
|
|
33
|
+
| `curate --fix` | QC candidates `Doc[]` + curate validator errors (`--fix`) → corrected plan + exclusions | Wired (`curate-fix`) |
|
|
34
|
+
| `write` | translated plan `Doc[]` + exclusions (`--excluded`) → master script plan JSON | Wired (`script-write`) |
|
|
35
|
+
| `write --fix` | plan `Doc[]` + previous script plan + validator errors → corrected master script plan | Wired (`script-write-fix`) |
|
|
36
|
+
|
|
37
|
+
## Shared rules (every mode)
|
|
38
|
+
|
|
39
|
+
Read `references/style-contract.zh.md` first. Its prose sets the column's identity and the balance of news,
|
|
40
|
+
opinion and technical detail. Its fenced `json` block holds the caps and banned phrases that the dailynews-gen
|
|
41
|
+
validator enforces mechanically, so violating them means the plan is rejected.
|
|
42
|
+
|
|
43
|
+
1. **News first.** Every item tells the listener who (company, lab, team) did what (released, open-sourced,
|
|
44
|
+
raised, sued, disclosed) and when. Commentary is restrained and anchored to that item; technical detail is
|
|
45
|
+
only the one or two sentences needed to understand it.
|
|
46
|
+
2. **Topic boundary (选题边界).** Never retell an item whose mainline is politics or diplomacy, trade controls,
|
|
47
|
+
military affairs, public-policy disputes or social public events, whatever nickname it travels under. Exclude
|
|
48
|
+
it with a Chinese reason. In-scope industry and institutional news is reported normally.
|
|
49
|
+
3. **Fact discipline.** Every fact comes from that item's own plan content. Do not invent anything or borrow
|
|
50
|
+
from other items. Never inflate numbers or actors. Attribute a quote only to its original speaker. Keep
|
|
51
|
+
hedges (据报道 / 称 / 承诺). If the material is thin, write less.
|
|
52
|
+
4. **Copy discipline.** Use reader-facing spoken Chinese. Do not use scaffold labels (可做角度 / 背景 /
|
|
53
|
+
潜在影响) or hedge labels (读者宜另行核实 / 仍待验证), use 「」 for quotes, and never add a greeting,
|
|
54
|
+
sign-off or AI-production footer. The builder adds those.
|
|
55
|
+
|
|
56
|
+
## Mode: write
|
|
57
|
+
|
|
58
|
+
Read the curated plan `Doc[]` (`--in`) and the curate exclusions (`--excluded`). For each doc in `--in`, write:
|
|
59
|
+
|
|
60
|
+
- `lead`: one spoken bridge into the item (≤80 chars). It is not the title and not a rhetorical question.
|
|
61
|
+
- `insight`: 2–4 sentences (≤380 chars) anchored to the doc's named actors, saying why it matters or what to watch. Never restate the doc's facts, numbers or phrasing (the listener has just heard them), give no generic advice or methodology, and add no new facts. The cap is a ceiling, not a target.
|
|
62
|
+
- `card`: optional per-item card slot `{ "copy": "≤12字标题", "points": ["要点1", "要点2"], "subject": "English visual scene" }` (2–4 points).
|
|
63
|
+
|
|
64
|
+
At the episode level, write:
|
|
65
|
+
|
|
66
|
+
- `intro` (≤150 chars): names the top two or three concrete in-scope developments.
|
|
67
|
+
- `outro` (≤150 chars): a short close tying the items together.
|
|
68
|
+
- `excluded`: copy the array from `--excluded` (`21-plan/<date>_03_curate_excluded.json`) verbatim so the script plan records every dropped candidate with its Chinese reason.
|
|
69
|
+
- `cover` (≤240 chars): one concrete visual scene in English for the lead item (objects, settings, symbols, metaphor; no text, letters, numbers, logos, flags, or recognizable people).
|
|
70
|
+
- `cards`: `{ "title": "≤20字总标题", "body": "中文导语段落 + 3-5个话题标签" }` for the episode card series.
|
|
71
|
+
- `social`: `{ "short": "≤140字 X/Threads 短帖", "long": "≤500字 微博/LinkedIn 长帖" }` (plain text, no markdown headings, no emoji spam, grounded in the plan).
|
|
72
|
+
|
|
73
|
+
Output:
|
|
74
|
+
|
|
75
|
+
```json
|
|
76
|
+
{
|
|
77
|
+
"version": 1,
|
|
78
|
+
"intro": "…",
|
|
79
|
+
"outro": "…",
|
|
80
|
+
"cover": "…",
|
|
81
|
+
"cards": { "title": "…", "body": "…" },
|
|
82
|
+
"social": { "short": "…", "long": "…" },
|
|
83
|
+
"items": [
|
|
84
|
+
{
|
|
85
|
+
"id": "…",
|
|
86
|
+
"lead": "…",
|
|
87
|
+
"insight": "…",
|
|
88
|
+
"card": { "copy": "…", "points": ["…", "…"], "subject": "…" }
|
|
89
|
+
}
|
|
90
|
+
],
|
|
91
|
+
"excluded": [{ "id": "…", "reason": "…" }]
|
|
92
|
+
}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Every doc id in `--in` appears in `items`, and `excluded` carries the curate exclusions; no id may appear in both.
|
|
96
|
+
|
|
97
|
+
## Mode: write --fix
|
|
98
|
+
|
|
99
|
+
Inputs: the plan `Doc[]`, the previous script plan, and `--fix <errors.json>` (`[{itemId, rule}]` from the
|
|
100
|
+
validator). Change only what the errors name and copy everything else unchanged. Fix by rule:
|
|
101
|
+
|
|
102
|
+
| Rule | Fix |
|
|
103
|
+
|---|---|
|
|
104
|
+
| `cap:<field>` | Shorten that field (`intro`, `outro`, `lead`, `insight`, `cover`, `cardCopy`, `cardTitle`, `socialShort`, `socialLong`) below its cap in the contract. Cut opinion, not the actor |
|
|
105
|
+
| `banned:<phrase>` | Rephrase without the phrase (applies to spoken, card and social fields alike) |
|
|
106
|
+
| `redundant-insight` | Rewrite the insight as commentary; drop the restated facts |
|
|
107
|
+
| `duplicate-insight` | Make each insight specific to its own item |
|
|
108
|
+
| `missing-item` / `unknown-id` / `conflict-id` | Make `items` match `--in` and `excluded` match `--excluded` with no overlap |
|
|
109
|
+
| `schema` / `missing-plan` | Write the full master plan per mode `write` |
|
|
110
|
+
|
|
111
|
+
## Mode: curate / curate --fix
|
|
112
|
+
|
|
113
|
+
See `references/selection.md`. Reads QC candidates (`--in`) and writes two JSON files:
|
|
114
|
+
1. `--out-plan` (`21-plan/<date>_03_plan_plan.json`): bare `Doc[]` of **kept** items only, in editorial order (lead first), with `title`, `body` and `metadata.brief` adapted into spoken simplified Chinese.
|
|
115
|
+
2. `--out-excluded` (`21-plan/<date>_03_curate_excluded.json`): `[{"id":"<Doc.id>","reason":"<具体中文原因>"}]` for every dropped candidate (`[]` when none dropped). Every candidate id must land in **exactly one** of the two files.
|
|
116
|
+
|
|
117
|
+
With `--fix <errors.json>` (`missing-plan`, `invalid-json`, `unknown-id`, `missing-item`, `conflict-id`, `empty-plan`), repair the partition so every candidate id is accounted for exactly once and at least one in-scope item is kept.
|
|
118
|
+
|
|
119
|
+
## References
|
|
120
|
+
|
|
121
|
+
- `references/style-contract.zh.md`: the column's style contract and machine block (caps, banned).
|
|
122
|
+
- `references/selection.md`: curate policy (boundary, ordering, depth budget, translation).
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Curate policy
|
|
2
|
+
|
|
3
|
+
`curate` turns the QC candidates into the episode plan. The deterministic gates have already run before it:
|
|
4
|
+
store thresholds (`decisions/extract/ai-news.yaml`), the QC score floors and the minimum item count
|
|
5
|
+
(`daily-qc-content`). Curate adds judgement, not new numeric thresholds.
|
|
6
|
+
|
|
7
|
+
## Keep or drop
|
|
8
|
+
|
|
9
|
+
- Drop items that cross the topic boundary (SKILL.md shared rule 2) and give a specific Chinese reason.
|
|
10
|
+
- Drop low-value items (pure PR fluff, minor point-release changelogs with no architectural or developer impact, thin stubs with no verifiable actor/action) and give a specific Chinese reason.
|
|
11
|
+
- Merge near-duplicates (the same event from two sources) into the item with the richer facts; drop the duplicate id into `--out-excluded` with a Chinese reason (e.g., `与另一条候选同属一事,已合并至信息更完整条目`). Never let the same story be spoken twice.
|
|
12
|
+
- Keep everything else that has a concrete actor and action. An opinion thread or tutorial with no news event
|
|
13
|
+
stays only when the day is thin, and goes after the news items.
|
|
14
|
+
|
|
15
|
+
## Output invariant (two files)
|
|
16
|
+
|
|
17
|
+
`curate` writes two JSON files:
|
|
18
|
+
1. `--out-plan` (`21-plan/<date>_03_plan_plan.json`): a bare `Doc[]` array containing **only the kept docs**, ordered with the day's lead news item first, with `title`, `body` and `metadata.brief` adapted into spoken simplified Chinese.
|
|
19
|
+
2. `--out-excluded` (`21-plan/<date>_03_curate_excluded.json`): `[{ "id": "<Doc.id>", "reason": "<具体中文原因>" }]` for every dropped candidate (`[]` when nothing is dropped).
|
|
20
|
+
|
|
21
|
+
Every candidate `id` from `21-plan/<date>_04_quality-control-content_candidates.json` (`metadata.docs`) must land in **exactly one** of the two files — never both (`conflict-id`), never neither (`missing-item`), and with no invented ids (`unknown-id`).
|
|
22
|
+
|
|
23
|
+
## Order and balance
|
|
24
|
+
|
|
25
|
+
1. Lead with the day's most consequential concrete news (urgency × impact), not the most technical item.
|
|
26
|
+
2. Mix categories (industry, research, tools) instead of running three reddit technical threads in a row.
|
|
27
|
+
3. Episode length comes from item count and complete facts, not from long commentary. The style contract
|
|
28
|
+
gives the per-driver character rates. If kept items cannot reach the floor, keep more in-scope items rather
|
|
29
|
+
than padding.
|
|
30
|
+
|
|
31
|
+
## Spoken Chinese adaptation
|
|
32
|
+
|
|
33
|
+
For kept items (especially those marked `needsTranslation`), adapt `title`, `body` and `metadata.brief` into spoken simplified Chinese:
|
|
34
|
+
|
|
35
|
+
- Keep every fact, number, name, quote and hedge. This is a full-length spoken adaptation, not a summary;
|
|
36
|
+
the body is about 0.6–0.7× the source.
|
|
37
|
+
- Shrink generic background or concept explainers to one sentence.
|
|
38
|
+
- Titles read as news. Keep product and model names and body URLs verbatim, and use 「」 for quotes.
|
|
39
|
+
- Keep `id`, `sourceUri`, `mediaType` and `metadata` as they are.
|
|
40
|
+
|
|
41
|
+
## Mode: curate --fix
|
|
42
|
+
|
|
43
|
+
When `daily-curate-check` writes `21-plan/<date>_03_curate_errors.json` (`[{ "itemId": "...", "rule": "..." }]`), inspect the rules and rewrite both `--out-plan` and `--out-excluded`:
|
|
44
|
+
- `missing-plan` / `invalid-json` / `empty-plan`: write a valid non-empty `Doc[]` to `--out-plan` and valid `[{id, reason}]` to `--out-excluded`.
|
|
45
|
+
- `missing-item`: add the missing candidate id either to `--out-plan` (translated) or to `--out-excluded` (with a Chinese reason).
|
|
46
|
+
- `conflict-id`: remove the id from one of the two files so it appears in only one.
|
|
47
|
+
- `unknown-id`: remove any id that does not exist in `candidates.json`'s `metadata.docs`.
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# 每日AI乱炖 · 主持风格契约(zh)
|
|
2
|
+
|
|
3
|
+
`kk-daily-ai-voice` 的每一句口播都受这份契约约束(F613 R1;0189 R1 改定位;2026-10-08 改名;ADR-045 起归
|
|
4
|
+
`kk:news-editorial` 技能所有)。`write` 模式与 `dailynews-gen` 的校验器读取同一份机器可读块,因此提示词与
|
|
5
|
+
校验永远一致。
|
|
6
|
+
|
|
7
|
+
## 栏目定位
|
|
8
|
+
|
|
9
|
+
「每日AI乱炖」是「咸话咸说」下的 AI 技术分享栏目,完整名称「咸话咸说之每日AI乱炖」,副题
|
|
10
|
+
「工具、论文与实践随聊」。栏目名突出当天,不是把节目名当成说话人。口播是开发者视角的 AI
|
|
11
|
+
行业动态与技术分享:先让听众及时知道谁、在何时、发布/宣布/披露了什么,再给克制的点评。
|
|
12
|
+
不以任何代称、绰号或「闲聊」包装政治、外交、军事、公共政策争议或社会公共事件主线的内容——
|
|
13
|
+
这类条目在选题/QC 阶段就应被排除(0189 R2);选题边界之内的行业动态与机构信息照常播报。身份与
|
|
14
|
+
经历必须真实:只讲真实做过的实测与实践。制作方式由栏目设置说明,口播、正文和 show notes
|
|
15
|
+
不要再附「文字由 AI 辅助整理,音频为 AI 合成配音」或「本期音频为 AI 合成配音」。
|
|
16
|
+
|
|
17
|
+
## 人设与语域
|
|
18
|
+
|
|
19
|
+
- 口语化普通话,第一人称「我」,像一位冷静、有依据的 AI 技术分享主播。
|
|
20
|
+
- 平实、克制、不炒作:不夸大单一消息的意义,不使用惊叹式渲染或营销话术。
|
|
21
|
+
- 面向普通听众说明「这件事为什么重要」或「怎么用得上」,而不是堆砌术语。
|
|
22
|
+
|
|
23
|
+
## 新闻性、点评与技术细节的平衡(2026-11-08)
|
|
24
|
+
|
|
25
|
+
2026-11-02 起执笔模型换成 codex-sol 后,成稿漂向「主题化议论 + 泛化建议 + 底层细节」,新闻性
|
|
26
|
+
明显下降。三者按以下比例取舍:
|
|
27
|
+
|
|
28
|
+
- 新闻性优先:每一条都要让听众听清主体(公司/机构/团队)、动作(发布、开源、融资、诉讼、
|
|
29
|
+
披露……)和时间;导语与桥段点名具体主体和产品,不把当天新闻改写成抽象议题。
|
|
30
|
+
- 点评克制:每条点评约占该条口播的四分之一到三分之一,锚定这一条的具体主体与事实,说清
|
|
31
|
+
「为什么重要」或「接下来看什么」即可;不写脱离新闻的方法论、选型指南、采购清单或「我的判断
|
|
32
|
+
标准是……我建议……」式说教,不连用多个「我会/我建议/我倾向」。
|
|
33
|
+
- 技术细节点到为止:只保留听懂这条新闻所需的一两句机制说明;通用概念(如什么是 HTTP 请求头、
|
|
34
|
+
KV cache)不展开科普,参数、基准、实现细节择其最关键的一两个。
|
|
35
|
+
- 不重复:同一事实在一条里只讲一次。
|
|
36
|
+
|
|
37
|
+
## 固定开场与收尾
|
|
38
|
+
|
|
39
|
+
开场问候与收尾致谢由 builder 固定输出,计划文本只填充两者之间的内容,节目身份永不漂移:
|
|
40
|
+
|
|
41
|
+
- 开场:`大家好,今天是<日期>。这里是由<主持人>为你带来的咸话咸说之每日AI乱炖。`
|
|
42
|
+
- 收尾:`感谢您的收听,我是<主持人>,祝您拥有充实高效的一天,我们下期节目不见不散!`
|
|
43
|
+
|
|
44
|
+
## 段落角色
|
|
45
|
+
|
|
46
|
+
- `intro`:开场导语,点名今天最重要的两三条动态(谁、做了什么),接在固定问候之后,不超过 150 字;不写「今天我想聊聊怎么判断……」式的议题清单。
|
|
47
|
+
- `lead`:一句话口语桥段,引出下一个主题的【标题】;只做铺垫,不得复述标题本身,不用设问句把新闻改写成抽象问题,不超过 80 字。
|
|
48
|
+
- `insight`:只基于这一条自身可核事实的点评(2–4 句),说清这一条对行业或开发者的意义、或接下来值得关注的节点;不得挪用其他条目的话题,不超过 380 字(这是上限不是目标,常规 150–280 字)。听众刚听完这一条的事实叙述,insight 是点评不是复读:不得复述正文已讲过的事实、数字或成串措辞(最多点到一两个关键词);也不得脱离这条新闻泛泛讲方法论或给通用建议。时长契约:全片按 15–20 分钟口播设计,时长靠覆盖更多条目和完整的事实叙述撑起,不靠拉长点评。字数按配音驱动折算:gemini ≈3.3 字/秒(正文约 4300–5800 字);Voicebox robin-news ≈6.3 字/秒(正文约 5700–7600 字,或增加条目数)。
|
|
49
|
+
- `outro`:简短收束语,接在固定致谢之前,不超过 150 字。
|
|
50
|
+
- `cover`:头版英文具象视觉场景,不超过 240 字符,不含文字、数字、商标、旗帜或可辨识真人。
|
|
51
|
+
- `cards`:小红书图文笔记总标题 `title`(不超过 20 字)与导语 `body`,单条卡片标题 `card.copy`(不超过 12 字)、2–4 条短要点 `card.points`、英文画面 `card.subject`。
|
|
52
|
+
- `social`:面向 X / Threads 的短帖 `short`(不超过 140 字)与面向微博 / LinkedIn 的长帖 `long`(不超过 500 字)。
|
|
53
|
+
|
|
54
|
+
## 机器可读契约
|
|
55
|
+
|
|
56
|
+
`caps` 是各字段的字数上限;`banned` 是任何计划字段都不得出现的短语——包括旧模板的全部罐头
|
|
57
|
+
点评、旧模板的 首先/接着/最后 开头、0133 的研究脚手架标签与对冲语(校验规则
|
|
58
|
+
`banned:<短语>`),以及 0189 R4 退役的旧栏目名(「每日 AI 资讯」「AI科技漫谈」
|
|
59
|
+
「AI Daily Briefing」):任何路径都不得让旧新闻定位复活。
|
|
60
|
+
|
|
61
|
+
```json
|
|
62
|
+
{
|
|
63
|
+
"caps": {
|
|
64
|
+
"intro": 150,
|
|
65
|
+
"outro": 150,
|
|
66
|
+
"lead": 80,
|
|
67
|
+
"insight": 380,
|
|
68
|
+
"cover": 240,
|
|
69
|
+
"cardCopy": 12,
|
|
70
|
+
"cardTitle": 20,
|
|
71
|
+
"socialShort": 140,
|
|
72
|
+
"socialLong": 500
|
|
73
|
+
},
|
|
74
|
+
"banned": [
|
|
75
|
+
"在各种技术光环背后,正是这样专注而不知疲倦的底层攻坚者,为今天整个大模型生态奠定了最坚实的技术基石。",
|
|
76
|
+
"这其实释放了一个非常明确的信号:AI竞争的下半场,已经不再只是单纯拼模型参数,更是电力、能源和全栈工业基础设施的硬核较量。",
|
|
77
|
+
"真正被重新定义的,是硬件层承担的安全与算力责任:把能力做进硅片层更可靠、也更难绕过,但生态锁定的代价需要一起算进去。",
|
|
78
|
+
"我个人觉得,这次最大的看点是内容创作门槛的再次降低。不过正如团队提到的,如何平衡创作自由与防止低质内容泛滥,会是整个行业接下来最值得观察的关键考题。",
|
|
79
|
+
"这项进展反映出资本与产业界正在加速形成合力,后续实际业务场景的落地效果非常值得我们持续跟进。",
|
|
80
|
+
"这项新动态反映出技术演进正在进一步提速,对相关领域的实际影响也非常值得我们持续关注。",
|
|
81
|
+
"首先",
|
|
82
|
+
"接着",
|
|
83
|
+
"最后",
|
|
84
|
+
"可做角度",
|
|
85
|
+
"背景",
|
|
86
|
+
"潜在影响",
|
|
87
|
+
"读者宜另行核实",
|
|
88
|
+
"仍待验证",
|
|
89
|
+
"每日AI资讯",
|
|
90
|
+
"每日 AI 资讯",
|
|
91
|
+
"今日AI科技漫谈",
|
|
92
|
+
"AI科技漫谈",
|
|
93
|
+
"AI Daily Briefing",
|
|
94
|
+
"我是咸话咸说",
|
|
95
|
+
"音频为 AI 合成配音",
|
|
96
|
+
"The audio in this episode is AI-synthesized"
|
|
97
|
+
]
|
|
98
|
+
}
|
|
99
|
+
```
|
|
@@ -25,7 +25,7 @@ not add a `kk publish` noun.
|
|
|
25
25
|
| medium | `medium-pub` | `file-cli` (token API) | `kk executor run medium-pub --in <content.json> --out <result.json>` |
|
|
26
26
|
| wechatmp | `wechatmp-pub` | `file-cli` (`draft/add`) | `kk executor run wechatmp-pub` (default operation `draft`) |
|
|
27
27
|
| x post | `x-pub` | `file-cli` (`POST /2/tweets`) | `kk executor run x-pub` (`options.operation` omitted / `post`) |
|
|
28
|
-
| x article | `x-pub` | `browser` / `script` | `kk executor run x-pub --in <content.json> --out <result.json>` (`options.operation: article`); a missing or expired profile refuses (`ok: false`, naming `
|
|
28
|
+
| x article | `x-pub` | `browser` / `script` | `kk executor run x-pub --in <content.json> --out <result.json>` (`options.operation: article`); a missing or expired profile refuses (`ok: false`, naming `kk bot login x`) before any window opens |
|
|
29
29
|
| juejin | `juejin-pub` | `browser` / `script` | `kk executor run juejin-pub --in <content.json> --out <result.json>` |
|
|
30
30
|
| infoq | `infoq-pub` | `browser` / `script` | `kk executor run infoq-pub --in <content.json> --out <result.json>` |
|
|
31
31
|
| substack | `substack-pub` | `browser` / `script` | `kk executor run substack-pub --in <content.json> --out <result.json>` (needs `SUBSTACK_PUBLICATION_URL`) |
|
|
@@ -43,8 +43,8 @@ credentials. Before the first script-driver run (and after any session expiry),
|
|
|
43
43
|
headed login, then verify reuse read-only:
|
|
44
44
|
|
|
45
45
|
```bash
|
|
46
|
-
|
|
47
|
-
bun plugins/publishings/xhs-pub/src/profile-check.ts check # headless; exit 0 = session verified
|
|
46
|
+
kk bot login xhs # headed; sign in once in the window (adapter-verified)
|
|
47
|
+
bun plugins/publishings/xhs-pub/src/profile-check.ts check # headless; exit 0 = session verified (underlying probe)
|
|
48
48
|
```
|
|
49
49
|
|
|
50
50
|
`check` never signs in — with no saved profile it refuses (exit 1) instead of reporting success.
|