@geoly-ai/social-hub-cli 0.3.2 → 0.3.4
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 +13 -0
- package/dist/client-delivery.test.d.ts +2 -0
- package/dist/client-delivery.test.d.ts.map +1 -0
- package/dist/client-delivery.test.js +201 -0
- package/dist/client-delivery.test.js.map +1 -0
- package/dist/cmd-manifest.json +25 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +279 -0
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
- package/skills/manifest.json +1 -1
- package/skills/reddit-content-rewrite/SKILL.md +58 -3
- package/skills/reddit-content-writing/SKILL.md +43 -5
- package/skills/reddit-content-writing/references/phase4-writing.md +3 -1
- package/skills/reddit-matrix.lock.json +4 -4
- package/skills/reddit-phase-brief/SKILL.md +30 -13
- package/skills/reddit-phase-brief/references/phase4-brief-workflow.md +39 -4
- package/skills/reddit-strategy-shared/references/content-diversity-contract.md +60 -5
- package/skills/reddit-strategy-shared/references/evidence-policy.md +30 -0
- package/skills/reddit-strategy-shared/references/handoff-schemas.md +7 -3
- package/skills/social-hub-cli/SKILL.md +2 -0
- package/skills/social-hub-intelligence/SKILL.md +33 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@geoly-ai/social-hub-cli",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.4",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "social-hub CLI for Social Ops Hub",
|
|
6
6
|
"repository": {
|
|
@@ -22,8 +22,8 @@
|
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
24
|
"commander": "^12.1.0",
|
|
25
|
-
"@geoly-ai/social-hub-authz": "0.0.
|
|
26
|
-
"@geoly-ai/social-hub-sdk": "0.0.
|
|
25
|
+
"@geoly-ai/social-hub-authz": "0.0.9",
|
|
26
|
+
"@geoly-ai/social-hub-sdk": "0.0.45"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
29
|
"@types/node": "^22.10.2",
|
package/skills/manifest.json
CHANGED
|
@@ -135,8 +135,9 @@ description: >-
|
|
|
135
135
|
HandoffRepair · ArtifactType=Post(受管项目主帖)必需:
|
|
136
136
|
OriginalContent / RequestedRepair / ContentKey /
|
|
137
137
|
ContentFunction / PrimaryPostType / StructureFamily /
|
|
138
|
+
AssignedFlair / PostingTrigger /
|
|
138
139
|
OpeningMove / EvidenceShape / BrandEntryMode / CaveatMode /
|
|
139
|
-
EndingMode / LengthBand / AnchorSlot / SecondaryAnchorSlot / SampleSetID /
|
|
140
|
+
EndingMode / LengthBand / AnchorSlot / SecondaryAnchorSlot / SampleSetID / FlairCoverageStatus /
|
|
140
141
|
(SecondaryAnchorSlot 仅用于 >350 词且有两个 ABU 的主帖,否则填 `—`)
|
|
141
142
|
AllowedStructuralChanges / ForbiddenStructuralChanges
|
|
142
143
|
(B 层要"保持全部指纹字段",就必须收到全部原始值;缺任一项 → BlockingGap,
|
|
@@ -405,6 +406,48 @@ ExplicitStructureSpec:
|
|
|
405
406
|
完整命令载荷、失败处理和记忆记录格式见
|
|
406
407
|
`../reddit-strategy-shared/references/content-review-gate.md`。当前 Hub 服务最多支持两次尝试;第二次仍不通过时不得无限重试、降低标准或把结果标成通过。
|
|
407
408
|
|
|
409
|
+
**Step 3.6 结构根因诊断(`StructuralRootCause`)—— 别在措辞层无限空转。**
|
|
410
|
+
|
|
411
|
+
措辞层(`AllowedTextualRepairs`)连续两轮修复后,若 `ai_structural_tone` / 立意 /
|
|
412
|
+
叙事前提仍不达标,就不该继续在措辞层打转——问题的根在结构 / Brief,须退回 owner。
|
|
413
|
+
|
|
414
|
+
**判定分工(四字段互不重叠):**
|
|
415
|
+
|
|
416
|
+
| 字段 | 回答 |
|
|
417
|
+
|---|---|
|
|
418
|
+
| `StructureChangeRequired` | 当前要求是否明确需要改动受保护结构面(锁定字段 / outline premise / paragraph order)? |
|
|
419
|
+
| `StructuralChangeStatus` | rewrite 实际是否越权改了结构? |
|
|
420
|
+
| `HubStructureConflictStatus` | Hub 的 `optimized` 是否触及受保护字段? |
|
|
421
|
+
| `StructuralRootCause` | 结构保持型措辞修复耗尽后,剩余失败是否根源于 Brief / 立意 / 结构? |
|
|
422
|
+
|
|
423
|
+
**`StructuralRootCause: Yes` 必须同时满足全部六条**(缺一即不得判 Yes):
|
|
424
|
+
|
|
425
|
+
1. 已完成规定的结构保持型 repair 流程(Round 1 = 初稿本地 self-check + textual repair → Hub attempt 1;Round 2 = 按 attempt 1 issues 做结构保持型修复 → Hub attempt 2);
|
|
426
|
+
2. Hub attempt 2 仍非 `pass`;
|
|
427
|
+
3. 剩余阻断问题与第一次属**同一结构性问题簇**(`ai_structural_tone` / 立意 / 叙事前提 / 开场 / 品牌进入 / 结尾 / 信息拓扑);
|
|
428
|
+
4. 已如实记录两轮具体 `AllowedTextualRepairs`,不是只写「已去 AI 味」;
|
|
429
|
+
5. 继续解决将**不可避免地**触及 `LockedFingerprintField` / outline premise / paragraph order;
|
|
430
|
+
6. 不存在更优先的**事实 / 合规 / 证据 / 上下文 / 账号绑定 / Hub 不可用**缺口(这些各有其阻断路径,不得混记为结构根因)。
|
|
431
|
+
|
|
432
|
+
> **不得把「第二次不 pass」自动等同于 `StructuralRootCause: Yes`。** attempt 2 仍失败
|
|
433
|
+
> 也可能是证据不足、披露缺失、subreddit 上下文缺失、措辞修复没做对、或 Hub degraded。
|
|
434
|
+
|
|
435
|
+
触发后输出(退回结构 owner,不在本 skill 自行改结构):
|
|
436
|
+
|
|
437
|
+
```markdown
|
|
438
|
+
StructuralRootCause: Yes
|
|
439
|
+
StructureChangeRequired: Yes
|
|
440
|
+
AffectedLockedFields: <明确字段;无法确定则 PendingBriefDiagnosis>
|
|
441
|
+
FixOwnerSkill: reddit-phase-brief
|
|
442
|
+
ReadyForUse: No
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
此时 `HubStructureConflictStatus` 仍可为 `None`(Hub 未必擅自改结构,只是指出当前
|
|
446
|
+
结构过不了;只有 `optimized` 实际触及受保护字段才是 `Escalated`)。证据字段:
|
|
447
|
+
`TextualRepairRounds` / `TextualRepairsApplied` / `RemainingBlockingIssues` /
|
|
448
|
+
`SameIssuePersistedAcrossAttempts` / `RequiredStructuralSurface` /
|
|
449
|
+
`StructuralRootCauseEvidence`。
|
|
450
|
+
|
|
408
451
|
**Step 4** 仅在 Hub 返回 `completed/pass` 后按内容类型选择交付格式。不要把内部提示词模板、完整检查清单或评分维度原样展示给用户;默认只交付已审核的最终稿。若本次是 ContentOnly,交付物必须标为“内容审核通过草稿”,同时保留 `AccountBindingStatus: Pending`、`ReadyForDelivery: No`;只有 AccountBound 才能称为可发布终稿。若 Hub 不可用,交付状态必须明确为未通过/不可用,而不是输出“可发布”内容。
|
|
409
452
|
|
|
410
453
|
| 内容类型 | 默认交付格式 | 何时附加说明 |
|
|
@@ -433,7 +476,7 @@ ExplicitStructureSpec:
|
|
|
433
476
|
- 不编造作者身份、国籍、语言背景
|
|
434
477
|
- **不主动制造 typo、拼写失误、错误冠词、介词误用、缺主语、"移民语法"**——
|
|
435
478
|
这些不只是同质化,是伪造
|
|
436
|
-
-
|
|
479
|
+
- 所有进入可发布文本(标题 / 正文 / 评论 / 回复)的实质性 claim 必须是 `ClaimEvidenceStatus: Cited`(可映射到已批准证据 `KnownProductFacts` / `SourceEvidence`)或 `ExternallyVerified`(非产品事实类、有外部权威来源 `ExternalSourceRef`);`Inferred`(无来源的模型推断)禁入可发布文本——删除或退回补证据,无法删且必需则 BlockingGap。三态权威定义见 `../reddit-strategy-shared/references/evidence-policy.md`
|
|
437
480
|
|
|
438
481
|
### 绝对禁用营销词
|
|
439
482
|
|
|
@@ -613,7 +656,7 @@ A / B 层每帖必查;C 层在其作用域内每帖必查(见下)。
|
|
|
613
656
|
- [ ] 未编造缺点(不得为显得真实而插入安全 caveat)
|
|
614
657
|
- [ ] 未主动制造 typo、错误冠词、介词误用、"移民语法"等伪真人信号
|
|
615
658
|
- [ ] 未编造作者身份、国籍、语言背景
|
|
616
|
-
- [ ]
|
|
659
|
+
- [ ] 所有进入可发布文本(标题 / 正文 / 评论 / 回复)的实质性 claim 为 `Cited` 或 `ExternallyVerified`(`ClaimEvidenceStatus` 三态,定义见 `../reddit-strategy-shared/references/evidence-policy.md`);`Inferred`(模型推断、无来源)**禁入可发布文本**,只能留在 Brief 内部推理或删除,无法删且为必需则 `BlockingGap`。产品性能 / 亲身体验 / 使用时长不因搜到第三方页面就可声称,仍须 `Cited` 到已批准证据
|
|
617
660
|
- [ ] 无禁用营销词
|
|
618
661
|
- [ ] 披露、品牌风险、subreddit 合规规则已满足;已有披露未被删除或移到失效位置
|
|
619
662
|
- [ ] 未写成伪求助(标题问句但正文全是推荐,或为后续品牌评论制造入口)
|
|
@@ -642,6 +685,7 @@ A / B 层每帖必查;C 层在其作用域内每帖必查(见下)。
|
|
|
642
685
|
- [ ] `LengthBand` 未变;仅当明确允许长度变化时,才检查变更后的档位是否与 `SampleSetID` 兼容;无 baseline 时保持原文
|
|
643
686
|
- [ ] `AnchorSlot` 合法且未被移动
|
|
644
687
|
- [ ] `SecondaryAnchorSlot`(仅 >350 词且两个 ABU 时;否则为 `—`)合法且未被移动
|
|
688
|
+
- [ ](仅 `ArtifactType=Post`)`PostingTrigger` 保持不变:改后正文反推的 trigger 仍等于传入值,且不违反 `PostingTrigger × BrandEntryMode` 交叉约束(`UnsolicitedTestimony` ⇒ `BrandEntryMode: 不出现`)。它是 `PrewritingControlField`、**不是** `LockedFingerprintField`,因此漂移记 `PostingTriggerStatus: Drift`(不并入 `StructuralChangeStatus`);按 handoff 规则**标记而非应用**该变化,退回 owner,不由 rewrite 自行接受
|
|
645
689
|
- [ ] 未被改写成"先痛点后产品"的推荐弧光(除非本篇 family 本就是 `推荐转化叙事`)
|
|
646
690
|
- [ ] 未被强行添加问题结尾
|
|
647
691
|
- [ ] 未被强行添加限制说明
|
|
@@ -737,6 +781,10 @@ subreddit 规则、属于 `SampleSetID` 支持的异常值,否则保持原文
|
|
|
737
781
|
# spec 不能顶替(ManagedContentRequiresBriefStructureFamily)
|
|
738
782
|
# ZeroDraftGeneration ad-hoc (Post) → StructureFamily 或 ExplicitStructureSpec 任一
|
|
739
783
|
# StandaloneSourceRepair → 均可 NotProvided,靠 ObservedSource
|
|
784
|
+
- AssignedFlair: # PrewritingControlField;Post 传入并保持;Comment/Reply/Title 填 NotApplicable
|
|
785
|
+
- FlairCoverageStatus: # Exact | ApprovedFallback | NotApplicable;Post 透传,不在 rewrite 丢失
|
|
786
|
+
- PostingTrigger: # PrewritingControlField 受控五值;Post 保持并做 Planned-vs-final;不进碰撞三元组;Comment/Reply/Title 填 NotApplicable
|
|
787
|
+
- PostingTriggerStatus: Preserved | Drift | NotApplicable # 反推 trigger 与传入值是否一致 + 交叉约束
|
|
740
788
|
- OpeningMove:
|
|
741
789
|
- EvidenceShape:
|
|
742
790
|
- BrandEntryMode:
|
|
@@ -754,6 +802,13 @@ subreddit 规则、属于 `SampleSetID` 支持的异常值,否则保持原文
|
|
|
754
802
|
- ForbiddenStructuralChanges:
|
|
755
803
|
- StructuralChangeStatus: Unchanged | ChangedWithinAllowance | BlockingDrift
|
|
756
804
|
- ChangedFingerprintFields: None | <field list>
|
|
805
|
+
- ClaimEvidenceAllCitedOrExternallyVerified: Yes | No | NotApplicable # no Inferred claim in any publishable text (title/body/comment/reply)
|
|
806
|
+
- TextualRepairRounds: <n>
|
|
807
|
+
- SameIssuePersistedAcrossAttempts: Yes | No | NotApplicable
|
|
808
|
+
- StructuralRootCause: Yes | No # Yes 须满足全部六条判据
|
|
809
|
+
- StructureChangeRequired: Yes | No # 需改动受保护结构面(锁字段 / outline premise / paragraph order);StructuralRootCause=Yes 时随之为 Yes
|
|
810
|
+
- AffectedLockedFields: # StructuralRootCause=Yes 时填;无法确定 PendingBriefDiagnosis
|
|
811
|
+
- StructuralRootCauseEvidence: # 两轮 TextualRepairsApplied + RemainingBlockingIssues + RequiredStructuralSurface
|
|
757
812
|
|
|
758
813
|
- DiversityStatus: Pass | SoftWarning | BlockingCollision | NotApplicable
|
|
759
814
|
- DiversityClaimed: Yes | No
|
|
@@ -47,6 +47,8 @@ Additionally, stop before writing a single word of body copy if any of these hol
|
|
|
47
47
|
|
|
48
48
|
- an execution-table row carries a `客户内容原型` code that is not mapped in `memory/phase0-客户内容原型映射.md` → `RoutingStatus: BlockingGap`, `AllowedToFallbackToGenericRecommendation: No`, `RequiredAction: Strategy mapping approval`
|
|
49
49
|
- a main-post row has no `StructureFamily` assigned by the Brief
|
|
50
|
+
- a main-post row has no `AssignedFlair`, or the baseline card's `FlairCoverageStatus` is `Insufficient` → `BlockingGap`, return to `reddit-phase-brief`
|
|
51
|
+
- a main-post row has no `PostingTrigger` assigned by the Brief, or its `Planned` `PostingTrigger` already violates the `PostingTrigger × BrandEntryMode` cross-constraint → `BlockingGap` (the post-draft re-derive of `PostingTrigger` vs `Planned` is checked after drafting, in the Writing Rules, not here)
|
|
50
52
|
- a target subreddit has no baseline card, or it is `Expired` / `Incomplete` → `BlockingGap: BaselineMissingOrStale`
|
|
51
53
|
- `memory/phase4-叙事指纹索引.md` has not been read, or the rolling-window collision check has not been run
|
|
52
54
|
- the collision check fails and no sample-based exception is on record → `BlockingGap: StructureCollision`, return to `reddit-phase-brief`
|
|
@@ -116,9 +118,22 @@ currently allows two attempts; if the second result is not `pass`, stop with
|
|
|
116
118
|
|
|
117
119
|
## Writing Rules
|
|
118
120
|
|
|
121
|
+
**W0 flow (fixed order — 先取样 → 再写 → 再审 → 再改):** the whole batch runs
|
|
122
|
+
`AssignedFlair → flair-level baseline → structure pre-assign (Brief) → draft →
|
|
123
|
+
local A/B/C self-check → Hub review → allowed textual repair → Hub re-review →
|
|
124
|
+
pass then hash`. Writing never re-samples to change structure and never treats a
|
|
125
|
+
Hub `pass` as re-openable — any later body change voids the Hub pass and the
|
|
126
|
+
hash (see `content-diversity-contract.md`). Do **not** describe this as "Hub pass,
|
|
127
|
+
then hand to rewrite to keep editing".
|
|
128
|
+
|
|
119
129
|
**Structure and anti-homogenisation (v2.12.25, checked before any other rule):**
|
|
120
130
|
|
|
121
|
-
- **Verify
|
|
131
|
+
- **Verify `AssignedFlair` and flair coverage first.** Every main-post Key must
|
|
132
|
+
carry a non-empty `AssignedFlair` matching the baseline card's `BaselineFlair`
|
|
133
|
+
(or an approved fallback), and the card's `FlairCoverageStatus` must be `Exact`
|
|
134
|
+
or `ApprovedFallback`. Missing flair or `Insufficient` coverage → `BlockingGap`,
|
|
135
|
+
return to `reddit-phase-brief`. Writing never invents or reassigns the flair.
|
|
136
|
+
- **Verify the subreddit baseline card next.** It must exist, be within its freshness window, and cover all 10 dimensions (word-count median + IQR, paragraph-count median, title-form distribution, list/subheading usage rate, first-brand-position distribution, question-ending rate, TL;DR prevalence, first-person rate, review-vs-question length split, dash/parenthesis usage). Missing or stale → `BlockingGap: BaselineMissingOrStale`, return to `reddit-phase-brief`. **Do not rebuild the baseline here.**
|
|
122
137
|
- **Read `memory/phase4-叙事指纹索引.md` and run the rolling-window collision check before writing.** The window is defined by `content-diversity-contract.md` and locked at project start: same subreddit, `WindowCount` (8–12) **and** `WindowDays` (30–60) **both in force** — not either/or. Rows count only when `RecordStatus` is `Final`/`Reviewed`/`Planned`; `Superseded`/`Abandoned` are excluded, and the current Key's own row is excluded from comparison.
|
|
123
138
|
- **Hard prohibition:** the same `StructureFamily + OpeningMove + EndingMode` triple as **any other Key's row anywhere in the window** — not merely the immediately preceding post. "Adjacent posts must not match" is a strict subset of this rule and is not sufficient: if only neighbours were compared, one intervening post would license repeating the same structure forever.
|
|
124
139
|
- **Collision repair order is fixed** (see below); the writer never resolves a collision by silently choosing a different family.
|
|
@@ -128,6 +143,15 @@ currently allows two attempts; if the second result is not `pass`, stop with
|
|
|
128
143
|
- **Real limitations:** state genuine, decision-relevant limitations when they exist; never invent a safe flaw to look authentic; position and form follow the content, not a fixed paragraph.
|
|
129
144
|
- **Punctuation and format values follow the subreddit baseline** — no cross-subreddit em-dash ban, no parenthesis quota, no fixed word count.
|
|
130
145
|
- **ABU (Answer-Bearing Unit, B-group):** 1–2 per post, all 8 hard requirements met, `AnchorSlot` from the 7-value enum, visibility gate satisfied per length band. The old "must sit in paragraph 2 or 3" rule is removed.
|
|
146
|
+
- **`PostingTrigger` is Brief-pre-assigned, not writer-chosen.** After drafting,
|
|
147
|
+
re-derive the actual `PostingTrigger` from the finished body and confirm it
|
|
148
|
+
matches the `Planned` value; a mismatch is a `BlockingGap` (return to Brief),
|
|
149
|
+
handled exactly like a locked-field drift. Enforce the cross-constraint both
|
|
150
|
+
ways: `BrandEntryMode ≠ 不出现` forbids `UnsolicitedTestimony`, and
|
|
151
|
+
`PostingTrigger = UnsolicitedTestimony` requires `BrandEntryMode: 不出现` plus a
|
|
152
|
+
real, non-solicited, non-brand-controlled testimony in `SourceEvidence` (never
|
|
153
|
+
impersonate its original author). `PostingTrigger` is recorded but is **not**
|
|
154
|
+
part of the hard collision triple.
|
|
131
155
|
|
|
132
156
|
**Handoff to rewrite (structure-preserving):**
|
|
133
157
|
|
|
@@ -143,11 +167,20 @@ currently allows two attempts; if the second result is not `pass`, stop with
|
|
|
143
167
|
- Preserve required edits from `reddit-brand-risk-response`, especially delayed brand placement, removal of CTA/link-first phrasing, balanced limitations, substantiated claims, and less generic bot-like cadence.
|
|
144
168
|
- Keep a post and all paired comments together.
|
|
145
169
|
- Enforce P-B/P-NB and C-B/C-NB complement rules.
|
|
146
|
-
- Do not invent product facts or claims.
|
|
170
|
+
- Do not invent product facts or claims. **Every substantive claim in any
|
|
171
|
+
publishable text (title / body / comment / reply) must be `Cited` or
|
|
172
|
+
`ExternallyVerified` per `ClaimEvidenceStatus`** (three-state, defined
|
|
173
|
+
in `../reddit-strategy-shared/references/evidence-policy.md`). `Inferred` claims
|
|
174
|
+
(model synthesis/inference with no source) are **forbidden from all publishable
|
|
175
|
+
text** — keep them in
|
|
176
|
+
the Brief's internal reasoning or drop them; if one cannot be removed and is
|
|
177
|
+
required to complete the piece → `BlockingGap`. Product performance / lived
|
|
178
|
+
experience / usage duration is not made claimable just because a third-party
|
|
179
|
+
page exists — it still needs `Cited` to approved evidence.
|
|
147
180
|
- Do not write for subreddits that are only in `NeedsVerificationCandidates`.
|
|
148
181
|
- Ask for the Feishu draft document/folder link before creating or writing documents.
|
|
149
182
|
- Update `memory/phase4-撰写进度.md` after each completed batch.
|
|
150
|
-
- Record every main post in `memory/phase4-叙事指纹索引.md` (fixed table: Key / Subreddit / ContentFunction / StructureFamily / OpeningMove / EvidenceShape / BrandEntryMode / CaveatMode / EndingMode / LengthBand / AnchorSlot / SampleSetID / DraftHash)
|
|
183
|
+
- Record every main post in `memory/phase4-叙事指纹索引.md` (fixed table: Key / Subreddit / ContentFunction / StructureFamily / OpeningMove / EvidenceShape / BrandEntryMode / CaveatMode / EndingMode / LengthBand / AnchorSlot / SampleSetID / DraftHash), plus the required extension columns including the two `PrewritingControlFields` `AssignedFlair` and `PostingTrigger`.
|
|
151
184
|
|
|
152
185
|
## Outputs
|
|
153
186
|
|
|
@@ -168,13 +201,18 @@ currently allows two attempts; if the second result is not `pass`, stop with
|
|
|
168
201
|
- DraftKeys:
|
|
169
202
|
- PrototypeRoutingStatus: Mapped / BlockingGap
|
|
170
203
|
- BaselineStatus: Fresh / Expired / Missing / Incomplete
|
|
204
|
+
- FlairCoverageStatus: Exact / ApprovedFallback / Insufficient # batch-level = worst status across per-Key cards (Insufficient > ApprovedFallback > Exact); per-Key values live in PerKeyStructureContract
|
|
205
|
+
- AssignedFlairVerified: Yes / No
|
|
206
|
+
- PostingTriggerPlannedVsFinal: Match / Drift / NotAssigned
|
|
207
|
+
- PostingTriggerCrossConstraintOK: Yes / No
|
|
208
|
+
- ClaimEvidenceAllCitedOrExternallyVerified: Yes / No # no Inferred claim reached any publishable text (title/body/comment/reply)
|
|
171
209
|
- FingerprintIndexUpdated: Yes / No
|
|
172
210
|
- CollisionCheckPassed: Yes / No / ExceptionRecorded
|
|
173
211
|
- PerKeyStructureContract: |
|
|
174
212
|
<one row per DraftKey — batch-level single values are not valid, a batch normally
|
|
175
213
|
spans several families, anchor slots and hashes>
|
|
176
|
-
| Key | ClientContentPrototype | ContentFunction | PrimaryPostType | StructureFamily | SampleSetID | AnchorSlot | SecondaryAnchorSlot | AllowedStructuralChanges | ForbiddenStructuralChanges | DraftHash |
|
|
177
|
-
|
|
214
|
+
| Key | ClientContentPrototype | ContentFunction | PrimaryPostType | StructureFamily | AssignedFlair | FlairCoverageStatus | PostingTrigger | SampleSetID | AnchorSlot | SecondaryAnchorSlot | AllowedStructuralChanges | ForbiddenStructuralChanges | DraftHash |
|
|
215
|
+
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
178
216
|
- SKUBindingsPreserved: Yes / No
|
|
179
217
|
- BrandWordStatusPreserved: Yes / No
|
|
180
218
|
- ComplementRulesPassed: Yes / No
|
|
@@ -25,13 +25,15 @@
|
|
|
25
25
|
[ ] 本批每个目标 subreddit 均有 baseline card(Brief 阶段产出)
|
|
26
26
|
[ ] baseline 状态为 `Fresh`(受控值:`Fresh` / `Expired` / `Missing` / `Incomplete`;默认新鲜期 60 天,项目可在 shared 契约中覆盖)
|
|
27
27
|
[ ] baseline card 覆盖下表全部 10 个维度
|
|
28
|
+
[ ] 每个主帖 Key 的 `AssignedFlair` 非空,且与 baseline 卡的 `BaselineFlair` / 覆盖口径一致
|
|
29
|
+
[ ] baseline 卡 `FlairCoverageStatus` 为 `Exact` 或 `ApprovedFallback`(`Insufficient` → BlockingGap,退回 Brief)
|
|
28
30
|
```
|
|
29
31
|
|
|
30
32
|
任一项不满足 → 标 `BlockingGap: BaselineMissingOrStale`,**退回 `reddit-phase-brief` 重建 baseline,不得在 writing 阶段自行补齐后继续开写**。
|
|
31
33
|
|
|
32
34
|
**W-1.b baseline card 必备维度(v2.12.25 从「2–3 条 excerpt + 词数范围」升级):**
|
|
33
35
|
|
|
34
|
-
样本要求:**同 subreddit、同
|
|
36
|
+
样本要求:**同 subreddit、同 `AssignedFlair`(退而求其次同内容功能)的 5–10 条近期真实帖**(精确 flair 少于 5 条时按 shared 契约的 flair 覆盖门禁二分:flair 决定资格/披露/帖型/上下文 → `BlockingGap`;仅缺风格分布 → 批准后 `ApprovedFallback`。标注 `SampleSetID`、`BaselineFlair`、`FlairCoverageStatus` 与实际条数)。
|
|
35
37
|
|
|
36
38
|
| 维度 | 记录形式 | 用途 |
|
|
37
39
|
|------|---------|------|
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"contentSha256": "dfaf4bafae4118deb37b3857fea660e025a64203a9dcaf222fd0d12d4b4e9627"
|
|
8
8
|
},
|
|
9
9
|
"reddit-strategy-shared": {
|
|
10
|
-
"contentSha256": "
|
|
10
|
+
"contentSha256": "5774f1d9d6bc93f04549dfdb606ff24c258eb900a43baf880e11bd13c7a27fd4"
|
|
11
11
|
},
|
|
12
12
|
"reddit-phase-research": {
|
|
13
13
|
"contentSha256": "f1c2260587b5d6a82272efd6da1289a8bf667a05eb65fa8a774059348d2afca9"
|
|
@@ -16,13 +16,13 @@
|
|
|
16
16
|
"contentSha256": "04cbfddebd8cb6d22de6eb9711d9fd0580680190ca8465ca7a888f44338db4c4"
|
|
17
17
|
},
|
|
18
18
|
"reddit-phase-brief": {
|
|
19
|
-
"contentSha256": "
|
|
19
|
+
"contentSha256": "a56b9648acb48260ec06d0304d5bcc04b13e971471ba1c3a910147c472125882"
|
|
20
20
|
},
|
|
21
21
|
"reddit-content-writing": {
|
|
22
|
-
"contentSha256": "
|
|
22
|
+
"contentSha256": "c4aeb42db6343475428215f90ee0ae01fe2f1837f17754025b733e55c90a98bb"
|
|
23
23
|
},
|
|
24
24
|
"reddit-content-rewrite": {
|
|
25
|
-
"contentSha256": "
|
|
25
|
+
"contentSha256": "9a2a64e08727dfaf34550f75cfa568b81ea285a030e770c54fea064e6fc4a13d"
|
|
26
26
|
},
|
|
27
27
|
"reddit-delivery-check": {
|
|
28
28
|
"contentSha256": "e619faf2e9a54770b4ee52889bd1da045c21c5226ea8e58b6fd02b2ee87ca77b"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: reddit-phase-brief
|
|
3
3
|
description: |
|
|
4
|
-
Reddit Phase 4 Brief skill for the matrix SOP. Use after reddit-phase-planning completes Phase 4.0.6 and before reddit-content-writing starts. It establishes the subreddit baseline
|
|
4
|
+
Reddit Phase 4 Brief skill for the matrix SOP. Use after reddit-phase-planning completes Phase 4.0.6 and before reddit-content-writing starts. It assigns the target flair first, then establishes the flair-level subreddit baseline, then locks ContentFunction and StructureFamily, then the outline; it also creates board rationale, content schedule, per-Key title/direction/outlines, brand/SKU placement strategy, prewriting control fields (AssignedFlair / PostingTrigger), structure pre-assignment (OpeningMove / EvidenceShape / BrandEntryMode / EndingMode / LengthBand / SampleSetID / RecentCollisionCheck), and the approval gate. Trigger when the user says "确认进入 Phase 4 Brief", "开始 Brief", "产出 Brief 汇报稿", or when planning is complete but drafting has not started.
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Reddit Phase Brief
|
|
@@ -63,21 +63,33 @@ Read these local references before producing the brief:
|
|
|
63
63
|
|
|
64
64
|
## Workflow
|
|
65
65
|
|
|
66
|
-
The v2.12.25 order is **baseline → ContentFunction → StructureFamily →
|
|
67
|
-
|
|
66
|
+
The v2.12.25 order is **flair → baseline → ContentFunction → StructureFamily →
|
|
67
|
+
outline lock** (the W0「先取样→再写→再审→再改」重排:动笔前先确定 flair、产出 flair
|
|
68
|
+
级风格卡/baseline,再决定结构、写 outline;不在写作阶段临场补采)。Do not write an
|
|
69
|
+
outline before the structure is decided from evidence.
|
|
68
70
|
|
|
69
71
|
1. Confirm `brief_approval_mode`: `甲方审核` or `内部确认`. If absent from `memory/hot-cache.md`, ask the user before generating the brief.
|
|
70
72
|
2. Confirm the number of Brief items in this batch.
|
|
71
73
|
3. Load or initialize `memory/phase4-内容排期表.md`.
|
|
72
74
|
4. Check historical `memory/phase4-撰写brief.md` for overlap before creating a new batch.
|
|
73
|
-
5. **
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
75
|
+
5. **Assign `AssignedFlair` (required, per main-post Key) before sampling.** flair 同时
|
|
76
|
+
决定合规资格、披露要求与触达,且决定 baseline 的采样口径。flair 必须取自该 subreddit
|
|
77
|
+
的现行 flair 列表(不得自造);板块无 flair 或允许不选时用哨兵值 `NoFlairAvailable` /
|
|
78
|
+
`NoFlairRequired`(不得留空、不得用评论的 `N/A`);缺失 → `BlockingGap`。评论 / 回复填 `N/A`。
|
|
79
|
+
6. **Establish or refresh the flair-level subreddit baseline** for every target subreddit
|
|
80
|
+
and assign a `SampleSetID` (see `references/phase4-brief-workflow.md` step B-1.0).
|
|
81
|
+
优先按 `AssignedFlair` 细分取 exact-flair 样本;记录 `BaselineScope` /
|
|
82
|
+
`FlairCoverageStatus` / `FallbackApprovalRef`。只有 flair 仅决定风格分布、且拿到批准
|
|
83
|
+
时才可 `FlairCluster` / `SubredditFallback`;flair 决定资格 / 披露 / 帖型 / 上下文
|
|
84
|
+
却无合格样本则 `FlairCoverageStatus: Insufficient` → `BlockingGap`,不得 fallback。
|
|
85
|
+
Reuse a valid, unexpired baseline of the same flair coverage; only re-acquire when it is missing or stale.
|
|
86
|
+
7. **Lock the project diversity window** (`WindowCount` 8–12, `WindowDays` 30–60) if not already locked, and read the rolling window from `memory/phase4-叙事指纹索引.md`.
|
|
87
|
+
8. Produce board-selection rationale with evidence URLs, then the board overview table.
|
|
88
|
+
9. For every post Key: resolve `客户内容原型` → `MappingRuleID`, lock `ContentFunction`, confirm the `EvidenceShape` actually in hand, narrow `StructureFamily` candidates with the ordered filter in `content-type-routing-contract.md`, pre-assign `OpeningMove` / `BrandEntryMode` / `CaveatMode` / `EndingMode` / `LengthBand` / `AnchorSlot`, and the `PostingTrigger`(受控值 `ConcreteFailure` / `PurchaseDecision` / `MeasurementResult` / `CompatibilityGap` / `UnsolicitedTestimony`;`UnsolicitedTestimony` 仅当 `BrandEntryMode: 不出现` 且有真实非征集非品牌控制的 testimony 证据),and **only then** run `RecentCollisionCheck` on the complete triple. On collision, first swap `OpeningMove` / `EndingMode` within the same family; reselect a family only if that fails. **Only then** write the outline.
|
|
89
|
+
10. Create one Brief block for every execution-table Key in the selected batch, including posts, self-comments, and external comments.
|
|
90
|
+
11. For all P-B/C-B/PGC rows, record brand/SKU placement rationale using `references/brand-SKU-PGC-rules.md`.
|
|
91
|
+
12. Write a `Planned` fingerprint row for every briefed post Key into `memory/phase4-叙事指纹索引.md` (`DraftHash: PENDING`), including the two `PrewritingControlFields` (`AssignedFlair`, `PostingTrigger`).
|
|
92
|
+
13. Write or update the memory files listed below, then show the Brief gate checklist.
|
|
81
93
|
|
|
82
94
|
## Outputs
|
|
83
95
|
|
|
@@ -97,9 +109,10 @@ Optional Feishu Brief documents require an explicit user-provided folder link.
|
|
|
97
109
|
|
|
98
110
|
Writing may start only after:
|
|
99
111
|
|
|
100
|
-
- Every target subreddit has a valid, unexpired baseline card with a `SampleSetID
|
|
112
|
+
- Every target subreddit has a valid, unexpired baseline card with a `SampleSetID`, with flair coverage recorded (`BaselineScope` / `FlairCoverageStatus`); `FlairCoverageStatus` is `Exact` or `ApprovedFallback` (never `Insufficient`).
|
|
113
|
+
- Every **main-post** Key carries a non-empty `AssignedFlair` — drawn from the subreddit's live flair list, or the sentinel `NoFlairAvailable` / `NoFlairRequired` for flairless boards — and its `AssignedFlair` matches the baseline card's covered flair (or an approved fallback).
|
|
101
114
|
- Every **main-post** Key's `客户内容原型` resolves to an `Approved` mapping row (`MappingRuleID` / `MappingVersion` recorded in the Routing Decision). Self-comments inherit the paired post's value; external comments use `—` and need no mapping of their own.
|
|
102
|
-
- Every post Brief row carries the nine `LockedFingerprintFields` (`ContentFunction`, `StructureFamily`, `OpeningMove`, `EvidenceShape`, `BrandEntryMode`, `CaveatMode`, `EndingMode`, `LengthBand`, `AnchorSlot`) and the four `TraceFields` (`SampleSetID`, `RecentCollisionCheck`, `MappingRuleID`, `MappingVersion`).
|
|
115
|
+
- Every post Brief row carries the nine `LockedFingerprintFields` (`ContentFunction`, `StructureFamily`, `OpeningMove`, `EvidenceShape`, `BrandEntryMode`, `CaveatMode`, `EndingMode`, `LengthBand`, `AnchorSlot`), the two `PrewritingControlFields` (`AssignedFlair`, `PostingTrigger` — the latter satisfying the `PostingTrigger × BrandEntryMode` cross-constraint), and the four `TraceFields` (`SampleSetID`, `RecentCollisionCheck`, `MappingRuleID`, `MappingVersion`).
|
|
103
116
|
- `RecentCollisionCheck` is `Pass` for every row, or `Exception` with an approved `ExceptionRef`.
|
|
104
117
|
- `memory/phase4-叙事指纹索引.md` has exactly one active `Planned` row for every briefed **post** Key (comments are out of scope while `WindowScope: PostOnly`).
|
|
105
118
|
- `memory/phase4-撰写brief.md` exists and covers every planned Key for the batch.
|
|
@@ -121,8 +134,12 @@ Writing may start only after:
|
|
|
121
134
|
- BrandSkuPlacementChecked: Yes / No
|
|
122
135
|
- BaselineSampleSetIDs:
|
|
123
136
|
- BaselineStatus: Fresh / Incomplete / Expired / Missing
|
|
137
|
+
- AssignedFlairCoverage: <n>/<N> # main-post Keys with a non-empty AssignedFlair
|
|
138
|
+
- FlairCoverageStatus: Exact / ApprovedFallback / Insufficient # batch-level = worst status across cards (Insufficient > ApprovedFallback > Exact)
|
|
124
139
|
- ClientPrototypeMappingStatus: AllApproved / BlockingGap
|
|
125
140
|
- StructureFieldsAssigned: Yes / No
|
|
141
|
+
- PrewritingControlFieldsAssigned: Yes / No # AssignedFlair + PostingTrigger per main-post Key
|
|
142
|
+
- PostingTriggerCrossConstraintOK: Yes / No # UnsolicitedTestimony ⇒ BrandEntryMode 不出现
|
|
126
143
|
- FingerprintPlannedRows: <n>/<N>
|
|
127
144
|
- DiversityWindow: WindowCount=<n>, WindowDays=<n>
|
|
128
145
|
- RecentCollisionCheck: Pass / BlockingCollision / Exception(<ExceptionRef>)
|
|
@@ -133,9 +133,13 @@ Brief 去重检查报告:
|
|
|
133
133
|
> 位置、结尾形态。放在写作阶段才采集,等于所有风格规则先用跨板块默认值填一遍,
|
|
134
134
|
> baseline 事后只能微调语气——这正是 v2.12.24 之前 baseline 形同虚设的根因。
|
|
135
135
|
|
|
136
|
-
|
|
136
|
+
**W0 前置(先于取样):** 为本批每个主帖 Key 确定 `AssignedFlair`(取自该 subreddit
|
|
137
|
+
现行 flair 列表,不得自造;缺失 → `BlockingGap`)。baseline 采样口径**优先按
|
|
138
|
+
`AssignedFlair` 细分**,因为 flair 往往同时决定发帖资格、披露与帖型,不是纯风格标签。
|
|
137
139
|
|
|
138
|
-
|
|
140
|
+
**对本批每一个目标 subreddit(并优先按 `AssignedFlair` 细分)** 建立或复用一张 baseline 卡:
|
|
141
|
+
|
|
142
|
+
- 同 subreddit、**同 `AssignedFlair`**(退而求其次同内容功能)的 **5–10 条**近期真实帖(附 URL)
|
|
139
143
|
- word count **中位数 + IQR**(不是单一范围)
|
|
140
144
|
- 段落数中位数
|
|
141
145
|
- 标题长度与标题句式分布
|
|
@@ -152,8 +156,23 @@ Brief 去重检查报告:
|
|
|
152
156
|
- `BaselineMaxAgeDays:`(默认 60,取自指纹索引文件头)
|
|
153
157
|
- `ValidUntil:` = `AcquiredAt + BaselineMaxAgeDays`
|
|
154
158
|
- `BaselineStatus:` `Fresh` / `Incomplete`(样本够但维度不全)/ `Expired` / `Missing`
|
|
155
|
-
|
|
156
|
-
|
|
159
|
+
—— 与 shared 契约同为四值闭集;只有 `Fresh` 允许进入写作;`Incomplete` 必须补维度,
|
|
160
|
+
**不得用默认值顶替**。样本正文被截断(长度类维度不可信)按 `Incomplete` 处理并注明
|
|
161
|
+
`IncompleteReason: TruncatedSample`,**不新设第五个 `BaselineStatus` 值**
|
|
162
|
+
|
|
163
|
+
flair 覆盖字段(与 `BaselineStatus` 正交,权威定义见
|
|
164
|
+
`../reddit-strategy-shared/references/content-diversity-contract.md`):
|
|
165
|
+
|
|
166
|
+
- `BaselineScope:` `ExactFlair` / `FlairCluster` / `SubredditFallback`
|
|
167
|
+
- `BaselineFlair:` 该卡实际覆盖的 flair(`ExactFlair` 时等于 `AssignedFlair`)
|
|
168
|
+
- `FlairSampleCount:` 精确 `AssignedFlair` 的合格样本数
|
|
169
|
+
- `FlairCoverageStatus:` `Exact` / `ApprovedFallback` / `Insufficient`
|
|
170
|
+
- `FallbackApprovalRef:` 用 cluster / subreddit fallback 时的批准署名
|
|
171
|
+
|
|
172
|
+
优先取 exact-flair 5–10 条;不足时先合理扩大时间窗重采(不得混入其他 flair 仍称
|
|
173
|
+
exact)。仍不足时二分:flair 决定资格 / 披露 / 帖型 / 上下文 → `Insufficient` +
|
|
174
|
+
`BlockingGap`,不得 fallback,回流 `reddit-subreddit-compliance`;仅缺风格分布且有
|
|
175
|
+
相邻 flair / 板块主样本 → 显式 `ApprovedFallback` 并记 `FallbackApprovalRef`。
|
|
157
176
|
|
|
158
177
|
**样本资格门禁(v2.12.30 新增,硬规则):** baseline 卡的 5–10 条样本必须是
|
|
159
178
|
**真实用户帖**。`reddit-voc-volume` 逐条输出 `sample_role` 与 `body_status`,
|
|
@@ -380,6 +399,16 @@ ASK / GUIDE / ROUNDUP / OWNER / OPINION / RANT / FOLLOWUP / LIST / REPUTATION
|
|
|
380
399
|
`EndingMode` / `LengthBand`(由该 subreddit baseline 的中位数 + IQR 派生)/
|
|
381
400
|
`AnchorSlot`(`ABURequired=Yes` 时须在该 family 的 `AllowedAnchorSlots` 内;
|
|
382
401
|
否则填 `N/A`)。
|
|
402
|
+
**并预分配两个前置控制字段**(`PrewritingControlFields`,权威定义见
|
|
403
|
+
`../reddit-strategy-shared/references/content-diversity-contract.md`):
|
|
404
|
+
- `AssignedFlair`:已在 B-1.0/W0 确定(取自该 subreddit 现行 flair 列表;板块无
|
|
405
|
+
flair 或允许不选时填哨兵值 `NoFlairAvailable` / `NoFlairRequired`,不得留空、
|
|
406
|
+
不得用评论的 `N/A`),此处只核对与 baseline 覆盖一致。
|
|
407
|
+
- `PostingTrigger`:受控值 `ConcreteFailure` / `PurchaseDecision` /
|
|
408
|
+
`MeasurementResult` / `CompatibilityGap` / `UnsolicitedTestimony`。满足
|
|
409
|
+
`PostingTrigger × BrandEntryMode` 交叉约束:`BrandEntryMode ≠ 不出现` 禁取
|
|
410
|
+
`UnsolicitedTestimony`;取 `UnsolicitedTestimony` 时 `BrandEntryMode` 必须
|
|
411
|
+
`不出现` 且有真实非征集非品牌控制的 testimony 证据。
|
|
383
412
|
6. **`RecentCollisionCheck`**(必须在第 5 步之后,因为需要完整三元组):读取该
|
|
384
413
|
subreddit 的有效窗口(`WindowCount` 且 `WindowDays` 同时满足,按 `WindowSort`
|
|
385
414
|
排序,**排除当前 Key 自己那一行**),检查本篇
|
|
@@ -413,6 +442,10 @@ ASK / GUIDE / ROUNDUP / OWNER / OPINION / RANT / FOLLOWUP / LIST / REPUTATION
|
|
|
413
442
|
```markdown
|
|
414
443
|
### [Key] · [主帖型代码] · [P-B✅ / P-NB❌] · 绑定 SKU:[SKU]
|
|
415
444
|
|
|
445
|
+
**PrewritingControlFields(前置控制字段,主帖必填,先于 baseline 与结构):**
|
|
446
|
+
- AssignedFlair: (现行 flair 之一;无 flair 板块填 NoFlairAvailable / NoFlairRequired,不留空)
|
|
447
|
+
- PostingTrigger: (ConcreteFailure / PurchaseDecision / MeasurementResult / CompatibilityGap / UnsolicitedTestimony;须满足 × BrandEntryMode 交叉约束)
|
|
448
|
+
|
|
416
449
|
**LockedFingerprintFields(v2.12.26 必填 9 项锁字段,写大纲之前先填满):**
|
|
417
450
|
- ContentFunction:
|
|
418
451
|
- StructureFamily:
|
|
@@ -544,6 +577,8 @@ ASK / GUIDE / ROUNDUP / OWNER / OPINION / RANT / FOLLOWUP / LIST / REPUTATION
|
|
|
544
577
|
[ ] 【v2.12.26】项目差异化窗口已锁定(WindowCount 8–12 且 WindowDays 30–60 同时生效 / WindowScope: PostOnly / WindowSort / BaselineMaxAgeDays / IndexRevision),写入指纹索引文件头
|
|
545
578
|
[ ] 【v2.12.26】每个**主帖** Key 的「客户内容原型」均命中 memory/phase0-客户内容原型映射.md 的 Approved 行,MappingRuleID 与 MappingVersion 已记入 Routing Decision;无未映射代号(自评继承配对主帖的原型值,外部评论填「—」,不单独要求映射)
|
|
546
579
|
[ ] 【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)+ PostingTrigger(受控五值,满足 × BrandEntryMode 交叉约束)
|
|
581
|
+
[ ] 【P0-C】每张 baseline 卡记录 flair 覆盖:BaselineScope / BaselineFlair / FlairSampleCount / FlairCoverageStatus(Exact 或 ApprovedFallback;Insufficient → BlockingGap)/ FallbackApprovalRef(fallback 时须署名)
|
|
547
582
|
[ ] 【v2.12.26】每条主帖 Brief 均含 4 项 TraceFields:SampleSetID / RecentCollisionCheck / MappingRuleID / MappingVersion
|
|
548
583
|
[ ] 【v2.12.26】每条主帖 Brief 均含 Routing Decision 块,五层候选收敛轨迹齐全(Baseline / Function / Evidence / PrimaryAndCompliance / MappingPredicates + MatchedPredicate),SelectedCandidateRank 与 SkippedCandidates(CandidateRank + RejectionReason)已记录;跳过更靠前候选的理由均为 1–5 层硬失败,差异化仅作 tie-breaker,CollisionRepairPath 已记录
|
|
549
584
|
[ ] 【v2.12.26】RecentCollisionCheck 全部为 Pass,或为 Exception 且有已批准的 ExceptionRef(例外须引用 SampleSetID + 样本占比 + 批准人)
|
|
@@ -53,6 +53,8 @@ LastUpdatedAt: <ISO timestamp>
|
|
|
53
53
|
| `DraftRef` | 指向终稿位置(如 `memory/phase4-writing-batch-2.md#PLAUD-P007`) |
|
|
54
54
|
| `ExceptionRef` | 有例外时指向例外记录;不得在单元格里写一句理由了事 |
|
|
55
55
|
| `HashInput` | 本索引 `WindowScope: PostOnly`,因此这里恒为 `CanonicalPostPayload`。`CanonicalCommentPayload` 只出现在 `memory/content-review-log.md`,不出现在本索引 |
|
|
56
|
+
| `AssignedFlair` | 该主帖 Key 的目标发布 flair(`PrewritingControlField`)。Brief 预分配、writing 前校验、delivery 反查其与 baseline 覆盖关系。为空即 `BlockingGap`(评论 / 回复不适用) |
|
|
57
|
+
| `PostingTrigger` | 「这篇帖为什么现在值得发」的现实触发(`PrewritingControlField`,受控值见下)。Brief 预分配、writing 从终稿反推并与 `Planned` 值核对;漂移即阻断。**不并入硬碰撞三元组** |
|
|
56
58
|
|
|
57
59
|
### 记录状态机
|
|
58
60
|
|
|
@@ -101,6 +103,14 @@ LastUpdatedAt: <ISO timestamp>
|
|
|
101
103
|
| `LengthBand` | 依据该 subreddit baseline 的中位数 + IQR 派生的档位,**不设跨板块固定词数** |
|
|
102
104
|
| `AnchorSlot` | 见 ABU 七种合法位置;无需 ABU 时填 `N/A` |
|
|
103
105
|
|
|
106
|
+
**两个前置控制字段(`PrewritingControlFields`,与 9 个 `LockedFingerprintField`
|
|
107
|
+
并列但不并入锁字段集,也不进硬碰撞三元组):**
|
|
108
|
+
|
|
109
|
+
| 字段 | 受控值 |
|
|
110
|
+
|---|---|
|
|
111
|
+
| `AssignedFlair` | 该主帖 Key 的目标发布 flair(**受控于该 subreddit 的现行 flair 列表**,不得自造)。主帖必填、不得留空;板块无 flair 或允许不选时用哨兵值 `NoFlairAvailable` / `NoFlairRequired`(不得与评论的 `N/A` 混用)。评论 / 回复填 `N/A` |
|
|
112
|
+
| `PostingTrigger` | `ConcreteFailure` / `PurchaseDecision` / `MeasurementResult` / `CompatibilityGap` / `UnsolicitedTestimony`(闭集)。回答「这篇帖为什么现在值得发」 |
|
|
113
|
+
|
|
104
114
|
字段语义补充:
|
|
105
115
|
|
|
106
116
|
- `EvidenceShape` 必须记录**终稿实际使用**的证据形态,不得记录「计划用但正文里没有」。
|
|
@@ -125,6 +135,24 @@ LastUpdatedAt: <ISO timestamp>
|
|
|
125
135
|
- `CaveatMode` 回答「限制**以什么形式**出现在正文里」——它是表达形态。
|
|
126
136
|
- `RealLimitationStatus: NoneKnown` 时 `CaveatMode` 必须是 `无真实限制则不写`;
|
|
127
137
|
`EvidenceRequired` / `BlockingUnknown` 时不得先写死 `CaveatMode` 再去补证据。
|
|
138
|
+
- `AssignedFlair` / `PostingTrigger` 是 **Brief 阶段预分配的前置控制字段**,不是
|
|
139
|
+
写手临场自选,也不是终稿事后补记:
|
|
140
|
+
- `AssignedFlair` 决定 baseline 采样口径、subreddit-fit 判定基准,往往同时决定
|
|
141
|
+
发帖资格与披露要求。改动 `AssignedFlair` 使原 flair baseline 失效,须退回
|
|
142
|
+
`reddit-phase-brief` 重新确认 baseline + 合规,再重跑结构适配。它**不是**第 10 个
|
|
143
|
+
`LockedFingerprintField`(不是正文结构指纹),但享有同级别的变更纪律。
|
|
144
|
+
- `PostingTrigger` 与 `ContentFunction`(帖子完成什么任务)、`EvidenceShape`
|
|
145
|
+
(正文用什么证据形态)互不等价:它描述**触发本次表达的现实事件或决策节点**。
|
|
146
|
+
Brief 预分配、writing 从终稿反推并与 `Planned` 值核对,`Planned` 与实际不符即
|
|
147
|
+
`BlockingGap`(等同锁字段漂移处理,`FixOwnerSkill: reddit-phase-brief`)。
|
|
148
|
+
- **`PostingTrigger` × `BrandEntryMode` 交叉硬约束(双向):**
|
|
149
|
+
- `BrandEntryMode ≠ 不出现` 时,`PostingTrigger` **禁取** `UnsolicitedTestimony`。
|
|
150
|
+
- 反之,`PostingTrigger = UnsolicitedTestimony` 时,`BrandEntryMode` **必须**是
|
|
151
|
+
`不出现`;且 `SourceEvidence` 必须存在真实、非征集、非品牌控制的 testimony,
|
|
152
|
+
正文不得冒充该 testimony 的原作者。两者任一不满足即 `BlockingGap`。
|
|
153
|
+
- 两个控制字段都**不参与**硬碰撞三元组(`StructureFamily + OpeningMove +
|
|
154
|
+
EndingMode`);把它们并进去会稀释碰撞门禁(换个 trigger 标签即可绕过结构重复)。
|
|
155
|
+
它们只做 Planned-vs-final 漂移校验与上面的交叉约束。
|
|
128
156
|
- 本索引与硬碰撞规则的作用域是 `PostOnly`:**只有主帖 Key 需要指纹行**。
|
|
129
157
|
评论 / 回复不进入本索引,也不需要 `Final` 行;它们仍然需要 Hub 审核与
|
|
130
158
|
`FinalDraftSha256`。评论若需防同质化,另行按
|
|
@@ -251,8 +279,31 @@ FixOwnerSkill: reddit-phase-brief
|
|
|
251
279
|
|
|
252
280
|
只有 `Fresh` 允许进入写作。
|
|
253
281
|
|
|
254
|
-
|
|
255
|
-
|
|
282
|
+
**flair 覆盖是与 `BaselineStatus` 正交的第二维(不要塞进上面的四值枚举)。**
|
|
283
|
+
baseline 采样口径优先按 `AssignedFlair` 细分:
|
|
284
|
+
|
|
285
|
+
| 字段 | 取值 / 含义 |
|
|
286
|
+
|---|---|
|
|
287
|
+
| `BaselineScope` | `ExactFlair`(精确 flair 5–10 条合格样本)/ `FlairCluster`(相邻 flair 合并,须批准)/ `SubredditFallback`(无 flair 细分,用板块主样本,须批准) |
|
|
288
|
+
| `BaselineFlair` | 该 baseline 实际覆盖的 flair;`ExactFlair` 时等于 `AssignedFlair` |
|
|
289
|
+
| `FlairSampleCount` | 精确 `AssignedFlair` 的合格样本数 |
|
|
290
|
+
| `FlairCoverageStatus` | `Exact` / `ApprovedFallback` / `Insufficient` |
|
|
291
|
+
| `FallbackApprovalRef` | 用 cluster / subreddit fallback 时的批准记录(策略师 / 用户署名) |
|
|
292
|
+
|
|
293
|
+
flair 覆盖门禁(不是「每个 flair 不足 5 条一律阻断」):
|
|
294
|
+
|
|
295
|
+
1. 先取 exact-flair 5–10 条 → `BaselineScope: ExactFlair` / `FlairCoverageStatus: Exact`。
|
|
296
|
+
2. 精确样本不足时先合理扩大时间窗口重采;**不得混入其他 flair 后仍声称 exact**。
|
|
297
|
+
3. 仍不足时按缺口性质二分:
|
|
298
|
+
- flair 决定**发帖资格 / 披露 / 帖型 / 必备上下文** → `FlairCoverageStatus: Insufficient`,
|
|
299
|
+
`BlockingGap`,**不得 fallback**,回流 `reddit-subreddit-compliance`。
|
|
300
|
+
- 只缺**风格分布**、且有相邻 flair 或板块主样本 → 允许显式 `FlairCluster` /
|
|
301
|
+
`SubredditFallback`,记 `FallbackApprovalRef` 与不确定性,`FlairCoverageStatus: ApprovedFallback`。
|
|
302
|
+
4. `BaselineStatus` 继续只表达完整性 / 新鲜度(`Fresh`/`Incomplete`/`Expired`/`Missing`),
|
|
303
|
+
flair 覆盖状态一律走 `FlairCoverageStatus`,两者不得混算。
|
|
304
|
+
|
|
305
|
+
- 同一 subreddit、同一有效期、**同一 flair 覆盖口径**内的多个 Key **复用同一个 `SampleSetID`**,
|
|
306
|
+
baseline 不必每帖重抓;`AssignedFlair` 不同且需 exact 覆盖时不得跨 flair 复用。
|
|
256
307
|
- `SampleSetID` 缺失或已过期 → `BlockingGap`(详见 `reddit-phase-brief`)。
|
|
257
308
|
- 单条任务用到的产品事实、VOC 案例、Geoly 引用放在 Brief 的
|
|
258
309
|
`RoutingEvidenceIDs`,**不要塞进 `SampleSetID`**。
|
|
@@ -393,8 +444,8 @@ FingerprintSyncStatus: PendingWritingOwner
|
|
|
393
444
|
|
|
394
445
|
| 层 | 执行者 | 内容 | 失败行为 |
|
|
395
446
|
|---|---|---|---|
|
|
396
|
-
| 1 · 预分配 | `reddit-phase-brief` | 在 Brief 里预先锁定 9
|
|
397
|
-
| 2 · 写作硬门禁 | `reddit-content-writing` |
|
|
447
|
+
| 1 · 预分配 | `reddit-phase-brief` | 在 Brief 里预先锁定 9 个结构字段 + 2 个 `PrewritingControlField`(`AssignedFlair` / `PostingTrigger`)并写入 `Planned` 指纹行;**不让 writer 临场自选** | Brief 缺字段(含 `AssignedFlair` / `PostingTrigger`)→ `BlockingGap`,不得进入写作 |
|
|
448
|
+
| 2 · 写作硬门禁 | `reddit-content-writing` | 开写前必须读取有效窗口并完成碰撞检查;写完后从终稿推导实际指纹与 `PostingTrigger` | 未读窗口 / 未做碰撞检查 / 实际与 `Planned` 结构字段或 `PostingTrigger` 不符 → 停止并退回 Brief |
|
|
398
449
|
| 3 · 交付反查 | `reddit-delivery-check` | 反向校验窗口无碰撞、映射已批准、结构未被 rewrite 改动、`AnchorSlot` 合法 | 任一不符 → `OverallStatus: NeedsFix` |
|
|
399
450
|
| 4 · hash 绑定 | `reddit-delivery-check` | 重算终稿 hash,与指纹行、review log 三方比对 | 任意两者不一致 → 阻断交付 |
|
|
400
451
|
|
|
@@ -431,6 +482,10 @@ FingerprintSyncStatus: PendingWritingOwner
|
|
|
431
482
|
- Hub 返回的 `optimized` 改变了任一受保护结构字段而被整稿采纳
|
|
432
483
|
(`HubStructureConflictStatus: Escalated` 未解决);
|
|
433
484
|
- 终稿已修改却仍沿用旧的 Hub pass;
|
|
485
|
+
- 主帖 Key 的 `AssignedFlair` 为空,或 `FlairCoverageStatus: Insufficient`(flair
|
|
486
|
+
决定资格 / 披露 / 帖型 / 上下文却无合格样本、又不满足 `ApprovedFallback`);
|
|
487
|
+
- `PostingTrigger` 的 `Planned` 值与终稿反推值不符,或违反
|
|
488
|
+
`PostingTrigger × BrandEntryMode` 交叉约束;
|
|
434
489
|
- 客户原型未映射(见 `content-type-routing-contract.md`)。
|
|
435
490
|
|
|
436
491
|
固定输出:
|
|
@@ -438,7 +493,7 @@ FingerprintSyncStatus: PendingWritingOwner
|
|
|
438
493
|
```markdown
|
|
439
494
|
FingerprintStatus: BlockingGap
|
|
440
495
|
ContentKey: <Key>
|
|
441
|
-
MissingRequirement: <index | window | planned row | final hash | sample set | mapping>
|
|
496
|
+
MissingRequirement: <index | window | planned row | final hash | sample set | mapping | assigned flair | flair coverage | posting trigger>
|
|
442
497
|
AllowedToWrite: No
|
|
443
498
|
AllowedToDeliver: No
|
|
444
499
|
RequiredAction: <Brief repair | fingerprint sync | final draft re-hash>
|
|
@@ -24,6 +24,36 @@ Use this file to resolve conflicts between Reddit strategy sources. If older pla
|
|
|
24
24
|
- Only `reddit-subreddit-compliance` output decides subreddit eligibility before planning; `reddit-voc-volume` never issues the compliance verdict itself.
|
|
25
25
|
- Phase 4 execution table is the writing truth after it is locked. If Brief or draft writing needs to change execution-table fields, return to Phase 4.0/4.0.6 and rerun verification.
|
|
26
26
|
|
|
27
|
+
## Claim Provenance — `ClaimEvidenceStatus`(三态,可发布文本准入判据)
|
|
28
|
+
|
|
29
|
+
**每个进入可发布文本(标题 / 正文 / 评论 / 回复)的实质性 claim** 必须归入以下三态
|
|
30
|
+
之一。此定义是权威源,`reddit-content-writing` 与 `reddit-content-rewrite` 的 A 层
|
|
31
|
+
直接引用,不各自发明。
|
|
32
|
+
|
|
33
|
+
| 状态 | 定义 | 可发布文本 |
|
|
34
|
+
|---|---|---|
|
|
35
|
+
| `Cited` | 可映射到项目已批准证据(`KnownProductFacts` / SKU 基准表 / VOC / 甲方语料 / 用户提供材料),并有 `ClaimRef` | 允许 |
|
|
36
|
+
| `ExternallyVerified` | **非产品事实类** claim(法规、公开兼容信息、公开行业数据等),经外部权威来源独立核验,并有 `ExternalSourceRef` | 允许 |
|
|
37
|
+
| `Inferred` | 模型综合、推测或因果推断,无直接来源 | **禁止** |
|
|
38
|
+
|
|
39
|
+
衔接与边界:
|
|
40
|
+
|
|
41
|
+
- `Cited` 向后兼容旧规「所有 claim 可追溯到 `KnownProductFacts` / `SourceEvidence`」。
|
|
42
|
+
- `ExternallyVerified` 只覆盖**背景事实**;**产品性能、亲身体验、使用时长**不因为
|
|
43
|
+
搜到第三方页面就自动成为作者可声称的事实(那类仍须 `Cited` 到已批准证据,或删)。
|
|
44
|
+
- `Inferred` 不是「低置信度正文」,而是**可发布文本禁入状态**:只能留在 Brief 的内部
|
|
45
|
+
推理区,不得进入标题 / 正文 / 评论 / 回复;若无法删除且为完成内容所必需 → `BlockingGap`。
|
|
46
|
+
- 只对**实质性 claim** 分类;明确的主观判断、常识性连接句不必逐句台账。
|
|
47
|
+
- 最小记录形态(按需,不强制逐句):
|
|
48
|
+
|
|
49
|
+
```markdown
|
|
50
|
+
ClaimLedger:
|
|
51
|
+
- Claim:
|
|
52
|
+
ClaimEvidenceStatus: Cited | ExternallyVerified | Inferred
|
|
53
|
+
ClaimRef: # Cited → 证据 ID;ExternallyVerified → ExternalSourceRef
|
|
54
|
+
PublishableTextAllowed: Yes | No # 标题 / 正文 / 评论 / 回复皆适用
|
|
55
|
+
```
|
|
56
|
+
|
|
27
57
|
## Known v2.12.7 Corrections
|
|
28
58
|
|
|
29
59
|
- Reddit Phase 0 does not run the full `kg-action-report` workflow. Use `kg-reddit-check` for positioning and narrative reading.
|