@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.
Files changed (63) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/dist/cmd-manifest.json +4 -2
  3. package/dist/content-review.test.js +1 -1
  4. package/dist/index.d.ts +24 -0
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +98 -8
  7. package/dist/index.js.map +1 -1
  8. package/dist/register-calendar-directives.d.ts +64 -0
  9. package/dist/register-calendar-directives.d.ts.map +1 -0
  10. package/dist/register-calendar-directives.js +135 -0
  11. package/dist/register-calendar-directives.js.map +1 -0
  12. package/dist/register-calendar-directives.test.d.ts +2 -0
  13. package/dist/register-calendar-directives.test.d.ts.map +1 -0
  14. package/dist/register-calendar-directives.test.js +127 -0
  15. package/dist/register-calendar-directives.test.js.map +1 -0
  16. package/dist/scrape-output.test.d.ts +2 -0
  17. package/dist/scrape-output.test.d.ts.map +1 -0
  18. package/dist/scrape-output.test.js +58 -0
  19. package/dist/scrape-output.test.js.map +1 -0
  20. package/package.json +2 -2
  21. package/skills/README.md +23 -22
  22. package/skills/manifest.json +6 -1
  23. package/skills/reddit-content-rewrite/SKILL.md +29 -0
  24. package/skills/reddit-content-writing/SKILL.md +54 -5
  25. package/skills/reddit-content-writing/references/phase4-execution-table.md +24 -3
  26. package/skills/reddit-content-writing/references/phase4-writing.md +123 -3
  27. package/skills/reddit-content-writing/references/post-writing-templates.md +14 -6
  28. package/skills/reddit-delivery-check/SKILL.md +39 -6
  29. package/skills/reddit-delivery-check/references/phase5-delivery.md +7 -1
  30. package/skills/reddit-matrix.lock.json +10 -10
  31. package/skills/reddit-phase-brief/SKILL.md +62 -11
  32. package/skills/reddit-phase-brief/references/brand-SKU-PGC-rules.md +223 -36
  33. package/skills/reddit-phase-brief/references/phase4-brief-workflow.md +405 -19
  34. package/skills/reddit-phase-planning/SKILL.md +13 -0
  35. package/skills/reddit-phase-planning/references/phase4-execution-table.md +16 -2
  36. package/skills/reddit-phase-planning/references/phase4-planning.md +74 -15
  37. package/skills/reddit-phase-planning/references/scheduling-decision-procedure.md +386 -0
  38. package/skills/reddit-phase-research/SKILL.md +7 -1
  39. package/skills/reddit-phase-research/references/phase01-research.md +93 -29
  40. package/skills/reddit-strategy-orchestrator/SKILL.md +120 -18
  41. package/skills/reddit-strategy-shared/SKILL.md +4 -2
  42. package/skills/reddit-strategy-shared/references/content-diversity-contract.md +26 -5
  43. package/skills/reddit-strategy-shared/references/content-review-gate.md +48 -1
  44. package/skills/reddit-strategy-shared/references/context-contract.md +45 -11
  45. package/skills/reddit-strategy-shared/references/evidence-policy.md +139 -0
  46. package/skills/reddit-strategy-shared/references/handoff-schemas.md +88 -3
  47. package/skills/reddit-strategy-shared/references/native-copy-profile.md +207 -0
  48. package/skills/reddit-strategy-shared/references/path-conventions.md +26 -4
  49. package/skills/reddit-strategy-shared/references/persona-card-contract.md +210 -0
  50. package/skills/reddit-strategy-shared/references/prerequisites/README.md +57 -0
  51. package/skills/reddit-strategy-shared/references/prerequisites/{reddit-master-canvas-agent-prompt-template.md → archive/reddit-master-canvas-agent-prompt-template.md} +7 -0
  52. package/skills/reddit-strategy-shared/references/prerequisites/{reddit-sop-v2-universal.md → archive/reddit-sop-v2-universal.md} +7 -0
  53. package/skills/reddit-strategy-shared/references/prerequisites/{reddit-strategy-prerequisites-read.md → archive/reddit-strategy-prerequisites-read.md} +7 -0
  54. package/skills/reddit-strategy-shared/references/prerequisites/{reddit-strategy-reuse-playbook.md → archive/reddit-strategy-reuse-playbook.md} +7 -0
  55. package/skills/reddit-strategy-shared/references/subreddit-research-profile.md +514 -0
  56. package/skills/reddit-strategy-shared/references/version-manifest.md +89 -2
  57. package/skills/reddit-subreddit-compliance/SKILL.md +28 -1
  58. package/skills/reddit-voc-volume/matrix-contract.md +16 -1
  59. package/skills/social-hub-calendar-directives/SKILL.md +548 -0
  60. package/skills/social-hub-calendar-jobs/SKILL.md +10 -0
  61. package/skills/social-hub-cli/SKILL.md +2 -0
  62. package/skills/social-hub-notifications/SKILL.md +7 -0
  63. package/skills/social-hub-publishing/SKILL.md +5 -0
