@geoly-ai/social-hub-cli 0.3.17 → 0.3.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/cmd-manifest.json +5 -2
  3. package/dist/cmd-manifest.test.js +3 -0
  4. package/dist/cmd-manifest.test.js.map +1 -1
  5. package/dist/index.d.ts +24 -0
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +74 -9
  8. package/dist/index.js.map +1 -1
  9. package/dist/permissions-gates-admin.d.ts.map +1 -1
  10. package/dist/permissions-gates-admin.js +12 -0
  11. package/dist/permissions-gates-admin.js.map +1 -1
  12. package/dist/register-extensions.d.ts.map +1 -1
  13. package/dist/register-extensions.js +15 -1
  14. package/dist/register-extensions.js.map +1 -1
  15. package/dist/register-feishu-identities.d.ts +47 -0
  16. package/dist/register-feishu-identities.d.ts.map +1 -0
  17. package/dist/register-feishu-identities.js +346 -0
  18. package/dist/register-feishu-identities.js.map +1 -0
  19. package/dist/register-feishu-identities.test.d.ts +2 -0
  20. package/dist/register-feishu-identities.test.d.ts.map +1 -0
  21. package/dist/register-feishu-identities.test.js +124 -0
  22. package/dist/register-feishu-identities.test.js.map +1 -0
  23. package/dist/scrape-output.test.d.ts +2 -0
  24. package/dist/scrape-output.test.d.ts.map +1 -0
  25. package/dist/scrape-output.test.js +58 -0
  26. package/dist/scrape-output.test.js.map +1 -0
  27. package/package.json +3 -3
  28. package/skills/manifest.json +1 -1
  29. package/skills/reddit-content-writing/SKILL.md +1 -1
  30. package/skills/reddit-content-writing/references/phase4-execution-table.md +24 -3
  31. package/skills/reddit-content-writing/references/phase4-writing.md +123 -3
  32. package/skills/reddit-content-writing/references/post-writing-templates.md +14 -6
  33. package/skills/reddit-delivery-check/SKILL.md +1 -0
  34. package/skills/reddit-delivery-check/references/phase5-delivery.md +7 -1
  35. package/skills/reddit-matrix.lock.json +8 -8
  36. package/skills/reddit-phase-brief/SKILL.md +25 -9
  37. package/skills/reddit-phase-brief/references/brand-SKU-PGC-rules.md +223 -36
  38. package/skills/reddit-phase-brief/references/phase4-brief-workflow.md +364 -18
  39. package/skills/reddit-phase-planning/SKILL.md +13 -0
  40. package/skills/reddit-phase-planning/references/phase4-execution-table.md +16 -2
  41. package/skills/reddit-phase-planning/references/phase4-planning.md +74 -15
  42. package/skills/reddit-phase-planning/references/scheduling-decision-procedure.md +386 -0
  43. package/skills/reddit-phase-research/SKILL.md +7 -1
  44. package/skills/reddit-phase-research/references/phase01-research.md +93 -29
  45. package/skills/reddit-strategy-orchestrator/SKILL.md +120 -18
  46. package/skills/reddit-strategy-shared/SKILL.md +4 -2
  47. package/skills/reddit-strategy-shared/references/content-diversity-contract.md +19 -3
  48. package/skills/reddit-strategy-shared/references/context-contract.md +45 -11
  49. package/skills/reddit-strategy-shared/references/evidence-policy.md +139 -0
  50. package/skills/reddit-strategy-shared/references/handoff-schemas.md +16 -1
  51. package/skills/reddit-strategy-shared/references/path-conventions.md +26 -4
  52. package/skills/reddit-strategy-shared/references/prerequisites/README.md +57 -0
  53. package/skills/reddit-strategy-shared/references/prerequisites/{reddit-master-canvas-agent-prompt-template.md → archive/reddit-master-canvas-agent-prompt-template.md} +7 -0
  54. package/skills/reddit-strategy-shared/references/prerequisites/{reddit-sop-v2-universal.md → archive/reddit-sop-v2-universal.md} +7 -0
  55. package/skills/reddit-strategy-shared/references/prerequisites/{reddit-strategy-prerequisites-read.md → archive/reddit-strategy-prerequisites-read.md} +7 -0
  56. package/skills/reddit-strategy-shared/references/prerequisites/{reddit-strategy-reuse-playbook.md → archive/reddit-strategy-reuse-playbook.md} +7 -0
  57. package/skills/reddit-strategy-shared/references/subreddit-research-profile.md +514 -0
  58. package/skills/reddit-strategy-shared/references/version-manifest.md +29 -2
  59. package/skills/reddit-voc-volume/SKILL.md +2 -7
  60. package/skills/reddit-voc-volume/matrix-contract.md +20 -4
  61. package/skills/reddit-voc-volume/references/arctic-shift.md +2 -1
  62. package/skills/reddit-voc-volume/scripts/reddit_voc_volume.py +157 -69
  63. package/skills/reddit-voc-volume/tests/test_archived_comments.py +104 -0
  64. package/skills/social-hub-admin/SKILL.md +47 -1
  65. package/skills/social-hub-cli/SKILL.md +1 -0
  66. package/skills/social-hub-posts/SKILL.md +14 -1
