
從零散的用戶回饋,迭代出對的功能
Paddi 是一個 AI 產品經理,將零散的用戶回饋轉化為開發者與 Coding Agent 都能直接實作的清晰規格
Current state
The API's calculateHealthScore currently calculates the raw value, 0–100 normalized value, weight, and weighted contribution for six signals: usage frequency, seat utilization, open tickets, NPS score, contract value, and login recency. apps/web/src/app/customers/[id]/page.tsx displays these fields in the Customer Detail Score breakdown table, but lists the values only in the existing signal order and does not indicate which factors are lowering or raising the total score. CSMs must therefore interpret the normalized values and contributions themselves, making it difficult to identify customer risks quickly.
packages/types/src/health-score.ts already includes the calculation results needed to build an explanation, and the API customer health-score response returns signals directly. This improvement should reuse those results rather than change the health score formula. The existing score-tier thresholds remain Healthy ≥ 75, At Risk ≥ 50, and Critical < 50.
Goal
Provide a prominent, standalone Risk drivers summary on Customer Detail so that CSMs can immediately understand the primary downward and upward factors behind a customer's score while still being able to review the signal values, weights, and contributions supporting the explanation.
Success criteria:
- Clearly label every displayed driver as either a downward contributor or an upward contributor.
- Prioritize items by the magnitude of their weighted contribution; do not introduce undecided thresholds, baselines, or external data models.
- Use the same API-calculated results as the existing Score breakdown so the summary and total score cannot diverge.
- Let CSMs identify the most important upward and downward factors without manually comparing six rows of numbers. This feature provides explanation only; it does not create tasks, timeline events, customer contacts, or other workflow actions.
Proposal
- 1.Add a standalone
Cardto the main customer-detail content area inapps/web/src/app/customers/[id]/page.tsx. Place it near the existing Health score trend and Score breakdown so it is the primary interpretation area after the score is viewed. The title may be Risk drivers, with a subtitle explaining that the content is based on the current Score breakdown calculations. - 2.Create presentation-only groups from the
signalsarray in the health-score response:- Downward contributors: signals where
normalizedValue < 50. Sort them byweightedContributionfrom lowest to highest; a lower contribution represents a greater downward effect on the total score. - Upward contributors: signals where
normalizedValue >= 50. Sort them byweightedContributionfrom highest to lowest; a higher contribution represents stronger support for the total score.
- Downward contributors: signals where
- 3.This grouping rule uses only the existing normalized values and contributions. It must not modify the calculator, weights, or score/tier calculations. To avoid incorrectly labeling a signal at exactly 50 as a risk, include 50 in the upward group and use neutral wording in the UI; do not claim that it is a risk.
- 4.Display both upward and downward contributors in the summary, with no more than two items per group to preserve scanability. If a group has no items, show an explicit empty state such as
No significant downward contributorsorNo significant upward contributorsrather than leaving it blank. - 5.Each driver row/card must include: a human-readable signal label, direction (
Pulling score down/Supporting score), raw value, normalized value, weight, and weighted contribution. Use consistent and accessible warning/danger visual treatment for downward items and success/positive treatment for upward items. Direction must not be communicated by color alone; it must include text or another readable marker. - 6.Add concise explanatory copy stating that the ordering is based on the current weighted contribution and that this section explains the score rather than recommending follow-up actions. Do not add threshold-based claims such as "below target," causal inferences, risk probabilities, or automatic recommendations.
- 7.Keep the complete existing Score breakdown table so CSMs can still inspect all six signals and their details. The summary is a prioritized overview, not a replacement for the table. A pure function or shared presenter may be extracted for grouping and sorting, with unit tests, to keep product logic out of JSX.
- 8.Adjust the shared contract only if the API response cannot support the UI.
SignalContributionis currently sufficient, so do not add persistence fields or an API route by default. Centralize any new labels or descriptions and reuse the existingSIGNAL_LABELSso naming remains consistent between the summary and breakdown.
Risks / trade-offs
- Using normalized value 50 as the positive/negative boundary is an explainable product rule that requires no new data, but it is not a business-risk threshold. The UI must avoid describing every signal below 50 as definitive customer churn risk.
- Sorting only by weighted contribution reflects each signal's impact on the current total score, but does not represent recent trends, causal relationships, or the best action for a CSM. These are explicitly out of scope.
- Limiting each group to two items reduces information load but may hide other signals. The complete table must remain available for inspection.
- Null or missing synchronization data must continue to be presented according to the calculator's existing output; the frontend must not guess or fabricate raw values. If a contribution is 0, use neutral or appropriate empty/low-impact wording and do not exaggerate risk.
- Any difference between the grouping and the existing Score breakdown numbers would damage trust. Use the same response, consistent number formatting, and tests to guarantee consistency.
Acceptance criteria
- When any Customer Detail is opened, a standalone Risk drivers summary is visible near Score breakdown without navigating to the customer list or another page.
- The summary provides both downward and upward contributor sections; each section displays no more than two items and shows an explicit empty state when it has no items.
- Downward items are determined by
normalizedValue < 50and sorted byweightedContributionfrom lowest to highest; upward items are determined bynormalizedValue >= 50and sorted byweightedContributionfrom highest to lowest. - Each summary item displays the signal label, direction text, raw value, normalized value, weight, and weighted contribution, with values exactly matching the existing Score breakdown.
- Positive and negative directions have text or semantic markers and do not rely on color alone; they remain distinguishable in dark mode and for keyboard and screen-reader users.
- The summary does not change health score, tier, weights, normalization, API calculations, or database snapshot behavior.
- The existing complete Score breakdown table remains and still contains all six signals and its original fields.
- The summary does not provide actions to create tasks, create timeline events, contact customers, or trigger other workflows; it is limited to explaining the current score.
- Automated tests cover grouping, sorting, the two-item limit, empty groups, and the boundary value
normalizedValue = 50; existing health-score calculator tests and web typecheck/build pass.
Make health scores explainable so CSMs can act on them
The health score surfaces a number and a tier but nothing about what's driving it, so CSMs either distrust it or misread it.
The health-score calculator already computes per-signal normalized values, weights, and weighted contributions, but none of this is exposed in the customer view: apps/web/src/app/customers/[id]/page.tsx renders the six signals in a flat table in fixed order, with no indication of which factors pull the score down or hold it up. The interpretation burden therefore falls entirely on the CSM, who must compare six rows of raw and normalized numbers by hand to understand a single score — which is why a Critical account that recently renewed reads as contradictory rather than informative. The gap is in the presentation layer, not the scoring logic: calculator.ts and weights.ts already produce everything needed to rank and label drivers, and packages/types/src/health-score.ts already carries the SignalContribution fields, so an explanation can be built by reusing existing calculation output without touching the formula, thresholds, or API contract. The affected surface is customer-detail rendering; the health-score calculation, weights, and tier logic are unchanged.
Paddi 將原始用戶回饋轉化為可直接開發的規格,
過程中的每個決策都有你的代碼庫與文件作為依據
來自各處的訊號,一個都不漏
串接回饋所在的來源,或透過內建方式手動新增。
Paddi 會把相關回饋分群,整理成結構化的需求。
Slack找出每個需求背後真正的問題
需求本身,只告訴你用戶提了什麼。Paddi 會從你的程式碼與產品知識中調取證據,挖出需求背後真正的問題,再圍繞這個問題重新框定需求
Google Drive把最重要的排在最前面
Paddi 會以四個維度為每個需求評分,其中包含該需求與你設定的產品商業目標契合程度。一旦調整你的產品目標設定,排序就會重新計算。
檢視分析,選定方向
由你檢視 Paddi 的完整分析,接著從它整理出的解法路徑中挑選,或輸入自己的想法。Paddi 會從你的選擇中了解功能應該怎麼做、改動範圍有多大。
AI 起草規格,由你收斂細節
Paddi 會把你的決策,產出成完整規格。在內建的 Markdown 編輯器中與 Paddi 一起打磨細節,直到它正是你想交付的樣子。
用團隊最習慣的方式交付
複製完整規格、分享檢視連結,或匯出到你現有的協作工具中。不管你的團隊怎麼運作,規格都能順暢交付。
給 Agent 與開發者
直接進入 Coding Agent 與開發者原本工作的環境


