The same three personas, now as a live, re-composing route plus three frames that drive the open §5 questions: the mixed-role case, the PM margin design call, and how the capability flags map to cards.
docs/projects-dashboard-role-differentiation.md §3 + §5 · v1 = static trio · v2 = + charts · v3 = + interaction & decisionscan_view_margin tier (automatic for a lead PM) as a thresholded signal + trend. Raw margin_pct stays on the project Cost tab.
Full cost + margin — the headline. Mostly promotion of what already lives at /proj/cost — headline the actionable list, deep-link the detail.
Budget.margin_alert_pctShips todaycost.py. Editable by whoever edits the budget — not strictly finance, and there's no org-wide default.OrgSecuritySettings; per-project margin_alert_pct overrides it. The only model that gives “finance owns the bar, PMs never see the number.”| Cell / card | Gate | Emp | PM | Fin |
|---|---|---|---|---|
| My week · My assignments | always | ✓ | ✓ | · |
| Decisions · Radar · Org capacity | canViewAll | · | ✓ | ✓ |
| Delivery health (led projects) | canViewAll | · | ✓ | ✓ |
| Margin signal | canViewMargin | · | badge | full $ |
| Worst-margin $ · Burn · FX | canViewCost | · | · | ✓ |
| Portfolio margin hero | canViewCost | · | · | ✓ |
always Self surfaces — no flag. Every persona's floor.
canViewAll = RBAC pr.rollup → cross-project cells (decisions, radar, capacity).
canViewMargin = canViewCost OR is_lead → ratio, shown as a badge. Upgrades to full $ when canViewCost is also true.
canViewCost = RBAC cost-margin.view / Owner → every absolute $. The clean binary.