@@ -70,3 +70,142 @@ Use this file to resolve conflicts between Reddit strategy sources. If older pla
70
70
  - The next phase may start only when the response shows `readyForNextSkill=true` and `blockingIssues=[]`. Missing fields / blocking issues must be resolved. If the user explicitly accepts a partial handoff, the waiver MUST be written back to Hub (re-run `handoff-create` with the waiver recorded in the payload, e.g. `weeklyReportWaiver` or an explicit `partialAcceptedBy` field) so the new handoff itself becomes ready — local bypass without a Hub-persisted waiver is NOT allowed.
71
71
  - Standalone single-skill runs are encouraged but not required to persist handoffs.
72
72
  - Local `memory/*.md` files remain the working copy for one release cycle (dual-write); each memory file SHOULD record the associated Hub `runId`(s) and handoff id for traceability. Do not delete local memory in this release.
73
+
74
+ ---
75
+
76
+ # 证据门(Gates)
77
+
78
+ 本节把上面的来源分层与冲突消解落成**可检查的门禁**。门禁编号是稳定标识,下游 skill 引用时用编号
79
+ (如 `G3`),不要复述规则正文——复述会分叉。
80
+
81
+ ## G3 · URL 存活状态三字段
82
+
83
+ **规则.** 任何产出中出现的 Reddit URL,只要它**被当作证据**(支撑某个结论、被列为对标帖、被引用为
84
+ 样本或先例),就必须**可追溯到一次真实采集记录**,并带齐存活状态三字段
85
+ (**观测时刻 + 核验时刻 + 当前状态**):
86
+
87
+ ```yaml
88
+ ObservedAt: # 三字段之一(必填):这条 URL 被真实采集到的时刻
89
+ ArchivedObservedAt: # ObservedAt 在归档来源(如 Arctic)上的具体形态;
90
+ # live-only 来源填 null 并注明,不得为了凑字段编一个归档时刻
91
+ LastVerifiedAt: # 三字段之二(必填):最近一次状态核验时刻
92
+ CurrentStatus: # 三字段之三(必填):Live | Removed | Deleted | Unknown
93
+ EvidenceRef: # 指回采集记录(run / evidence / sample)——「可追溯」的落点
94
+ ```
95
+
96
+ **适用面(避免过宽):**
97
+
98
+ | URL 类型 | 是否受 G3 约束 |
99
+ |---|---|
100
+ | **证据 URL**(支撑结论、对标帖、样本、先例) | **受约束**,三字段齐全 |
101
+ | **导航/参考 URL**(板块首页、规则页链接等纯导航,不作为结论依据) | 不受约束 |
102
+ | **历史研究样本** | 受约束,但**允许 `CurrentStatus: Removed`**(历史存在过是有效事实) |
103
+ | **当期排期用 URL**(排期对标帖、要去回复的外部评论) | 受约束,且必须 `CurrentStatus: Live` |
104
+
105
+ **`Live` 的定义不等于「每次都直连 Reddit」。** Hub-First 允许新鲜缓存直接消费、零 Reddit 请求
106
+ (`reddit-voc-volume/references/hub-first.md` L1)。因此:
107
+
108
+ > `CurrentStatus: Live` = **Hub 当前状态记录仍在 freshness window 内**,或经过一次明确的 live probe。
109
+
110
+ 没有新鲜状态记录时 → `Unknown` → **hold**,不得把 stale 或 `failed` 当成 `Live`。这条与 Hub-First
111
+ 的缓存优先原则不冲突:G3 要求的是「有新鲜的状态事实」,不是「必须重新请求」。
112
+
113
+ **数量不足时诚实少给,禁止补齐。** 需要 10 条对标帖只核到 6 条 → 给 6 条 + 记缺口,
114
+ **不得**用未核验、编造、或从别处凑来的 URL 补到 10。
115
+
116
+ **与既有枚举的映射(G3 是消费口径,不是新建的存储枚举):**
117
+
118
+ | 既有来源 | 既有取值 | 映射到 `CurrentStatus` |
119
+ |---|---|---|
120
+ | 帖子/评论存活观测(`packages/contracts/src/reddit-post-survival.ts`) | `alive` / `dead` / `unknown` / `unsupported` | `Live` / `Removed`\|`Deleted`(按来源给出的删除类型)/ `Unknown` / `Unknown` |
121
+
122
+ **`subreddit_evidence` 的 `available` / `not_visible` / `failed` 不参与本映射。** 那是**板块证据
123
+ 页面/项目**的可见性,与某条帖子 URL 的存活是两个正交的轴:rules 页不可见推不出任何帖子被移除。
124
+ 把 `not_visible` 映射成 `CurrentStatus: Removed` 是类型错误,禁止。
125
+
126
+ 来源未区分「版主移除」与「作者自删」时,**不得猜**——填 `Removed` 或 `Deleted` 之一都是编造,
127
+ 应填 `Unknown` 并在 note 说明。**「作者账号已注销」是正交属性**,不等于帖子被删,不得映射成
128
+ `Deleted`。存活状态出现 `dead → alive` 这类冲突时按既有约定交人工,G3 不静默翻转。
129
+
130
+ **保留既有语义:** `failed` ≠「不存在」;只有页面明确显示不存在(`not_visible`)才是负证据。
131
+ 采集时点的 `_removed` 标记只反映采集时点,不等于当前状态——当前状态看 `LastVerifiedAt` +
132
+ `CurrentStatus`。
133
+
134
+ **失败后果.** 缺字段或 `CurrentStatus: Unknown` 的证据 URL → 从该结论的证据集中剔除;
135
+ 若剔除后结论失去支撑 → `BlockingGap`。
136
+
137
+ ## G5 · 来源职责矩阵
138
+
139
+ 上面的 Source Layers 表已经写清了**每层是什么**;G5 补的是**每层能支撑什么结论、不能支撑什么**。
140
+ 来源类型 × 结论类型是一个合法矩阵,越界即证据不成立——**不是「弱证据」,是「无证据」**。
141
+
142
+ | 来源 | 可支撑 | **不可支撑** |
143
+ |---|---|---|
144
+ | `eclickkb` / 品牌 KB | SKU、规格、价格、产品事实 | subreddit 帖型可行性、板块风格、合规裁决、禁用话术清单 |
145
+ | 客户约束材料(info sheet / 合同 / 书面确认) | 禁用话术、优先 SKU、竞品提及许可、目标市场、交付量 | 产品规格真值、版规、板块分布 |
146
+ | KG markdown(`kg-reddit-check`) | positioning、场景、叙事方向 | 产品规格、版规、板块分布 |
147
+ | Hub **帖子样本**(hot-posts / 历史帖 / 全窗口采样) | SRP 的帖子分布、内容类型、互动样本、标题风格 | 版规结论、发布放行(**样本 ≠ 规则证据**;规则证据见下一行,它是有效的**原始**规则来源) |
148
+ | Hub `rules`/`wiki`/`about`/`submit_text`/`pinned`/`flair` 原始证据 | compliance 的**输入** | 直接宣布「允许 / 禁止」(那是 compliance 的裁决) |
149
+ | `reddit-subreddit-compliance` 输出 | 板块 eligibility、risk、账号门槛 | 产品事实、价格、规格 |
150
+ | SRP(`references/subreddit-research-profile.md`,`Verified` 也只是必要输入) | 板块整体分布、进入方式的证据、风险信号 | 发布放行、单 flair 写作规格 |
151
+ | baseline 卡 | 单 flair 写作基线与风格门 | 独立发布放行、板块总体占比 |
152
+ | 帖子级分类(`content_classification_runs`) | 帖子级内容类型事实、SRP `contentTypes` 的原料 | 版规结论、发布放行 |
153
+ | 人工标注(`subreddit_post_annotations`) | 帖子对板块/品牌的 1–5 分**人工评价** | content type taxonomy、写作基线、发布放行 |
154
+ | approved `subreddit_style_profiles` | 审核门 soft enrich(tone/taboo) | SRP 总体统计、合规裁决 |
155
+
156
+ **典型越界(必须拦):** 据品牌语料库/KB 宣布「所有帖子内容类型和板块安排均与语料库无冲突」。
157
+ 品牌 KB 里没有 subreddit 版规,也没有板块分布——它**结构上**无法支撑这个结论。正确路径是
158
+ compliance(裁决)+ SRP(分布证据)。
159
+
160
+ **检查点命名.** 引用时用 `G5-<来源>×<结论>` 越界的形式描述,不要引用尚不存在的 validator 脚本;
161
+ runtime 校验属于后续变更。
162
+
163
+ ## G6 · fail-closed 的适用面与例外
164
+
165
+ **核心区分:证据要求 ≠ 采集通道。** 采集通道可以降级,证据要求不可以。混淆这两者就是那类
166
+ 「eclickkb 超时了,先用能拿到的 SKU 文档继续」——恢复后发现价格与时效冲突、已进排期的卖点全线返工。
167
+
168
+ ### 两段式判定
169
+
170
+ **第一段:结论属于哪类?**
171
+
172
+ | 结论类型 | 处理 |
173
+ |---|---|
174
+ | 合规结论(能不能发、发什么受限) | **fail-closed** |
175
+ | URL 真实性 / 存活状态 | **fail-closed**(见 G3) |
176
+ | 数字、规格、价格、时效 | **fail-closed** |
177
+ | 品牌位置依据(`BrandEntryMode` 等结构决策的依据) | **fail-closed** |
178
+
179
+ fail-closed 的含义是:证据拿不到就**拦截**,输出 `Unknown` / `BlockingGap` / `Hold`。
180
+ **不得「先用能拿到的继续」**,不得用相邻来源顶替(那会同时违反 G5)。
181
+
182
+ **表里没列的结论不是「随便放行」,也不是「一律拦截」。** 普通定性研究结论(板块氛围、讨论方向、
183
+ 风格观察等)按证据强度**降级表述**即可:标 `claimScope: SampleOnly` 或整体 `Provisional`,
184
+ 说明样本口径,不进入 fail-closed 拦截;但它们同样不得升格去支撑上表四类结论。
185
+
186
+ **第二段:采集通道怎么走?**
187
+
188
+ 采集通道**允许受控降级,不拦截**:Hub cache(L1)→ Hub 派发(L2)→ Emergency Acquisition(L3)
189
+ → 回灌(L4),见 `reddit-voc-volume/references/hub-first.md`;429 走 Emergency Acquisition + 回灌。降级必须标
190
+ `provenance` 与 `fallbackReason`。
191
+
192
+ **通道全部失败时回到第一段**:证据缺失 → 按结论类型 fail-closed,输出 `Unknown` / `BlockingGap` /
193
+ `Hold`。通道降级用尽**不构成**放行理由。
194
+
195
+ **超时不是失败,也不是「无数据 / 无规则」。** 超时是**中间态**:输出 pending,并按 Hub-First 继续
196
+ 往下一级通道走(L2 超时后仍可进 L3 Emergency Acquisition)。**在 fallback 走完之前不得下结论**,
197
+ 也不得把 pending 当成「查过了、没有」。
198
+
199
+ **G3/G5/G6 的 `Unknown` / `BlockingGap` / `Hold` 是流程与证据状态,不是 claim 状态。**
200
+ 进入可发布文本的实质性 claim 仍然一律走本文件上半部分的 `ClaimEvidenceStatus`
201
+ 三态(`Cited` / `ExternallyVerified` / `Inferred`)——门禁状态不替代、也不放宽那三态。
202
+
203
+ ### 有意 fail-open:不得改
204
+
205
+ 已批准的板块画像用于**审核门 soft enrich** 时,现有实现**有意 fail-open**(画像查询/渲染异常时审核
206
+ 继续,软维度由服务端剔除;见 `packages/review-engine/src/context/review-context-provider.ts`
207
+ `loadSubredditStyleProfile` 的注释)。**保持不动。**
208
+
209
+ 该 fail-open 的适用面**仅限 style-profile soft enrich**,**不适用于** SRP、compliance、URL 真实性、
210
+ 产品事实证据——那些一律按第一段 fail-closed。persona / brand enrich 同样仍是 fail-closed
211
+ (它们影响 block 语义)。
@@ -20,6 +20,15 @@ Required:
20
20
  - `GeolyTopicId`