npx paddi透過 CLI,直接在終端機拉下任一份規格,不必來回切換視窗,也不用等人交接。
將 Paddi 作為 skill 運行,Coding Agent 就能自己取得需要的規格,直接開工。
給團隊
問 Paddi 任何有關規格的問題


Current state
The API's calculateHealthScore currently calculates the raw value, 0–100 normalized value, weight, and weighted contribution for six signals: usage frequency, seat utilization, open tickets, NPS score, contract value, and login recency. apps/web/src/app/customers/[id]/page.tsx displays these fields in the Customer Detail Score breakdown table, but lists the values only in the existing signal order and does not indicate which factors are lowering or raising the total score. CSMs must therefore interpret the normalized values and contributions themselves, making it difficult to identify customer risks quickly.
packages/types/src/health-score.ts already includes the calculation results needed to build an explanation, and the API customer health-score response returns signals directly. This improvement should reuse those results rather than change the health score formula. The existing score-tier thresholds remain Healthy ≥ 75, At Risk ≥ 50, and Critical < 50.
Goal
Provide a prominent, standalone Risk drivers summary on Customer Detail so that CSMs can immediately understand the primary downward and upward factors behind a customer's score while still being able to review the signal values, weights, and contributions supporting the explanation.
Success criteria:
- Clearly label every displayed driver as either a downward contributor or an upward contributor.
- Prioritize items by the magnitude of their weighted contribution; do not introduce undecided thresholds, baselines, or external data models.
- Use the same API-calculated results as the existing Score breakdown so the summary and total score cannot diverge.
- Let CSMs identify the most important upward and downward factors without manually comparing six rows of numbers. This feature provides explanation only; it does not create tasks, timeline events, customer contacts, or other workflow actions.
Proposal
- 1.Add a standalone
Cardto the main customer-detail content area inapps/web/src/app/customers/[id]/page.tsx. Place it near the existing Health score trend and Score breakdown so it is the primary interpretation area after the score is viewed. The title may be Risk drivers, with a subtitle explaining that the content is based on the current Score breakdown calculations. - 2.Create presentation-only groups from the
signalsarray in the health-score response:- Downward contributors: signals where
normalizedValue < 50. Sort them byweightedContributionfrom lowest to highest; a lower contribution represents a greater downward effect on the total score. - Upward contributors: signals where
normalizedValue >= 50. Sort them byweightedContributionfrom highest to lowest; a higher contribution represents stronger support for the total score.
- Downward contributors: signals where
- 3.This grouping rule uses only the existing normalized values and contributions. It must not modify the calculator, weights, or score/tier calculations. To avoid incorrectly labeling a signal at exactly 50 as a risk, include 50 in the upward group and use neutral wording in the UI; do not claim that it is a risk.
- 4.Display both upward and downward contributors in the summary, with no more than two items per group to preserve scanability. If a group has no items, show an explicit empty state such as
No significant downward contributorsorNo significant upward contributorsrather than leaving it blank. - 5.Each driver row/card must include: a human-readable signal label, direction (
Pulling score down/Supporting score), raw value, normalized value, weight, and weighted contribution. Use consistent and accessible warning/danger visual treatment for downward items and success/positive treatment for upward items. Direction must not be communicated by color alone; it must include text or another readable marker. - 6.Add concise explanatory copy stating that the ordering is based on the current weighted contribution and that this section explains the score rather than recommending follow-up actions. Do not add threshold-based claims such as "below target," causal inferences, risk probabilities, or automatic recommendations.
- 7.Keep the complete existing Score breakdown table so CSMs can still inspect all six signals and their details. The summary is a prioritized overview, not a replacement for the table. A pure function or shared presenter may be extracted for grouping and sorting, with unit tests, to keep product logic out of JSX.
- 8.Adjust the shared contract only if the API response cannot support the UI.
SignalContributionis currently sufficient, so do not add persistence fields or an API route by default. Centralize any new labels or descriptions and reuse the existingSIGNAL_LABELSso naming remains consistent between the summary and breakdown.
Risks / trade-offs
- Using normalized value 50 as the positive/negative boundary is an explainable product rule that requires no new data, but it is not a business-risk threshold. The UI must avoid describing every signal below 50 as definitive customer churn risk.
- Sorting only by weighted contribution reflects each signal's impact on the current total score, but does not represent recent trends, causal relationships, or the best action for a CSM. These are explicitly out of scope.
- Limiting each group to two items reduces information load but may hide other signals. The complete table must remain available for inspection.
- Null or missing synchronization data must continue to be presented according to the calculator's existing output; the frontend must not guess or fabricate raw values. If a contribution is 0, use neutral or appropriate empty/low-impact wording and do not exaggerate risk.
- Any difference between the grouping and the existing Score breakdown numbers would damage trust. Use the same response, consistent number formatting, and tests to guarantee consistency.
Acceptance criteria
- When any Customer Detail is opened, a standalone Risk drivers summary is visible near Score breakdown without navigating to the customer list or another page.
- The summary provides both downward and upward contributor sections; each section displays no more than two items and shows an explicit empty state when it has no items.
- Downward items are determined by
normalizedValue < 50and sorted byweightedContributionfrom lowest to highest; upward items are determined bynormalizedValue >= 50and sorted byweightedContributionfrom highest to lowest. - Each summary item displays the signal label, direction text, raw value, normalized value, weight, and weighted contribution, with values exactly matching the existing Score breakdown.
- Positive and negative directions have text or semantic markers and do not rely on color alone; they remain distinguishable in dark mode and for keyboard and screen-reader users.
- The summary does not change health score, tier, weights, normalization, API calculations, or database snapshot behavior.
- The existing complete Score breakdown table remains and still contains all six signals and its original fields.
- The summary does not provide actions to create tasks, create timeline events, contact customers, or trigger other workflows; it is limited to explaining the current score.
- Automated tests cover grouping, sorting, the two-item limit, empty groups, and the boundary value
normalizedValue = 50; existing health-score calculator tests and web typecheck/build pass.
工程師會問某個決策會對應到哪段程式碼、有哪些邊緣案例要注意。
設計師會問為什麼這個改動是這樣界定範圍,又是哪些回饋促成的。
任何人來問,都能直接看到每個決策背後的理由,不必再來煩你。
資安防護,貫穿每一步
絕不留存
Paddi 讀取你的程式碼,為分析提供依據,用完即釋放。你的程式碼絕不會被儲存。
絕不用於模型訓練
你的任何資料都不會被用來訓練模型。
傳輸與儲存全程加密
在 Paddi 中傳輸與存放的資料,全部加密。
預備取得 SOC 2 Type II 與 ISO 27001 資安認證
我們從第一天就依照這些標準打造產品,並隨 Paddi 成長取得正式的認證。
成為第一批使用 Paddi 打造產品的團隊
我們正在開放少量名額,尋找願意一起打磨產品的團隊。儘早加入,開始迭代對的功能。