@@ -0,0 +1,210 @@
1
+ # Persona Card Contract
2
+
3
+ The **Persona Card** is the per-draft posting context: why this account is
4
+ posting this now, what it may legitimately be assumed to know, what it must not
5
+ claim to know, and which firsthand experience claims are authorised.
6
+
7
+ It is a **Brief-stage artifact**. The writer never authors one.
8
+
9
+ **Scope: `ArtifactType: Post` only.** Comments, replies, and titles carry no
10
+ Persona Card and no `PersonaCardRef`. The full knowledge-boundary and disclosure
11
+ judgement for comments is a later stage of work; do not let this contract turn
12
+ into a required field on comment rows.
13
+
14
+ ## 1. Why it is not part of the persona record
15
+
16
+ `personas` / `account_personas` describe **WHO** the account is — archetype, age
17
+ range, occupation, tone, avoid-topics, style guide. Those are stable.
18
+
19
+ `postingWhy`, this draft's `knows` / `doesNotKnow`, this draft's brand
20
+ relationship, and the facts this draft is allowed to use are **per-submission**.
21
+ Their lifecycle is the draft's, not the persona's. Recording them on the persona
22
+ would make every later draft inherit one draft's context.
23
+
24
+ `avoidTopics` / `avoidPatterns` say what the account **should not say**. The Card
25
+ says what the account **does not know**. These are different constraints and one
26
+ does not substitute for the other.
27
+
28
+ ## 2. Capability model, not role taxonomy
29
+
30
+ The Card describes **access and permitted claims**, never a role name.
31
+
32
+ ```markdown
33
+ PersonaCardRef: # stable local id, unique per post ContentKey
34
+ PersonaCardVersion: # integer, incremented by reddit-phase-brief only
35
+ PersonaCardHash: # sha256 over the normalised Card body
36
+
37
+ # ── stable capability fields ──
38
+ knowledgeAccess: # exactly one: research | owned | used | observed | supplied_by_brand
39
+ permittedExperienceClaims: # subset of the closed set {ownership, delivery, wear, service}; may be empty
40
+ attentionFocus: # what this account actually cares about in this category
41
+ questionIntent: # what it is actually trying to find out, if anything
42
+
43
+ # ── per-draft fields ──
44
+ postingWhy: # why this account is posting this, now
45
+ knows: # list; what it may be assumed to know here
46
+ doesNotKnow: # list; what it must not display knowledge of here
47
+ permittedFactRefs: # references to approved product facts usable in this draft
48
+ brandRelationshipDisclosed: # Yes | No | NotApplicable — what the draft states, not what is true
49
+
50
+ # ── provenance ──
51
+ DeclaredBy: # who authorised this Card's claims (person or role), not the agent
52
+ ClaimAuthorizationRef: # the submitted material that authorises permittedExperienceClaims
53
+
54
+ # ── transport ──
55
+ PersonaCardTransportStatus: LocalOnly(ServerContractMissing)
56
+ PersonaCardAuthorizationStatus: Authorized | DeclaredOnly | NotApplicable
57
+ RoleLabels: # optional, non-authoritative; see §3
58
+ ```
59
+
60
+ `knowledgeAccess` is single-valued because it answers "where did this account's
61
+ information come from". `permittedExperienceClaims` is a multi-select closed set
62
+ because one account can legitimately be authorised for some firsthand claims and
63
+ not others — "may say the item arrived" and "may describe wearing it" are
64
+ separate authorisations.
65
+
66
+ An empty `permittedExperienceClaims` is a valid, common Card. It means the draft
67
+ may discuss the category from research or observation and may **not** claim
68
+ ownership, delivery, wear, or service experience.
69
+
70
+ ## 3. Role names are labels, never judgement
71
+
72
+ `Researcher` / `Owner` / `GiftBuyer` / `CategoryEnthusiast` / `LifestyleUser` may
73
+ appear in `RoleLabels` as a convenience for humans reading the Brief. They are
74
+ **not** a classification, **not** exhaustive, and **never** the basis of any
75
+ check.
76
+
77
+ One account is legitimately both an Owner and a CategoryEnthusiast. No role name
78
+ can express "may this draft say the parcel arrived" — only
79
+ `permittedExperienceClaims` can. Any check that reads `RoleLabels` instead of the
80
+ capability fields is wrong.
81
+
82
+ Likewise, do not derive a rule such as "a gift buyer must not discuss
83
+ specifications". Buying a gift for a technical hobbyist makes specifications the
84
+ core of the post.
85
+
86
+ ## 4. Lifecycle: assigned, never improvised
87
+
88
+ The Card is the **third** `PrewritingControlField`, alongside `AssignedFlair` and
89
+ `PostingTrigger`. Same discipline as those two:
90
+
91
+ | Stage | Duty |
92
+ | ------------------------ | ------------------------------------------------------------------------------- |
93
+ | `reddit-phase-brief` | **Owns** the Card. Creates it, versions it, writes `PersonaCardRef` per post Key |
94
+ | `reddit-content-writing` | Reads it. Writes within it. May not author, extend, or reinterpret it |
95
+ | `reddit-content-rewrite` | Reads it. Preserves `PersonaCardRef`. May not author or edit one |
96
+ | `reddit-delivery-check` | Verifies the delivered row's `PersonaCardRef` / `PersonaCardHash` match the Brief |
97
+
98
+ A draft that needs a knowledge boundary the Card does not grant is a
99
+ `BlockingGap` back to `reddit-phase-brief` for a new Card version — not a local
100
+ edit and not a Card the writer fills in. Letting the writer author the Card
101
+ re-opens exactly the bypass that pre-assignment exists to close: the writer would
102
+ grant itself whatever boundary the draft it already wrote happens to need.
103
+
104
+ Changing the Card bumps `PersonaCardVersion` and invalidates `PersonaCardHash`
105
+ downstream: any row already checked against the old hash must be re-checked.
106
+
107
+ ## 5. What the Card does **not** establish
108
+
109
+ - **It does not verify identity.** In ContentOnly / persona-less work the Card is
110
+ a *declared, auditable posting context* and nothing more. Never report it as a
111
+ confirmed account persona check, and never let its presence imply the posting
112
+ account was resolved.
113
+ - **It does not prove any experience is real.** No local check and no model can
114
+ establish that a parcel actually arrived. The Card records what is
115
+ **authorised**, and authorisation comes from the submitted context, not from
116
+ inference about the relationship.
117
+ - **A Card without provenance records a declaration, not an authorisation.**
118
+ `PersonaCardHash` makes a Card tamper-evident; it says nothing about who granted
119
+ the claims in it. `DeclaredBy` + `ClaimAuthorizationRef` are what make
120
+ `permittedExperienceClaims` auditable. A Card carrying `permittedExperienceClaims`
121
+ with neither field is describing what the Brief asserted, and must be reported
122
+ that way — never as an authorised claim set. The generating agent is never a
123
+ valid `DeclaredBy`.
124
+
125
+ This distinction must survive the handoff, or it is unauditable: a downstream
126
+ reader seeing only "self-check passed" and "reference preserved" cannot tell an
127
+ authorised claim set from an asserted one. So the Brief sets
128
+ `PersonaCardAuthorizationStatus` and every stage carries it through:
129
+
130
+ | Value | Meaning |
131
+ | --------------- | ------------------------------------------------------------------------------------ |
132
+ | `Authorized` | `permittedExperienceClaims` non-empty, with both `DeclaredBy` and `ClaimAuthorizationRef` |
133
+ | `DeclaredOnly` | `permittedExperienceClaims` non-empty, provenance incomplete — a Brief assertion |
134
+ | `NotApplicable` | `permittedExperienceClaims` empty — there is no experience claim to authorise |
135
+
136
+ `DeclaredOnly` does not by itself block: the local boundary check still runs and
137
+ the Hub gate is unchanged. It does mean no output may describe the claim set as
138
+ authorised, and it is the honest state to report to a client asking on what
139
+ basis a firsthand claim was permitted. Like the rest of the Card, this status is
140
+ local and is never sent to Hub.
141
+ - **A brand relationship does not by itself make a firsthand claim false.** A
142
+ partner may genuinely own the product. The only self-evident contradiction is a
143
+ draft asserting an experience type the Card did not authorise.
144
+
145
+ ## 6. Firsthand markers are evidence, not violations
146
+
147
+ Phrases such as "mine arrived", "I've had it since", "after a month of wearing
148
+ it" are **markers**, not offences. `mine arrived` is unremarkable when
149
+ `permittedExperienceClaims` includes `delivery`.
150
+
151
+ A marker matters only when it contradicts the Card: the draft claims an
152
+ experience type the Card did not authorise, or displays knowledge listed in
153
+ `doesNotKnow`. Report the contradiction, cite both the phrase and the Card field
154
+ it contradicts, and route back to Brief. Never flag a marker on its own.
155
+
156
+ ## 7. Transport boundary — the Card stays local
157
+
158
+ **`PersonaCardTransportStatus` is `LocalOnly(ServerContractMissing)`.**
159
+
160
+ Social Hub has no field for the Card on the post-review or content-review
161
+ request, and both request schemas are strict: an extra field is a request
162
+ rejection, not an ignored key. Do not add the Card, any of its fields, or a
163
+ Card-derived score to a Hub review call. Do not restructure the Card into an
164
+ existing free-text field (`subredditRules`, thread context) to smuggle it
165
+ through — that injects planner text into a prompt slot reserved for other
166
+ evidence.
167
+
168
+ So the Card governs **writing**: Brief assigns the boundary, the writer stays
169
+ inside it, delivery verifies the reference was preserved. Hub review runs
170
+ unchanged alongside it, and the Card changes nothing about how a Hub verdict is
171
+ read or reported.
172
+
173
+ The local boundary check therefore reports only what it is: a local check.
174
+ `ClaimEvidenceStatus` (`references/evidence-policy.md`) remains the authority on
175
+ whether a claim may appear in publishable text; the Card adds *who may claim it*
176
+ on top of *whether it is sourced*. Do not describe a local Card check as a review,
177
+ a verdict, a dimension, or a pass.
178
+
179
+ ## 8. Local boundary self-check (writing side)
180
+
181
+ Before handing a draft to Hub review, for each post row:
182
+
183
+ 1. Every firsthand experience claim in the draft maps to an entry in
184
+ `permittedExperienceClaims`.
185
+ 2. Nothing in the draft displays knowledge listed in `doesNotKnow`.
186
+ 3. Every substantive product claim still satisfies `ClaimEvidenceStatus`
187
+ (`Cited` or `ExternallyVerified`) — the Card never relaxes this.
188
+ 4. The draft's stated relationship matches `brandRelationshipDisclosed`.
189
+ 5. `postingWhy` is consistent with the assigned `PostingTrigger`. These are
190
+ different fields and neither replaces the other: `PostingTrigger` is the
191
+ controlled five-value reason the post is worth making now
192
+ (`references/content-diversity-contract.md`), `postingWhy` is this account's
193
+ own reason for making it. A draft whose `postingWhy` cannot coexist with the
194
+ assigned `PostingTrigger` is a `BlockingGap` back to Brief.
195
+
196
+ Record the outcome as `PersonaCardSelfCheck: Pass | BlockingGap`, with the
197
+ contradicting phrase and Card field for every gap. This is a local pre-submission
198
+ check. It never substitutes for Hub review and never produces a score.
199
+
200
+ ## 9. Deferred Hub mapping
201
+
202
+ The plan `docs/reddit-native-copy-integration-plan.md` (§2, §3.4, §6.4) intends a
203
+ server-side knowledge-boundary judgement that would consume a persisted,
204
+ snapshotted version of this Card. That contract does not exist yet: there is no
205
+ request field, no persisted snapshot, and no corresponding review dimension.
206
+
207
+ This note is informational. Until such a contract ships and its capability is
208
+ echoed by the server, no skill may name a knowledge-boundary review dimension,
209
+ report a knowledge-boundary review status, or claim any part of the Card was
210
+ assessed by Hub.
@@ -0,0 +1,57 @@
1
+ # prerequisites/ — 归档区索引
2
+
3
+ | 路径 | AgentReadPolicy |
4
+ | ----------------------- | ------------------------------------------ |
5
+ | `prerequisites/archive/`| **DoNotRead** — 仅供人工查阅 |
6
+ | 本文件 `README.md` | 可读,但**不是必读**;它只是索引,不含规则 |
7
+
8
+ `archive/` **不属于任何 skill 的运行上下文**。全流程任务(orchestrator → research →
9
+ planning → brief → writing → delivery)在任何阶段都**不得**读取 `archive/` 下的文件,
10
+ 也不得把其中任何内容当作 gate、schema、字段清单、结构规则或写作规范。本 README 本身
11
+ 只做「谁是权威」的转发和缺口登记,读它不会把 legacy 规则带进上下文。
12
+
13
+ ## 为什么
14
+
15
+ `archive/` 下的四份文件归档前共 1,994 行(现为 2,026 行,多出的是本轮加的归档 banner),全部标注 `LegacyStatus: Superseded`,
16
+ 文件自己声明「不得执行其中的任何 gate / schema / 结构规则」。但它们的正文与
17
+ active 契约**逐条重复**(2:8 配比、P-NB→C-B 互补、编号预分配、板块 ≤40%、
18
+ 品牌词聚合验证、外部评论 URL 规程等),模型无法区分「声明不作数」与
19
+ 「内容看起来是硬规则」,结果是 Phase 0 之前先吞 2,488 行(shared 契约 5 份 494 行 + 本目录 1,994 行)、其中 80.1% 是噪声。
20
+ 这些重复的规则在 active 文件里都有权威版本(见下表),legacy 版本只是复述。
21
+
22
+ ## 现在谁是权威
23
+
24
+ | 主题 | 权威文件(active) |
25
+ | ----------------------------- | ------------------------------------------------------------------------- |
26
+ | 结构 / 帖型 / StructureFamily | `reddit-strategy-shared/references/content-type-routing-contract.md` |
27
+ | 执行表 19 列 + 门禁 | `reddit-phase-planning/references/phase4-execution-table.md` + `scripts/phase406_verify.py` |
28
+ | 编号预分配 / 板块分布 / 品牌词聚合 | `reddit-phase-planning/references/phase4-planning.md` |
29
+ | 21 板 Master Canvas | `reddit-phase-planning/references/phase3-master-canvas.md` |
30
+ | VOC 四维采样 / 缺口矩阵 | `reddit-phase-research/references/phase01-research.md` |
31
+ | 品牌词互补 / 2:8 | `reddit-content-writing/references/phase4-post-rules.md` |
32
+ | 逐帖终检 | `reddit-content-rewrite` 三层终检清单 |
33
+ | 证据与验证边界 | `reddit-strategy-shared/references/evidence-policy.md` |
34
+ | 板块研究画像(SRP) | `reddit-strategy-shared/references/subreddit-research-profile.md` |
35
+ | 排期决策(板块 / flair / 数量配比) | `reddit-phase-planning/references/scheduling-decision-procedure.md`(D1–D7) |
36
+ | 停下来问人的 12 个决策点 | `reddit-strategy-orchestrator/SKILL.md` §Human Decision Points |
37
+
38
+ ## ✅ 已回填的规则真空(曾只在 archive,现已有 active 权威版本)
39
+
40
+ 下面两条原本**只**存在于 archive,已按原意搬进 active 文件(未扩写、未新增规则)。
41
+ **权威版本在 active,本表只做溯源**;archive 仍然不读。
42
+
43
+ | 原缺口 | archive 出处 | 现在的 active 权威位置 | 状态 |
44
+ | ------------------------ | --------------------------------------- | -------------------------------------------------------------------------------------- | ---- |
45
+ | 「量」换算与总盘子 | `reddit-strategy-reuse-playbook.md` §8.2 | `reddit-phase-planning/references/phase4-planning.md` 步骤 **4.0.0.0**(+ Phase 4.0.0 门禁一条;启动变量登记在 `context-contract.md`) | 已回填 |
46
+ | 外部评论的 A/B readout 口径 | `reddit-strategy-reuse-playbook.md` §8.3 / §12 | `reddit-phase-planning/references/phase4-planning.md` Phase **4.0.5** A/B 口径框(`context-contract.md` 启动变量记默认值) | 已回填 |
47
+
48
+ 另有一条**疑似已废弃**、不确定是否还要:playbook §8.4 要求 B 组唯一变量同时包含
49
+ **Ahrefs query** 与 **ChatGPT fanout**;active(`reddit-phase-planning/references/phase4-planning.md`)
50
+ 只保留了 fanout。若现行设计就是 fanout-only,这是有意收窄,不是真空。
51
+
52
+ ## 什么时候人可以看 archive/
53
+
54
+ 只在做 SOP 考古时:想知道某条规则**当初为什么这么定**、某个数字(如 9+3、
55
+ 2:8)的历史来源、或者对比 v1 → v2 的演进。**人**读,**agent** 不读。
56
+ 需要把 archive 里的某条规则重新变成硬规则时,正确做法是把它**搬进上表的
57
+ active 文件**并走版本号,而不是恢复对本目录的强制阅读。
@@ -1,5 +1,12 @@
1
1
  # Reddit Master Canvas Agent Prompt 模板