21
21
  - `Phase16Status`
22
22
  - `EvidenceGaps`
23
+ - `SubredditResearchProfiles` — every SRP that could be produced, one per passing subreddit;
24
+ a subreddit without one is listed explicitly with its reason, never silently omitted (contract:
25
+ `references/subreddit-research-profile.md`; produced by `reddit-phase-research` step 0.5.5 per S1–S9,
26
+ handed over with `memory/phase0.5-board-analysis.md`). Each profile must name its
27
+ `Confidence` and `AllowedUses` in `RequiredFieldsProvided` (SRP §12).
28
+ `Confidence: Insufficient` is a `BlockingGap` / `ReadyForNextPhase: No` — never a "use it for now".
29
+ A board with **no** SRP is not an error by itself; it is declared downstream as `SRPMode: Fallback`
30
+ (see `reddit-phase-planning/references/scheduling-decision-procedure.md` §0.1) — do not confuse it
31
+ with `Insufficient`.
23
32
 
24
33
  ## Compliance Output
25
34
 
@@ -45,7 +54,12 @@ Required:
45
54
  Required:
46
55
 
47
56
  - `memory/phase4-sku-基准表.md`
48
- - `memory/phase4-board-quantity-plan.md`
57
+ - `memory/phase4-board-quantity-plan.md` with the declared `SRPMode` per board and the user-locked
58
+ `LockedPlanID` / `LockedBy` / `LockedAt` (D6)
59
+ - `memory/phase4-排期决策台账.md` — the per-post scheduling decision ledger from the D1–D7 procedure
60
+ (`reddit-phase-planning/references/scheduling-decision-procedure.md`), keyed by execution-table `Key`,
61
+ with all 9 fields present. It is the **only** landing place for `ProposedFlair` (the execution table
62
+ has no flair column); `reddit-phase-brief` reads it to verify and lock `AssignedFlair`
49
63
  - `memory/phase4-执行表.md`
