# Data Model: View Page Template Standard for Enterprise Detail Screens **Feature**: 133-detail-page-template | **Date**: 2026-03-10 ## Overview This feature introduces no database tables and no schema migration. It introduces a shared page-composition model for enterprise detail screens and maps four existing targets onto that model. The core design adds computed read models only: 1. a shared enterprise detail page model, 2. a shared summary-header model, 3. reusable main-section and supporting-card models, 4. a structured related-context model, 5. a secondary technical-detail model, 6. target-specific presenter outputs that populate the shared shell. ## Existing Persistent Entities Used By The Feature ### BaselineSnapshot | Attribute | Type | Notes | |-----------|------|-------| | `id` | int | Snapshot identity | | `workspace_id` | int | Workspace isolation boundary | | `baseline_profile_id` | int | Primary governance relationship | | `captured_at` | timestamp | Key summary timestamp | | `snapshot_identity_hash` | string nullable | Technical identifier | **Usage rules**: - Remains workspace-scoped. - Summary-first rendering must emphasize capture context, fidelity, and governance relevance ahead of technical metadata. ### BackupSet | Attribute | Type | Notes | |-----------|------|-------| | `id` | int | Record identity | | `tenant_id` | int | Tenant isolation boundary | | `name` | string | Primary display label | | `status` | string | Lifecycle summary signal | | `metadata` | array/json nullable | Technical or configuration detail | | `completed_at` | timestamp nullable | High-signal recovery or lifecycle timestamp | **Usage rules**: - Remains tenant-scoped. - Detail rendering must elevate lifecycle state, scope, and recent operational relevance before raw metadata. ### EntraGroup | Attribute | Type | Notes | |-----------|------|-------| | `id` | int | Local record identity | | `tenant_id` | int | Tenant isolation boundary | | `display_name` | string | Primary label | | `entra_id` | string | Provider object identifier | | `group_types` | array/json nullable | Provider classification detail | | `security_enabled` | bool | Classification signal | | `mail_enabled` | bool | Classification signal | | `last_seen_at` | timestamp nullable | Operational freshness indicator | **Usage rules**: - Remains tenant-scoped. - The page must show identity and classification before raw provider arrays. ### OperationRun | Attribute | Type | Notes | |-----------|------|-------| | `id` | int | Run identity | | `workspace_id` | int | Workspace-context monitoring boundary | | `tenant_id` | int nullable | Optional tenant context | | `type` | string | What ran | | `status` | string | Current run state | | `outcome` | string nullable | Terminal result | | `summary_counts` | array/json nullable | KPI-like operational counts | | `failure_summary` | array/json nullable | Secondary failure detail | | `context` | array/json nullable | Target scope and related metadata | | `created_at`, `started_at`, `completed_at` | timestamps | Operational timing | **Usage rules**: - Remains workspace-context by route, with tenant entitlement checks for any tenant-bound related context. - The page must emphasize run identity, state, target scope, and outcome before failure payloads or context dumps. ## New Computed Read Models ### EnterpriseDetailPageData | Field | Type | Description | |------|------|-------------| | `resource_type` | string enum | `baseline_snapshot`, `backup_set`, `entra_group`, `operation_run` | | `scope` | string enum | `workspace`, `tenant`, `workspace-context` | | `header` | SummaryHeaderData | Top-of-page identity and state | | `main_sections` | list | Primary reading-path content | | `supporting_cards` | list | Compact aside or supporting content | | `technical_sections` | list | Secondary technical detail blocks | | `empty_state_notes` | list | Optional explicit empty or degraded-state notes | **Rules**: - The page model must always render a valid summary header. - Technical detail may be omitted entirely when not relevant. - Empty or degraded sections must communicate intent explicitly rather than disappearing ambiguously. ### SummaryHeaderData | Field | Type | Description | |------|------|-------------| | `title` | string | Primary record label | | `subtitle` | string nullable | Secondary identifying context | | `status_badges` | list | High-signal current-state indicators | | `key_facts` | list | High-signal metadata shown before deep detail | | `primary_actions` | list | Header actions available on page load | | `description_hint` | string nullable | Optional short domain hint | **Rules**: - Header content must answer “what is this?” and “what is its current condition?” first. - Primary actions belong here, not buried in lower sections. ### DetailSectionData | Field | Type | Description | |------|------|-------------| | `id` | string | Stable section key | | `kind` | string enum | `core_details`, `current_status`, `related_context`, `operational_context`, `recent_activity`, `domain_detail` | | `title` | string | Operator-facing section label | | `items` | list | Page-specific presentation items | | `empty_state` | SectionEmptyStateData nullable | Empty or degraded-state copy | | `action` | PageActionData nullable | Optional section-specific action | | `visible` | bool | Section visibility | **Rules**: - Section titles describe meaning, not implementation. - Section ordering must follow the shared reading-order contract. ### SupportingCardData | Field | Type | Description | |------|------|-------------| | `kind` | string enum | `status`, `timestamps`, `related_context`, `quick_actions`, `health`, `summary` | | `title` | string | Compact card title | | `items` | list | Card content | | `visible` | bool | Card visibility | **Rules**: - Supporting cards must remain compact and high-value. - Raw JSON or deep field tables do not belong here. ### RelatedContextItemData | Field | Type | Description | |------|------|-------------| | `label` | string | Object or relationship label | | `context_type` | string enum | `parent`, `child`, `source_run`, `tenant`, `workspace`, `artifact`, `linked_record` | | `value` | string | Visible contextual value | | `url` | string nullable | Canonical destination when authorized | | `available` | bool | Permission-aware availability flag | | `empty_reason` | string nullable | Degraded-state explanation when unavailable | **Rules**: - Related context must not reveal inaccessible record identity. - Missing or unavailable links need explicit copy, not silent omission when the relationship matters. ### TechnicalDetailData | Field | Type | Description | |------|------|-------------| | `title` | string | Technical section title | | `entries` | list | Secondary identifiers or diagnostics | | `collapsible` | bool | Whether the block is collapsed by default | | `visible` | bool | Visibility | **Rules**: - Technical detail must render after the core reading path. - Sensitive or privileged technical detail remains subject to existing authorization. ### PageActionData | Field | Type | Description | |------|------|-------------| | `label` | string | Operator-facing action label | | `placement` | string enum | `header`, `supporting_card`, `section` | | `url` | string nullable | Navigation target | | `action_name` | string nullable | Existing action identifier when not purely navigational | | `destructive` | bool | Whether the action is destructive-like | | `requires_confirmation` | bool | Confirmation requirement | | `visible` | bool | Authorization-aware visibility | **Rules**: - Similar actions should map to the same placement across aligned pages. - Existing destructive actions keep their current confirmation and authorization rules. ## Target-Specific View Models ### BaselineSnapshotDetailData | Field | Type | Description | |------|------|-------------| | `capture_summary` | list | Capture date, fidelity, evidence mix, gap count | | `coverage_rows` | list | Structured contents overview | | `governance_context` | list | Baseline profile and source-run context | | `snapshot_technical_detail` | TechnicalDetailData | Identity hash and lower-level metadata | ### BackupSetDetailData | Field | Type | Description | |------|------|-------------| | `lifecycle_summary` | list | Status, item count, completion state | | `scope_summary` | list | Type or retention-related signals | | `recent_related_operations` | list | Related operational context | | `backup_technical_detail` | TechnicalDetailData | Raw metadata and secondary identifiers | ### EntraGroupDetailData | Field | Type | Description | |------|------|-------------| | `identity_summary` | list | Name, type, freshness | | `classification_summary` | list | Security-enabled and mail-enabled meaning | | `governance_usage` | list | Related references or policy usage when available | | `group_technical_detail` | TechnicalDetailData | Provider object IDs and raw provider arrays | ### OperationRunDetailData | Field | Type | Description | |------|------|-------------| | `run_summary` | list | Type, status, outcome, initiator, timing | | `target_scope_summary` | list | Target scope and elapsed or expected duration | | `result_summary` | list | Summary counts or outcome highlights | | `failure_context` | DetailSectionData nullable | Failure details when present | | `run_technical_detail` | TechnicalDetailData | Identity hash and context payload fragments | ## Visibility and Degraded-State Rules | Rule | Result | |------|--------| | Every aligned page must render a summary header | Required | | Technical detail may be hidden or collapsed by default | Required | | Missing related context must show explicit empty or unavailable copy when the relationship is important | Required | | Supporting cards may be omitted when no compact high-value content exists | Required | | Pages may omit non-applicable section types without leaving empty shells | Required | ## Schema Impact No database schema change is expected for this feature.