@geoly-ai/social-hub-cli 0.3.18 → 0.3.20
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 +29 -0
- package/dist/cmd-manifest.json +4 -2
- package/dist/content-review.test.js +1 -1
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +98 -8
- package/dist/index.js.map +1 -1
- package/dist/register-calendar-directives.d.ts +64 -0
- package/dist/register-calendar-directives.d.ts.map +1 -0
- package/dist/register-calendar-directives.js +135 -0
- package/dist/register-calendar-directives.js.map +1 -0
- package/dist/register-calendar-directives.test.d.ts +2 -0
- package/dist/register-calendar-directives.test.d.ts.map +1 -0
- package/dist/register-calendar-directives.test.js +127 -0
- package/dist/register-calendar-directives.test.js.map +1 -0
- 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/README.md +23 -22
- package/skills/manifest.json +6 -1
- package/skills/reddit-content-rewrite/SKILL.md +29 -0
- package/skills/reddit-content-writing/SKILL.md +54 -5
- 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 +39 -6
- package/skills/reddit-delivery-check/references/phase5-delivery.md +7 -1
- package/skills/reddit-matrix.lock.json +10 -10
- package/skills/reddit-phase-brief/SKILL.md +62 -11
- package/skills/reddit-phase-brief/references/brand-SKU-PGC-rules.md +223 -36
- package/skills/reddit-phase-brief/references/phase4-brief-workflow.md +405 -19
- 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 +26 -5
- package/skills/reddit-strategy-shared/references/content-review-gate.md +48 -1
- 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 +88 -3
- package/skills/reddit-strategy-shared/references/native-copy-profile.md +207 -0
- package/skills/reddit-strategy-shared/references/path-conventions.md +26 -4
- package/skills/reddit-strategy-shared/references/persona-card-contract.md +210 -0
- 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 +89 -2
- package/skills/reddit-subreddit-compliance/SKILL.md +28 -1
- package/skills/reddit-voc-volume/matrix-contract.md +16 -1
- package/skills/social-hub-calendar-directives/SKILL.md +548 -0
- package/skills/social-hub-calendar-jobs/SKILL.md +10 -0
- package/skills/social-hub-cli/SKILL.md +2 -0
- package/skills/social-hub-notifications/SKILL.md +7 -0
- package/skills/social-hub-publishing/SKILL.md +5 -0
|
@@ -29,7 +29,7 @@ This skill writes planned Reddit posts and comments. It does not redo strategy,
|
|
|
29
29
|
|
|
30
30
|
## Source Reference
|
|
31
31
|
|
|
32
|
-
- `references/phase4-writing.md` — W-1 baseline verification, W-1.5 fingerprint collision check, W-3 StructureFamily confirmation (the family is pre-assigned by the Brief; writing confirms, never picks), ABU / AnchorSlot rules, W-5 structure-preserving rewrite handoff
|
|
32
|
+
- `references/phase4-writing.md` — W-1 baseline verification (all **10** baseline dimensions; the 10th is the em-dash / parenthesis usage distribution), **W-1.b-brand `BrandPlacementGate`** (title generation and `BrandEntryMode` must cite the brand-first-mention histogram / SRP `brandFirstMentionHistogram`; never derive title-brand exposure from the P-B label; `PGCApproved` and `BrandReviewPost` title exposure stays legal), W-1.5 fingerprint collision check, W-3 StructureFamily confirmation (the family is pre-assigned by the Brief; writing confirms, never picks), **G1 internal-label outbound check** (reader-facing text carries only the Brief's `ReaderVisiblePremise`; fanout coverage as query-as-content stays legal, and the Feishu `[Fanout]` red line is an internal annotation), **G4 material-modality drift check** (writing/rewrite may never upgrade an `Optional` selling point into a required one), ABU / AnchorSlot rules, W-5 structure-preserving rewrite handoff
|
|
33
33
|
- `references/phase4-execution-table.md` for the **core 16-field schema + 3 audit control columns** (`RewriteModule`, `AnchorSlot`, `SecondaryAnchorSlot`), the three independent routing axes (`客户内容原型` / `主帖型代码` / `StructureFamily`), unmapped-prototype blocking, complement rules, EPA control records, and batch-map gate
|
|
34
34
|
- `references/post-writing-templates.md` — **the StructureFamily library (16 new families; 31 in total with the 15 in `writing-examples.md`) and its hard selection order**, ContentFunction minimum-information requirements, real-limitation (caveat) rules, and the 0–2 cap on surface colloquial signals
|
|
35
35
|
- `references/writing-examples.md` — **15 StructureFamily reference posts with routing metadata**; this is a routing target, not optional reading. Every piece must inherit one family's information topology
|
|
@@ -37,7 +37,9 @@ This skill writes planned Reddit posts and comments. It does not redo strategy,
|
|
|
37
37
|
- `references/pgc-writing-strategy.md` when writing PGC posts
|
|
38
38
|
- `references/comp-mention-strategy.md` only when competitor mention permission is explicitly `Yes`
|
|
39
39
|
- installed `reddit-brand-risk-response` output for pre-publish bot/shill/promo/claim risk gates when the batch is not explicitly low risk
|
|
40
|
-
- `../reddit-strategy-shared/references/content-review-gate.md` for the mandatory Social Hub review loop
|
|
40
|
+
- `../reddit-strategy-shared/references/content-review-gate.md` for the mandatory Social Hub review loop, including how to read a dimension the Hub result reports as `not_assessed`
|
|
41
|
+
- `../reddit-strategy-shared/references/persona-card-contract.md` for the Brief-assigned Persona Card this skill writes **inside** and never authors
|
|
42
|
+
- `../reddit-strategy-shared/references/native-copy-profile.md` only when the batch runs `AcceptanceProfile: NativeCopy`
|
|
41
43
|
|
|
42
44
|
## Gate
|
|
43
45
|
|
|
@@ -49,6 +51,7 @@ Additionally, stop before writing a single word of body copy if any of these hol
|
|
|
49
51
|
- a main-post row has no `StructureFamily` assigned by the Brief
|
|
50
52
|
- a main-post row has no `AssignedFlair`, or the baseline card's `FlairCoverageStatus` is `Insufficient` → `BlockingGap`, return to `reddit-phase-brief`
|
|
51
53
|
- 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)
|
|
54
|
+
- a main-post row has no `PersonaCardRef` assigned by the Brief → `BlockingGap`, return to `reddit-phase-brief`. **Never author a Card here**: a writer that supplies its own knowledge boundary grants itself exactly the boundary the draft needs, which is the bypass pre-assignment exists to close
|
|
52
55
|
- a target subreddit has no baseline card, or it is `Expired` / `Incomplete` → `BlockingGap: BaselineMissingOrStale`
|
|
53
56
|
- `memory/phase4-叙事指纹索引.md` has not been read, or the rolling-window collision check has not been run
|
|
54
57
|
- the collision check fails and no sample-based exception is on record → `BlockingGap: StructureCollision`, return to `reddit-phase-brief`
|
|
@@ -78,6 +81,17 @@ C-B/C-NB, and rows that were previously low risk.
|
|
|
78
81
|
persona or inline style guide. Resolve an approved `brandContext` when Hub
|
|
79
82
|
requires an explicit brand relationship; do not guess a brand or send an
|
|
80
83
|
arbitrary `stage` value.
|
|
84
|
+
**Never add the Persona Card, any Card field, or a Card-derived score to the
|
|
85
|
+
request, and never pack it into `subredditRules` or the thread context to get
|
|
86
|
+
it through.** The request schemas are strict, so an extra field is a rejected
|
|
87
|
+
call rather than an ignored key, and a free-text slot reserved for rule
|
|
88
|
+
evidence is not a transport for planner text. The Card governs writing only
|
|
89
|
+
(`../reddit-strategy-shared/references/persona-card-contract.md` §7).
|
|
90
|
+
Recording which quadrant the batch was written for is a **local** planner
|
|
91
|
+
declaration (`LocalReviewIntent`); the review call carries no scope field and
|
|
92
|
+
the response states no scope, so never report a server-side scope, and never
|
|
93
|
+
claim the omission of `accountId` was recognised by Hub as a deliberate
|
|
94
|
+
content-only choice.
|
|
81
95
|
3. Send `rewrite: true, attempt: 1`. Inspect `executionStatus` before
|
|
82
96
|
`verdict`.
|
|
83
97
|
For a comment/reply, include `thread.threadPermalink` when you know the
|
|
@@ -106,7 +120,14 @@ C-B/C-NB, and rows that were previously low risk.
|
|
|
106
120
|
changing the family — only harder to notice. Apply only the local fixes, or
|
|
107
121
|
resubmit stating the structural constraints. Submit the changed exact draft
|
|
108
122
|
as `attempt: 2`.
|
|
109
|
-
5. Accept only `completed/pass` for content review.
|
|
123
|
+
5. Accept only `completed/pass` for content review. Report any dimension the
|
|
124
|
+
result marks `not_assessed` as NotAssessed with its `notAssessedReason` — it
|
|
125
|
+
was excluded from the score, its remaining `score` number is diagnostic only,
|
|
126
|
+
and quoting it as a result or averaging it misrepresents the review. In
|
|
127
|
+
ContentOnly, `persona_consistency` / `persona_voice` coming back
|
|
128
|
+
`not_assessed` is correct behaviour, not a degraded review. Full semantics,
|
|
129
|
+
including why scores are comparable only within one `applicabilitySignature`:
|
|
130
|
+
`../reddit-strategy-shared/references/content-review-gate.md`. In ContentOnly, record
|
|
110
131
|
`ReviewMode: ContentOnly`, `AccountBindingStatus: Pending`,
|
|
111
132
|
`ReadyForContentNextSkill: Yes`, and `ReadyForDelivery: No`;
|
|
112
133
|
`accountCandidateFeedback` is advisory and persona consistency is not
|
|
@@ -152,6 +173,24 @@ then hand to rewrite to keep editing".
|
|
|
152
173
|
- **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.
|
|
153
174
|
- **Punctuation and format values follow the subreddit baseline** — no cross-subreddit em-dash ban, no parenthesis quota, no fixed word count.
|
|
154
175
|
- **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.
|
|
176
|
+
- **The Persona Card is Brief-assigned; write inside it, never widen it.** Read
|
|
177
|
+
the Card behind the row's `PersonaCardRef` before drafting, and before handing
|
|
178
|
+
the draft to Hub review run the local boundary self-check
|
|
179
|
+
(`../reddit-strategy-shared/references/persona-card-contract.md` §8): every
|
|
180
|
+
firsthand experience claim maps to an entry in `permittedExperienceClaims`,
|
|
181
|
+
nothing displays knowledge listed in `doesNotKnow`, the stated relationship
|
|
182
|
+
matches `brandRelationshipDisclosed`, and `postingWhy` still coexists with the
|
|
183
|
+
assigned `PostingTrigger`. Record `PersonaCardSelfCheck: Pass | BlockingGap`
|
|
184
|
+
**per Key** in `PerKeyStructureContract`, alongside the `PersonaCardVersion` and
|
|
185
|
+
`PersonaCardHash` it was checked against, with the contradicting phrase and Card
|
|
186
|
+
field for each gap. A batch-level value alone cannot show that every post was
|
|
187
|
+
checked against its own current Card, which is what delivery verifies. A draft that needs a
|
|
188
|
+
wider boundary goes back to `reddit-phase-brief` for a new Card version — the
|
|
189
|
+
writer never edits the Card and never bumps its version. This check is local: it
|
|
190
|
+
produces no score, is not a review, and never substitutes for the Hub gate.
|
|
191
|
+
The Card does not relax `ClaimEvidenceStatus`; it adds *who may claim it* on top
|
|
192
|
+
of *whether it is sourced*. A firsthand phrase such as "mine arrived" is not an
|
|
193
|
+
offence by itself — it matters only when it contradicts the Card.
|
|
155
194
|
- **`PostingTrigger` is Brief-pre-assigned, not writer-chosen.** After drafting,
|
|
156
195
|
re-derive the actual `PostingTrigger` from the finished body and confirm it
|
|
157
196
|
matches the `Planned` value; a mismatch is a `BlockingGap` (return to Brief),
|
|
@@ -214,14 +253,24 @@ then hand to rewrite to keep editing".
|
|
|
214
253
|
- AssignedFlairVerified: Yes / No
|
|
215
254
|
- PostingTriggerPlannedVsFinal: Match / Drift / NotAssigned
|
|
216
255
|
- PostingTriggerCrossConstraintOK: Yes / No
|
|
256
|
+
- PersonaCardSelfCheck: Pass / BlockingGap / NotApplicable # batch-level = worst across Keys; per-Key values live in PerKeyStructureContract
|
|
257
|
+
- PersonaCardTransportStatus: LocalOnly(ServerContractMissing) # the Card was not sent to Hub
|
|
258
|
+
- PersonaCardAuthorizationStatus: Authorized / DeclaredOnly / NotApplicable # carried through from the Brief, not re-derived here
|
|
259
|
+
- AcceptanceProfile: Default / NativeCopy
|
|
260
|
+
- NativeCopyProfileStatus: NotSelected / Unavailable(ServerContractMissing)
|
|
261
|
+
- LocalReviewIntent: accountBinding=<account_bound|persona_less>, brandTreatment=<managed_brand|organic> # carried through from the Brief; local declaration, not a Hub receipt
|
|
262
|
+
- HubReviewScopeStatus: Unavailable(ServerContractMissing) # never report a server-side scope
|
|
263
|
+
- NotAssessedDimensions: # per row: dimension + notAssessedReason, verbatim from Hub
|
|
217
264
|
- ClaimEvidenceAllCitedOrExternallyVerified: Yes / No # no Inferred claim reached any publishable text (title/body/comment/reply)
|
|
218
265
|
- FingerprintIndexUpdated: Yes / No
|
|
219
266
|
- CollisionCheckPassed: Yes / No / ExceptionRecorded
|
|
220
267
|
- PerKeyStructureContract: |
|
|
221
268
|
<one row per DraftKey — batch-level single values are not valid, a batch normally
|
|
222
269
|
spans several families, anchor slots and hashes>
|
|
223
|
-
|
|
224
|
-
|
|
270
|
+
<comment rows take N/A for PersonaCardRef / PersonaCardVersion /
|
|
271
|
+
PersonaCardHash / PersonaCardSelfCheck>
|
|
272
|
+
| Key | ClientContentPrototype | ContentFunction | PrimaryPostType | StructureFamily | AssignedFlair | FlairCoverageStatus | PostingTrigger | PersonaCardRef | PersonaCardVersion | PersonaCardHash | PersonaCardSelfCheck | SampleSetID | AnchorSlot | SecondaryAnchorSlot | AllowedStructuralChanges | ForbiddenStructuralChanges | DraftHash |
|
|
273
|
+
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
225
274
|
- SKUBindingsPreserved: Yes / No
|
|
226
275
|
- BrandWordStatusPreserved: Yes / No
|
|
227
276
|
- ComplementRulesPassed: Yes / No
|
|
@@ -1,6 +1,13 @@
|
|
|
1
|
-
# Phase 4.0 —
|
|
1
|
+
# Phase 4.0 — 执行表详细规则(写作侧副本)
|
|
2
2
|
|
|
3
3
|
> Phase 4.0 是内容写作的零号门禁,所有规则必须在第一个字正文写出之前满足。
|
|
4
|
+
>
|
|
5
|
+
> ⚠️ **主从关系(本文件是副本,不是权威):** 执行表 schema 与门禁的权威版本是
|
|
6
|
+
> `../../reddit-phase-planning/references/phase4-execution-table.md`(配 `scripts/phase406_verify.py`)。
|
|
7
|
+
> 本副本只为写作阶段就近查阅而存在;**两处冲突时一律以 planning 版为准**,
|
|
8
|
+
> 不要在本文件里就地改 schema。已知漂移(尚未同步、请按 planning 版执行):
|
|
9
|
+
> `RewriteModule` 的两层取值(`<RewriteRoute 标志集> · <SemanticModule>`,用功能语义名、
|
|
10
|
+
> **禁止 PROMPT 编号**)与相应的原型→帖型/`StructureFamily` 示例。
|
|
4
11
|
|
|
5
12
|
---
|
|
6
13
|
|
|
@@ -109,9 +116,23 @@ C024–C040:外部评论(W1→W2→W3→W4 顺序)
|
|
|
109
116
|
|
|
110
117
|
执行表填写完毕后,动笔前必须运行以下聚合检查:
|
|
111
118
|
|
|
112
|
-
|
|
119
|
+
> **口径以 D6 为准(`reddit-phase-planning/references/scheduling-decision-procedure.md`)。**
|
|
120
|
+
> 下面三条是**旧的硬编码启发式,已被 Phase 4.0.0.4 的 D6 锁定方案取代**,现在只按 `SRPMode` 分档生效:
|
|
121
|
+
>
|
|
122
|
+
> | `SRPMode` | 效力 |
|
|
123
|
+
> |---|---|
|
|
124
|
+
> | `Fallback`(该板块无 SRP) | **硬约束**,不达标按右列处理 |
|
|
125
|
+
> | `Full` / `Provisional`(该板块有 SRP) | **warning-level sanity check**:越界不否决方案,但必须在 D6 方案的约束快照里标注越界项与理由,交用户锁定;板块上限以 D5 的 `capacityMax` 为准 |
|
|
126
|
+
>
|
|
127
|
+
> **作用域:** 前两条按**板块**判(用该板块自己的 `SRPMode`);「子版覆盖数 ≥ 4 个」是**方案级**
|
|
128
|
+
> 约束,仅当方案内全部板块均为 `Fallback` 时才硬执行,混合模式下为 warning-level。
|
|
129
|
+
>
|
|
130
|
+
> 这组数字按「总帖 20 条」标定,对显著不同的总量不具尺度一致性。
|
|
131
|
+
|
|
132
|
+
| 检查项 | 阈值(`SRPMode: Fallback` 下为硬约束) | 不达标处理 |
|
|
113
133
|
|--------|------|----------|
|
|
114
134
|
| 单一子版帖子数占比 | ≤ 40% | 将超量帖子移到 Phase 2 缺口矩阵引用次数排名第二的子版 |
|
|
135
|
+
| 核心子版帖子数 | ≤ 8 条(总帖 20 条时) | 同上 |
|
|
115
136
|
| 子版覆盖数 | ≥ 4 个不同子版 | 从 Phase 2 社区缺口矩阵补充 |
|
|
116
137
|
|
|
117
138
|
---
|
|
@@ -278,7 +299,7 @@ Geoly MCP → get_prompt_citations(
|
|
|
278
299
|
[ ] 主帖含品牌词总数已统计并与 Master **Summary** 约定一致(差值=0)
|
|
279
300
|
[ ] 外部评论 URL 均已在执行表中填写真实 URL,无「URL待确认」占位符
|
|
280
301
|
[ ] 外部评论已建立「外部核验」控制列或独立 EPA 记录(不计入核心 16 字段主 schema),动笔后发布前须逐条填入核验结果
|
|
281
|
-
[ ]
|
|
302
|
+
[ ] 板块分布已按 D6 口径核对:单板块项(单一子版占比 ≤ 40% / 核心子版 ≤ 8 条)按该板块自己的 `SRPMode` 判——`Fallback` 为硬约束,`Full` / `Provisional` 以 D5 `capacityMax` 与 D6 锁定方案为准;「覆盖 ≥ 4 个」是方案级约束,仅全部板块为 `Fallback` 时硬执行。warning-level 越界项已在约束快照中标注理由(不否决方案)
|
|
282
303
|
[ ] A/B 两组未在同一线程各发 C-B
|
|
283
304
|
[ ] 【方案E】补偿规则评估已完成(全部 UGC P-NB 帖逐行检查 Rule-1;全部 C-NB 外部评论逐行检查 Rule-2)
|
|
284
305
|
[ ] 【方案E】触发补偿规则的行已在执行表「写作说明」列注明处理方式
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
| 段落数 | 中位数 | 决定分段密度 |
|
|
42
42
|
| 标题长度与标题句式分布 | 各句式(陈述结论 / 问句 / 场景 / 数字背书 / 时长锚定)占比 | 决定标题形态,避免全批同一句式 |
|
|
43
43
|
| 列表 / 小标题使用率 | 百分比(多少比例的帖使用) | 决定是否分节;**不再默认「分节更好」** |
|
|
44
|
-
| 品牌首次出现位置分布 |
|
|
44
|
+
| 品牌首次出现位置分布 | **四档**直方图(标题 / 首段 / 中段 / 结论;分母 = `BrandMentionSampleCount`)+ `ComparableSampleCount` + `NoBrandMentionRate`(「不出现」由它表示,**不是直方图的一档**) | **`BrandPlacementGate` 的唯一位置来源**(见下方 W-1.b-brand),校准 `BrandEntryMode`,替代「不早于第二段」 |
|
|
45
45
|
| 提问式结尾比例 | 百分比 | 校准 `EndingMode`;比例低时不得默认加问句结尾 |
|
|
46
46
|
| 是否常见 TL;DR | 百分比 | 决定是否使用顶部 TL;DR(同时是 AnchorSlot 依据) |
|
|
47
47
|
| 第一人称比例 | 百分比 | 判断该板块的叙述人称惯例。**baseline 第一人称率高 ≠ 可以补造经历**——没有真实经历素材时,正确做法是换 `ContentFunction` / `EvidenceShape` 或退回补素材,不得虚构 |
|
|
@@ -50,6 +50,70 @@
|
|
|
50
50
|
|
|
51
51
|
另附 **2–3 条 verbatim `selftext_excerpt`**(原文抄录,禁止「基于 VOC 风格自行创作」),用于校准腔调而非结构。
|
|
52
52
|
|
|
53
|
+
**W-1.b-brand — `BrandPlacementGate`(G2,硬门;上表第 5 行由「校准依据」升级为门)**
|
|
54
|
+
|
|
55
|
+
> **出处(真实返工):** 需求方质问「**为什么你把 P-B 的标题都统一加上了 aporro 这个
|
|
56
|
+
> 品牌了?**」——P-B 的含义是「帖子中包含品牌词」,**并不代表品牌名必须在标题里出现**,
|
|
57
|
+
> 那样显得很广告。修正后的口径:品牌词出现在 P-B 帖的**正文 body 中**,标题中通常不写
|
|
58
|
+
> 品牌名,**除非是 Brand Review / 专门讨论该品牌的帖子**。
|
|
59
|
+
>
|
|
60
|
+
> **机制早就有**(上表第 5 行的直方图),缺的是门与触达。本节补的是门。
|
|
61
|
+
|
|
62
|
+
**规则(writing 侧为消费与校验,权威定义在 `reddit-phase-brief` 的
|
|
63
|
+
`references/brand-SKU-PGC-rules.md` §2.0 / §2.5):**
|
|
64
|
+
|
|
65
|
+
1. 任何**标题生成**与任何 `BrandEntryMode` 的确认,都必须引用 Brief 传下来的位置依据,
|
|
66
|
+
**按行类型分三支校验(不得一刀切要求自有 Basis):**
|
|
67
|
+
- **P-B / PGC 主帖** → 校验自有 `BrandPlacementBasis` 全字段;
|
|
68
|
+
- **P-NB 主帖** → 接受 `BrandPlacementBasis: N/A(P-NB · 主帖不露品牌)`,不再要求直方图;
|
|
69
|
+
- **C-B 评论** → 校验 `InheritedBrandPlacementBasis`(配对 P-NB 填 `N/A(PairedPostIsP-NB)`、
|
|
70
|
+
外部评论填 `N/A(ExternalComment)`)+ `CommentPlacementDecision`,**评论不要求自有直方图**。
|
|
71
|
+
|
|
72
|
+
`BrandPlacementBasis`(其 `SourceRef` 为 baseline 卡的 `SampleSetID` 的品牌位置直方图,
|
|
73
|
+
`SourceKind: Exception`(持有有效 `BrandTitleExposureException` 时的合法来源),
|
|
74
|
+
或板块级 SRP 的 `brandFirstMentionHistogram`,契约见
|
|
75
|
+
`../../reddit-strategy-shared/references/subreddit-research-profile.md`
|
|
76
|
+
—— **该板块暂无可用 SRP 实例时以 baseline 卡为主来源,不得因其缺失而阻断**)。
|
|
77
|
+
2. **拦截条件(命中任一即 `BlockingGap: BrandPlacementUnsupported`,退回
|
|
78
|
+
`reddit-phase-brief`,writer 不得本地修):**
|
|
79
|
+
- 存在「**因为这行标记 P-B,所以标题写品牌**」的推导;
|
|
80
|
+
- **P-B / PGC 主帖**的 `BrandPlacementBasis` 缺失,或 `SelectedPlacement` 与 basis 不一致
|
|
81
|
+
(**P-NB 主帖的 `N/A(P-NB · 主帖不露品牌)` 与 C-B 评论的
|
|
82
|
+
`InheritedBrandPlacementBasis` + `CommentPlacementDecision` 均为合法填法,
|
|
83
|
+
不得据本条拦截**;C-B 缺这两项才拦截);
|
|
84
|
+
- 直方图「标题」档 < 20% 却把品牌名写进标题,且无 `BrandTitleExposureException`;
|
|
85
|
+
- `DecisionStatus: NoComparableEvidence`(`BrandMentionSampleCount = 0`)却照常赋值 ——
|
|
86
|
+
**0 是「没有可比样本」,不是「不允许标题」,也不是一个可以照抄的保守位置**。
|
|
87
|
+
⚠️ **持有有效例外时 Brief 会记 `DecisionStatus: Exception`(优先于
|
|
88
|
+
`NoComparableEvidence`)+ `SourceKind: Exception` + `SourceRef: <ExceptionRef>`
|
|
89
|
+
—— 这种行不得因「没有 SampleSetID / 没有直方图」被拦**;
|
|
90
|
+
- `DecisionStatus: Sparse`(1–4 条)而 Brief 未同时给出三个计数、更保守(更晚)的一档
|
|
91
|
+
与 `SparseApprovedBy`。
|
|
92
|
+
> **直方图口径:** `BrandFirstMentionHistogram` 只有**标题/首段/中段/结论四档**,
|
|
93
|
+
> 分母是 `BrandMentionSampleCount`;「不出现」由 `NoBrandMentionRate` 单独表示,
|
|
94
|
+
> **不是直方图的一档**。
|
|
95
|
+
> **C-B 评论不自带直方图**:评论用配对 P Key 的 `InheritedBrandPlacementBasis` +
|
|
96
|
+
> `CommentPlacementDecision`(外部评论为 `N/A(ExternalComment)`)。
|
|
97
|
+
3. ⚠️ **合法例外必须放行(不得一刀切):** `BrandTitleExposureException` 为
|
|
98
|
+
`PGCApproved`(官方/PGC 账号 + 已过 precedent check 且有先例 URL + 版规允许
|
|
99
|
+
vendor/official + flair/disclosure/frequency 满足)或 `BrandReviewPost`(确为围绕该
|
|
100
|
+
品牌/产品本身的帖,由 `PrimaryPostType` / `WritingVariant` + 选题证据判定,
|
|
101
|
+
**不得自造 `ContentFunction: Review`**)时,**标题出现品牌名合法**,不得因直方图不支持
|
|
102
|
+
而拦截。例外须带 `ExceptionBasis` / `ExceptionScope` / `ExceptionApprovedBy` /
|
|
103
|
+
`ExceptionApprovedAt` 四项,且不得越过禁止推广板块与披露要求。
|
|
104
|
+
4. `BrandEntryMode` 本身仍是 `LockedFingerprintField`:位置变更一律退回 Brief 重分配。
|
|
105
|
+
5. ⚠️ **既有 P-B / PGC 行的 `SelectedPlacement` 只能是 标题 / 首段 / 中段 / 后段**
|
|
106
|
+
(直方图档位按「结论 → 后段」换算)。D 类板块或 `NoBrandMentionRate ≥ 0.8` 导致主帖
|
|
107
|
+
无法露出时,**既有 P-B / PGC 行走 `BlockingGap` 回 Brief / 规划**,不得静默落到
|
|
108
|
+
「不出现」或挪到评论;「不出现」只对规划时已是 P-NB 的行合法。
|
|
109
|
+
把品牌挪到评论或干脆不出现,等于让这行变成 P-NB + C-B(帖—评互补规则见下文),
|
|
110
|
+
**那是配额与行类型变更** —— writing 阶段一律 `BlockingGap` 退回 Brief / 规划,
|
|
111
|
+
不得自行执行。
|
|
112
|
+
|
|
113
|
+
⚠️ **本门只处理「位置由什么决定」,不处理「要不要有品牌」。** P-B/P-NB/C-B/C-NB 配额
|
|
114
|
+
语义一律不变;位置不成立时退回 Brief,**不得**在 writing 阶段把 P-B 改成 P-NB、
|
|
115
|
+
改配对或改配额。
|
|
116
|
+
|
|
53
117
|
**W-1.c 若需要补采(仅在 Brief 授权重采时):**
|
|
54
118
|
|
|
55
119
|
```bash
|
|
@@ -218,6 +282,13 @@ SampleSetID:
|
|
|
218
282
|
AnchorSlot:
|
|
219
283
|
AllowedStructuralChanges:
|
|
220
284
|
ForbiddenStructuralChanges:
|
|
285
|
+
BrandPlacementBasis: # G2:主帖用 SelectedPlacement + DecisionStatus + 例外(rewrite 不得改品牌位置)
|
|
286
|
+
InheritedBrandPlacementBasis: # G2:**评论交接时用这两项代替上一行**(配对为 P-NB 填 N/A(PairedPostIsP-NB),
|
|
287
|
+
CommentPlacementDecision: # 外部评论填 N/A(ExternalComment))
|
|
288
|
+
ReaderVisiblePremise: # G1:rewrite 只能表达这个,不得引入内部标签
|
|
289
|
+
MaterialModalitySnapshot: # G4:逐条 MaterialID: OriginalModality → EffectiveModality
|
|
290
|
+
# + ModalityStatus / ModalityUpgradeRef / ModalityDowngradeRef /
|
|
291
|
+
# DowngradeSource / ApprovedBy(或 LedgerRef);rewrite 不得升级/降级
|
|
221
292
|
```
|
|
222
293
|
|
|
223
294
|
rewrite **默认只能**:修事实表达、修营销腔、修可读性、修明确触发的问题。
|
|
@@ -255,8 +326,10 @@ Hub pass 必须发生在最后一次正文修改之后。
|
|
|
255
326
|
|--------|------|
|
|
256
327
|
| 标题/任务方向 | 与 Brief 一致或更具体,不得偏离话题 |
|
|
257
328
|
| 大纲与撰写逻辑 | 段落结构按 Brief 展开 |
|
|
258
|
-
| 品牌词嵌入 | P-B/C-B
|
|
259
|
-
| 方向选取理由 | 正文须落实 Brief 所指向的缺口/Prompt |
|
|
329
|
+
| 品牌词嵌入 | P-B / PGC 主帖按 Brief 的 `SelectedPlacement` + `BrandPlacementBasis`;C-B 评论按 `InheritedBrandPlacementBasis` + `CommentPlacementDecision`(W-1.b-brand);符合帖—评互补 |
|
|
330
|
+
| 方向选取理由 | 正文须落实 Brief 所指向的缺口/Prompt(**该理由属内部面,不得写进正文**,见下方 G1) |
|
|
331
|
+
| 叙事分层 | 正文只表达 Brief 的 `ReaderVisiblePremise`;`InternalCoverageIntent` 不得进入读者可见文本 |
|
|
332
|
+
| 素材 modality | 按 Brief 的 `EffectiveModality` 写;writing **不得升级**(见下方 G4) |
|
|
260
333
|
|
|
261
334
|
Brief 与执行表冲突时:**暂停动笔**,先修订 Brief 或执行表并重新走 Brief 门禁。
|
|
262
335
|
|
|
@@ -265,6 +338,47 @@ Brief 与执行表冲突时:**暂停动笔**,先修订 Brief 或执行表并
|
|
|
265
338
|
[ ] Brief 审核状态已满足(甲方:Brief 已通过 / 内部:确认 Brief · 可动笔)
|
|
266
339
|
```
|
|
267
340
|
|
|
341
|
+
### G1 — 内部标签 outbound 检查(每条内容成稿后必做)
|
|
342
|
+
|
|
343
|
+
> Brief 侧的分层定义见 `reddit-phase-brief` 的
|
|
344
|
+
> `references/phase4-brief-workflow.md` 步骤 B-1.6。writing 侧只做 outbound 校验。
|
|
345
|
+
|
|
346
|
+
**扫描面(只扫这些,且只扫将要发到 Reddit 的文本):** 标题、正文 body、评论正文。
|
|
347
|
+
|
|
348
|
+
**拦截:** 出现 FAQ 编号 / 「响应·覆盖 FAQ」字样 / GEO·searchQuery·关键词标签原样 /
|
|
349
|
+
Key 编号 / `prompt_id` / 缺口象限码 / `SampleSetID` / 内部代号 → `NeedsFix`,
|
|
350
|
+
改写成 `ReaderVisiblePremise` 的自然表达。
|
|
351
|
+
|
|
352
|
+
> **判据继承 B-1.6,不是无条件字符串黑名单:** 只有当这些字符串**作为内部标签、查询标签
|
|
353
|
+
> 或策略动作**出现时才拦截。**产品型号、真实用户原话引用、以及碰巧形似内部编号的自然
|
|
354
|
+
> 语句(型号 `A-07`、容量 `Q12`、「这几个问题我也被问过」)不得因形状相似而拦截。**
|
|
355
|
+
> 判定时以本项目登记在 `InternalCoverageIntent` 里的实际 token 为准。
|
|
356
|
+
|
|
357
|
+
⚠️ **不误伤(三条,必须完整读):**
|
|
358
|
+
|
|
359
|
+
1. **fanout 子查询「在正文中自然覆盖」仍然合法**(见下文「动笔顺序规则」B 组条款)。
|
|
360
|
+
那是 **query-as-content**(把查询的语义用人话写出来),本门只禁
|
|
361
|
+
**query-as-label**(把查询字符串当角度或标题贴上去)。
|
|
362
|
+
2. **飞书文档里的 `[Fanout] <查询文本>` 标红行是文档内部标注**(见下文红色标记规则),
|
|
363
|
+
给内容同事看、**不发到 Reddit**,不属于读者可见叙事;但 outbound 检查必须确认它
|
|
364
|
+
**没有**混进 Reddit 的 title / body / comment。
|
|
365
|
+
3. **只扫 outbound 文本,不扫 Brief、指纹索引、执行表、审计控制列、rewrite handoff**
|
|
366
|
+
—— 这些位置本来就该保留内部标签。
|
|
367
|
+
|
|
368
|
+
### G4 — 素材 modality drift 检查(每条内容成稿后必做)
|
|
369
|
+
|
|
370
|
+
> 台账与授权规则见 `reddit-phase-brief` 的 `references/phase4-brief-workflow.md` 步骤 B-1.4。
|
|
371
|
+
|
|
372
|
+
- 逐条比对本篇用到的 `MaterialID` 的 `EffectiveModality` 与实际落笔:
|
|
373
|
+
**writing 与 rewrite 一律不得升级**(`Optional → Preferred/Required` 等)。
|
|
374
|
+
出现「必须嵌入 / 强制带上这个卖点」的自发要求 → **拦截并回落**到 Brief 传下的值。
|
|
375
|
+
- `Optional` 的卖点**不满足条件就不写,不算缺陷**;不得为「凑齐卖点」硬塞。
|
|
376
|
+
- `Required` 项在成稿中缺失 → `BlockingGap`(不是「本篇没写而已」),退回 Brief。
|
|
377
|
+
- 需要变更 modality(升级或降级)→ 退回 `reddit-phase-brief` 走授权流程
|
|
378
|
+
(升级记 `ModalityUpgradeRef`,降级记 `ModalityDowngradeRef` + `DowngradeSource`,
|
|
379
|
+
两者均须 `ApprovedBy` ≠ 生成 agent);
|
|
380
|
+
**用户明确标 `Optional` 的项目永不由本阶段升级**。
|
|
381
|
+
|
|
268
382
|
---
|
|
269
383
|
|
|
270
384
|
## Brand Risk 预防评估(每批终稿前必做)
|
|
@@ -394,6 +508,8 @@ FixOwnerSkill: reddit-phase-brief
|
|
|
394
508
|
- **任何正文:** 须 Phase 4 Brief 门禁已通过、Phase 4.0.6 通过,且用户已回复「确认动笔 · Batch N」
|
|
395
509
|
- **A 组(P-NB):** 可在 Phase 4.0.5 未完成时进入 4.0.6,但 **B 组 Keys 须等 fanout 补齐后再写**
|
|
396
510
|
- **B 组(P-B):** fanout 列齐全 + 4.0.6 通过后,按批次 Map 撰写;正文须自然覆盖 fanout 子查询
|
|
511
|
+
—— **query-as-content(把查询语义用人话写出来)合法;query-as-label(把查询字符串原样
|
|
512
|
+
当标题或角度贴上去)违反 G1**
|
|
397
513
|
|
|
398
514
|
---
|
|
399
515
|
|
|
@@ -598,6 +714,8 @@ else:
|
|
|
598
714
|
[ ] W-3 本批每篇均已确认 Brief 预分配的 StructureFamily,并已读对应范文的元数据块
|
|
599
715
|
[ ] 本批未出现伪造社区历史、刻意 typo、虚构身份信号、虚构缺点
|
|
600
716
|
[ ] 本批开场句未直接复用范文或模板中的示例句(示例即种子)
|
|
717
|
+
[ ] G2:本批每条 P-B / PGC 主帖均带 Brief 的 BrandPlacementBasis(C-B 评论带 InheritedBrandPlacementBasis + CommentPlacementDecision),SelectedPlacement 与 basis 一致;无「因为标记 P-B 所以标题写品牌」的推导;标题露出品牌的行有直方图支持(标题档 ≥ 20%)或四项齐全的 BrandTitleExposureException;Sparse 行满足三条件;DecisionStatus: Exception 的行不因缺 SampleSetID/直方图被拦
|
|
718
|
+
[ ] G4:本批每条素材的 EffectiveModality 已从 Brief 取到,未在写作阶段升级;Optional 项未被当成必写
|
|
601
719
|
```
|
|
602
720
|
|
|
603
721
|
---
|
|
@@ -639,6 +757,8 @@ lark-cli docs 写入富文本时,对红色片段使用 inline 颜色属性(`
|
|
|
639
757
|
[ ] B 组帖:ABUVisibilityGate 按长度档通过(中帖唯一 ABU 不得仅落在结论段且仅靠标题 cue;长 B 组帖只有末尾 ABU 须记录例外理由)
|
|
640
758
|
[ ] B 组帖:飞书文档 Fanout Query 行已标红(或已用【红色标注:...】文字替代)
|
|
641
759
|
[ ] B 组帖:飞书文档 ABU 已内联标红(或已用【红色标注:...】文字替代)
|
|
760
|
+
[ ] G1 outbound:标题 / 正文 / 评论中无**作为内部标签出现的** FAQ 编号、「响应·覆盖 FAQ」字样、GEO/searchQuery/关键词标签原样、Key/prompt_id/象限码(按 token registry + 标签语境判定;**真实产品型号、用户原话、形似编号的自然语句不算违规**);`[Fanout]` 行只存在于飞书文档,未混入 Reddit payload
|
|
761
|
+
[ ] G4:Required 素材均已落笔(缺失=BlockingGap);无未授权的 modality 升级或降级(升级须 ModalityUpgradeRef,降级须 ModalityDowngradeRef + DowngradeSource + ApprovedBy,或可追溯的 LedgerRef)
|
|
642
762
|
```
|
|
643
763
|
|
|
644
764
|
## 外部热帖评论前置核查(C-B / C-NB 外部评论每条必做,动笔前完成)
|
|
@@ -10,9 +10,9 @@
|
|
|
10
10
|
> 4. **禁止为了不同而不同**:结构在 **Brief 阶段**按 `content-type-routing-contract.md` 的有序过滤收敛(见下文 §C),写作阶段只确认,不做随机轮换。
|
|
11
11
|
|
|
12
12
|
**适用范围:** 任意品牌 Reddit GEO 内容;示例含 eSIM、耳机品类,换品类时替换关键词即可。
|
|
13
|
-
**数据来源:**
|
|
13
|
+
**数据来源:** Reddit VOC 三轮采样(2026-06-10,使用 `reddit-voc-volume`,r/eSIMs / r/Earbuds / r/HeadphoneAdvice / r/JapanTravel / r/solotravel / r/digitalnomad / r/BudgetAudiophile;含评分、upvote_ratio 真实数据)。本文的模板与「引用倾向」是这批采样的归纳,**不是**规则手册的转述。
|
|
14
14
|
|
|
15
|
-
**与主文档关系:**
|
|
15
|
+
**与主文档关系:** Phase 顺序与门禁以 `../../reddit-strategy-orchestrator/SKILL.md`(Phase Orchestration / Phase Gates)为准;结构与帖型路由以 `../../reddit-strategy-shared/references/content-type-routing-contract.md`、差异化以 `../../reddit-strategy-shared/references/content-diversity-contract.md`、写作硬门禁以 `phase4-writing.md` 为准。本文是写帖侧的「格式 + 品牌嵌入」速查,不替代 Phase 0–5 全流程,也不是规则手册。
|
|
16
16
|
|
|
17
17
|
---
|
|
18
18
|
|
|
@@ -357,13 +357,21 @@ TL;DR 放最上;Background 段先写「near-launch 购买、替换 AirPod Pro
|
|
|
357
357
|
|
|
358
358
|
---
|
|
359
359
|
|
|
360
|
-
##
|
|
360
|
+
## 延伸阅读(active 权威文件)
|
|
361
|
+
|
|
362
|
+
> ⚠️ 旧版此处列的 `02-规则手册-reddit-strategy-reuse-playbook.md` 与
|
|
363
|
+
> `01-执行入口-reddit-sop-v2-universal.md` 已归档到
|
|
364
|
+
> `reddit-strategy-shared/references/prerequisites/archive/`(`AgentReadPolicy: DoNotRead`),
|
|
365
|
+
> **不得**再当作数据来源、规则手册或 Phase 顺序依据;引用即 gate failure。下表是它们的 active 接替者。
|
|
361
366
|
|
|
362
367
|
| 文档 | 用途 |
|
|
363
368
|
|------|------|
|
|
364
|
-
|
|
|
365
|
-
|
|
|
366
|
-
|
|
|
369
|
+
| `../../reddit-strategy-orchestrator/SKILL.md` | Phase 顺序与门禁(Phase Orchestration / Phase Gates / Human Decision Points) |
|
|
370
|
+
| `phase4-post-rules.md` | 品牌词规则、P-NB→C-B 互补、评论 2:8 |
|
|
371
|
+
| `../../reddit-strategy-shared/references/content-type-routing-contract.md` | 客户内容原型 → 主帖型 → StructureFamily 路由 |
|
|
372
|
+
| `../../reddit-strategy-shared/references/content-diversity-contract.md` | 指纹、滚动窗口、baseline manifest 与 `SampleSetID` |
|
|
373
|
+
| `phase4-writing.md` | 写作阶段硬门禁(W-1.a / W-1.b / W-1.b-brand 等) |
|
|
374
|
+
| `../../reddit-voc-volume/SKILL.md` | 拉取 Top 引用帖 selftext、竞品 VOC |
|
|
367
375
|
|
|
368
376
|
---
|
|
369
377
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: reddit-delivery-check
|
|
3
3
|
description: |
|
|
4
|
-
Reddit Phase 5 delivery QA skill. Use to verify final strategy deliverables, execution table coverage, batch draft completeness, SKU and brand-word quotas, external-comment audit status, brand-risk review status, unresolved placeholders, and the v2.12.25 structure gates before client delivery: client content-prototype mapping, StructureFamily preservation, rewrite structure drift, AnchorSlot legality, rolling-window structure collisions, subreddit baseline freshness, narrative-fingerprint / final-draft hash match, Hub optimized-draft structure override,
|
|
4
|
+
Reddit Phase 5 delivery QA skill. Use to verify final strategy deliverables, execution table coverage, batch draft completeness, SKU and brand-word quotas, external-comment audit status, brand-risk review status, unresolved placeholders, and the v2.12.25 structure gates before client delivery: client content-prototype mapping, StructureFamily preservation, rewrite structure drift, AnchorSlot legality, rolling-window structure collisions, subreddit baseline freshness, narrative-fingerprint / final-draft hash match, Hub optimized-draft structure override, fabricated human signals (deliberate typos, fake community history, invented identity), Persona Card preservation, correct reporting of not-assessed review dimensions, compliance-evidence freshness at delivery time, and acceptance-profile eligibility.
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Reddit Delivery Check
|
|
@@ -18,6 +18,9 @@ Mandatory before running the structure gates:
|
|
|
18
18
|
|
|
19
19
|
- `~/.cursor/skills/reddit-strategy-shared/references/content-type-routing-contract.md`
|
|
20
20
|
- `~/.cursor/skills/reddit-strategy-shared/references/content-diversity-contract.md`
|
|
21
|
+
- `~/.cursor/skills/reddit-strategy-shared/references/persona-card-contract.md`
|
|
22
|
+
- `~/.cursor/skills/reddit-strategy-shared/references/content-review-gate.md` for how a `not_assessed` dimension must be reported and why scores are comparable only within one `applicabilitySignature`
|
|
23
|
+
- `~/.cursor/skills/reddit-strategy-shared/references/native-copy-profile.md` when the batch declared `AcceptanceProfile: NativeCopy`
|
|
21
24
|
|
|
22
25
|
## Required Inputs
|
|
23
26
|
|
|
@@ -25,6 +28,7 @@ Mandatory before running the structure gates:
|
|
|
25
28
|
- `memory/phase4-叙事指纹索引.md`
|
|
26
29
|
- `memory/phase4-撰写brief.md` (for the `Planned` structure values and `SampleSetID`)
|
|
27
30
|
- `memory/phase4-sku-基准表.md`
|
|
31
|
+
- `memory/phase4-board-quantity-plan.md` (per-board `SRPMode` + the locked `LockedPlanID`; needed to judge the board-distribution check, which is a hard constraint only under `SRPMode: Fallback`)
|
|
28
32
|
- `memory/phase4-执行表.md`
|
|
29
33
|
- `memory/phase4-撰写批次map.md`
|
|
30
34
|
- all batch draft files
|
|
@@ -34,7 +38,7 @@ Mandatory before running the structure gates:
|
|
|
34
38
|
- verifier output when available
|
|
35
39
|
- external post audit results
|
|
36
40
|
|
|
37
|
-
## Structure Checks (
|
|
41
|
+
## Structure Checks (all ten must pass)
|
|
38
42
|
|
|
39
43
|
Delivery is blocked unless every one of these verifies. This layer creates no
|
|
40
44
|
diversity by itself; it exists so the earlier three layers cannot be skipped.
|
|
@@ -89,11 +93,25 @@ diversity by itself; it exists so the earlier three layers cannot be skipped.
|
|
|
89
93
|
`this sub always...`), no invented identity, and no flaw inserted only to
|
|
90
94
|
look authentic.
|
|
91
95
|
|
|
92
|
-
**
|
|
96
|
+
10. **Persona Card preserved.** Every delivered main-post Key's
|
|
97
|
+
`PersonaCardRef` / `PersonaCardVersion` / `PersonaCardHash` equal the Brief's
|
|
98
|
+
assigned Card, and `PersonaCardSelfCheck: Pass` was recorded **against that
|
|
99
|
+
same version**. A self-check recorded against an earlier version is stale, not
|
|
100
|
+
a pass — a Card change invalidates every boundary check made under the old
|
|
101
|
+
one. A Card authored or edited downstream of `reddit-phase-brief` is a
|
|
102
|
+
failure with `FixOwnerSkill: reddit-phase-brief`, whichever skill wrote it.
|
|
103
|
+
A missing Card on a post row is a `BlockingGap`, never "no Card, so nothing
|
|
104
|
+
to check". Carry `PersonaCardAuthorizationStatus` through from the Brief:
|
|
105
|
+
`DeclaredOnly` does not block delivery, but the delivery record may not
|
|
106
|
+
describe that row's firsthand claims as authorised. Do not read `RoleLabels`
|
|
107
|
+
in this check, and do not report the Card as a verified identity or as
|
|
108
|
+
anything Hub assessed.
|
|
109
|
+
|
|
110
|
+
**Scope.** Checks 1–7 and 10 apply to **main-post Keys only** (`WindowScope: PostOnly`).
|
|
93
111
|
Comments, self-comments, and external comments need no fingerprint row, no
|
|
94
|
-
prototype mapping, no `StructureFamily`, no `SampleSetID`,
|
|
95
|
-
they still need Hub `completed/pass` plus `FinalDraftSha256`, and
|
|
96
|
-
still apply to them.
|
|
112
|
+
prototype mapping, no `StructureFamily`, no `SampleSetID`, no `AnchorSlot`, and no
|
|
113
|
+
Persona Card; they still need Hub `completed/pass` plus `FinalDraftSha256`, and
|
|
114
|
+
checks 8–9 still apply to them.
|
|
97
115
|
|
|
98
116
|
Missing index file, missing `Final` row for a post Key, zero or multiple active
|
|
99
117
|
rows for one Key, unlocked window parameters, or a missing/expired baseline are
|
|
@@ -113,6 +131,10 @@ introduced by rewriting, set `FixOwnerSkill: reddit-content-rewrite`.
|
|
|
113
131
|
- ContentOnly `completed/pass` is acceptable for a content handoff, but it is not a Phase 5 delivery pass and must show `AccountBindingStatus: Pending` and `ReadyForDelivery: No`.
|
|
114
132
|
- No AccountBound delivered item has unresolved `brandFitReviewRequired=true` or blocking `accountCandidateFeedback`; the approved `brandContext` and resolution are recorded.
|
|
115
133
|
- The review log covers every final draft, and any `revise` feedback is reflected in the exact delivered text. `degraded`, unavailable, or local-only review is a failure.
|
|
134
|
+
- Every dimension a Hub result marked `not_assessed` is carried into the delivery record as NotAssessed with its `notAssessedReason` — never as a low score, a passing score, or a partial check, and never averaged into any figure. The `score` left on such a dimension is diagnostic only. `unevaluatedDimensions` on a `degraded` result is a *different* thing (assessable but unanswered) and must not be reported as not-applicable. No delivery figure compares or averages scores across different `applicabilitySignature` values — a ContentOnly score and an AccountBound score are not the same measurement.
|
|
135
|
+
- Compliance evidence is still fresh **as of delivery**. Re-check the Compliance Output handoff's `EvidenceGatheredAt` / `EvidenceValidUntil` under the definition that handoff sets (`../reddit-strategy-shared/references/handoff-schemas.md`): they are batch-level **worst-case** scalars over the five delivery-required items (`RulesEvidenceStatus` / `PinnedEvidenceStatus` / `BotBannerEvidenceStatus` / `InstalledAppsStatus` / `AboutPageEvidenceStatus`) — earliest gathering time and earliest validity horizon. `EvidenceValidUntil` in the past, or `Unknown` on either scalar, holds the affected rows for re-gathering and re-judgement. A clearance recorded once at compliance time does not satisfy this.
|
|
136
|
+
- Separately from freshness: where the board's brand/vendor permission or a disclosure requirement was **never adjudicated**, it stays in `MissingEvidence` with the corresponding `PostRisk` / `CommentRisk` and needs a recorded human decision. This is not a freshness question and no timestamp resolves it — re-gathering evidence re-opens the question, it never answers it, and the answer is never inferred from a style profile's brand-friendliness note or from raw collected evidence.
|
|
137
|
+
- When the batch declared `AcceptanceProfile: NativeCopy`, `NativeCopyProfileStatus` is recorded and no row is `ReadyForDelivery: Yes` while it is `Unavailable(ServerContractMissing)`. A batch that was quietly re-labelled `Default` to release delivery, or whose review call was weakened until it succeeded and then counted as a profile pass, is a failure.
|
|
116
138
|
- No placeholders, unresolved evidence gaps, or unmerged side tables remain.
|
|
117
139
|
- Master Canvas has all 21 boards, including Data Support, MCP Status, and Verification Boundaries.
|
|
118
140
|
- Feishu draft delivery uses a single draft document unless the user explicitly requests otherwise.
|
|
@@ -137,6 +159,10 @@ introduced by rewriting, set `FixOwnerSkill: reddit-content-rewrite`.
|
|
|
137
159
|
- FingerprintHashIssues:
|
|
138
160
|
- HubStructureConflictIssues:
|
|
139
161
|
- FabricatedSignalIssues:
|
|
162
|
+
- PersonaCardIssues:
|
|
163
|
+
- NotAssessedReportingIssues:
|
|
164
|
+
- EvidenceFreshnessIssues:
|
|
165
|
+
- AcceptanceProfileIssues:
|
|
140
166
|
- PlaceholderIssues:
|
|
141
167
|
- RequiredFixes:
|
|
142
168
|
- DeliverySummary:
|
|
@@ -159,6 +185,13 @@ introduced by rewriting, set `FixOwnerSkill: reddit-content-rewrite`.
|
|
|
159
185
|
- FingerprintHashStatus: Matched / Mismatch / Pending
|
|
160
186
|
- HubStructureConflictStatus: None / Escalated
|
|
161
187
|
- FabricatedSignalStatus: None / Found
|
|
188
|
+
- PersonaCardStatus: Preserved / Drift / Missing / NotApplicable
|
|
189
|
+
- PersonaCardAuthorizationStatus: Authorized / DeclaredOnly / NotApplicable # carried through from the Brief; DeclaredOnly does not block but may not be reported as authorised
|
|
190
|
+
- EvidenceFreshnessStatus: Fresh / Expired / Unknown
|
|
191
|
+
- AcceptanceProfile: Default / NativeCopy
|
|
192
|
+
- NativeCopyProfileStatus: NotSelected / Unavailable(ServerContractMissing)
|
|
193
|
+
- LocalReviewIntent: accountBinding=<account_bound|persona_less>, brandTreatment=<managed_brand|organic> # carried through; local declaration only
|
|
194
|
+
- HubReviewScopeStatus: Unavailable(ServerContractMissing)
|
|
162
195
|
- ReviewMode: ContentOnly | AccountBound
|
|
163
196
|
- AccountBindingStatus: Pending | Resolved | NeedsReview
|
|
164
197
|
- ReadyForDelivery: Yes / No
|
|
@@ -31,7 +31,13 @@
|
|
|
31
31
|
[ ] Phase 4:正文按批次 Map 撰写,默认每批 8-10 条;帖评整组不拆时允许 8-12;末批可少于 8;无跳批丢包
|
|
32
32
|
[ ] Phase 4.0:执行表编号无冲突(自评编号与外部评论编号无重叠)
|
|
33
33
|
[ ] Phase 4.0:主帖含品牌词总数与 Master **Summary** 品牌词约定差值=0
|
|
34
|
-
[ ] Phase 4.0
|
|
34
|
+
[ ] Phase 4.0:板块分布符合 D6 口径(**不是无条件硬门禁**;判据取自
|
|
35
|
+
`memory/phase4-board-quantity-plan.md` 的逐板块 `SRPMode` 与 `LockedPlanID`,
|
|
36
|
+
该文件缺失才是阻断项)——
|
|
37
|
+
· 单一子版占比 ≤ 40% / 核心子版 ≤ 8 条(总帖 20 条时):**按该板块自己的 `SRPMode` 判**,
|
|
38
|
+
`Fallback` 为硬约束,`Full` / `Provisional` 降为 warning-level;
|
|
39
|
+
· 子版覆盖数 ≥ 4 个:**方案级**约束,仅当方案内全部板块均为 `Fallback` 时才硬执行,混合模式下为 warning-level;
|
|
40
|
+
· warning-level 项越界**不判不合格**,只需确认越界项已在 D6 方案约束快照里标注理由、方案已被用户锁定
|
|
35
41
|
[ ] Brand Risk:`memory/phase4-brand-risk-review.md` 已存在或有明确 low-risk waiver;所有 HoldForCompliance / HoldForHumanApproval / DoNotPublish 行已处理,不在交付稿中
|
|
36
42
|
[ ] Content Review:`memory/content-review-log.md` 已存在并覆盖每条交付帖子/评论;每条均有对应 Hub `executionStatus=completed` + `verdict=pass`,且最终交付审核为 `ReviewMode: AccountBound`、有真实 `accountId`、无未解决的 `brandFitReviewRequired=true` / 阻断型 `accountCandidateFeedback`;`ContentOnly` 只能作为内容交接结果,不能作为 Phase 5 发布通过;`degraded` / unavailable / 仅本地自检均不通过
|
|
37
43
|
[ ] 草稿文档唯一性:不存在「【更新】版」「第二套」等平行节;所有 URL 已原地填入,无占位符
|
|
@@ -4,37 +4,37 @@
|
|
|
4
4
|
"archiveSha256": "7af75a08d8779f0d4aa73e6fa0706e7fac82737da7eecc08adf8a02151619e0b",
|
|
5
5
|
"skills": {
|
|
6
6
|
"reddit-strategy-orchestrator": {
|
|
7
|
-
"contentSha256": "
|
|
7
|
+
"contentSha256": "9a4fa3944ec3913a4e68cb1faf4d4a32ca04131fa4b0c37e054065f4e2c1a1ed"
|
|
8
8
|
},
|
|
9
9
|
"reddit-strategy-shared": {
|
|
10
|
-
"contentSha256": "
|
|
10
|
+
"contentSha256": "bba5c177a4af9bab0f2d9c227993862629e82ec9747cd2788e4874d058da3c89"
|
|
11
11
|
},
|
|
12
12
|
"reddit-phase-research": {
|
|
13
|
-
"contentSha256": "
|
|
13
|
+
"contentSha256": "9f47b8eb0d1c1c194c685856242c9b22d190dfa8c6f572869e964239215795fe"
|
|
14
14
|
},
|
|
15
15
|
"reddit-phase-planning": {
|
|
16
|
-
"contentSha256": "
|
|
16
|
+
"contentSha256": "8080adce62b6db65be3dbc0f37f162a81e382d6b64108f7352ec83c356664659"
|
|
17
17
|
},
|
|
18
18
|
"reddit-phase-brief": {
|
|
19
|
-
"contentSha256": "
|
|
19
|
+
"contentSha256": "3475bf4c4aa4796db1c99a3bd527c52dc8488f71db01753da0325e924d552b99"
|
|
20
20
|
},
|
|
21
21
|
"reddit-content-writing": {
|
|
22
|
-
"contentSha256": "
|
|
22
|
+
"contentSha256": "08023a5dfa6cc2f3ffc3f1a551479c645ddcfc8cc775f88cd2d245c067829482"
|
|
23
23
|
},
|
|
24
24
|
"reddit-content-rewrite": {
|
|
25
|
-
"contentSha256": "
|
|
25
|
+
"contentSha256": "2f9dfdbb2410d060f755860b57ebc7c6776f4df343990029a8770855ecd33005"
|
|
26
26
|
},
|
|
27
27
|
"reddit-delivery-check": {
|
|
28
|
-
"contentSha256": "
|
|
28
|
+
"contentSha256": "9231ff9ae5d950bc2fb87e45bee05e793b3ff9c37bee45e8444059a8b698e4a9"
|
|
29
29
|
},
|
|
30
30
|
"reddit-voc-volume": {
|
|
31
|
-
"contentSha256": "
|
|
31
|
+
"contentSha256": "496c0d57af7507d86a16bd4d06f3a5a017ca10b3dc4e3564d82b0c988e1c87ac"
|
|
32
32
|
},
|
|
33
33
|
"reddit-brand-risk-response": {
|
|
34
34
|
"contentSha256": "dbba80345ebe68818a25e7604dfaa6951c6bf0e4d785d5013be7a06b22ec5b7c"
|
|
35
35
|
},
|
|
36
36
|
"reddit-subreddit-compliance": {
|
|
37
|
-
"contentSha256": "
|
|
37
|
+
"contentSha256": "3cab43d1c70d511212f3684929a8d7da73c11d3ae34563f31d1eebe04a6ecd8b"
|
|
38
38
|
},
|
|
39
39
|
"reddit-answers-research": {
|
|
40
40
|
"contentSha256": "eb132d81021f0a24619d9b576a287f722cf61c24422874d5be86cd4be2c392df"
|