50
64
  - `memory/phase4-external-post-audit.md` when external comment URLs exist, or an execution-table EPA status summary
51
65
  - `memory/phase4-SKU品牌词映射.md`
@@ -70,6 +84,7 @@ Required:
70
84
  - `memory/phase4-brand-risk-review.md` for any batch with brand-word rows, PGC rows, comparison/review language, external links, product claims, prior negative signals, or subreddit sensitivity; otherwise an explicit low-risk waiver from `reddit-brand-risk-response`
71
85
  - `memory/phase4-叙事指纹索引.md` exists as a fixed table with the schema header (`WindowCount`, `WindowDays`, `WindowScope`, `WindowSort`, `BaselineMaxAgeDays`, `HashSchemaVersion`, `IndexRevision`), and has exactly one active `Planned` row for every briefed post Key
72
86
  - a valid `SampleSetID` (flair-level subreddit baseline, 5–10 recent real posts, word-count median + IQR, with `AcquiredAt` / `ValidUntil`) for every target subreddit in the batch, recording flair coverage (`BaselineScope` / `BaselineFlair` / `FlairCoverageStatus`); missing or expired baseline, or `FlairCoverageStatus: Insufficient`, is a `BlockingGap`
87
+ - every main-post Brief row's `AssignedFlair` was **verified against the ledger's `ProposedFlair`**, not re-chosen: `FlairVerificationStatus` is `Verified` or `FallbackAssigned` (the latter only for `ProposedFlair: Unknown(NoSRP)`); `Rejected` is a `BlockingGap` back to `reddit-phase-planning` D2
73
88
  - every post Brief row carries the nine `LockedFingerprintFields` (`ContentFunction`, `StructureFamily`, `OpeningMove`, `EvidenceShape`, `BrandEntryMode`, `CaveatMode`, `EndingMode`, `LengthBand`, `AnchorSlot`), the two `PrewritingControlFields` (`AssignedFlair` non-empty; `PostingTrigger` from the controlled five values satisfying the `PostingTrigger × BrandEntryMode` cross-constraint), and the four `TraceFields` (`SampleSetID`, `RecentCollisionCheck`, `MappingRuleID`, `MappingVersion`)