2
2
 
3
+ > ## ⛔ ARCHIVED — AgentReadPolicy: DoNotRead
4
+ >
5
+ > 本文件已移出 skill 运行上下文,**仅供人工查阅 SOP 历史背景**。
6
+ > agent 在任何阶段都不得读取本文件,也不得引用其中任何内容作为
7
+ > gate / schema / 字段清单 / 结构规则 / 写作规范。权威来源见
8
+ > `../README.md` 的对照表。
9
+
3
10
  **结论:** 这份模板的目标,是让任意一个 agent 在更换 topic、产品、关键词和数据源后,仍然能稳定产出与当前 Soundcore Reddit master canvas 同构的总控文档。**建议用法:** 先填写任务变量区,再把后面的标准 Agent Prompt 整段复制给下一个 agent。**主要风险:** 如果输入数据不完整,agent 很容易跳过证据层直接写策略,导致框架还在,但可信度不足。
4
11
 
5
12
  ## 模板目标
@@ -1,5 +1,12 @@
1
1
  # Reddit GEO 策略 SOP v2 — 任意品牌通用入口
2
2
 
3
+ > ## ⛔ ARCHIVED — AgentReadPolicy: DoNotRead
4
+ >
5
+ > 本文件已移出 skill 运行上下文,**仅供人工查阅 SOP 历史背景**。
6
+ > agent 在任何阶段都不得读取本文件,也不得引用其中任何内容作为
7
+ > gate / schema / 字段清单 / 结构规则 / 写作规范。权威来源见
8
+ > `../README.md` 的对照表。
9
+
3
10
  > Path note: shell examples use macOS/Linux `~/.cursor/skills/...`. On Windows PowerShell, use `$HOME\.cursor\skills\...` or `$SkillsRoot = Join-Path $HOME ".cursor\skills"`, replace `python3` with `py -3`, and replace line-continuation `\` with backtick `` ` ``.
