@geoly-ai/social-hub-cli 0.3.2 → 0.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -69,8 +69,8 @@ Required:
69
69
  - `memory/phase4-内容排期表.md`
70
70
  - `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
71
  - `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
- - a valid `SampleSetID` (subreddit baseline, 5–10 recent real posts, word-count median + IQR, with `AcquiredAt` / `ValidUntil`) for every target subreddit in the batch; missing or expired baseline is a `BlockingGap`
73
- - every post Brief row carries the nine `LockedFingerprintFields` (`ContentFunction`, `StructureFamily`, `OpeningMove`, `EvidenceShape`, `BrandEntryMode`, `CaveatMode`, `EndingMode`, `LengthBand`, `AnchorSlot`) and the four `TraceFields` (`SampleSetID`, `RecentCollisionCheck`, `MappingRuleID`, `MappingVersion`)
72
+ - 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`
73
+ - 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
74
  - every post Brief row carries a `Routing Decision` block with the five candidate-narrowing steps, `MatchedPredicate`, `SelectedStructureFamily`, and `CollisionRepairPath`
75
75
  - `RecentCollisionCheck` is `Pass` (or `Exception` with an approved `ExceptionRef`) for every row
76
76
  - `brief_approval_mode`
@@ -118,6 +118,8 @@ ForbiddenStructuralChanges:
118
118
  PrimaryPostType: # one of the authoritative 9
119
119
  MappingRuleID: # when a client prototype applies
120
120
  StructureFamily:
121
+ AssignedFlair: # PrewritingControlField; non-empty; NoFlairAvailable/NoFlairRequired for flairless boards
122
+ PostingTrigger: # PrewritingControlField; controlled 5 values; not in the collision triple
121
123
  OpeningMove:
122
124
  EvidenceShape:
123
125
  BrandEntryMode:
@@ -125,6 +127,7 @@ CaveatMode:
125
127
  EndingMode:
126
128
  LengthBand:
127
129
  SampleSetID:
130
+ FlairCoverageStatus: # Exact | ApprovedFallback (Insufficient is a BlockingGap upstream)
128
131
  AnchorSlot: # single value, never an "A + B" composite
129
132
  SecondaryAnchorSlot: # only for >350-word posts with two ABUs; "—" otherwise
130
133
  RecentCollisionCheck:
@@ -148,6 +151,7 @@ Rules:
148
151
  in the source, do not guess one and do not load `推荐转化叙事`.
149
152
  - Rewrite may only fix factual expression, marketing tone, readability, and explicitly flagged problems.
150
153
  - Rewrite may not reorder sections, add a failed attempt, add a question ending, add a caveat, add a community-observation line, move the brand mention, change `AnchorSlot`, or change any of the nine `LockedFingerprintFields`.
154
+ - Rewrite must **preserve `PostingTrigger`** for `ArtifactType: Post`: a body edit that changes the post's real-world trigger (or that breaks the `PostingTrigger × BrandEntryMode` cross-constraint) is out of allowance — flag it instead of applying, so the finished body still re-derives to the `Planned` `PostingTrigger`.
151
155
  - Hub `optimized` output that changes a protected structure field may not be adopted wholesale; record `HubStructureConflictStatus: None | Escalated` (see `content-review-gate.md` §3.1). `Escalated` holds the draft and routes to `reddit-phase-brief`.
152
156
  - `reddit-content-rewrite` does **not** own `memory/phase4-叙事指纹索引.md`. When its edits change the body, it returns `FingerprintSyncRequired: Yes` / `FingerprintSyncStatus: PendingWritingOwner`; `reddit-content-writing` (the index owner) performs the re-review and hash write-back.
153
157
 
@@ -179,7 +183,7 @@ Required:
179
183
  - `memory/content-review-log.md`
180
184
  - `memory/phase4-叙事指纹索引.md` has exactly one active `Final` row for every delivered **main-post** Key (`WindowScope: PostOnly`; comments and external comments need no fingerprint row, only Hub `FinalDraftSha256`)
181
185
  - each `Final` row's `DraftHash` equals the `FinalDraftSha256` in `memory/content-review-log.md` and a recomputation from the delivered text using `HashSchemaVersion: reddit-final-draft-sha256-v1`
182
- - all nine `LockedFingerprintFields` of a delivered post match the Brief's `Planned` values
186
+ - all nine `LockedFingerprintFields` of a delivered post match the Brief's `Planned` values, and the two `PrewritingControlFields` match too: `AssignedFlair` equals the Brief value (and the baseline flair coverage it was written against), and the delivered body's re-derived `PostingTrigger` equals the `Planned` value while satisfying the `PostingTrigger × BrandEntryMode` cross-constraint
183
187
  - no delivered post Key collides with any other Key in the rolling window unless an approved `ExceptionRef` exists
184
188
  - every post/comment to be delivered has Hub `executionStatus=completed` and `verdict=pass`
185
189
  - final delivery rows have `ReviewMode: AccountBound` and a real `accountId`
@@ -54,6 +54,8 @@ social-hub version --json
54
54
 
55
55
  命中上表场景时,**打开对应领域 skill**;不要在总路由里重复展开领域命令细节。
56
56
 
57
+ > **深度历史(绝对日期 / 往年 / 跨年 / 长期趋势)不是 Hub 能力。** `social-hub intelligence hot-posts` 只读 Hub 近实时缓存(当下热帖,且仅覆盖已入库 watchlist 板块),**不持有深度归档**。凡「历史帖 / 往年数据 / 某年某月 / 绝对日期区间 / 长期趋势演变 / 建 baseline 需历史样本」或用户明确「只用 Arctic」,改用 `reddit-voc-volume` 的 `history` 模式(Arctic Shift 权威源),**不要**用 `intelligence hot-posts` 顶替。注意「最近一天 / 周 / 月」仍是当下声量,走 `reddit-voc-volume` 的 `keyword` / `subreddit`(Hub-First),也不是 hot-posts。详见 `social-hub-intelligence` 的「热帖」三态路由。
58
+
57
59
  ## CLI 新版本提醒
58
60
 
59
61
  运行任意子命令时(`version`/`help` 除外),CLI 会检测 npm 上的最新版并在 stderr 提示升级;**Agent 应转告用户** 并执行 `npm install -g @geoly-ai/social-hub-cli@latest`。CLI 升级后,新发布的 skill 会在后续运行时同步到已托管目录(含本次新增的 skill)——开启 `SOCIAL_HUB_SKILLS_AUTO_UPDATE=1` 时自动完成,未开启则在 stderr 提示你补齐;无论哪种,手动补齐一律用 `social-hub skills install`(**不是** `update` —— `update` 只刷新已安装的 skill,不会装上新增的)。详见 `social-hub-shared` 的「CLI 新版本检测」。
@@ -185,6 +185,39 @@ social-hub intelligence hot-posts-create -j '{ ... }'
185
185
  social-hub intelligence hot-posts-export --subreddit technology > hot-posts.csv
186
186
  ```