74
89
  - every post Brief row carries a `Routing Decision` block with the five candidate-narrowing steps, `MatchedPredicate`, `SelectedStructureFamily`, and `CollisionRepairPath`
75
90
  - `RecentCollisionCheck` is `Pass` (or `Exception` with an approved `ExceptionRef`) for every row
@@ -53,6 +53,27 @@ same way:
53
53
  ~/.cursor/skills/reddit-strategy-shared/references/content-diversity-contract.md
54
54
  ```
55
55
 
56
+ The SRP contract is a shared reference too (it is consumed by four phases, so it does
57
+ not live in any one phase's `references/`):
58
+
59
+ ```text
60
+ ~/.cursor/skills/reddit-strategy-shared/references/subreddit-research-profile.md
61
+ ```
62
+
63
+ The D1–D7 scheduling decision procedure is **planning-owned**, so it is read from that
64
+ skill's own `references/` (and by that skill only — downstream reads its *output*,
65
+ `memory/phase4-排期决策台账.md`):
66
+
67
+ ```text
68
+ ~/.cursor/skills/reddit-phase-planning/references/scheduling-decision-procedure.md
69
+ ```
70
+
71
+ The archived legacy prerequisites are the one directory no agent may read:
72
+
73
+ ```text
74
+ ~/.cursor/skills/reddit-strategy-shared/references/prerequisites/archive/ # AgentReadPolicy: DoNotRead
75
+ ```
76
+
56
77
  ## Project Memory Paths
57
78
 
58
79
  Contracts are installed skill files; the data they govern is project-side.
@@ -62,12 +83,13 @@ an installed-skill path and never as an absolute user path:
62
83
  ```text
63
84
  memory/phase0-客户内容原型映射.md
64
85
  memory/phase4-叙事指纹索引.md
86
+ memory/phase4-排期决策台账.md
65
87
  ```
66
88
 
67
- The two files above are **not** created by the installers. They are project
68
- prerequisites: `reddit-phase-planning` creates the prototype mapping in Phase 0,
69
- `reddit-phase-brief` seeds the fingerprint index with `Planned` rows, and
70
- `reddit-content-writing` owns it from drafting onward. A missing file is a
89
+ The three files above are **not** created by the installers. They are project
90
+ prerequisites: `reddit-phase-planning` creates the prototype mapping in Phase 0 and the
91
+ scheduling decision ledger in Phase 4.0.0.4, `reddit-phase-brief` seeds the fingerprint
92
+ index with `Planned` rows, and `reddit-content-writing` owns it from drafting onward. A missing file is a
71
93
  `BlockingGap`, not an empty history.
72
94
 
73
95
  ## Rule
@@ -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.