4
11
  >
5
12
  > v2.12.19 authority note: Phase 0 is **three-source collaboration**: eclickkb fact verification + KG markdown positioning narrative + client information sheet. The current authoritative execution details live in `reddit-phase-research/references/phase01-research.md`; if this legacy universal entry is less specific, follow the matrix research skill and shared contracts.
@@ -1,5 +1,12 @@
1
1
  # Reddit 策略启动前必读
2
2
 
3
+ > ## ⛔ ARCHIVED — AgentReadPolicy: DoNotRead
4
+ >
5
+ > 本文件已移出 skill 运行上下文,**仅供人工查阅 SOP 历史背景**。
6
+ > agent 在任何阶段都不得读取本文件,也不得引用其中任何内容作为
7
+ > gate / schema / 字段清单 / 结构规则 / 写作规范。权威来源见
8
+ > `../README.md` 的对照表。
9
+
3
10
  **结论:** 只提供 Playbook 不够。Playbook 是「怎么做的 SOP」,品牌、地域、型号、Geoly、关键词文件等仍须你(或业务方)按 Playbook 第 15 节提供;缺 P0 时,Agent 只能写框架或标「无法验证」,没法做出与 soundcore 那套同等级数据型策略。
4
11
 
5
12
  ## 你最少还要准备什么(对齐 Playbook 第 15.1 P0)