187
187
 
188
+ **口径(`hot-posts` = Hub 近实时缓存,不是历史/归档源)**:`hot-posts` /
189
+ `hot-posts-export` 只返回 Hub **当下/近期**已缓存的热帖快照,且**仅覆盖已入库
190
+ watchlist 的 subreddit**(未监控的板块查不到)。它读的是 Hub 缓存,**不是深度归档**,
191
+ 不持有往年数据、不支持时间窗回溯。
192
+
193
+ **负路由(何时 _不_ 用 hot-posts,改用 `reddit-voc-volume` 的 `history` 深归档模式)**:凡下列
194
+ **深度历史**意图**一律不要用 `hot-posts`**,必须改用 **`reddit-voc-volume` 的 `history` 模式**
195
+ (Arctic Shift 深度归档,2005 至今权威源,正文不截断):
196
+
197
+ - 历史帖 / 往年数据 / 某年某月的帖子 / 回溯到 20xx 年 / 截至某日
198
+ - 任意**绝对日期区间**回溯、早于 Hub 覆盖窗口的样本
199
+ - 过去 N 年、跨年 / 同比、按季度、**长期趋势 / 趋势演变**、逐年 / 逐月抽样、历史基准 / 回测
200
+ - 建 subreddit baseline 卡需要历史正文样本 / 长度分布语料
201
+ - 未入库 watchlist 的 subreddit 的历史内容(hot-posts 根本查不到)
202
+
203
+ **用户明确要「只用 Arctic」/「不要用 Hub 数据」时**:固定走 `reddit-voc-volume history`
204
+ (脚本层恒 `arctic_search_posts`、**不接受** `--acquisition-policy`、provenance 恒
205
+ `arctic_shift`),**绝不**用 `hot-posts` 顶替——hot-posts 拿到的是 Hub 缓存,不是 Arctic。
206
+
207
+ **近期窗口 carve-out(别把「最近」误判成深归档)**:「最近一天 / 一周 / 一月、本周、本月、
208
+ 当前热度」仍是**当下声量**,**不进 `history`**;但它也不等于 `hot-posts`——按关键词 / 板块
209
+ 的近期声量查询应走 **`reddit-voc-volume` 的 `keyword` / `subreddit` 模式(Hub-First,
210
+ `--hub-time-window day|week|month`)**。`hot-posts` 只负责 Hub 已缓存的 watchlist 当前热榜快照。
211
+
212
+ **三态路由判据**:
213
+
214
+ 1. 要「**Hub watchlist 现在的热榜 / 缓存快照**」(现在热什么、导出近期热帖 CSV)→ `hot-posts`(本命令,照常用)。
215
+ 2. 要「**最近一天 / 周 / 月的关键词或板块当下声量**」→ `reddit-voc-volume` 的 `keyword` / `subreddit`(Hub-First)。
216
+ 3. 要「**绝对历史日期 / 跨年 / 早于 Hub 覆盖 / 历史 baseline / 长期趋势演变**」→ `reddit-voc-volume` 的 `history`(Arctic 权威源)。
217
+
218
+ **hot-posts 的合法用途(照常用,别误伤)**:查「当下 watchlist 热榜」、消费 Hub 已缓存的热帖
219
+ 快照、按 watchlist 板块看当前热度榜、导出近期热帖 CSV。
220
+
188
221
  ## KOL
189
222
 
190
223
  ```bash