@geoly-ai/social-hub-cli 0.3.18 → 0.3.19
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/CHANGELOG.md +14 -0
- package/dist/cmd-manifest.json +2 -2
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +69 -7
- package/dist/index.js.map +1 -1
- package/dist/scrape-output.test.d.ts +2 -0
- package/dist/scrape-output.test.d.ts.map +1 -0
- package/dist/scrape-output.test.js +58 -0
- package/dist/scrape-output.test.js.map +1 -0
- package/package.json +2 -2
- package/skills/manifest.json +1 -1
- package/skills/reddit-content-writing/SKILL.md +1 -1
- package/skills/reddit-content-writing/references/phase4-execution-table.md +24 -3
- package/skills/reddit-content-writing/references/phase4-writing.md +123 -3
- package/skills/reddit-content-writing/references/post-writing-templates.md +14 -6
- package/skills/reddit-delivery-check/SKILL.md +1 -0
- package/skills/reddit-delivery-check/references/phase5-delivery.md +7 -1
- package/skills/reddit-matrix.lock.json +8 -8
- package/skills/reddit-phase-brief/SKILL.md +25 -9
- package/skills/reddit-phase-brief/references/brand-SKU-PGC-rules.md +223 -36
- package/skills/reddit-phase-brief/references/phase4-brief-workflow.md +364 -18
- package/skills/reddit-phase-planning/SKILL.md +13 -0
- package/skills/reddit-phase-planning/references/phase4-execution-table.md +16 -2
- package/skills/reddit-phase-planning/references/phase4-planning.md +74 -15
- package/skills/reddit-phase-planning/references/scheduling-decision-procedure.md +386 -0
- package/skills/reddit-phase-research/SKILL.md +7 -1
- package/skills/reddit-phase-research/references/phase01-research.md +93 -29
- package/skills/reddit-strategy-orchestrator/SKILL.md +120 -18
- package/skills/reddit-strategy-shared/SKILL.md +4 -2
- package/skills/reddit-strategy-shared/references/content-diversity-contract.md +19 -3
- package/skills/reddit-strategy-shared/references/context-contract.md +45 -11
- package/skills/reddit-strategy-shared/references/evidence-policy.md +139 -0
- package/skills/reddit-strategy-shared/references/handoff-schemas.md +16 -1
- package/skills/reddit-strategy-shared/references/path-conventions.md +26 -4
- package/skills/reddit-strategy-shared/references/prerequisites/README.md +57 -0
- package/skills/reddit-strategy-shared/references/prerequisites/{reddit-master-canvas-agent-prompt-template.md → archive/reddit-master-canvas-agent-prompt-template.md} +7 -0
- package/skills/reddit-strategy-shared/references/prerequisites/{reddit-sop-v2-universal.md → archive/reddit-sop-v2-universal.md} +7 -0
- package/skills/reddit-strategy-shared/references/prerequisites/{reddit-strategy-prerequisites-read.md → archive/reddit-strategy-prerequisites-read.md} +7 -0
- package/skills/reddit-strategy-shared/references/prerequisites/{reddit-strategy-reuse-playbook.md → archive/reddit-strategy-reuse-playbook.md} +7 -0
- package/skills/reddit-strategy-shared/references/subreddit-research-profile.md +514 -0
- package/skills/reddit-strategy-shared/references/version-manifest.md +29 -2
- package/skills/reddit-voc-volume/matrix-contract.md +16 -1
|
@@ -133,9 +133,27 @@ Brief 去重检查报告:
|
|
|
133
133
|
> 位置、结尾形态。放在写作阶段才采集,等于所有风格规则先用跨板块默认值填一遍,
|
|
134
134
|
> baseline 事后只能微调语气——这正是 v2.12.24 之前 baseline 形同虚设的根因。
|
|
135
135
|
|
|
136
|
-
**W0 前置(先于取样):** 为本批每个主帖 Key
|
|
137
|
-
|
|
138
|
-
|
|
136
|
+
**W0 前置(先于取样):** 为本批每个主帖 Key 锁定 `AssignedFlair`。
|
|
137
|
+
**Brief 不重新选 flair**——候选由 planning 的排期决策程序 D2 产出:
|
|
138
|
+
|
|
139
|
+
1. 从 `memory/phase4-排期决策台账.md` 按执行表 Key 读取该行的 `ProposedFlair`
|
|
140
|
+
(契约见 `../../reddit-phase-planning/references/scheduling-decision-procedure.md` D2 与
|
|
141
|
+
§逐篇必填记录)。台账缺失或该 Key 无 `ProposedFlair` → `BlockingGap`,回流 planning。
|
|
142
|
+
2. **验证**该 `ProposedFlair` 是否出现在该 subreddit **当前账号实际可选**的 flair 列表里
|
|
143
|
+
(SRP 的 `flairDistribution[]` 是历史观察,**不能**证明当前可选)。
|
|
144
|
+
3. 验证通过 → `AssignedFlair = ProposedFlair`,锁定。
|
|
145
|
+
验证不过(当前不可选 / 账号资格不允许 / 与本篇 `ContentFunction` 冲突)→
|
|
146
|
+
**不得由 Brief 自行改选另一个 flair**:记 `FlairVerificationStatus: Rejected` + 驳回理由,
|
|
147
|
+
`BlockingGap` 回流 planning 要求 D2 重出 `ProposedFlair`。
|
|
148
|
+
4. `ProposedFlair: Unknown(NoSRP)`(planning 侧 `SRPMode: Fallback`)是唯一例外:
|
|
149
|
+
此时由 Brief 依据现行 flair 列表补选,并把补选结果与理由回写台账的 `FlairChoiceReason`。
|
|
150
|
+
5. 板块无 flair 或允许不选 → 哨兵值 `NoFlairAvailable` / `NoFlairRequired`,不得留空、不得自造。
|
|
151
|
+
|
|
152
|
+
记录 `FlairVerificationStatus:` `Verified`(等于 D2 的 `ProposedFlair`)/
|
|
153
|
+
`FallbackAssigned`(第 4 条补选)/ `Rejected`(→ `BlockingGap`)。
|
|
154
|
+
|
|
155
|
+
baseline 采样口径**优先按 `AssignedFlair` 细分**,因为 flair 往往同时决定发帖资格、
|
|
156
|
+
披露与帖型,不是纯风格标签。
|
|
139
157
|
|
|
140
158
|
**对本批每一个目标 subreddit(并优先按 `AssignedFlair` 细分)** 建立或复用一张 baseline 卡:
|
|
141
159
|
|
|
@@ -144,11 +162,21 @@ Brief 去重检查报告:
|
|
|
144
162
|
- 段落数中位数
|
|
145
163
|
- 标题长度与标题句式分布
|
|
146
164
|
- 列表 / 小标题使用率
|
|
147
|
-
- 品牌首次出现位置分布
|
|
165
|
+
- 品牌首次出现位置分布 —— 必须同时记录 `ComparableSampleCount`、`BrandMentionSampleCount`、
|
|
166
|
+
`NoBrandMentionRate`,以及**四档**直方图(标题 / 首段 / 中段 / 结论,分母 =
|
|
167
|
+
`BrandMentionSampleCount`)。**「不出现」不是直方图的一档**,由 `NoBrandMentionRate`
|
|
168
|
+
单独表示(口径见 `references/brand-SKU-PGC-rules.md` §2.5)
|
|
148
169
|
- 提问式结尾比例
|
|
149
170
|
- 是否常见 TL;DR
|
|
150
171
|
- 第一人称比例
|
|
151
172
|
- 评测帖与问题帖的长度差异
|
|
173
|
+
- 破折号 / 括号使用分布(频次或使用率)—— **标点冲突消解依据**(writing 侧 spec §7);
|
|
174
|
+
不设跨板块统一禁令
|
|
175
|
+
|
|
176
|
+
> **维度数以 writing 侧 W-1.b 表为准:共 10 项,不是 9 项。** 上表任一项缺失即
|
|
177
|
+
> `BaselineStatus: Incomplete`,**不得用默认值顶替**。
|
|
178
|
+
> `content-diversity-contract.md` 的 baseline manifest 字段清单已同步列出第 10 项
|
|
179
|
+
> (破折号 / 括号使用分布),其变化计入 `SampleSetID` 的 manifest hash。
|
|
152
180
|
|
|
153
181
|
每张卡还必须写明 freshness 三字段(供 writing 与 delivery 机械判定,不靠人眼):
|
|
154
182
|
|
|
@@ -161,7 +189,7 @@ Brief 去重检查报告:
|
|
|
161
189
|
`IncompleteReason: TruncatedSample`,**不新设第五个 `BaselineStatus` 值**
|
|
162
190
|
|
|
163
191
|
flair 覆盖字段(与 `BaselineStatus` 正交,权威定义见
|
|
164
|
-
|
|
192
|
+
`../../reddit-strategy-shared/references/content-diversity-contract.md`):
|
|
165
193
|
|
|
166
194
|
- `BaselineScope:` `ExactFlair` / `FlairCluster` / `SubredditFallback`
|
|
167
195
|
- `BaselineFlair:` 该卡实际覆盖的 flair(`ExactFlair` 时等于 `AssignedFlair`)
|
|
@@ -378,8 +406,115 @@ ASK / GUIDE / ROUNDUP / OWNER / OPINION / RANT / FOLLOWUP / LIST / REPUTATION
|
|
|
378
406
|
|
|
379
407
|
---
|
|
380
408
|
|
|
409
|
+
## 步骤 B-1.4 — 素材 Modality 与升级授权(G4 · 必须在 B-1.5 之前执行)
|
|
410
|
+
|
|
411
|
+
> **出处(真实返工):** 需求方原话是「看是否可以加入到上面你写到的内容,**不要强制加,
|
|
412
|
+
> 要符合条件才加**」;随后产出的 Brief 却对三条 Key 写了「**强制嵌入核心卖点**」。
|
|
413
|
+
> **输入语义被单向升级**——这是比日历间隔更直接的返工来源。
|
|
414
|
+
>
|
|
415
|
+
> **为什么放在 B-1.5 之前:** 素材是否「必须写进去」会反向决定 `ContentFunction`、
|
|
416
|
+
> 手上算不算有该 `EvidenceShape`、以及能选哪些 `StructureFamily`。等到锁完结构再校
|
|
417
|
+
> modality,结构已经被污染了。
|
|
418
|
+
|
|
419
|
+
### B-1.4.1 每条素材必须带 Modality
|
|
420
|
+
|
|
421
|
+
对本批要用到的**每一条卖点 / 素材 / 数据点 / 叙述元素**,在 Brief 里登记一行(写入
|
|
422
|
+
`memory/phase4-撰写brief.md` 的「素材 Modality 台账」,本批共用一张):
|
|
423
|
+
|
|
424
|
+
```markdown
|
|
425
|
+
- MaterialID: (稳定 ID,跨批次不变;同一卖点在不同 Key 复用同一个 ID)
|
|
426
|
+
- MaterialText: (这条素材本身,一句话)
|
|
427
|
+
- OriginalModality: Required / Preferred / Optional / Forbidden ← 输入端的原始语义
|
|
428
|
+
- EffectiveModality: Required / Preferred / Optional / Forbidden ← 本 Brief 实际采用的
|
|
429
|
+
- ModalitySource: SourceKind + 引用原文 + 版本或日期 + 出处位置
|
|
430
|
+
- ModalityUpgradeRef: None / <授权引用>(仅当 EffectiveModality 严于 OriginalModality)
|
|
431
|
+
- ModalityDowngradeRef: None / <授权引用>(仅当 EffectiveModality 宽于 OriginalModality)
|
|
432
|
+
- DowngradeSource: None / ClientContract / ComplianceRequirement / UserInstruction
|
|
433
|
+
- ApprovedBy: (任何 Upgrade 或 Downgrade 均必填;**不得填生成本 Brief 的 agent**)
|
|
434
|
+
- ModalityStatus: Unchanged / AuthorizedUpgrade / AuthorizedDowngrade / BlockingGap
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
**四值语义(写进 Brief 与写作指令时必须用对应措辞,不得混用):**
|
|
438
|
+
|
|
439
|
+
| Modality | 含义 | Brief / 写作指令里的合法措辞 | 非法措辞 |
|
|
440
|
+
|---|---|---|---|
|
|
441
|
+
| `Required` | 必须出现,缺失即不合格 | 「必须出现」「缺失则退回」 | — |
|
|
442
|
+
| `Preferred` | 条件满足时优先采用 | 「条件满足时优先写入」 | 「必须」「强制」 |
|
|
443
|
+
| `Optional` | **符合条件才加,不满足就不加;不加不算缺陷** | 「符合条件才加」「可选」 | 「强制嵌入」「必须提及」「每篇都要带」 |
|
|
444
|
+
| `Forbidden` | 不得出现 | 「不得出现」 | 任何“可酌情使用”类表述 |
|
|
445
|
+
|
|
446
|
+
### B-1.4.2 门:`ModalityDriftGate`
|
|
447
|
+
|
|
448
|
+
**判据是结构化比较,不是关键词匹配。** 逐条比较 `OriginalModality` → `EffectiveModality`:
|
|
449
|
+
|
|
450
|
+
```
|
|
451
|
+
严格程度序:Optional < Preferred < Required
|
|
452
|
+
(Forbidden 不在该序上,见下)
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
- **升级**(往右移)→ 默认**拦截**,回落到 `OriginalModality`,除非持有合法
|
|
456
|
+
`ModalityUpgradeRef`(见 B-1.4.3)。
|
|
457
|
+
- **降级**(往左移)→ 同样是语义改动,**同样需要授权并记录**:
|
|
458
|
+
`ModalityDowngradeRef`(引用原文)+ `DowngradeSource` + `from/to` + `ApprovedBy`。
|
|
459
|
+
**降级来源闭集(比升级更窄,只有三个):** `ClientContract`(甲方书面撤回该要求)、
|
|
460
|
+
`ComplianceRequirement`(合规要求该项不得强制)、`UserInstruction`(用户明确指示放宽)。
|
|
461
|
+
**`SubredditRule` 与 `ApprovedBrief` 不能作为降级来源** —— 版规不会要求「少写一个卖点」,
|
|
462
|
+
而 `ApprovedBrief` 同样存在自证闭环。
|
|
463
|
+
`Required` 不得被 agent 单方面降成 `Preferred` / `Optional`;`Required` 项在成稿中缺失
|
|
464
|
+
是**阻断**,不是「本篇没写而已」。
|
|
465
|
+
- **`Forbidden`** 不参与升降级:它是终止值。要把 `Forbidden` 改成任何其他值,必须回到
|
|
466
|
+
设定它的来源方重新确认,**不走本节的授权流程**。
|
|
467
|
+
- **来源缺失 / 两个来源冲突 / modality 未标注** → **fail-closed**:
|
|
468
|
+
`ModalityStatus: BlockingGap`,不得默认按 `Optional` 也不得默认按 `Required` 继续。
|
|
469
|
+
|
|
470
|
+
**强制措辞检测是辅助信号,不是门本身。** 扫到「强制嵌入」「必须嵌入」「必须提及」
|
|
471
|
+
「每篇都要带」「统一加上」而对应 `MaterialID` 的 `OriginalModality ≠ Required` 时,
|
|
472
|
+
判为疑似升级 → 回到结构化比较确认 → 确认为升级即拦截。**反过来不成立:措辞温和不等于
|
|
473
|
+
没升级**,`EffectiveModality` 字段本身才是判据。
|
|
474
|
+
|
|
475
|
+
### B-1.4.3 谁可以升级(不误伤条款)
|
|
476
|
+
|
|
477
|
+
**可以升级为 `Required` 的权威来源(`AuthoritativeSource`,闭集):**
|
|
478
|
+
|
|
479
|
+
| SourceKind | 说明 | 记录要求 |
|
|
480
|
+
|---|---|---|
|
|
481
|
+
| `ClientContract` | 甲方合同 / 书面需求 / 甲方书面确认 | 引用原文 + 文档链接或日期 |
|
|
482
|
+
| `SubredditRule` | 版规、flair 要求、AutoModerator 硬约束 | 引用规则原文 + 抓取日期 |
|
|
483
|
+
| `ComplianceRequirement` | 法务 / 合规 / 披露硬要求 | 引用条款 + 责任人 |
|
|
484
|
+
| `ApprovedBrief` | 已批准的历史 Brief 中**已经被授权过**的升级 | 引用 Brief 版本 + 原 `ModalityUpgradeRef` |
|
|
485
|
+
|
|
486
|
+
**四条硬约束:**
|
|
487
|
+
|
|
488
|
+
1. ⚠️ **用户明确标 `Optional` 的项目永不升级。** 即使出现上表任一权威来源,也**不得**
|
|
489
|
+
由本流程升级;正确动作是**回到用户重新确认**并取得新的输入语义。这是本门存在的原因。
|
|
490
|
+
2. `ApprovedBrief` **只能承接已被授权的升级,不能自证**。agent 先自行升级、再让该 Brief
|
|
491
|
+
过审、然后引用「已批准 Brief」作为下一批的升级依据 —— 这条闭环**明确禁止**。
|
|
492
|
+
`ModalityUpgradeRef` 必须能一路追溯到 `ClientContract` / `SubredditRule` /
|
|
493
|
+
`ComplianceRequirement` 之一。
|
|
494
|
+
3. **批准人必须与生成本 Brief 的 agent 不是同一主体**,`ApprovedBy` 不得填 agent 自己。
|
|
495
|
+
4. ⚠️ **合规披露 ≠ 卖点强制。** `SubredditRule` / `ComplianceRequirement` 通常要求的是
|
|
496
|
+
**vendor disclosure、身份声明、flair、disclaimer**,属于 `DisclosureRequirement` /
|
|
497
|
+
`ComplianceConstraint`,**不是 `ContentMaterialModality`**。不得用「版规有要求」把一条
|
|
498
|
+
原本 `Optional` 的**卖点**升级成 `Required`。三者在台账里分开登记,不得混列。
|
|
499
|
+
|
|
500
|
+
### B-1.4.4 传递与门禁
|
|
501
|
+
|
|
502
|
+
- Brief → 写作指令、Brief → rewrite handoff 时,`EffectiveModality` 原样传递;
|
|
503
|
+
**下游不得再次升级**(writing 侧同门见 `reddit-content-writing` 的
|
|
504
|
+
`references/phase4-writing.md` §Modality drift 检查)。
|
|
505
|
+
- 授权变更若同时触及任一 `LockedFingerprintField`(典型:把某卖点升为 `Required` 会改变
|
|
506
|
+
`EvidenceShape` 或 `BrandEntryMode`),须**重走 Brief 审批**并重跑 `RecentCollisionCheck`。
|
|
507
|
+
- ⚠️ **本节不改动品牌配额语义。** modality **不得**把 P-B 自动改成 P-NB、不得自动改动
|
|
508
|
+
C-B/C-NB 配对或各类配额数量。配额是否为合同硬约束属另一批工作。
|
|
509
|
+
|
|
510
|
+
---
|
|
511
|
+
|
|
381
512
|
## 步骤 B-1.5 — 逐 Key 锁定结构(在写大纲之前,硬顺序)
|
|
382
513
|
|
|
514
|
+
> **前置:** B-1.4 的素材 Modality 台账须已完成(`ModalityStatus` 无 `BlockingGap`)。
|
|
515
|
+
> 素材是否「必须写进去」会反向决定 `ContentFunction` / `EvidenceShape` / 可选的
|
|
516
|
+
> `StructureFamily`——modality 未定就锁结构,锁的是被污染的结构。
|
|
517
|
+
|
|
383
518
|
对本批**每一条主帖 Key**,按下列顺序执行,**不得跳步、不得倒序**:
|
|
384
519
|
|
|
385
520
|
1. **解析客户内容原型** → 在 `memory/phase0-客户内容原型映射.md` 找到 `Approved`
|
|
@@ -395,20 +530,66 @@ ASK / GUIDE / ROUNDUP / OWNER / OPINION / RANT / FOLLOWUP / LIST / REPUTATION
|
|
|
395
530
|
`PrimaryPostType` 与合规约束 → 映射行 predicate 顺序。**取第一个 surviving
|
|
396
531
|
candidate**(`EligibleStructureFamilies` 既定顺序中第一个通过全部过滤的),
|
|
397
532
|
不得以「语义更优」「读起来更自然」跳过更靠前的候选。
|
|
398
|
-
5.
|
|
533
|
+
5. **预分配剩余结构字段**(⚠️ **本步刻意不含 `BrandEntryMode`**,它在 5-brand 之后才赋值):
|
|
534
|
+
`OpeningMove` / `CaveatMode` /
|
|
399
535
|
`EndingMode` / `LengthBand`(由该 subreddit baseline 的中位数 + IQR 派生)/
|
|
400
536
|
`AnchorSlot`(`ABURequired=Yes` 时须在该 family 的 `AllowedAnchorSlots` 内;
|
|
401
537
|
否则填 `N/A`)。
|
|
402
538
|
**并预分配两个前置控制字段**(`PrewritingControlFields`,权威定义见
|
|
403
|
-
|
|
404
|
-
- `AssignedFlair`:已在 B-1.0/W0
|
|
539
|
+
`../../reddit-strategy-shared/references/content-diversity-contract.md`):
|
|
540
|
+
- `AssignedFlair`:已在 B-1.0/W0 由台账 `ProposedFlair` 验证锁定(`FlairVerificationStatus`
|
|
541
|
+
须为 `Verified` 或 `FallbackAssigned`);板块无
|
|
405
542
|
flair 或允许不选时填哨兵值 `NoFlairAvailable` / `NoFlairRequired`,不得留空、
|
|
406
543
|
不得用评论的 `N/A`),此处只核对与 baseline 覆盖一致。
|
|
407
544
|
- `PostingTrigger`:受控值 `ConcreteFailure` / `PurchaseDecision` /
|
|
408
|
-
`MeasurementResult` / `CompatibilityGap` / `UnsolicitedTestimony
|
|
545
|
+
`MeasurementResult` / `CompatibilityGap` / `UnsolicitedTestimony`。
|
|
546
|
+
**本步只记录候选值,不做交叉校验**(`BrandEntryMode` 此时尚未赋值)。待校验的
|
|
409
547
|
`PostingTrigger × BrandEntryMode` 交叉约束:`BrandEntryMode ≠ 不出现` 禁取
|
|
410
548
|
`UnsolicitedTestimony`;取 `UnsolicitedTestimony` 时 `BrandEntryMode` 必须
|
|
411
549
|
`不出现` 且有真实非征集非品牌控制的 testimony 证据。
|
|
550
|
+
⚠️ **该交叉约束只能在 5-brand 产出 `BrandEntryMode` 之后校验**:本步先记下
|
|
551
|
+
`PostingTrigger` 候选,5-brand 完成后再判定;不得为了让交叉约束通过而反向决定
|
|
552
|
+
`BrandEntryMode`。
|
|
553
|
+
**5-brand · `BrandPlacementGate`(G2,硬门):** `BrandEntryMode` 与「标题是否出现
|
|
554
|
+
品牌名」**只能由证据决定,不得由 P-B 标签推导**。
|
|
555
|
+
> **出处(真实返工):** 需求方质问「**为什么你把 P-B 的标题都统一加上了 aporro
|
|
556
|
+
> 这个品牌了?**」——P-B 的含义是「帖子中包含品牌词」,**并不代表品牌名必须在标题里
|
|
557
|
+
> 出现**,那样显得很广告。修正后的口径:品牌词出现在 P-B 帖的**正文 body 中**,
|
|
558
|
+
> 标题通常不写品牌名(**除非是 Brand Review / 专门讨论该品牌的帖**)。
|
|
559
|
+
|
|
560
|
+
规则、字段定义与例外见 `references/brand-SKU-PGC-rules.md` §2.0「位置来源 vs 风险边界」
|
|
561
|
+
与 §2.5「品牌位置直方图的可比样本口径」。本步只做三件事:
|
|
562
|
+
|
|
563
|
+
- **按行类型分三支校验位置依据(不得一刀切要求自有 Basis):**
|
|
564
|
+
①**P-B / PGC 主帖** → 填满 `BrandPlacementBasis` 全部子字段(缺任一 → 不得给
|
|
565
|
+
`BrandEntryMode` 赋值);②**P-NB 主帖** → 填 `BrandPlacementBasis:
|
|
566
|
+
N/A(P-NB · 主帖不露品牌)` 即可,不要求直方图;③**C-B 评论** → 不填本块,改填
|
|
567
|
+
`InheritedBrandPlacementBasis` + `CommentPlacementDecision`(见 B-2 评论模板);
|
|
568
|
+
- **`SelectedPlacement` 的算法也按行类型分支:**
|
|
569
|
+
①**P-B / PGC 主帖** → 按 `更晚的(§2 风险边界允许的最早位置, 直方图经验位置)` 取值
|
|
570
|
+
(直方图档位按「结论 → 后段」换算),取值域限于 标题/首段/中段/后段;
|
|
571
|
+
D 类(禁止推广板块)或 `NoBrandMentionRate ≥ 0.8` 导致主帖无法露出 →
|
|
572
|
+
`BlockingGap` 回规划,**不得静默改成不露品牌或挪到评论**;
|
|
573
|
+
②**P-NB 主帖** → 直接 `SelectedPlacement: 不出现` / `BrandEntryMode: 不出现`,
|
|
574
|
+
**不跑直方图公式、不要求直方图**;
|
|
575
|
+
③**C-B 评论** → 不跑本公式,位置由 `CommentPlacementDecision` +
|
|
576
|
+
§2 风险边界 + 帖—评互补规则决定;
|
|
577
|
+
- **拦截**任何形如「因为这行标记 P-B,所以标题写品牌」的推导,以及
|
|
578
|
+
**P-B / PGC 主帖**的 `BrandPlacementBasis` 缺失、或 `DecisionStatus:
|
|
579
|
+
NoComparableEvidence` 却仍照常赋值的情况。
|
|
580
|
+
⚠️ **P-NB 的 `N/A(P-NB · 主帖不露品牌)` 与 C-B 的
|
|
581
|
+
`InheritedBrandPlacementBasis` + `CommentPlacementDecision` 都是合法填法,
|
|
582
|
+
不得据本条拦截;C-B 缺这两项才拦截。**
|
|
583
|
+
**持有有效 `BrandTitleExposureException` 时 `DecisionStatus` 记 `Exception`**
|
|
584
|
+
(优先于 `NoComparableEvidence`),此时 `SourceKind: Exception` +
|
|
585
|
+
`SourceRef: <ExceptionRef>`,**不因缺 SampleSetID / 直方图而拦截**。
|
|
586
|
+
|
|
587
|
+
**本步产出后,才依次完成:** ①赋值 `BrandEntryMode`;②校验第 5 步记下的
|
|
588
|
+
`PostingTrigger × BrandEntryMode` 交叉约束;③进入第 6 步碰撞检查(三元组此时才完整)。
|
|
589
|
+
|
|
590
|
+
⚠️ 本门只处理**位置由什么决定**,**不处理要不要有品牌**:P-B/P-NB/C-B/C-NB 配额语义
|
|
591
|
+
一律不变(见 §2.0 的配额免责声明)。
|
|
592
|
+
|
|
412
593
|
6. **`RecentCollisionCheck`**(必须在第 5 步之后,因为需要完整三元组):读取该
|
|
413
594
|
subreddit 的有效窗口(`WindowCount` 且 `WindowDays` 同时满足,按 `WindowSort`
|
|
414
595
|
排序,**排除当前 Key 自己那一行**),检查本篇
|
|
@@ -431,6 +612,94 @@ ASK / GUIDE / ROUNDUP / OWNER / OPINION / RANT / FOLLOWUP / LIST / REPUTATION
|
|
|
431
612
|
> **禁止为了不同而不同。** 把一个简单 troubleshooting 硬写成倒叙故事,不是差异化,
|
|
432
613
|
> 是伤害内容。差异化只在同等有效的候选之间起作用。
|
|
433
614
|
|
|
615
|
+
---
|
|
616
|
+
|
|
617
|
+
## 步骤 B-1.6 — 内部/外部叙事分层(G1 · 在 B-2 写标题方向与大纲之前)
|
|
618
|
+
|
|
619
|
+
> **出处(真实返工):** 需求方质问「**为什么这里会有用 FAQ 作为核心角度?**」——
|
|
620
|
+
> 「正面回应用户 FAQ 中对中国品牌的核心疑虑」是**内部策略意图**,不该写进「核心角度」。
|
|
621
|
+
> 把「FAQ 响应」写进去等于把策略意图暴露了出来,很容易变成**清单式解答**,
|
|
622
|
+
> 反而**显得像品牌营销稿**。
|
|
623
|
+
>
|
|
624
|
+
> **缺的是一道分层,不是多一条禁令。** 19 列执行表里没有任何字段区分「内部选材依据」
|
|
625
|
+
> 与「读者可见前提」,于是 FAQ、站内搜索词、GEO fanout 全都直接进了`核心角度`。
|
|
626
|
+
|
|
627
|
+
### B-1.6.1 两个字段
|
|
628
|
+
|
|
629
|
+
| 字段 | 谁看得到 | 装什么 |
|
|
630
|
+
|---|---|---|
|
|
631
|
+
| `InternalCoverageIntent` | **仅内部**(策略师、审核、审计) | FAQ 编号与 FAQ 原文、GEO fanout 子查询、站内搜索词/关键词、缺口象限码(如 `W1-F3`)、`prompt_id`、Key 编号、内部代号 |
|
|
632
|
+
| `ReaderVisiblePremise` | **读者**(Reddit 上真实看到的) | 这篇内容成立所依赖的**真实**问题 / 事件 / 体验 —— 一个真人为什么会在这个板块发这个帖 |
|
|
633
|
+
|
|
634
|
+
**两者的关系:`InternalCoverageIntent` 是选材依据,`ReaderVisiblePremise` 是叙事前提。**
|
|
635
|
+
前者**驱动**后者的产生,但**不得代替**它,也不得在读者面出现。一条 Brief 可以有
|
|
636
|
+
`InternalCoverageIntent`(甚至多条),但**必须**有且仅有一个 `ReaderVisiblePremise`;
|
|
637
|
+
`ReaderVisiblePremise` 为空、或内容只是复述内部意图(如「覆盖 FAQ-07」)→ **拦截**。
|
|
638
|
+
|
|
639
|
+
### B-1.6.2 门:`NarrativeLayerGate`
|
|
640
|
+
|
|
641
|
+
**只扫描下列「读者叙事面」字段**(其他字段一概不扫,见 B-1.6.3):
|
|
642
|
+
|
|
643
|
+
- `核心角度`(排期表列)
|
|
644
|
+
- `标题方向`
|
|
645
|
+
- `大纲`(含各节点说明)
|
|
646
|
+
- `撰写逻辑一句话`
|
|
647
|
+
- 评论 Brief 的 `评论任务方向`
|
|
648
|
+
- 最终 Reddit payload:title / body / comment 正文(outbound 检查,writing 与
|
|
649
|
+
delivery 侧同样执行)
|
|
650
|
+
|
|
651
|
+
**拦截条件(命中任一即 `BlockingGap: InternalIntentLeak`):**
|
|
652
|
+
|
|
653
|
+
1. 出现 FAQ 编号 / FAQ 清单项标识(`FAQ-07`、`Q12`、「FAQ 第三条」…)
|
|
654
|
+
2. 出现「响应 / 回应 / 覆盖 / 打中 FAQ」「覆盖 fanout」「命中 prompt」这类**把内部动作
|
|
655
|
+
当作角度**的表述
|
|
656
|
+
3. 原样搬入 GEO / searchQuery / 站内搜索词 / 关键词标签作为角度或标题
|
|
657
|
+
4. 出现内部代号:Key 编号、`prompt_id`、缺口象限码、`MappingRuleID`、`SampleSetID`、
|
|
658
|
+
`SKU` 内部编号
|
|
659
|
+
> ⚠️ **按 token registry + 标签语境判定,不做无条件字符串黑名单:** 只有当它们
|
|
660
|
+
> **作为内部标签**出现时才拦截。**真实产品型号、用户原话引用、以及碰巧形似内部编号的
|
|
661
|
+
> 自然语句**(型号 `A-07`、容量 `Q12`、「这几个问题我也被问过」)**不得误伤**;
|
|
662
|
+
> 判定以本项目登记在 `InternalCoverageIntent` 里的实际 token 为准。
|
|
663
|
+
5. `ReaderVisiblePremise` 缺失,或只是内部意图的同义复述
|
|
664
|
+
|
|
665
|
+
**处置:** 不是删掉了事——要求把该内部意图**改写成 `ReaderVisiblePremise`**(一个真人
|
|
666
|
+
会遇到的具体问题 / 事件 / 体验),再重写角度与标题方向。改写不出来(找不到真实读者前提)
|
|
667
|
+
才是真正的阻断信号:说明这条选题本身只有内部理由。
|
|
668
|
+
|
|
669
|
+
### B-1.6.3 ⚠️ 不误伤条款(必须完整读,否则会挡掉合法选题)
|
|
670
|
+
|
|
671
|
+
**A. 只扫读者叙事面,不做全文字符串扫描。** 下列位置**允许并鼓励**保留内部标签,
|
|
672
|
+
扫描器不得对它们报警:
|
|
673
|
+
|
|
674
|
+
`InternalCoverageIntent` · `TraceFields`(`SampleSetID` / `MappingRuleID` / …) ·
|
|
675
|
+
`Routing Decision` 全块 · `SelectionReason` · **`方向选取理由`**(模板本就明确允许在此
|
|
676
|
+
引用缺口矩阵 Key 与 `prompt_id`)· 执行表的 `fanout` 列与审计控制列 · 飞书文档内部标注。
|
|
677
|
+
|
|
678
|
+
**B. FAQ / GEO 证据转成真实读者问题是合法的,而且是本门想要的结果。**
|
|
679
|
+
禁的是**原样标签进叙事**,不是禁止使用 FAQ 素材。
|
|
680
|
+
|
|
681
|
+
| 输入(内部) | ❌ 违规写法(角度/标题里) | ✅ 合法写法 |
|
|
682
|
+
|---|---|---|
|
|
683
|
+
| FAQ「能碰水吗」 | 「回应 FAQ 防水疑虑」 | 一个真实的保养提问帖:「下雨天通勤淋到了,还能正常用吗?」 |
|
|
684
|
+
| FAQ「中国品牌可靠吗」 | 「正面回应用户 FAQ 中对中国品牌的核心疑虑」 | 用真实使用时长与故障记录讲一次具体的耐用性经历,让读者自己得出判断 |
|
|
685
|
+
| fanout `best budget X for Y` | 标题写成 `Best budget X for Y` 标签式 | 用自己的预算约束与取舍过程自然覆盖同一语义 |
|
|
686
|
+
|
|
687
|
+
**判据一句话:读者读到这句时,是否需要知道 FAQ / GEO / 内部编号的存在?**
|
|
688
|
+
需要 → 违规;不需要(它读起来就是一个人在讲自己的事)→ 合法。
|
|
689
|
+
**不要把「FAQ」这个词或任何关键词短语做成无条件黑名单**——正文里出现「这几个问题我也被问过」
|
|
690
|
+
是完全正常的说法。
|
|
691
|
+
|
|
692
|
+
**C. 两条明确不在本门覆盖范围内:**
|
|
693
|
+
|
|
694
|
+
1. **「B 组正文自然覆盖 fanout 子查询」仍然合法**(见 `reddit-content-writing` 的
|
|
695
|
+
`references/phase4-writing.md` 动笔顺序规则)。那是 **query-as-content**(把查询表达的
|
|
696
|
+
语义用人话写出来),不是 **query-as-label**(把查询字符串当角度或标题贴上去)。
|
|
697
|
+
本门只禁后者。
|
|
698
|
+
2. **飞书文档里的 `[Fanout] <查询文本>` 标红行是文档内部标注**,给内容同事看,
|
|
699
|
+
**不发到 Reddit**,不属于读者可见叙事。但 outbound 检查必须确认它**没有**混进
|
|
700
|
+
Reddit 的 title / body / comment。
|
|
701
|
+
|
|
702
|
+
|
|
434
703
|
---
|
|
435
704
|
|
|
436
705
|
## 步骤 B-2 — 按 Key 生成帖/评撰写方向(核心产出)
|
|
@@ -446,12 +715,50 @@ ASK / GUIDE / ROUNDUP / OWNER / OPINION / RANT / FOLLOWUP / LIST / REPUTATION
|
|
|
446
715
|
- AssignedFlair: (现行 flair 之一;无 flair 板块填 NoFlairAvailable / NoFlairRequired,不留空)
|
|
447
716
|
- PostingTrigger: (ConcreteFailure / PurchaseDecision / MeasurementResult / CompatibilityGap / UnsolicitedTestimony;须满足 × BrandEntryMode 交叉约束)
|
|
448
717
|
|
|
718
|
+
**NarrativeLayering(G1,主帖与评论均必填,先于标题方向与大纲):**
|
|
719
|
+
- InternalCoverageIntent: (仅内部:FAQ 编号/原文、fanout 子查询、关键词、缺口象限码、prompt_id;可多条)
|
|
720
|
+
- ReaderVisiblePremise: (读者看到的真实问题/事件/体验,一句话;**不得是内部意图的复述**;缺失 → BlockingGap: InternalIntentLeak)
|
|
721
|
+
|
|
722
|
+
**MaterialModalitySnapshot(G4,引用 B-1.4 台账,逐条列出本 Key 用到的素材):**
|
|
723
|
+
- <MaterialID>: OriginalModality → EffectiveModality
|
|
724
|
+
(ModalityStatus / ModalityUpgradeRef / ModalityDowngradeRef / DowngradeSource / ApprovedBy
|
|
725
|
+
—— **升级与降级的审计字段都要带下来**,否则下游无法机械核验;亦可写 `LedgerRef: <B-1.4 台账行>`
|
|
726
|
+
代替逐字段复制,但不得两者皆空)
|
|
727
|
+
(EffectiveModality 严于 OriginalModality 而无合法 ModalityUpgradeRef → 拦截并回落;
|
|
728
|
+
宽于 OriginalModality 而无 ModalityDowngradeRef + DowngradeSource + ApprovedBy → 同样拦截)
|
|
729
|
+
|
|
730
|
+
**BrandPlacementBasis(G2,**仅 P-B / PGC 主帖**必填;P-NB 主帖填 `N/A(P-NB · 主帖不露品牌)`;
|
|
731
|
+
C-B 评论**不填本块**,改用评论模板的 `InheritedBrandPlacementBasis` + `CommentPlacementDecision`):**
|
|
732
|
+
- SourceKind: BaselineHistogram / SRPHistogram / Exception(**Exception 是合法来源**,见 §2.0 例外分支)
|
|
733
|
+
- SourceRef: (SampleSetID / SRP 的 ProfileVersion / **SourceKind=Exception 时填 ExceptionRef**)
|
|
734
|
+
- Scope: subreddit + flair + 帖型/ContentFunction + 账号类型(UGC / PGC)
|
|
735
|
+
- ComparableSampleCount: (该 Scope 下的合格样本总数)
|
|
736
|
+
- BrandMentionSampleCount: (其中**确实出现品牌/产品**的样本数 —— 直方图的真实分母)
|
|
737
|
+
- NoBrandMentionRate: (= 1 − BrandMentionSampleCount / ComparableSampleCount;**不是直方图的一档**,也不构成 D 类)
|
|
738
|
+
- ComparableScopeStatus: Exact / ApprovedFallback(<放宽了哪一维> + 批准人) / Insufficient
|
|
739
|
+
- BrandFirstMentionHistogram: 标题 / 首段 / 中段 / 结论 **四档**占比(分母 = BrandMentionSampleCount;
|
|
740
|
+
零分母填 N/A;档位→SelectedPlacement 换算:结论 → 后段)
|
|
741
|
+
- Section2RiskCeiling: A / B / C / D(brand-SKU-PGC-rules §2 判定的风险边界)
|
|
742
|
+
- SelectedPlacement: 标题 / 首段 / 中段 / 后段 / 评论 / 不出现
|
|
743
|
+
(⚠️ **既有 P-B / PGC 行只能取 标题/首段/中段/后段**;取「评论」或
|
|
744
|
+
「不出现」等于把该行变成 P-NB+C-B = 配额变更 → BlockingGap 回规划。
|
|
745
|
+
「评论」/「不出现」仅对规划时已是 P-NB 的行合法)
|
|
746
|
+
- DecisionStatus: Supported / Sparse / NoComparableEvidence / Exception
|
|
747
|
+
- SparseApprovedBy: (仅 Sparse 必填;≠ 生成本 Brief 的 agent)
|
|
748
|
+
- BrandTitleExposureException: None / PGCApproved / BrandReviewPost
|
|
749
|
+
- ExceptionBasis / ExceptionScope / ExceptionApprovedBy / ExceptionApprovedAt:
|
|
750
|
+
(有例外时四项必填,见 brand-SKU-PGC-rules.md §2.5)
|
|
751
|
+
|
|
449
752
|
**LockedFingerprintFields(v2.12.26 必填 9 项锁字段,写大纲之前先填满):**
|
|
450
753
|
- ContentFunction:
|
|
451
754
|
- StructureFamily:
|
|
452
755
|
- OpeningMove:
|
|
453
756
|
- EvidenceShape:
|
|
454
|
-
- BrandEntryMode:
|
|
757
|
+
- BrandEntryMode: (须已通过 BrandPlacementGate;**P-B/PGC** 的 BrandPlacementBasis 未填满不得赋值。
|
|
758
|
+
⚠️ P-NB 主帖的 `BrandEntryMode` **仍必须写受控值「不出现」** ——
|
|
759
|
+
`N/A(P-NB · 主帖不露品牌)` 只是 **BrandPlacementBasis 的哨兵值**,
|
|
760
|
+
不是 BrandEntryMode 的取值;写成 N/A 会让 PostingTrigger ×
|
|
761
|
+
BrandEntryMode 交叉约束(UnsolicitedTestimony 要求「不出现」)失效)
|
|
455
762
|
- CaveatMode: (无真实限制则写「无真实限制则不写」,不得虚构缺点凑值)
|
|
456
763
|
- EndingMode:
|
|
457
764
|
- LengthBand: (由 SampleSetID 的词数中位数 + IQR 派生,不用跨板块固定值;
|
|
@@ -507,7 +814,8 @@ ASK / GUIDE / ROUNDUP / OWNER / OPINION / RANT / FOLLOWUP / LIST / REPUTATION
|
|
|
507
814
|
**撰写逻辑一句话:** (本帖要占领的语义位置、与配对评论的分工)
|
|
508
815
|
|
|
509
816
|
**品牌词嵌入(仅 P-B):**
|
|
510
|
-
-
|
|
817
|
+
- 出现位置:(= 上方 `SelectedPlacement`;**不得与 BrandPlacementBasis 不一致**。
|
|
818
|
+
写「标题」时必须同时持有直方图支持或已记录的 `BrandTitleExposureException`)
|
|
511
819
|
- 嵌入方式:(自然体验叙述 / 对比语境 / 回复他人时带出;禁止开篇硬广)
|
|
512
820
|
- 禁用写法:(甲方禁写项、版规禁止表述)
|
|
513
821
|
|
|
@@ -519,7 +827,12 @@ ASK / GUIDE / ROUNDUP / OWNER / OPINION / RANT / FOLLOWUP / LIST / REPUTATION
|
|
|
519
827
|
```markdown
|
|
520
828
|
### [Key] · 评论 · [C-B✅ / C-NB❌] · 绑定 SKU:[SKU] · 配对:[P Key 或 外部URL]
|
|
521
829
|
|
|
522
|
-
|
|
830
|
+
**NarrativeLayering(G1):**
|
|
831
|
+
- InternalCoverageIntent: (仅内部)
|
|
832
|
+
- ReaderVisiblePremise: (这条评论在读者眼里为什么会被写出来)
|
|
833
|
+
|
|
834
|
+
**评论任务方向:** (在帖下扮演什么身份:路人补充 / 追问细节 / 分享同类经历 / 温和推荐。
|
|
835
|
+
**本字段属读者叙事面**,受 B-1.6 `NarrativeLayerGate` 扫描)
|
|
523
836
|
|
|
524
837
|
> 评论**不进入主帖指纹索引窗口**(`WindowScope: PostOnly`)。需要防评论同质化时,
|
|
525
838
|
> 另记 `CommentFunction / ReplyMove / EndingMode`,不要混入主帖窗口。
|
|
@@ -530,9 +843,22 @@ ASK / GUIDE / ROUNDUP / OWNER / OPINION / RANT / FOLLOWUP / LIST / REPUTATION
|
|
|
530
843
|
2. 中段:(补充信息;C-B 品牌词自然带出时机)
|
|
531
844
|
3. 收尾:(短、口语化;与帖—评互补规则一致)
|
|
532
845
|
|
|
846
|
+
**MaterialModalitySnapshot(G4,同主帖模板;本条评论用到的素材逐条列出):**
|
|
847
|
+
- <MaterialID>: OriginalModality → EffectiveModality
|
|
848
|
+
(ModalityStatus / ModalityUpgradeRef / ModalityDowngradeRef / DowngradeSource / ApprovedBy,
|
|
849
|
+
或 `LedgerRef: <B-1.4 台账行>`)
|
|
850
|
+
|
|
533
851
|
**品牌词嵌入(仅 C-B):**
|
|
852
|
+
- CommentPlacementDecision:(评论内的品牌出现时机与方式)
|
|
853
|
+
- InheritedBrandPlacementBasis:(**继承配对 P Key 的 `BrandPlacementBasis`**,写其 SourceRef +
|
|
854
|
+
DecisionStatus;评论**不单独建直方图** —— 主帖的「品牌首次出现位置」直方图统计的是主帖
|
|
855
|
+
标题/正文位置,不能直接决定评论内的位置。
|
|
856
|
+
**配对主帖是 P-NB(本身无 Basis)时填 `N/A(PairedPostIsP-NB)`**,此时评论位置只由
|
|
857
|
+
§2 风险边界 + 帖—评互补规则决定;外部评论无配对 P Key 时填 `N/A(ExternalComment)`)
|
|
534
858
|
- 出现位置与方式:(须符合 P-B↔C-NB / P-NB↔C-B 互补规则)
|
|
535
859
|
- 与主帖分工:(帖不提品牌则评带出;帖已含品牌则评不重复硬推)
|
|
860
|
+
- 风险处置:(高风险板块的 C-B 写**建议**:降 C-NB / 保留 / 删除;实际变更须回规划确认,
|
|
861
|
+
不得在 Brief 阶段直接改行类型)
|
|
536
862
|
|
|
537
863
|
**方向选取理由:** (为何用此评论角度;外部评论须注明 Geoly/EPA 选取依据)
|
|
538
864
|
```
|
|
@@ -573,11 +899,12 @@ ASK / GUIDE / ROUNDUP / OWNER / OPINION / RANT / FOLLOWUP / LIST / REPUTATION
|
|
|
573
899
|
```
|
|
574
900
|
[ ] 【v2.12.26】两份契约已读:content-type-routing-contract.md + content-diversity-contract.md
|
|
575
901
|
[ ] 【v2.12.26】本批 baseline 卡的全部样本 selftext_truncated=false(null/缺失同样不通过),长度类维度方可采信
|
|
576
|
-
[ ] 【v2.12.26】本批每个目标 subreddit 都有有效 baseline 卡(5–10
|
|
902
|
+
[ ] 【v2.12.26】本批每个目标 subreddit 都有有效 baseline 卡(5–10 条近期真实帖),已分配 SampleSetID,且 AcquiredAt / BaselineMaxAgeDays / ValidUntil 齐全、now ≤ ValidUntil
|
|
903
|
+
[ ] 【v2.15】baseline 卡覆盖**全部 10 个维度**,逐项非空(缺任一项 = Incomplete,不得用默认值顶替):①词数中位数+IQR ②段落数中位数 ③标题长度与句式分布 ④列表/小标题使用率 ⑤品牌首次出现位置分布(四档直方图 + ComparableSampleCount + BrandMentionSampleCount + NoBrandMentionRate;「不出现」不是直方图的一档)⑥提问式结尾比例 ⑦是否常见 TL;DR ⑧第一人称比例 ⑨评测帖 vs 问题帖长度差异 ⑩破折号/括号使用分布
|
|
577
904
|
[ ] 【v2.12.26】项目差异化窗口已锁定(WindowCount 8–12 且 WindowDays 30–60 同时生效 / WindowScope: PostOnly / WindowSort / BaselineMaxAgeDays / IndexRevision),写入指纹索引文件头
|
|
578
905
|
[ ] 【v2.12.26】每个**主帖** Key 的「客户内容原型」均命中 memory/phase0-客户内容原型映射.md 的 Approved 行,MappingRuleID 与 MappingVersion 已记入 Routing Decision;无未映射代号(自评继承配对主帖的原型值,外部评论填「—」,不单独要求映射)
|
|
579
906
|
[ ] 【v2.12.26】每条主帖 Brief 均含 9 项 LockedFingerprintFields:ContentFunction / StructureFamily / OpeningMove / EvidenceShape / BrandEntryMode / CaveatMode / EndingMode / LengthBand / AnchorSlot
|
|
580
|
-
[ ] 【P0-C】每条主帖 Brief 均含 2 项 PrewritingControlFields:AssignedFlair(非空,现行 flair 或 NoFlairAvailable/NoFlairRequired
|
|
907
|
+
[ ] 【P0-C】每条主帖 Brief 均含 2 项 PrewritingControlFields:AssignedFlair(非空,现行 flair 或 NoFlairAvailable/NoFlairRequired;且已按 B-1.0/W0 对台账 ProposedFlair 完成验证锁定,FlairVerificationStatus ∈ {Verified, FallbackAssigned},无 Rejected 遗留)+ PostingTrigger(受控五值,满足 × BrandEntryMode 交叉约束)
|
|
581
908
|
[ ] 【P0-C】每张 baseline 卡记录 flair 覆盖:BaselineScope / BaselineFlair / FlairSampleCount / FlairCoverageStatus(Exact 或 ApprovedFallback;Insufficient → BlockingGap)/ FallbackApprovalRef(fallback 时须署名)
|
|
582
909
|
[ ] 【v2.12.26】每条主帖 Brief 均含 4 项 TraceFields:SampleSetID / RecentCollisionCheck / MappingRuleID / MappingVersion
|
|
583
910
|
[ ] 【v2.12.26】每条主帖 Brief 均含 Routing Decision 块,五层候选收敛轨迹齐全(Baseline / Function / Evidence / PrimaryAndCompliance / MappingPredicates + MatchedPredicate),SelectedCandidateRank 与 SkippedCandidates(CandidateRank + RejectionReason)已记录;跳过更靠前候选的理由均为 1–5 层硬失败,差异化仅作 tie-breaker,CollisionRepairPath 已记录
|
|
@@ -594,9 +921,22 @@ ASK / GUIDE / ROUNDUP / OWNER / OPINION / RANT / FOLLOWUP / LIST / REPUTATION
|
|
|
594
921
|
[ ] 板块总览表数量与 phase4-board-quantity-plan、执行表一致
|
|
595
922
|
[ ] 执行表每一条 Key 均有对应 Brief 块(帖+评+外部无遗漏)
|
|
596
923
|
[ ] 每条 Brief 含:标题或任务方向 + 大纲(结构+撰写逻辑)+ 方向选取理由
|
|
597
|
-
[ ] 所有 P-B / C-B
|
|
598
|
-
[ ]
|
|
599
|
-
[ ]
|
|
924
|
+
[ ] 所有 P-B / C-B 行均含品牌词嵌入策略(**P-B / PGC 主帖**位置按 `references/brand-SKU-PGC-rules.md` §2.0「位置来源 vs 风险边界」判定:直方图定位置、§2 A/B/C/D 定风险边界;**C-B 评论不建自有直方图、不跑该公式**,用 CommentPlacementDecision + InheritedBrandPlacementBasis);P-NB / C-NB 行注明「本篇不含品牌词」及互补分工
|
|
925
|
+
[ ] 【G2】每条 **P-B / PGC 主帖**均已填满 BrandPlacementBasis(SourceKind / SourceRef / Scope / ComparableSampleCount / BrandMentionSampleCount / NoBrandMentionRate / BrandFirstMentionHistogram(四档,分母 = BrandMentionSampleCount)/ Section2RiskCeiling / SelectedPlacement / DecisionStatus),**位置由直方图 + §2 风险边界共同决定,不得由 P-B 标签推导**;本批不存在「因为标记 P-B 所以标题写品牌」的行;既有 P-B/PGC 行的 SelectedPlacement 未取「评论」/「不出现」(需要时走 BlockingGap 回规划)
|
|
926
|
+
[ ] 【G2】每条 **C-B 评论**填了 CommentPlacementDecision + InheritedBrandPlacementBasis(继承配对 P Key;配对为 P-NB 填 N/A(PairedPostIsP-NB);外部评论填 N/A(ExternalComment))——评论不单独建直方图,也不要求自有 Basis
|
|
927
|
+
[ ] 【G2】**P-B / PGC 主帖**的 `SelectedPlacement` = 更晚的(§2 允许的最早位置, 直方图经验位置,档位按「结论 → 后段」换算),取值限 标题/首段/中段/后段;**P-NB 主帖**直接「不出现」且不跑该公式;**C-B 评论**用 CommentPlacementDecision,不跑该公式
|
|
928
|
+
[ ] 【G2】D 类高风险板块:P-NB 主帖不露品牌;既有 P-B/PGC 行 → BlockingGap 回规划
|
|
929
|
+
[ ] 【G2】`DecisionStatus: NoComparableEvidence`(BrandMentionSampleCount = 0)的行未直接放行:已补样本、换 SRP 来源、走 StopAndAsk,或持有已记录的 BrandTitleExposureException(PGC 须过 §4 precedent check 且有先例 URL;Brand Review 须由 PrimaryPostType/WritingVariant + 选题证据判定,**不得自造 ContentFunction: Review**)
|
|
930
|
+
[ ] 【G2】`DecisionStatus: Sparse`(1–4 条)的行满足 §2.5 三条:三个计数已写明 + 取更保守(更晚)的一档 + `SparseApprovedBy` 已署名;否则按 NoComparableEvidence 处理
|
|
931
|
+
[ ] 【G2】有 BrandTitleExposureException 的行,ExceptionBasis / ExceptionScope / ExceptionApprovedBy / ExceptionApprovedAt 四项齐全,且未越过 §2 D 类与披露要求
|
|
932
|
+
[ ] 【G2】本批未改动 P-B/P-NB/C-B/C-NB/PGC 配额语义(位置不成立时走 BlockingGap 或回规划确认,不得静默改配额或改行类型)
|
|
933
|
+
[ ] 【G1】每条主帖与评论 Brief 均含 InternalCoverageIntent + ReaderVisiblePremise;ReaderVisiblePremise 非空且不是内部意图的复述
|
|
934
|
+
[ ] 【G1】读者叙事面(核心角度 / 标题方向 / 大纲 / 撰写逻辑一句话 / 评论任务方向)不含**作为内部标签出现的** FAQ 编号、「响应/覆盖 FAQ」字样、GEO/searchQuery/关键词标签原样、内部代号(按 token registry + 标签语境判定;真实型号、用户原话、形似编号的自然语句不算违规);Routing Decision / 方向选取理由 / TraceFields / 执行表 fanout 列等内部面**不在扫描范围内**,不得因此报警
|
|
935
|
+
[ ] 【G4】本批素材 Modality 台账齐全(MaterialID / OriginalModality / EffectiveModality / ModalitySource / ModalityStatus),无 modality 缺失或来源冲突(fail-closed)
|
|
936
|
+
[ ] 【G4】不存在未授权升级:EffectiveModality 严于 OriginalModality 的行均有可追溯到 ClientContract / SubredditRule / ComplianceRequirement 的 ModalityUpgradeRef,ApprovedBy ≠ 生成本 Brief 的 agent(**或给出可追溯的 LedgerRef,等价接受**);**用户明确标 Optional 的项目未被升级**(如需升级,已回到用户重新确认)
|
|
937
|
+
[ ] 【G4】不存在未授权降级:EffectiveModality 宽于 OriginalModality 的行均有 ModalityDowngradeRef + DowngradeSource(仅 ClientContract / ComplianceRequirement / UserInstruction 三值)+ ApprovedBy,**或给出可追溯到台账行的 LedgerRef(等价接受)**;Forbidden 项未被改成其他值
|
|
938
|
+
[ ] 【G4】Brief 与写作指令中未对非 Required 素材使用「强制嵌入 / 必须提及 / 每篇都要带」等措辞;合规披露要求未被当成卖点 Required
|
|
939
|
+
[ ] 【新增】高风险板块(明确禁止 self-promotion/shilling 的子版)的 P-B 帖已确认露出策略——**既有 P-B/PGC 行在 D 类板块不得静默改成「主帖不露品牌」,须 BlockingGap 回规划**;C-B 评论已评估风险并给出**处理建议**(降 C-NB / 保留 / 删除)—— **建议不等于变更**:任何行类型或配额的实际改动须回规划确认并重跑相关门禁(Phase 4.0.6.0)
|
|
600
940
|
[ ] 选取理由均含板块理由 + 方向理由(总览表列可摘要,逐条 Brief 须展开)
|
|
601
941
|
[ ] 竞品提及与 phase0/hot-cache 许可一致(否=Brief 正文不出现竞品品牌名)
|
|
602
942
|
[ ] memory/phase4-撰写brief.md 已以追加方式写入(含 Batch 编号 + 日期标注)
|
|
@@ -619,7 +959,13 @@ ASK / GUIDE / ROUNDUP / OWNER / OPINION / RANT / FOLLOWUP / LIST / REPUTATION
|
|
|
619
959
|
|
|
620
960
|
`reddit-content-writing` 动笔时**须读取** `memory/phase4-撰写brief.md`:
|
|
621
961
|
- 标题与正文须符合 Brief 中的标题方向与大纲,偏离须先在 Brief 修订并重新获批
|
|
622
|
-
- 品牌词位置须符合 Brief
|
|
962
|
+
- 品牌词位置须符合 Brief 的 `SelectedPlacement` 与 `BrandPlacementBasis`(G2);
|
|
963
|
+
writing 侧不得自行改位置,也不得以「这行是 P-B」为由把品牌放进标题
|
|
964
|
+
- `ReaderVisiblePremise` 与 `InternalCoverageIntent` 随 Brief 传递(G1):
|
|
965
|
+
正文、标题与评论**只能**表达前者;outbound 前须确认内部标签(FAQ 编号、fanout 查询串、
|
|
966
|
+
Key / prompt_id)未混入 Reddit payload
|
|
967
|
+
- 素材 `EffectiveModality` 原样传递(G4):writing 与 rewrite **不得再次升级**,
|
|
968
|
+
也不得把 `Required` 项静默降级或漏写
|
|
623
969
|
- 结构字段(9 项)由 Brief 预分配,**写手不得临场自选、不得改选 family**;
|
|
624
970
|
与窗口碰撞时输出 `DiversityStatus: BlockingCollision` 退回 Brief
|
|
625
971
|
- W-1 阶段只检查 baseline **freshness**,不重复采集 baseline
|
|
@@ -17,12 +17,14 @@ Apply the installed shared references. macOS/Linux paths start with `~/.cursor/s
|
|
|
17
17
|
- `~/.cursor/skills/reddit-strategy-shared/references/context-contract.md`
|
|
18
18
|
- `~/.cursor/skills/reddit-strategy-shared/references/content-type-routing-contract.md` (mandatory — this skill is the mapping owner)
|
|
19
19
|
- `~/.cursor/skills/reddit-strategy-shared/references/content-diversity-contract.md`
|
|
20
|
+
- `~/.cursor/skills/reddit-strategy-shared/references/subreddit-research-profile.md` (SRP — the board research profile produced by `reddit-phase-research` step 0.5.5 and consumed by D1–D7)
|
|
20
21
|
- Windows equivalents: `$HOME\.cursor\skills\reddit-strategy-shared\references\...`
|
|
21
22
|
|
|
22
23
|
## Source Reference
|
|
23
24
|
|
|
24
25
|
- `references/phase3-master-canvas.md`
|
|
25
26
|
- `references/phase4-planning.md`
|
|
27
|
+
- `references/scheduling-decision-procedure.md` (mandatory before Phase 4.0.0.4 — the D1–D7 scheduling decision procedure that decides where the fixed brand quotas land)
|
|
26
28
|
|
|
27
29
|
## Required Inputs
|
|
28
30
|
|
|
@@ -85,6 +87,11 @@ AffectedKeys: <execution-table keys>
|
|
|
85
87
|
- `phase406_verify.py` reads SKU requirements from `memory/phase4-sku-基准表.md` or JSON, not hand-edited constants.
|
|
86
88
|
- After Phase 4.0.6, hand off to `reddit-phase-brief`; do not start draft writing directly.
|
|
87
89
|
- Phase 3 Master Canvas must contain all 21 boards in `references/phase3-master-canvas.md`; Data Support, MCP Status, and Verification Boundaries are mandatory.
|
|
90
|
+
- Phase 4.0.0.4 must run the D1–D7 scheduling decision procedure. Board/flair/lifecycle/quantity decisions come from that procedure, not from a lookup table. The old heuristics (single-subreddit share <= 40%, core subreddit <= 8 posts, >= 4 subreddits covered) are demoted to `SRPMode: Fallback` defaults and act only as warning-level sanity checks under `SRPMode: Full` / `Provisional`. The first two are per-board (judged by that board's own `SRPMode`); `>= 4 subreddits covered` is plan-level and is hard only when every board in the plan is `Fallback`.
|
|
91
|
+
- The procedure never changes brand-quota semantics. P-B / P-NB / C-B / C-NB / PGC quotas and compensation Rules 1-3 stay owned by `memory/phase4-sku-基准表.md` and Phase 4.0.0. If no plan satisfies the hard quotas, emit `D6Status: NoFeasiblePlan` and ask; never relax a quota to make a plan feasible.
|
|
92
|
+
- D2 emits `ProposedFlair`. `reddit-phase-brief` still locks the final `AssignedFlair` against the account's live flair list.
|
|
93
|
+
- Every execution-table row needs a matching per-post entry in `memory/phase4-排期决策台账.md` (9 required fields, including the actual `ProposedFlair` value — the execution table has no flair column). `scripts/phase406_verify.py` does not check this ledger; the Phase 4.0 gate does.
|
|
94
|
+
- A subreddit whose SRP is `confidence: Provisional` may feed planning but may never lock the execution table (SRP contract §7); `approvalStatus: Approved` does not lift that.
|
|
88
95
|
- Phase 4.0.0 must lock SKU requirements and board-level quantity plan before the execution table.
|
|
89
96
|
- Phase 4.0.5 must fill B-group fanout before Phase 4.0.6.
|
|
90
97
|
|
|
@@ -93,6 +100,7 @@ AffectedKeys: <execution-table keys>
|
|
|
93
100
|
- `memory/phase0-客户内容原型映射.md`
|
|
94
101
|
- `memory/phase3-master-canvas摘要.md`
|
|
95
102
|
- `memory/phase4-board-quantity-plan.md`
|
|
103
|
+
- `memory/phase4-排期决策台账.md`
|
|
96
104
|
- `memory/phase4-sku-基准表.md`
|
|
97
105
|
- `memory/phase4-执行表.md`
|
|
98
106
|
- `memory/phase4-SKU品牌词映射.md`
|
|
@@ -116,6 +124,11 @@ AffectedKeys: <execution-table keys>
|
|
|
116
124
|
- RequiredBoardsPresent: Data Support / MCP Status / Verification Boundaries
|
|
117
125
|
- SKURequirementSource:
|
|
118
126
|
- BoardQuantityPlan:
|
|
127
|
+
- SRPModeBySubreddit:
|
|
128
|
+
- SchedulingDecisionProcedure: D1-D7 executed / Not run
|
|
129
|
+
- LockedPlanID:
|
|
130
|
+
- SchedulingDecisionLedger: `memory/phase4-排期决策台账.md`
|
|
131
|
+
- RejectedSubreddits:
|
|
119
132
|
- SKUMappingFile:
|
|
120
133
|
- BatchMap:
|
|
121
134
|
- ExternalPostAuditStatus:
|
|
@@ -107,9 +107,23 @@ C024–C040:外部评论(W1→W2→W3→W4 顺序)
|
|
|
107
107
|
|
|
108
108
|
执行表填写完毕后,动笔前必须运行以下聚合检查:
|
|
109
109
|
|
|
110
|
-
|
|
110
|
+
> **口径以 D6 为准(`reddit-phase-planning/references/scheduling-decision-procedure.md`)。**
|
|
111
|
+
> 下面三条是**旧的硬编码启发式,已被 Phase 4.0.0.4 的 D6 锁定方案取代**,现在只按 `SRPMode` 分档生效:
|
|
112
|
+
>
|
|
113
|
+
> | `SRPMode` | 效力 |
|
|
114
|
+
> |---|---|
|
|
115
|
+
> | `Fallback`(该板块无 SRP) | **硬约束**,不达标按右列处理 |
|
|
116
|
+
> | `Full` / `Provisional`(该板块有 SRP) | **warning-level sanity check**:越界不否决方案,但必须在 D6 方案的约束快照里标注越界项与理由,交用户锁定;板块上限以 D5 的 `capacityMax` 为准 |
|
|
117
|
+
>
|
|
118
|
+
> **作用域:** 前两条按**板块**判(用该板块自己的 `SRPMode`);「子版覆盖数 ≥ 4 个」是**方案级**
|
|
119
|
+
> 约束,仅当方案内全部板块均为 `Fallback` 时才硬执行,混合模式下为 warning-level。
|
|
120
|
+
>
|
|
121
|
+
> 这组数字按「总帖 20 条」标定,对显著不同的总量不具尺度一致性。
|
|
122
|
+
|
|
123
|
+
| 检查项 | 阈值(`SRPMode: Fallback` 下为硬约束) | 不达标处理 |
|
|
111
124
|
|--------|------|----------|
|
|
112
125
|
| 单一子版帖子数占比 | ≤ 40% | 将超量帖子移到 Phase 2 缺口矩阵引用次数排名第二的子版 |
|
|
126
|
+
| 核心子版帖子数 | ≤ 8 条(总帖 20 条时) | 同上 |
|
|
113
127
|
| 子版覆盖数 | ≥ 4 个不同子版 | 从 Phase 2 社区缺口矩阵补充 |
|
|
114
128
|
|
|
115
129
|
---
|
|
@@ -270,7 +284,7 @@ Geoly MCP → get_prompt_citations(
|
|
|
270
284
|
[ ] 主帖含品牌词总数已统计并与 Master **Summary** 约定一致(差值=0)
|
|
271
285
|
[ ] 外部评论 URL 均已在执行表中填写真实 URL,无「URL待确认」占位符
|
|
272
286
|
[ ] 外部评论已建立「外部核验」控制列或独立 EPA 记录(不计入 16 字段核心 schema),动笔后发布前须逐条填入核验结果
|
|
273
|
-
[ ]
|
|
287
|
+
[ ] 板块分布已按 D6 口径核对:单板块项(单一子版占比 ≤ 40% / 核心子版 ≤ 8 条)按该板块自己的 `SRPMode` 判——`Fallback` 为硬约束,`Full` / `Provisional` 以 D5 `capacityMax` 与 D6 锁定方案为准;「覆盖 ≥ 4 个」是方案级约束,仅全部板块为 `Fallback` 时硬执行。warning-level 越界项已在约束快照中标注理由(不否决方案)
|
|
274
288
|
[ ] A/B 两组未在同一线程各发 C-B
|
|
275
289
|
[ ] 【方案E】补偿规则评估已完成(全部 UGC P-NB 帖逐行检查 Rule-1;全部 C-NB 外部评论逐行检查 Rule-2)
|
|
276
290
|
[ ] 【方案E】触发补偿规则的行已在执行表「写作说明」列注明处理方式
|