@@ -1,5 +1,12 @@
1
1
  # Reddit 策略复用 Playbook(跨品牌 SOP v2)
2
2
 
3
+ > ## ⛔ ARCHIVED — AgentReadPolicy: DoNotRead
4
+ >
5
+ > 本文件已移出 skill 运行上下文,**仅供人工查阅 SOP 历史背景**。
6
+ > agent 在任何阶段都不得读取本文件,也不得引用其中任何内容作为
7
+ > gate / schema / 字段清单 / 结构规则 / 写作规范。权威来源见
8
+ > `../README.md` 的对照表。
9
+
3
10
  > Path note: shell examples use macOS/Linux `~/.cursor/skills/...`. On Windows PowerShell, use `$HOME\.cursor\skills\...` or `$SkillsRoot = Join-Path $HOME ".cursor\skills"`, replace `python3` with `py -3`, and replace line-continuation `\` with backtick `` ` ``.
4
11
  >
5
12
  > v2.12.19 authority note: Phase 0 is now **three-source collaboration**: eclickkb fact verification + KG markdown positioning narrative + client information sheet. If this legacy playbook sounds like "语料库 + 知识图谱" only, follow `reddit-phase-research/references/phase01-research.md` and the shared contracts instead. Client brief fields are Phase 0 required inputs, not Phase 1.5 optional follow-up.