/kb/dashboard is shell only.
Runtime implementation ต้องผ่าน human approval per field ก่อนลงมือ.
Phase 12E เปิดตัว dashboard contract ที่ B เขียนไว้ · 17 dashboards ครอบคลุม 6 axes (Input / Processing / Outcome / AI / Business / Governance) · แต่ละ dashboard ระบุ metrics · dimensions · filters · drilldown · chart_type · related-card edges · trilingual labels ครบ. A ต้อง build: signal pipeline → aggregate → cache → chart render · plus personal preset + cross-filter + top-search.
dashboard_id + filter state → return canonical-shape responsed3_rendering_note)personal_dashboard_model)related_card_behaviorhonest_note + requires_human_review flag visible to viewerSource: dashboard_contract.dashboards[*] object shape.
| B Field | B Type | A Runtime Target | A Owner Layer | Approval Gate | Binding | Notes |
|---|---|---|---|---|---|---|
| id | string | URL path /app/dashboard/{id} + PK in dashboards table |
Backend + FE | none | mapped-not-bound | Must be stable — referenced by related_dashboards edges. |
| tab_axis | enum(6) | Top-nav tab filter · FE state | Frontend | none | mapped-not-bound | 6 fixed: input/processing/outcome/ai/business/governance |
| label_th / label_en / label_zh | string × 3 | i18n dictionary · FE t(key) lookup | Frontend | none | mapped-not-bound | Trilingual parity required — never display untranslated |
| purpose_th / purpose_en / purpose_zh | string × 3 | Dashboard header tooltip · accessible via hint system | Frontend | none | mapped-not-bound | Hint-system binding — never hand-typed in A code |
| audience | array | RBAC filter · check JWT tier before render | Backend | gate-rbac | mapped-not-bound | CLAUDE.md RBAC tiers · 403 if no overlap |
| chart_type | enum(13) | Component map · chartRegistry[chart_type] React.lazy |
Frontend | none | mapped-not-bound | 13 types — all D3-based per d3_rendering_note |
| primary_metrics[] | array<string> | TimescaleDB metric columns · CTE in query service | Backend | gate-signal-pipeline | mapped-not-bound | Each metric needs producer + dbt model + index — signal pipeline dep |
| secondary_metrics[] | array<string> | Same as primary · optional columns | Backend | gate-signal-pipeline | mapped-not-bound | Secondary = available but not default-shown |
| dimensions[] | array<string> | GROUP BY columns · FE dimension-toggle control | Backend + FE | none | mapped-not-bound | dimension must exist in silver table schema |
| filters[] | array<object> | WHERE clause builder · FE filter chip row | Backend + FE | none | mapped-not-bound | Each filter: field + type + default + allowed values |
| sort_fields[] | array<string> | ORDER BY options · FE sort dropdown | Backend + FE | none | mapped-not-bound | — |
| drilldown_levels[] | array<string> | Router drilldown → spatial_intelligence levels | Frontend | gate-spatial-kanon | mapped-not-bound | k-anonymity ≥5 per H3 cell before render (CLAUDE.md PDPA) |
| final_raw_transaction_shape | object | Raw-view response schema · admin-only endpoint | Backend | gate-admin-only | mapped-not-bound | JWT tier=admin required · audit-logged |
| related_dashboards[] | array<dashboard_id> | Related-card cross-filter graph · FE click propagation | Frontend | none | mapped-not-bound | See related_card_behavior for propagation rules |
| related_actors[] / related_journeys[] / related_services[] / related_cases[] / related_subsystems[] | array<id> | Context panel · deep-link to atlas/journeys/services/cases | Frontend | none | mapped-not-bound | Links open B-owned KB pages as reference |
| source_basis / source_refs | string / array | "Source" footer on card · trust signal | Frontend | none | mapped-not-bound | T1..T5 + document refs visible to user |
| requires_human_review | boolean | Yellow "under review" banner over chart | Frontend | none | mapped-not-bound | Do NOT hide chart — flag it as under-review |
| honest_note | string | Caption under chart · never editable in A code | Frontend | none | mapped-not-bound | Must render verbatim · no A-side re-wording |
| personal_dashboard_model.rules | object | user_preferences.dashboards JSONB column · preset schema |
Backend | gate-auth | mapped-not-bound | Stored per-user · requires session · PDPA-compliant |
hand-feature-flags)final_raw_transaction_shape view · audit log enforcedpersonal_dashboard_model.rulesrelated_card_behaviorsnapshot_modelrequires_human_review=true dashboarddashboard.runtime_v1 flipped to staged rollout · rollback drill completed