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

23 KiB
Raw Blame History

Spec: 成長迴路(成果歸因 · 學習閉環 · 健康分 · 邀請獎勵 · Workspace

Status: approved
Status note: 使用者 2026-07-20「spec 通過」
Source: docs/product/growth-loop/requirements.mdapproved 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 草稿審核狀態:nonependingapprovedrejected(僅審核開啟的 Workspace
Manual path 「複製文案 → 開 Threads → 標記完成」;健康分 <40 時敏感操作只允許此路徑

沿用底座(不重定義): Member、ThreadsAccount、ScoutPostoutreach_status、OutboxBundle/Step、Persona、Brand、Usage/Plan、Inviteparent_uidinvite_code、Job、Notification。

3. 狀態機

3.1 OutcomeEvent歸因

(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。
  • confidenceconfirmedpossible(弱歸因必須標 possibleUI 不可寫成確定成交)。

3.2 WeeklyCheckup

(none) --> generating     : 排程到點或手動重產
generating --> ready      : AI 成功寫入報告
generating --> failed     : 可重試;仍不扣點
ready --> superseded      : 同週再次成功重產(舊份保留可查,列表預設最新)
  • 每會員每自然週(見 §4.2至多 1 份「當期」7 日內手動重產 ≤2 次
  • 永不寫入 UsageEvent 扣點meter。

3.3 AccountHealth 等級

score >= 70  --> normal      : 不干預
40 <= score < 70 --> warn    : 送出前提示;建議加倍間隔
score < 40   --> throttle    : 強制降速§4.4
  • 每日至少重算一次;有發送/失敗事件可即時重算。
  • throttle 解除:分數回升 ≥40 後下一輪重算生效無人工解鎖按鈕需求admin 可不擋額度類覆蓋——本 run 不做 admin 覆蓋健康分,避免繞過護欄)。

3.4 InviteReward

(直邀 parent_uid = 邀請人) + (直邀首次 plan: free → starter|pro 且付款成功語意)
        --> pending_credit
pending_credit --> credited     : 點數入邀請人平台額度;未超月上限
pending_credit --> capped       : 超過邀請人當月上限;本筆不發、不遞延
pending_credit --> skipped      : 非首次/非直邀/延伸/已發過
  • 僅單層延伸 永不觸發。
  • 額度Starter +100Pro +300requirements §6 #4
  • 月上限:邀請人當月透過邀請獲得點數 ≤ 其當月方案額度 × 50%

3.5 Workspace

member 預設 1 個 default workspace
--> 可 create 更多
workspace active 可 archive軟刪至少保留 1 個不可 archive
  • 方案/用量/邀請碼仍綁 Member,不綁 Workspace。

3.6 DraftReviewWorkspace 開啟審核時)

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. 系統建立 OutcomeEventsource_type=scout_outreach,連 scout_post_id、送出 threads_account_id),狀態 observingwindow_ends_at = sent_at + 72h
  3. Worker排程在窗內拉取可讀訊號§5.4
    • 對話:目標串上出現對己方回覆的再回/引用(能判則 confirmed)。
    • 互動:己方回覆或目標貼的 likesreplies 計數上升(能讀則記;弱則 possible)。
    • 追蹤:送出帳號 followers_count 在窗內淨增加 → 預設 possible(不可宣稱「此回覆帶來追蹤」為確定,除非未來有更強訊號)。
  4. 島民可在命中詳情或成果明細 手動回報成交(金額選填、備註選填、幣別預設 TWDconfirmed + 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 個;每項含 titlereasondeeplink(枚舉:todayscoutstudio_composestudio_inspirecrew_personaoutbox
  4. 計費: 不扣 credits、不寫 platform meter、不寫 byok 次數。AI 呼叫可用平台 key失敗可重試。
  5. 手動「提前重產」7 日滾動窗內 ≤2 次;超過回明確錯誤。
  6. 完成 → 站內通知;今日頁可進最新報告。

4.3 資產複利可見P0

  1. 人設詳情/列表:顯示 learning_summary(短)、learning_version(遞增整數)、learned_from_posts_countlast_learned_at
  2. 品牌詳情:同上語意(來源可為海巡 homeworkbrief 累積)。
  3. 更新時機(最小):人設分析 Job 成功、健檢 ready 時可附帶刷新 summary不強制每次分析都變 version有實質變更才 +1
  4. 空狀態:尚未學習時明確文案,禁止假數據。

4.4 帳號健康分P1

  1. 每個 ThreadsAccount 計算 scorelevelnormalwarnthrottlefactors[](可解釋扣分項)、advice
  2. 訊號方向(權重數值 plan實作可調行為門檻鎖定
    • 24h 發送次數過高 → 扣
    • 最小間隔違規(連續 steps 間隔過短)→ 扣
    • 近 7 日 Outbox 失敗率高 → 扣
    • token 過期error不可用 → 重扣
    • 多日無操作 → 不扣
  3. 送出前檢查(自動路徑): ThreadPlay submit、sendOutreach 自動送、compose 進 Outbox。
    • warnAPI 仍允許,但 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
    • 計算應發點數與月上限 → creditedcappedskipped
  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=102000page/pageSizepagination+list;時間 unix ns UTCuid 數字。
  • AuthBearer資源擁有者 = 登入 uidAdmin 另註。
  • 禁止未實作回成功空資料。

5.2 API 能力分組(路徑前綴建議 /api/v1;精確 path 由 .api 定)

主要行為 波次 權限
Outcomes summary(from,to|week|month)listfilter kind/confidence/sourcegetreportConversionupdateConversiondeleteConversion P0 member
Checkups latestlistgetgenerateNow(受 7 日 2 次限) P0 member
Asset learning 併入既有 PersonaBrand getlist 回應欄位§4.3);可選 refreshLearning P0 member
Account health listByAccountsget(accountId);送出類 API 附加 health_warning 或 throttle 錯誤 P1 member
Invite rewards 併入 getMyNetwork 擴充:rewards_summaryrewards_list;入帳由 plan 生效內部觸發 P1 member
Workspaces CRUDswitcharchivesetReviewRequired;資源 create 帶 workspace_id P1 member
Draft review submitapproverejectlistPending 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 <40 ThreadPlay submit 或 sendOutreach 自動送 拒絕message 指手動路徑
AH-04 score <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. 批准

  • Spec 已批准2026-07-20使用者「spec 通過」)