thread-master/docs/product/growth-loop/spec.md

380 lines
23 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Spec: 成長迴路(成果歸因 · 學習閉環 · 健康分 · 邀請獎勵 · Workspace
> Status: `approved`
> Status note: 使用者 2026-07-20「spec 通過」
> Source: `docs/product/growth-loop/requirements.md`**approved** 2026-07-20「需求 OK」
> Last updated: `2026-07-20`
> 底座:`docs/product/haixun-backend/spec.md`(已交付能力;本 run 為**加值層**
> 決策對齊requirements §6 #1#9
## 1. 摘要
本規格定義巡樓從「工具組合包」升級為「能證明 ROI、越用越準」時的**對外行為契約**。
**P0** 海巡成果歸因鏈、今日/用量「成本+成果」並列、每週帳號健檢(方案內含不扣點)、人設/品牌資產複利可見。
**P1** 帳號健康分與強制降速、邀請首次付費點數回饋(單層)、同租戶多 Workspace草稿審核白牌月報 PDF。
**P2本 spec 只鎖邊界,不細寫 API** Playbook 市集、免費破冰工具、跨帳號 benchmark、UTM 自動歸因。
**不做:** Insights 真管線重做、多租戶帳單、多層/現金邀請回饋、新增灰帽玩法。
## 2. 名詞與實體
| 名詞 | 定義 |
|------|------|
| **OutcomeEvent** | 一筆可歸因成果觸發源海巡外展Outbox 步驟)+訊號類型+可選手動成交 |
| **AttributionLink** | OutcomeEvent → 來源實體(`scout_post_id` 和/或 `outbox_step_id`)+送出帳號 id可回溯 |
| **OutcomeSummary** | 會員在時間窗(本週/本月)的彙總:觸達、對話、追蹤、成交筆數/金額 |
| **WeeklyCheckup** | 每會員每週一份 AI 健檢報告:證據引用+恰好 3 個下週行動(含 deep-link |
| **AssetLearning** | 人設/品牌的「學到什麼」摘要+版本號(可見複利) |
| **AccountHealth** | 每個 ThreadsAccount 的 0100 分、等級、降速狀態、建議文案 |
| **InviteReward** | 直邀首次付費觸發的點數入帳紀錄(單層) |
| **Workspace** | 同租戶內工作區;擁有 brandpersonathreads_account 歸屬與審核設定 |
| **DraftReview** | 草稿審核狀態:`none``pending``approved``rejected`(僅審核開啟的 Workspace |
| **Manual path** | 「複製文案 → 開 Threads → 標記完成」;健康分 <40 時敏感操作**只允許**此路徑 |
**沿用底座(不重定義):** Member、ThreadsAccount、ScoutPost`outreach_status`、OutboxBundle/Step、Persona、Brand、Usage/Plan、Invite`parent_uid``invite_code`、Job、Notification。
## 3. 狀態機
### 3.1 OutcomeEvent歸因
```text
(source published | manual_mark_done)
--> observing : 進入觀測窗(預設送出後 72h
observing --> confirmed : 觀測到對話/互動訊號,或手動回報成交
observing --> possible : 僅追蹤數變化等弱訊號(標 confidence=possible
observing --> expired : 窗結束且無訊號(可不展示於成果卡明細,計入觸達即可)
confirmed|possible --> amended : 會員改/刪手動成交(留 audit
```
- **觸發源必須已「真送出或標記完成」**`ScoutPost.outreach_status ∈ {published, …標記完成語意}` 或 Outbox step `published`
- **禁止**對 draftnewskipped 建立 OutcomeEvent。
- `confidence``confirmed``possible`(弱歸因必須標 possibleUI 不可寫成確定成交)。
### 3.2 WeeklyCheckup
```text
(none) --> generating : 排程到點或手動重產
generating --> ready : AI 成功寫入報告
generating --> failed : 可重試;仍不扣點
ready --> superseded : 同週再次成功重產(舊份保留可查,列表預設最新)
```
- 每會員每自然週(見 §4.2**至多 1 份「當期」**7 日內手動重產 **≤2 次**。
- **永不**寫入 UsageEvent 扣點meter。
### 3.3 AccountHealth 等級
```text
score >= 70 --> normal : 不干預
40 <= score < 70 --> warn : 送出前提示;建議加倍間隔
score < 40 --> throttle : 強制降速§4.4
```
- 每日至少重算一次;有發送/失敗事件可即時重算。
- `throttle` 解除:分數回升 ≥40 後下一輪重算生效無人工解鎖按鈕需求admin 可不擋額度類覆蓋——**本 run 不做** admin 覆蓋健康分,避免繞過護欄)。
### 3.4 InviteReward
```text
(直邀 parent_uid = 邀請人) + (直邀首次 plan: free → starter|pro 且付款成功語意)
--> pending_credit
pending_credit --> credited : 點數入邀請人平台額度;未超月上限
pending_credit --> capped : 超過邀請人當月上限;本筆不發、不遞延
pending_credit --> skipped : 非首次/非直邀/延伸/已發過
```
- **僅單層**`延伸` 永不觸發。
- 額度Starter **+100**Pro **+300**requirements §6 #4)。
- 月上限:邀請人當月透過邀請獲得點數 ≤ 其**當月方案額度 × 50%**。
### 3.5 Workspace
```text
member 預設 1 個 default workspace
--> 可 create 更多
workspace active 可 archive軟刪至少保留 1 個不可 archive
```
- 方案/用量/邀請碼仍綁 **Member**,不綁 Workspace。
### 3.6 DraftReviewWorkspace 開啟審核時)
```text
draft --> pending : 提交審核
pending --> approved : 核准 → 才可進 OutboxsendOutreach 自動路徑
pending --> rejected : 退回(含理由字串)
rejected --> pending : 修改後再提
approved --> (送出流程沿用 OutboxScout)
```
- Workspace `review_required=false`(預設):行為與現況相同,無 pending 閘。
- `review_required=true`:未 `approved` **禁止**自動送出;手動標記完成路徑是否放行 → **允許**(代操可先人工貼再標記),但 UI 需標示「未審核僅手動」。
## 4. 使用者流程(行為)
### 4.1 成果歸因P0
1. 島民完成海巡外展:**sendOutreach 真送** 或 **標記完成(手動路徑)**
2. 系統建立 OutcomeEvent`source_type=scout_outreach`,連 `scout_post_id`、送出 `threads_account_id`),狀態 `observing``window_ends_at = sent_at + 72h`。
3. Worker排程在窗內拉取可讀訊號§5.4
- **對話**:目標串上出現對己方回覆的再回/引用(能判則 `confirmed`)。
- **互動**:己方回覆或目標貼的 likesreplies 計數上升(能讀則記;弱則 `possible`)。
- **追蹤**:送出帳號 `followers_count` 在窗內淨增加 → 預設 `possible`(不可宣稱「此回覆帶來追蹤」為確定,除非未來有更強訊號)。
4. 島民可在命中詳情或成果明細 **手動回報成交**(金額選填、備註選填、幣別預設 TWD`confirmed` + `kind=conversion`
5. **今日頁**成果摘要卡本週對話數、possibleconfirmed 追蹤、成交筆數/金額)。
6. **用量頁**:成本區(既有 platformBYOK**與**成果區並列;不可只顯示成本。
7. 明細列表:每筆可點回 Scout 命中或 Outbox 步驟。
8. **降級:** 任一 API 訊號不可用 → 仍提供手動成交+「已送出/標記完成」計入觸達;**禁止**整段歸因 API 回未實作空成功。
### 4.2 每週健檢P0
1. **節奏:** 以會員 `timezone` 的**當地週一 00:00** 起可自動產(無 timezone → UTCJob `weekly_checkup`
2. 輸入:該會員已同步貼文成效(既有 own postsinsights 本地資料)、近 14 日海巡送出與 Outcome 摘要、active 人設摘要。
3. 輸出(`ready`
- `summary` 短文TC
- `findings[]`:每條含 `claim` + `evidence[]`(貼文 idpermalink指標**至少 1 條 evidence**,無 evidence 的 finding 不得入庫)
- `actions[3]`:固定 3 個;每項含 `title`、`reason`、`deeplink`(枚舉:`today``scout``studio_compose``studio_inspire``crew_persona``outbox`
4. **計費:** 不扣 credits、不寫 platform meter、不寫 byok 次數。AI 呼叫可用平台 key失敗可重試。
5. 手動「提前重產」7 日滾動窗內 ≤2 次;超過回明確錯誤。
6. 完成 → 站內通知;今日頁可進最新報告。
### 4.3 資產複利可見P0
1. 人設詳情/列表:顯示 `learning_summary`(短)、`learning_version`(遞增整數)、`learned_from_posts_count`、`last_learned_at`。
2. 品牌詳情:同上語意(來源可為海巡 homeworkbrief 累積)。
3. 更新時機(最小):人設分析 Job 成功、健檢 `ready` 時可附帶刷新 summary不強制每次分析都變 version有實質變更才 +1
4. 空狀態:尚未學習時明確文案,禁止假數據。
### 4.4 帳號健康分P1
1. 每個 `ThreadsAccount` 計算 `score`、`level`normalwarnthrottle、`factors[]`(可解釋扣分項)、`advice`。
2. **訊號方向(權重數值 plan實作可調行為門檻鎖定**
- 24h 發送次數過高 → 扣
- 最小間隔違規(連續 steps 間隔過短)→ 扣
- 近 7 日 Outbox 失敗率高 → 扣
- token 過期error不可用 → 重扣
- 多日無操作 → **不扣**
3. **送出前檢查(自動路徑):** ThreadPlay submit、sendOutreach 自動送、compose 進 Outbox。
- `warn`API 仍允許,但 response 帶 `health_warning`;前端必顯示。
- `throttle`**拒絕**自動送出(明確錯誤碼);僅允許手動路徑(複製+標記完成)。
4. 今日頁:顯示分數最低的帳號警示(若有 warnthrottle
5. Crew 帳號列:分數 Badge與既有 token 健康文案並存,不取代 token 狀態)。
### 4.5 邀請獎勵P1
1. 沿用既有邀請綁定(`parent_uid` 一次)。
2. 當直邀會員**首次**完成 free→starter 或 free→pro 的方案生效(對齊既有 purchaseplan 成功語意):
- 解析邀請人 = `parent_uid`
- 計算應發點數與月上限 → `credited``capped``skipped`
3. 點數進入邀請人**平台方案額度池**(與 BYOK 無關);寫 `InviteReward` 紀錄 + 可選 Usage 類「贈點」事件(`key_mode` 不適用;`meter=invite_bonus` 或等價,**不計入**付費消耗進度的「已用」誤解——報表分開「贈點入帳」)。
4. 邀請頁:累計已獲點數、本月已獲/上限、最近回饋列表。
5. Admin **不**手改回饋紀錄(防爭議);糾錯走既有調 `parent_uid`(調後**不回溯**已發點數)。
### 4.6 Workspace 與審核P1
1. 會員可 listcreaterenameswitcharchive Workspace至少留 1 個)。
2. Brand、Persona、ThreadsAccount **歸屬** `workspace_id`;建立時寫入當前 Workspace。
3. 切換 Workspace 後,列表 API 預設只回該區資源;「全部」視圖可選(若做,須明確 query
4. Workspace 設定 `review_required`:開啟後,該區 playscomposeoutreach 進自動發送前須 `approved`
5. 審核操作:提交者 pending審核者同會員多席或同 Workspace 成員——**P1 最小:同一 Member 自審即可**;多成員協作 P2approvedrejected。
6. **白牌月報 PDF** 選 Workspace月份 → 匯出含成果摘要、發送數、海巡完成數、健康分概況;無巡樓品牌強制露出(可選 footer「Powered by…」開關預設關
7. 用量/方案/邀請:**不**隨 Workspace 切分。
### 4.7 P2 邊界(只鎖不做細節)
| 能力 | 行為邊界 |
|------|----------|
| Playbook 市集 | 可分享 brief人設風格劇本模板可匿名引用後進自己 Workspace |
| 免費破冰 | 免登入工具;結果導註冊;不做付費牆內容 |
| Benchmark | 匿名聚合;樣本不足不顯示 |
| UTM 歸因 | 點擊進 OutcomeEvent與手動成交並存 |
## 5. 介面契約
### 5.1 共通
- 沿用 `haixun-backend`:成功 `code=102000``page`/`pageSize` → `pagination`+`list`;時間 **unix ns UTC**`uid` 數字。
- AuthBearer資源擁有者 = 登入 uidAdmin 另註。
- **禁止**未實作回成功空資料。
### 5.2 API 能力分組(路徑前綴建議 `/api/v1`;精確 path 由 `.api` 定)
| 域 | 主要行為 | 波次 | 權限 |
|----|----------|------|------|
| **Outcomes** | `summary(from,to\|week\|month)``list`filter kind/confidence/source`get``reportConversion``updateConversion``deleteConversion` | P0 | member |
| **Checkups** | `latest``list``get``generateNow`(受 7 日 2 次限) | P0 | member |
| **Asset learning** | 併入既有 PersonaBrand `get``list` 回應欄位§4.3);可選 `refreshLearning` | P0 | member |
| **Account health** | `listByAccounts``get(accountId)`;送出類 API 附加 `health_warning` 或 throttle 錯誤 | P1 | member |
| **Invite rewards** | 併入 `getMyNetwork` 擴充:`rewards_summary`、`rewards_list`;入帳由 plan 生效內部觸發 | P1 | member |
| **Workspaces** | CRUDswitcharchive`setReviewRequired`;資源 create 帶 `workspace_id` | P1 | member |
| **Draft review** | `submit``approve``reject``listPending` | P1 | member |
| **Monthly report** | `exportPdf(workspace_id, year_month)` → 檔案 URL 或 stream | P1 | member |
### 5.3 前端頁面
| 路由 | 變更 |
|------|------|
| `/app/today` | 成果摘要卡最新健檢入口健康分警示P1 |
| `/app/usage` | 成本|成果雙欄(或上下並列) |
| `/app/scout` 命中詳情 | +歸因狀態;+手動回報成交 |
| `/app/crew` 帳號 | +健康分 BadgeP1token 狀態保留 |
| `/app/crew` 人設 | learning 摘要/版本 |
| `/app/brands` | learning 摘要/版本 |
| 新或內嵌 `/app/checkup` | 健檢報告全文3 行動 deep-link |
| `/app/invite` | 回饋累計與列表P1 |
| Workspace 切換器(殼層) | P1預設 Workspace 名稱可編 |
| 月報匯出入口 | P1 在 Workspace 設定或用量/成果區 |
### 5.4 Job / Worker
| Template | 觸發 | 成功 |
|----------|------|------|
| `outcome_observe` | 定時/送出後入隊 | 更新 OutcomeEvent 訊號與 confidence |
| `weekly_checkup` | 週排程/手動 generateNow | Checkup `ready`+通知;**無 Usage 扣點** |
| `account_health_recompute` | 日排程/發送事件 | 更新 AccountHealth |
| (既有)`outbox_publish_step` / `scout_scan` 等 | 不變 | 送出成功後**必須** hook 建立 observing Outcomescoutoutbox 源) |
### 5.5 歸因訊號與 Threads API驗證表
| 訊號 | 理想來源 | 不可用時 |
|------|----------|----------|
| 對話(再回/引用) | 回覆 conversationreplies API | 僅保留手動標記「有對話」可選P0 可不做此手動,至少保留成交手動) |
| 互動計數 | media insights / reply fields | 跳過該訊號 |
| 追蹤淨增 | 使用者檔案 `followers_count` 快照 diff | 跳過 |
| 成交 | **僅手動**P0 | — |
| UTM 點擊 | P2 | — |
Spec 實作前:**用現有 OAuth scope 跑一次探測**;把「可用/不可用」寫進實作註記,但**不得**阻塞手動成交+觸達計數的交付。
### 5.6 錯誤語意(新增 scope 建議)
| 情境 | 行為 |
|------|------|
| 健檢重產超過 7 日 2 次 | 明確錯誤,非 102000 |
| 健康分 throttle 擋自動送 | 明確錯誤message 含分數與「請用手動路徑」 |
| 審核未准就自動送 | 明確錯誤 |
| 邀請回饋 capped | 邀請人側可查 `capped` 紀錄;被邀請人方案仍成功 |
| PDF 匯出無資料月 | 仍可出「空月」報表或明確錯誤(二選一,實作固定一種) |
## 6. 與現況對照Retain / Replace / Remove
| 能力 | Retain | Replace | Remove | 備註 |
|------|--------|---------|--------|------|
| 海巡 outreach 狀態機/真送 | ✅ | 送出後 **** Outcome observing | — | 加值 hook |
| 今日頁待回/目標 | ✅ | ****成果卡、健檢入口、健康警示 | — | |
| 用量頁 platformBYOK 分欄 | ✅ | ****成果區並列 | 純成本唯一視角 | |
| Insights **真管線** | — | — | **仍不做**haixun-backend P2 | 健檢只用既有同步資料 |
| Insights 頁 local既有同步 | ✅ 可當健檢輸入 | — | 不冒充本 run 完成 Insights | |
| 人設 8D分析 Job | ✅ | 回應 **** learning 欄位 | — | |
| 邀請關係樹apply | ✅ | ****首次付費回饋 | 多層/現金 | |
| Crew token 健康文案 | ✅ | ****操作健康分(不同維度) | 混成一個「健康」 | 兩者並陳 |
| 單租戶 Member 模型 | ✅ | ****同租戶 Workspace | 多租戶帳單 | |
| ThreadPlay養帳玩法 | ✅ 既有 | 僅 **throttle 護欄** | 新增更激進玩法 | |
| 手動「標記完成」路徑 | ✅ | throttle 時升為主路徑 | 刪除人工路徑 | |
| 模擬/空成功 API | — | — | **禁止** | AGENTS.md |
## 7. 非功能
- **安全/權限:** OutcomeCheckupWorkspace 皆 owner_uid 隔離PDF 僅己方 WorkspaceAdmin 不預設讀全站 Outcome若做 admin 分析 → 另開需求)。
- **隱私:** 健檢 evidence 不跨會員benchmarkP2僅匿名聚合。
- **計費:** 健檢 AI **不扣點**邀請贈點不計入「已消耗」誤導BYOK 規則不變。
- **可觀測:** Outcome observe Job 進度/錯誤;健檢 failed 原因;健康分重算日誌無 token 明文。
- **效能:** Outcome 列表 pageSize≤50observe 窗 72h健康分重算 O(帳號數) 可接受日批。
- **語系:** 健檢與成果文案預設繁中台灣語感。
- **契約:** go-zero `.api` → generate業務在 logicmodule。
## 8. 資料保存(邏輯層)
| 實體 | 關鍵欄位 | 生命週期 |
|------|----------|----------|
| OutcomeEvent | id, owner_uid, source_type, source_id, threads_account_id, kind, confidence, metrics, conversion?, window_*, created_at | 送出後建→觀測→終態;成交可 amend |
| OutcomeSnapshot可選 | account_id, followers_count, taken_at | 觀測用快照 |
| WeeklyCheckup | id, owner_uid, week_key, status, summary, findings[], actions[3], created_at | 週產;舊份可查 |
| AssetLearning 欄位 | 掛 PersonaBrandsummary, version, from_count, last_learned_at | 隨分析/健檢更新 |
| AccountHealth | threads_account_id, owner_uid, score, level, factors[], advice, computed_at | 日更/事件更 |
| InviteReward | id, inviter_uid, invitee_uid, plan_id, points, status, created_at | 首次付費一次 |
| Workspace | id, owner_uid, name, review_required, archived, is_default | CRUD |
| 資源歸屬 | Brand/Persona/ThreadsAccount.workspace_id | 建立時寫入 |
| DraftReview | ref_type, ref_id, workspace_id, status, reason?, actor_uid | 審核流 |
| Report export | 暫存 URL 或短 TTL 物件 | 匯出後可過期 |
## 9. 驗收場景Given / When / Then
**共通:** 成功 envelope `102000`;時間 ns UTC未實作≠空成功。
### 9.1 P0 歸因
| ID | Given | When | Then |
|----|-------|------|------|
| OC-01 | 海巡命中已 published 或標記完成 | 系統處理 | 存在 OutcomeEvent observing終態可 list 回溯 source |
| OC-02 | observing 窗內出現可讀對話訊號 | observe Job | confidence=confirmed 或等價 kind=replysummary 對話數1 |
| OC-03 | 僅 followers 淨增 | observe Job | confidence=possibleUI 不顯示為確定成交 |
| OC-04 | 會員手動回報成交金額 1000 | reportConversion | kind=conversion confirmed成果卡成交可見 |
| OC-05 | 改/刪成交 | updatedelete | 明細與 summary 一致;非 102000 空操作 |
| OC-06 | 今日頁 | 開啟 | 可見本週成果摘要(可為 0但區塊存在 |
| OC-07 | 用量頁 | 開啟 | 成本區與成果區**同時**存在 |
| OC-08 | API 全無社群訊號 | 僅手動成交+觸達 | 歸因域仍可用;不得整域 501 空成功 |
### 9.2 P0 健檢與資產
| ID | Given | When | Then |
|----|-------|------|------|
| CU-01 | 會員有 timezone=Asia/Taipei | 當地週一後排程 | weekly_checkup Job 產出 ready |
| CU-02 | ready 報告 | get | findings 每條含 evidenceactions 長度=3 且 deeplink 合法 |
| CU-03 | 產生健檢 | 查 UsageEvent | **無**因健檢產生的扣點meter 消耗 |
| CU-04 | 7 日內已手動重產 2 次 | generateNow 第 3 次 | 明確錯誤 |
| CU-05 | Job 成功 | 通知 | 站內通知可點進報告 |
| AL-01 | 人設分析或健檢刷新 learning | get persona | learning_summary 或明確空態;有變更則 version≥1 |
| AL-02 | 新品牌無學習 | get brand | 空態文案,非假數字 |
### 9.3 P1 健康分
| ID | Given | When | Then |
|----|-------|------|------|
| AH-01 | 帳號 connected | get health | 0100 + level |
| AH-02 | score 4069 | 自動送出 | 成功或進行中,但帶 health_warning |
| AH-03 | score &lt;40 | ThreadPlay submit 或 sendOutreach 自動送 | **拒絕**message 指手動路徑 |
| AH-04 | score &lt;40 | 複製+標記完成 | **允許** |
| AH-05 | 今日頁有 throttle 帳號 | 開啟 | 可見警示 |
### 9.4 P1 邀請獎勵
| ID | Given | When | Then |
|----|-------|------|------|
| IR-01 | A 邀請 BB 首次 free→starter 成功 | 系統 | A 得 +100InviteReward credited |
| IR-02 | B 首次 free→pro | 系統 | A +300 |
| IR-03 | B 再續訂/再升級 | 系統 | **不再**發點 |
| IR-04 | A 本月邀請點已達方案額度 50% | 再觸發 | cappedB 方案仍成功 |
| IR-05 | 僅延伸關係非直邀 | 付費 | skipped |
| IR-06 | 邀請頁 | 開啟 | 可見累計與列表 |
### 9.5 P1 Workspace審核PDF
| ID | Given | When | Then |
|----|-------|------|------|
| WS-01 | 新會員 | melist workspaces | ≥1 default |
| WS-02 | 建 WS-B 並切換 | 建 brand | brand.workspace_id=WS-BWS-A 列表不可見 |
| WS-03 | review_required=true | 未審核自動送 | 拒絕 |
| WS-04 | pending → approved | 再自動送 | 允許(仍受健康分約束) |
| WS-05 | exportPdf | 請求 | 得 PDF或 URL含成果發送摘要結構 |
| WS-06 | 用量/方案 | 切 WS | **不變**(仍綁會員) |
### 9.6 回歸(底座不可破壞)
| ID | Given | When | Then |
|----|-------|------|------|
| RG-01 | 既有 Outbox 真發送 | 送出 | 仍 published 僅在平台成功後 |
| RG-02 | BYOK 用量 | 呼叫 | 仍分欄、健檢不混入消耗 |
| RG-03 | 邀請 apply 一次綁定 | 再 apply | 仍拒絕 |
## 10. 開放規格問題
1. ~~週一起點時區~~**已定:會員 timezone無則 UTC**§4.2)。
2. Threads 各訊號實際 scope 探測結果 → **實作前填表**,不阻 P0 手動+觸達。
3. Draft review P1 是否僅「同一 Member 自審」→ **已定是**;多成員協作 P2。
4. 健康分權重精確數字 → plan實作可調**門檻帶 7040 鎖定**。
5. PDF 引擎選型 → plan 定(行為:可下載白牌月報)。
## 11. 批准
- [x] Spec 已批准2026-07-20使用者「spec 通過」)