9.1 KiB
9.1 KiB
Tasks INDEX — demand-radar
Plan:
../plan.md(approved 2026-07-31)
Spec:../spec.md§9(SP/RW/SW/OP/TD/RP/CR/FU/ST/QT/PR/RG)
後端根:apps/backend(goctl)· 前端根:apps/web
Status:approved(2026-07-31 使用者「好」)· phase=ready-to-implement
Updated:2026-07-31 · 58/58 done(M0–M6 完成)
範圍硬規則
| 規則 | 內容 |
|---|---|
| 加值層 | 既有海巡三模式/抓取雙路徑/Outbox/付費流程原樣保留;新 group、新 collection 並存 |
| 橋接單向 | scout → opportunity 只做複製+反向連結,狀態機不共用 |
| 不新增 meter | 沿用四個既有 meter+radar.* source 標籤(RG-04) |
| 成交 | 只有人可回報;寫既有 growth_outcomes(source_type=radar_opportunity),不另建帳 |
| 送出 | 公開留言必經既有 AccountHealth 送出閘;私訊 P0 只能複製,UI 不得宣稱自動送出 |
| 判定契約 | reasons[] 五條齊全否則不入庫;band 門檻 80/50 鎖定,只調權重與 prompt |
| 配額 | max_active_watches/max_daily_opportunities;達上限為截斷非錯誤 |
| 命名紅線 | 全域禁用 lead 指稱銷售線索(RG-05) |
| 樣式 | 新頁樣式只進 src/styles/radar.css,npm run check:tokens 為必跑閘 |
| 契約 | goctl .api → make gen-api;業務只寫 internal/logic/**、internal/module/**;envelope 102000;時間 ns UTC;禁止未實作回空成功 |
INDEX
| ID | Title | M | Kind | Status | Est |
|---|---|---|---|---|---|
| T500 | api shells radar crm goctl | M0 | feat | done | ~180 |
| T501 | mongo indexes radar crm | M0 | feat | done | ~120 |
| T502 | fe domain types and repo interfaces | M0 | feat | done | ~180 |
| T503 | fe radar css shell token guard | M0 | chore | done | ~60 |
| T510 | service profile model repository | M1 | feat | done | ~170 |
| T511 | service profile api get put | M1 | feat | done | ~160 |
| T512 | radar watch model repository | M1 | feat | done | ~180 |
| T513 | radar watch api crud quota gate | M1 | feat | done | ~200 |
| T514 | watch keyword suggest ai | M1 | feat | done | ~160 |
| T515 | fe service profile tab brands | M1 | feat | done | ~180 |
| T516 | fe radar watches page | M1 | feat | done | ~200 |
| T517 | test m1 profile watch quota | M1 | test | done | ~180 |
| T525 | opportunity model repository | M2 | feat | done | ~190 |
| T526 | radar sweep model repository | M2 | feat | done | ~140 |
| T527 | job radar sweep template daily schedule | M2 | feat | done | ~190 |
| T528 | sweep fetch reuse dual path | M2 | feat | done | ~170 |
| T529 | five question judge scorer | M2 | feat | done | ~200 |
| T530 | judge persist reject reasons dedupe | M2 | feat | done | ~170 |
| T531 | daily quota truncation and metering | M2 | feat | done | ~160 |
| T532 | sweep failure notify and resume | M2 | feat | done | ~160 |
| T533 | sweeps list and manual trigger api | M2 | feat | done | ~150 |
| T534 | test m2 sweep judge integration | M2 | test | done | ~200 |
| T535 | judge accuracy sampling gate | M2 | docs | done | ~120 |
| T545 | today api stats and empty reasons | M3 | feat | done | ~180 |
| T546 | opportunities list detail api | M3 | feat | done | ~170 |
| T547 | opportunity accept dismiss override api | M3 | feat | done | ~160 |
| T548 | reply variant model repository | M3 | feat | done | ~130 |
| T549 | reply generation forbidden filter | M3 | feat | done | ~200 |
| T550 | reply send outbox health gate | M3 | feat | done | ~180 |
| T551 | fe radar today page | M3 | feat | done | ~200 |
| T552 | fe opportunity actions and reply panel | M3 | feat | done | ~200 |
| T553 | fe sidebar ia and today summary | M3 | feat | done | ~150 |
| T554 | test m3 today reply integration | M3 | test | done | ~200 |
| T565 | contact model repository unique key | M4 | feat | done | ~180 |
| T566 | contact touch model timeline repo | M4 | feat | done | ~140 |
| T567 | accept binds or creates contact | M4 | feat | done | ~150 |
| T568 | contact stage transition engine | M4 | feat | done | ~170 |
| T569 | contacts list api filters sort | M4 | feat | done | ~160 |
| T570 | contact detail notes followup flag api | M4 | feat | done | ~170 |
| T571 | contact merge unmerge owner guard | M4 | feat | done | ~180 |
| T572 | conversion report writes growth outcomes | M4 | feat | done | ~180 |
| T573 | conversion amend delete audit | M4 | feat | done | ~150 |
| T574 | fe crm board eight columns | M4 | feat | done | ~200 |
| T575 | fe contact detail timeline conversion | M4 | feat | done | ~200 |
| T576 | test m4 crm conversion integration | M4 | test | done | ~200 |
| T585 | followup model repository and hooks | M5 | feat | done | ~170 |
| T586 | job radar followup scan and notify | M5 | feat | done | ~180 |
| T587 | followup api list done snooze escalate | M5 | feat | done | ~170 |
| T588 | ai followup message generation | M5 | feat | done | ~140 |
| T589 | crm stats api three dimensions | M5 | feat | done | ~200 |
| T590 | usage radar source aggregation | M5 | feat | done | ~140 |
| T591 | fe followup inbox and stats | M5 | feat | done | ~200 |
| T592 | test m5 followup stats integration | M5 | test | done | ~180 |
| T600 | scout promote to opportunity | M6 | feat | done | ~170 |
| T601 | fe scout promote action | M6 | feat | done | ~100 |
| T602 | integration test matrix spec9 | M6 | test | done | ~200 |
| T603 | regression scout outbox outcomes naming | M6 | test | done | ~180 |
| T604 | docs testing and gaps | M6 | docs | done | ~120 |
合計:58 tasks(feat 48 · test 7 · docs 2 · chore 1)
建議實作順序
T500 → T501 → T502 → T503
→ T510 → T511 → T512 → T513 → T514 → T515 → T516 → T517
→ T525 → T526 → T527 → T528 → T529 → T530 → T531 → T532 → T533 → T534 → T535
──【判定準確度閘門:T535 結論為「可進 M3」才往下】
→ T545 → T546 → T547 → T548 → T549 → T550 → T551 → T552 → T553 → T554
→ T565 → T566 → T567 → T568 → T569 → T570 → T571 → T572 → T573 → T574 → T575 → T576
→ T585 → T586 → T587 → T588 → T589 → T590 → T591 → T592
→ T600 → T601 → T602 → T603 → T604
可並行的組合(同 M 內無互相依賴):
| 組合 | 說明 |
|---|---|
| T501 ‖ T500 ‖ T503 | M0 三條互不相依 |
| T510+T511 ‖ T512 | 服務檔案與 watch 模型可並行,到 T513 收斂 |
| T526 ‖ T525 | sweep 與 opportunity 模型可並行 |
| T548 ‖ T545/T546 | 回覆模型與今日頁 API 可並行 |
| T565+T566 ‖ T569 | Contact 模型與列表查詢可並行 |
| T515 ‖ T516 | 前端兩頁可分頭做(皆需 T502/T503) |
spec §9 覆蓋對照
| 群組 | 覆蓋 task |
|---|---|
| SP-01~02 | T511、T513、T517 |
| RW-01~04 | T513、T514、T516、T517 |
| SW-01~06 | T527、T528、T530、T531、T532、T534 |
| OP-01~07 | T525、T529、T530、T547、T534 |
| TD-01~02 | T545、T551、T554 |
| RP-01~05 | T548、T549、T550、T552、T554 |
| CR-01~09 | T565~T573、T575、T576 |
| FU-01~04 | T585、T586、T587、T588、T592 |
| ST-01~03 | T589、T591、T592 |
| QT-01~03 | T531、T590、T534、T592 |
| PR-01~02 | T600、T601 |
| RG-01~05 | T528、T550、T572、T590、T603 |
里程碑結案
M0(地基)— 2026-07-31
.api 殼+mongo 索引+前端型別/repo 介面/radar.css。未實作能力一律回 501010,前端 live 直接把它丟成 ApiError,不做空清單降級。
M1(服務檔案與雷達訂閱)— 2026-07-31
- 後端:
ServiceProfile(每會員一份,exists區分「沒建」與「建了空的」)、RadarWatch狀態機(active/paused/archived,archived 為終點)、配額閘(max_active_watches,既有超額者不強制降級)、AI 關鍵字建議(ai_copy/radar.suggest,失敗退點)。 - 前端:
/app/brands「服務檔案」分頁、/app/radar/watches訂閱管理+建議面板。側欄項留在 T553。 - 驗收:SP-01、SP-02、RW-01~RW-04 各一個具名 case(
internal/logic/radar/m1_integration_test.go),已納入make test-integration。 - 跑過:
go test ./... -count=1、make test-integration、cd apps/web && npm run build && npm run check:tokens && npm run test && npm run lint。
M1 沒有做(依 plan 排在後面):sweep/判定/商機/回覆/CRM,以及手動觸發即時巡的 UI(T533/T552)。
M2–M6 — completed 2026-07-31
- T525:
Opportunitydomain+memory/mongo repo;UpsertByExternalID去重併 term;reasons[]五維度契約;band 80/50。 - T526:
RadarSweepdomain+memory/mongo repo;計數累加、judged_external_ids去重、GetByJobID。 - T527:
TemplateRadarSweep、UTC 22:00 每日排程、worker maintenance lock 下建 Job、執行殼層(抓取待 T528)。 - 下一個:T528 抓取雙路徑複用。
閘門
- tasks 批准(2026-07-31)→ phase=
ready-to-implement - 實作時指定 T### 才寫碼;一次一題(建議從 T500 起)
- M2 → M3 硬閘門:T535 抽驗報告結論須為「可進 M3」,否則回 T529 調權重/prompt 後重測